将微服务部署到 Azure Kubernetes 服务 (AKS) 实践

介绍

本文的目的是:通过使用 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 账户(https://azure.microsoft.com/free/dotnet/)』

注册时需要填写姓名、邮箱、手机号、信用卡等一些个人信息,注册成功后扣除了 $1,然后赠送了 $200 一个月的信用额度供免费试用。

安装 Azure CLI

Azure Command Line Interface(CLI)提供了用于管理 Azure 帐户的工具。

安装 Azure CLI 的步骤,请查看 『安装 Azure CLI for Windows(https://docs.microsoft.com/cli/azure/install-azure-cli-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(https://kubernetes.io/)是一个容器编排平台。编排器负责运行、分发、缩放和修复由容器集合组成的应用程序。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: 1template:metadata:labels:app: mymicroservicespec:containers:- name: mymicroserviceimage: [YOUR DOCKER ID]/mymicroservice:latestports:- containerPort: 80env:- name: ASPNETCORE_URLSvalue: http://*:80selector:matchLabels:app: mymicroservice
---
apiVersion: v1
kind: Service
metadata:name: mymicroservice
spec:type: LoadBalancerports:- port: 80selector: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 容器注册表(https://azure.microsoft.com/zh-cn/services/container-registry/)替代 Docker Hub 管理镜像。

Azure 虽好,但在国内使用,网络问题难以解决,大大影响使用感受!

在微服务和 DevOps 普及的时代,越来越多的大厂服务商提供了对 Kubernetes 的支持,Azure 的 “Azure Kubernetes 服务 (AKS) ”和“Azure 容器注册表”,国内有阿里云的“阿里云容器服务 Kubernetes 版(ACK)”和“阿里云容器镜像服务(ACR)” 对标,另外腾讯云和华为云也提供了云容器引擎服务。

参考文献及一些相关产品和文档

  • Azure(https://azure.microsoft.com/)

  • Deploy a microservice to Azure(https://dotnet.microsoft.com/learn/aspnet/deploy-microservice-tutorial/intro)

  • 在 Windows 上安装 Azure CLI(https://docs.microsoft.com/zh-cn/cli/azure/install-azure-cli-windows)

  • Azure CLI 入门(https://docs.microsoft.com/zh-cn/cli/azure/get-started-with-azure-cli)

  • Overview of Azure Cloud Shell(https://docs.microsoft.com/en-us/azure/cloud-shell/overview)

  • Azure Kubernetes 服务 (AKS) 文档(https://docs.microsoft.com/zh-cn/azure/aks/)

  • Azure 容器注册表(https://azure.microsoft.com/zh-cn/services/container-registry/)

  • 阿里云容器服务 Kubernetes 版 ACK(Alibaba Cloud Container Service for Kubernetes)(https://www.aliyun.com/product/kubernetes)

  • 阿里云容器镜像服务 ACR(Alibaba Cloud Container Registry)(https://www.aliyun.com/product/acr),即:阿里云容器注册表,这个产品目前我们正在使用,pull push 速度都是比较快的,国内还是用这个速度快点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 515. 在每个树行中找最大值(层序遍历06)

一:题目 二&#xff1a;上码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(n…

前端只是切图仔?来学学给开发人看的UI设计

给开发人看的UI设计&#x1f5bc;️序言&#x1f3a8; 一、背景1. 想做一个好的作品2. 没有专业UI&#x1f9f5;二、功能导向1. 设计中最重要的事2. 例子阐述2. 简约设计3. 设计简单的、完整的功能&#x1f9f6;三、设计原则1. 层级&#xff08;1&#xff09;层级是什么&#x…

Debian 新负责人发表演讲:Debian 的现状与面临的一些问题

喜欢就关注我们吧&#xff01;Debian GNU/Linux 年度主要的会议 DebConf20 已于近期举办&#xff0c;4 月份新当选的 Debian 项目负责人 Jonathan Carter 在会上发表了演讲&#xff0c;概述了 Debian 的现状与面临的一些问题。Debian 的财务稳定在 $896065 美元左右&#xff0c…

leetcode116. 填充每个节点的下一个右侧节点指针(层序遍历07)

一:题目 二:上码 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}Node(int _val, Node* _left,…

程序员修神之路--略懂数据库集群读写分离而已

“灵魂拷问&#xff1a;解决数据库读写瓶颈有哪些解决方案呢&#xff1f;这些方案解决了什么问题呢&#xff1f;这些方案有那些优势和劣势呢&#xff1f;一个可以抵抗高并发流量系统的背后必定有一个高性能的数据库集群&#xff0c;就像每一个成功的男人背后总有一个强势的女人…

一张网页带你了解中秋节的前世今生

一张网页带你了解中秋节的前世今生&#x1f317;序言一、&#x1f319;题材选取1. 诗词赏析2. 原型图抢先看3. 界面设计二、&#x1f31b;编码阶段1. 项目目录结构2. html设计&#xff08;1&#xff09;nav结构设计&#xff08;2&#xff09;banner结构设计&#xff08;3&#…

leetcode117. 填充每个节点的下一个右侧节点指针 II(层序遍历08)

一&#xff1a;题目 二&#xff1a;上码 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}Node(…

Linq 下的扩展方法太少了,您期待的 MoreLinq 来啦

一&#xff1a;背景 1. 讲故事前几天看同事在用 linq 给内存中的两个 model 做左连接&#xff0c;用过的朋友都知道&#xff0c;你一定少不了一个叫做 DefaultIfEmpty 函数&#xff0c;这玩意吧&#xff0c;本来很流畅的 from...in...join, 突然搞进来这么一个函数&#xff0c;…

紧跟月影大佬的步伐,一起来学习如何写好JS(上)

如何写好JS - 三大原则&#x1f302;序言一、☂️什么才是好的JS代码&#xff1f;二、&#x1f9f5; 写好JS的一些原则1. 各司其职&#x1f44b;&#xff08;1&#xff09;定义&#xff08;2&#xff09;例子阐述2. 组件封装&#x1f90f;&#xff08;1&#xff09;定义&#x…

leetcode104. 二叉树的最大深度(层序遍历09)

一:题目 二:上码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*…

.NET Core 集成JWT认证

JWT(Json web token)就不用过多的介绍了&#xff0c;在 .NET Core 开发中使用JWT进行认证也是比较常见的&#xff0c;而且接入过程也比较简单&#xff0c;随便配置配置就好了。要想使用JWT&#xff0c;仅仅只需要在项目中引用微软的一个认证组件。Install-Package Microsoft.As…

leetcode111. 二叉树的最小深度(层序遍历10)

一:题目 二&#xff1a;上码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(n…

拥抱.NET 5,可以从这个极速开发的Web应用框架开始

今年年初&#xff0c;微软 .NET 程序管理总监 Scott 在博客中表示&#xff0c;发布 .NET 5 的首个预览版&#xff0c;并提供SDK 和运行库下载。Scott 表示&#xff0c;.NET 5 是 .NET Framework 和 .NET Core 的未来&#xff0c;最终将成为一个统一平台&#xff0c;.NET5 将包含…

组件库实战 | 教你如何设计Web世界中的表单验证

教你如何设计Web世界中的表单验证&#x1f4ac;序言&#x1f5ef;️一、验证输入框ValidateInput1. 设计稿抢先知2. 简单的实现3. 抽象验证规则4. v-model5. 使用$attrs支持默认属性&#x1f4ad;二、验证表单ValidateForm1. 组件需求分析2. 使用插槽 slot3. 父子组件通讯&…

leetcode101. 对称二叉树(两种做法)

一&#xff1a;题目 二&#xff1a;上码 方法一&#xff1a;队列 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int …

微服务架构下的测试策略

源宝导读&#xff1a;最近几年&#xff0c;微服务架构越来越火爆&#xff0c;逐渐被企业所采用。随着软件架构的变化&#xff0c;对应的软件测试策略需要作何调整呢&#xff1f;本文将介绍云客在微服务架构下的测试策略。一、云客测试策略模型策略分析行业内的测试策略是一个先…

leetcode222. 完全二叉树的节点个数(两种做法)

一&#xff1a;题目 二&#xff1a;今天不上菜 上码了 方法一&#xff1a;前序遍历 求解 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr)…

听红宝书译者谈Web视角下的前端开发

Web视角下的前端开发⏳序言⏰一、关于前端开发1. 起源、架构、变迁&#xff08;1&#xff09;起源&#xff08;2&#xff09;架构&#xff08;3&#xff09;变迁2. 前端应用的领域&#xff08;1&#xff09;所面向群体&#xff08;2&#xff09;所面向领域3. 语言、框架、工具4…

在家办公这半年,让我开始热爱生活

距离上次更新公众号已经过去一年多了&#xff0c;感觉自己成了“年更姚”。不过好在这个公众号的读者大多是同事朋友&#xff08;加起来也没有多少好么喂&#xff09;&#xff0c;本身对我也没用太高的期待吧。今天想聊聊远程工作这件事。不过我并不想聊团队成员之间如何远程协…

每天都在红绿灯前面梭行,不如自己来实现个红绿灯?

用js实现一个交通灯&#x1f507;前言&#x1f508;一、需求分析 - 交通灯&#x1f509;二、实现版本1. 版本一&#xff1a;简单粗暴版2. 版本二&#xff1a;数据抽象版3. 版本三&#xff1a;过程抽象版4. 版本四&#xff1a;命令式和声明式&#x1f50a;三、在线online&#x…