kubernetes-3 k8s集群中的生命周期

1、什么是Pod生命周期

Pod 可以包含多个容器,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。Init 容器和普通容器区别不大,主要是init优先运行,init成功运行完成后,才会启动主容器,所以Init 容器不支持 Readiness。如果 Pod 的 Init 容器启动失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。
kubernetes-3 k8s集群中的生命周期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

kubernetes-3 k8s集群中的生命周期

没有运行起来,当前正在初始化,只有一个初始化容器,一直在探测解析。

kubernetes-3 k8s集群中的生命周期

创建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!!

kubernetes-3 k8s集群中的生命周期

[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>

改回端口

kubernetes-3 k8s集群中的生命周期

肯定成功running

kubernetes-3 k8s集群中的生命周期

(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文件,无法就绪。

kubernetes-3 k8s集群中的生命周期

进入容器内部添加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

直接READYL

kubernetes-3 k8s集群中的生命周期

我们可以看到发布的内容

kubernetes-3 k8s集群中的生命周期

上一篇:【Flutter】Provider之HelloWorld


下一篇:springboot docker容器运行时,文件无法上传的解决办法。