kubernetes-pod
pod生命周期
Pod 遵循一个预定义的生命周期,起始于 Pending 阶段,如果至少 其中有一个主要容器正常启动,则进入 Running,之后取决于 Pod 中是否有容器以 失败状态结束而进入 Succeeded 或者 Failed 阶段。
在 Pod 运行期间,kubelet 能够重启容器以处理一些失效场景。 在 Pod 内部,Kubernetes 跟踪不同容器的状态 并确定使 Pod 重新变得健康所需要采取的动作。
在 Kubernetes API 中,Pod 包含规约部分和实际状态部分。 Pod 对象的状态包含了一组 Pod 状况(Conditions)。 如果应用需要的话,你也可以向其中注入自定义的就绪性信息。
Pod 在其生命周期中只会被调度一次。 一旦 Pod 被调度(分派)到某个节点,Pod 会一直在该节点运行,直到 Pod 停止或者 被终止。
init容器
每个 Pod 中可以包含多个容器, 应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
Init 容器与普通的容器非常像,除了如下两点:
它们总是运行到完成。
每个都必须在下一个启动之前成功完成。
如果 Pod 的 Init 容器失败,kubelet 会不断地重启该 Init 容器直到该容器成功为止。 然而,如果 Pod 对应的 restartPolicy 值为 “Never”,并且 Pod 的 Init 容器失败, 则 Kubernetes 会将整个 Pod 状态设置为失败。
yum install bind-utils -y
- init初始化
[root@server2 pod]# vim init.yaml
[root@server2 pod]# cat init.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busyboxplus
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busyboxplus
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busyboxplus
command: ['sh', '-c', "until nslookup mydb.default.svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
#---
##apiVersion: v1
##kind: Service
##metadata:
## name: myservice
##spec:
## ports:
## - protocol: TCP
## port: 80
## targetPort: 9376
##---
##apiVersion: v1
##kind: Service
##metadata:
## name: mydb
##spec:
## ports:
## - protocol: TCP
## port: 80
## targetPort: 9377
#
#
执行命令并查看service
[root@server2 pod]# kubectl delete -f pod.yaml
pod "pod-example" deleted
[root@server2 pod]# kubectl apply -f init.yaml
pod/myapp-pod created
[root@server2 pod]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo ClusterIP 10.102.41.19 <none> 80/TCP 161m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d20h
[root@server2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 56s
初始化失败
将注释依次去掉,查看变化
[root@server2 pod]# vim init.yaml
[root@server2 pod]# kubectl apply -f init.yaml
pod/myapp-pod unchanged
service/myservice created
[root@server2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo-5b4fc8bb88-8knth 1/1 Running 0 95m
demo-5b4fc8bb88-9f42m 1/1 Running 0 95m
myapp-deployment-59dff4cf5d-27bfp 1/1 Running 0 24h
myapp-deployment-59dff4cf5d-7d5nk 1/1 Running 0 24h
myapp-deployment-59dff4cf5d-bb8w8 1/1 Running 0 24h
myapp-pod 0/1 Init:0/2 0 19m
[root@server2 pod]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myservice ClusterIP 10.105.167.119 <none> 80/TCP 18s
[root@server2 pod]# vim init.yaml
[root@server2 pod]# kubectl apply -f init.yaml
pod/myapp-pod unchanged
service/myservice unchanged
service/mydb created
可以看到两个service都创建成功
[root@server2 pod]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mydb ClusterIP 10.105.154.252 <none> 80/TCP 13s
myservice ClusterIP 10.105.167.119 <none> 80/TCP 78s
初始化成功
[root@server2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Running 0 3m44s
容器探针
Probe 是由 kubelet 对容器执行的定期诊断。 要执行诊断,kubelet 调用由容器实现的 Handler (处理程序)。有三种类型的处理程序:
ExecAction: 在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
TCPSocketAction: 对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。
HTTPGetAction: 对容器的 IP 地址上指定端口和路径执行 HTTP Get 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。
每次探测都将获得以下三种结果之一:
Success(成功):容器通过了诊断。
Failure(失败):容器未通过诊断。
Unknown(未知):诊断失败,因此不会采取任何行动。
针对运行中的容器,kubelet 可以选择是否执行以下三种探针,以及如何针对探测结果作出反应:
livenessProbe:指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略决定未来。如果容器不提供存活探针, 则默认状态为 Success。
readinessProbe:指示容器是否准备好为请求提供服务。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。 初始延迟之前的就绪态的状态值默认为 Failure。 如果容器不提供就绪态探针,则默认状态为 Success。
startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器,而容器依其 重启策略进行重启。 如果容器没有提供启动探测,则默认状态为 Success。
livenessProbe存活探针
- 设定存活探针,寻找80端口,找不到无法确定存活,将会按照默认重启策略,一直重启,直到找到端口
[root@server2 pod]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 1
[root@server2 pod]# kubectl delete -f pod.yaml
pod "pod-example" deleted
^[[A[root@server2 pokubectl apply -f pod.yaml
pod/pod-example created
[root@server2 pod]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
pod-example 0/1 Running 2 32s
pod-example 0/1 CrashLoopBackOff 2 36s
pod-example 0/1 Running 3 42s
pod-example 0/1 Running 4 45s
pod-example 0/1 CrashLoopBackOff 4 54s
未完