在 Amazon EKS 上部署容器 Web 应用程序
入门指南
模块 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 yaml。
然后,您将添加 2 个代码块,以将 2 个 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", yaml_app_deployment)
eks_cluster.add_manifest(f"{construct_id}-app-service", yaml_app_service)
您 cluster_stack.py 文件现在应如下所示:
from aws_cdk import core as cdk
from aws_cdk import aws_iam as iam
from aws_cdk import aws_eks as eks
from aws_cdk import aws_ec2 as ec2
import yaml
class ClusterStack(cdk.Stack):
def __init__(self, scope: cdk.Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
# Look up the default VPC
vpc = ec2.Vpc.from_lookup(self, id="VPC", is_default=True)
# Create master role for EKS Cluster
iam_role = iam.Role(self, id=f"{construct_id}-iam",
role_name=f"{construct_id}-iam", assumed_by=iam.AccountRootPrincipal())
# Creating Cluster with EKS
eks_cluster = eks.Cluster(
self, id=f"{construct_id}-cluster",
cluster_name=f"{construct_id}-cluster",
vpc=vpc,
vpc_subnets=vpc.public_subnets,
masters_role=iam_role,
default_capacity_instance=ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE2, ec2.InstanceSize.MICRO),
version=eks.KubernetesVersion.V1_20,
)
# 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/cdk8s 目录中,请运行以下内容(否则更改为 eks/cluster):
cd ../cluster
cdk deploy
当 AWS CDK 部署好应用程序堆栈后,我们即可以使用 kubectl 检查 Pod 状态。使用 kubectl 之前,确保您在通过 kubectl config current-context 使用正确的上下文。
要查看 Pod 中的应用程序的状态,我们可以使用 kubectl get all 命令,并将看到以下结果:
$ 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 <none> 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 生成的清单文件。