Pod 概念與 Docker 容器很類似,K8s 中最小單位就是一個 Pod ,而不是說 Container ,雖然很接近不過還是有一些不同之處。
1. Pod 基礎
使用 Docker 時候每一個服務會啟動一個 Continer , K8s 也是一樣,不過是一個 POD 方式當作一個實例,一個 Pod 裡面可以有多個 Container,例如 Wordpress 內容發布平台與 MySQL 這組合,可能有人會想把這兩個服務放置同一個 Pod 一起運作,雖然可行,不過對於擴展性、負載就很不好,實際上會將其分開兩個 Pod ,並藉由 TCP/IP 網路互相溝通。
1.1 Pod 創建
創建一個 Pod 十分容易,可以直接使用 Kubectl 命令式要求啟動一個 Pod
1
|
kubectl run <Pod Name> --image=<image name>
|
以執行 Nginx 服務為例:
1
2
|
[k8s@servera ~]$ kubectl run nginx --image=nginx
pod/nginx created
|
1.2 Pod 查看
透過 get 可以查看已經創建好的服務
1
|
kubectl get pod <Pod Name>
|
1
2
3
|
[k8s@servera ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 8s
|
1.2 Pod 刪除
透過 delete 可以刪除服務
1
|
kubectl delete pod <Pod Name>
|
1
2
|
[k8s@servera ~]$ kubectl delete pod nginx
pod "nginx" deleted
|
2. 使用 Pod Manifest
Pod Manifest 可以使用 JSON 或 YAML 來撰寫,通常都是使用 YAML 來定義啟動的 Pod 為何,並宣告要如何產生。
2.1 創建一個 nginx.yaml 範例
1
2
3
4
5
6
7
8
9
10
|
apiVersion: v1
kind: Pod
metadata:
labels:
run: nginx
name: nginx
spec:
containers:
- image: nginx
name: nginx
|
2.2 執行 pod
1
|
kubectl apply -f <file.yml>
|
1
2
|
[k8s@servera ~]$ kubectl apply -f nginx.yml
pod/nginx created
|
2.3 刪除 pod
1
|
kubectl delete -f <file.yml>
|
1
2
|
[k8s@servera ~]$ kubectl delete -f nginx.yml
pod "nignx" deleted
|
3. Pod 進階
3.1 查看 Pod 詳情
想知道 Pod 實際運作詳細內容可以透過 describe 查看最下方的 Events ,會記錄 Pod 從拉取到創建的詳細訊息。
1
|
kubectl describe pods <Pod Name>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[k8s@servera ~]$ kubectl describe pods nginx
Name: nginx
Namespace: default
Priority: 0
Node: minikube/192.168.49.2
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 14s default-scheduler Successfully assigned default/nignx to minikube
Normal Pulling 12s kubelet Pulling image "nginx"
Normal Pulled 9s kubelet Successfully pulled image "nginx" in 3.145220237s
Normal Created 9s kubelet Created container nignx
Normal Started 9s kubelet Started container nignx
|
3.2 查看 Log
1
|
kubectl logs <Pod Name>
|
1
2
3
4
5
|
[k8s@servera ~]$ kubectl logs nignx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
...
|