K3s 是輕量級的 Kubernetes。server 最低只需要 512M 內存即可運行。
不同帳號甚至不同雲服務商, 內網是不通的。所以要想辦法實現跨公網的容器網絡通信,保障任意一台節點上的 pod 能訪問任意節點上的 pod 和 service,和正常的 kubernetes 集群體驗一致。
參考入門指南和多雲解決方案,重新整理
目標:實現混合雲 (騰訊雲伺服器 + 甲骨文伺服器 + 微軟 Azure 伺服器) 環境下的 K3S 集群
Server 安裝#
# 局域網方案
curl -sfL https://get.k3s.io | sh -
# 多雲安裝方案
curl -sfL https://get.k3s.io | sh -s - --node-external-ip=Server公網地址 --flannel-backend=wireguard-native
中國用戶,可以使用以下方法加速安裝:
# 局域網方案
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
# 多雲安裝方案
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - --node-external-ip=Server公網地址 --flannel-backend=wireguard-native --flannel-external-ip
運行此安裝後:
K3s 服務將被配置為在節點重啟後或進程崩潰或被殺死時自動重啟。
將安裝其他實用程序,包括 ```kubectl```、```crictl```、```ctr```、```k3s-killall.sh``` 和 ```k3s-uninstall.sh```。
kubeconfig 文件將寫入到 ```/etc/rancher/k3s/k3s.yaml```,由 K3s 安裝的 kubectl 將自動使用該文件。
安裝其他 Agent 節點#
安裝其他 Agent 節點並將它們添加到集群,請使用 K3S_URL 和 K3S_TOKEN 環境變量運行安裝腳本
# 局域網方案
curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
# 多雲安裝方案
curl -sfL https://get.k3s.io | K3S_URL=https://Server公網地址:6443 K3S_TOKEN=mynodetoken sh -s - --node-external-ip=Agent公網地址
# 局域網方案
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
# 多雲安裝方案
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://Server公網地址:6443 K3S_TOKEN=mynodetoken sh -s - --node-external-ip=Agent公網地址
備註:
K3S_URL
參數會導致安裝程序將 K3s 配置為 Agent 而不是 Server。K3s Agent 將註冊到在 URL 上監聽的 K3s Server。K3S_TOKEN
使用的值存儲在 Server 節點上的 /var/lib/rancher/k3s/server/node-token
中。
每台主機必須具有唯一的主機名。如果你的計算機沒有唯一的主機名,請傳遞 K3S_NODE_NAME 環境變量,並為每個節點提供一個有效且唯一的主機名。
在本機訪問 k3s 集群#
安裝 kubectl
brew install kubectl
複製 Server 中 /etc/rancher/k3s/k3s.yaml
的內容
寫入本機的~/.kube/config
文件.
參考 scp 複製指令:
scp server:/etc/rancher/k3s/k3s.yaml ~/.kube/config
測試指令#
查看節點狀態:
$ kubectl get node
NAME STATUS ROLES AGE VERSION
vm-4-10-debian Ready <none> 35m v1.27.6+k3s1
vm-4-9-debian Ready control-plane,master 39m v1.27.6+k3s1
檢查跨網通訊:
$ kubectl get pod -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system local-path-provisioner-957fdf8bc-gcgj4 1/1 Running 0 38m 10.42.0.5 vm-4-9-debian <none> <none>
kube-system coredns-77ccd57875-vsxmt 1/1 Running 0 38m 10.42.0.6 vm-4-9-debian <none> <none>
kube-system helm-install-traefik-crd-sv9jh 0/1 Completed 0 38m 10.42.0.4 vm-4-9-debian <none> <none>
kube-system metrics-server-5f8b4ffd8-zd4db 1/1 Running 0 38m 10.42.0.3 vm-4-9-debian <none> <none>
kube-system helm-install-traefik-jp8sk 0/1 Completed 2 38m 10.42.0.2 vm-4-9-debian <none> <none>
kube-system svclb-traefik-0782c5d1-wr5kd 2/2 Running 0 37m 10.42.0.7 vm-4-9-debian <none> <none>
kube-system traefik-64f55bb67d-4lr2g 1/1 Running 0 37m 10.42.0.8 vm-4-9-debian <none> <none>
kube-system svclb-traefik-0782c5d1-444jv 2/2 Running 0 34m 10.42.1.2 vm-4-10-debian <none> <none>
查看節點資源使用情況:
$ kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
vm-4-9-debian 24m 2% 1369Mi 69%
vm-4-10-debian <unknown> <unknown> <unknown> <unknown>
查看 POD 資源使用情況:
$ kubectl top pod -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
kube-system coredns-77ccd57875-vsxmt 1m 20Mi
kube-system local-path-provisioner-957fdf8bc-gcgj4 1m 14Mi
kube-system metrics-server-5f8b4ffd8-zd4db 3m 24Mi
kube-system svclb-traefik-0782c5d1-wr5kd 0m 0Mi
kube-system traefik-64f55bb67d-4lr2g 1m 33Mi
到此 k3s 集群部署完成, 如果有更多的主機,可以重複 agent 的配置步驟進行添加。
K3s Server 節點的入站規則#
協議 | 端口 | 源 | 目標 | 描述 |
---|---|---|---|---|
TCP | 2379-2380 | Servers | Servers | 只有具有嵌入式 etcd 的 HA 需要 |
TCP | 6443 | Agents | Servers | K3s supervisor 和 Kubernetes API Server |
UDP | 8472 | 所有節點 | 所有節點 | 只有 Flannel VXLAN 需要 |
TCP | 10250 | 所有節點 | 所有節點 | Kubelet 指標 |
UDP | 51820 | 所有節點 | 所有節點 | 只有使用 IPv4 的 Flannel Wireguard 才需要 |
UDP | 51821 | 所有節點 | 所有節點 | 只有使用 IPv6 的 Flannel Wireguard 才需要 |
所有出站流量通常都是允許的。