作者:
Dawid Ziolkowski,雲原生工程師
原文鏈接:
https://itnext.io/how-to-integrate-k3s-with-the-cloud-controller-36bd5020b8f7
在之前的一篇文章中我們介紹了如何在60秒內創建一個4個節點的K3s集羣,文中還包含了虛擬機的配置。這一集羣的唯一問題是沒有cloud provider的支持,也就是說你不能使用LoadBalancer、存儲等服務。那麼,本文將告訴你如何將K3s與cloud provider集成。
將CCM(雲管理控制器)與K3s集成在一起基本上意味着你的K3s集羣能夠與cloud provider的API進行通信,以請求和配置諸如LoadBalancer(用於ingress)之類的服務,還能爲節點應用適當的標籤等。在不同的cloud provider之前這一過程有所不同,主要取決於cloud provider是否首先提供CCM。在本文中,我們將在DigitalOcean上安裝K3s。
整個流程並不複雜,但你需要仔細跟着以下步驟進行。首先,從master節點開始。安裝K3s master節點時,我們需要傳遞以下參數:
— disable-cloud-controller
— no-deploy servicelb
— kubelet-arg=”cloud-provider=external”
— kubelet-arg=”provider-id=digitalocean://[master_node_id]”
那麼,它們意味着什麼呢?首先,正如名字所暗示的,禁用默認K3s cloud provider,否則K3s將使用其自身內置的cloud controller。第二,我們要求K3s不要部署servicelb,因爲它會將IP地址弄亂——servicelb會用節點IP覆蓋Ingress IP,而我們希望使用DigitalOcean LoadBalancer IP作爲LoadBalancer服務類型。第三,這幾乎是所有CCM的要求,我們只需要指示kubelet使用外部cloud provider。最後一個參數,這是DO CCM的要求——如果你查看DO CCM Github repo(https://github.com/digitalocean/digitalocean-cloud-controller-manager),你會發現它們僅要求你將此參數傳遞給kubelet。[master_node_id]是可以在DO Dashboard中找到的,也可以通過從droplet本身進行GET調用來查找:
curl http://169.254.169.254/metadata/v1/id
因此,爲了安裝給CCM準備的K3s server,我們需要執行以下命令:
curl -sfL https://get.k3s.io | sh -s — server \
--disable-cloud-controller \
--no-deploy servicelb \
--kubelet-arg=”cloud-provider=external” \
--kubelet-arg=”provider-id=digitalocean://$master_id”
以上就是第一部分,前期準備。K3s server啓動之後,我們需要安裝CCM。要完成這一步驟,首先需要clone該git倉庫:
https://github.com/digitalocean/digitalocean-cloud-controller-manager
接下來,我們需要創建一個包含DigitalOcean API token的Kubernetes secret。你可以使用repo中的secret生成器,也可以使用以下命令:
kubectl -n kube-system create secret generic digitalocean --from-literal=access-token=[YOUR_DO_API_TOKEN]
如果secret已保存,則只需從倉庫中應用yaml manifest:
kubectl apply -f releases/v0.1.21.yml
現在無論何時啓用LoadBalancer服務,都會創建DigitalOcean LoadBalancer並將其配置爲將流量路由到該負載。此外,由於k3s默認內置了Traefik,因此也會自動爲其創建DOLB。
到目前爲止,我們僅創建了K3s master節點,對於worker節點,你只需要安裝具有以下參數的K3s即可:
curl -sfL https://get.k3s.io | K3S_TOKEN=${token} sh -s - agent \
--server https://${master_node_ip}:6443 \
--kubelet-arg="cloud-provider=external" \
--kubelet-arg="provider-id=digitalocean://$worker_id"
現在,所有節點都具有合適的標籤集(公共/私有ip、DO區域等),並且通過DO LB的路由也會即刻啓動。
最後,我創建了一個簡單的bash腳本來自動化整個流程。這一解決方案可以讓你創建2分中之內在DigitalOcean上創建一個4節點(1個master節點+3個worker節點)的k3s集羣,並且帶有DO CCM: