本篇是Kubernetes第五篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战。
Pod对象自从其创建开始至其终止退出的时间范围称为其生命周期。在这段时间中,Pod会处于多种不同的状态,并执行一些操作;其中,创建主容器(main container)为必需的操作,其他可选的操作还包括运行初始化容器(init container)、容器启动后钩子(post start hook)、容器的存活性探测(liveness probe)、就绪性探测(readiness probe)以及容器终止前钩子(pre stop hook)等,这些操作是否执行则取决于Pod的定义。如下图所示:
Pod phase代表其所处生命周期的阶段。Pod phase 并不是用来代表其容器的状态,也不是一个严格的状态机。定义在Pod的PodStatus对象的phase字段中,phase 的可能情况有:
Pod有一个PodStatus对象,PodStatus包含一个 PodCondition 数组, 用来描述Pod是否达到某些指定的条件。 PodCondition包含以下字段:
除了创建应用容器之外,用户还可以为 Pod 对象定义其生命周期中的多种行为,如初始化容器、存活性探测及就绪性探测等。
初始化容器(init container)即应用程序的主容器启动之前要运行的容器,常用于为主容器执行一些预置操作,它们具有两种典型特征:
有不少场景都需要在应用容器启动之前进行初始化操作,例如,基于环境变量或配置模板为应用程序生成配置文件、从配置中心获取配置等。初始化容器的典型应用场景大概有以下几种:
注意点: 初始化容器不支持就绪型探测器(Readiness Probe),因为它们必须在 Pod 就绪之前运行完成,而就绪型探测器是在之后才开始的。
kubectl delete -f nginx-deployment.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
#通过wget下载index.html
initContainers:
- name: install
image: busybox
command:
- wget
- "-O"
- "/workdir/index.html"
- http://www.baidu.com
volumeMounts:
- name: workdir
mountPath: /workdir
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "128Mi"
cpu: "128m"
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
volumes:
- name: workdir
emptyDir: {}
kubectl apply -f nginx-init-container.yaml
kubectl describe pod nginx
kubectl exec -it nginx /bin/bash
生命周期钩子函数(lifecycle hook)是一些框架中常用的手段,它实现了程序运行周期中的关键时刻的可见性,并赋予用户为此采取某种行动的能力。类似地,容器生命周期钩子使它能够感知自身生命周期管理中的事件,并在相应的时刻到来时运行由用户指定的处理程序代码。Kubernetes 为容器提供了两种生命周期钩子:
容器可以通过实现和注册该回调的处理程序来访问该回调。 针对容器,有两种类型的回调处理程序可供实现:
kubectl delete -f nginx-init-container.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
initContainers:
- name: install
image: busybox
command:
- wget
- "-O"
- "/workdir/index.html"
- http://www.baidu.com
volumeMounts:
- name: workdir
mountPath: /workdir
containers:
- name: nginx
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/bin/sh", "-c", "nginx -s quit; while killall -0 nginx; do sleep 1; done"]
resources:
limits:
memory: "128Mi"
cpu: "128m"
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
volumes:
- name: workdir
emptyDir: {}
kubectl apply -f nginx-init-container.yaml
kubectl exec -it nginx -- /bin/bash
Kubernetes对Pod的健康状态通过三类探针来检查,其中最主要的探针是LivenessProbe和ReadinessProbe,kubelet会定期执行这两类探针来诊断容器的检查状况,介绍如下:
容器探测(container probe)是Pod对象生命周期中的一项重要的日常任务,它是由kubelet对容器周期性执行的健康状态诊断,诊断操作由于容器的处理器(handler)进行定义。Kubernetes 支持三种处理器用于 Pod 探测:
每类探针都有三种结果:
kubectl delete -f nginx-init-container.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo postStart handler >> /usr/share/message"]
preStop:
exec:
command: ["/bin/sh", "-c", "echo preStop handler >> /usr/share/message"]
resources:
limits:
memory: "128Mi"
cpu: "128m"
ports:
- containerPort: 80
livenessProbe:
exec:
command: ["/bin/sh", "-c", "echo livenessProbe >> /usr/share/message"]
initialDelaySeconds: 5
periodSeconds: 5
readinessProbe:
exec:
command: ["/bin/sh", "-c", "echo readinessProbe >> /usr/share/message"]
initialDelaySeconds: 5
periodSeconds: 5
kubectl apply -f lifecycle-pod.yaml
kubectl exec -it nginx -- /bin/bash
容器进程发生崩溃或容器申请超出限制的资源等原因都可能会导致 Pod 对象的终止,此时是否应该重建该 Pod 对象则取决于其重启策略restartPolicy属性的定义。
Pod重启策略与控制的方式息息相关,可以管理Pod的控制器有Replication Controller,Job,DaemonSet,及kubelet(静态Pod), 对于不同的控制器有注意以下问题:
此外还有一个需要注意的点就是重启的容器的时间,kubelet重启失效容器的时间间隔以指数方式增长,最长延迟时间为300秒。
欢迎大家点点关注,点点赞!
原文:https://www.cnblogs.com/wtzbk/p/15269846.html