【云原生 • Kubernetes】kubernetes 核心技术 - Pod

举报
敬 之 发表于 2022/08/17 23:25:01 2022/08/17
【摘要】 目录 1. Pod 概述2. Pod 的定义3. Pod 的基本用法4. Pod 分类5. Pod 生命周期和重启策略· Pod 的几个状态(生命周期)· Pod 重启策略 6. Pod ...

在这里插入图片描述


1. Pod 概述

Pod 是 kubernetes 最为重要的一个概念,每一个 Pod 都有一个特殊的被称为“根容器”的 Pause 容器。Pause 容器对应的镜像属于 kubernetes 平台的一部分,除 Pause 容器,每一个 Pod 还包含一个或者多个相关的用户业务容器(usr contaiter)。

在这里插入图片描述
Pod - 应用:每个 Pod 都是应用的一个实例,都有着自己的专属 IP。
Pod - 容器:一个 Pod 可以有多个容器,各个容器之间共享网络和存储资源,每个 Pod 中有一个专门的 Pause 来保存所有容器的状态,通过管理 Pause 容器,从而达到管理 Pod 中所有容器的效果。
Pod - 节点:同一个 Pod 中的容器会被调度到相同的 node 节点,不同节点间 Pod 的通信基于虚拟二层网络技术来实现。

2. Pod 的定义

在一个 yaml 文件中,Pod 是这样定义的(完整):

apiVersion: v1                //版本
kind: pod                     //类型,此处为Pod类型
metadata:                     //元数据
  name: string                //元数据,是pod的名称
  namespace: string           //元数据,pod的命名空间,如果不填写默认是default
  labels:                     //元数据,pod的标签列表,可写多个label
    - name: string            //元数据,标签的名称
  annotations:                //元数据,自定义注解列表
    - name: string            //元数据,自定义注解名称
spec:                         //pod中容器的详细定义
  containers:                 //pod中容器的列表
  - name: string              //容器的名称
    image: string             //容器中的镜像
    imagePullPolicy: Always | Never | IfNotPresent   //获取镜像的策略: 默认为Always(拉取镜像库镜像,即每次都尝试重新下载镜像)、Never(仅使用本地镜像)、IfNotPresent(本地有镜像就不拉取镜像库镜像,如果没有就拉取镜像库镜像)
	command: [string]         //容器的启动命令列表(不配置则使用镜像内部的命令)
	args: [string]            //启动命令参数列表
	workingDir: string        //容器的工作目录
	volumeMounts:             //挂载到容器内部的存储卷配置
	- name: string            //引用pod定义的共享存储卷的名称,需使用volumes[]部分定义的共享存储卷名称
	  mountPath: string       //存储卷在容器内部Mount的绝对路径
	  readOnly: boolean       //是否为只读模式,默认为读写模式
	ports:                    //容器需要暴露的端口号列表
	- name: string            //端口的名称
	  containerPort: int      //容器要暴露的端口
	  hostPort: int           //容器所在主机监听的端口(容器暴露端口映射到宿主机的端口,设置host port时同一台宿主机将不能启动该容器的第二份版本)
	  protocol: string        //端口协议,支持TCP和UDP,默认值为TCP
	env:                      //容器运行前设置的环境变量列表
	- name: string            //环境变量的名称
	  value: string           //环境变量的值
	resources:                //资源限制和资源请求设置
	  limits:                 //资源限制,容器的最大可用资源数量
	    cpu: string           //CPU限制,单位为core数
		memory: string        //内存限制,单位可以为MiB、GiB等
      requests:               //资源请求设置
	    cpu: string           //CPU请求,单位为core数,容器启动的初始可用数量
		memory: string        //内存请求,单位可以为MiB、GiB等,容器启动的初始可用数量
    livenessProbe:            //pod内各容器健康检查的设置
	  exec:                   //对pod内各容器健康检查的设置,exec方式
	    command: [string]     //exec方式需要指定的命令或者脚本
	  httpGet:                //对pod内各容器健康检查的设置,使用httpGet方式,需指定path、port
	    path: string          //指定的路径
		port: number          //指定的端口
		host: string          //指定的主机
		scheme: string
		httpHeaders:           
		- name: string
		  value: string
      tcpSocket:              //对pod内各容器健康检查的设置,tcpSocket方式
		port: number         
	  initialDelaySeconds: 0  //容器启动完成后首次探测的时间,单位为s
	  timeoutSeconds: 0       //对容器健康检查的探测等待响应的超时时间设置,单位为s,默认值为1s。若超过该超时时间设置,则将认为该容器不健康,会重启该容器
	  periodSeconds: 0        //对容器健康检查的定期探测时间设置,单位为s,默认10s探测一次
	  successThreshold: 0
	  failureThreshold: 0
    securityContest:
	  privileged: false
  restartPolicy: Always | Never | OnFailure  //重启策略,默认为always
  nodeSelector: object        //节点选择,表示将该Pod调度到包含这些label的node上,以key:value的方式指定
  imagePullSecrets:           //pull镜像时使用的secret名称,以name:secretkey格式指定
  - name: string
  hostNetwork: false          //是否使用主机网络模式,弃用docker网桥,默认为否
  volumes:                    //在该pod上定义的共享存储卷列表
  - name: string              //共享存储卷的名称,在一个pod中每个存储卷定义一个名称
    emptyDir: {}              //类型为emptyDir的存储卷,表示与pod同生命周期的一个临时目录,其值为一个空对象:emptyDir: {}
	hostPath:                 //类型为hostPath的存储卷,表示pod容器挂载的宿主机目录,通过volumes[].hostPath.path指定
	  path: string            //pod容器挂载的宿主机目录
	secret:                   //类型为secret的存储卷,表示挂载集群预定义的secret对象到容器内部
	  secretName: string
	  items:
	  - key: string
	    path: string
	configMap:                //类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部
	  name: string
	  items: 
	  - key: string
	    path: string

3. Pod 的基本用法

在 Kubernetes 中运行容器的要求为:容器的主程序是需要一直在前台运行的,而不是后台。应用需要改造成前台运行的方式。

如果我们创建的 Docker 镜像启动命令是后台执行程序,那么 kubelet 创建包含这个容器的 Pod 之后运行完该命令,即认为 Pod 已经结束,将会立刻销毁该 Pod。如果为该 Pod 定义了 RC,创建和销毁就会进入一个无线循环的状态。

  • 创建 Pod
kubectl create -f xxx.yaml
  • 查看 Pod
kubectl get pod/po pod名称
kubectl get pod/po pod名称 -o wide
kubectl describe pod/po pod名称
  • 删除 Pod
kubectl delete -f pod pod名称.yaml
kubectl delete pod --all

Pod 可以由一个或者多个容器组合而成,如下:

  • 由一个容器组成的 Pod
#一个容器组成的Pod
apiVersion: v1
kind: pod
metadata:
  name: mytomcat
  labels:
	name: mytomcat
spec:
  containers:
 - name: mytomcat
    image: tomcat
    ports:
    - containerPort: 8080
  • 由两个紧密耦合的容器组成的 Pod
#两个紧密耦合的容器组成的Pod
apiVersion: v1
kind: pod
metadata:
  name: mytomcat
  labels:
	name: tomcat-redis
spec:
  containers:
 - name: tomcat
    image: tomcat
    ports:
    - containerPort: 8080
 - name: redis
    image: redis
    ports:
    - containerPort: 6379

4. Pod 分类

Pod 分为普通Pod静态Pod 两类。

普通 Pod 一旦被创建,就会放入 etcd 中存储,随后会被 k8s Master 调度到某个具体的node上并进行绑定,随后该 Pod 所对应的 Node 上的 kubelet 进程实例化成一组相关的 Docker 容器并启动。在默认情况下,当 Pod 里某个容器停止时,K8s 会自动检测到这个问题并且重新启动这个 Pod 里的所有容器,如果 Pod 所在的 node 宕机,则会将这个 node 上的所有 Pod 重新调度到其它节点。

静态 Pod 是由 kubelet 进行管理的仅存在于特定 node 上的 Pod,它们不能通过 API Server 进行管理,无法与 ReplicationController、Deployment 或 DaemonSet 进行关联,并且 kubelet 也无法对它们进行健康检查。

5. Pod 生命周期和重启策略

· Pod 的几个状态(生命周期)

Pod 生命周期包含PendingRunningCompeletedFailedUnknown五个状态。

状态 说明
Pending API Server 已经创建了该 Pod,但 Pod 中的一个或多个容器的镜像还没有创建,包括镜像下载过程
Running Pod 内所有容器已创建,且至少一个容器处于运行、正在启动或正在重启状态
Compeleted Pod 内所有容器均成功执行退出,且不会再重启
Failed Pod 内所有容器均已退出,但至少—个容器退出失败
Unknown 由于某种原因无法获取 Pod 状态,例如网络通信不畅等

· Pod 重启策略

Pod 重启策略有AlwaysOnFailureNever,Always 为默认值。

项目 Value
Always 当容器失效时,由 kubelet 自动重启该容器
OnFailure 当容器终止运行且退出码不为 0 时,由 kubelet 自动重启该容器
Never 不论容器运行状态如何,kubelet 都不会重启该容器

6. Pod 资源配置

每个 Pod 都可以对其能使用的服务器上的计算资源设置限额,Kubernetes 中可以设置限额的计算资源有 CPUMemory 两种,CPU 的资源单位为 CPU 数量,是一个绝对值而非相对值。Memory 配额也是一个绝对值,它的单位是内存字节数。

Kubernetes中,一个计算资源进行配额限定需要设定以下两个参数:

  • Requests,该资源最小申请数量,系统必须满足要求
  • Limits,该资源最大允许使用的量,不能突破,当容器试图使用超过这个量的资源时,可能会被 Kubernetes “杀死”并重启

如下举例:mysql 容器申请最少 0.25 个 CPU 以及 64MiB 内存,在运行过程中能使用的资源配额为 0.5 个 CPU 及 128MiB 内存。

sepc
  containers :
  - name: db
  	image: mysql
  	resources:
	  requests:
		memory: "64Mi"
		cpu: "250m"
	  limits:
		memory: "128Mi"
		cpu: "500m"

文章来源: majinjian.blog.csdn.net,作者:Developer 小马,版权归原作者所有,如需转载,请联系作者。

原文链接:majinjian.blog.csdn.net/article/details/126336629

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。