● 我们一般将Pod对象从创建到终止的这段时间范围称为Pod的生命周期,它主要包含下面的过程:
○ Pod创建过程。
○ 运行初始化容器(init container)过程。
○ 运行主容器(main container):
■ 容器启动后钩子(post start)、容器终止前钩子(pre stop)。
■ 容器的存活性探测(liveness probe)、就绪性探测(readiness probe)。
○ Pod终止过程。
● 在整个生命周期中,Pod会出现5种状态(相位),分别如下:
○ 挂起(Pending):API Server已经创建了Pod资源对象,但它尚未被调度完成或者仍处于下载镜像的过程中。
○ 运行中(Running):Pod已经被调度到某节点,并且所有容器都已经被kubelet创建完成。
○ 成功(Succeeded):Pod中的所有容器都已经成功终止并且不会被重启。
○ 失败(Failed):所有容器都已经终止,但至少有一个容器终止失败,即容器返回了非0值的退出状态。
○ 未知(Unknown):API Server无法正常获取到Pod对象的状态信息,通常由于网络通信失败所导致。
apiVersion: v1
kind: Pod
metadata:
name: pod-initcontainer
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
initContainers:
- name: test-mysql
image: busybox:1.30
command: ["sh", "-c", "until ping 192.168.10.201 -c 1; do echo waiting for mysql ...; sleep 3; done;"]
- name: test-redis
image: busybox:1.30
command: ["sh", "-c", "until ping 192.168.10.202 -c 1; do echo waiting for redis ...; sleep 3; done;"]
kubectl create -f pod-initcontainer.yaml
kubectl get pod -n dev
kubectl get pod pod-initcontainer -n dev -w
ifconfig ens33:1 192.168.10.201 netmask 255.255.255.0 up
ifconfig ens33:2 192.168.10.202 netmask 255.255.255.0 up
● 钩子函数能够感知自身生命周期中的事件,并在相应的时刻到来时运行用户指定的程序代码。
● kubernetes在主容器启动之后和停止之前提供了两个钩子函数:
○ post start:容器创建之后执行,如果失败会重启容器。
○ pre stop:容器终止之前执行,执行完成之后容器将成功终止,在其完成之前会阻塞删除容器的操作。
● 钩子处理器支持使用下面的三种方式定义动作:
(1)exec命令,在容器内执行一次命令
……
lifecycle:
postStart:
exec:
command:
- cat
- /tmp/healthy
……
(2)tcpSocket: 在当前容器尝试访问指定的socket
……
lifecycle:
postStart:
tcpSocket:
port: 8080
……
(3)httpGet: 在当前容器中向某url发起http请求
……
lifecycle:
postStart:
httpGet:
path: / #URI地址
port: 80 #端口号
host: 192.168.109.100 #主机地址
scheme: HTTP #支持的协议,http或者https
……
apiVersion: v1
kind: Pod
metadata:
name: pod-initcontainer
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
lifecycle: # 生命周期钩子
postStart:
exec:
command: ["/bin/sh", "-c", "echo postStart ... > /usr/share/nginx/html/index.html"]
preStop:
exec:
command: ["/usr/sbin/nginx", "-s", "quit"]
kubectl create -f pod-hook-exec.yaml
kubectl get pod pod-hook-exec -n dev -o wide
curl pod_ip:80
apiVersion: v1
kind: Pod
metadata:
name: pod-liveness-exec
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
livenessProbe: # 存活性探测
exec:
command: ["/bin/cat", "/tmp/hello.txt"] # 执行一个查看文件的命令,肯定失败,因为根本没有这个文件
创建pod,查看pod详情
kubectl create -f pod-liveness-exec.yaml
kubectl describe pod pod-liveness-exec -n dev
观察上面的信息就会发现nginx容器启动之后就进行了健康检查。
检查失败之后,容器被kill掉,然后尝试进行重启,这是重启策略的作用。
稍等一会之后,再观察Pod的信息,就会看到RESTARTS不再是0,而是一直增长。
多等一会再次查看pod信息kubectl get pod pod-liveness-exec -n dev
发现状态已经变了
NAME READY STATUS RESTARTS AGE
pod-liveness-exec 0/1 CrashLoopBackOff 4 3m4s
apiVersion: v1
kind: Pod
metadata:
name: pod-liveness-tcpsocket
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
livenessProbe: # 存活性探针
tcpSocket: #
port: 8080 # 尝试访问8080端口,肯定失败,因为Pod里面值运行了一个nginx容器,而且只是监听了80端口
创建pod,查看pod
kubectl create -f pod-liveness-tcpsocket.yaml
kubectl describe pod pod-liveness-tcpsocket -n dev
探针的警告信息:
Warning Unhealthy 7s kubelet, node1 Liveness probe failed: dial tcp 10.244.1.37:8080: connect: connection refused
apiVersion: v1
kind: Pod
metadata:
name: pod-liveness-httpget
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
livenessProbe:
httpGet: # 其实就是访问http://podIP:80/hello
path: /hello
port: 80
scheme: http
# host: 省略,默认就是pod ip
创建Pod, 查看Pod, 查看pod详情
kubectl create -f pod-liveness-httpget.yaml
kubectl get pod pod-liveness-httpget -n dev
kubectl descibe pod pod-liveness-httpget -n dev
存活探针httpGet警告信息:
Warning Unhealthy 9s (x4 over 39s) kubelet, node2 Liveness probe failed: Get http://127.0.0.1:80/hello: dial tcp 127.0.0.1:80: connect: connection refused
kubectl explain pod.spec.containers.livenessProbe
FIELDS:
exec
tcpSocket
httpGet
initialDelaySeconds # 容器启动后等待多少秒执行第一次探测
timeoutSeconds # 探测超时时间。默认1秒,最小1秒
periodSeconds # 执行探测的频率。默认是10秒,最小1秒
failureThreshold # 连续探测失败多少次才被认定为失败。默认是3。最小值是1
successThreshold # 连续探测成功多少次才被认定为成功。默认是1
apiVersion: v1
kind: Pod
metadata:
name: pod-restartpolicy
namespace: dev
labels:
app: nginx
run: nginx
spec:
containers:
- name: nginx
image: nginx:1.17.1
imagePullPolicy: IfNotPresent
ports:
- name: nginx-port
protocol: TCP
containerPort: 80
livenessProbe:
httpGet:
port: 80
scheme: HTTP
path: /hello
restartPolicy: Never # 重启策略
kubectl create -f pod-restartpolicy.yaml
kubectl describe pod pod-restartpolicy -n dev
Warning Unhealthy 63s (x3 over 83s) kubelet, node1 Liveness probe failed: HTTP probe failed with statuscode: 404
Normal Killing 63s kubelet, node1 Stopping container nginx