Pod 生命周期

initC
init容器总是运行到成功完成为止- 每个
init容器都必须在下一个init容器启动之前成功完成 - 如果
Pod的init容器失败,k8s会不断的重启该Pod,直到init容器成功为止。但是,如果Pod对应的restartPolicy为Never,它不会重新启动 initC与应用容器具备不同的镜像,可以把一些危险的工具放置在initC中,进行使用initC多个之间是线性启动的,所以可以做一些延迟性的操作initC无法定义readinessProbe,其它以外同应用容器定义无异
检测 initC 的阻塞性
apiVersion: v1
kind: Pod
metadata:
name: initc-1
labels:
app: initc
spec:
containers:
- name: myapp-container
image: wangyanglinux/tools:busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: wangyanglinux/tools:busybox
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: wangyanglinux/tools:busybox
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
唤醒
kubectl create svc clusterip myservice --tcp=80:80
kubectl create svc clusterip mydb --tcp=80:80
检查 initC 的执行成功
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp
image: wangyanglinux/myapp:v1.0
initContainers:
- name: randexit
image: wangyanglinux/tools:randexitv1
args: ["--exitcode=1"]
镜像构建
FROM alpine
ADD ./randexit /root
RUN chmod +x /root/randexit
CMD ["--sleeptime=5"]
ENTRYPOINT ["/root/randexit"]
命令代码
package main
import (
"flag"
"fmt"
"math/rand"
"os"
"time"
)
func main() {
sleepTime := flag.Int("sleeptime", 4, "休眠时间")
exitcode := flag.Int("exitcode", 2, "返回码")
flag.Parse()
sleeptimeDing := *sleepTime
// 处理休眠逻辑
for *sleepTime >= 0 {
time.Sleep(time.Second * 1)
*sleepTime--
}
// 产生随机返回码
// exitcode 值为 0, 返回码为 0
// exitcode 值为 1,返回码为 1
// 否则随机产生返回码
if *exitcode == 0 {
fmt.Printf("休眠 %v 秒,返回码为 %v!\n", sleeptimeDing, 0)
os.Exit(0)
} else if *exitcode == 1 {
fmt.Printf("休眠 %v 秒,返回码为 %v!\n", sleeptimeDing, 1)
os.Exit(1)
} else {
rand.Seed(time.Now().UnixNano())
num := rand.Intn(100)
if num >= 50 {
fmt.Printf("休眠 %v 秒,产生的随机数为 %v,大于等于 50 ,返回码为 %v!\n", sleeptimeDing, num, 1)
os.Exit(1)
} else {
fmt.Printf("休眠 %v 秒,产生的随机数为 %v,小于等于 50 ,返回码为 %v!\n", sleeptimeDing, num, 0)
os.Exit(0)
}
}
}
探针
- 探针是由
kubelet对容器执行的定期诊断。要执行诊断,kubelet调用由容器实现的Handler。有三种类型的处理程序:ExecAction:在容器内执行指定命令。如果命令退出时返回码为0则认为诊断成功。TCPSocketAction:对指定端口的容器上的IP地址执行TCP检查。如果端口打开,则认为诊断成功。HTTPGetAction:对指定端口和路径上的IP地址执行HTTP Get请求。如果响应的状态码大于等于200且小于400,则认为诊断成功。
- 每次此探测都将获得以下三种结果之一:
- 成功:容器通过了诊断。
- 失败:容器未通过诊断。
- 未知:诊断失败,不采取任何行动。
探针分类
startupProbe: 是否开始检测?livenessProbe: 是否存活?readinessProbe: 是否准备好提供服务?