Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[tool]用acs-engine在azure透過VMSS建立出kubernetes (k8s) 自動延展的cluster - 上篇

2018-06-30 Saturday
[tool]用acs-engine在azure透過VMSS建立出kubernetes (k8s) 自動延展的cluster - 上篇.jpg
圖片來源:https://pixabay.com/en/key-tag-security-label-symbol-2114047/

最近有機會接觸到要用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來説需要知道:

wikipedia取得的架構圖
Master
整個k8s的大腦,用來管理整個node設定。
Node
實際執行工作的節點,一般來説一臺電腦就是一個node。裡面有kubelet專門和master溝通。
pod
在k8s裡面最小的執行單位。可以簡單理解成一個container服務(實際上可以有好多個container組成一個pod,不過以這篇來説不用想的太複雜)
services
在圖裏面沒有畫的很明顯,不過因爲等一下demo會做到因此介紹一下。services可以理解成爲load balancer,想象一下如果我有同樣服務起了多個pod,怎麽和這些pod溝通?使用到的就是service,因此簡單理解 成爲load balancer即可。

題外話,k8s這個架構有沒有覺得很眼熟?如果之前有follow我的[data science 到底是什麼從一個完全外行角度來看]系列,應該會記得有一篇在介紹Hadoop的cluster ([07]更深入看看Hadoop裡面的YARN和HDFS)的時候提到了NameNode以及DataNode。是不是從概念角度和k8s的Master和Node一樣的概念?

微軟現在非常擁抱開源,尤其是在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小檔案

  1. 有支援的container orchestration:DC/OS、kubernetes、OpenShift、Swarm Mode以及Swarm
  2. github專案位置:https://github.com/Azure/acs-engine
  3. 一些參考的範例:https://github.com/Azure/acs-engine/tree/master/examples
  4. 工具下載位置:https://github.com/Azure/acs-engine/releases
  5. Windows x64直接下載地址:https://github.com/Azure/acs-engine/releases/download/v0.19.0/acs-engine-v0.19.0-windows-amd64.zip
  6. 最新版本: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的檔案需要先做一點前置作業:

  1. 取得acs-engine的範例檔案
  2. 產生出ssh的public key
  3. 建立服務的ResourceGroup
  4. 建立會產生vm的Service Principal
  5. 修改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}換成上面取得的内容。

如果對於ssh部分不瞭解,可以參考我之前的一篇: 何謂ssh?在Windows下如何使用ssh?如何在Windows透過ssh下載和上傳程式到github?

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),如果要換地方可以改這裏

以上的指令可以在github看到:src/prepare-config/01-prepare-config.ps1

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等一下設定檔案會用到。

以上的指令可以在github看到:src/prepare-config/01-prepare-config.ps1

5. 修改acs-engine的檔案

以上準備工作就做的差不多了,接下來就是下載範例設定檔案并且做一些修改。範例檔案可以從 :src/kubernetes-vmss.json 取得

裡面{}包住的地方是一定要調整的:

  1. dnsPrefix,對應的key是change:這個用來設定master服務的dns名稱,因此一定是一個沒有人有用過的名稱
  2. keyData,對應的key是ssh-rsk 開頭的public key:這個輸入上面第2步取得的ssh public key
  3. clientId,對應的key是{ad 的client id}:輸入第4步取得的app id
  4. secret,對應的key是{{ad 的密碼}}:輸入第4步取得的password

用設定檔案產生出以及發佈ARM template

取得了上面的檔案之後,可以透過指令:

acs-engine.exe generate kubernetes-vmss.json
		

執行完了之後,會產生出一個資料夾叫做:./_output/${DNS_PREFIX}/ - 這個DNS_PREFIX就是之前在設定檔案裡面的dnsPrefix值。

裡面的内容就是ARM template。

以上的指令可以在github看到:src/prepare-config/02-generate-arm.ps1

發佈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上面看:


產生完的結果

以上的指令可以在github看到:src/prepare-config/03-deploy-arm.ps1
以上的整個指令整合在一起可以在github看到:src/prepare-config/00-all-together.ps1

結語

這篇介紹了k8s的基本概念,并且使用了acs-engine在azure上面建立出k8s的cluster。

在下一篇(下篇)將介紹怎麽使用,并且k8s和azure整合的體驗是如何。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
2018-06-30 Saturday
comments powered by Disqus