模块 3:部署应用程序
在本模块中,您将学习如何创建要使用的部署并启动应用程序
简介
在本模块中,您将使用 AWS CDK8s 为应用程序创建服务和部署配置。在 AWS CDK8s 中,Kubernetes API 对象被表示为 constructs。我们可以使用这些 constructs 来定义服务和部署配置。CDK8s 生成的输出是 Kubernetes 配置文件。您需要使用该模块的输出,并将其与之前模块中的 AWS CDK 代码集成,用来部署您的应用程序。
学习内容
- 使用 CDK8s constructs 定义 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 的标签集,以便在服务查询中使用。
- 定义部署 (deployment)。部署配置用于在集群上启动容器,但部署配置中不包含接收来自负载均衡器的流量的配置。
- 因此,您需要定义一个服务,该服务将部署同步给负载均衡器。
标签是附加到 Kubernetes 对象的键值对。在部署配置中,为 pod 设置标签。在创建将部署同步给负载均衡器的服务时,配置 ReplicationController 根据这些的标签来选择 pod。使用 label = {"app": "cdk8s"} 代码添加标签。
之后,您便可以在部署中使用这些标签。Kubernetes 中的 deployment 是对部署单元和所需状态的明确声明。本指南实验将使用托管在 Amazon ECR Public Gallery 上的示例应用程序。我们将使用的容器镜像的 URL 是 public.ecr.aws/s9u7u6x1/sample app 001:no-db。
通过更新 main.py 创建部署和服务:在文件顶部的其他 import 的下方, 添加 from imports import k8s,并在 # define resources here 下方粘贴以下代码。更新后的 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