k8s中pod使用詳解(雲原生kubernetes)
一、前言
在之前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使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- K8S 中 kubectl 命令詳解
- kubernetes k8s常用問題排查方法
- kubernetes集群搭建Zabbix監控平臺的詳細過程
- K8S中五種控制器的介紹以及使用
- 手動部署java項目到k8s中的實現