1. 程式人生 > >azure k8s netcore 程式初次部署

azure k8s netcore 程式初次部署

以下都是我在2018年12月份做的實驗,今天才釋出出來。

念想

首先是瞭解一些關於K8s的一些基礎概念,推薦檢視一下這個連結,非常適合入門k8s。是因為K8S的環境搭建比較複雜(最主要是懶),其實也有比較簡單的方式,有一些本地單例部署的方式,如Minikube以及Kubeadm-dind。但是為了更快的瞭解k8s,所以選擇了雲平臺,在查看了一些國外分享的連結之後,準備開始使用azure的。

開始使用Azure

初次使用Azure,Azure首頁就有大大的標題寫明瞭可以試用一個月以及200$的額度。沒有使用國內的Azure,直接在azure的官網註冊並使用了,用的visa信用卡,說是扣1$用來驗證信用卡,後面會退還,但是不知道為啥現在還沒有退給我,還有不知道為什麼扣了我10塊錢,懶得糾結了,就放在那了。註冊通過之後後面可以通過訪問 portal.azure.com 進入控制檯,按照上面的連結,開始下面的一步步操作;

準備步驟

Azure CLI

KubeCtl

docker for windows(我是在Windows操作的)

安裝Azure CLI很簡單,按照官網的教程就可以。

KubeCtl稍微折騰了一下,其實是我沒怎麼注意,根據官網的也就可以了,我的系統是Windows 10,不過由於是閹割版,powershell的版本是4.0,按照第一個方式操作Powershell的PSGallery,發現不可以執行Install-Script命令,被迫捨棄。換了另一個方式,使用Chocolatey下載並配置KubeCtl,執行kubectl version命令發現可以正常執行。

docker for windows的安裝也是很簡單的,直接去官網下載執行就可以,可能需要設定一下環境變數;

建立ACR

Azure Container Registry (ACR)就是一個docker的倉庫中心,類似於docker hub,ACR的建立可以參考上面分享的國外連結,很簡單;

建立AKS

這一步非常重要,也是我耗時最久的一個地方,被坑的最大的一個地方是因為我總是想著用離國內較近的區域(Location),我選擇的區域基本上都是日本西部,但是AKS的資源組區域目前還不支援日本西部,目前只支援eastus, westeurope, centralus, canadacentral, canadaeast這些區域(參考連結),按照上面分享的國外連結去操作之後總會提示部署失敗,報錯的詳情是

{"code":"DeploymentFailed","message":"至少一個資源部署操作失敗。請列出部署操作顯示詳細資訊。有關用法詳細資訊,請參閱 https://aka.ms/arm-debug。","details":[{"code":"BadRequest","message":"{\r\n \"error\": {\r\n \"code\": \"BadRequest\",\r\n \"message\": \"The Service Principal in ServicePrincipalProfile could not be validated. Please see https://aka.ms/acs-sp-help for more details. (The client 'guid' with object id 'guid' does not have authorization to perform action 'Microsoft.Authorization/roleAssignments/read' over scope '/subscriptions/guid/resourceGroups/dotnetTryAcsCluster/providers/Microsoft.Authorization'.)\"\r\n }\r\n}"}]}

在UI環境操作了很多次每次都是報上面的錯誤(微軟的官方教程我也試了),經驗告訴我,這條路肯定走不下去了,於是我拋棄了上面的分享連結的教程。再次老老實實看一下微軟的官方教程,這一次我選擇的是使用CLI去建立,不再使用UI介面,一步步操作下去,終於看到了部署成功後的JSON,非常開心。之後按照教程下載憑證然後在本地操作aks;

docker 部署

docker映象我也是偷懶使用了netcore官方的示例,clone下來之後按照readme生成aspnetapp映象,生成之後可以通過命令列(docker images)檢視。再次根據國外分享的連結,對這個映象打兩個標籤(其實只要打一個標籤,或者不打標籤,他多打一個標籤是為了證明acr中docker的分層儲存的UnionFS功能,打標籤是為了讓你能區分版本號),打好標籤再次按照教程所述去acr獲取你要上傳倉庫的密碼,然後上傳即可,之後的操作基本上都是按照教程操作下去,不過也有一些要注意的。

注意點

教程上寫的k8s的本地UI連結為:http://127.0.0.1:8001/ui ,實際上這個連結開啟之後根本看不見什麼東西,只有

Error: 'tls: oversized record received with length 20527'
Trying to reach: 'https://10.244.0.6:9090/'

這麼一個報錯,真正可用的連結是 http://localhost:8001/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy

後記

想繼續操作實現持續部署的功能,大概為以下步驟:

  1. docker 重新build已經編譯好的程式碼(或者有CI工具生成),並且打個tag(例如aspnetapp:3),推送到acr;
  2. 結合國外分享的教程以及微軟官網的,重新部署的時候,修改Deploy.xml中的image引數,修改為對應的映象tag,接著根據微軟的教程,使用kubectl get pod,檢視執行中的pod,接著準備執行以下指令
kubectl set image deployment azure-vote-front azure-vote-front=<acrLoginServer>/azure-vote-front:v2

這裡面有個與我部署的地方有個不一樣的地方,他這裡預設的deployments.extensions的名字和container的名字是一致的,然而我的不一樣,這時候需要仔細的檢視一下Deploy.xml中的引數了,我這邊的deployments.extensions的名字是aspnetapp-deployment,container的名字是aspnetapp,所以我的執行命令是這樣的:

kubectl set image deployment aspnetapp-deployment aspnetapp=<acrLoginServer>/azure-vote-front:v2

使用命令記錄

給映象打標籤
docker tag aspnetapp dotnettryacr.azurecr.io/myservice/aspnetapp:1

推送docker映象
docker push dotnettryacr.azurecr.io/myservice/aspnetapp:3

docker登入acr
docker login dotnettryacr.azurecr.io -u dotnettryacr -p awhdXW6nZa6EUjxPNLbLsUrjJQM30wK+

kubectl連線到aks cluster
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

如果有自定義的secret-key
az acs kubernetes get-credentials –resource-group=pascalnaberacs –name=myacscluster –ssh-key-file “C:\blogpost\opensshprivatekey”

aks連線acr
kubectl create secret docker-registry acrconnection —docker-server=https://dotnettryacr.azurecr.io —docker-username=dotnettryacr —docker-password=awhdXW6nZa6EUjxPNLbLsUrjJQM30wK+ —[email protected]

ask連線acr方式2

獲取aks服務主體的clientid
az aks show --resource-group myResourceGroup --name myAKSCluster --query "servicePrincipalProfile.clientId" --output tsv

獲取acr的資源ID(acrID)
az acr show --name <acrName> --resource-group myResourceGroup --query "id" --output tsv

建立aks和acr之間的連線
az role assignment create --assignee <clientID> --role Reader --scope <acrID>