企业项目实战k8s篇(三)pod生命周期
pod生命周期一.init容器(初始化容器)1.init容器简介2.init初始化二.探针1.探针概述2.livenessProbe存活探针3.readinessProbe就绪探针一.init容器(初始化容器)1.init容器简介Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。Init容器与普通的容器非常像,除了如下两点:它们总
一.init容器(初始化容器)
1.init容器简介
Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
Init容器与普通的容器非常像,除了如下两点:
- 它们总是运行到完成。
- Init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成。
每个 Init 容器必须运行成功,下一个才能够运行。
Init 容器能做什么?
- Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。
- Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
- 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
- Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。
- 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。
2.init初始化
初始化验证脚本,需要初始化两个service,只有两个service创建成功,pod才会进入下一周期
将service1和service2注释,模拟初始化失败
[root@server1 ~]# cat init.yml
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,nydb与myservice没有创建
[root@server1 ~]# kubectl apply -f init.yml
pod/myapp-pod created
[root@server1 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo ClusterIP 10.105.217.194 <none> 80/TCP 5h22m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d21h
查看pod状态,显示init 0/2,说明初始化失败
[root@server1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 14s
修改脚本,将注释部分依次还原依次执行脚本,查看变化,发现init初始化成功,pod初始化完成后进入running状态
[root@server1 ~]# vim init.yml
[root@server1 ~]# kubectl apply -f init.yml
pod/myapp-pod unchanged
service/myservice created
[root@server1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 90s
[root@server1 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo ClusterIP 10.105.217.194 <none> 80/TCP 5h23m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d21h
myservice ClusterIP 10.100.6.8 <none> 80/TCP 8s
[root@server1 ~]# vim init.yml
[root@server1 ~]# kubectl apply -f init.yml
pod/myapp-pod unchanged
service/myservice unchanged
service/mydb created
[root@server1 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo ClusterIP 10.105.217.194 <none> 80/TCP 5h24m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d21h
mydb ClusterIP 10.98.3.156 <none> 80/TCP 2s
myservice ClusterIP 10.100.6.8 <none> 80/TCP 34s
[root@server1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:1/2 0 2m3s
[root@server1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:1/2 0 2m5s
[root@server1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:1/2 0 2m7s
[root@server1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 PodInitializing 0 2m8s
[root@server1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 2m9s
[root@server1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 2m10s
二.探针
1.探针概述
探针 是由 kubelet 对容器执行的定期诊断:
- ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
- TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。
- HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTPGet 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的。
每次探测都将获得以下三种结果之一:
- 成功:容器通过了诊断。
- 失败:容器未通过诊断。
- 未知:诊断失败,因此不会采取任何行动。
Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应:
- livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。
- readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态Success。
- startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。
重启策略
- PodSpec 中有一个 restartPolicy 字段,可能的值为 Always、OnFailure 和Never。默认为 Always。
Pod 的生命
- 一般Pod 不会消失,直到人为销毁他们,这可能是一个人或控制器。
- 建议创建适当的控制器来创建 Pod,而不是直接自己创建 Pod。因为单独的Pod 在机器故障的情况下没有办法自动复原,而控制器却可以。
三种可用的控制器:
- 使用 Job 运行预期会终止的 Pod,例如批量计算。Job 仅适用于重启策略为 OnFailure 或 Never 的 Pod。
- 对预期不会终止的 Pod 使用 ReplicationController、ReplicaSet 和Deployment ,例如 Web 服务器。 ReplicationController 仅适用于具有 restartPolicy 为 Always 的 Pod。
- 提供特定于机器的系统服务,使用 DaemonSet 为每台机器运行一个 Pod 。
2.livenessProbe存活探针
yml脚本,设定存活探针,设置寻找80端口,找不到无法确定存活,将会按照默认重启策略,一直重启,直到找到端口
[root@server1 ~]# 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
执行脚本,监控pod状态,由于未满足存活探针条件,始终处于重启状态
[root@server1 ~]# kubectl apply -f pod.yaml
pod/pod-example created
[root@server1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-example 0/1 Running 1 14s
[root@server1 ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
pod-example 0/1 Running 2 21s
pod-example 0/1 CrashLoopBackOff 2 27s
pod-example 0/1 Running 3 43s
pod-example 0/1 Running 4 51s
pod-example 0/1 CrashLoopBackOff 4 60s
3.readinessProbe就绪探针
就绪探针在脚本的应用是判断80端口访问下,是否能够获取/test.html页面内容,如果能够获取内容,证明服务访问正常,一切准备就绪,可以进入下一周期,反之不满足,失败。
[root@server1 ~]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
readinessProbe:
httpGet:
path: /test.html
port: 80
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 1
就绪探针的特点是,未处于就绪的容器,仅可以通过内网访问,不可以开放给外部访问,因此创建service服务脚本,通过查看能否进行外部访问确认是否就绪
svc.yml
[root@server1 ~]# cat svc.yml
apiVersion: v1
kind: Service
metadata:
name: mysvc
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: myapp
执行脚本,查看pod状态
[root@server1 ~]# kubectl apply -f svc.yml
service/mysvc created
[root@server1 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-example 0/1 Running 0 51s app=myapp
查看svc,进行访问,被拒绝 Endpoints
内为空
[root@server1 ~]# kubectl get svc mysvc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysvc ClusterIP 10.96.220.88 <none> 80/TCP 45s
[root@server1 ~]# curl 10.96.220.88
curl: (7) Failed connect to 10.96.220.88:80; Connection refused
[root@server1 ~]# kubectl describe svc mysvc
Name: mysvc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=myapp
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.96.220.88
IPs: 10.96.220.88
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints:
Session Affinity: None
Events: <none>
进入交互界面,创建默认发布页面test.html
[root@server1 ~]# kubectl exec pod-example -it -- sh
~ # cd /usr/share/nginx/html/
/usr/share/nginx/html # ls
50x.html index.html
/usr/share/nginx/html # echo www.westos.org > test.html
/usr/share/nginx/html # exit
[root@server1 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-example 1/1 Running 0 3m53s app=myapp
[root@server1 ~]# curl 10.96.220.88
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server1 ~]# curl 10.96.220.88/test.html
www.westos.org
查看svc,获取内容Endpoints: 10.244.2.25:80
,可以进行外部访问
[root@server1 ~]# kubectl describe svc mysvc
Name: mysvc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=myapp
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.96.220.88
IPs: 10.96.220.88
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.2.25:80
Session Affinity: None
Events: <none>
测试
查看pod状态,处于ready
[root@server1 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-example 1/1 Running 0 51s app=myapp
更多推荐
所有评论(0)