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