目錄
- 為什么要用Kubernetes?
- K8s控制節點-Master概念
- K8s計算節點-Node概念
- 什么是Pod?
- 為什么要引入Pod?
- 創建一個Pod
- 零宕機發布應用必備知識:Pod三種探針
- 零宕機必備知識:StartupProbe
- 零宕機必備知識:Liveness和Readiness
- 零宕機必備知識:Pod退出流程
- 零宕機必備知識:PreStop的使用
為什么要用Kubernetes?
- 容器管理
- 自動恢復
- 健康檢查
- 彈性擴容
- 內部通訊
- 高可用
K8s控制節點-Master概念
Kubernetes是谷歌以Borg為前身,基於谷歌15年生產環境經驗的基礎上開源的一個項目,Kubernetes致力於提供跨主機集群的自動部署、擴展、高可用以及運行應用程序容器的平台。
k8s高可用架構解析
k8s節點一般分為master節點和node節點,master節點一般三個足以,三個master節點承載成百上千node節點完全沒有問題,node節點可以橫向擴容
node節點用於部署應用程序,master節點不允許部署應用程序,它只負責控制,調度工作
Master節點:整個集群的控制中樞
Kube-APIServer
集群的控制中樞,各個模塊之間信息交互都需要經過Kube-APIServer,同時它也是集群管理、資源配置、整個集群安全機制的入口。
Controller-Manager
集群的狀態管理器,保證Pod或其他資源達到期望值,也是需要和APIServer進行通信,在需要的時候創建、更新或刪除它所管理的資源。
Scheduler
集群的調度中心,它會根據指定的一系列條件,選擇一個或一批最佳的節點,然后部署我們的Pod。
Etcd
鍵值數據庫,報錯一些集群的信息,一般生產環境中建議部署三個以上節點(奇數個)。
注意
master節點在安裝完成之后,可能在很長一段時間都不會有任何的變化,所以在進行架設計的時候,要給足master節點資源,因為每次修改master節點是一件特別復雜的事情
我們在master節點綁定證書,每個證書綁定在master節點的ip地址或者主機名,如果我們在之前生成證書的時候沒有預留的話,那我們可能就需要重新生成一份證書,再把之前的證書都替換掉,而且還要替換node節點上面的證書,過程非常麻煩,所以一開始要給足資源,比如一次性給三台16核64G
Etcd也特別重要,一次性給足資源,未來五到十年,node節點的個數在500到1000之間的話,我們的master節點是完全不需要做任何變化的
K8s計算節點-Node概念
node節點和master節點的區別:node節點比較具有動態性,添加、刪除
Node:工作節點
Kubelet
Kubelet:負責監聽節點上Pod的狀態,同時負責上報節點和節點上面Pod的狀態,負責與Master節點通信,並管理節點上面的Pod。
Kube-proxy
Kube-proxy:負責Pod之間的通信和負載均衡,將指定的流量分發到后端正確的機器上。
查看Kube-proxy工作模式
[root@k8s-master01 dockerfiles]# netstat -lntp |grep kube-proxy
tcp 0 0 0.0.0.0:30372 0.0.0.0:* LISTEN 1064/kube-proxy
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 1064/kube-proxy
tcp6 0 0 :::10256 :::* LISTEN 1064/kube-proxy
[root@k8s-master01 dockerfiles]# curl 127.0.0.1:10249/proxyMode
ipvs[root@k8s-master01 dockerfiles]#
Ipvs
監聽Master節點增加和刪除service以及endpoint的消息,調用Netlink接口創建相應的IPVS規則。通過IPVS規則,將流量轉發至相應的Pod上。
Ipvs映射規則
# 查看配置規則,主機訪問30372端口就可以訪問到172.25.244.214
[root@k8s-master01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.0.1:30372 rr
-> 172.25.244.214:8443 Masq 1 0 0
# kubernetes-dashboard通過端口30372(kube-proxy)映射出去
[root@k8s-master01 dockerfiles]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.109.161.186 <none> 8000/TCP 6d22h
kubernetes-dashboard NodePort 10.96.188.229 <none> 443:30372/TCP 6d22h
# 172.25.244.214正好時pod的ip地址
[root@k8s-master01 ~]# kubectl get po -n kubernetes-dashboard -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dashboard-metrics-scraper-856586f554-ssjhm 1/1 Running 0 7d20h 172.18.195.8 k8s-master03 <none> <none>
kubernetes-dashboard-67484c44f6-brz2z 1/1 Running 2 (3m56s ago) 7d20h 172.25.244.214 k8s-master01 <none> <none>
主機訪問node節點30372端口,通過ipvs規則,反向代理到kubernetes-dashboard上面的ip地址172.25.244.214的8443端口,所以就能訪問到dashboard
Iptables
監聽Master節點增加和刪除service以及endpoint的消息,對於每一個Service,他都會創建一個iptables規則,將service的clusterIP代理到后端對應的Pod。
不推薦使用Iptables的原因是:當我們的規則特別多的時候,它的性能就會急劇下降
其他組件
Calico:符合CNI標准的網絡插件,給每個Pod生成一個唯一的IP地址,並且把每個節點當做一個路由器。Cilium,eBPF
CoreDNS:用於Kubernetes集群內部Service的解析,可以讓Pod把Service名稱解析成IP地址,然后通過Service的IP地址進行連接到對應的應用上。
Docker:容器引擎,負責對容器的管理。
什么是Pod?
Pod是Kubernetes中最小的單元,它由一組、一個或多個容器組成,每個Pod還包含了一個Pause容器,Pause容器是Pod的父容器,主要負責僵屍進程的回收管理,通過Pause容器可以使同一個Pod里面的多個容器共享存儲、網絡、PID、IPC等。
查看系統pod
[root@k8s-master01 ~]# kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
metrics-server-64c6c494dc-lhkl2 1/1 Running 1 (82m ago) 87m
Pause容器
[root@k8s-master01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b30c03e6e0ff 9759a41ccdf0 "/metrics-server --c…" About an hour ago Up About an hour k8s_metrics-server_metrics-server-64c6c494dc-lhkl2_kube-system_517b9ab1-a323-4530-8be4-ebd3a7d41de4_1
f45e50c4009e registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2 "/pause" About an hour ago Up About an hour k8s_POD_metrics-server-64c6c494dc-lhkl2_kube-system_517b9ab1-a323-4530-8be4-ebd3a7d41de4_1
為什么要引入Pod?
因為一個應用不可能單個容器就能支撐的,需要很多微服務支撐,可能出現一種情況就是兩個服務,A服務和B服務之間需要網絡互通,延遲非常小,而且兩個服務有數據的依賴性,服務B需要用到服務A產生的文件,如果直接用k8s裸機的話,服務A和服務B不一定會在同一台宿主機上,當副本數非常大的時候,很難保證兩個文件可以共享一個目錄
每個pod有一個唯一的ip地址,便於管理
從k8s的角度看,它作為一個非常流行的編排工具,需要兼容很多的容器技術,所以通過pod管理不同的符合該標准的容器,而沒有直接操作容器
其他容器技術:https://kubernetes.io/docs/setup/production-environment/container-runtimes/
創建一個Pod
[root@k8s-master01 ~]# vim pod.yaml
:set paste
# 添加以下內容
apiVersion: v1 # 必選,API的版本號
kind: Pod # 必選,類型Pod
metadata: # 必選,元數據
name: nginx # 必選,符合RFC 1035規范的Pod名稱
# namespace: default # 可選,Pod所在的命名空間,不指定默認為default,可以使用-n 指定namespace
labels: # 可選,標簽選擇器,一般用於過濾和區分Pod
app: nginx
role: frontend # 可以寫多個
annotations: # 可選,注釋列表,可以寫多個
app: nginx
spec: # 必選,用於定義容器的詳細信息
# initContainers: # 初始化容器,在容器啟動之前執行的一些初始化操作
# - command:
# - sh
# - -c
# - echo "I am InitContainer for init some configuration"
# image: busybox
# imagePullPolicy: IfNotPresent
# name: init-container
containers: # 必選,容器列表
- name: nginx # 必選,符合RFC 1035規范的容器名稱
image: nginx:latest # 必選,容器所用的鏡像的地址
imagePullPolicy: IfNotPresent # 可選,鏡像拉取策略,IfNotPresent:如果宿主機又這個鏡像,那就不需要拉取,Always:總是拉取,Never:不管是否存儲都不拉取
command: # 可選,容器啟動執行的命令 ENTRYPOINT,arg --> cmd
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可選,容器的工作目錄
# volumeMounts: # 可選,存儲卷配置,可以配置多個
# - name: webroot # 存儲卷名稱
# mountPath: /usr/share/nginx/html # 掛載目錄
# readOnly: true # 只讀
ports: # 可選,容器需要暴露的端口號列表
- name: http # 端口名稱
containerPort: 80 # 端口號
protocol: TCP # 端口協議,默認TCP
env: # 可選,環境變量配置列表
- name: TZ # 變量名
value: Asia/Shanghai # 變量的值
- name: LANG
value: en_US.utf8
# resources: # 可選,資源限制和資源請求限制
# limits: # 最大限制設置
# cpu: 1000m
# memory: 1024Mi
# requests: # 啟動所需的資源
# cpu: 100m
# memory: 512Mi
# startupProbe: # 可選,檢測容器內進程是否完成啟動。注意三種檢查方式同時只能使用一種。
# httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現接口級健康檢查,健康檢查由應用程序提供。
# path: /api/successStart # 檢查路徑
# port: 80
# readinessProbe: # 可選,健康檢查。注意三種檢查方式同時只能使用一種。
# httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現接口級健康檢查,健康檢查由應用程序提供。
# path: / # 檢查路徑
# port: 80 # 監控端口
# livenessProbe: # 可選,健康檢查
#exec: # 執行容器命令檢測方式
#command:
#- cat
#- /health
#httpGet: # httpGet檢測方式
# path: /_health # 檢查路徑
# port: 8080
# httpHeaders: # 檢查的請求頭
# - name: end-user
# value: Jason
# tcpSocket: # 端口檢測方式
# port: 80
# initialDelaySeconds: 60 # 初始化時間
# timeoutSeconds: 2 # 超時時間
# periodSeconds: 5 # 檢測間隔
# successThreshold: 1 # 檢查成功為2次表示就緒
# failureThreshold: 2 # 檢測失敗1次表示未就緒
# lifecycle:
# postStart: # 容器創建完成后執行的指令, 可以是exec httpGet TCPSocket
# exec:
# command:
# - sh
# - -c
# - 'mkdir /data/ '
# preStop:
# httpGet:
# path: /
# port: 80
# exec:
# command:
# - sh
# - -c
# - sleep 9
restartPolicy: Always # 可選,默認為Always,容器故障或者沒有啟動成功,那就自動重啟該容器,Onfailure:容器以不為0的狀態終止,Never:無論何種狀態,都不會重啟
#nodeSelector: # 可選,指定Node節點
# region: subnet7
# imagePullSecrets: # 可選,拉取鏡像使用的secret,可以配置多個
# - name: default-dockercfg-86258
# hostNetwork: false # 可選,是否為主機模式,如是,會占用主機端口
# volumes: # 共享存儲卷列表
# - name: webroot # 名稱,與上述對應
# emptyDir: {} # 掛載目錄
#hostPath: # 掛載本機目錄
# path: /etc/hosts
創建pod
[root@k8s-master01 ~]# kubectl create -f pod.yaml
pod/nginx created
查看pod
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 3m51s
查看labels
[root@k8s-master01 ~]# kubectl get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 3m57s app=nginx,role=frontend
label與yaml文件中的配置一致
labels: # 可選,標簽選擇器,一般用於過濾和區分Pod
app: nginx
role: frontend # 可以寫多個
刪除pod
[root@k8s-master01 ~]# kubectl delete po nginx
pod "nginx" deleted
查看pod
[root@k8s-master01 ~]# kubectl get po
No resources found in default namespace.
刪除之后就找不到pod了,所以生產環境中一般不會直接使用,很難保證業務正常運行,一般使用高級資源deployment,daemonset,StatefulSets
零宕機發布應用必備知識:Pod三種探針
- Pod探針
- Pod探針的檢測方式
Pod探針
- StartupProbe
- LivenessProbe
- ReadinessProbe
StartupProbe
StartupProbe:k8s1.16版本后新加的探測方式,用於判斷容器內應用程序是否已經啟動。如果配置了startupProbe,就會先禁止其他的探測,直到它成功為止,成功后將不在進行探測。
# startupProbe: # 可選,檢測容器內進程是否完成啟動。注意三種檢查方式同時只能使用一種。
# httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現接口級健康檢查,健康檢查由應用程序提供。
# path: /api/successStart # 檢查路徑
# port: 80
LivenessProbe
LivenessProbe:用於探測容器是否運行,如果探測失敗,kubelet會根據配置的重啟策略進行相應的處理。若沒有配置該探針,默認就是success。
# livenessProbe: # 可選,健康檢查
#exec: # 執行容器命令檢測方式
#command:
#- cat
#- /health
ReadinessProbe
ReadinessProbe:一般用於探測容器內的程序是否健康,它的返回值如果為success,那么久代表這個容器已經完成啟動,並且程序已經是可以接受流量的狀態。
# readinessProbe: # 可選,健康檢查。注意三種檢查方式同時只能使用一種。
# httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現接口級健康檢查,健康檢查由應用程序提供。
# path: / # 檢查路徑
# port: 80 # 監控端口
Pod探針的檢測方式
- ExecAction
- TCPSocketAction
- HTTPGetAction
ExecAction
ExecAction:在容器內執行一個命令,如果返回值為0,則認為容器健康。
# livenessProbe: # 可選,健康檢查
#exec: # 執行容器命令檢測方式
#command:
#- cat
#- /health
TCPSocketAction
TCPSocketAction:通過TCP連接檢查容器內的端口是否是通的,如果是通的就認為容器健康。
HTTPGetAction
HTTPGetAction:通過應用程序暴露的API地址來檢查程序是否是正常的,如果狀態碼為200~400之間,則認為容器健康。
生產環境推薦使用HTTPGetAction
零宕機必備知識:StartupProbe
查看coredns的deployment文件
[root@k8s-master01 ~]# kubectl edit deployment coredns -n kube-system
查找livenessProbe
livenessProbe:
failureThreshold: 5
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
它請求了8080端口的/health,如果檢測成功,則容器不會被重啟
查找readinessProbe
readinessProbe:
failureThreshold: 3
httpGet:
path: /ready
port: 8181
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
它請求了8181端口的/ready,如果檢測成功,則可以加上endpoint,開始接受流量,開始工作
探針檢查參數配置
# initialDelaySeconds: 60 # 初始化時間
# timeoutSeconds: 2 # 超時時間
# periodSeconds: 5 # 檢測間隔
# successThreshold: 1 # 檢查成功為1次表示就緒
# failureThreshold: 2 # 檢測失敗2次表示未就緒
為什么要引入StartupProbe?
如果容器啟動特別慢,單獨配置一個StartupProbe,它會先禁用另外兩個探針,直到程序啟動完成,再檢測它的狀態
編輯pod.yaml,取消注釋
[root@k8s-master01 ~]# vim pod.yaml
startupProbe: # 可選,檢測容器內進程是否完成啟動。注意三種檢查方式同時只能使用一種。
httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現接口級健康檢查,健康檢查由應用程序提供。
path: /api/successStart # 檢查路徑
port: 80
啟動容器
修改pod.yaml
# httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現接口級健康檢查,健康檢查由應用程序提供。
# path: /api/successStart # 檢查路徑
# port: 80
tcpSocket:
port: 80
構建容器
[root@k8s-master01 ~]# kubectl create -f pod.yaml
pod/nginx created
獲取IP
[root@k8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 2m31s 172.25.244.217 k8s-master01 <none> <none>
訪問nginx
[root@k8s-master01 ~]# curl 172.25.244.217
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
零宕機必備知識:Liveness和Readiness
編輯pod.yaml
[root@k8s-master01 ~]# vim pod.yaml
# 修改內容如下
env: # 可選,環境變量配置列表
- name: TZ # 變量名
value: Asia/Shanghai # 變量的值
- name: LANG
value: en_US.utf8
readinessProbe: # 可選,健康檢查。注意三種檢查方式同時只能使用一種。
httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現接口級健康檢查,健康檢查由應用程序提供。
path: / # 檢查路徑
port: 80 # 監控端口
livenessProbe: # 可選,健康檢查
exec: # 執行容器命令檢測方式
command:
- pgrep nginx
initialDelaySeconds: 3 # 初始化時間
timeoutSeconds: 2 # 超時時間
periodSeconds: 2 # 檢測間隔
successThreshold: 1 # 檢查成功為2次表示就緒
failureThreshold: 1 # 檢測失敗1次表示未就緒
創建pod
[root@k8s-master01 ~]# kubectl delete po nginx
pod "nginx" deleted
[root@k8s-master01 ~]# kubectl create -f pod.yaml
pod/nginx created
查看pod
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 4s
[root@k8s-master01 ~]# kubectl describe po nginx
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 10s default-scheduler Successfully assigned default/nginx to k8s-master01
Warning Unhealthy 2s (x2 over 6s) kubelet Liveness probe failed: OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "pgrep nginx": executable file not found in $PATH: unknown
Normal Pulled 1s (x3 over 9s) kubelet Container image "nginx:latest" already present on machine
Normal Created 1s (x3 over 9s) kubelet Created container nginx
Normal Started 1s (x3 over 9s) kubelet Started container nginx
Normal Killing 1s (x2 over 5s) kubelet Container nginx failed liveness probe, will be restarted
可以看到如果exec的命令不存在會報錯Liveness probe failed
修改exec命令為ls
exec: # 執行容器命令檢測方式
command:
- ls
重新創建
[root@k8s-master01 ~]# kubectl delete po nginx
pod "nginx" deleted
[root@k8s-master01 ~]# kubectl create -f pod.yaml
pod/nginx created
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 4s
[root@k8s-master01 ~]# kubectl describe po nginx
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 8s default-scheduler Successfully assigned default/nginx to k8s-master01
Normal Pulled 7s kubelet Container image "nginx:latest" already present on machine
Normal Created 7s kubelet Created container nginx
Normal Started 7s kubelet Started container nginx
可以看到健康檢查通過
Liveness和Readiness推薦使用接口級健康檢查,參考 coredns
[root@k8s-master01 ~]# kubectl edit deploy coredns -n kube-system
/live 回車
livenessProbe:
failureThreshold: 5
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
/read 回車
readinessProbe:
failureThreshold: 3
httpGet:
path: /ready
port: 8181
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
可以看到 coredns 的 livenessProbe 請求了一個 /health 的接口,readinessProbe 請求了一個 /ready 的接口
零宕機必備知識:Pod退出流程
用戶執行刪除操作:kubectl delete po nginx
- 執行PreStop的指令
- Endpoint刪除該Pod的IP地址
- Pod變成Terminating
Pod變成Terminating之后有一個寬限期,讓我們做一些清理的動作,或者后置的動作
[root@k8s-master01 ~]# kubectl edit deploy coredns -n kube-system
/terminationGracePeriodSeconds 回車
terminationGracePeriodSeconds: 30
零宕機必備知識:PreStop的使用
Prestop:先去請求eureka接口,把自己的IP地址和端口號,進行下線,eureka從注冊表中刪除該應用的IP地址。然后容器進行sleep 90;kill pgrep java
如果sleep時間過長,需要修改terminationGracePeriodSeconds
[root@k8s-master01 ~]# vim pod.yaml
# 修改以下內容
# readinessProbe: # 可選,健康檢查。注意三種檢查方式同時只能使用一種。
# httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現接口級健康檢查,健康檢查由應用程序提供。
# path: / # 檢查路徑
# port: 80 # 監控端口
# livenessProbe: # 可選,健康檢查
# exec: # 執行容器命令檢測方式
# command:
# - ls
# initialDelaySeconds: 3 # 初始化時間
# timeoutSeconds: 2 # 超時時間
# periodSeconds: 2 # 檢測間隔
# successThreshold: 1 # 檢查成功為2次表示就緒
# failureThreshold: 1 # 檢測失敗1次表示未就緒
lifecycle:
# postStart: # 容器創建完成后執行的指令, 可以是exec httpGet TCPSocket
# exec:
# command:
# - sh
# - -c
# - 'mkdir /data/ '
preStop:
# httpGet:
# path: /
# port: 80
exec:
command:
- sh
- -c
- sleep 90
創建pod
[root@k8s-master01 ~]# kubectl delete po nginx
pod "nginx" deleted
[root@k8s-master01 ~]# kubectl create -f pod.yaml
pod/nginx created
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 28s
查看pod退出時間
[root@k8s-master01 ~]# time kubectl delete po nginx
pod "nginx" deleted
real 0m40.249s
user 0m0.038s
sys 0m0.019s
可以看到只執行了40s,並沒有sleep 90s,所以我們需要配置terminationGracePeriodSeconds
設置 terminationGracePeriodSeconds
[root@k8s-master01 ~]# vim pod.yaml
# 修改以下內容
terminationGracePeriodSeconds: 50
containers: # 必選,容器列表
創建pod
[root@k8s-master01 ~]# kubectl create -f pod.yaml
pod/nginx created
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 28s
查看pod退出時間
[root@k8s-master01 ~]# time kubectl delete po nginx
pod "nginx" deleted
real 0m51.427s
user 0m0.031s
sys 0m0.017s
可以看到退出時間延長了,但是也沒有真正的執行sleep 90s,所以配置的時候需要注意一下,因為k8s並不知道你執行了什么操作,無法判斷PreStop的執行時間,所以會強制性的刪除
課程鏈接
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。
歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含鏈接: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改后的作品務必以相同的許可發布。