Kubernetes pod

什么是pod?

pod是kubernetes中最小的单元,Pod可以包含多个容器和单个容器,每个pod还包含了一个pause容器,pause容器是pod的父容器,主要负责僵尸进程的回收管理,通过pause容器可以使同一个pod里面的多个容器共享存储、网络、PID、IPC等。

Pod 怎样管理多个容器
Pod 被设计成支持形成内聚服务单元的多个协作过程(形式为容器)。 Pod 中的容器被自动安排到集群中的同一物理机或虚拟机上,并可以一起进行调度。 容器之间可以共享资源和依赖、彼此通信、协调何时以及何种方式终止自身。
例如,你可能有一个容器,为共享卷中的文件提供 Web 服务器支持,以及一个单独的 "边车 (sidercar)" 容器负责从远端更新这些文件,如下图所示:

af0466ba1cf6428ab60379502fbfb327.jpg
有些 Pod 具有 Init 容器和 应用容器。 Init 容器会在启动应用容器之前运行并完成。
Pod 天生地为其成员容器提供了两种共享资源:网络和存储。

 

容器的重启策略
当某个容器退出或者健康检查失败的时候会触发重启策略、

Always
当容器失效的时候,kubeket 会自动重启这个容器
2)OnFailure
当容器退出状态码不为0(非正常停止)的时候,才会启动重启策略
3)Never
不论状态怎么样都不会重启

如何定义一个pod?
编写一个yaml文件
apiVersion: v1    #必选,版本号,例如v1
kind: Pod            #必选,资源类型,例如Pod
metadata:          #必选,元数据
  name: nginx    #必选,Pod名称
  namespace: default   #Pod所属的命名空间,默认为“default”
  labels:            #Pod自定义的标签列表
    app: nginx
    role: fronted
  annotations:
   app: nginx
spec:
  containers:     #必选,容器列表
  - name: nginx    #必选,符合RFC 1035规范的容器名称
    image: nginx:latest    #必选,容器所用的镜像的地址
    imagePullPlicy: Always    #可选,镜像拉取策略
    command: #可选,容器启动执行的命令
    - nginx
    - -g
    - "daemon off"
    workingDir: /usr/share/nginx/html    #可选,容器的工作目录
    volumeMounts:    #可选,存储卷配置,可以配置多个
    - name: webroot      #存储卷名称
      mountPath: /usr/share/nginx/html   #挂载目录  
      readOnly: true     #只读
    ports:      #可选,容器需要暴露的端口号列表
    - name: http  #端口名称
      containerPort: 80   #端口号
      protocol: TCP  #端口协议,默认TCP
    env:   #可选,环境变量配置列表
    - name: TZ #变量名
      value: Asia/Shanghai #变量值
    - name: LANG #变量名
      value: en_US.utf8 #变量值
    resources:    #可选,资源限制和资源请求限制
      limits: #最大限制配置
        cpu: 1000m
        memory: 1024Mi
      requests:     #启动所需的资源
        cpu: 100m
        memory: 512Mi
restartPolicy: Always   #可选,默认为Always
hostNetwork: false  #可选,是否为主机模式,如果是,会占用主机端口
volumes:      #共享存储卷列表
  - name: webroot   #挂载目录
   emptyDir: {}        #挂载本机目录
启动yaml文件
kubectl create -f nginx-pod.yaml

启动pod
kubectl run nginx --image=nginx:1.19.0

Kubectl get pods -o wide

查看pod
Kubectl get pods

查看pod的同时显示pod组件的标签
kubectl get pods --show-labels 

指定标签
kubectl get pods -l run=nginx

Kubectl get ns (ns是namespace的简写)查看命名空间

Kubectl get namesapce 删除命名空间

Pod探针
StartupProbe:k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动。如果配置了startupProbe,就会先禁止其他的探测,直到它成功为止,成功后将不在进行探测。

LivenessProbe(存活探针):用于探测容器是否运行,如果探测失败,kubelet会根据配置的重启策略进行相应的处理。若没有配置该探针,默认就是success。存活性探针。判断pod是否需要重启

ReadinessProbe(就绪探针):一般用于探测容器内的程序是否健康,它的返回值如果为success,那么久代表这个容器已经完成启动,并且程序已经是可以接受流量的状态。就绪性探测。判断pod是否能够提供正常服务。

Pod探针的检测方式
ExecAction:在容器内执行一个命令,如果返回值为0,则认为容器健康。
TCPSocketAction:通过TCP连接检查容器内的端口是否是通的,如果是通的就认为容器健康。
HTTPGetAction:通过应用程序暴露的API地址来检查程序是否是正常的,如果状态码为200~400之间,则认为容器健康。

探针检查参数配置
initialDelaySeconds: 60    #pod初始化时间
timeoutSeconds: 2    #检测超时时间
periodSeconds: 5      #pod检测间隔
successThreshold: 1   #检查成功为1次表示就绪
failureThreshold: 2     #检测失败2次表示未就绪
Path: /health    #URI地址
Port:8080  #端口号 
scheme:HTTP   #支持的协议HTTP或者HTTPS
每次检查的间隔是10秒,超时时间是5秒,单次检查是10+5=15秒
三种探针的区别
ReadinessProbe 和 livenessProbe 可以使用相同探测方式,只是对 Pod 的处置方式不同:
readinessProbe 当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除。
livenessProbe 当检测失败后,将杀死容器并根据 Pod 的重启策略来决定作出对应的措施。

Pod的创建流程

 388e7555cefb4cdbb36efddc133c1a70.jpg 

Pod退出流程
1、K8S 启动新POD。
新的POD等待启动
2、K8S等待新POD进入Ready(Running) 状态。
pod状态为Running。
3、K8S创建Endpoint。
k8s创建endpoint,将新服务纳入负载均衡。
4、Pod设置为”Terminating”状态,并从所有服务的Endpoints列表中删除。 
Pod停止获得新的流量。但在Pod中运行的容器不会受到影响。
5、preStop Hook被执行
preStop Hook是一个发送到Pod中的容器特殊命令或Http请求。
如果您的应用程序在接收SIGTERM时没有正常关闭,您可以使用preStop Hook来触发正常关闭。 
接收SIGTERM时大多数程序都会正常关闭,但如果您使用的是第三方代码或管理的系统无法控制,则preStop Hook是在不修改应用程序的情况下触发正常关闭的好方法。
6、SIGTERM信号被发送到Pod
Kubernetes将向pod中的容器发送SIGTERM信号。这个信号让容器知道它们很快就会关闭。
Pod的状态
运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
等待中(Pending): Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。
创建pod的请求已经被k8s接受,但是容器并没有启动成功,可能处在:写数据到etcd,调度,pull镜像,启动容器这四个阶段中的任何一个阶段,pending伴随的事件通常会有:ADDED, Modified这两个事件的产生。
正常终止(Succeeded):pod中的所有的容器已经正常的自行退出,并且k8s永远不会自动重启这些容器,一般会是在部署job的时候会出现。
异常停止(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
未知状态(Unkonwn):出于某种原因,无法获得Pod的状态,通常是由于与Pod主机通信时出错。
ErrImagePull: 镜像下载失败
ImagePullBackOff:镜像正处于下载中

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值