模块 4:使用 AWS CDK 部署
在本模块中,您将学习如何使用 CDK 创建部署并启动应用程序
简介
在本模块中,我们将使用上一模块中介绍的使用 CDK8s 生成的配置文件,将应用程序部署到新创建的 EKS 群集中。CDK 将根据这些配置文件来部署应用程序。
学习内容
- 将 AWS CDK8S 集成到 AWS CDK 中
- 使用 AWS CDK 部署
- 使用 kubectl 进行集群操作
时长
10 分钟
学习前期准备
- 具有管理员级别访问权限的 AWS 账户**
- 推荐的浏览器:最新版本的 Chrome 或 Firefox
[**]在过去 24 小时内新创建的账户可能无法使用本教程所需的服务。
操作步骤
定义应用程序
Kubernetes 配置文件以 Yaml 格式存储,因此您需要导入 yaml 库才能解析这些文件。在 eks/cluster/cluster/cluster_stack 顶部的其他 import 下添加 import yaml。
然后,添加以下两个代码块,将两个 Yaml 文件读取为变量,然后传递给集群:
注意:请务必遵循代码的缩进。
# Read the deployment config
with open("../cdk8s/dist/cdk8s-deployment.k8s.yaml", 'r') as stream:
deployment_yaml = yaml.load(stream, Loader=yaml.FullLoader)
# Read the service config
with open("../cdk8s/dist/cdk8s-service.k8s.yaml", 'r') as stream:
service_yaml = yaml.load(stream, Loader=yaml.FullLoader)
然后,使用 add_manifest 方法将这两个 Yaml 一个一个地传递给 EKS 集群:
注意:请务必遵循代码的缩进。
eks_cluster.add_manifest(f"{construct_id}-app-deployment", deployment_yaml)
eks_cluster.add_manifest(f"{construct_id}-app-service", service_yaml)
现在,cluster_stack.py 文件内容应如下所示:
from aws_cdk import (
Stack,
aws_iam as iam,
aws_eks as eks,
aws_ec2 as ec2
)
from aws_cdk.lambda_layer_kubectl_v28 import KubectlV28Layer
from constructs import Construct
import yaml
class ClusterStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
# Create a master role
iam_role = iam.Role(self, id=f"{construct_id}-iam",
role_name=f"{construct_id}-iam", assumed_by=iam.AccountRootPrincipal())
# Create and EKS Cluster
eks_cluster = eks.Cluster(
self, id=f"{construct_id}-cluster",
cluster_name=f"{construct_id}-cluster",
masters_role=iam_role,
default_capacity_instance=ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE3, ec2.InstanceSize.MICRO),
version=eks.KubernetesVersion.V1_28,
kubectl_layer=KubectlV28Layer(self, "KubectlLayer")
)
# Read the deployment config
with open("../cdk8s/dist/cdk8s-deployment.k8s.yaml", 'r') as stream:
deployment_yaml = yaml.load(stream, Loader=yaml.FullLoader)
# Read the service config
with open("../cdk8s/dist/cdk8s-service.k8s.yaml", 'r') as stream:
service_yaml = yaml.load(stream, Loader=yaml.FullLoader)
eks_cluster.add_manifest(f"{construct_id}-app-deployment", deployment_yaml)
eks_cluster.add_manifest(f"{construct_id}-app-service", service_yaml)
要部署应用程序,我们需要切换回 eks/cluster 目录。如果您当前在其他目录,请切换到 eks/cluster 目录。如果您当前在 eks/cdk8s 目录下,请运行以下命令部署应用:
cd ../cluster
cdk deploy
AWS CDK 部署了应用程序堆栈后,我们就可以使用 kubectl 检查 pod 的状态了。使用 kubectl 之前,运行 kubectl config current-context 命令,检查上下文是否正确。
运行 kubectl get all 命令,查看 pod 中应用程序的状态。该命令的输出结果应如下所示:
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/cdk8s-deployment-c8087a1b-659fb88f56-6qj52 1/1 Running 0 3m22s
pod/cdk8s-deployment-c8087a1b-659fb88f56-s82ft 1/1 Running 0 3m22s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/cdk8s-service-c844e1e1 LoadBalancer xxx.xxx.xxx.xxx xxxxxxxxxxxxxx.eu-west-1.elb.amazonaws.com 80:30132/TCP 3m22s
service/kubernetes ClusterIP xxx.xxx.xxx.xxx 443/TCP 4h17m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/cdk8s-deployment-c8087a1b 2/2 2 2 3m22s
NAME DESIRED CURRENT READY AGE
replicaset.apps/cdk8s-deployment-c8087a1b-659fb88f56 2 2 2 3m22s
现在,我们来测试应用程序。您可以复制上面代码中 LoadBalancer 对应的 EXTERNAL-IP 值,如 xxxxxxxxxxxxxx.eu-west-1.elb.amazonaws.com。然后,在浏览器中打开这个地址。
加载完成后,您应该会看到如下页面:
现在,您已使用 CDK 将应用程序成功部署到 Kubernetes 集群中,并且对该集群进行了预配和部署了 CDK8s 生成的清单文件。
总结
在本指南中,您学会了如何使用 CDK8s 生成的 Kubernetes 配置文件,以及如何使用 CDK 将这些文件部署到 EKS 集群。在下一个模块中,您需要清理本指南实验过程中创建的所有资源。