跨云厂商部署 k3s 集群 (2)

这里的输出没有 etcd,因为 k3s 的默认数据存储是 Sqlite,对于小型数据库十分友好。Kubernetes 控制平面中发生的更改更多是与频繁更新部署、调度 Pod 等有关,因此对于几个节点的小型集群而言,数据库不会造成太大负载,能省下不少资源,真香!

5. 加入计算节点

部署好控制平面之后,就可以加入计算节点了。首先在计算节点上创建 Service Unit 文件:

$ cat > /etc/systemd/system/k3s-agent.service <<EOF [Unit] Description=Lightweight Kubernetes Documentation=https://k3s.io Wants=network-online.target [Install] WantedBy=multi-user.target [Service] Type=exec EnvironmentFile=http://www.likecs.com/etc/systemd/system/k3s-agent.service.env KillMode=process Delegate=yes LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity TimeoutStartSec=0 Restart=always RestartSec=5s ExecStartPre=-/sbin/modprobe br_netfilter ExecStartPre=-/sbin/modprobe overlay ExecStart=http://www.likecs.com/usr/local/bin/k3s agent \ --node-external-ip <public_ip> \ --node-ip <public_ip> \ --kube-proxy-arg "proxy-mode=ipvs" "masquerade-all=true" \ --kube-proxy-arg "metrics-bind-address=0.0.0.0" EOF

环境变量文件 /etc/systemd/system/k3s-agent.service.env 中需要加入两个环境变量:

K3S_URL : API Server 的 URL,一般格式为:https://<master_ip>:6443。其中 <master_ip> 是控制节点的公网 IP。

K3S_TOKEN : 加入集群所需的 token,可以在控制节点上查看 /var/lib/rancher/k3s/server/node-token 文件。

/etc/systemd/system/k3s-agent.service.env 内容如下:

K3S_URL=https://<master_ip>:6443 K3S_TOKEN=xxxxxxxx

启动 k3s-agent 并设置开启自启:

$ systemctl enable k3s-agent --now

查看节点状态:

$ kubectl get node NAME STATUS ROLES AGE VERSION blog-k3s01 Ready master 3d6h v1.17.6+k3s1 blog-k3s02 Ready <none> 3d3h v1.17.6+k3s1 6. 内网不互通的解决办法

这里会遇到一个问题,不同节点的 flannel 使用的是内网 IP 来进行通信,而我们的云服务器是内网不互通的,而且公网 IP 也不在服务器上。可以看一下 node 的 annotations:

$ kubectl get node blog-k3s02 -o yaml apiVersion: v1 kind: Node metadata: annotations: flannel.alpha.coreos.com/backend-data: '"xxxxx"' flannel.alpha.coreos.com/backend-type: extension flannel.alpha.coreos.com/kube-subnet-manager: "true" flannel.alpha.coreos.com/public-ip: 192.168.0.11 ...

可以看到 flannel 给节点打的注解中的节点 IP 是内网 IP。要想让 flannel 使用公网 IP 进行通信,需要额外添加一个注解 public-ip-overwrite,然后 flannel 会基于这个 IP 配置网络。按照官方文档的说法,如果你的 node 设置了 ExternalIP,flannel 会自动给 node 添加一个注解 public-ip-overwrite,但我不知道该如何给 node 设置 ExternalIP,干脆就直接手动加注解吧:

$ kubectl annotate nodes <master> flannel.alpha.coreos.com/public-ip-overwrite=<master_pub_ip> $ kubectl annotate nodes <node> flannel.alpha.coreos.com/public-ip-overwrite=<node_pub_ip>

加了注解之后,flannel 的 public-ip 就会被修改为公网 IP。然后在各个节点上重启各自的 k3s 服务,查看 wireguard 连接状况:

$ wg show flannel.1 interface: flannel.1 public key: ONDgJCwxxxxxxxJvdWpoOKTxQA= private key: (hidden) listening port: 51820 peer: MKKaanTxxxxxxxV8VpcHq4CSRISshw= endpoint: <pub_ip>:51820 allowed ips: 10.42.4.0/24 latest handshake: 26 seconds ago transfer: 133.17 KiB received, 387.44 KiB sent persistent keepalive: every 25 seconds

可以看到通信端点被改成了公网 IP,大功告成!

7. metrics-server 问题解决

还有一个问题就是 metrics-server 无法获取 cpu、内存等利用率核心指标。需要修改 metrics-server 的 manifests,使用以下命令在线编辑 metrics-server 的 manifests:

$ kubectl -n kube-system edit deploy metrics-server

然后加入以下执行参数后保存退出:

-command: - /metrics-server - --kubelet-preferred-address-types=ExternalIP - --kubelet-insecure-tls

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxydf.html