构建多云环境下的K3S集群

29

作为一名有追求的羊毛党,双十一和双十二当然不容错过, 薅完阿里云,又薅了腾讯云,正好在笔记本上跑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配置还是要高一点) 无论那种规格每账号限一台,限轻量应用服务器新用户(作为资深羊毛党这不是事,老爸老妈老婆老妹儿的身份证注册一个妥妥的安排了)想要上车的倒计时至: 2021年12月31日 还有时间,同志们可以冲一把。

二、需求

不同账号甚至不同云服务商, 内网肯定是不通的。所以我们要想办法实现跨公网的容器网络通信,保障任意一台节点上的pod能访问任意节点上的pod和service,和正常的kubernetes集群体验一致。跨地域的话可能会产生额外10毫秒左右的延迟,问题不大。 要实现这样的效果,wireguard是个非常好的选择。WireGuard是一个易于配置、快速且安全的开源VPN,可以轻松地在树莓派之类低端设备到高端服务器上部署(弱弱的说一句,利用云主机,可以部署wireguard实现手机、家里的NAS设备、智能路由器等的组网,组成专属网络,随时随地设备间互联访问,为了不跑题这里不多说,有兴趣可以了解一下,有时间再撸一篇文章专门说明。)。wireguard已被集成在linux内核中(要5.4以上),Linux原生支持,从效率和稳定性上来说要比N2N高上不少。另一个好消息是flannel插件内置了wireguard模式, so,我们直接拿来用即可只是配置的时候有些坑要注意一下,按照下面的文档做,顺利开车。

三、安装依赖

  • 升级内核
# 安装源
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
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

# 安装新版内核tools、header等
yum --disablerepo=* --enablerepo=elrepo-kernel install kernel-ml-tools kernel-ml-devel kernel-ml-headers -y

#重新生成grub
grub2-mkconfig -o /boot/grub2/grub.cfg

# 重启
reboot

# 检查当前内核版本
uname -a

# 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
# 国内加速
curl -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]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target
After=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 --flannel-backend wireguard --tls-san 公网地址,内网地址 --node-ip 内网地址 --node-external-ip 公网地址 --no-deploy servicelb 
    --disable traefik
    --kube-proxy-arg "proxy-mode=ipvs" "masquerade-all=true" 
    --kube-proxy-arg "metrics-bind-address=0.0.0.0"
  • 获取token:
cat /var/lib/rancher/k3s/server/node-token    
# 内容类似如下:
K10fc6653356f8b0c457cd1a8e41d87b7d33b49a97f4e6b8qweqweqwewq12788a06e85647454::server:53c2qweqweqweqw4d8145be9e7
  • 设置agent节点: 注意根据实际情况替换配置中的公网地址和内网地址
[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target
After=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 agent 
    --node-external-ip 公网地址 
    --node-ip 内网地址 
    --kube-proxy-arg "proxy-mode=ipvs" "masquerade-all=true" 
    --kube-proxy-arg "metrics-bind-address=0.0.0.0"
  • 设置agent变量
vim /etc/systemd/system/k3s.service.env

# 此处定义集群的api service访问地址以及token内容为:
K3S_URL=https://server的公网地址:6443
K3S_TOKEN=K10fc6653356f8b0c457cd1a8e41d87b7d33b49a97f4e6b8qweqweqwewq12788a06e85647454::server:53c2qweqweqweqw4d8145be9e7
  • 重启服务
systemctl daemon-reload && systemctl restart k3s
  • 查看集群状态
[[email protected] ~]# kubectl get node
NAME                 STATUS   ROLES                           AGE    VERSION
node1.wangxun.tech   Ready    shanghai                        4d4h   v1.21.7+k3s1
wangxun.tech         Ready    control-plane,hangzhou,master   4d4h   v1.21.7+k3s
  • 配置注解
# 所有节点添加注解, 否则 wireguard默认会尝试通过内网地址进行互联,内网肯定是无法连接的导致pod之间无法互相通信
kubectl annotate nodes 节点名称 flannel.alpha.coreos.com/public-ip-overwrite=节点公网IP
  • 配置metrics-server
#与wireguard的问题一样,默认情况下,其他节点也会尝试使用内网地址来请求metrics-server,需要修改启动参数,使用公网地址。
kubectl edit deployment metrics-server -n kube-system
# spec.template.spec.containers下的command配置如下:
- command:
        - /metrics-server
        - --kubelet-preferred-address-types=ExternalIP
        - --kubelet-insecure-tls
  • 检查跨主机通信
[[email protected] ~]# kubectl get pod -A -o wide
NAMESPACE     NAME                                      READY   STATUS             RESTARTS   AGE    IP           NODE                 NOMINATED NODE   READINESS GATES
kube-system   metrics-server-cd69c4c45-gcqbh            1/1     Running            0          4d2h   10.42.1.3    node1.wangxun.tech   <none>           <none>
kube-system   coredns-7448499f4d-wfkss                  1/1     Running            0          3d4h   10.42.1.34   node1.wangxun.tech   <none>           <none>
default       traefik-66d78697f-ckbx4                   1/1     Running            0          3d4h   10.42.1.37   node1.wangxun.tech   <none>           <none>
default       traefik-66d78697f-wq2c9                   1/1     Running            1          2d3h   10.42.0.31   wangxun.tech         <none>           <none>
kube-system   local-path-provisioner-5ff76fc89d-4h5tm   1/1     Running            8          2d6h   10.42.0.32   wangxun.tech         <none>           <none>

[[email protected] ~]# ping 10.42.1.46
PING 10.42.1.46 (10.42.1.46) 56(84) bytes of data.
64 bytes from 10.42.1.46: icmp_seq=1 ttl=63 time=15.9 ms
64 bytes from 10.42.1.46: icmp_seq=2 ttl=63 time=15.8 ms
64 bytes from 10.42.1.46: icmp_seq=3 ttl=63 time=15.9 ms
^C
--- 10.42.1.46 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 15.847/15.874/15.916/0.107 ms
[[email protected] ~]# ping 10.42.0.31
PING 10.42.0.31 (10.42.0.31) 56(84) bytes of data.
64 bytes from 10.42.0.31: icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from 10.42.0.31: icmp_seq=2 ttl=64 time=0.095 ms
64 bytes from 10.42.0.31: icmp_seq=3 ttl=64 time=0.076 ms
^C
--- 10.42.0.31 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 84ms
rtt min/avg/max/mdev = 0.076/0.083/0.095/0.011 ms

# 可以发现杭州节点上ping上海节点上的pod存在15毫秒的延迟。
  • 检查metrics
# 查看节点资源使用情况
[[email protected] ~]# kubectl top node
W1214 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 flag
NAME                 CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
node1.wangxun.tech   40m          2%     1507Mi          38%
wangxun.tech         90m          9%     1200Mi          60%

# 查看POD资源使用情况
[[email protected] ~]# kubectl top pod -A
W1214 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 flag
NAMESPACE     NAME                                      CPU(cores)   MEMORY(bytes)
default       traefik-66d78697f-ckbx4                   2m           36Mi
default       traefik-66d78697f-wq2c9                   1m           45Mi
kube-system   coredns-7448499f4d-wfkss                  2m           20Mi
kube-system   local-path-provisioner-5ff76fc89d-4h5tm   1m           25Mi
kube-system   metrics-server-cd69c4c45-gcqbh            1m           16Mi
  • 到此k3s集群部署完成, 如果有更多的主机,可以重复agent的配置步骤进行添加。
via : https://zhuanlan.zhihu.com/p/445353413
Comments