在云端运行容器化应用程序
1. 引言
在当今数字化时代,容器化应用程序的部署和管理变得越来越重要。本文将介绍在云端运行容器化应用程序的三种流行方式,包括选择托管 Kubernetes 服务的原因,以及如何在 Amazon EKS、Microsoft AKS 和 Google GKE 上运行简单的容器化应用程序。
2. 技术要求
- 拥有 Amazon Web Services (AWS)、Microsoft Azure 和 Google Cloud 的账户。若没有,可申请试用账户。
- 使用 GitHub 仓库中
~/The-Ultimate-Docker-Container-Book/sample-solutions/ch18文件夹下的文件。 - 准备存放自己代码的文件夹,操作步骤如下:
bash $ cd ~/The-Ultimate-Docker-Container-Book $ mkdir ch18 && cd ch18
3. 为何选择托管 Kubernetes 服务
目前,AWS、Microsoft Azure 和 Google Cloud 这三大云提供商都提供托管 Kubernetes 服务:
| 云提供商 | 服务名称 | 特点 |
| ---- | ---- | ---- |
| AWS | Amazon EKS | 无需安装、操作和维护自己的 Kubernetes 控制平面或节点,即可在 AWS 上轻松运行 Kubernetes。 |
| Microsoft | AKS | 具有持续集成和持续部署 (CI/CD) 功能以及 Kubernetes 工具集成,还有 Azure DevOps 项目提供完整的容器 CI/CD 平台。 |
| Google | GKE | 谷歌是 Kubernetes 的原始创造者,GKE 是市场上首个托管 Kubernetes 服务,提供高级集群管理功能,并与 Google Cloud 服务集成。 |
其他提供商如 IBM Cloud Kubernetes Service、Oracle Container Engine for Kubernetes 和 DigitalOcean Kubernetes (DOKS) 也提供 Kubernetes 即服务 (KaaS)。由于云市场发展迅速,建议查看最新的服务和功能。
使用托管 Kubernetes 服务的优势如下:
- 易于设置和管理 :处理底层基础设施,减轻管理 Kubernetes 集群的运营负担,自动处理 Kubernetes 控制平面的配置、升级、打补丁和扩展。
- 高可用性和高可扩展性 :为应用程序提供开箱即用的高可用性和高可扩展性,处理将应用程序分布到不同节点和数据中心的编排工作。
- 安全和合规 :内置安全功能,如网络策略、基于角色的访问控制 (RBAC),并与云提供商的身份和访问管理 (IAM) 服务集成,还处理 Kubernetes 软件的安全更新。
- 监控和诊断 :通常与监控和日志服务集成,便于观察和排查应用程序问题。
- 成本 :虽然使用托管服务有成本,但通常低于高效安全运行 Kubernetes 集群所需的专门人员和基础设施成本。
- 支持 :可获得云提供商的支持,在运行生产工作负载时,快速解决出现的问题。
相比之下,自行管理 Kubernetes 集群需要大量的设置和维护工作,包括从安装和配置到集群升级、安全打补丁、节点配置和扩展等所有任务,以及设置监控和警报。虽然自行管理提供更多控制和灵活性,但需要大量的时间、资源和专业知识。对于许多组织来说,托管服务的好处远远超过自行管理集群所增加的控制权。
4. 在 Amazon EKS 上运行简单的容器化应用程序
4.1 Fargate 简介
AWS Fargate 是 AWS 提供的用于容器的无服务器计算引擎,无需管理底层服务器,让你专注于应用程序的设计和构建。Fargate 处理容器的部署、扩展和管理,使你无需担心基础设施即可启动应用程序。
4.2 前置条件
- 确保拥有 AWS 账户,若没有,可在 此处 获取 1 年免费试用账户。
- 登录 AWS 账户。
- 创建新的访问密钥和访问密钥秘密对,用于配置 AWS CLI,以便从命令行访问账户。
- 点击屏幕右上角的个人资料,从下拉菜单中选择“安全凭证”,选择“访问密钥 (访问密钥 ID 和秘密访问密钥)”,然后点击“创建访问密钥”,将访问密钥 ID 和秘密对记录在安全的地方。
- 打开新终端。
- 确保安装了 AWS CLI:
- 在 Mac 上,使用命令:
bash $ brew install awscli - 在 Windows 上,使用命令:
bash $ choco install awscli
- 在 Mac 上,使用命令:
- 测试安装,使用命令:
bash $ aws --version - 配置 AWS CLI,需要前面步骤 3 中创建的 AWS 访问密钥 ID、AWS 秘密访问密钥以及默认区域,使用命令:
bash $ aws configure
输入相应值,默认输出格式选择 JSON。 - 尝试使用命令访问账户,如:
bash $ aws s3 ls
该命令应列出账户定义的所有简单存储服务 (S3) 存储桶,列表可能为空,重要的是命令执行成功。 - 最后,通过运行以下命令检查是否安装了 kubectl:
bash $ kubectl version
4.3 创建 Amazon EKS 集群
- 定义一些环境变量,用于后续使用:
bash $ export AWS_REGION=eu-central-1 $ export AWS_STACK_NAME=animals-stack $ export AWS_CLUSTER_ROLE=animals-cluster-role
请将eu-central-1替换为离你最近的 AWS 区域。 - 创建必要的 AWS 堆栈,包括 VPC、私有和公共子网以及安全组,使用以下命令:
bash $ aws cloudformation create-stack --region $AWS_REGION \ --stack-name $AWS_STACK_NAME \ --template-url https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-vpc-private-subnets.yaml
建议下载并检查上述 YAML 文件,了解命令具体配置的内容。 - 定义授予集群必要访问权限的设置:
- 创建 IAM 角色:
bash $ aws iam create-role \ --role-name $AWS_CLUSTER_ROLE \ --assume-role-policy-document file://"eks-cluster-role-trust-policy.json" - 为刚创建的角色附加必要的 Amazon EKS 托管 IAM 策略:
bash $ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy \ --role-name $AWS_CLUSTER_ROLE
- 创建 IAM 角色:
- 使用 Amazon EKS 控制台(https://console.aws.amazon.com/eks/home#/clusters)进行一些交互式步骤。确保控制台右上角显示的 AWS 区域是你要创建集群的区域,若不是,选择区域名称旁边的下拉菜单并选择所需区域。
- 创建集群,选择“添加集群”命令,然后选择“创建”。若看不到此选项,先在左侧导航窗格中选择“集群”。
- 在“配置集群”页面:
- 名称 :输入合适的集群名称,如
animals-cluster。 - 集群服务角色 :选择之前定义的
animals-cluster-role角色。 - 其他设置保持默认值,然后选择“下一步”。
- 名称 :输入合适的集群名称,如
- 在“指定网络”页面:
- 从 VPC 下拉列表中选择步骤 2 中创建的 VPC 的 ID,名称应类似于
vpc-00x0000x000x0x000 | animals-stack-VPC。 - 其余设置保持默认值,选择“下一步”继续。
- 从 VPC 下拉列表中选择步骤 2 中创建的 VPC 的 ID,名称应类似于
- 在“配置日志记录”页面无需更改,选择“下一步”。
- 在“选择附加组件”页面同样无需更改,选择“下一步”。
- 在“配置所选附加组件设置”页面也无需操作,选择“下一步”。
- 最后,在“审核并创建”页面选择“创建”。
- 集群名称右侧的状态将在几分钟内显示为“正在创建”,直到集群配置过程完成。在状态变为“活动”之前,不要进行下一步。
4.4 创建信任策略并附加到集群
- 创建
pod-execution-role-trust-policy.json文件,并添加以下内容:
json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:eks:<region-code>:<account-no>:fargateprofile/animals-cluster/*" } }, "Principal": { "Service": "eks-fargate-pods.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
将<region-code>替换为你的 AWS 区域代码(如eu-central-1),<account-no>替换为你的账户编号,可在 AWS 控制台左上角的个人资料下找到。 - 使用刚配置的信任策略创建 Pod 执行 IAM 角色:
bash $ aws iam create-role \ --role-name AmazonEKSFargatePodExecutionRole \ --assume-role-policy-document file://"pod-execution-role-trust-policy.json" - 使用以下命令将所需的角色和策略相互连接:
bash $ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSFargatePodExecutionRolePolicy \ --role-name AmazonEKSFargatePodExecutionRole
4.5 创建 Fargate 配置文件
- 在“集群”页面选择
animals-cluster集群。 - 在
animals-cluster页面:- 选择“计算”选项卡。
- 在“Fargate 配置文件”下选择“添加 Fargate 配置文件”。
- 在“配置 Fargate 配置文件”页面:
- 名称 :输入唯一的 Fargate 配置文件名称,如
animals-profile。 - Pod 执行角色 :选择之前创建的
AmazonEKSFargatePodExecutionRole角色。 - 选择“子网”下拉菜单,取消选择名称中包含“Public”的任何子网,因为 Fargate 仅支持在私有子网中运行的 Pod。
- 选择“下一步”。
- 名称 :输入唯一的 Fargate 配置文件名称,如
- 在“配置 Pod 选择”页面:
- 命名空间 :输入
default。 - 选择“下一步”。
- 命名空间 :输入
- 在“审核并创建”页面,审核 Fargate 配置文件的信息并选择“创建”。
- 几分钟后,Fargate 配置文件配置部分的状态将从“正在创建”变为“活动”。在状态变为“活动”之前,不要进行下一步。
4.6 为 CoreDNS 创建 Fargate 配置文件
如果计划将所有 Pod 部署到 Fargate(不部署到 Amazon EC2 节点),需要创建另一个 Fargate 配置文件并在 Fargate 上运行默认名称解析器 (CoreDNS)。
1. 在“Fargate 配置文件”页面选择 animals-profile 。
2. 在“Fargate 配置文件”下选择“添加 Fargate 配置文件”。
3. 在“名称”字段中输入 CoreDNS 。
4. Pod 执行角色 :选择步骤 13 中创建的 AmazonEKSFargatePodExecutionRole 角色。
5. 点击“子网”下拉菜单,确保取消选择名称中包含“Public”的任何子网。
6. 选择“下一步”。
7. 在“命名空间”字段中输入 kube-system 。
8. 选择“匹配标签”,然后选择“添加标签”。
9. 输入 k8s-app 作为键, kube-dns 作为值,这是将默认名称解析器 (CoreDNS) 部署到 Fargate 所必需的。
10. 选择“下一步”。
11. 在“审核并创建”页面,审核 Fargate 配置文件的信息并选择“创建”。
12. 运行以下命令从 CoreDNS Pod 中删除默认的 eks.amazonaws.com/compute-type : ec2 注释:
bash kubectl patch deployment coredns \ -n kube-system \ --type json \ -p='[{"op": "remove", "path": "/spec/template/metadata/annotations/eks.amazonaws.com~1compute-type"}]'
4.7 配置 kubectl 访问集群
当集群准备好后,可继续以下步骤:
1. 配置 kubectl 以访问 AWS 上的新集群:
bash $ aws eks update-kubeconfig --name animals-cluster
响应应类似于:
Added new context arn:aws:eks:eu-central-...:cluster/animals-cluster to /Users/<user-name>/.kube/config
其中 <user-name> 是你工作机器上的用户名。
2. 再次检查 kubectl 是否使用了正确的上下文,即刚为 AWS 上的集群创建并添加到 ~/.kube/config 文件中的上下文:
bash $ kubectl config current-context
答案应类似于:
arn:aws:eks:eu-central-...:cluster/animals-cluster
如果另一个上下文是活动的,使用 kubectl config use-context 命令结合正确的 AWS 上下文。
3. 使用 kubectl 列出集群上的所有资源:
bash $ kubectl get all
4. 查看集群的节点:
bash $ kubectl get nodes
5. 导航到本章的 ch18 文件夹,创建 aws-eks 子文件夹,然后导航到该文件夹:
bash $ cd ~/The-Ultimate-Docker-Container-Book/ch18 $ mkdir aws-eks && cd aws-eks
6. 在该子文件夹中创建 deploy-nginx.yaml 文件,内容如下(此处未给出具体内容,可参考原文图 18.6)。
7. 使用 kubectl 将部署应用到集群:
bash $ kubectl apply -f deploy-nginx.yaml
8. 使用以下命令观察 Pod 的创建,并等待它们准备好:
bash $ kubectl get pods -w
等待 READY 列的值为 1/1 。
9. 在 AWS 控制台中导航到你的集群。
10. 在“资源”选项卡中,观察到创建了三个 Web Pod 和两个 CoreDNS Pod。
11. 在“计算”选项卡中,观察到创建了多个 Fargate 节点。
12. 深入查看节点,查看部署到该节点的 Pod。
13. 进一步深入查看 Pod,观察其详细视图中显示的事件列表。
4.8 清理资源
为避免意外成本,完成操作后请清理所有创建的资源,步骤如下:
1. 使用 kubectl 删除之前的部署:
bash $ kubectl delete -f deploy-nginx.yaml
2. 找到 animals-cluster 集群并选择它。
3. 在“计算”选项卡中,向下滚动到“Fargate 配置文件”部分,选择 animals-profile 和 CoreDNS 配置文件并删除它们。
4. 两个配置文件删除后(可能需要几分钟),点击“删除集群”按钮删除集群。
5. 删除之前创建的 VPC AWS CloudFormation 堆栈。
6. 打开 AWS CloudFormation 控制台(https://console.aws.amazon.com/cloudformation)。
7. 选择 animals-stack 堆栈,然后选择“删除”。
综上所述,通过以上步骤,你可以在 Amazon EKS 上成功创建一个完全托管的 Kubernetes 集群,并使用 kubectl 创建第一个部署。不过,在所有讨论的云提供商中,AWS 需要最多的步骤来启动和运行 Kubernetes 集群。
5. 探索 Microsoft 的 Azure Kubernetes Service (AKS)
5.1 AKS 概述
AKS 是 Microsoft 提供的托管 Kubernetes 服务,它为开发者带来了高生产力,具备持续集成和持续部署 (CI/CD) 能力,并且与 Kubernetes 工具紧密集成,还有 Azure DevOps 项目来构建完整的容器 CI/CD 平台。
5.2 前置条件
- 拥有 Azure 账户,若没有可申请试用账户。
- 安装 Azure CLI。可使用以下命令进行安装和验证:
- 在 Mac 上:
bash $ brew install azure-cli - 在 Windows 上:
bash $ choco install azure-cli - 验证安装:
bash $ az --version
- 在 Mac 上:
- 安装
kubectl,可使用以下命令验证:
bash $ kubectl version
5.3 创建 AKS 集群
以下是创建 AKS 集群的步骤:
1. 登录 Azure 账户:
bash $ az login
2. 创建资源组:
bash $ az group create --name myResourceGroup --location eastus
这里将资源组命名为 myResourceGroup ,位置选择 eastus ,你可根据需求修改。
3. 创建 AKS 集群:
bash $ az aks create --resource-group myResourceGroup --name myAKSCluster --node-count 1 --generate-ssh-keys
此命令创建了一个名为 myAKSCluster 的 AKS 集群,节点数量为 1,并生成 SSH 密钥。
5.4 配置 kubectl 访问 AKS 集群
配置 kubectl 以访问新创建的 AKS 集群:
$ az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
5.5 部署应用到 AKS 集群
- 创建一个简单的部署文件
deploy-app.yaml,示例内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: nginx:1.14.2
ports:
- containerPort: 80
- 使用
kubectl部署应用:
$ kubectl apply -f deploy-app.yaml
- 查看部署状态:
$ kubectl get deployments
- 查看 Pod 状态:
$ kubectl get pods
5.6 清理资源
为避免不必要的费用,完成操作后清理资源:
1. 删除 AKS 集群:
$ az aks delete --resource-group myResourceGroup --name myAKSCluster
- 删除资源组:
$ az group delete --name myResourceGroup
6. 理解 Google Kubernetes Engine (GKE)
6.1 GKE 概述
Google 是 Kubernetes 的原始创造者,GKE 是市场上首个托管 Kubernetes 服务,它提供了高级集群管理功能,并与 Google Cloud 服务深度集成。
6.2 前置条件
- 拥有 Google Cloud 账户,若没有可申请试用账户。
- 安装 Google Cloud SDK,安装完成后使用以下命令验证:
$ gcloud --version
- 安装
kubectl,可使用以下命令验证:
$ kubectl version
6.3 创建 GKE 集群
以下是创建 GKE 集群的步骤:
1. 登录 Google Cloud 账户:
$ gcloud auth login
- 设置项目:
$ gcloud config set project my-project-id
将 `my-project-id` 替换为你的 Google Cloud 项目 ID。
- 创建 GKE 集群:
$ gcloud container clusters create my-gke-cluster --num-nodes=1 --zone=us-central1-a
此命令创建了一个名为 `my-gke-cluster` 的 GKE 集群,节点数量为 1,区域为 `us-central1-a`。
6.4 配置 kubectl 访问 GKE 集群
配置 kubectl 以访问新创建的 GKE 集群:
$ gcloud container clusters get-credentials my-gke-cluster --zone us-central1-a --project my-project-id
6.5 部署应用到 GKE 集群
- 创建一个简单的部署文件
deploy-gke.yaml,示例内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: gke-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: gke-app
template:
metadata:
labels:
app: gke-app
spec:
containers:
- name: gke-app-container
image: nginx:1.14.2
ports:
- containerPort: 80
- 使用
kubectl部署应用:
$ kubectl apply -f deploy-gke.yaml
- 查看部署状态:
$ kubectl get deployments
- 查看 Pod 状态:
$ kubectl get pods
6.6 清理资源
为避免不必要的费用,完成操作后清理资源:
$ gcloud container clusters delete my-gke-cluster --zone us-central1-a
7. 三种托管 Kubernetes 服务对比
| 服务名称 | 提供商 | 优势 | 劣势 |
|---|---|---|---|
| Amazon EKS | AWS | 与 AWS 生态系统深度集成,有强大的安全和合规功能 | 步骤相对繁琐,创建集群过程复杂 |
| Azure Kubernetes Service (AKS) | Microsoft | 与 Azure 服务集成良好,具备 CI/CD 能力 | 对于非微软生态系统用户可能不够友好 |
| Google Kubernetes Engine (GKE) | 拥有高级集群管理功能,最早的托管 Kubernetes 服务 | 成本可能相对较高 |
8. 总结
在云端运行容器化应用程序时,选择合适的托管 Kubernetes 服务至关重要。Amazon EKS、Azure Kubernetes Service (AKS) 和 Google Kubernetes Engine (GKE) 都有各自的特点和优势。通过本文的介绍,你了解了选择托管 Kubernetes 服务的原因,以及如何在这三个主流服务上创建集群、部署应用和清理资源。在实际应用中,你可根据自身的业务需求、技术栈和预算等因素来选择最适合的服务。
下面是创建 AKS 集群的 mermaid 流程图:
graph TD;
A[登录 Azure 账户] --> B[创建资源组];
B --> C[创建 AKS 集群];
C --> D[配置 kubectl 访问集群];
D --> E[部署应用到 AKS 集群];
E --> F[查看部署和 Pod 状态];
F --> G[清理资源];
通过以上内容,你可以全面了解在云端运行容器化应用程序的方法和相关技术,希望能帮助你在实际项目中更好地应用这些知识。
超级会员免费看
90

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



