在 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
您应会收到与以下类似的输出:

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