原文链接:https://fuckcloudnative.io/posts/deploy-k3s-cross-public-cloud/
最近一两年各大云服务商都出了各种福利活动,很多小伙伴薅了一波又一波羊毛,比如腾讯云 1C2G 95/年 真香系列,华为云和阿里云也都有类似的活动,薅个两三台就能搭建一个 Kubernetes 集群。但是跨云服务商搭建 Kubernetes 集群并不像我们想象中的那么容易,首先就是原生的 Kubernetes 组件本身对资源的消耗量很大,而云服务器的资源非常有限,经不起这么大家伙的折腾,对此我们可以选择使用轻量级 Kubernetes 发行版:k3s。
k3s 将安装 Kubernetes 所需的一切打包进仅有 60MB 大小的二进制文件中,并且完全实现了 Kubernetes API。为了减少运行 Kubernetes 所需的内存,k3s 删除了很多不必要的驱动程序,并用附加组件对其进行替换。由于它只需要极低的资源就可以运行,因此它能够在任何 512MB 内存以上的设备上运行集群。
其实 k3s 的安装非常简单,分分钟就能搞定,但对于公有云来说,还是有很多坑的,比如内网不通、公网 IP 不在服务器上该咋办?本文就为你一一解决这些难题,让天下的云羊毛都成为 k3s 的后宫!
1. 下载二进制文件首先来解决第一个难题:k3s 二进制文件的下载。国内下载 GitHub 速度基本都是以几个 kb 为单位,不忍直视,如果下载内容都是代码,有很多办法可以解决,比如通过码云中转啊、直接通过 CDN 下载啊,什么?你不知道可以通过 CDN 下载?好吧没关系,现在我告诉你了:https://cdn.con.sh/。
但是上面的 CDN 并不能下载 release 里的内容,要想下载 release 里的内容,可以使用这个网站:https://toolwa.com/github/。打开网站,输入 release 里面的文件下载链接,点击起飞即可加速下载。
当然,如果你会魔法上网的话,上面的所有花里胡哨的方法都可以无视,直接下载就好啦(本文选择使用版本 v1.17.6+k3s1):
$ wget https://github.com/rancher/k3s/releases/download/v1.17.6+k3s1/k3s -O /usr/local/bin/k3s $ chmod +x /usr/local/bin/k3s需要在所有节点中下载上述二进制文件。
2. 升级内核k3s 的默认网络插件是 flannel,默认模式是 vxlan 模式,建议使用 wireguard 模式,原因不解释了,不知道 wireguard 是啥的自己去搜一下。
wireguard 对内核的要求比较高,而 CentOS 7.x 的默认内核是不满足要求的,需要升级内核(如果你的操作系统是 CentOS 7.x 的话)。步骤如下:
① 载入公钥
$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org② 升级安装 elrepo
$ rpm -Uvh③ 载入 elrepo-kernel 元数据
$ yum --disablerepo=\* --enablerepo=elrepo-kernel repolist④ 安装最新版本的内核
$ yum --disablerepo=\* --enablerepo=elrepo-kernel install kernel-ml.x86_64 -y⑤ 删除旧版本工具包
$ yum remove kernel-tools-libs.x86_64 kernel-tools.x86_64 -y⑥ 安装新版本工具包
$ yum --disablerepo=\* --enablerepo=elrepo-kernel install kernel-ml-tools kernel-ml-devel kernel-ml-headers -y⑦ 查看内核插入顺序
$ grep "^menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2 CentOS Linux (3.10.0-1127.10.1.el7.x86_64) 7 (Core) CentOS Linux (5.7.2-1.el7.elrepo.x86_64) 7 (Core) CentOS Linux (0-rescue-96820b9851c24560b5f942f2496b9aeb) 7 (Core)默认新内核是从头插入,默认启动顺序也是从 0 开始。
⑧ 查看当前实际启动顺序
$ grub2-editenv list saved_entry=CentOS Linux (3.10.0-1127.10.1.el7.x86_64) 7 (Core)⑨ 设置默认启动
$ grub2-set-default 'CentOS Linux (5.7.2-1.el7.elrepo.x86_64) 7 (Core)'最后重启检查:
$ reboot $ uname -r注意:集群中的所有节点都需要升级内核。
3. 安装 wireguard内核升级了之后,就可以安装 wireguard 了,也很简单,步骤如下:
$ yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm $ yum install yum-plugin-elrepo $ yum install kmod-wireguard wireguard-tools注意:集群中的所有节点都需要安装。
4. 部署控制平面下面就可以在控制节点上启动控制平面的组件了,这里我们选择手动部署,这样比较方便修改参数。先创建一个 Service Unit 文件:
$ cat > /etc/systemd/system/k3s.service <<EOF [Unit] Description=Lightweight Kubernetes Documentation=https://k3s.io Wants=network-online.target [Install] WantedBy=multi-user.target [Service] Type=notify EnvironmentFile=http://www.likecs.com/etc/systemd/system/k3s.service.env KillMode=process Delegate=yes # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. LimitNOFILE=1048576 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 \ server \ --tls-san <public_ip> \ --node-ip <public_ip> \ --node-external-ip <public_ip> \ --no-deploy servicelb \ --flannel-backend wireguard \ --kube-proxy-arg "proxy-mode=ipvs" "masquerade-all=true" \ --kube-proxy-arg "metrics-bind-address=0.0.0.0" EOF将 <public_ip> 替换成控制节点的公网 IP。
flannel 使用 wireguard 协议来跨主机通信。
kube-proxy 使用 ipvs 模式。
启动 k3s 控制平面并设置开机自启:
$ systemctl enable k3s --now查看集群组件健康状况:
$ kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok