在 Amazon EKS 上部署容器 Web 应用程序

入门指南

模块 1:创建 EKS 集群

在本模块中,您将学习如何创建 Amazon EKS 集群

简介

在部署容器化应用程序之前,我们需要创建 Kubernetes 集群。我们将使用 Amazon EKS 创建集群。在本指南中,Amazon EKS 集群由控制面板组成,并将 Amazon EC2 用作 Worker 节点。为了创建 Kubernetes 集群,我们将使用 AWS CDK。AWS CDK 将提供灵活度,以便通过可预测且可重复的方式启用 Kubernetes 集群的预置。

您将学到的内容

  • 构建 AWS CDK 应用程序,以将 Amazon EC2 用作 Worker 节点来创建 Amazon EKS 集群
  • 测试和执行对 Kubernetes 集群的基本操作

 完成时间

10 分钟

 模块先决条件

  • 具有管理员级访问权限的 AWS 账户**
  • 推荐的浏览器:最新版 Chrome 或 Firefox

[**] 过去 24 小时内创建的账户可能尚不具有访问此教程所需服务的权限。

实施

当您定义 IAM 角色和 EKS 集群后,下一步便是部署 CDK 堆栈。执行此操作之前,您需要通过更改 eks/cluster/app.py 和取消注释行 24 来配置 CDK 以了解要使用哪个账户 ID 和区域:

构建 AWS CDK 应用程序

在此步骤中,您将准备您的工作文件夹。您将在根文件夹 eks 中创建两个不同的文件夹。第一个文件夹 k8s-cluster 用于集群创建,并将托管用于创建文件夹的 CDK 代码。第二个文件夹 cdk8s 将包含使用 cdk8s 创建应用程序并将其部署到集群的代码。创建目录,并通过运行以下选项使用 Python 创建您的 CDK 项目:

mkdir eks
cd eks
mkdir cluster cdk8s
cd cluster

cdk init app --language=python

这将创建 CDK 应用程序,以及一些有用的命令输出:

cdk init app --language=python
Applying project template app for python

# Welcome to your CDK Python project!

This is a blank project for Python development with CDK.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

...

To add additional dependencies, for example other CDK libraries, just add
them to your `setup.py` file and rerun the `pip install -r requirements.txt`
command.

## Useful commands

 * `cdk ls`          list all stacks in the app
 * `cdk synth`       emits the synthesized CloudFormation template
 * `cdk deploy`      deploy this stack to your default AWS account/region
 * `cdk diff`        compare deployed stack with current state
 * `cdk docs`        open CDK documentation

Enjoy!

Please run 'python3 -m venv .venv'!
Executing Creating virtualenv...

请确保之后运行 python3 -m venv .venv

在此模块中,您需要创建 2 个主要资源,Amazon EKS 集群和 AWS IAM 角色。通过创建 IAM 角色并将其附加到集群中,它将授予 systems:masters 权限。为执行此操作,我们需要将 aws_cdk.aws-iam 和 aws_cdk.aws-eks 库添加到 CDK 应用程序中。aws_cdk.aws-ec2 和 pyyaml 的部署步骤所需的库。您需要确保使用与您的 CDK 版本匹配的库,检查 CDK 的版本,运行 cdk --version

cdk --version

1.121.0 (build 026cb8f)

使用显示的版本号、打开 eks/cluster/requirements.txt 并附加以下行:

aws_cdk.core==1.121.0
aws_cdk.aws-iam==1.121.0
aws_cdk.aws-eks==1.121.0
aws_cdk.aws_ec2==1.121.0
pyyaml

要安装这些库,请运行 pip3 install -r requirements.txt

创建一个新的 VPC 是使用 EKS 创建 Kubernetes 集群的最佳实践,您可以在文档中阅读更多相关内容。在本指南中,您将使用每个新账户提供的默认 VPC,以简化部署。要创建 EKS 集群,请打开 eks/cluster/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


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,
        )

当您定义 IAM 角色和 EKS 集群后,下一步便是部署 CDK 堆栈。执行此操作之前,您需要通过更改 eks/cluster/app.py 和取消注释行 24 来配置 CDK 以了解要使用哪个账户 ID 和区域:

env=core.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION')),

这将使用在 AWS CLI 中配置的账户 ID 和区域。在使用 CDK 之前,您需要先对其进行引导启动 - 这将为 CDK 创建所需的基础设施,以管理您账户中的基础设施。要引导启动 CDK,请运行 cdk bootstrap。您应会收到类似如下的输出:

cdk bootstrap

#output
⏳  Bootstrapping environment aws://0123456789012/<region>...
✅  Environment aws://0123456789012/<region> bootstrapped

引导启动完成后,您将运行 cdk deploy 来部署集群。 

cdk deploy

您应会收到与以下类似的输出:

gsg_build_eks_1

CDK 将在创建基础设施之前提示您,因为它会创建更改安全配置的基础设施 - 在您的案例中,将通过创建 IAM 角色和安全组的方式进行提示。按 y,然后点击 enter 进行部署。CDK 现在将设置您定义的所有基础设施,这将需要几分钟时间才能完成。 

如果一切顺利,您将在执行结束时收到以下结果:

✅  ClusterStack

Outputs:
ClusterStack.ClusterStackclusterConfigCommand1CAA6E63 = aws eks update-kubeconfig --name ClusterStack-cluster --region eu-west-1 --role-arn arn:aws:iam::0123456789012:role/ClusterStack-iam
ClusterStack.ClusterStackclusterGetTokenCommand010D10BE = aws eks get-token --cluster-name ClusterStack-cluster --region eu-west-1 --role-arn arn:aws:iam::0123456789012:role/ClusterStack-iam
ClusterStack.ClusterStackoutclusterName = ClusterStack-cluster
ClusterStack.ClusterStackouteksSgId = sg-08b0517c72f0e2696
ClusterStack.ClusterStackoutkubectlRoleArn = arn:aws:iam::0123456789012:role/ClusterStack-ClusterStackclusterCreationRole9D9F21-29ZO9XWJLC4Q
ClusterStack.ClusterStackoutoidcArn = arn:aws:iam::0123456789012:oidc-provider/oidc.eks.eu-west-1.amazonaws.com/id/168AAF8C86B3F46909C6014D942FD39C
ClusterStack.ClusterStackoutvpcAz = ['eu-west-1a', 'eu-west-1b', 'eu-west-1c']
ClusterStack.ClusterStackoutvpcId = vpc-b8e25ec1

Stack ARN:
arn:aws:cloudformation:eu-west-1:0123456789012:stack/ClusterStack/91f4c430-1225-11ec-bb6c-027a967aed43

您将看到打印出的 3 个警告,内容类似如下:

[Warning at /ClusterStack/ClusterStack-cluster] Could not auto-tag public subnet subnet-3a618f43 with "kubernetes.io/role/elb=1", please remember to do this manually

此指南使用 Kubernetes 1.20,子网标记仅在 1.19 之前使用,因此您可以安全地忽略这些警告。您的集群现已准备就绪。要操作您的集群,您需要更新 Kubernetes 配置 (kubeconfig) 以指向它,这样 kubectl 命令才能工作。从您的终端输出中复制 ConfigCommand 并执行它,它应当类似如下内容:

aws eks update-kubeconfig --name ClusterStack-cluster --region eu-west-1 --role-arn arn:aws:iam::0123456789012:role/ClusterStack-iam
Added ew context arn:aws:eks:eu-west-1:0123456789012:cluster/ClusterStack-cluster to /home/ubuntu/.kube/config

要确认一切均正确配置,请运行 kubectl get all 进行确认,您应看到如下内容:

kubectl get all

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   xxx.xxx.xxx.xxx   <none>        443/TCP   15m

结论

在本模块中,我们介绍了如何使用 CLI 创建 Amazon EKS 集群。在下一个模块中,我们将安装并了解 CDK8s。

下一步:安装 CDK8s

请就我们的表现提供反馈。

感谢您的反馈
很高兴此页面对您有所帮助。您是否乐意分享更多详细信息,以帮助我们继续改进?
关闭
感谢您的反馈
很抱歉,此页面未能帮到您。您是否乐意分享更多详细信息,以帮助我们继续改进?
关闭