目錄

  • 為什麼要用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的執行時間,所以會強制性的刪除

課程連結

http://www.kubeasy.com/

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。

歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。