在 Amazon EKS 上部署容器 Web 应用程序

入门指南

模块 3:创建部署

在此模块中,您将使用 CDK 创建一个部署并启动您的应用程序

简介

在本模块中,您将使用 AWS CDK8s 为自己的应用程序创建服务和部署配置。在 AWS CDK8s 中,Kubernetes API 对象被表示为构造。我们可以使用这些构造来定义服务和部署。CDK8s 生成的输出为 Kubernetes 配置文件。您将使用此模块的输出并将它与上一个模块中的 AWS CDK 代码集成,以部署您的应用程序。

您将学到的内容

  • 使用 CDK8s 构造定义 Kubernetes API 对象
  • 使用 CDK8s 定义服务和部署
  • 使用 CDK8s 生成 Kubernetes 配置

 完成时间

5 分钟

 模块先决条件

  • 具有管理员级访问权限的 AWS 账户**
  • 推荐的浏览器:最新版 Chrome 或 Firefox

[**] 过去 24 小时内创建的账户可能尚不具有访问此教程所需服务的权限。

实施

定义应用程序

从此步骤开始,我们将修改 main.py 以定义 CDK8s 应用程序。初始化后,它应当类似如下内容:

#!/usr/bin/env python
from constructs import Construct
from cdk8s import App, Chart

class MyChart(Chart):
    def __init__(self, scope: Construct, id: str):
        super().__init__(scope, id)

        # define resources here

app = App()
MyChart(app, "cdk8s")

app.synth()

要部署应用程序,需要遵循 4 个步骤:

  1. 导入 k8s 库以帮助为 Yaml 配置文件生成字符串。
  2. 定义要应用于 Pod 的标签集,以在服务查找中使用。
  3. 定义部署 - 这将在集群上启动容器,但不会将其配置为接收来自负载均衡器的流量。
  4. 定义服务以将部署公开到负载均衡器中。

标签为附加到 Kubernetes 对象的键/值对。您将在部署过程中标记 Pod 以运行它们,而 ReplicationController 将使用相同的标签在创建服务时选择 Pod,以将它们公开到负载均衡器中。您将使用 label = {"app": "cdk8s"} 代码来执行此操作。

然后,您将在部署中使用这些标签。Kubernetes 中的部署是对部署单元和所需状态的显式声明。此指南将使用托管在 Amazon ECR 公有库中的示例应用程序。我们将拉取的容器镜像的 URL 为 public.ecr.aws/s9u7u6x1/sample app 001:no-db

要创建部署和服务,请通过在其他导入下的文件顶部添加 from imports import k8s 并将以下代码 below # define resources 粘贴到此处来更新 main.py。您文件现在应该如下所示:

#!/usr/bin/env python
from constructs import Construct
from cdk8s import App, Chart
from imports import k8s

class MyChart(Chart):
    def __init__(self, scope: Construct, id: str):
        super().__init__(scope, f"{id}-deployment")

        # define resources here

        # Label used for tagging pods to link in the service
        label = {"app": "cdk8s"}

        # Creates the deployment to spin up pods with your container
        k8s.KubeDeployment(self, 'deployment',
            spec=k8s.DeploymentSpec(
                replicas=2,
                selector=k8s.LabelSelector(match_labels=label),
                template=k8s.PodTemplateSpec(
                metadata=k8s.ObjectMeta(labels=label),
                spec=k8s.PodSpec(containers=[
                    k8s.Container(
                    name='cdk8s',
                    image='public.ecr.aws/s9u7u6x1/sample_app_001:no-db',
                    ports=[k8s.ContainerPort(container_port=80)])]))))

        # Creates the service to expose the pods to traffic from the loadbalancer
        super().__init__(scope, f"{id}-service")
        k8s.KubeService(self, 'service',
            spec=k8s.ServiceSpec(
            type='LoadBalancer',
            ports=[k8s.ServicePort(port=80, target_port=k8s.IntOrString.from_number(80))],
            selector=label))

app = App()
MyChart(app, "cdk8s")

app.synth()

您将注意到,已通过此方法对 super() 进行了两次调用 - 它将创建已指定名称的 Yaml 文件,并通过调用该类所继承的父类构造函数,附加在该点之后生成的任何配置。这将为服务配置生成一个文件,并将为部署生成第二个文件。 

您现在可以运行 cdk8s synth 来生成配置文件,输出将如下所示:

cdk8s synth

dist/cdk8s-deployment.k8s.yaml
dist/cdk8s-service.k8s.yaml

结论

在本模块中,您学习了如何使用 CDK8s 生成 Kubernetes 配置文件。您的应用程序将被分为部署和服务,每一个都具有自己的配置文件。

您现在已准备好更新 CDK 项目来引用这些文件,并使用 kubectl 将它们部署到 EKS 集群。

下一步:使用 CDK 部署

请就我们的表现提供反馈。