本文是對 《.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 賬號,可以到 https://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 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 的命令為:
# 使用時請將 "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 中訪問您的倉庫 https://hub.docker.com/repositories,可以看到剛推送的映象,如下圖:
映象完成推送後,如果前面有修改過 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 比較慢,可以到這裡下載:
連結:https://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": "xxxxxx@163.com",
"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 請參考文件:https://docs.microsoft.com/en-us/azure/cloud-shell/overview
在 Azure Portal 中開啟 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” 檢視:
使用 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 叢集資源組和一個網路觀察資源組:
使用 Azure Cloud Shell 執行以下命令下載要部署到 AKS 叢集的憑證:
az aks get-credentials --resource-group myMicroserviceResources --name myMicroserviceCluster
部署到 Azure
與 Kubernetes 一樣,AKS 使用 .yaml
檔案來定義如何部署容器。
使用 Azure Cloud Shell 建立部署檔案
在 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: 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
檔案,如圖:
執行部署
在 Azure Cloud Shell 中定位到 clouddrive
目錄,執行下面的命令,根據 deploy-helloMicroservice.yaml
中的設定進行部署:
kubectl apply -f deploy-myMicroservice.yaml
測試已部署的服務
在 Azure Cloud Shell 中執行以下命令檢視已部署服務的詳細資訊:
kubectl get service mymicroservice --watch
另外,前面的 kubectl get service
命令會顯示服務可用的外部 IP 地址(EXTERNAL-IP
)。
使用這個外部 IP 地址,在瀏覽器中瀏覽『http://[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)” 對標,另外騰訊雲和華為雲也提供了雲容器引擎服務。
參考文獻及一些相關產品和文件
-
阿里雲容器服務 Kubernetes 版 ACK(Alibaba Cloud Container Service for Kubernetes)
-
阿里雲容器映象服務 ACR(Alibaba Cloud Container Registry),即:阿里雲容器登錄檔,這個產品目前我們正在使用,pull push 速度都是比較快的,國內還是用這個速度快點。
作者 : 技術譯民
出品 : 技術譯站