上一篇我們介紹了如何安裝和啟動 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 | apiVersion: v1 |
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 | apiVersion: v1 |
使用 Pod 的 yaml 檔建立 Pod
使用 kubectl 的 create
指令建立 Pod。
1 | kubectl create -f <file name>.yml |
範例
使用剛才建立好的 kubernetes-pod.yml
來建立 Pod。
1 | $ kubectl create -f kubernetes-pod.yml |
建立好後可以使用 kubectl 的 get pods
指令查看 Pod 建立的狀況。
1 | $ kubectl get pods |
也可以使用 kubectl 的 describe pods <pod name>
指令查看 Pod 的詳細資訊。
1 | $ kubectl describe pods kubernetes-pod |
連線到 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 | $ kubectl port-forward kubernetes-pod 9000:9000 |
設定完後在瀏覽器輸入 http://localhost:9000 就可以成功打開 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