如何將地端kubernets叢集加入azure-arc以kind為例

如何將地端Kubernets叢集加入Azure Arc,以Kind為例

想要學習如何將地端 Kubernets 叢集加入 Azure Arc,並且利用 Azure Monitor 來監控地端 Kubernets 叢集。架設地端 Kubernets 叢集對我來說已經沒什麼難度了。但對於入門介紹,總不能說,我們要先架個三台地端 Kubernets 叢集,才能開始進入主題吧。借此機會,跟大家介紹一下 Kind 這套架設與測試 Kubernets 叢集的利器。

Kind 極速入門

Kind (Kubernets in docker)從縮寫就能知道,它是一套運行在 docker 裡的 Kubernets,如果你有玩過 Docker Desktop 裡所附 Kubernets,你就會知道,

  • Docker Desktop 裡的 Kubernets 只有單節點(single node)
  • 它的啟動與停止都有夠慢的。

那 Kind 有什麼特色呢?

  • Kind 支援多節點(含HA)叢集
  • Kind 支援從原始碼建置 Kubernetes 發行版本
  • Kind 支援 Linux、macOS 和 Windows
  • Kind 是 CNCF 認證的一致的 Kubernetes 安裝程序

和我們比較有關會是第 1 點和第 3 點。另外一個重點,Kind 在多節點建置與執行上效能還很不錯。(排除第一次 pull images 會慢點,後續啟動建立,速度非常不錯。)

Kind 的安裝,官網寫的很清楚,請自行參考。以下我是以 WSL- Ubuntu 為例:

# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
# For ARM64
[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-arm64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

在 Windows 的 WSL 使用 Kind 之前,需要啟動 Docker Desktop,啟動之後就能利用 kind CLI 來建立叢集:

# 建立叢集
kind create cluster
# 刪除叢集
kind delete cluster

多節點則是利用 Yaml 來設定,網官提供的範例為例:

# three node (two workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker

儲存之後,使用 --config 來指定所建立 Yaml:

# 建立多節點
kind create cluster --config kind-three-node-cluster.yml
# 刪除叢集
kind delete cluster
# 刪除所有叢集
kind delete cluster -A

當然裡面 Yaml 裡可以包含更多更複雜的測試情境,並且 Kind CLI 也能像 docker CLI 或 kubectl 一樣進行更複雜的互動。不過以上的建置與刪除對於我們的 Kind 極速入門,已經足夠了。

以下是此次會用到的 Yaml 內容:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
- role: worker
- role: worker

簡單來說,我們把 Control Plane 的 80、443 Port 給打開,如此而已。讓我們套用此組態來產生所需的叢集:

kind create cluster --config kind-cluster-ingress.yml --name arc-cluster

--name arc-cluster 是給此叢集一個名稱。

安裝 Azure CLI

執行測試整合 Azure Arc 與地端 Kubernets 叢集之前,我們會透過 Azure CLI 來協助建置與連線,因此需要先安裝 Azure CLI,我們準備在 WSL 測試,參考在 Linux 上安裝 Azure CLI 來進行安裝:

curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

與 Azure Arc 連線準備

要開始進行連線之前,需要做一些準備工作。

# Log into Azure
az login --use-device-code
# To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code {{YourCode}} to authenticate.

# Set Azure subscription
az account set --subscription "x-x-x-x-x"

畫面會提供你開啟一個瀏覽器 URL 並進輸入 {{YourCode}} 驗證,如果你有多個訂閱,設定現在要對那一個訂閱進行操作。還有其他種身分驗證的方式,例如 Service Principal,這裡重點是取得一個可操作 Auzre 訂閱的身份。

az provider register --namespace Microsoft.Kubernetes
az provider register --namespace Microsoft.KubernetesConfiguration
az provider register --namespace Microsoft.ExtendedLocation

整合 Azure Arc 與地端 Kubernets 叢集,Azure 需要註冊一些 Provide。注意,此註冊動作可能需要 10 分鐘以上的時間。

az provider show -n Microsoft.Kubernetes -o table
az provider show -n Microsoft.KubernetesConfiguration -o table
az provider show -n Microsoft.ExtendedLocation -o table

利用監視程序當 RegistrationState 狀態變為 Registered 時,代表註冊完成。等待當下,可以去建立資源群組。

建立資源群組

建立一個測試用的資源群組:

az group create --name AzureArcTest --location EastUS --output table

去泡杯咖啡,等 Provide 註冊完成。

連線現有的 Kubernetes 叢集

等 Provide 註冊完畢,就可以進行 Azure Arc 與地端 Kubernets 叢集的連線:

# 安裝相關擴充套件
az extension add --name connectedk8s
az extension add --name k8s-configuration

#如果你之前已經有安裝過擴充套件,建議可以更新一下。
#az extension update --name connectedk8s
#az extension update --name k8s-configuration

# 與 Azure Arc 建立連線
az connectedk8s connect --name "Arc-Kind-Demo" --resource-group "AzureArcTest" --location "eastus" --tags "Project=azure_arc_k8s"

注意,這個過程時間也蠻長時,它還會安裝 Helm 3,但只受限於 Azure Arc,不會影響其他已安裝的 Helm。這個時間長到我受不了跑去泡第2杯咖啡(時間我就沒細算),反正 Azure CLI 沒報錯停在那裡就是等。完成之後,就能看到 Arc-Kind-Demo 資源群組中:

AzureArc with KindCluster 01

可以用 namespace azure-arc 查詢:

$ kubectl get ns
NAME                 STATUS   AGE
azure-arc            Active   113m
azure-arc-release    Active   117m
default              Active   3h22m
kube-node-lease      Active   3h22m
kube-public          Active   3h22m
kube-system          Active   3h22m
local-path-storage   Active   3h22m

$ kubectl get pods -n azure-arc
NAME                                          READY   STATUS    RESTARTS   AGE
cluster-metadata-operator-6855dc4768-q8flp    2/2     Running   0          114m
clusterconnect-agent-568c4dc956-jk242         3/3     Running   0          114m
clusteridentityoperator-66fd8c9dc7-49gxx      2/2     Running   0          114m
config-agent-cc6bb4676-cpwvc                  2/2     Running   0          114m
controller-manager-768df8776-x54wd            2/2     Running   0          114m
extension-events-collector-554844d4c7-vb24b   2/2     Running   0          114m
extension-manager-666565d6d8-s9z82            3/3     Running   0          114m
flux-logs-agent-69c46fcb5b-snk6l              1/1     Running   0          114m
kube-aad-proxy-84bdb744f7-9vvsn               2/2     Running   0          114m
logcollector-54979f5cf4-85khh                 1/1     Running   0          114m
metrics-agent-84c587f8f7-x898q                2/2     Running   0          114m
resource-sync-agent-575cd99d98-hrb6w          2/2     Running   0          114m

可以看到許多 Azure Arc 的 Pods 在我們的叢集中運作。

加入服務帳號

當我們想要在 Azure 界面上查看 Kubernetes resources (preview) 相關功能時,會被告知需要一個憑證來進行存取。因此,我們需要在 Kubernetes 叢集去建立一個服務帳號,提供給 Azure Arc 使用。

# 在 default 命名空間下建立一個服務帳號
# 命名空間可任意修改
$ kubectl create serviceaccount demo-user -n default
# 建立 clusterrolebinding 授權此服務帳號的許可權限。
# 注意命名空間,如果前一步你有修改的話
$ kubectl create clusterrolebinding demo-user-binding --clusterrole cluster-admin --serviceaccount default:demo-user
# 建立服務帳號的 Token
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: demo-user-secret
  annotations:
    kubernetes.io/service-account.name: demo-user
type: kubernetes.io/service-account-token
EOF
# 取得 Token
$ TOKEN=$(kubectl get secret demo-user-secret -o jsonpath='{$.data.token}' | base64 -d | sed 's/$/\n/g')
# 輸出 Token
$ echo $TOKEN

將輸出的 Token 貼上 Azure 界面,就能正常執行 Kubernetes resources (preview) 之下的功能。

AzureArc with KindCluster 02

地端 Kubernetes 叢集加入 Azure Monitor

加入 Azure Arc 之後,這裡就很簡單了,透過 Azure Potal 就能設定。在【Settings】【Extensions】【Add】選擇你想要的方案(目前有三個可以選),這裡我們選擇【azuremonitor-containers】,一樣等一小段時間。

AzureArc with KindCluster 03

收集 Log 需要一點時間,一樣要等一些時間之後,你才能看到【Monitoring】下面的功能有資料:

AzureArc with KindCluster 04

清除測試資源

如果你跟我一樣,只是個 PoC 測試,測試之後可以刪除資源:

# 刪除 Arc-Kind-Demo 連線
az connectedk8s delete --name Arc-Kind-Demo --resource-group AzureArcTest
# 如果刪除失敗,執行強制刪除
az connectedk8s delete -n Arc-Kind-Demo -g AzureArcTest --force

這會刪除 Arc-Kind-Demo 這個相關資源,像 Azure Monitor 會額外建立的 Azure 資源,還需要另外去刪除。地端 Kubernetes 叢集部分,除了一個 azuremonitor-containers 命名空間之外,Pods 部分都有刪除乾淨。

$ kubectl get ns
NAME                      STATUS   AGE
azuremonitor-containers   Active   19h
default                   Active   22h
kube-node-lease           Active   22h
kube-public               Active   22h
kube-system               Active   22h
local-path-storage        Active   22h

$ kubectl get pods -n azure-arc
No resources found in azure-arc namespace.

$ kubectl get pods -n azuremonitor-containers
No resources found in azuremonitor-containers namespace.

小結

整體而言,透過 Kind 測試地端 Kubernetes 叢集與 Azure Arc 雲端整合的過程還蠻順利的。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。