Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 記錄軟體開發的點點滴滴 著重於微軟技術、網頁開發、DevOps、C#, Asp .net Mvc、Azure、AI、Chatbot、Docker、Data Science

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

2018-06-30 星期六
[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
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
2018-06-30 星期六
comments powered by Disqus