Kubernetes(k8s)容器编排Pod介绍和使用

目录

  • 1 Pod 特点
    • 1.1 网络
    • 1.2 存储
  • 2 使用方式
    • 2.1 自主式Pod
    • 2.2 控制器管理的Pod
  • 3 自主运行Pod
    • 3.1 创建资源清单
      • 3.1.1 参数描述
    • 3.2 创建Pod
    • 3.3 Pod操作
      • 3.3.1 查看Pod列表
      • 3.3.2 查看描述信息
      • 3.3.3 访问pod
      • 3.3.4 删除Pod
  • 4 控制器运行Pod
    • 4.1 创建资源清单
    • 4.2 参数描述
      • 4.2.1 Replicas
      • 4.2.2 Selector
      • 4.2.3 Pod Template
    • 4.3 创建Pod
    • 4.4 Pod操作
      • 4.4.1 删除Pod
  • 5 镜像拉取策略
    • 5.1 always
      • 5.1.1 修改资源清单
      • 5.1.2 生效配置
      • 5.1.3 查看创建过程
    • 5.2 IfNotPresent
      • 5.2.1 修改资源清单
      • 5.2.2 生效配置
      • 5.2.3 查看创建过程
  • 6 Pod生命周期
    • 6.1 各个阶段
    • 6.2 Pod重启策略
    • 6.3 Pod状态转换
    • 6.4 生命周期行为
      • 6.4.1 初始化容器
      • 6.4.2 容器探测


1 Pod 特点

在这里插入图片描述

Pod是kubernetes中你可以创建和部署的最小也是最简的单位,一个Pod代表着集群中运行的一个进程。

	Pod中封装着应用的容器(有的情况下是好几个容器),存储、独立的网络IP,管理容器如何运行的策略选项,Pod代表着部署的一个单位:kubernetes中应用的一个实例,可能由一个或者多个容器组合在一起共享资源。

Pod有两个必须知道的特点

1.1 网络

	每一个Pod都会被指派一个唯一的Ip地址,在Pod中的每一个容器共享网络命名空间,包括Ip地址和网络端口,在同一个Pod中的容器可以同locahost进行互相通信,当Pod中的容器需要与Pod外的实体进行通信时,则需要通过端口等共享的网络资源。

1.2 存储

	Pod能够配置共享存储卷,在Pod中所有的容器能够访问共享存储卷,允许这些容器共享数据,存储卷也允许在一个Pod持久化数据,以防止其中的容器需要被重启。

2 使用方式

2.1 自主式Pod

	这种Pod本身是不能自我修复的,当Pod被创建后(不论是由你直接创建还是被其他Controller),都会被Kuberentes调度到集群的Node上,直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故障之前这个Pod都会一直保持在那个Node上,Pod不会自愈。如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除,同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱逐。

2.2 控制器管理的Pod

	Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例,Controller可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的

3 自主运行Pod

3.1 创建资源清单

通过yaml文件或者json描述Pod和其内容器的运行环境和期望状态,例如一个最简单的运行nginx应用的pod,定义如下

vi nginx-pod.yml
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginx:1.12ports:- containerPort: 80

3.1.1 参数描述

下面简要分析一下上面的Pod定义文件:

  • apiVersion: 使用哪个版本的Kubernetes API来创建此对象
  • kind:要创建的对象类型,例如Pod,Deployment等
  • metadata:用于唯一区分对象的元数据,包括:name,UID和namespace
  • labels:是一个个的key/value对,定义这样的label到Pod后,其他控制器对象可以通过这样的label来定位到此Pod,从而对Pod进行管理。(参见Deployment等控制器对象)
  • spec: 其它描述信息,包含Pod中运行的容器,容器中运行的应用等等。不同类型的对象拥有不同的spec定义。详情参见API文档

3.2 创建Pod

使用kubectl创建pod

kubectl apply -f nginx-pod.yml

在这里插入图片描述

3.3 Pod操作

3.3.1 查看Pod列表

kubectl get pods

在这里插入图片描述

可以通过增加 -o wide查看详细信息

kubectl get pods -o wide

在这里插入图片描述

3.3.2 查看描述信息

可以通过describe查看pod的详细信息

kubectl describe pod nginx

在这里插入图片描述

3.3.3 访问pod

可以通过k8s创建的虚拟IP进行访问,可以在k8s的任何一个节点访问

 curl 10.244.1.10

在这里插入图片描述

3.3.4 删除Pod

可以使用delete删除Pod,删除后不能进行恢复

kubectl delete pod nginx

在这里插入图片描述

4 控制器运行Pod

Pod本身不具备容错性,这意味着如果Pod运行的Node宕机了,那么该Pod无法恢复,因此推荐使用Deployment等控制器来创建Pod并管理。

4.1 创建资源清单

通过yaml文件或者json描述Pod和其内容器的运行环境和期望状态,例如一个最简单的运行nginx应用的pod,定义如下

vi nginx-pod.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.12ports:- containerPort: 80

4.2 参数描述

下面简要分析一下上面的Pod定义文件:

4.2.1 Replicas

副本数量

	spec.replicas 是可以选字段,指定期望的pod数量,默认是1。

4.2.2 Selector

标签选择器

	.spec.selector是可选字段,用来指定 label selector ,圈定Deployment管理的pod范围。如果被指定, .spec.selector 必须匹配 .spec.template.metadata.labels,否则它将被API拒绝。如果 .spec.selector 没有被指定, .spec.selector.matchLabels 默认是.spec.template.metadata.labels。在Pod的template跟.spec.template不同或者数量超过了.spec.replicas规定的数量的情况下,Deployment会杀掉label跟selector不同的Pod。

4.2.3 Pod Template

Pod模板,.spec.template 是 .spec中唯一要求的字段。

	.spec.template 是 pod template,它跟 Pod有一模一样的schema,除了它是嵌套的并且不需要apiVersion 和 kind字段。另外为了划分Pod的范围,Deployment中的pod template必须指定适当的label(不要跟其他controller重复了,参考selector)和适当的重启策略。.spec.template.spec.restartPolicy 可以设置为 Always , 如果不指定的话这就是默认配置。

4.3 创建Pod

kubectl apply -f nginx-pod.ymlkubectl get pods -o wide

创建后发现,有两个nginx的pod在运行,符合我们的预期

在这里插入图片描述

4.4 Pod操作

4.4.1 删除Pod

这里可以尝试删除Pod

kubectl delete pod nginx-deployment-f77774fc5-cgs82
# 查看Pod详情
kubectl get pods -o wide

删除Pod后发现重新新建了一个Pod,这是因为有控制器发现少了一个Pod就会进行重新拉起来一个

在这里插入图片描述

5 镜像拉取策略

pod的镜像拉取策略分为三种:

  • always(总是从官方下载镜像)
  • never(从不下载镜像)
  • ifnotpresent(如果本地没有镜像就从官方下载镜像)。

Kubernetes集群默认使用IfNotPresent策略

5.1 always

不管是否存在本地镜像,总是从远程仓库下载

5.1.1 修改资源清单

我们可以通过修改配置清单来配置不同的策略

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.12imagePullPolicy: Alwaysports:- containerPort: 80

5.1.2 生效配置

kubectl apply -f nginx-pod.yml

在这里插入图片描述

5.1.3 查看创建过程

kubectl describe pod nginx-deployment

可以清楚的看到重新下载而没有使用本地镜像

在这里插入图片描述

5.2 IfNotPresent

Kubernetes集群的默认策略,如果有本地镜像就使用,没有则从远程仓库下载

5.2.1 修改资源清单

我们可以通过修改配置清单来配置不同的策略

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.12imagePullPolicy: IfNotPresentports:- containerPort: 80

5.2.2 生效配置

kubectl apply -f nginx-pod.yml

在这里插入图片描述

5.2.3 查看创建过程

kubectl describe pod nginx-deployment

可以清楚的看到没有重新下载镜像而是使用本地的镜像。

在这里插入图片描述

6 Pod生命周期

6.1 各个阶段

POD中明确规定了如下几个阶段

状态值说明
挂起(Pending)Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建,等待时间包括调度 Pod 的时间和通过网络下载镜像的时间。
运行中(Running)该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
成功(Succeeded)Pod 中的所有容器都被成功终止,并且不会再重启。
失败(Failed)Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
未知(Unknown)因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。
	实际上还有一中状态Terminating,在代码和文档中都没有说明,但却是存在。这种情况出现杂无法获取所在主机的资源情况,一直在尝试建立连接。

6.2 Pod重启策略

在Pod中的容器可能会由于异常等原因导致其终止退出,Kubernetes提供了重启策略以重启容器。

	Pod通过`restartPolicy`字段指定重启策略,重启策略类型为:Always、OnFailure 和 Never,默认为 Always。重启策略对同一个Pod的所有容器起作用,容器的重启由Node上的kubelet执行。Pod支持三种重启策略,在配置文件中通过`restartPolicy`字段设置重启策略:
重启策略说明
Always当容器失效时,由kubelet自动重启该容器
OnFailure当容器终止运行且退出码不为0时,由kubelet自动重启该容器
Never不论容器运行状态如何,kubelet都不会重启该容器

注意:这里的重启是指在Pod的宿主Node上进行本地重启,而不是调度到其它Node上。

6.3 Pod状态转换

Pod的容器数Pod当前状态发生的事件Pod结果状态
RestartPolicy=AlwaysRestartPolicy=OnFailureRestartPolicy=Never
包含一个容器Running容器成功退出RunningSucceededSucceeded
包含一个容器Running容器失败退出RunningRunningFailure
包含两个容器Running1个容器失败退出RunningRunningRunning
包含两个容器Running容器被OOM杀掉RunningRunningFailure

6.4 生命周期行为

6.4.1 初始化容器

初始化容器(init container)即应用程序的主容器启动之前要运行的容器,常用于为主容器执行一些预置操作,它们具有两种典型特征。

  1. 初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成。(注意:如果podspec.restartPolicy字段值为“Never”,那么运行失败的初始化容器不会被重启。)
  2. 每个初始化容器都必须按定义的顺序串行运行。

6.4.2 容器探测

容器探测(container probe)是Pod对象生命周期中的一项重要的日常任务,它是kubelet对容器周期性执行的健康状态诊断,诊断操作由容器的处理器(handler)进行定义,Kubernetes支持三种处理器用于Pod探测:

  • ExecAction:在容器内执行指定命令,并根据其返回的状态码进行诊断的操作称为Exec探测,状态码为0表示成功,否则即为不健康状态。
  • TCPSocketAction:通过与容器的某TCP端口尝试建立连接进行诊断,端口能够成功打开即为正常,否则为不健康状态。
  • HTTPGetAction:通过向容器IP地址的某指定端口的指定path发起HTTP GET请求进行诊断,响应码为2xx3xx时即为成功,否则为失败。

任何一种探测方式都可能存在三种结果:“Success”(成功)“Failure”(失败)“Unknown”(未知),只有success表示成功通过检测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/744.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows 下安装 mysql-8.0.25 解压版

介绍 此文介绍 mysql-8.0.25-winx64 的 zip 解压版,在 windows 下的安装与配置过程。 官方下载 官网下载页: https://downloads.mysql.com/archives/community/ 进入官网,选择默认版本就行,不需要包含测试工具套件的版本 本地解…

R语言使用xlsx包、安装包的经验以及切换工作目录的方法

R语言使用xlsx包 首先不同于读取txt和csv文件,R语言读取xlsx文件需要安装xlsx包 使用下面命令进行安装xlsx install.packages(“xlsx”) 安装过程非常顺利,需要附带安装其它几个包。如果安装出现错误,可以尝试切换网络,使用手机热…

物通博联工业智能网关助力设备制造商实现远程监控维护

设备制造商是工业物联网的重要参与者,他们生产的设备广泛应用于各个行业领域,如机械、电力、化工、环保等。设备制造商面临着如何提高设备质量、降低运维成本、增强客户服务能力等挑战,需要借助工业物联网技术实现设备的远程监控维护&#xf…

【计算机网络详解】——软件定义网络SDN(学习笔记)

目录 🕒 1. 概念🕒 2. OpenFlow 协议 🕒 1. 概念 软件定义网络(Software Defined Network,SDN)的概念最早由斯坦福大学的Nick McKeown教授于2009年提出。SDN最初只是学术界讨论的一种新型网络体系结构。SD…

美团动态线程池实践思路,开源了

使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢? 1.代码中创建了一个 ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适 2.凭经验设置参数值,上线后发现需要调整,改代码重启服务,非常麻烦 3.线…

MySQL8.0数据库开窗函数

简介 数据库开窗函数是一种在SQL中使用的函数,它可以用来对结果集中的数据进行分组和排序,以便更好地分析和处理数据。开窗函数与聚合函数不同,它不会将多行数据聚合成一行,而是保留每一行数据,并对其进行分组和排序。…

音乐考级系统python+mysql

目录 废话不多说下面看严谨版不带web界面的: 总结: 写这个博客呢主要是因为之前学校有个简单的课设要做,想着白嫖一个交差的,但是找了一圈没找到合适的能拿来用的,我就下班用了两晚手搓了一个代码。 具体的建表语句…

【微服务】Nacos 注册中心的设计原理

文章目录 前言一、数据模型二、数据一致性三、负载均衡四、健康检查五、性能与容量六、易用性七、集群扩展性八、用户扩展性结尾 前言 服务发现是⼀个古老的话题,当应用开始脱离单机运行和访问时,服务发现就诞生了。目前的网络架构是每个主机都有⼀个独…

今日份分享:三个电脑mp3转换器推荐

有一个音乐爱好者叫小艾。她对音乐充满热爱,每天都会用耳机沉浸在动听的旋律中。然而,她最近遇到了一个问题:她手头有一些喜欢的音乐文件,但格式却是不支持她的音乐播放器。这让她感到非常困扰,因为她希望随时随地欣赏…

Qt Widget提升为QChartView绘制曲线

1、在工程文件"*.pro"中添加"charts"组件 在工程文件"*.pro"中添加"charts"组件,同时在工程文件添加qcustomplot类。 QT core gui printsupport charts下载qcustomplot类。 网址:https://www.qcustom…

数据库监控与调优【十九】—— SQL调优实战

SQL调优实战 SQL调优实战1-常规调优 项目建表语句 -- ---------------------------- -- Table structure for carousel -- ---------------------------- DROP TABLE IF EXISTS carousel; CREATE TABLE carousel (id varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_09…

2023年上半年部分团队的总结

(目前还是草稿版本) 写作,慢思考: 软件团队每天有繁忙的工作,有很多待办事项,会议,口头交流,线上的 bug 要处理,报表要生成和解释… … 一个月过去了,正想总…