Kubernetes全棧架構師(基本概念)--學習筆記

目錄

  • 爲何要用Kubernetes?
  • K8s控制節點-Master概念
  • K8s計算節點-Node概念
  • 什麼是Pod?
  • 爲何要引入Pod?
  • 建立一個Pod
  • 零宕機發布應用必備知識:Pod三種探針
  • 零宕機必備知識:StartupProbe
  • 零宕機必備知識:Liveness和Readiness
  • 零宕機必備知識:Pod退出流程
  • 零宕機必備知識:PreStop的使用

爲何要用Kubernetes?

  • 容器管理
  • 自動恢復
  • 健康檢查
  • 彈性擴容
  • 內部通信
  • 高可用

K8s控制節點-Master概念

Kubernetes是谷歌以Borg爲前身,基於谷歌15年生產環境經驗的基礎上開源的一個項目,Kubernetes致力於提供跨主機集羣的自動部署、擴展、高可用以及運行應用程序容器的平臺。html

k8s高可用架構解析

001

k8s節點通常分爲master節點和node節點,master節點通常三個足以,三個master節點承載成百上千node節點徹底沒有問題,node節點能夠橫向擴容java

node節點用於部署應用程序,master節點不容許部署應用程序,它只負責控制,調度工做node

Master節點:整個集羣的控制中樞

Kube-APIServer

集羣的控制中樞,各個模塊之間信息交互都須要通過Kube-APIServer,同時它也是集羣管理、資源配置、整個集羣安全機制的入口。linux

Controller-Manager

集羣的狀態管理器,保證Pod或其餘資源達到指望值,也是須要和APIServer進行通訊,在須要的時候建立、更新或刪除它所管理的資源。nginx

Scheduler

集羣的調度中心,它會根據指定的一系列條件,選擇一個或一批最佳的節點,而後部署咱們的Pod。web

Etcd

鍵值數據庫,報錯一些集羣的信息,通常生產環境中建議部署三個以上節點(奇數個)。docker

注意

master節點在安裝完成以後,可能在很長一段時間都不會有任何的變化,因此在進行架設計的時候,要給足master節點資源,由於每次修改master節點是一件特別複雜的事情數據庫

咱們在master節點綁定證書,每一個證書綁定在master節點的ip地址或者主機名,若是咱們在以前生成證書的時候沒有預留的話,那咱們可能就須要從新生成一份證書,再把以前的證書都替換掉,並且還要替換node節點上面的證書,過程很是麻煩,因此一開始要給足資源,好比一次性給三臺16核64Gvim

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/ ),不得用於商業目的,基於本文修改後的做品務必以相同的許可發佈。

相關文章
相關標籤/搜索