本文是对 《.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 速度都是比较快的,国内仍是用这个速度快点。
做者 : 技术译民
出品 : 技术译站