在 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 下添加 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 集群。在下一个模块中,您需要清理本指南实验过程中创建的所有资源。

下一项:清理资源