0%

Kubernetes (三) - 實戰 Pod 建立

上一篇我們介紹了如何安裝和啟動 Kubernetes,這一篇要來實際的操作 Kubernetes。本篇會介紹如何從最基本的 Pod 開始建立。

建立 Pod

Kubernetes (一) - 基本概念 中有介紹過 Pod 是 Kubernetes 運作的最小單位,所以我們要先從建立 Pod 開始。

而要在 Pod 中運行的程式本篇使用 potainer 作為範例,portainer 是一種 Docker UI 的管理工具。

Kubernetes (一) - 基本概念 中也有提到每個 Pod 都有屬於自己的 yaml 檔,yaml 檔是用來描述這個 Pod,包含 Pod 的名稱、有哪些 Container 等等。

建立 Pod 的 yaml 檔

基本的 Pod yaml 檔格式和內容如下 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Pod
metadata:
name: <myapp>
labels:
name: <myapp>
spec:
containers:
- name: <myapp>
image: <Image>
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: <Port>

kind : 定義這個元件的類別,例如 : Pod、Node、Service、Namespace 或是 ReplicationController。

metadata : 定義這個元件的名稱和他的標籤名稱,標籤可以自訂給多組,例如 : name, app, env 等等。給標籤的用處是可以用來篩選出 Pod,這會在後面介紹的 Service 中再細說。

spec : 定義 Container

  • containers.name : Container 名稱
  • containers.image : 使用的 Image
  • containers.resources : 硬體資源限制,可以不設定
  • containers.ports : 開放給外部存取的 Port 號

範例
下面是一個 Pod 的 yaml 檔範例,會啟動一個 potainer 的 Container。

kubernetes-pod.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-pod
labels:
name: k8s-pod
spec:
containers:
- name: portainer
image: portainer/portainer:latest
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 9000

使用 Pod 的 yaml 檔建立 Pod

使用 kubectl 的 create 指令建立 Pod。

1
kubectl create -f <file name>.yml

範例
使用剛才建立好的 kubernetes-pod.yml 來建立 Pod。

1
2
$ kubectl create -f kubernetes-pod.yml
pod/kubernetes-pod created

建立好後可以使用 kubectl 的 get pods 指令查看 Pod 建立的狀況。

1
2
3
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-pod 1/1 Running 0 15s

也可以使用 kubectl 的 describe pods <pod name> 指令查看 Pod 的詳細資訊。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
$ kubectl describe pods kubernetes-pod
Name: kubernetes-pod
Namespace: default
Priority: 0
Node: minikube/172.17.0.2
Start Time: Mon, 24 Aug 2020 20:39:59 +0800
Labels: name=k8s-pod
Annotations: <none>
Status: Running
IP: 172.18.0.6
IPs:
IP: 172.18.0.6
Containers:
portainer:
Container ID: docker://82f110f3582eb53ca1d6fe1d3637bb5bea9ffd5a365673f2b691aa4e769d7b0e
Image: portainer/portainer:latest
Image ID: docker-pullable://portainer/portainer@sha256:f8c2b0a9ca640edf508a8a0830cf1963a1e0d2fd9936a64104b3f658e120b868
Port: 9000/TCP
Host Port: 0/TCP
State: Running
Started: Wed, 26 Aug 2020 20:54:13 +0800
Last State: Terminated
Reason: Error
Exit Code: 1
Started: Wed, 26 Aug 2020 20:44:12 +0800
Finished: Wed, 26 Aug 2020 20:49:13 +0800
Ready: True
Restart Count: 421
Limits:
cpu: 500m
memory: 128Mi
Requests:
cpu: 500m
memory: 128Mi
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-s82gq (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-s82gq:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-s82gq
Optional: false
QoS Class: Guaranteed
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning BackOff 8m15s (x3428 over 2d) kubelet, minikube Back-off restarting failed container

連線到 Pod 中啟動的服務

在 Pod 中所指定的 Port 和主機的 Port 是不相通的,只能在 Kubernetes Cluster 中被存取,所以 Kubernetes 提供了 port-forward 這個指令來將主機的 Port 對應到 Pod 的 Port

port-forward

可以使用 kubectl 的 port-forward 指令將主機的 Port 對應到 Pod 的 Port。

1
kubectl port-forward <pod name> <host port>:<pod port>

範例
portainer 預設是使用 9000 Port 來進行通訊,所以上方 kubernetes-pod.yml 也是定義對外開放的 Port 是 9000。因次這裡就再將主機的 9000 Port 對應的 Pod 的 9000 Port。

1
2
3
$ kubectl port-forward kubernetes-pod 9000:9000
Forwarding from 127.0.0.1:9000 -> 9000
Forwarding from [::1]:9000 -> 9000

設定完後在瀏覽器輸入 http://localhost:9000 就可以成功打開 portainer。
Portainer

Summary

本篇介紹了如何建立基本的 Pod 和如何從外部連線到 Kubernetes Cluster 內的 Pod,下一篇將會介紹進階的一些功能來更方便的管理和擴展 Pod。

參考

[1] 在 Minikube 上跑起你的 Docker Containers - Pod & kubectl 常用指令
[2] Kubernetes 基礎教學(二)實作範例:Pod、Service、Deployment、Ingress
[3] Kubectl常用命令
[4] Kubernetes學習筆記2 — pod及service
[5] Kubernetes Service 概念詳解
[6] 建立外部服務與Pods的溝通管道 - Services
[7] Kubernetes Service | 知乎
[8] Day 16 - Kubernetes Label 與 Selector
[9] Port, TargetPort, and NodePort in Kubernetes
[10] Kubernetes kubectl expose