最近有機會接觸到要用azure的IaaS服務建立出可以自動擴展的kubernetes (以下簡稱k8s) 叢集 (以下簡稱cluster)。
雖然常碰azure的一定會知道,其實azure有提供k8s的PaaS服務(不管是Azure kubernetes Service (AKS) 還是 更高一層的 Azure Container Instance (ACI))但是有些地方是沒有那些服務的(可以期待9月)或者如果想要自己控制完整的vm那要怎麽辦呢?
這篇將會快速介紹一下用acs-engine產生在Azure IaaS上面可以使用的k8s自動延展的cluster,在下一篇在介紹如何操作并且看到azure怎麽和k8s整合。
k8s是什麽?
其實我還沒有打算介紹k8s這一塊,我預計未來應該會開一個系列,但是因爲有先碰到了,因此才打算先寫出來。但是又怕完全沒看過會不理解,因此有了一個簡單的介紹。
如果大家想多知道關於k8s,歡迎隨時留言給我。
瞭解k8s延伸擴展之前需要簡單的知道一下一個k8s的cluster架構。可以看到以下從Wikipedia取得的一張架構圖,以今天的demo來説需要知道:
- Master
- 整個k8s的大腦,用來管理整個node設定。
- Node
- 實際執行工作的節點,一般來説一臺電腦就是一個node。裡面有kubelet專門和master溝通。
- pod
- 在k8s裡面最小的執行單位。可以簡單理解成一個container服務(實際上可以有好多個container組成一個pod,不過以這篇來説不用想的太複雜)
- services
- 在圖裏面沒有畫的很明顯,不過因爲等一下demo會做到因此介紹一下。services可以理解成爲load balancer,想象一下如果我有同樣服務起了多個pod,怎麽和這些pod溝通?使用到的就是service,因此簡單理解 成爲load balancer即可。
微軟現在非常擁抱開源,尤其是在k8s這個部分,要知道當初的創始者就被挖角到了微軟,加上k8s的一些周邊工具有一部分都是微軟在contribute,因此azure和k8s有深度整合,使用起來很容易。
好啦這篇就只介紹這些基本概念,而我們想透過azure做到的就是自動延展node的機器。
acs-engine是什麽
瞭解了架構之後,我們當然可以直接透過建立vm然後自己安裝k8s的master以及node,然後做一些設定達到自動延展,但是這邊的基礎知識需要非常瞭解。而微軟非常佛心了開源了一個工具,也就是acs-engine。
acs-engine的主要功能就是透過設定檔(一個json檔案)幫忙產生出Azure的ARM(Azure Resource Manager)Template,讓我們可以快速部署不同的container orchestration到azure。
acs-engine小檔案
- 有支援的container orchestration:DC/OS、kubernetes、OpenShift、Swarm Mode以及Swarm
- github專案位置:https://github.com/Azure/acs-engine
- 一些參考的範例:https://github.com/Azure/acs-engine/tree/master/examples
- 工具下載位置:https://github.com/Azure/acs-engine/releases
- Windows x64直接下載地址:https://github.com/Azure/acs-engine/releases/download/v0.19.0/acs-engine-v0.19.0-windows-amd64.zip
- 最新版本:0.19
首先可以透過上面的鏈接把windows的版本下載下來,接下來就是準備要建立ARM的json設定檔案。
準備好Azure CLI 2.0工具
接下來有些操作會透過azure cli來執行,方便未來自動化。如果要使用需要先安裝。
可以透過從這個下載頁面(https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest)找到不同os 版本的下載鏈接。
Windows可以透過下載鏈接(https://aka.ms/installazurecliwindows)直接下載下來。
準備acs-engine的設定檔案
要產生acs-engine的檔案需要先做一點前置作業:
- 取得acs-engine的範例檔案
- 產生出ssh的public key
- 建立服務的ResourceGroup
- 建立會產生vm的Service Principal
- 修改acs-engine的檔案
1. 取得acs-engine的範例檔案
整個範例專案可以從github上面下載得到 (https://github.com/alantsai-samples/mhat-acs-enginge-azure-k8s), 而範例檔案可以從:src/kubernetes-vmss.json
2. 產生出ssh的public key
由於k8s在linux上面跑起來比較順,因此使用的OS是ubuntu。而要連到linux最方便的方式就是透過ssh。
因此要把ssh的public key設定進去。
建立ssh的public key很簡單,可以透過指令:
ssh-keygen -f id_rsa -C "alan@alantsai.net"
-C
的部分可以輸入email。
產生出來之後,在%userprofile%\.ssh
多了兩個檔案,其中裡面有個檔案是:id_rsa.pub
,用notepad打開之後,會取得一個ssh-rsa開頭的一串字。
這個内容就設定到範本裡面的KeyData
把{ssh-rsk 開頭的public key}
換成上面取得的内容。
3. 建立服務的ResourceGroup
透過ResourceGroup能夠把不同的服務放在一起,并且等一下的Service Principal會設定在這個層級的權限。
這個部分會透過azure cli工具(az)來執行:
az login
$SUBSCRIPTION_ID = ""
$RESOURCE_GROUP_NAME = ""
az account set --subscription $SUBSCRIPTION_ID
# create ResourceGroup
az group create `
--name "$RESOURCE_GROUP_NAME" `
--location "southeastasia"
$SUBSCRIPTION_ID
是設定要建立在那個azure的subscription裡面。可以透過az account list
來取得所有account的subscription,裡面的id
值$RESOURCE_GROUP_NAME
要建立的resource group名稱- 目前建立是放在東南亞(southeastasia),如果要換地方可以改這裏
4. 建立會產生vm的Service Principal
這個一樣使用az來建立,可以透過以下指令:
az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP_NAME}"
執行完了之後會返回這個service principal的appid以及secret:
這個值要記錄好,appid
以及password
等一下設定檔案會用到。
5. 修改acs-engine的檔案
以上準備工作就做的差不多了,接下來就是下載範例設定檔案并且做一些修改。範例檔案可以從 :src/kubernetes-vmss.json 取得
裡面{}
包住的地方是一定要調整的:
dnsPrefix
,對應的key是change
:這個用來設定master服務的dns名稱,因此一定是一個沒有人有用過的名稱keyData
,對應的key是ssh-rsk 開頭的public key
:這個輸入上面第2步取得的ssh public keyclientId
,對應的key是{ad 的client id}
:輸入第4步取得的app id
secret
,對應的key是{{ad 的密碼}}
:輸入第4步取得的password
用設定檔案產生出以及發佈ARM template
取得了上面的檔案之後,可以透過指令:
acs-engine.exe generate kubernetes-vmss.json
執行完了之後,會產生出一個資料夾叫做:./_output/${DNS_PREFIX}/
- 這個DNS_PREFIX就是之前在設定檔案裡面的dnsPrefix
值。
裡面的内容就是ARM template。
發佈ARM Template
有了template了之後,可以透過以下指令把他發佈到Azure上面:
$DNS_PREFIX = ""
az group deployment create `
--name "atk8sacsenginevmssdeploy" `
--resource-group "${RESOURCE_GROUP_NAME}" `
--template-file "./_output/${DNS_PREFIX}/azuredeploy.json" `
--parameters "./_output/${DNS_PREFIX}/azuredeploy.parameters.json"
記得要設定$DNS_PREFIX
和範本裡面的dnsPrefix
一樣。
稍等一會可以透過以下指令檢查vm有沒有建立出來:
az vm list -g ${RESOURCE_GROUP_NAME} -o table
最後的結果也可以到Azure上面看:
結語
這篇介紹了k8s的基本概念,并且使用了acs-engine在azure上面建立出k8s的cluster。
在下一篇(下篇)將介紹怎麽使用,并且k8s和azure整合的體驗是如何。