Pod介紹


一、什么是Pod

	Pod是Kubernetes中最小的單元,它由一組、一個或多個容器組成,每個Pod還包含了一個Pause容器,Pause容器是Pod的父容器,主要負責僵屍進程的回收管理,通過Pause容器可以使同一個Pod里面的多個容器共享存儲、網絡、PID、IPC等。

二、如何定義一個Pod

2.1、一份比較完整的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:latest    	    # 必選,容器所用的鏡像的地址
    imagePullPolicy: Always     # 可選,鏡像拉取策略
    command: # 可選,容器啟動執行的命令
    - 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
  #nodeSelector: # 可選,指定Node節點
  #      region: subnet7
  imagePullSecrets:     # 可選,拉取鏡像使用的secret,可以配置多個
  - name: default-dockercfg-86258
  hostNetwork: false    # 可選,是否為主機模式,如是,會占用主機端口
  volumes:      # 共享存儲卷列表
  - name: webroot # 名稱,與上述對應
    emptyDir: {}    # 掛載目錄
        #hostPath:              # 掛載本機目錄
        #  path: /etc/hosts

2.2、創建一個容器(maser01上)

[root@k8s-master01 ~]# cat > pod.yaml << EOF  
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:   # 必選,用於定義容器的詳細信息
  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       # 可選,容器的工作目錄
    ports:  # 可選,容器需要暴露的端口號列表
    - name: http    # 端口名稱
      containerPort: 80     # 端口號
      protocol: TCP # 端口協議,默認TCP
    env:    # 可選,環境變量配置列表
    - name: TZ      # 變量名
      value: Asia/Shanghai # 變量的值
    - name: LANG
      value: en_US.utf8
  restartPolicy: Always   # 可選,默認為Always,容器故障或者沒有啟動成功,那就自動該容器,Onfailure: 容器以不為0的狀態終止,自動重啟該容器, Never:
EOF

# 創建一個pod
[root@k8s-master01 ~]# kubectl create -f pod.yaml 
pod/nginx created

# 查看剛剛創建的Pod
[root@k8s-master01 ~]# kubectl  get po
NAME      READY   STATUS    RESTARTS   AGE
busybox   1/1     Running   4          17h
nginx     1/1     Running   0          5m24s

[root@k8s-master01 ~]# kubectl  get po --show-labels
NAME      READY   STATUS              RESTARTS   AGE   LABELS
busybox   1/1     Running             4          16h   <none>
nginx     0/1     Running   		  0          90s   app=nginx,role=frontend

# 刪除一個po
[root@k8s-master01 ~]# kubectl delete po nginx
pod "nginx" deleted

三、Pod探針的檢測方式

ExecAction:在容器內執行一個命令,如果返回值為0,則認為容器健康

TCPSocketAction:通過TCP連接檢查容器內的端口是否是通的,如果是通的就認為容器健康

HTTPGetAction:通過應用程序暴露的API地址來檢查程序是否是正常的,如果狀態碼為200~400之間,則認為容器健康

四、探針檢查參數配置

initialDelaySeconds: 60       # 初始化時間
timeoutSeconds: 2    		  # 超時時間
periodSeconds: 5    	      # 檢測間隔
successThreshold: 1 		  # 檢查成功為1次表示就緒
failureThreshold: 2 		  # 檢測失敗2次表示未就緒

五、Pod退出流程

Prestop:先去請求eureka接口,把自己的IP地址和端口號,進行下線,eureka從注冊表中刪除該應用的IP地址。然后容器進行sleep 90;kill `pgrep java`

# 這個時間不一定是90s


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM