Peter 工程日誌

如何在Azure雲端運算平台上建立Kubernetes叢集

前言

最近,筆者去申請了Azure之30天體驗帳號,想要嘗試雲端平台上的各種服務,由於體驗帳號有許多的限制,沒有辦法有效的使用30天體驗所贈送的200美金;例如:無法建立虛擬主機。

但是,筆者發現免費體驗帳號能夠建立Kubernetes叢集、部署Azure Web App服務與建立Azure SQL資料庫伺服器等,也是有不少的雲端服務可以體驗。因此,在此章節中,筆者分享如何使用體驗版本的Azure帳號建立自動的Kubernetes叢集,並利用此叢集,將NiFi以叢集方式部署上去以驗證AKS (Azure Kubernets)有無順利的運作。

建立叢集之步驟

首先,最重要的是建立Kubernetes叢集,建立的操作方式以Azure Dev Portal為主(https://portal.azure.com),雖然建立方式可以透過Azure CLI完成,但是,為了項目之建立呈現與便利性,還是以雲端管理介面的操作為主。

首先,需要進入到Azure Portal網站中,如下圖所示;在「搜尋服務、資源、文件」的搜尋欄位中,輸入「Kubernetes」或直接選擇「Kubernetes服務」。

按下後,選擇「建立」並再點選「自動Kubernetes叢集」,以自動的方式建立Kubernetes叢集,如下圖所示:

按下建立自動Kubernetes叢集後,依照下圖所圈出的紅框部分,填入適當的資訊。需要填入的資訊如下:

接著,切換到「正在監視」的頁籤,這裡設定監控叢集所使用到的方法;這裡保持預設的設定即可,完成設定後,再往下個頁籤做檢視。

切到「進階」頁籤,也是維持如下截圖的設定,一切使用預設設定,完成檢視後,再切換至下個頁籤。

在「標籤」頁籤中,也是維持原來預設設定,並往下個頁籤做設定。

最後,在「檢閱+建立」頁籤,確認設定的叢集是否有正確,設定正確無誤後,按下「建立」按鈕並開始建立Kubernetes叢集。

建立叢集開始後,會出現下列建立的過程與相關的圖示,並表示叢集正在建立與部署中。

 

 

當部署完成後,會出現下列的截圖,表示Kubernetes已經部署完成了。

存取Kubernetes叢集

當叢集部署完成後,則可以開始試著存取了,在下列清單中,點選「nifi-cluster」,會到叢集資訊的頁面,接著按下「連線」按鈕。

按下連線後,會有「Cloud Shell」、「Azure CLI」與「執行命令」等選項,為了方便使用與操作,這邊選擇「Cloud Shell」操作以存取Kubernetes叢集。

後續操作步驟的摘要如下:

  1. 開啟Cloud Shell,此步驟會在此Azure雲端管理頁面啟動一個Cloud Shell,供執行指令以存取建立於Azure上的各式雲端服務。
  2. 依序執行下列指令,驗證確切的Azure訂閱使用者。
    • az account set –subscription <subscription_id>
  3. 下載叢集驗證
    • az aks get-credentials –resource-group peterli123 –name nifi-cluster –overwrite-existing
  4. 後續操作的指令為存取叢集的命令範例。

實際在Cloud Shell中,依序執行前述的指令與回應的訊息如下所示:


Your Cloud Shell session will be ephemeral so no files or system changes will persist beyond your current session.
peterli [ ~ ]$ az account set --subscription <subscription_id>
peterli [ ~ ]$ az aks get-credentials --resource-group peterli123 --name nifi-cluster --overwrite-existing
Merged "nifi-cluster" as current context in /home/peterli/.kube/config
Converted kubeconfig to use Azure CLI authentication.
peterli [ ~ ]$ 

接著,可以執行kubectl簡易指令檢視Kubernetes叢集狀態,使用「kubectl get nodes」指令後,與輸出的訊息如下所示:


peterli [ ~ ]$ kubectl get nodes

部署NiFi叢集

筆者使用「https://github.com/saidsef/k8s-nifi-cluster」專案來部署NiFi叢集,這是一個使用kustomize自定義部署設定的作法來部署NiFi叢集至Kubernetes作法。依序部署的步驟如下:

# 將自動Kubernetes叢集設定Safeguard排除特定的namespace
az aks safeguards update \
  --resource-group <resource_group> --name <cluster_name> \
  --level Enforce --excluded-ns <namespace1> <namespace2>
# 由於此NiFi叢集需要Ingress Nginx Controller,因此先安裝Ingress

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  --set controller.service.type=LoadBalancer

# 若執行上述指令出現「"Warning: ingress-nginx-admission-create had resource requests and limits added or adjusted to improve quality of service and prevent resource starvation. Learn more at aka.ms/aks/deployment-safeguards"」訊息,則需要改成下列作法

# 將安裝失敗的ingress-nginx移除

helm uninstall ingress-nginx -n ingress-nginx
kubectl delete namespace ingress-nginx

# 手動下載Chart再從本地端(Cloud Shell)安裝

# 用 curl 帶重試下載 chart 壓縮檔
curl -L --retry 5 --retry-delay 3 \
  -o ingress-nginx-4.15.1.tgz \
  https://github.com/kubernetes/ingress-nginx/releases/download/helm-chart-4.15.1/ingress-nginx-4.15.1.tgz

# 從本地檔案安裝(注意路徑用 ./ 開頭)並修改admission webhook的埠號
helm install ingress-nginx ./ingress-nginx-4.15.1.tgz \
  --namespace ingress-nginx --create-namespace \
  --set controller.service.type=LoadBalancer

# 需要看到DESCRIPTION: Install complete等敘述則表示部署Ingress Nginx已經完成

# 取得Ingress對外IP位址
$ kubectl get svc -n ingress-nginx ingress-nginx-controller
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.0.105.62 <external_ip> 80:31315/TCP,443:31279/TCP 2m39s

若有針對容器或叢集指派Policy則需要將其刪除避免部署失敗,安裝完成Ingress後,接著依序執行下列指令以部署NiFi叢集:


# 使用git複製k8s-nifi-cluster專案
$ git clone https://github.com/saidsef/k8s-nifi-cluster
Cloning into 'k8s-nifi-cluster'...
remote: Enumerating objects: 776, done.
remote: Counting objects: 100% (227/227), done.
remote: Compressing objects: 100% (162/162), done.
remote: Total 776 (delta 140), reused 106 (delta 65), pack-reused 549 (from 1)
Receiving objects: 100% (776/776), 177.46 KiB | 10.44 MiB/s, done.
Resolving deltas: 100% (403/403), done.

# 切換至k8s-nifi-cluster專案目錄並執行kubectl apply指令
cd k8s-nifi-cluster
$ kubectl apply -k deployment/

# 使用下列指令檢查目前NiFi叢集Pod之狀態
$ kubectl get pods -n nifi

# 預期輸出結果如下所示
NAME READY STATUS RESTARTS AGE
nifi-0 1/1 Running 0 14m
nifi-1 1/1 Running 0 12m

假設先前透過「kubectl get svc -n ingress-nginx ingress-nginx-controller」指令取得外部IP位址為20.227.60.214,則使用curl會卡在嘗試存取nifi的網頁介面則會失敗。
主要原因是,在AKS上部署與安裝ingress-nginx時,需要讓Azure LB的健康探測指向至「/healthz」路徑,否則預設探測為「/」會與Nginx互相衝突,導致回應404之HTTP狀態碼而全數健康探測失敗。
因此,需要執行下列指令做出修改:

helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx --create-namespace \
  --set controller.service.type=LoadBalancer \
  --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz

當完成前述的修改後,再次以curl指令嘗試存取NiFi使用者介面,則會有回應內容了,預期的結果如下所示:


$ curl -k https://20.227.60.214/nifi/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

這時,需要修改/etc/hosts檔案或是在curl增加「–resolve」參數,讓實際主機名稱能夠對應到IP位址,並使得Ingress與遠端伺服器認得主機名稱:


# 預期執行下列指令就會有回應NiFi網頁內容了

curl -k --resolve nifi:443:20.227.60.214 https://nifi/nifi/

若是用Firefox瀏覽器並搭配修改host檔案主機與IP位址的對應,則可以輸入「https://nifi/nifi/」網址,則預期應顯示下列的截圖:

結語

有許多的設定,是在Azure的Kubernetes部署時候才會發生。因此,在執行部署過程通常僅能見招拆招並試著解決問題,還有另外個問題出現的較不明顯;有時指定建置叢集的機房資源不夠,導致帳戶針對此區域的配額不足,造成無法建立Kubernetes叢集,這時,需要請求多餘的配額至指定的機房區域,這樣才能夠解決相對應的問題,並能夠順利地建置出需要測試的Kubernetes叢集。

參考資料

  1. https://github.com/saidsef/k8s-nifi-cluster
  2. https://portal.azure.com
Exit mobile version