1. 程式人生 > 其它 >Kuberneters 最小工作單元 Pod 詳解

Kuberneters 最小工作單元 Pod 詳解

十年河東,十年河西,莫欺少年窮

學無止境,精益求精

  • 每個Pod中都包含一個或者多個容器,這些容器可以分為兩類:
  • ① 使用者程式所在的容器,數量可多可少。
  • ② Pause容器,這是每個Pod都會有的一個根容器,它的作用有兩個:
    • 可以以它為依據,評估整個Pod的健康狀況。
    • 可以在根容器上設定IP地址,其它容器都共享此IP(Pod的IP),以實現Pod內部的網路通訊(這裡是Pod內部的通訊,Pod之間的通訊採用虛擬二層網路技術來實現,我們當前環境使用的是Flannel)。

1、Pod的資源清單

apiVersion: v1     #必選,版本號,例如v1
kind: Pod         #必選,資源型別,例如 Pod
metadata:         #必選,元資料
  name: 
string #必選,Pod名稱 namespace: string #Pod所屬的名稱空間,預設為"default" labels:    #自定義標籤列表 - name: string   spec: #必選,Pod中容器的詳細定義 containers: #必選,Pod中容器列表 - name: string #必選,容器名稱 image: string #必選,容器的映象名稱 imagePullPolicy: [ Always|Never|IfNotPresent ] #獲取映象的策略 command: [
string] #容器的啟動命令列表,如不指定,使用打包時使用的啟動命令 args: [string] #容器的啟動命令引數列表 workingDir: string #容器的工作目錄 volumeMounts: #掛載到容器內部的儲存卷配置 - name: string #引用pod定義的共享儲存卷的名稱,需用volumes[]部分定義的的卷名 mountPath: string #儲存卷在容器內mount的絕對路徑,應少於512字元 readOnly: boolean #是否為只讀模式 ports: #需要暴露的埠庫號列表
- name: string #埠的名稱 containerPort: int #容器需要監聽的埠號 hostPort: int #容器所在主機需要監聽的埠號,預設與Container相同 protocol: string #埠協議,支援TCP和UDP,預設TCP env: #容器執行前需設定的環境變數列表 - name: string #環境變數名稱 value: string #環境變數的值 resources: #資源限制和請求的設定 limits: #資源限制的設定 cpu: string #Cpu的限制,單位為core數,將用於docker run --cpu-shares引數 memory: string #記憶體限制,單位可以為Mib/Gib,將用於docker run --memory引數 requests: #資源請求的設定 cpu: string #Cpu請求,容器啟動的初始可用數量 memory: string #記憶體請求,容器啟動的初始可用數量 lifecycle: #生命週期鉤子 postStart: #容器啟動後立即執行此鉤子,如果執行失敗,會根據重啟策略進行重啟 preStop: #容器終止前執行此鉤子,無論結果如何,容器都會終止 livenessProbe: #對Pod內各容器健康檢查的設定,當探測無響應幾次後將自動重啟該容器 exec:   #對Pod容器內檢查方式設定為exec方式 command: [string] #exec方式需要制定的命令或指令碼 httpGet: #對Pod內個容器健康檢查方法設定為HttpGet,需要制定Path、port path: string port: number host: string scheme: string HttpHeaders: - name: string value: string tcpSocket: #對Pod內個容器健康檢查方式設定為tcpSocket方式 port: number initialDelaySeconds: 0 #容器啟動完成後首次探測的時間,單位為秒 timeoutSeconds: 0    #對容器健康檢查探測等待響應的超時時間,單位秒,預設1秒 periodSeconds: 0    #對容器監控檢查的定期探測時間設定,單位秒,預設10秒一次 successThreshold: 0 failureThreshold: 0 securityContext: privileged: false restartPolicy: [Always | Never | OnFailure] #Pod的重啟策略 nodeName: <string> #設定NodeName表示將該Pod排程到指定到名稱的node節點上 nodeSelector: obeject #設定NodeSelector表示將該Pod排程到包含這個label的node上 imagePullSecrets: #Pull映象時使用的secret名稱,以key:secretkey格式指定 - name: string hostNetwork: false #是否使用主機網路模式,預設為false,如果設定為true,表示使用宿主機網路 volumes: #在該pod上定義共享儲存卷列表 - name: string #共享儲存卷名稱 (volumes型別有很多種) emptyDir: {} #型別為emtyDir的儲存卷,與Pod同生命週期的一個臨時目錄。為空值 hostPath: string #型別為hostPath的儲存卷,表示掛載Pod所在宿主機的目錄 path: string    #Pod所在宿主機的目錄,將被用於同期中mount的目錄 secret:    #型別為secret的儲存卷,掛載叢集與定義的secret物件到容器內部 scretname: string items: - key: string path: string configMap: #型別為configMap的儲存卷,掛載預定義的configMap物件到容器內部 name: string items: - key: string path: string
View Code

 看到這個資源清單,是不是有點懵逼,內容過多,不好記憶?

其實不需要記住,只需要會查詢怎麼配即可,那麼如何查詢呢?

查詢資源如何配置,使用 explain 指令

kubectl explain pod

輸出結果

[root@master ~]# kubectl explain pod
KIND:     Pod
VERSION:  v1

DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.

FIELDS:
   apiVersion    <string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

   kind    <string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

   metadata    <Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

   spec    <Object>
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

   status    <Object>
     Most recently observed status of the pod. This data may not be up to date.
     Populated by the system. Read-only. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
View Code

從輸出結果中,得到如下資訊

pod 的一級配置項有:

KIND: Pod  --固定值
apiVersion: v1  --固定值
metadata: object   --物件
spec: object   --物件

查Pod的子配置項

kubectl explain pod.apiVersion
kubectl explain pod.kind
kubectl explain pod.metadata
kubectl explain pod.metadata.name
kubectl explain pod.metadata.namespace
kubectl explain pod.metadata.labels
kubectl explain pod.metadata.labels.name
kubectl explain pod.spec
kubectl explain pod.spec.containers

--等等,按照層次進行查詢即可

Pod 的容器 

apiVersion: v1
kind: Pod
metadata:
  name: pod-base
  namespace: dev
  labels:
    user: xudaxian
spec:
  containers:
    - name: nginx # 容器名稱
      image: nginx:1.17.1 # 容器需要的映象地址
    - name: busybox # 容器名稱
      image: busybox:1.30 # 容器需要的映象地址
  • 上面定義了一個比較簡單的Pod的配置,裡面有兩個容器:
    • nginx:用的是1.17.1版本的nginx映象建立(nginx是一個輕量級的web容器)。
    • busybox:用的是1.30版本的busybox映象建立(busybox是一個小巧的linux命令集
kubectl apply -f pod-base.yaml

這樣就建立一個Pod,裡面執行兩個容器,一個名稱為 nginx,一個名稱為busybox

docker 映象拉取策略 imagePullPolicy

  • imagePullPolicy:用於設定映象拉取的策略,kubernetes支援配置三種拉取策略:
    • Always:總是從遠端倉庫拉取映象(一直遠端下載)。
    • IfNotPresent:本地有則使用本地映象,本地沒有則從遠端倉庫拉取映象(本地有就用本地,本地沒有就使用遠端下載)。
    • Never:只使用本地映象,從不去遠端倉庫拉取,本地沒有就報錯

預設值說明:

  • 如果映象tag為具體的版本號,預設策略是IfNotPresent。
  • 如果映象tag為latest(最終版本),預設策略是Al

Pod內部容器啟動命令

在前面的案例中,一直有一個問題沒有解決,就是busybox容器一直沒有成功執行,那麼是什麼原因導致這個容器的故障呢?

原來程式自己有一個工具箱,而是像一個執行的工具一樣,管理 kubernet 類。 解決後,它的類會自動啟動它。

建立pod-command.yaml檔案,內容如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-command
  namespace: dev
  labels:
    user: xudaxian
spec:
  containers:
    - name: nginx # 容器名稱
      image: nginx:1.17.1 # 容器需要的映象地址
      imagePullPolicy: IfNotPresent # 設定映象拉取策略
    - name: busybox # 容器名稱
      image: busybox:1.30 # 容器需要的映象地址
      command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo $(date +%T) >> /tmp/hello.txt;sleep 3;done;"]
  • 進入Pod中的busybox容器,檢視檔案內容:
# 在容器中執行命令
# kubectl exec -it pod的名稱 -n 名稱空間 -c 容器名稱 /bin/sh
kubectl exec -it pod-command -n dev -c busybox /bin/sh

Pod 中容器的埠設定【不建議使用】,一旦設定,因埠衝突,Pod控制器中只能執行一個Pod

如上圖,pod控制器中執行兩個Pod,但因為容器都需要對外對映埠,這樣就導致衝突

檢視埠子選項

kubectl explain pod.spec.containers.ports

建立一個設定port 的yaml檔案

apiVersion: v1
kind: Pod
metadata:
  name: pod-ports
  namespace: dev
  labels:
    user: xudaxian
spec:
  containers:
    - name: nginx # 容器名稱
      image: nginx:1.17.1 # 容器需要的映象地址
      imagePullPolicy: IfNotPresent # 設定映象拉取策略
      ports:
        - name: nginx-port # 埠名稱,如果執行,必須保證name在Pod中是唯一的
          containerPort: 80 # 容器要監聽的埠 (0~65536)
          protocol: TCP # 埠協議

執行

kubectl create -f pod-ports.yaml

Pod 的資源佔比配置

  • 容器中的程式要執行,肯定會佔用一定的資源,比如CPU和記憶體等,如果不對某個容器的資源做限制,那麼它就可能吃掉大量的資源,導致其他的容器無法執行。針對這種情況,kubernetes提供了對記憶體和CPU的資源進行配額的機制,這種機制主要通過resources選項實現,它有兩個子選項:
    • limits:用於限制執行的容器的最大佔用資源,當容器佔用資源超過limits時會被終止,並進行重啟。
    • requests:用於設定容器需要的最小資源,如果環境資源不夠,容器將無法啟動。
  • 可以通過上面的兩個選項設定資源的上下限
  • 建立pod-resoures.yaml檔案,內容如下:
apiVersion: v1
kind: Pod
metadata:
  name: pod-resoures
  namespace: dev
  labels:
    user: xudaxian
spec:
  containers:
    - name: nginx # 容器名稱
      image: nginx:1.17.1 # 容器需要的映象地址
      imagePullPolicy: IfNotPresent # 設定映象拉取策略
      ports: # 埠設定
        - name: nginx-port # 埠名稱,如果執行,必須保證name在Pod中是唯一的
          containerPort: 80 # 容器要監聽的埠 (0~65536)
          protocol: TCP # 埠協議
      resources: # 資源配額
        limits: # 限制資源的上限
          cpu: "2" # CPU限制,單位是core數
          memory: "10Gi" # 記憶體限制
        requests: # 限制資源的下限
          cpu: "1" # CPU限制,單位是core數 
          memory: "10Mi" # 記憶體限制
View Code

說明

cpu:core數,可以為整數或小數。

memory:記憶體大小,可以使用Gi、Mi、G、M等形式。

@天才臥龍的部落格

kubectl explain pod.spec.containers.ports