构建多云环境下的K3S集群
作为一名有追求的羊毛党,双十一和双十二当然不容错过, 薅完阿里云,又薅了腾讯云,正好在笔记本上跑kubernetes实在是不过瘾且不爽,
作为一名有追求的羊毛党,双十一和双十二当然不容错过, 薅完阿里云,又薅了腾讯云,正好在笔记本上跑kubernetes实在是不过瘾且不爽, 有了薅来的云主机, 咱也可以奢侈一把了,无论是学习、测试还是部署自己的应用,直接有一个公网的集群可以用,都是一件很爽的事情。所以不得不夸一下腾讯云的这次羊毛十分给力, 不同于以往和现在其他云服务商小水管带宽的云主机,就像给你一把枪却只给一颗子弹,用起来便秘一样的难受, 这次腾讯云大方的给了5-8M的公网带宽,可以说十分良心, 作为NO.1的某云赶紧学着点,卷起来, 卷起来羊毛才多嘛^_^。
一、资源
k3s作为轻量且使用起来基本与原生kubernetes差别不是很大,资源消耗很低, server最低只需要512M内存即可运行。特别适合羊毛党到处薅来的低配置云主机。笔者当前拥有阿里云轻量一台, 1核2G,5M带宽,一次薅了4年,价格一年99当时以为占了大便宜,谁知道腾讯云这一波卷,立马变的不香了,这个配置留着做k3s集群的master倒是合适。 腾讯云这一波羊毛: 2核4G 8M带宽(8M带宽可玩性就丰富多了),222/三年,或者1核2G 150/3年(这个就算了, 做kubernetes配置还是要高一点) 无论那种规格每账号限一台,限轻量应用服务器新用户(作为资深羊毛党这不是事,老爸老妈老婆老妹儿的身份证注册一个妥妥的安排了)截止2022年1月17日活动仍然同志们可以冲一把。
腾讯云活动页二、需求
不同账号甚至不同云服务商, 内网肯定是不通的。所以我们要想办法实现跨公网的容器网络通信,保障任意一台节点上的pod能访问任意节点上的pod和service,和正常的kubernetes集群体验一致。跨地域的话可能会产生额外10毫秒左右的延迟,问题不大。 要实现这样的效果,wireguard是个非常好的选择。WireGuard是一个易于配置、快速且安全的开源VPN,可以轻松地在树莓派之类低端设备到高端服务器上部署(弱弱的说一句,利用云主机,可以部署wireguard实现手机、家里的NAS设备、智能路由器等的组网,组成专属网络,随时随地设备间互联访问,为了不跑题这里不多说,有兴趣可以了解一下,有时间再撸一篇文章专门说明。)。wireguard已被集成在linux内核中(要5.4以上),Linux原生支持,从效率和稳定性上来说要比N2N高上不少。另一个好消息是flannel插件内置了wireguard模式, so,我们直接拿来用即可只是配置的时候有些坑要注意一下,按照下面的文档做,顺利开车。
三、安装依赖
- 升级内核
# 安装源nrpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.orgnrpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpmnyum --disablerepo=* --enablerepo=elrepo-kernel repolistnyum --disablerepo=* --enablerepo=elrepo-kernel install kernel-ml.x86_64 -ynn# 卸载旧内核相关nyum remove kernel-tools-libs.x86_64 kernel-tools.x86_64 -ynn# 安装新版内核tools、header等nyum --disablerepo=* --enablerepo=elrepo-kernel install kernel-ml-tools kernel-ml-devel kernel-ml-headers -ynn#重新生成grubngrub2-mkconfig -o /boot/grub2/grub.cfgnn# 重启nrebootnn# 检查当前内核版本nuname -ann# Linux VM-12-9-centos 5.15.7-1.el8.elrepo.x86_64 #1 SMP Mon Dec 6 12:56:31 EST 2021 x86_64 x86_64 x86_64 GNU/Linux
- 安装wireguard
yum install kmod-wireguard wireguard-tools
- 安装k3s
# 国内加速ncurl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
- 设置k3s server节点配置:
vim /etc/systemd/system/k3s.service
注意根据实际情况替换公网地址和内网地址. BTW:这里在server的配置中禁用了traefik, 因为通过k3s自己的traefik crd部署逻辑在这个场景下部署无法成功, 可以部署完集群后通过helm安装。
[Unit]nDescription=Lightweight KubernetesnDocumentation=https://k3s.ionWants=network-online.targetnAfter=network-online.targetnn[Install]nWantedBy=multi-user.targetnn[Service]nType=notifynEnvironmentFile=/etc/systemd/system/k3s.service.envnKillMode=processnDelegate=yesn# Having non-zero Limit*s causes performance problems due to accounting overheadn# in the kernel. We recommend using cgroups to do container-local accounting.nLimitNOFILE=1048576nLimitNPROC=infinitynLimitCORE=infinitynTasksMax=infinitynTimeoutStartSec=0nRestart=alwaysnRestartSec=5snExecStartPre=-/sbin/modprobe br_netfilternExecStartPre=-/sbin/modprobe overlaynExecStart=/usr/local/bin/k3s n server --flannel-backend wireguard --tls-san 公网地址,内网地址 --node-ip 内网地址 --node-external-ip 公网地址 --no-deploy servicelb n --disable traefikn --kube-proxy-arg "proxy-mode=ipvs" "masquerade-all=true" n --kube-proxy-arg "metrics-bind-address=0.0.0.0"
- 获取token:
cat /var/lib/rancher/k3s/server/node-token n# 内容类似如下:nK10fc6653356f8b0c457cd1a8e41d87b7d33b49a97f4e6b8qweqweqwewq12788a06e85647454::server:53c2qweqweqweqw4d8145be9e7
- 设置agent节点: 注意根据实际情况替换配置中的公网地址和内网地址
[Unit]nDescription=Lightweight KubernetesnDocumentation=https://k3s.ionWants=network-online.targetnAfter=network-online.targetnn[Install]nWantedBy=multi-user.targetnn[Service]nType=notifynEnvironmentFile=/etc/systemd/system/k3s.service.envnKillMode=processnDelegate=yesn# Having non-zero Limit*s causes performance problems due to accounting overheadn# in the kernel. We recommend using cgroups to do container-local accounting.nLimitNOFILE=1048576nLimitNPROC=infinitynLimitCORE=infinitynTasksMax=infinitynTimeoutStartSec=0nRestart=alwaysnRestartSec=5snExecStartPre=-/sbin/modprobe br_netfilternExecStartPre=-/sbin/modprobe overlaynExecStart=/usr/local/bin/k3s agent n --node-external-ip 公网地址 n --node-ip 内网地址 n --kube-proxy-arg "proxy-mode=ipvs" "masquerade-all=true" n --kube-proxy-arg "metrics-bind-address=0.0.0.0"
- 设置agent变量
vim /etc/systemd/system/k3s.service.envnn# 此处定义集群的api service访问地址以及token内容为:nK3S_URL=https://server的公网地址:6443nK3S_TOKEN=K10fc6653356f8b0c457cd1a8e41d87b7d33b49a97f4e6b8qweqweqwewq12788a06e85647454::server:53c2qweqweqweqw4d8145be9e7n
- 重启服务
systemctl daemon-reload && systemctl restart k3s
- 查看集群状态
[root@my ~]# kubectl get nodenNAME STATUS ROLES AGE VERSIONnnode1.wangxun.tech Ready shanghai 4d4h v1.21.7+k3s1nwangxun.tech Ready control-plane,hangzhou,master 4d4h v1.21.7+k3s
- 配置注解
# 所有节点添加注解, 否则 wireguard默认会尝试通过内网地址进行互联,内网肯定是无法连接的导致pod之间无法互相通信nkubectl annotate nodes 节点名称 flannel.alpha.coreos.com/public-ip-overwrite=节点公网IP
- 配置metrics-server
#与wireguard的问题一样,默认情况下,其他节点也会尝试使用内网地址来请求metrics-server,需要修改启动参数,使用公网地址。nkubectl edit deployment metrics-server -n kube-systemn# spec.template.spec.containers下的command配置如下:n- command:n - /metrics-servern - --kubelet-preferred-address-types=ExternalIPn - --kubelet-insecure-tls
- 检查跨主机通信
[root@wangxun ~]# kubectl get pod -A -o widenNAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnkube-system metrics-server-cd69c4c45-gcqbh 1/1 Running 0 4d2h 10.42.1.3 node1.wangxun.tech <none> <none>nkube-system coredns-7448499f4d-wfkss 1/1 Running 0 3d4h 10.42.1.34 node1.wangxun.tech <none> <none>ndefault traefik-66d78697f-ckbx4 1/1 Running 0 3d4h 10.42.1.37 node1.wangxun.tech <none> <none>ndefault traefik-66d78697f-wq2c9 1/1 Running 1 2d3h 10.42.0.31 wangxun.tech <none> <none>nkube-system local-path-provisioner-5ff76fc89d-4h5tm 1/1 Running 8 2d6h 10.42.0.32 wangxun.tech <none> <none>nn[root@wangxun ~]# ping 10.42.1.46nPING 10.42.1.46 (10.42.1.46) 56(84) bytes of data.n64 bytes from 10.42.1.46: icmp_seq=1 ttl=63 time=15.9 msn64 bytes from 10.42.1.46: icmp_seq=2 ttl=63 time=15.8 msn64 bytes from 10.42.1.46: icmp_seq=3 ttl=63 time=15.9 msn^Cn--- 10.42.1.46 ping statistics ---n3 packets transmitted, 3 received, 0% packet loss, time 4msnrtt min/avg/max/mdev = 15.847/15.874/15.916/0.107 msn[root@wangxun ~]# ping 10.42.0.31nPING 10.42.0.31 (10.42.0.31) 56(84) bytes of data.n64 bytes from 10.42.0.31: icmp_seq=1 ttl=64 time=0.079 msn64 bytes from 10.42.0.31: icmp_seq=2 ttl=64 time=0.095 msn64 bytes from 10.42.0.31: icmp_seq=3 ttl=64 time=0.076 msn^Cn--- 10.42.0.31 ping statistics ---n3 packets transmitted, 3 received, 0% packet loss, time 84msnrtt min/avg/max/mdev = 0.076/0.083/0.095/0.011 msnn# 可以发现杭州节点上ping上海节点上的pod存在15毫秒的延迟。
- 检查metrics
# 查看节点资源使用情况n[root@wangxun ~]# kubectl top nodenW1214 21:10:46.996987 713827 top_node.go:119] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flagnNAME CPU(cores) CPU% MEMORY(bytes) MEMORY%nnode1.wangxun.tech 40m 2% 1507Mi 38%nwangxun.tech 90m 9% 1200Mi 60%nn# 查看POD资源使用情况n[root@wangxun ~]# kubectl top pod -AnW1214 21:11:02.771539 713937 top_pod.go:140] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flagnNAMESPACE NAME CPU(cores) MEMORY(bytes)ndefault traefik-66d78697f-ckbx4 2m 36Mindefault traefik-66d78697f-wq2c9 1m 45Minkube-system coredns-7448499f4d-wfkss 2m 20Minkube-system local-path-provisioner-5ff76fc89d-4h5tm 1m 25Minkube-system metrics-server-cd69c4c45-gcqbh 1m 16Mi
- 到此k3s集群部署完成, 如果有更多的主机,可以重复agent的配置步骤进行添加。