本文是對 《.NET Tutorial - Deploy a microservice to Azure》 的翻譯和實踐。入門級踩坑實踐,k8s 大佬請回避,以避免耽誤您寶貴的時間。html
本文的目的是:經過使用 DockerHub 和 Azure Kubernetes Service (AKS) 將以前 使用 .NET 和 Docker 構建的微服務 部署到微軟 Azure 雲上,來介紹微服務的基本部署過程。node
Docker Hub 是世界上最大的容器鏡像庫和社區。許多產品,包括微軟 Azure,均可以基於 Docker Hub 中的鏡像建立容器。web
若是尚未 Docker Hub 帳號,能夠到 https://hub.docker.com/ 註冊一個, 註冊步驟能夠參考 Docker 快速入門(三) 中的說明。docker
在命令提示符窗口,運行如下命令:shell
docker login
輸入您的 Docker ID 和密碼,若是輸出以下錯誤:vim
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 的命令爲:windows
# 使用時請將 "WLAN" 改成實際的本地連接名稱,須要以管理員身份運行命令提示符窗口 netsh interface ip set dnsservers "WLAN" static 8.8.8.8 primary
而後再次登陸,若輸出 Login Succeeded
,表示登陸成功了。api
根據您的 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,能夠看到剛推送的鏡像,以下圖:bash
鏡像完成推送後,若是前面有修改過 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 帳戶』
註冊時須要填寫姓名、郵箱、手機號、信用卡等一些我的信息,註冊成功後扣除了 $1,而後贈送了 $200 一個月的信用額度供免費試用。
Azure Command Line Interface(CLI)提供了用於管理 Azure 賬戶的工具。
安裝 Azure CLI 的步驟,請查看 『安裝 Azure CLI for Windows』
若是從官網下載 Azure CLI 比較慢,能夠到這裏下載:
連接:https://pan.baidu.com/s/1FZhkAFX2o4GRCqSWYmYvmA 提取碼:fi8x
安裝完成後,打開一個新的命令提示符窗口,運行 az --version
命令檢驗是否安裝成功。
在命令提示符中運行 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" } } ]
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 的方法是:
資源組是用於組織與單個應用程序相關的一組資源。
在本機命令提示符窗口中運行下面命令建立一個資源組:
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 集羣:
此命令一般須要等待幾分鐘才能完成。
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
與 Kubernetes 同樣,AKS 使用 .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: 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 速度都是比較快的,國內仍是用這個速度快點。
做者 : 技術譯民
出品 : 技術譯站