41、在云端运行容器化应用程序

在云端运行容器化应用程序

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 前置条件

  1. 确保拥有 AWS 账户,若没有,可在 此处 获取 1 年免费试用账户。
  2. 登录 AWS 账户。
  3. 创建新的访问密钥和访问密钥秘密对,用于配置 AWS CLI,以便从命令行访问账户。
  4. 点击屏幕右上角的个人资料,从下拉菜单中选择“安全凭证”,选择“访问密钥 (访问密钥 ID 和秘密访问密钥)”,然后点击“创建访问密钥”,将访问密钥 ID 和秘密对记录在安全的地方。
  5. 打开新终端。
  6. 确保安装了 AWS CLI:
    • 在 Mac 上,使用命令:
      bash $ brew install awscli
    • 在 Windows 上,使用命令:
      bash $ choco install awscli
  7. 测试安装,使用命令:
    bash $ aws --version
  8. 配置 AWS CLI,需要前面步骤 3 中创建的 AWS 访问密钥 ID、AWS 秘密访问密钥以及默认区域,使用命令:
    bash $ aws configure
    输入相应值,默认输出格式选择 JSON。
  9. 尝试使用命令访问账户,如:
    bash $ aws s3 ls
    该命令应列出账户定义的所有简单存储服务 (S3) 存储桶,列表可能为空,重要的是命令执行成功。
  10. 最后,通过运行以下命令检查是否安装了 kubectl:
    bash $ kubectl version

4.3 创建 Amazon EKS 集群

  1. 定义一些环境变量,用于后续使用:
    bash $ export AWS_REGION=eu-central-1 $ export AWS_STACK_NAME=animals-stack $ export AWS_CLUSTER_ROLE=animals-cluster-role
    请将 eu-central-1 替换为离你最近的 AWS 区域。
  2. 创建必要的 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 文件,了解命令具体配置的内容。
  3. 定义授予集群必要访问权限的设置:
    • 创建 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
  4. 使用 Amazon EKS 控制台(https://console.aws.amazon.com/eks/home#/clusters)进行一些交互式步骤。确保控制台右上角显示的 AWS 区域是你要创建集群的区域,若不是,选择区域名称旁边的下拉菜单并选择所需区域。
  5. 创建集群,选择“添加集群”命令,然后选择“创建”。若看不到此选项,先在左侧导航窗格中选择“集群”。
  6. 在“配置集群”页面:
    • 名称 :输入合适的集群名称,如 animals-cluster
    • 集群服务角色 :选择之前定义的 animals-cluster-role 角色。
    • 其他设置保持默认值,然后选择“下一步”。
  7. 在“指定网络”页面:
    • 从 VPC 下拉列表中选择步骤 2 中创建的 VPC 的 ID,名称应类似于 vpc-00x0000x000x0x000 | animals-stack-VPC
    • 其余设置保持默认值,选择“下一步”继续。
  8. 在“配置日志记录”页面无需更改,选择“下一步”。
  9. 在“选择附加组件”页面同样无需更改,选择“下一步”。
  10. 在“配置所选附加组件设置”页面也无需操作,选择“下一步”。
  11. 最后,在“审核并创建”页面选择“创建”。
  12. 集群名称右侧的状态将在几分钟内显示为“正在创建”,直到集群配置过程完成。在状态变为“活动”之前,不要进行下一步。

4.4 创建信任策略并附加到集群

  1. 创建 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 控制台左上角的个人资料下找到。
  2. 使用刚配置的信任策略创建 Pod 执行 IAM 角色:
    bash $ aws iam create-role \ --role-name AmazonEKSFargatePodExecutionRole \ --assume-role-policy-document file://"pod-execution-role-trust-policy.json"
  3. 使用以下命令将所需的角色和策略相互连接:
    bash $ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSFargatePodExecutionRolePolicy \ --role-name AmazonEKSFargatePodExecutionRole

4.5 创建 Fargate 配置文件

  1. 在“集群”页面选择 animals-cluster 集群。
  2. animals-cluster 页面:
    • 选择“计算”选项卡。
    • 在“Fargate 配置文件”下选择“添加 Fargate 配置文件”。
  3. 在“配置 Fargate 配置文件”页面:
    • 名称 :输入唯一的 Fargate 配置文件名称,如 animals-profile
    • Pod 执行角色 :选择之前创建的 AmazonEKSFargatePodExecutionRole 角色。
    • 选择“子网”下拉菜单,取消选择名称中包含“Public”的任何子网,因为 Fargate 仅支持在私有子网中运行的 Pod。
    • 选择“下一步”。
  4. 在“配置 Pod 选择”页面:
    • 命名空间 :输入 default
    • 选择“下一步”。
  5. 在“审核并创建”页面,审核 Fargate 配置文件的信息并选择“创建”。
  6. 几分钟后,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
  • 安装 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 集群

  1. 创建一个简单的部署文件 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
  1. 使用 kubectl 部署应用:
$ kubectl apply -f deploy-app.yaml
  1. 查看部署状态:
$ kubectl get deployments
  1. 查看 Pod 状态:
$ kubectl get pods

5.6 清理资源

为避免不必要的费用,完成操作后清理资源:
1. 删除 AKS 集群:

$ az aks delete --resource-group myResourceGroup --name myAKSCluster
  1. 删除资源组:
$ 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
  1. 设置项目:
$ gcloud config set project my-project-id
将 `my-project-id` 替换为你的 Google Cloud 项目 ID。
  1. 创建 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 集群

  1. 创建一个简单的部署文件 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
  1. 使用 kubectl 部署应用:
$ kubectl apply -f deploy-gke.yaml
  1. 查看部署状态:
$ kubectl get deployments
  1. 查看 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) Google 拥有高级集群管理功能,最早的托管 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[清理资源];

通过以上内容,你可以全面了解在云端运行容器化应用程序的方法和相关技术,希望能帮助你在实际项目中更好地应用这些知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值