企业运维----Docker-kubernetes-pod生命周期

21 篇文章 0 订阅
16 篇文章 0 订阅


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
  1. 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存活探针
  1. 设定存活探针,寻找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

未完

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值