極簡教程!教你快速將K3s與Cloud Controller整合

k3s中文社群發表於2020-04-20

作者:

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:

https://github.com/DavidZisky/k3s-cloud

相關文章