探索云服务中的Kubernetes:AKS与GKE实践指南
1. 告别EKS,转向AKS
在完成EKS相关操作后,我们可以按以下步骤清理资源:
1. 在“Delete animals - stack”确认对话框中,选择“Delete stack”。
2. 删除创建的IAM角色:
- 打开IAM控制台:https://console.aws.amazon.com/iam/。
- 在左侧导航窗格中,选择“Roles”。
- 从列表中选择创建的每个角色(如myAmazonEKSClusterRole、AmazonEKSFargatePodExecutionRole或myAmazonEKSNodeRole),选择“Delete”,输入所需的确认文本,然后再次选择“Delete”。
- 也可参考AWS文档中“Step 5: Delete resources”部分的步骤:https://docs.aws.amazon.com/eks/latest/userguide/getting - started - console.html。
接下来,我们将探索微软Azure提供的容器服务,尤其是基于Kubernetes的AKS服务。
2. 微软Azure容器服务概述
微软在Azure上提供了多种与容器相关的服务:
-
Azure Container Instances
:这是最容易使用的服务,它能在不配置虚拟机(VM)和不采用更高级别服务的情况下,在Azure中快速、简单地运行容器。适用于在托管环境中运行单个容器。操作步骤如下:
- 在Azure门户(https://portal.azure.com)中,创建一个新的资源组。
- 创建Azure容器实例,只需填写一个简短的表单,包括容器名称、使用的镜像和要打开的端口。容器可以通过公共或私有IP地址访问,并且在崩溃时会自动重启,还有一个不错的管理控制台用于监控CPU和内存等资源消耗。
-
Azure Container Service (ACS)
:该服务简化了预配置为运行容器化应用程序的虚拟机集群的创建、配置和管理。它使用Docker镜像,并提供三种编排器供选择:Kubernetes、Docker Swarm和分布式云操作系统(DC/OS,由Apache Mesos提供支持)。微软声称该服务可扩展到数万个容器,且ACS免费,仅收取计算资源费用。
3. AKS:基于Kubernetes的热门选择
AKS(Azure Kubernetes Service)可在https://azure.microsoft.com/en - us/services/kubernetes - service/ 找到,它使你能轻松在云端部署应用程序并在Kubernetes上运行。微软处理所有困难和繁琐的管理任务,你可以专注于应用程序本身,无需处理安装和管理Kubernetes、升级Kubernetes或升级底层Kubernetes节点的操作系统等任务,也无需与etcd或Kubernetes主节点打交道,只需与运行应用程序的Kubernetes工作节点交互。
4. 准备Azure CLI
假设你已创建Azure免费试用账户或使用现有账户,我们将使用运行在本地计算机上的Azure CLI。为了遵循容器化的原则,我们选择在本地Docker Desktop的容器中运行Azure CLI:
1. 从Docker Hub拉取最新版本的Azure CLI:
$ docker image pull mcr.microsoft.com/azure-cli:latest
- 由于该容器未安装Docker客户端,我们需要创建一个包含Docker客户端的自定义镜像。所需的Dockerfile内容如下:
FROM mcr.microsoft.com/azure-cli:latest
RUN apk update && apk add docker
- 使用Docker Compose构建和运行这个自定义镜像,对应的docker - compose.yml文件如下:
version: "2.4"
services:
az:
image: fundamentalsofdocker/azure-cli
build: .
command: tail -F anything
working_dir: /app
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- .:/app
-
注意:
tail -F anything命令用于保持容器运行,同时用于挂载Docker套接字和当前文件夹。如果你在Windows上运行Docker Desktop,需要定义COMPOSE_CONVERT_WINDOWS_PATHS环境变量,从Bash shell使用export COMPOSE_CONVERT_WINDOWS_PATHS = 1,或在运行PowerShell时使用$Env:COMPOSE_CONVERT_WINDOWS_PATHS = 1,更多详情请参考:https://github.com/docker/compose/issues/4240。 - 构建并运行容器:
$ docker compose up --build -d
-
进入
az容器并运行Bash shell:
$ docker compose exec az /bin/bash
- 检查CLI版本:
# az --version
输出示例如下:
azure-cli 2.49.0
core 2.49.0
telemetry 1.0.8
Dependencies:
msal 1.20.0
azure-mgmt-resource 22.0.0
Python location '/usr/local/bin/python'
Extensions directory '/root/.azure/cliextensions'
Python (Linux) 3.10.11 (main, May 11 2023, 23:59:31) [GCC 12.2.1 20220924]
Legal docs and information: aka.ms/AzureCliLegal
Your CLI is up - to - date.
- 登录Azure账户:
# az login
按照提示,使用Web浏览器打开页面https://microsoft.com/devicelogin ,输入代码进行身份验证。成功验证后,终端将显示登录信息:
[
{
"cloudName": "AzureCloud",
"id": "<id>",
"isDefault": true,
"name": "<account name>",
"state": "Enabled",
"tenantId": "<tenant - it>",
"user": {
"name": <your - email>,
"type": "user"
}
}
]
5. 在Azure上创建容器注册表
为了确保生产环境中能自由下载容器镜像,我们需要在Azure上创建一个容器注册表:
1. 创建一个名为
animal - rg
的新资源组:
- 列出所有可用区域:
# az account list - locations
输出示例:
[
{
"displayName": "East Asia",
"id": "/subscriptions/186760.../locations/eastasia",
"latitude": "22.267",
"longitude": "114.188",
"name": "eastasia",
"subscriptionId": null
},
...
]
选择一个靠近你的区域,如
westeurope
。
- 创建资源组:
# az group create --name animals - rg --location westeurope
确保输出显示
"provisioningState": "Succeeded"
。
2. 创建Azure容器注册表(ACR):
# az acr create --resource - group animals - rg \
--name <acr - name> --sku Basic
<acr - name>
需要唯一,例如
gnsanimalsacr
。创建成功后,登录到该注册表:
# az acr login --name <acr - name>
响应应为
Login Succeeded
。
6. 将镜像推送到ACR
登录到ACR后,我们可以对镜像进行标记并推送到注册表:
1. 标记镜像:
# docker image tag fundamentalsofdocker/ch11 - db:2.0 \
<acr - name>.azurecr.io/db:2.0
# docker image tag fundamentalsofdocker/ch11 - web:2.0 \
<acr - name>.azurecr.io/web:2.0
- 推送镜像:
# docker image push <acr - name>.azurecr.io/db:2.0
# docker image push <acr - name>.azurecr.io/web:2.0
- 验证镜像是否已推送:
# az acr repository list --name <acr - name> --output table
输出示例:
| Result |
| ------ |
| Db |
| web |
7. 创建Kubernetes集群
使用自定义的Azure CLI在Docker容器中创建Kubernetes集群,确保集群能够访问存储容器镜像的ACR实例:
# az aks create \
--resource - group animals - rg \
--name animals - cluster \
--node - count 2 \
--generate - ssh - keys \
--attach - acr <acr - name>
该命令需要一些时间,完成后将收到包含新集群详细信息的JSON格式输出。
8. 访问集群
为了访问集群,我们需要安装
kubectl
:
# az aks install - cli
获取访问集群所需的凭证:
# az aks get - credentials --resource - group animals - rg \
--name animals - cluster
响应应为
Merged "animals - cluster" as current context in /root/.kube/config
。
9. 列出集群节点
安装
kubectl
并获取凭证后,我们可以列出集群中的所有节点:
# kubectl get nodes
输出示例:
| NAME | STATUS | ROLES | AGE | VERSION |
| ------------------------------- | ------ | ----- | ---- | ------- |
| aks - nodepool1 - 12528297 - vmss000000 | Ready | agent | 4m38s | v1.25.68 |
| aks - nodepool1 - 12528297 - vmss000001 | Ready | agent | 4m32s | v1.25.68 |
10. 部署应用到Kubernetes集群
使用
kubectl apply
命令部署应用:
# kubectl apply - f animals.yaml
输出示例:
deployment.apps/web created
service/web created
deployment.apps/db created
service/db created
11. 测试应用
由于为Web组件创建了LoadBalancer类型的服务,我们可以观察该服务分配公共IP地址的过程:
# kubectl get service web --watch
初始输出:
NAME TYPE CLUSTER - IP EXTERNAL - IP PORT(S) AGE
web LoadBalancer 10.0.38.189 <pending> 3000:32127/TCP 5s
几分钟后,公共IP地址分配完成:
NAME TYPE CLUSTER - IP EXTERNAL - IP PORT(S) AGE
web LoadBalancer 10.0.38.189 20.76.160.79 3000:32127/TCP 5m
在浏览器中访问
http://20.76.160.79:3000/pet
,即可看到应用。
12. 清理资源
实验完成后,为避免产生不必要的费用,我们可以删除资源组:
# az group delete --name animal - rg --yes --no - wait
需要注意的是,删除资源组时,AKS集群使用的Azure Active Directory(AAD)服务主体不会被删除,可参考https://learn.microsoft.com/en - us/powershell/module/azuread/remove - azureadserviceprincipal?view = azureadps - 2.0 了解如何删除服务主体。
13. 探索Google GKE
Google是Kubernetes的发明者和主要推动力量,其GKE服务也很有吸引力。以下是使用GKE的步骤:
1. 拥有Google Cloud账户或创建测试账户:https://console.cloud.google.com/freetrial 。
2. 在主菜单中,选择“Kubernetes Engine”,首次选择时,Kubernetes引擎需要一些时间初始化。
3. 创建一个新项目,命名为“massai - mara”。
4. 创建集群:
- 在弹出窗口中,点击“Create Cluster”。
- 在“Cluster basics”选项卡中,输入集群名称“animals - cluster”,选择离你最近的区域,如“europe - west1”,然后点击“NEXT: NETWORKING”。
- 保持所有设置为默认值,依次点击“NEXT: ADVANCED SETTINGS”和“NEXT: REVIEW AND CREATE”。
- 审核集群设置,确认无误后,点击“CREATE CLUSTER”。
5. 集群创建完成后,点击视图右上角的shell图标打开Cloud Shell。
6. 克隆GitHub仓库:
$ git clone https://github.com/PacktPublishing/The - Ultimate - Docker - Container - Book.git ~/src
- 切换到示例解决方案所在的文件夹:
$ cd ~/src/sample - solutions/ch18/gce
-
查看
animals.yaml文件:
$ less animals.yaml
该文件与之前使用的文件内容基本相同,但有两个区别:
- 使用LoadBalancer类型的服务公开Web组件。
- 不使用卷来配置PostgreSQL数据库,因为在GKE上正确配置StatefulSet比在Minikube或Docker Desktop等产品中更复杂,这意味着如果db Pod崩溃,动物应用程序将不会保留状态。
9. 设置
gcloud
和
kubectl
凭证:
$ gcloud container clusters \
get - credentials animals - cluster --zone <zone>
将
<zone>
替换为创建集群时选择的区域。
10. 列出集群节点:
$ kubectl get nodes
可以看到创建了两个节点,Kubernetes版本为v1.25.8。
11. 部署应用:
$ kubectl apply - f animals.yaml
- 观察LoadBalancer服务分配公共IP地址的过程:
$ kubectl get svc/web --watch
初始输出:
NAME TYPE CLUSTER - IP EXTERNAL - IP PORT(S) AGE
web LoadBalancer 10.57.129.72 <pending> 3000: 32384/TCP 32s
几分钟后:
NAME TYPE CLUSTER - IP EXTERNAL - IP PORT(S) AGE
web LoadBalancer 10. 57.129.72 35.195.160.243 3000: 32384/TCP 39s
按
Ctrl + C
退出
--watch
命令。
13. 使用分配的公共IP地址访问应用:
http://35.195.160.243:3000/pet
。
14. 实验完成后,清理资源:
- 删除集群:
$ gcloud container clusters delete animals - cluster
也可以从Web门户进行操作。
- 列出所有项目:
$ gcloud projects list
- 删除之前创建的项目:
$ gcloud projects delete <project - id>
从
<project - id>
中获取正确的值。
通过以上步骤,我们分别在Azure AKS和Google GKE上成功部署了Kubernetes集群和应用,并且了解了如何清理资源,避免不必要的费用。不同的云服务提供商都有各自的特点和优势,你可以根据实际需求进行选择。
探索云服务中的Kubernetes:AKS与GKE实践指南
14. AKS与GKE的操作流程对比
为了更清晰地对比在AKS和GKE上部署应用的操作流程,下面以表格形式呈现:
| 操作步骤 | AKS | GKE |
| — | — | — |
| 账户准备 | 创建Azure免费试用账户或使用现有账户 | 拥有Google Cloud账户或创建测试账户 |
| 工具准备 | 拉取Azure CLI镜像,创建含Docker客户端的自定义镜像,使用Docker Compose构建运行 | 利用GKE门户的Cloud Shell |
| 资源组/项目创建 | 创建名为
animal - rg
的资源组 | 创建名为“massai - mara”的项目 |
| 容器注册表 | 创建ACR并登录,标记推送镜像 | 可创建Google Container Registry,示例中直接从Docker Hub拉取 |
| 集群创建 | 使用
az aks create
命令创建集群 | 在GKE门户创建集群 |
| 访问凭证获取 | 使用
az aks get - credentials
获取凭证 | 使用
gcloud container clusters get - credentials
获取凭证 |
| 应用部署 | 使用
kubectl apply - f animals.yaml
部署 | 同样使用
kubectl apply - f animals.yaml
部署 |
| 资源清理 | 删除资源组
az group delete --name animal - rg
| 删除集群和项目
gcloud container clusters delete
和
gcloud projects delete
|
15. 技术点分析
-
AKS的优势
:
- 管理简化 :微软处理了Kubernetes的安装、升级等复杂管理任务,用户可专注于应用开发。
-
集成方便
:通过
--attach - acr参数,能轻松让集群访问ACR实例,方便镜像管理。
-
GKE的优势
:
- 技术领先 :Google作为Kubernetes的发明者,GKE能及时跟进Kubernetes的最新特性。
- 操作便捷 :提供Cloud Shell,方便用户在浏览器中直接进行操作。
16. 操作流程的mermaid流程图
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B{选择云服务提供商}:::decision
B -->|AKS| C(准备Azure账户):::process
B -->|GKE| D(准备Google Cloud账户):::process
C --> E(准备Azure CLI):::process
D --> F(打开GKE Cloud Shell):::process
E --> G(创建资源组):::process
F --> H(创建项目):::process
G --> I(创建ACR并登录):::process
H --> J(可创建GCR或直接拉取镜像):::process
I --> K(标记并推送镜像到ACR):::process
J --> L(拉取镜像):::process
K --> M(创建Kubernetes集群):::process
L --> N(创建Kubernetes集群):::process
M --> O(获取集群访问凭证):::process
N --> P(获取集群访问凭证):::process
O --> Q(部署应用):::process
P --> Q(部署应用):::process
Q --> R(测试应用):::process
R --> S(清理资源):::process
S --> T([结束]):::startend
17. 总结与建议
通过在AKS和GKE上的实践操作,我们可以看到两者都提供了便捷的Kubernetes托管服务。如果你更倾向于微软生态,习惯使用Azure的相关工具和服务,那么AKS是一个不错的选择,它能让你在熟悉的环境中高效部署应用。而如果你追求Kubernetes的最新技术和Google强大的技术支持,GKE会更适合你,其Cloud Shell的使用也为操作带来了便利。
在实际应用中,建议根据项目的具体需求、团队的技术栈以及成本等因素综合考虑选择合适的云服务提供商。同时,无论选择哪种服务,都要注意及时清理不再使用的资源,避免产生不必要的费用。
希望以上内容能帮助你更好地理解在AKS和GKE上部署Kubernetes应用的流程和技术要点,让你在云服务的选择和使用上更加得心应手。
超级会员免费看
79

被折叠的 条评论
为什么被折叠?



