首頁 > 軟體

kubernetes k8s入門定義一個Pod

2022-03-18 19:00:02

什麼是Pod?

pod是kubernetes中最小的單元,由一組、一個或多個容器組成,每個pod中包含了一個pause容器。

pause容器是pod的父容器,主要負責殭屍程序的回收管理,通過pause容器可以使同一個pod中多個容器共用儲存、網路、PID、IPC等,同一個Pod中多容器間存取僅通過localhost就可以通訊。

為什麼要引入Pod?

將有強依賴性的容器放在同一個Pod裡,例如要求低延遲性,容器A與容器B之間檔案上的聯絡等,引入Pod的概念是可以提高效能、便於管理。
從k8s角度說,docker是容器,但是容器卻不只是docker,引入pod可以使容器間工作更協調。

定義一個Pod:pod.yaml

下面這個yaml檔案可能複製有問題,你也可以使用下面命令生成一個yaml檔案作為模板進行修改:

kubectl create deployment nginx --image=nginx -o yaml --dry-run=client >nginx.yaml
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:1.15.2    # 必選,容器所用的映象的地址
    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

apiserver:定義API的版本號

kind:建立資源型別,如pod、deployment等

metadata:後設資料,如pod的一些基本資訊

spec:用於定義容器的詳細資訊

執行yaml檔案建立Pod:

kubectl create -f pod.yaml

完成後檢視Pod:

kubectl get pod

注意:生產中基本不會直接使用pod進行部署,但是yaml檔案大同小異。需要熟悉yaml檔案的格式和設定項。

Pod探針:

StartupProbe:1.16版本後增加的探針方式,用於判斷容器內應用程式是否已經啟動,如果設定了StartupProbe,就會先禁止其他探測,直到成功,成功後將不在程序探測。

LivenessProbe:用於探測容器是否執行,如果探測失敗,kubelet會根據設定的重啟策略進行相應的處理。若沒有設定該探針,預設就是success。

ReadinessProbe:一般用於探測容器內的程式是否健康,它的返回值如果為success,那麼代表這個容器已經啟動成功,並且程式已經是可以接受流量的狀態。

Pod探針檢測方式:

以上探針均可設定以下方式:

ExecAction:在容器內執行一個命令,如果返回值為0,則認為容器健康(類似於執行一個命令後,執行echo $?返回值為0代表成功是一樣的)

livenessProbe:
  exec:
    command:
    - cat
    - /tmp/health

TCPSocketAction:通過TCP連線檢查容器內的埠是否通的,如果是通的則認為容器健康(類似於telnet 127.0.0.1 3306,執行成功的話判斷為容器健康)

livenessProbe:
  tcpSocket:
    port: 80

HTTPGetAction:通過應用程式暴露的API地址來檢查程式是否正常,如果狀態碼為200~400之間,則認為容器健康。(生產使用最多)

livenessProbe:
  httpGet:
    path: /status/health
    port: 80

探針檢查的幾個引數:

initialDelaySeconds:初始化時間(比如程式啟動慢,我要多少秒後才會檢查)

timeoutSeconds:超時時間(1-2秒)

periodSeconds:檢測間隔,多長時間檢測一次(5秒)

successThreshold:檢測成功次數,比如檢測成功幾次代表就緒(1-2次)

failureThreshold:檢測失敗次數,比如檢測失敗幾次代表未就緒(2次)

重啟策略:timeoutSecondsperiodSecondsfailureThreshold

我們可以看以下coredns的探針設定:

# 檢視pod名稱
[root@k8s-master01 ~]# kubectl get deployment -n kube-system
coredns                   1/1     1            1           5d18h

# 線上編譯coredns的yaml檔案
[root@k8s-master01 ~]# kubectl edit deployment coredns -n kube-system
        livenessProbe:
          failureThreshold: 5
          httpGet:
            path: /health
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 60           
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 5        
# 上面代表請求8080的/health介面,如果存取成功則保留容器不會被殺死
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /ready
            port: 8181
            scheme: HTTP
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1         
# 上面設定代表請求8181的/ready介面成功,說明容器可以正常開始工作了

Pod退出流程

Prestop:先去請求eureka介面,把自己的IP地址和埠號,進行下線,eureka從登入檔中該應用的IP地址。然後容器進行sleep 90,kill ‘程序’;(注意90不是確定值,而是根據實際情況進行變化的)

以上就是kubernetes k8s入門定義一個Pod的詳細內容,更多關於k8s入門定義Pod的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com