K8S Pod 生命周期 (二)

Init 容器

mkdir ~/initC/ && cd ~/initC/

cat init-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels: 
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo The app is runing! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox
    command: ['sh', '-c', 'until nslookup myservice; do echo waithing for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox
    command: ['sh', '-c', 'until nslookup mydb; do echo waithing for mydb; sleep 2; done;']

kubectl create -f init-pod.yaml 

[root@k8s-master01 initC]# kubectl get pods
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:0/2   0          23h

# 创建第一个 svc myservice
cat myservice.yaml 
kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

kubectl apply -f myservice.yaml

# 这里看到已经初始化好第一个 init 容器
[root@k8s-master01 initC]# kubectl get pod
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:1/2   0          23h

# 创建第二个 svc myservice
cat myservice.yaml 
kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

---

kind: Service
apiVersion: v1
metadata:
  name: mydb
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9377

kubectl apply -f myservice.yaml

[root@k8s-master01 initC]# kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1/1     Running   0          24h

检测探针 - 就绪检测

检测容器是否推备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。

readiness-httpget-pod 探测模式

cd ~/initC/

cat readiness-probe-httpget.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: readiness-httpget-pod
  namespace: default
spec:
  containers:
  - name: readiness-httpget-pod
    image: wangyanglinux/myapp:v1
    imagePullPolicy: IfNotPresent
    readinessProbe:
      httpGet:
        port: 80
        path: /index1.html
      initialDelaySeconds: 1
      periodSeconds: 3

kubectl apply -f readiness-probe-httpget.yaml 

# 因为没有 indes1.html 文件,pod 无法进入 ready 状态
[root@k8s-master01 initC]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
readiness-httpget-pod   0/1     Running   0          6s

# 创建 index1.html 文件
kubectl exec readiness-httpget-pod -it -- /bin/sh

cd /usr/share/nginx/html/

echo "klvchen" > index1.html

exit

kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
readiness-httpget-pod   1/1     Running   0          4m22s

检测探针 - 存活检测

检测容器是否正在运行。如果存活探测失败, 则 kubelet 会杀死容器,并且容器将受到其重启策略的影响。

liveness-exec-pod 探测模式

kubectl delete pod --all

cat liveness-exec.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec-pod
  namespace: default
spec:
  containers:
  - name: liveness-exec-container
    image: busybox
    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

kubectl apply -f liveness-exec.yaml 

kubectl get pod -w
NAME                READY   STATUS    RESTARTS   AGE
liveness-exec-pod   1/1     Running   0          8s
liveness-exec-pod   1/1     Running   1          103s

liveness-httpget-pod 探测模式

kubectl delete pod --all

cat liveness-probe-httpget.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget-pod
  namespace: default
spec:
  containers:
  - name: liveness-httpget-pod
    image: wangyanglinux/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80       # 这个可以不需要指定,因为 K8S 是扁平化的网络,容器启动的端口会映射在 pod 的 pause 上
    livenessProbe:
      httpGet:
        port: 80
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 10

kubectl get pod
NAME                   READY   STATUS    RESTARTS   AGE
liveness-httpget-pod   1/1     Running   0          33s

liveness-probe-tcp 探测模式

cat liveness-probe-tcp.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: liveness-probe-tcp
spec:
  containers:
  - name: liveness-probe-pod
    image: wangyanglinux/myapp:v1
    livenessProbe:
      initialDelaySeconds: 1
      timeoutSeconds: 1
      tcpSocket:
        port: 80

kubectl apply -f liveness-probe-tcp.yaml 

kubectl get pod
NAME                 READY   STATUS    RESTARTS   AGE
liveness-probe-tcp   1/1     Running   0          9s

启动退出动作

cat lifecycle-demo.yaml 
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 Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh","-c","echo Hello Hello from the postStop handler > /usr/share/message"]

kubectl apply -f lifecycle-demo.yaml 

kubectl exec -it lifecycle-demo -- /bin/sh
# cat /usr/share/message
Hello Hello from the postStart handler
原文地址:https://www.cnblogs.com/klvchen/p/12458674.html