1、init 容器
init 模板
apiVersion: v1 kind: Pod metadata: name: initctest spec: containers: - name: busybox image: hub.wufujie.com/library/busybox:v1 command: ['sh','-c','echo The app is running! && sleep 3600'] initContainers: - name: init-myservice image: hub.wufujie.com/library/busybox:v1 command: ['sh','-c','until nslookup myservice;do echo waiting for myservice;sleep 2;done;'] - name: init-mydb image: hub.wufujie.com/library/busybox:v1 command: ['sh','-c','until nslookup mydb;do echo waiting for mydb;sleep 2;done;']
service
apiVersion: v1 kind: Service metadata: name: myservice spec: ports: - protocol: TCP port: 80 targetPort: 9375
apiVersion: v1 kind: Service metadata: name: mydb spec: ports: - protocol: TCP port: 80 targetPort: 9377
2、检测探针——就绪检测
readiness-httpget-pod.yml
apiVersion: v1 kind: Pod metadata: name: readiness-httpget-pod namespace: default spec: containers: - name: readiness-httpget-container image: hub.wufujie.com/library/httpd:v1 imagePullPolicy: IfNotPresent readinessProbe: httpGet: port: 80 path: /index1.html initialDelaySeconds: 1 periodSeconds: 3
此刻创建 pod
kubectl create -f readiness-httpget-pod.yml
因为容器的路径下没有 index1.html 这个文件,所有 pod 一直处在 ready 状态
我们进入容器,在网页根目录下创建一个 index1.html 的文件
[root@master ~]# kubectl exec -it readiness-httpget-pod -- /bin/bash root@readiness-httpget-pod:/usr/local/apache2# cd htdocs/ root@readiness-httpget-pod:/usr/local/apache2/htdocs# echo "hello world!" > index1.html root@readiness-httpget-pod:/usr/local/apache2/htdocs# exit exit
此刻查看 pod 状态,发现 pod 已经 ready
3、探针检测——存活检测
livenessProbe-exec.yml
apiVersion: v1 kind: Pod metadata: name: liveness-exec-pod namespace: default spec: containers: - name: liveness-exec-container image: hub.wufujie.com/library/busybox:v1 imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","touch /tmp/live;sleep 60;rm -rf /tmp/live;sleep 3600"] livenessProbe: exec: command: ["test","-e","/tmp/live"] initialDelaySeconds: 1 periodSeconds: 3
command 命令的意思是:1、创建 /tmp/live 文件;2、休眠 60 秒;3、删除文件 /tmp/live;4、休眠 3600 秒
下一个 command 检测 /tmp/live 这个文件是否存在
initailDelaySeconds: 1的意思是容器初始化 1 秒后,才开始检测 /tmp/live 文件
periodSeconds: 3的意思是,检测的循环周期是 3 秒
从下图可以看到,如果检测不到文件,pod 会重启
livenessProbe-httpget.yml
通过 http 能够访问网页,来检测是否存活
apiVersion: v1 kind: Pod metadata: name: liveness-httpget-pod namespace: default spec: containers: - name: liveness-httpget-container image: hub.wufujie.com/library/httpd:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 livenessProbe: httpGet: port: http path: /index.html initialDelaySeconds: 1 periodSeconds: 3 timeoutSeconds: 10
查看状态,已经在 running 了
我们进去容器,把 index.html 改成 index1.html,再看看
已经看到已经重启一次了
livenessProbe-tcp.yml
检查 tcp 连接,80端口是否再通信
apiVersion: v1 kind: Pod metadata: name: probe-tcp spec: containers: - name: nginx image: hub.wufujie.com/library/httpd:v1 livenessProbe: initialDelaySeconds: 5 timeoutSeconds: 1 tcpSocket: port: 80
4、启动退出动作
在容器启动的时候执行命令
在容器停止前执行命令
apiVersion: v1 kind: Pod metadata: name: lifecycle-demo spec: containers: - name: lifecycle-demo-container image: nginx lifecycle: postStart: exec: command: ["/bin/sh", "-c", "echo Hello from the postStart handler >/usr/share/message"] preStop: exec: command: ["/bin/sh", "-c", "echo Hello from the poststop handler >/usr/share/message"]