Kuberneters 最小工作單元 Pod 詳解
阿新 • • 發佈:2022-05-27
十年河東,十年河西,莫欺少年窮
學無止境,精益求精
- 每個Pod中都包含一個或者多個容器,這些容器可以分為兩類:
- ① 使用者程式所在的容器,數量可多可少。
- ② Pause容器,這是每個Pod都會有的一個根容器,它的作用有兩個:
- 可以以它為依據,評估整個Pod的健康狀況。
- 可以在根容器上設定IP地址,其它容器都共享此IP(Pod的IP),以實現Pod內部的網路通訊(這裡是Pod內部的通訊,Pod之間的通訊採用虛擬二層網路技術來實現,我們當前環境使用的是Flannel)。
1、Pod的資源清單
apiVersion: v1 #必選,版本號,例如v1 kind: Pod #必選,資源型別,例如 Pod metadata: #必選,元資料 name:View Codestring #必選,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
看到這個資源清單,是不是有點懵逼,內容過多,不好記憶?
其實不需要記住,只需要會查詢怎麼配即可,那麼如何查詢呢?
查詢資源如何配置,使用 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-statusView 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