Kubernetes筆記(五):瞭解Pod(容器組)
阿新 • • 發佈:2020-09-11
Kubernetes 中, 容器總是以 Pod(容器組)的方式進行排程與執行。因此對 Pod 的理解與掌握是學習 Kubernetes 的基礎。
## 理解 Pod
Pod(容器組)是 Kubernetes 中最小的排程單元,每一個Pod都是某個應用程式的一個執行例項。以前我們的 Web 應用都是以 Tomcat 等 Web 容器程序的形式執行在作業系統中,在 Kubernetes 中,我們需要將 Web 應用打成映象,以容器的方式執行在 Pod 中。
Kubernetes 不會直接管理容器,而是通過 Pod 來管理。一個Pod包含如下內容:
1. 一個或多個容器, 一般是一個,除非多個容器緊密耦合共享資源才放在一個 Pod 中;
2. 共享的儲存資源(如資料卷),一個 Pod 中的容器是可以共享儲存空間的;
3. 一個共享的 IP 地址,Pod 中容器之間可以通過 localhost:port 彼此訪問;
4. 定義容器該如何執行的選項。
Pod 中的容器可包括兩種型別:
1. 工作容器:就是我們通常執行服務程序的容器
2. 初始化容器:完成一些初始化操作的容器,初始化容器在工作容器之前執行,所有的初始化容器成功執行後,才開始啟動工作容器
## 管理 Pod
### 建立 Pod
在 Kubernetes 中,我們一般不直接建立 Pod,而是通過控制器來排程管理(Deployment,StatefulSet,DaemonSet 等),這裡為了便於瞭解,先通過 yaml 配置檔案的方式定義 Pod 來直接建立 Pod。定義配置檔案 pod-test.yaml 如下,
```yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test # pod 名稱
namespace: default # pod 建立的 namespace
spec:
containers: # pod 中容器定義
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 8081
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
restartPolicy: OnFailure # 重啟策略
volumes: # 資料卷定義
- name: workdir
hostPath:
path: /tmp
type: Directory
```
其中 spec 部分的 containers 定義了該 Pod 中執行的容器,從 containers 的複數形式也可以看出一個 Pod 中是可以執行多個容器的。
執行 `kubectl create` 或 `kubectl apply` 命令建立 Pod,
```shell
[root@kmaster test]# kubectl create -f pod-test.yaml
或
[root@kmaster test]# kubectl apply -f pod-test.yaml
```
該 Pod 建立後將會拉取一個最新的 nginx 映象,執行一個 nginx 容器,並將容器的 80 埠對映到宿主機的 8081 埠。
### 檢視 Pod
可使用 `kubectl get pods` 命令檢視當前 namesapce 下的所有 Pod,加 Pod 名稱檢視具體某個 Pod。 如果需要檢視 Pod 排程到了哪個節點,可加 `-o wide` 選項,如果檢視 yaml 檔案資訊則可加 `-o yaml` 選項, 如下所示
```shell
[root@kmaster test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-test 1/1 Running 0 116s
[root@kmaster test]# kubectl get pods pod-test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-test 1/1 Running 0 2m19s 10.244.1.42 k