什么是pod?
pod是kubernetes中最小的单元,Pod可以包含多个容器和单个容器,每个pod还包含了一个pause容器,pause容器是pod的父容器,主要负责僵尸进程的回收管理,通过pause容器可以使同一个pod里面的多个容器共享存储、网络、PID、IPC等。
Pod 怎样管理多个容器
Pod 被设计成支持形成内聚服务单元的多个协作过程(形式为容器)。 Pod 中的容器被自动安排到集群中的同一物理机或虚拟机上,并可以一起进行调度。 容器之间可以共享资源和依赖、彼此通信、协调何时以及何种方式终止自身。
例如,你可能有一个容器,为共享卷中的文件提供 Web 服务器支持,以及一个单独的 "边车 (sidercar)" 容器负责从远端更新这些文件,如下图所示:
有些 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的创建流程
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:镜像正处于下载中