1 Pods介紹
概念:Pod是中的最小調度單元,k8s是通過定義一個Pod的資源,然后在Pod里面運行容器,容器需要指定一個鏡像,這樣就可以用來運行具體的服務。一個Pod封裝一個容器(也可以封裝多個容器),Pod里的容器共享存儲、網絡等。也就是說,應該把整個pod看作虛擬機,然后每個容器相當于運行在虛擬機的進程。
Pod是需要調度到k8s集群的工作節點來運行的,具體調度到哪個節點,是根據調度器實現的。
2 Pod 管理多個容器
集群中的 Pod 主要有兩種用法:
Pod中可以同時運行多個容器。同一個Pod中的容器會自動的分配到同一個 node 上。同一個Pod中的容器共享資源、網絡環境,它們總是被同時調度,在一個Pod中同時運行多個容器是一種比較高級的用法,只有當你的容器需要緊密配合協作的時候才考慮用這種模式。例如,你有一個容器作為web服務器運行,需要用到共享的volume,有另一個“sidecar”容器來從遠端獲取資源更新這些文件。
2.1 init容器與邊車容器(sidecar)
在 中,邊車容器 是在主應用容器之前啟動并持續運行的容器。 Init 容器:在 Pod 初始化期間完成運行的容器。
Init 容器與普通的容器非常像,除了如下兩點:
如果 Pod 的 Init 容器失敗,kubelet 會不斷地重啟該 Init 容器直到該容器成功為止。 然而,如果 Pod 對應的 值為 “Never”,并且 Pod 的 Init 容器失敗, 則 會將整個 Pod 狀態設置為失敗。
邊車容器是與主應用容器在同一個 Pod 中運行的輔助容器。 這些容器通過提供額外的服務或功能(如日志記錄、監控、安全性或數據同步)來增強或擴展主應用容器的功能, 而無需直接修改主應用代碼。
4 學習Pod的作用
1.Pod是由一組緊耦合的容器組成的容器組,當然目前最流行的就是Docker、、podman容器,Pod就可以作為1或者多個容器的載體。
2、Pod中的所用容器會被一致調度、同節點部署,并且在一個“共享環境”中運行。Pod想成一個車:車里面好多座位,每個座位都坐不同的人,每個座位想成是一個容器,這里的“共享環境”包括以下幾點:
1)所有容器共享一個IP地址和端口空間,意味著容器之間可以通過高效訪問,不能有端口沖突
2)允許容器之間共享存儲卷,通過文件系統交互信息
3)有些容器需要緊密聯系,需要一起工作。Pod提供了比容器更高層次的抽象, Pod中的所有容器使用同一個網絡的,即相同的IP地址和Port空間。它們可以直接用通信。同樣的,這些容器可以共享存儲,當K8s掛載Volume到Pod上,本質上是將volume掛載到Pod中的每一個容器里。
4.1 使用pod的好處 4.1.1 代碼自動發版更新
假如生產環境部署了一個go的應用,而且部署了幾百個節點,希望這個應用可以定時的同步最新的代碼,以便自動升級線上環境。這時,我們不希望改動原來的go應用,可以開發一個Git代碼倉庫的自動同步服務,然后通過Pod的方式進行編排,并共享代碼目錄,就可以達到更新java應用代碼的效果。
4.1.2 收集業務日志
某服務模塊已經實現了一些核心的業務邏輯,并且穩定運行了一段時間,日志記錄在了某個目錄下,按照不同級別分別為 error.log、access.log、warning.log、info.log,現在希望收集這些日志并發送到統一的日志處理服務器上。
這時我們可以修改原來的服務模塊,在其中添加日志收集、發送的服務,但這樣可能會影響原來服務的配置、部署方式,從而帶來不必要的問題和成本,也會增加業務邏輯和基礎服務的藕合度。
如果使用Pod的方式,通過簡單的編排,既可以保持原有服務邏輯、部署方式不變,又可以增加新的日志收集服務。
而且如果我們對所有服務的日志生成有一個統一的標準,或者僅對日志收集服務稍加修改,就可以將日志收集服務和其他服務進行Pod編排,提供統一、標準的日志收集方式。
這里的“核心業務服務”、“日志收集服務”分別是一個鏡像,運行在隔離的容器環境中。
5 Pod的工作方式
在K8s中,所有的資源都可以使用一個yaml文件來創建,創建Pod也可以使用yaml配置文件?;蛘呤褂胟ubectl run在命令行創建Pod(不常用)。
5.1 自主式Pod
所謂的自主式Pod,就是直接定義一個Pod資源,如下:
導入鏡像
[root@master1 ~]# ctr -n=k8s.io images import xianchao-tomcat.tar.gz
unpacking docker.io/xianchao/tomcat-8.5-jre8:v1 (sha256:14dae4798a335e2925e4ee07b3ccd519a67faab2a9155adeb76a4556478dd8d7)...done
[root@node1 ~]# ctr -n=k8s.io images import xianchao-tomcat.tar.gz
unpacking docker.io/xianchao/tomcat-8.5-jre8:v1 (sha256:14dae4798a335e2925e4ee07b3ccd519a67faab2a9155adeb76a4556478dd8d7)...done
定義一個pod資源
[root@master1 ~]# vim pod-tomcat.yaml
[root@master1 ~]# cat pod-tomcat.yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat-test
namespace: default
labels:
app: tomcat
spec:
containers:
- name: tomcat-java
ports:
- containerPort: 8080
image: xianchao/tomcat-8.5-jre8:v1
imagePullPolicy: IfNotPresent
申請資源文件并查看pod是否創建成功
[root@master1 ~]# kubectl apply -f pod-tomcat.yaml
pod/tomcat-test created
[root@master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
tomcat-test 1/1 Running 0 39s
[root@master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-test 1/1 Running 0 4m34s 10.244.166.142 node1
但是自主式Pod是存在一個問題的,假如我們不小心刪除了pod:
[root@master1 ~]# kubectl delete pods tomcat-test
pod "tomcat-test" deleted
[root@master1 ~]# kubectl get pods
No resources found in default namespace.
結果是空,說明pod已經被刪除了
如果直接定義一個Pod資源,那Pod被刪除,就徹底被刪除了,不會再創建一個新的Pod,這在生產環境還是具有非常大風險的,所以今后我們接觸的Pod,都是控制器管理的。
5.2 控制器管理的Pod
常見的管理Pod的控制器:、、Job、CronJob、、。
控制器管理的Pod可以確保Pod始終維持在指定的副本數運行。
下面使用創建pod:
解壓鏡像
[root@master1 ~]# ctr -n=k8s.io images import xianchao-nginx.tar.gz
unpacking docker.io/xianchao/nginx:v1 (sha256:47f9a127fcda0c39a444b9ae608055abcf71f02351665aa2c450b7bdb7434aca)...done
[root@node1 ~]# ctr -n=k8s.io images import xianchao-nginx.tar.gz
unpacking docker.io/xianchao/nginx:v1 (sha256:47f9a127fcda0c39a444b9ae608055abcf71f02351665aa2c450b7bdb7434aca)...done
定義資源清單
[root@master1 ~]# vim nginx-deploy.yaml
[root@master1 ~]# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
labels:
app: nginx-deploy
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: my-nginx
image: xianchao/nginx:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
申請創建資源清單文件并查看pod
[root@master1 ~]# kubectl apply -f nginx-deploy.yaml
deployment.apps/nginx-test created
[root@master1 ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-test 2/2 2 2 10s
[root@master1 ~]# kubectl get replicaset
NAME DESIRED CURRENT READY AGE
nginx-test-5b76549fbd 2 2 2 47s
[root@master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-test-5b76549fbd-ggkmh 1/1 Running 0 67s 10.244.166.143 node1
nginx-test-5b76549fbd-q5z7x 1/1 Running 0 67s 10.244.166.144 node1
刪除其中一個pod
[root@master1 ~]# kubectl delete pod nginx-test-5b76549fbd-ggkmh
pod "nginx-test-5b76549fbd-ggkmh" deleted
[root@master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-test-5b76549fbd-g9462 1/1 Running 0 9s
nginx-test-5b76549fbd-q5z7x 1/1 Running 0 3m44s
發現重新創建一個新的pod
通過上面可以發現通過管理的pod,可以確保pod始終維持在指定副本數量
6 Pod如何運行應用/工作流程
創建Pod流程:
kubectl apply -f nginx-deploy.yaml->找到config文件,基于config文件指定的用戶訪問指定的集群,這樣就找到了。
通過kubectl命令向API Server提交創建pod的請求,API Server接收到請求后,會把pod的屬性信息()寫進etcd;API Server觸發watch機制準備創建pod, 信息發給調度器,調度器使用調度算法選擇node,調度器把node信息發給API Server,API Server把綁定node的信息寫進etcd;API Server又通過watch機制調用kubelet,指定pod信息,調用容器運行時創建并啟動pod內的容器;創建完成之后反饋給kubelet, kubelet又將pod的狀態信息給API Server,API Server又將pod的狀態信息寫入etcd。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。