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

本文是對 《.NET Tutorial – Deploy a microservice to Azure》 的翻譯和實踐。入門級踩坑實踐,k8s 大佬請迴避,以免耽誤您寶貴的時間。

介紹

本文的目的是:通過使用 DockerHub 和 Azure Kubernetes Service (AKS) 將之前 使用 .NET 和 Docker 構建的微服務 部署到微軟 Azure 雲上,來介紹微服務的基本部署過程。

推送到 Docker Hub

Docker Hub 是世界上最大的容器鏡像庫和社區。許多產品,包括微軟 Azure,都可以基於 Docker Hub 中的鏡像創建容器。

登錄 Docker Hub

如果還沒有 Docker Hub 賬號,可以到 //hub.docker.com/ 註冊一個, 註冊步驟可以參考 Docker 快速入門(三) 中的說明。

在命令提示符窗口,運行以下命令:

docker login

輸入您的 Docker ID 和密碼,如果輸出如下錯誤:

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to //hub.docker.com to create one.
Username:xxxxxx
Password:
Error response from daemon: Get //registry-1.docker.io/v2/: net/http: TLS handshake timeout

表示登錄超時,可以嘗試設置首選 DNS 服務器為 8.8.8.8(Google 提供的免費 DNS),命令行修改 DNS 的命令為:

# 使用時請將 "WLAN" 改為實際的本地鏈接名稱,需要以管理員身份運行命令提示符窗口
netsh interface ip set dnsservers "WLAN" static 8.8.8.8 primary

然後再次登錄,若輸出 Login Succeeded,表示登錄成功了。

將鏡像推送到 Docker Hub

根據您的 Docker ID 重新標記(重命名)您的 Docker 鏡像,並使用以下命令將其推送到 Docker Hub:

docker tag mymicroservice [YOUR DOCKER ID]/mymicroservice
docker push [YOUR DOCKER ID]/mymicroservice

等待推送完成,在 Docker Hub 中訪問您的倉庫 //hub.docker.com/repositories,可以看到剛推送的鏡像,如下圖:

docker-hub-mymicroservice

鏡像完成推送後,如果前面有修改過 DNS,務必將 DNS 地址改回原來的動態獲取,不然可能會影響網絡訪問速度:

# 使用時請將 "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 賬戶

註冊時需要填寫姓名、郵箱、手機號、信用卡等一些個人信息,註冊成功後扣除了 $1,然後贈送了 $200 一個月的信用額度供免費試用。

安裝 Azure CLI

Azure Command Line Interface(CLI)提供了用於管理 Azure 帳戶的工具。

安裝 Azure CLI 的步驟,請查看 『安裝 Azure CLI for Windows

如果從官網下載 Azure CLI 比較慢,可以到這裡下載:
鏈接://pan.baidu.com/s/1FZhkAFX2o4GRCqSWYmYvmA 提取碼:fi8x

安裝完成後,打開一個新的命令提示符窗口,運行 az --version 命令檢驗是否安裝成功。

登錄 Azure

在命令提示符中運行 az login 命令登錄您的 Azure 賬戶:

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 是一個容器編排平台。編排器負責運行、分發、縮放和修復由容器集合組成的應用程序。Azure Kubernetes Service (AKS) 將 Kubernetes 作為一個託管服務提供。

運行以下命令為 AKS 安裝命令行工具。

az aks install-cli

然而,這條命令重試了很多次始終因網絡問題而執行失敗,最後放棄在本機安裝 AKS CLI,直接使用線上 Azure Cloud Shell,關於 Azure Cloud Shell 請參考文檔://docs.microsoft.com/en-us/azure/cloud-shell/overview

在 Azure Portal 中打開 Azure Cloud Shell 的方法是:
Azure Cloud Shell

創建 Azure 資源

創建資源組

資源組是用於組織與單個應用程序相關的一組資源。

在本機命令提示符窗口中運行下面命令創建一個資源組:

az group create --name myMicroserviceResources --location eastasia

執行結果如下:

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

使用 Azure Cloud Shell 創建 AKS 集群

使用 Azure Cloud Shell 運行下面命令在資源組中創建一個 AKS 集群:

此命令通常需要等待幾分鐘才能完成。

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

使用 Azure Cloud Shell 運行以下命令下載要部署到 AKS 集群的憑證:

az aks get-credentials --resource-group myMicroserviceResources --name myMicroserviceCluster

部署到 Azure

與 Kubernetes 一樣,AKS 使用 .yaml 文件來定義如何部署容器。

使用 Azure Cloud Shell 創建部署文件

azure-cloud-shell-vim-yaml

在 Azure Portal 中打開 Azure Cloud Shell 窗口, 運行 cd clouddrive 命令打開 clouddrive 目錄,

運行下面的命令創建一個空的 deploy-myMicroservice.yaml 文件:

echo . > deploy-myMicroservice.yaml

然後運行 vim deploy-myMicroservice.yaml 命令編輯 deploy-myMicroservice.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: //*: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

運行部署

在 Azure Cloud Shell 中定位到 clouddrive 目錄,運行下面的命令,根據 deploy-helloMicroservice.yaml 中的設置進行部署:

kubectl apply -f deploy-myMicroservice.yaml

測試已部署的服務

在 Azure Cloud Shell 中運行以下命令查看已部署服務的詳細信息:

kubectl get service mymicroservice --watch

azure-cloud-shell-kubectl-apply

另外,前面的 kubectl get service 命令會顯示服務可用的外部 IP 地址(EXTERNAL-IP)。

使用這個外部 IP 地址,在瀏覽器中瀏覽『//[YOUR EXTERNAL IP ADDRESS]/WeatherForecast』。

如果 EXTERNAL-IP 標記為 <pending>,則在分配了外部 IP 之後,將會自動出現一個新行來顯示。

服務縮放

運行以下命令將服務擴展到兩個實例:

kubectl scale --replicas=2 deployment/mymicroservice
# 輸出如下信息:
deployment.apps/mymicroservice scaled

Good Job!現在已將微服務部署到 Azure,並進行了縮放。

總結

操作體驗:Docker Hub,慢!Azure,慢! 一頓操作猛如虎,步履蹣跚慢如牛,而且還是只蝸牛。

可以用 Azure 容器註冊表 替代 Docker Hub 管理鏡像。

Azure 雖好,但在國內使用,網絡問題難以解決,大大影響使用感受!

在微服務和 DevOps 普及的時代,越來越多的大廠服務商提供了對 Kubernetes 的支持,Azure 的 「Azure Kubernetes 服務 (AKS) 」和「Azure 容器註冊表」,國內有阿里雲的「阿里雲容器服務 Kubernetes 版(ACK)」和「阿里雲容器鏡像服務(ACR)」 對標,另外騰訊雲和華為雲也提供了雲容器引擎服務。

參考文獻及一些相關產品和文檔

作者 : 技術譯民
出品 : 技術譯站