在 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 个步骤:
- 导入 k8s 库以帮助为 Yaml 配置文件生成字符串。
- 定义要应用于 Pod 的标签集,以在服务查找中使用。
- 定义部署 - 这将在集群上启动容器,但不会将其配置为接收来自负载均衡器的流量。
- 定义服务以将部署公开到负载均衡器中。
标签为附加到 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