使用acs-engine在Azure中国区部署kubernetes集群详解
1. acs-engine簡介
ACS是微軟在2015年12月推出的一項基于容器的云端PaaS服務(wù)。說簡單點(diǎn),acs-engine就是一個ARM模板生成器,用戶只需要配置幾個簡單的參數(shù)來描述容器集群的規(guī)格,然后acs-engine將這個容器集群描述文件轉(zhuǎn)化成一組ARM(Azure Resource Manager)模板,然后用戶可以使用azure的cli命令來自動化地在Azure公有云上生成容器集群。
ACS完全基于開源組件,目前ACS支持主流的編排框架有:DC/OS,Swarm,Kubernetes。acs-engine也已經(jīng)在GitHub上開源(https://github.com/azure/acs-engine),企業(yè)可以在任何的云平臺使用并遷移這套容器服務(wù),避免了對某個平臺的耦合。有興趣的朋友可以下載嘗試。
目前有人說無法在中國區(qū)使用acs-engine,甚至微軟的員工也對我們說無法使用,但是實(shí)測acs-engine可以在中國區(qū)部署k8s集群了,下面將對部署過程進(jìn)行詳細(xì)介紹。至于k8s集群這里先不進(jìn)行詳細(xì)介紹,請參考其他資料,后續(xù)我也將介紹一些關(guān)于k8s的相關(guān)內(nèi)容。
?
?2. acs-engine部署
環(huán)境: CentOS7,acs-enginev0.8.0
1. 首先獲取acs-engine源碼包,由于官方已經(jīng)提供編譯好的acs-engine,所以懶人可以直接下載解壓,不用通過源碼編譯。但是源碼包中包含了模板文件,建議一起下載:
# wget https://github.com/Azure/acs-engine/releases/download/v0.8.0/acs-engine-v0.8.0-linux-amd64.zip# wget https://github.com/Azure/acs-engine/archive/v0.8.0.zip2. 安裝依賴軟件:
# yum install golang# yum install git
3. 運(yùn)行g(shù)o get all命令安裝ACS引擎需要的依賴組件
4. 解壓源碼包和編譯好的acs-engine:
# cd ~# unzip acs-engine-v0.8.0-linux-amd64.zip# unzip v0.8.0.zip5. 運(yùn)行acs-engine命令:
?View Code
?
3. Kubernetes集群搭建
由于目前acs-engine源碼中已經(jīng)加入了Azure中國區(qū),所以我們無需修改源碼,只需要在第三步編輯集群定義文件時中指定微軟云中國區(qū),acs-engine會在生成的ARM模板中將Kubernetes的鏡像源替換成國內(nèi)可以訪問的地址。
Ⅰ. 集群說明
我創(chuàng)建的是1個master節(jié)點(diǎn)2個node節(jié)點(diǎn)的集群,創(chuàng)建后的集群架構(gòu)如下:
使用ARM模板創(chuàng)建的集群會在Azure中為master節(jié)點(diǎn)創(chuàng)建LoadBalancer,而至于node節(jié)點(diǎn),則會在當(dāng)你在k8s中將一個服務(wù)的訪問方式設(shè)置為LoadBalancer后,k8s集群會訪問Azure的API為node節(jié)點(diǎn)創(chuàng)建一個LoadBalancer,并且添加上Public IP,k8s集群服務(wù)訪問方式這里暫不詳細(xì)說明。
?
Ⅱ. 生成SSH密鑰
? 創(chuàng)建的k8s集群默認(rèn)是通過SSH密鑰登錄的,因此我們要首先生成SSH密鑰,這里只做Linux舉例,windows/mac請自行查閱相關(guān)資料。
# mkdir ~/.ssh# chmod 700 ~/.ssh# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/b/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/b/.ssh/id_rsa. Your public key has been saved in /home/b/.ssh/id_rsa.pub.
?
Ⅲ. 創(chuàng)建服務(wù)主體賬號密碼
k8s集群需要能夠訪問你的微軟云并創(chuàng)建刪除相關(guān)資源,因此需要給k8s集群配置服務(wù)主體賬號密碼。你可以選擇Azure CLI、Powershell、或者在Portal中直接創(chuàng)建,當(dāng)然,你的Azure賬號必須有應(yīng)用程序注冊的權(quán)限。這里介紹下Azure CLI和Portal中創(chuàng)建的方式。
1> Azure CLI 2.0
# az cloud set -n AzureChinaCloud # az login# az account set --subscription="${SUBSCRIPTION_ID}"#az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/${SUBSCRIPTION_ID}"
? 之后你將得到一個json格式的tenant賬號密碼等信息:?(需要注意的是以上命令生成的密碼有效期只有一年,而Azure應(yīng)用程序賬號密碼有效期可以選擇一年/三年/永久,需要指定密碼有效期要在后面加 --years 參數(shù)。你可以在Portal - Azure Active Directory - 應(yīng)用程序注冊 中找到名字為以下displayName的賬號)
{ ? ? "appId": "xxxxx-xxxxxxx-xxxxxxx-xxxxxx-xxxxxx", ?? "displayName": "azure-cli-2017-10-13-08-20-35", ? ?
? "name": "http://azure-cli-2017-10-13-08-20-35", ? ?
? "password": "87ads6f7s6d7f87ad6sf78a6s7df7asf", ?
? ? "tenant": "xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxxx"
? ? }
你可以登錄來驗(yàn)證下你的應(yīng)用程序賬號:
# az login --service-principal -u NAME -p PASSWORD --tenant TENANT # az vm list-sizes --location chinaeast?
2> Portal
?
Ⅳ. 編輯集群定義文件
在你下載的源碼包中有最簡單的集群定義文件舉例,文件位置在 examples/kubernetes.json,修改這個文件以滿足你的集群要求,關(guān)于集群定義文件詳細(xì)信息請參考官方說明,這里給出我使用的配置舉例:
? #這里一定要指定location為中國區(qū),否則生成的ARM模板中k8s鏡像的地址為azureedge域名的地址,國內(nèi)無法訪問。"properties": {"orchestratorProfile": {"orchestratorType": "Kubernetes","kubernetesConfig": {"clusterSubnet": "10.244.0.0/16", ? #pod使用的地址空間"dnsServiceIP": "10.4.0.10", ? ? ? ?"serviceCidr": "10.4.0.0/16" ? ? ? ?#service使用的地址空間}},"masterProfile": { #master節(jié)點(diǎn)配置"count": 1, ? ? ?#master主機(jī)數(shù)量"dnsPrefix": "k8s-preproduction", ? ?
? #生成的k8s集群可以通過dnsPrefix.chinaeast.cloudapp.chinacloudapi.cn來訪問 ?
? ? ?"vnetSubnetID": "/subscriptions/xxxxxxxxxxx/resourceGroups/Pre-Production/providers/Microsoft.Network/virtualNetworks/XXXVNET/subnets/default", ? #指定部署到現(xiàn)有的subnet,否則會生成一個新的subnet"firstConsecutiveStaticIP": "10.0.0.7", ? #master的起始IP"storageProfile": "ManagedDisks", ? ? ? ? #指定使用托管磁盤"distro": "ubuntu", ? ? ? ? ? ? ? ? ? ? ? #使用ubuntu鏡像,對于k8s集群,acs-engine目前只支持ubuntu鏡像。對于Swarm集群可以指定rhel鏡像"vmSize": "Standard_DS2_v2" ? ? ? ? ? ? ? #虛擬機(jī)規(guī)模},"agentPoolProfiles": [ ? ?#node節(jié)點(diǎn)配置{"name": "preagpool1","count": 2,"vmSize": "Standard_DS2_v2","vnetSubnetID": "/subscriptions/xxxxxxxxxxx/resourceGroups/Pre-Production/providers/Microsoft.Network/virtualNetworks/XXXVNET/subnets/default","storageProfile": "ManagedDisks", ? ? ? #node節(jié)點(diǎn)默認(rèn)不使用托管磁盤,需要使用這里必須指定"distro": "ubuntu","availabilityProfile": "AvailabilitySet"}],"linuxProfile": {"adminUsername": "sshuser","ssh": {"publicKeys": [ ? #這里給出步驟Ⅰ生成的ssh密鑰{"keyData": "ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx sshuser@acs-engine-test"}]}},"servicePrincipalProfile": { ? #這里給步驟Ⅱ生成的appID和password"clientId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx","secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}} }
?
?Ⅴ. 生成ARM模板
使用剛編輯好的kubernetes.json作為輸入?yún)?shù),執(zhí)行以下命令生成ARM模板:
# acs-engine generate examples/kubernetes.json生成的模板位于_output/"dnsPrefix"路徑下,將會生成3個或者多個類似如下的模板:
apimodel.json?- 集群配置文件
azuredeploy.json?- 核心的ARM (Azure Resource Model)模板,用來部署k8s集群
azuredeploy.parameters.json?- 部署參數(shù)文件,其中的參數(shù)可以自定義
certificate and access config files?- kubernetes需要的一些證書,這些證書文件和它依賴的kube config配置文件也存放在和ARM模板同級目錄下面
需要注意的是,當(dāng)修改已有的Docker容器集群的時候,應(yīng)該修改apimodel.json文件來保證最新的部署不會影響到目前集群中已有的資源。舉個例子,如果一個容器集群中的節(jié)點(diǎn)數(shù)量不夠的時候,可以修改apimodel.json中的集群節(jié)點(diǎn)數(shù)量,然后重新運(yùn)行acs-engine命令并將apimodel.json作為輸入?yún)?shù)來生成新的ARM模板。這樣部署以后,集群中的舊的節(jié)點(diǎn)就不會有變化,新的節(jié)點(diǎn)會自動加入。
? 可以看到apimodel以及parameters文件中k8s的鏡像地址已經(jīng)換成crproxy.trafficmanager.net,這個地址國內(nèi)可以訪問的到,這里我們還需要修改parameters件中的兩個參數(shù):
?
?
Ⅵ. 部署ARM模板
? 1> Azure CLI 2.0
?--name "<RESOURCE_GROUP_NAME>" \
?? ?--location "<LOCATION>"$ az group deployment create \ ?
?? ? ?--name "<DEPLOYMENT NAME>" \ ?
?? ? ? ?--resource-group "<RESOURCE_GROUP_NAME>" \ ?
?? ? ? ??--template-file "./_output/<INSTANCE>/azuredeploy.json" \ ?
?? ? ? ?? ?--parameters "./_output/<INSTANCE>/azuredeploy.parameters.json"
?
2> Powershell
?-Name <RESOURCE_GROUP_NAME> ` ?
? ?-Location <LOCATION>New-AzureRmResourceGroupDeployment `
? ?? ?-Name <DEPLOYMENT_NAME> ` ?
? ?? ? ?-ResourceGroupName <RESOURCE_GROUP_NAME> ` ?
? ?? ? ? ?-TemplateFile _output\<INSTANCE>\azuredeploy.json ` ?
? ?? ? ? ? ?-TemplateParameterFile _output\<INSTANCE>\azuredeploy.parameters.json
?
不出意外你將在resource group里看到k8s集群被創(chuàng)建起來,在部署中可以看到詳細(xì)部署的進(jìn)度:
?
Ⅶ. 創(chuàng)建一個測試服務(wù)
? 1> 使用SSH密鑰通過master IP或者FQDN連接到k8s集群中
? 2> 查看集群狀態(tài),正常的話node都應(yīng)該為ready狀態(tài),pods為running
# kubectl get nodes # kubectl get pods --all-namespaces?
3> 創(chuàng)建一個nginx deployment,成功后你將看到一個running的nginx pod
# kubectl run nginx --image nginx# kubectl get pods -o yaml
# curl curl 10.244.1.4 (pod IP)
?
?
4> 創(chuàng)建nginx服務(wù)
# kubectl expose deployment nginx --port=80# kubectl get service# curl 10.0.105.199 (service IP)
?
? 5> 設(shè)置服務(wù)可以通過外部訪問
k8s的服務(wù)外部訪問方式有LoadBalancer、NodePort、Ingress,這里暫不進(jìn)行過多贅述,我們使用LoadBalancer方式。
# kubectl edit svc nginx? 將type從ClusterIP改為LoadBalancer,保存退出。之后k8s集群將會自動為node節(jié)點(diǎn)創(chuàng)建一個Azure LoadBalancer和一個public IP
?
6> 訪問服務(wù)
當(dāng)EXTERNAL-IP從Pending狀態(tài)變?yōu)橐粋€public IP時,則可以通過瀏覽器進(jìn)行服務(wù)訪問了。
# kubectl get svc
?
至此,通過acs-engine搭建k8s集群結(jié)束。?
?
官方鏈接:
https://github.com/Azure/acs-engine
原文地址:http://www.cnblogs.com/wayneiscoming/p/7649642.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的使用acs-engine在Azure中国区部署kubernetes集群详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HttpClient的性能隐患
- 下一篇: Lyft的TypeScript实践