1、什么是Pod生命周期
Pod 可以包含多个容器,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。Init 容器和普通容器区别不大,主要是init优先运行,init成功运行完成后,才会启动主容器,所以Init 容器不支持 Readiness。如果 Pod 的 Init 容器启动失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。
Init 容器的优势:
1、想用某些工具,又不想放在主容器中,就把这些工具放在初始镜像init使用,运行完,初始镜像结束,再用主容器
2、Init 容器可以安全地运行这些工具,减少风险
3、应用镜像的创建者和部署者可以各自独立工作
2、Pod生命周期实现
(1)init容器
编写myapp.yaml文件
[root@server2 ~]# cat myapp.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
initContainers: ## 优先执行init容器
- name: init-myservice
image: busybox:latest
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"] ##休眠两秒检测一次 do输出信息
containers:
- name: myapp-container
image: myapp:v1
imagePullPolicy: IfNotPresent
没有运行起来,当前正在初始化,只有一个初始化容器,一直在探测解析。
创建svc,添加init容器要求的服务
[root@server2 ~]# cat myservice.yaml
--- ##标记语言,代表分割多个清单
apiVersion: v1
kind: Service ##创建的服务
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80 ##对外的端口
targetPort: 80 ##容器内的端口
[root@server2 ~]# kubectl apply -f myservice.yaml
service/myservice created
running!!
[root@server2 ~]# kubectl describe svc myservice
Name: myservice
Namespace: default
Labels: <none>
Annotations: <none>
Selector: <none>
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.98.205.219
IPs: 10.98.205.219
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: <none>
Session Affinity: None
Events: <none>
(2)存活探针livenessProbe
表示容器是否正在运行(running)
注意:当存活和就绪探针同时存在,但只有存活探针通过时,容器会运行,但只能内部运行,无法对外访问。只有两个探针都运行成功,才可以对外访问。
Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应:livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态Success。
[root@server2 ~]# cat myapp.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 2 ##容器启动多久后检测
periodSeconds: 3 ## 检测间隔
timeoutSeconds: 2 ## 检测超时
因为我改变了端口,肯定监测不到,所以容器一直无法启动。
[root@server2 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp 0/1 CrashLoopBackOff 5 111s 10.244.1.22 server3 <none> <none>
改回端口
肯定成功running
(3)就绪探针readinessProbe
readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 F 。
就绪探针就绪后,才能用这个后端,否则svc不会暴露端口。
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 2
periodSeconds: 3
timeoutSeconds: 2
readinessProbe:
httpGet:
path: /test.html ##通过监测/test.html这个文件判断是否就绪
port: 80
initialDelaySeconds: 2
periodSeconds: 3
timeoutSeconds: 2
running但处于未就绪状态,存活探针OK,就绪探针不OK,没有检测到test.html文件,无法就绪。
进入容器内部添加test.html文件
[root@server2 ~]# kubectl exec -it myapp -- sh
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue state UP
link/ether e2:57:bb:7e:a5:6d brd ff:ff:ff:ff:ff:ff
inet 10.244.2.18/24 brd 10.244.2.255 scope global eth0
valid_lft forever preferred_lft forever