構建多云環境下的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的配置步驟進行添加。
上一篇:zsj
下一篇:蒸汽發生器和蒸汽鍋爐哪個比較好?








