============
== 白菜 ==
============
一个勤奋的代码搬运工!

K3s 快速入门指南:构建多云环境下的K3S集群

技术分享 k3s Kubernetes kubectl

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 节点的入站规则

协议端口目标描述
TCP2379-2380ServersServers只有具有嵌入式 etcd 的 HA 需要
TCP6443AgentsServersK3s supervisor 和 Kubernetes API Server
UDP8472所有节点所有节点只有 Flannel VXLAN 需要
TCP10250所有节点所有节点Kubelet 指标
UDP51820所有节点所有节点只有使用 IPv4 的 Flannel Wireguard 才需要
UDP51821所有节点所有节点只有使用 IPv6 的 Flannel Wireguard 才需要

所有出站流量通常都是允许的。

参考:

快速入门指南

嵌入式 k3s 多云解决方案