原文連接: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的動態。