前言
最近,筆者去申請了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叢集後,依照下圖所圈出的紅框部分,填入適當的資訊。需要填入的資訊如下:
- 選擇訂閱帳戶名稱。
- 選擇訂閱帳戶之群組名稱。
- 輸入叢集資料,例如:輸入nifi-cluster。
- 選擇部署此叢集的區域。
接著,切換到「正在監視」的頁籤,這裡設定監控叢集所使用到的方法;這裡保持預設的設定即可,完成設定後,再往下個頁籤做檢視。
切到「進階」頁籤,也是維持如下截圖的設定,一切使用預設設定,完成檢視後,再切換至下個頁籤。
在「標籤」頁籤中,也是維持原來預設設定,並往下個頁籤做設定。
最後,在「檢閱+建立」頁籤,確認設定的叢集是否有正確,設定正確無誤後,按下「建立」按鈕並開始建立Kubernetes叢集。
建立叢集開始後,會出現下列建立的過程與相關的圖示,並表示叢集正在建立與部署中。
當部署完成後,會出現下列的截圖,表示Kubernetes已經部署完成了。
存取Kubernetes叢集
當叢集部署完成後,則可以開始試著存取了,在下列清單中,點選「nifi-cluster」,會到叢集資訊的頁面,接著按下「連線」按鈕。
按下連線後,會有「Cloud Shell」、「Azure CLI」與「執行命令」等選項,為了方便使用與操作,這邊選擇「Cloud Shell」操作以存取Kubernetes叢集。
後續操作步驟的摘要如下:
- 開啟Cloud Shell,此步驟會在此Azure雲端管理頁面啟動一個Cloud Shell,供執行指令以存取建立於Azure上的各式雲端服務。
- 依序執行下列指令,驗證確切的Azure訂閱使用者。
- az account set –subscription <subscription_id>
- 下載叢集驗證
- az aks get-credentials –resource-group peterli123 –name nifi-cluster –overwrite-existing
- 後續操作的指令為存取叢集的命令範例。
實際在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叢集。