首頁 > 軟體

k8s中pod使用詳解(雲原生kubernetes)

2023-01-18 14:00:13

一、前言

在之前k8s元件一篇中,我們談到了pod這個元件,瞭解到pod是k8s中資源管理的最小單位,可以說Pod是整個k8s對外提供服務的最基礎的個體,有必要對Pod做深入的學習和探究。

二、再看k8s架構圖

為了加深對k8s中pod的理解,再來回顧下k8s的完整架構

三、pod特點

結合上面這張圖,關於pod,可以總結下面幾點:

  • Pod是一組容器, 是K8S中最小的單位,,一個Pod可包含多個容器,但通常情況下每個Pod中僅執行一個容器,可以把Pod理解成豌豆莢, Pod內的每個容器就像是一顆豌豆 ;
  • Pod 的核心是執行容器,必須指定容器引擎,比如 Docker是其中一種技術 ;

四、pod分類

根據pod是否自主建立,可以分為兩種

  • 自主建立:直接建立出來的Pod,這種pod刪除後就沒有了,也不會自動重建 ;
  • 控制器建立:通過控制器建立的pod,這類Pod刪除了之後還會自動重建 ;

五、pod中的容器

從上圖可以發現,容器是執行在pod中的,也可以簡單理解為pod是容器執行的外部容器,所以一個pod理論上可以執行很多個docker容器,關於這一點,做兩點說明:

  • 每個Pod中一個容器,的模式是最常見的用法,Pod是容器的簡單封裝,K8S管理Pod而不是直接管理容器 ;
  • 一個Pod中同時執行多個需要互相共同作業的容器,它們共用資源,同一個Pod中的容器可以作為service單位 ;

六、Pod中的網路

對於k8s叢集中的某個節點來說,可能部署了多個pod,這些不同的pod之間如果也需要互相通訊怎麼辦呢?這就需要說到pod中的網路了;

  • 一個 pod 包含一組容器,一個 pod 不會跨越多個工作節點 ;
  • 每個Pod都會被分配一個唯一的IP地址,Pod中的所 有容器共用網路空間,包括IP地址和埠 ;
  • Pod內 部的容器可以使用localhost互相通訊 ;

補充:k8s中的網路通訊模型

K8S叢集的有4種網路:

        具體如下:同一pod內的容器間通訊、各pod彼此之間的通訊、pod與service間的通訊、以及叢集外部的流量同service之間的通訊

七、Pod中的儲存

  • Volume 也可以用來持久化Pod中的儲存資源,以防容器重啟後檔案丟失 ;
  • Pod中 的所有容器都可以存取共用的Volume ;

八、Pod常用操作命令

1、檢視k8s叢集中系統執行的pod

kubectl get pod -n kube-system

2、檢視創自己建立的pod

kubectl get pod
或
kubectl get pod,svc,deploy

3、刪除pod

直接刪除pod:

kubectl delete pod pod名稱 -n 名稱空間

刪除通過控制器建立的pod:

kubectl delete pod控制器名稱 -n 名稱空間

補充說明:

  • 如果是通過deploy控制器建立的pod, 直接刪除則會自動建立新的;
  • -n 非必須,表示某個具體的名稱空間;

4、啟動一個pod【命令方式啟動】

kubectl run pod名稱 --image=映象 --port=80 --namespace 名稱空間名字

比如在上一篇中,我們建立了一個nginx的pod,可以寫成:

kubectl run test-nignx-pod --image=nginx:1.23.0 --port=80 --namespace test

5、啟動一個pod【yaml方式啟動】

在當前目錄下建立一個yaml的檔案

設定內容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy  
  labels:
    chapter: first-app
spec:
  selector:
     matchLabels:  
       app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name : nginx
        image: nginx:1.23.0
        ports:
        - containerPort: 80

然後使用apply的方式啟動

kubectl apply -f ./test-nginx.yaml

注意點:

通過 apply -f 的方式建立的pod,刪除的時候,也需要通過apply -f 的方式刪除

6、通過deployment控制器匯出yaml檔案

在當前叢集下,我們有下面這個pod

 使用下面的命令匯出這個pod對應的yaml

kubectl create deployment test-nginx3 --image=nginx:1.23.0 --namespace test -o yaml --dry-run=client > ./nginx.yaml

執行之後可以發現在當前目錄下建立了一個yaml的檔案

 檔案內容是不是和前面我們自己建立的那個yaml很像,看起來似乎更加完整,需要注意的是,這個裡面的有些引數是可以手動修改的,比如:replicas 這個表示生成的nginx的pod個數;

然後就可以使用apply的命令建立pod了

kubectl apply -f nginx.yaml

7、檢視某個名稱空間下 pod 的詳細資訊

kubectl get pod -n ns名稱 -o wide

比如,檢視default名稱空間下的pod資訊,就能看到上面通過yaml檔案建立的pod;

kubectl get pod -n default -o wide

通過k8s建立出來的pod,會分給當前的pod一個IP地址,可以直接通過curl 進行存取【同一個叢集下的其他節點都可存取】

九、Pod延伸補充說明

1、pod映象拉取策略 

pod映象拉取策略可以通過imagePullPolicy欄位設定映象拉取策略,如下:

spec:
  containers:
    - name: nginx
      image: nginx:1.23.0
      imagePullPolicy: Always	#可取 Always(預設值)、IfNotPresent、Never

imagePullPolicy可以使用以下3種策略值:

Always: 預設值,每次建立pod都會重新拉取一次映象;
IfNotPresent: 映象在宿主機上不存在時才拉取;
Never: 永遠不會主動拉取映象,使用本地映象,需要你手動拉取映象下來;

2、pod使用資源限制設定

我們知道,叢集中的節點都是有一定的設定的,比如CPU,記憶體等資訊,總不能因為建立的某個pod把節點的資源給打滿了,因此可以在組態檔中進行設定,以使用apply -f 的方式建立一個pod,組態檔中關鍵設定如下:

resources:
	requests:
		memory:"記憶體大小"
		cpu:"cpu佔用大小"
	limits:	
		memory:"記憶體佔用大小"
		cpu:"cpu佔用大小"

下面是一段完整的標籤設定和說明

spec:  
  containers: 
  - name: string   #必選,容器名稱
    image: string  #必選,容器的映象名稱
  
    resources: #資源限制和請求的設定
      limits:  #資源限制的設定
        cpu: string     #Cpu的限制,單位為core數,將用於docker run --cpu-shares引數
        memory: string  #記憶體限制,單位可以為Mib/Gib,將用於docker run --memory引數
      requests: #資源請求的設定
        cpu: string    #Cpu請求,容器啟動的初始可用數量
        memory: string #記憶體請求,容器啟動的初始可用數量

如下為一段實際使用中的設定

更多設定,請參考檔案:k8s檔案

3、關於pod的建立流程

以通過kubectl apply -f xxx.yaml 這種方式建立的pod進行說明,結合本文開頭的k8s架構圖:

  • kubectl向apiserver傳送建立pod的請求;
  • apiserver把pod的建立資訊儲存到etcd進行儲存;
  • scheduler監聽到未繫結node的pod資源,通過排程演演算法對該pod資源選定一個合適的node進行繫結,然後響應給apiserver,更新pod狀態並儲存到etcd中;
  • 在繫結的node中,Controller-Manager通知kubelet收到分配到自身節點上的pod,呼叫容器引擎api建立容器,並把容器狀態響應給apiserver;

4、Pod排程策略

預設情況下,一個Pod在哪個Node節點上執行,是由Scheduler元件採用相應的演演算法計算出來的,這個過程是不受人工控制的。但是在實際使用中,這並不滿足的需求,因為很多情況下,我們想控制某些Pod到達某些節點上,那麼應該怎麼做呢?這就要求瞭解k8s對Pod的排程規則 。

下面列舉幾個影響pod排程的因素:

pod資源限制

scheduler根據requests找到足夠大小的node進行排程

使用節點選擇器標籤(nodeSelector)

節點選擇器可以將節點分開,比如k8s叢集中有多個節點,為了區分生產,開發和測試環境,就可以利用節點選擇器標籤進行劃分;

例如,當前需要把pod排程到開發環境中,則可以通過scheduler將pod排程到標籤選擇器中為env_role:dev的node中 ,對應的yaml核心設定如下:

nodeSelector: 
  env_role:dev/prod

關於節點選擇器,後續還會通過一文詳細講解其使用。

到此這篇關於k8s中pod使用詳解(雲原生kubernetes)的文章就介紹到這了,更多相關k8s中pod使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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