前言:

本文的目標為安裝 Portainer 圖形化工具來管理 K3s / K8s 環境,並簡單快速的用 yaml 設定來將容器自動部署到叢集上。

還沒有建好叢集的讀者請先參考我的另一篇文章:

先到 server 虛擬機內安裝 portainer:

1
2
3
multipass shell k8s-server

kubectl apply -n portainer -f https://downloads.portainer.io/ce2-19/portainer.yaml

安裝完後確認是否成功:

1
sudo kubectl get pods -n portainer

回到本機,連到以下網址:

1
2
3
4
http://<your_server_node_ip>:30777/

# 或是
https://<your_server_node_ip>:30779/

第一次啟動服務要設定帳號,如下圖:

設定完成就可以看到以下介面:

點選 Get Started 即可開始。

點選 local 進入 Dashboard:

點選 Services,然後選右上的 create from manifest:

選擇 Web editor 並輸入設定的 yaml:

這裡提供我用的 yaml 設定,用 nginx 官方 image 當簡單範例。

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
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"

---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- protocol: TCP
port: 38383
targetPort: 80

若有部署成功但發生 external ip always pending 或無法連線的問題,要注意 port 的設定。

成功部署會像這樣:

從圖中可以看到設定的 LoadBalancer 正常運作,有兩個 External IP 可以通:

Untitled

使用 External IP 即可正常連線:

以筆者案例是 http://192.168.64.2:38383/http://192.168.64.3:38383/

額外補充:

在原叢集正常運作時加開一個 worker2 虛擬機並加入叢集:

卡在這裡快二十分鐘都沒顯示完成:

Untitled

然後查看狀態發現 Portainer 已無法連線到 k3s 叢集:

Untitled

這邊注意,由於 Portainer 也是作為一個 pod 安裝在 master 上的,若是 master 主機掛了是連 Portainer 介面都看不到的,所以這裡的問題是 k3s 叢集卡住無法回應。

但依然可以正常訪問節點:

由於卡了二十分鐘都沒好,嘗試把 k8s-server 關掉,可以發現打其中一個 External IP 會變成「無法連上這個網站」了,但另一個正常,所以 LoadBalancer 的兩個端口確實是對應兩個不同節點上的服務,並且就算 master 掛掉 worker 還是能讀取。這也是因為 pod 是分散在兩個節點才能正常讀,不然 3 個 pod 都集中在 master 的話就算 worker 活著也讀不了。

最後把 k8s-server 重啟,一切正常,但中間還是等待了不少時間,可能開給他的資源真的太少了。

進入介面可以看到 LoadBalancer 自動的產生第三個端口,所以是隨著節點數量自動增減的:

嘗試把 k8s-worker2 關掉,大概要 2 分鐘才會顯示異常: