将微服务部署到 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 账号,可以到 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 速度都是比较快的,国内还是用这个速度快点。
作者 : 技术译民
出品 : 技术译站
将微服务部署到 Azure Kubernetes 服务 (AKS) 实践的更多相关文章
- 用集装箱装ASP。带有Docker和Azure Kubernetes服务的NET Core应用程序
介绍 曾经有一个单一软件应用程序的时代,整个应用程序被打包并部署在作为单个进程运行的单个服务器上.我们都知道,在这个模型中,单点故障可能会导致整个应用程序崩溃. 微服务体系结构的发展是为了解决单片应用 ...
- Azure Kubernetes 服务 (AKS)
一.首先创建集群 1,注意:一定要选择Kubernets Service(红框处),上面的那一堆虚拟机都没有用, 2,设置好相关属性,集群大小可后面更改节点数,但是节点的大小不可更改 二.登陆集群 在 ...
- hype-v上centos7部署高可用kubernetes集群实践
概述 在上一篇中已经实践了 非高可用的bubernetes集群的实践 普通的k8s集群当work node 故障时是高可用的,但是master node故障时将会发生灾难,因为k8s api serv ...
- ASP.NET Core在Azure Kubernetes Service中的部署和管理
目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...
- Azure Kubernetes(AKS)部署及查看应用资源
简介 上一篇文章讲解了如何使用Azure DevOps持续部署应用到Azure Kubernetes上.但是部署是否成功?会不会遇到什么问题?项目运行中是否会出现问题?我们该怎么样查看这些问题,并且对 ...
- Windows Azure文件共享服务--File Service
部署在Windows Azure上的虚拟机之间如何共享文件?例如:Web Server A和Web Server B组成负载均衡集群,两个服务器需要一个共享目录来存储用户上传的文件.通常,大家可能首先 ...
- Microsoft Azure File 服务简介
我们非常高兴地宣布在微软Azure中国区推出 Microsoft Azure File 服务预览版.Azure File 服务使用标准 SMB 2.1 协议提供文件共享.Azure 中运行的应用程序现 ...
- 利用VisualVM监测Azure云服务中的Java应用
在做Java开发的时候,我们需要在上线之前对程序进行压力测试,对程序的性能进行全面的监控,了解JVM的CPU,内存,GC,classes,线程等等信息,或者在程序上线运行的过程当中以便于诊断问题或者对 ...
- Azure认知服务的实际应用-资讯采集推送
Azure认知服务的实际应用-资讯采集推送 演示 实现的是通过使用各种azure服务,每天自动获取资讯.博客,定时推送到公众号的功能! 微信公众号搜索TechViews,或直接扫描二维码关注,每天推送 ...
随机推荐
- C#LeetCode刷题-极小化极大
极小化极大篇 # 题名 刷题 通过率 难度 375 猜数字大小 II 23.4% 中等 464 我能赢吗 25.5% 中等 486 预测赢家 40.4% 中等 843 猜猜这个单词 2 ...
- C#LeetCode刷题之#225-用队列实现栈(Implement Stack using Queues)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4106 访问. 使用队列实现栈的下列操作: push(x) -- ...
- C#LeetCode刷题之#788-旋转数字(Rotated Digits)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3967 访问. 我们称一个数 X 为好数, 如果它的每位数字逐个地 ...
- 写给程序员的机器学习入门 (八 补充) - 使用 GPU 训练模型
在之前的文章中我训练模型都是使用的 CPU,因为家中黄脸婆不允许我浪费钱买电脑.终于的,附近一个废品回收站的朋友转让给我一台破烂旧电脑,所以我现在可以体验使用 GPU 训练模型了
- Name jms can't bind to context问题解决
需要把gis-datamanage包中的配置test改成compile
- 地图绘制之basemap第一弹 basemap选择与安装
作为一个测绘GIS专业的学生,会有很多绘制地图的需求,一般情况使用ArcGIS.QGIS就可以解决,但是在绘制如论文插图时需要使用更加专业可定制化程度更高的工具,专业传统一般使用GMT,几经比较,最终 ...
- win7蓝牙连接手机蓝牙
今天有个需求,需要win7 PC连接手机蓝牙,并发送文件到手机端.在此记录下过程. 准备: win7 电脑主机. CSR 蓝牙dongle. 手机 1. 打开蓝牙服务 方法:打开控制面板,找到“管理工 ...
- http请求工作流程
一.HTTP工作原理 HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.HTTP协议采用了请求/响应模型.客户端向服务器发送一个请求报文,请求报文包 ...
- Java 8新特性(三):Optional类
在上一篇介绍Stream流式数据处理的文章中提到了Optional类,这是Java 8新增的一个类,用以解决程序中常见的NullPointerException异常问题.本篇文章将详细介绍Option ...
- SpringSecurity权限管理系统实战—九、数据权限的配置
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...