1. 程式人生 > >將微服務部署到 Azure Kubernetes 服務 (AKS) 實踐

將微服務部署到 Azure Kubernetes 服務 (AKS) 實踐

> 本文是對 [《.NET Tutorial - Deploy a microservice to Azure》](https://dotnet.microsoft.com/learn/aspnet/deploy-microservice-tutorial/intro) 的翻譯和實踐。入門級踩坑實踐,k8s 大佬請回避,以免浪費您寶貴的時間。 ## 介紹 本文的目的是:通過使用 DockerHub 和 Azure Kubernetes Service (AKS) 將之前 [使用 .NET 和 Docker 構建的微服務](https://mp.weixin.qq.com/s/Sia9QEOERGAah_SJ5s3pNQ) 部署到微軟 Azure 雲上,來介紹微服務的基本部署過程。 ## 推送到 Docker Hub Docker Hub 是世界上最大的容器映象庫和社群。許多產品,包括微軟 Azure,都可以基於 Docker Hub 中的映象建立容器。 ### 登入 Docker Hub > 如果還沒有 Docker Hub 賬號,可以到 [https://hub.docker.com/](https://hub.docker.com/) 註冊一個, 註冊步驟可以參考 [Docker 快速入門(三)](https://www.cnblogs.com/ittranslator/p/13215081.html) 中的說明。 在命令提示符視窗,執行以下命令: ```bash docker login ``` 輸入您的 **Docker ID** 和密碼,如果輸出如下錯誤: ```bash Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username:xxxxxx Password: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout ``` 表示登入超時,可以嘗試設定首選 DNS 伺服器為 `8.8.8.8`(Google 提供的免費 DNS),命令列修改 DNS 的命令為: ```bash # 使用時請將 "WLAN" 改為實際的本地連結名稱,需要以管理員身份執行命令提示符視窗 netsh interface ip set dnsservers "WLAN" static 8.8.8.8 primary ``` 然後再次登入,若輸出 `Login Succeeded`,表示登入成功了。 ### 將映象推送到 Docker Hub 根據您的 Docker ID 重新標記(重新命名)您的 Docker 映象,並使用以下命令將其推送到 Docker Hub: ```bash docker tag mymicroservice [YOUR DOCKER ID]/mymicroservice docker push [YOUR DOCKER ID]/mymicroservice ``` 等待推送完成,在 Docker Hub 中訪問您的倉庫 [https://hub.docker.com/repositories](https://hub.docker.com/repositories),可以看到剛推送的映象,如下圖: ![docker-hub-mymicroservice](https://img2020.cnblogs.com/blog/2074831/202009/2074831-20200913012100417-1611534318.png#center) 映象完成推送後,如果前面有修改過 DNS,務必將 DNS 地址改回原來的動態獲取,不然可能會影響網路訪問速度: ```bash # 使用時請將 "WLAN" 改為實際的本地連線名稱,需要以管理員身份執行命令提示符視窗 # 改為動態獲取 DNS 地址 netsh interface ip set dnsservers "WLAN" source=dhcp # 或者將 DNS 改為 114.114.114.114(國內移動、電信和聯通通用的DNS) netsh interface ip set dnsservers "WLAN" static 114.114.114.114 primary # 還可以新增第二個 DNS 地址 netsh interface ip add dnsservers "WLAN" 8.8.8.8 index=2 ``` ## 安裝 Azure 工具 ### 建立 Azure 賬戶 如果您是 Azure 雲的新手,可以建立一個免費帳戶。如果您有一個現有的帳戶,可以跳過這一步。 建立賬戶的步驟,請檢視 『[建立免費 Azure 賬戶](https://azure.microsoft.com/free/dotnet/?utm_source=dotnet-website&utm_medium=page&utm_campaign=dotnet-banner)』 > 註冊時需要填寫姓名、郵箱、手機號、信用卡等一些個人資訊,註冊成功後扣除了 $1,然後贈送了 $200 一個月的信用額度供免費試用。 ### 安裝 Azure CLI Azure Command Line Interface(CLI)提供了用於管理 Azure 帳戶的工具。 安裝 Azure CLI 的步驟,請檢視 『[安裝 Azure CLI for Windows](https://docs.microsoft.com/cli/azure/install-azure-cli-windows?view=azure-cli-latest)』 > 如果從官網下載 Azure CLI 比較慢,可以到這裡下載: > 連結:[https://pan.baidu.com/s/1FZhkAFX2o4GRCqSWYmYvmA](https://pan.baidu.com/s/1FZhkAFX2o4GRCqSWYmYvmA) 提取碼:fi8x 安裝完成後,開啟一個**新的**命令提示符視窗,執行 `az --version` 命令檢驗是否安裝成功。 ### 登入 Azure 在命令提示符中執行 `az login` 命令登入您的 Azure 賬戶: ```bash C:\WINDOWS\system32>az login # 會提示彈出一個登入網頁,登入成功後輸出如下資訊: You have logged in. Now let us find all the subscriptions to which you have access... [ { "cloudName": "AzureCloud", "homeTenantId": "7cfff80b-cb8f-461f-8bb4-19bd80xxxxxx", "id": "0123237e-4c5e-4eb5-a4cc-205b0cxxxxxx", "isDefault": true, "managedByTenants": [], "name": "免費試用", "state": "Enabled", "tenantId": "7cfff80b-cb8f-461f-8bb4-19bd80xxxxxx", "user": { "name": "[email protected]", "type": "user" } } ] ``` ### 安裝 AKS CLI 失敗!使用線上 Azure Cloud Shell 替代 [`Kubernetes`](https://kubernetes.io/) 是一個容器編排平臺。編排器負責執行、分發、縮放和修復由容器集合組成的應用程式。`Azure Kubernetes Service` (`AKS`) 將 `Kubernetes` 作為一個託管服務提供。 執行以下命令為 AKS 安裝命令列工具。 ```bash az aks install-cli ``` > 然而,這條命令重試了很多次始終因網路問題而執行失敗,最後放棄在本機安裝 AKS CLI,直接使用線上 Azure Cloud Shell,關於 Azure Cloud Shell 請參考文件:[https://docs.microsoft.com/en-us/azure/cloud-shell/overview](https://docs.microsoft.com/en-us/azure/cloud-shell/overview) 在 Azure Portal 中開啟 Azure Cloud Shell 的方法是: ![Azure Cloud Shell](https://img2020.cnblogs.com/blog/2074831/202009/2074831-20200913012157505-2000041275.png#center) ## 建立 Azure 資源 ### 建立資源組 資源組是用於組織與單個應用程式相關的一組資源。 在本機命令提示符視窗中執行下面命令建立一個資源組: ```bash az group create --name myMicroserviceResources --location eastasia ``` 執行結果如下: ```bash C:\Users\xxx>az group create --name myMicroserviceResources --location eastasia { "id": "/subscriptions/0123237e-4c5e-4eb5-a4cc-205b0cxxxxxx/resourceGroups/myMicroserviceResources", "location": "eastasia", "managedBy": null, "name": "myMicroserviceResources", "properties": { "provisioningState": "Succeeded" }, "tags": null, "type": "Microsoft.Resources/resourceGroups" } ``` 執行完,在 Azure Portal 中點選 “Resource groups” 檢視: ![portal-azure-resource-groups](https://img2020.cnblogs.com/blog/2074831/202009/2074831-20200913012249381-1325272991.png#center) ### 使用 Azure Cloud Shell 建立 AKS 叢集 使用 Azure Cloud Shell 執行下面命令在資源組中建立一個 AKS 叢集: > 此命令通常需要等待幾分鐘才能完成。 ```bash az aks create --resource-group myMicroserviceResources --name myMicroserviceCluster --node-count 1 --enable-addons http_application_routing --generate-ssh-keys ``` 執行完成後,檢視資源組列表,可以看到多了一個 AKS 叢集資源組和一個網路觀察資源組: ![portal-azure-resource-groups-aks](https://img2020.cnblogs.com/blog/2074831/202009/2074831-20200913012338773-1989501431.png#center) 使用 Azure Cloud Shell 執行以下命令下載要部署到 AKS 叢集的憑證: ```bash az aks get-credentials --resource-group myMicroserviceResources --name myMicroserviceCluster ``` ## 部署到 Azure 與 Kubernetes 一樣,AKS 使用 `.yaml` 檔案來定義如何部署容器。 ### 使用 Azure Cloud Shell 建立部署檔案 ![azure-cloud-shell-vim-yaml](https://img2020.cnblogs.com/blog/2074831/202009/2074831-20200913012422350-122200153.png#center) 在 Azure Portal 中開啟 Azure Cloud Shell 視窗, 執行 `cd clouddrive` 命令開啟 `clouddrive` 目錄, 執行下面的命令建立一個空的 `deploy-myMicroservice.yaml` 檔案: ```bash echo . > deploy-myMicroservice.yaml ``` 然後執行 `vim deploy-myMicroservice.yaml` 命令編輯 `deploy-myMicroservice.yaml` 檔案,將內容替換為以下內容: ```yaml --- apiVersion: apps/v1 kind: Deployment metadata: name: mymicroservice spec: replicas: 1 template: metadata: labels: app: mymicroservice spec: containers: - name: mymicroservice image: [YOUR DOCKER ID]/mymicroservice:latest ports: - containerPort: 80 env: - name: ASPNETCORE_URLS value: http://*:80 selector: matchLabels: app: mymicroservice --- apiVersion: v1 kind: Service metadata: name: mymicroservice spec: type: LoadBalancer ports: - port: 80 selector: app: mymicroservice ``` 按 `Esc` 鍵再輸入 `:wq` 儲存並退出 `vim` 命令。 此時開啟 “cloud-shell-storage-southeastasia” 資源組,可以看到裡面多了一個 `deploy-myMicroservice.yaml` 檔案,如圖: ![cloud-shell-storage-file](https://img2020.cnblogs.com/blog/2074831/202009/2074831-20200913012502477-1929315670.png#center) ### 執行部署 在 Azure Cloud Shell 中定位到 `clouddrive` 目錄,執行下面的命令,根據 `deploy-helloMicroservice.yaml` 中的設定進行部署: ```bash kubectl apply -f deploy-myMicroservice.yaml ``` ### 測試已部署的服務 在 Azure Cloud Shell 中執行以下命令檢視已部署服務的詳細資訊: ```bash kubectl get service mymicroservice --watch ``` ![azure-cloud-shell-kubectl-apply](https://img2020.cnblogs.com/blog/2074831/202009/2074831-20200913012537841-828542179.png#center) 另外,前面的 `kubectl get service` 命令會顯示服務可用的外部 IP 地址(`EXTERNAL-IP`)。 使用這個外部 IP 地址,在瀏覽器中瀏覽『`http://[YOUR EXTERNAL IP ADDRESS]/WeatherForecast`』。 > 如果 `EXTERNAL-IP` 標