原文连接:https://fuckcloudnative.io/posts/deploy-k3s-cross-public-cloud/node
最近一两年各大云服务商都出了各类福利活动,不少小伙伴薅了一波又一波羊毛,好比腾讯云 1C2G 95/年
真香系列,华为云和阿里云也都有相似的活动,薅个两三台就能搭建一个 Kubernetes
集群。可是跨云服务商搭建 Kubernetes
集群并不像咱们想象中的那么容易,首先就是原生的 Kubernetes
组件自己对资源的消耗量很大,而云服务器的资源很是有限,经不起这么你们伙的折腾,对此咱们能够选择使用轻量级 Kubernetes 发行版:k3s
。git
k3s
将安装 Kubernetes 所需的一切打包进仅有 60MB
大小的二进制文件中,而且彻底实现了 Kubernetes API。为了减小运行 Kubernetes 所需的内存,k3s
删除了不少没必要要的驱动程序,并用附加组件对其进行替换。因为它只须要极低的资源就能够运行,所以它可以在任何 512MB
内存以上的设备上运行集群。github
其实 k3s 的安装很是简单,分分钟就能搞定,但对于公有云来讲,仍是有不少坑的,好比内网不通、公网 IP 不在服务器上该咋办?本文就为你一一解决这些难题,让天下的云羊毛都成为 k3s 的后宫!数据库
首先来解决第一个难题:k3s 二进制文件的下载。国内下载 GitHub
速度基本都是以几个 kb
为单位,不忍直视,若是下载内容都是代码,有不少办法能够解决,好比经过码云中转啊、直接经过 CDN
下载啊,什么?你不知道能够经过 CDN 下载?好吧不要紧,如今我告诉你了:https://cdn.con.sh/。api
可是上面的 CDN 并不能下载 release
里的内容,要想下载 release 里的内容,可使用这个网站:https://toolwa.com/github/。打开网站,输入 release 里面的文件下载连接,点击起飞便可加速下载。bash
固然,若是你会魔法上网的话,上面的全部花里胡哨的方法均可以无视,直接下载就好啦(本文选择使用版本 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
须要在全部节点中下载上述二进制文件。网络
k3s 的默认网络插件是 flannel
,默认模式是 vxlan
模式,建议使用 wireguard
模式,缘由不解释了,不知道 wireguard
是啥的本身去搜一下。工具
wireguard 对内核的要求比较高,而 CentOS 7.x
的默认内核是不知足要求的,须要升级内核(若是你的操做系统是 CentOS 7.x 的话)。步骤以下:post
① 载入公钥
$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
② 升级安装 elrepo
$ rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
③ 载入 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
注意:集群中的全部节点都须要升级内核。
内核升级了以后,就能够安装 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
注意:集群中的全部节点都须要安装。
下面就能够在控制节点上启动控制平面的组件了,这里咱们选择手动部署,这样比较方便修改参数。先建立一个 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=/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=/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。wireguard
协议来跨主机通讯。ipvs
模式。启动 k3s 控制平面并设置开机自启:
$ systemctl enable k3s --now
查看集群组件健康情况:
$ kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok
这里的输出没有 etcd
,由于 k3s 的默认数据存储是 Sqlite
,对于小型数据库十分友好。Kubernetes 控制平面中发生的更改更可能是与频繁更新部署、调度 Pod 等有关,所以对于几个节点的小型集群而言,数据库不会形成太大负载,能省下很多资源,真香!
部署好控制平面以后,就能够加入计算节点了。首先在计算节点上建立 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=/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=/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
中须要加入两个环境变量:
API Server
的 URL,通常格式为:https://<master_ip>:6443
。其中 <master_ip> 是控制节点的公网 IP。/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
这里会遇到一个问题,不一样节点的 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,大功告成!
还有一个问题就是 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
这样就可让 metrics-server 使用公网 IP 来和 node 通讯了。修改为功后就能够看到核心指标了:
$ kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% blog-k3s01 193m 9% 886Mi 22% blog-k3s02 41m 2% 1292Mi 32% $ kubectl top pod -n kube-system NAME CPU(cores) MEMORY(bytes) coredns-848b6cc76f-zq576 8m 14Mi local-path-provisioner-58fb86bdfd-bzdfl 2m 9Mi metrics-server-bdfc79c97-djmzk 1m 12Mi
到这里跨云服务商部署 k3s 基本上就大功告成了,下一篇文章将会教你如何打通家里到云上 k3s 的网络,让你家中全部设备均可以直接访问 Pod IP、svc IP,甚至能够直接访问 svc 域名,敬请期待。
Kubernetes 1.18.2 1.17.5 1.16.9 1.15.12离线安装包发布地址http://store.lameleg.com ,欢迎体验。 使用了最新的sealos v3.3.6版本。 做了主机名解析配置优化,lvscare 挂载/lib/module解决开机启动ipvs加载问题, 修复lvscare社区netlink与3.10内核不兼容问题,sealos生成百年证书等特性。更多特性 https://github.com/fanux/sealos 。欢迎扫描下方的二维码加入钉钉群 ,钉钉群已经集成sealos的机器人实时能够看到sealos的动态。