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

入门指南

模块 1:创建 EKS 集群

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

简介

部署容器化应用程序之前,我们必须先创建一个 Kubernetes 集群。我们将使用 Amazon EKS 创建集群。在本指南中,Amazon EKS 集群有一个控制面板,并使用 Amazon EC2 作为工作节点。我们将用 AWS CDK 创建 Kubernetes 集群。AWS CDK 灵活性强,能以可预测和可重复的方式预配置 Kubernetes 集群。

学习内容

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

 时长

10 分钟

 学习前期准备

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

[**]在过去 24 小时内新创建的账户可能无法使用本教程所需的服务。

构建 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
source .venv/bin/activate

在本模块中,您需要创建以下两种主要资源:Amazon EKS 集群和 AWS IAM 角色。创建 IAM 角色并为 EKS 集群添加该角色,赋予集群 systems:masters 权限。为此,我们需要将 aws_cdk.aws-iam 和 aws_cdk.aws-eks 两个库添加到 CDK 应用程序中。部署步骤需要使用aws-cdk-lib、constructs 和 aws-cdk.lambda-layer-kubectl-v28 库。确保您使用的库和当前 CDK 版本相匹配。运行 cdk --version 命令可检查 CDK 版本:

cdk --version
2.122.0 (build 7e77e02)

如果 CDK 是以上显示的版本号,那么 eks/cluster/requirements.txt 和 requirements.txt 文件内容应如下所示:

aws-cdk-lib==2.122.0
constructs>=10.0.0,<11.0.0
aws-cdk.lambda-layer-kubectl-v28==2.2.0
pyyaml  

运行以下命令安装所需的库:

pip3 install -r requirements.txt

在 EKS 上创建 Kubernetes 集群时,最好为这个集群创建一个新的 VPC。您可以阅读文档,了解更多有关 VPC 的信息。在 eks/cluster/cluster_stack.py 文件中,添加以下代码来创建 EKS 集群:

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

定义 IAM 角色和 EKS 集群后,下一步是部署 CDK 堆栈。在部署之前,您需要配置 CDK,指定所要使用的账户 ID 和区域。所以,您需要修改 eks/cluster/app.py 文件,并取消注释第 18 行:

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

如果想要设置不同的账户或不同的区域,可以在第 23 行静态设置账户和区域变量,同时保留第 18 行作为注释。

23: env=cdk.Environment(account='123456789012', region='eu-west-1'),

这样就可以使用在 AWS CLI 中配置的账户 ID 和区域。在您使用 CDK 之前,需要对其进行引导,这将为 CDK 创建所需的基础设施,以管理您账户中的基础设施。若要引导 CDK,请运行 cdk bootstrap。您应当会看到类似于以下内容的输出:

cdk bootstrap
⏳  Bootstrapping environment aws://0123456789012/...
✅  Environment aws://0123456789012/ bootstrapped

环境设置完成后,运行 cdk deploy 命令,部署集群。 

cdk deploy

您应该会看到类似以下内容的输出:

CDK 将在创建基础设施之前弹出提示,因为它要创建的基础设施会更改安全配置,在本例中,它将创建 IAM 角色和安全组。按下 y 键,再按下 enter 键即可部署。CDK 现在将设置您定义的所有基础设施,这需要几分钟才能完成。 

如果一切顺利,您在执行完成时会得到如下结果:

✅  ClusterStack

✨  Deployment time: 1150.08s

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
Stack ARN:
arn:aws:cloudformation:eu-west-1:0123456789012:stack/ClusterStack/124f8fb0-bb17-11ee-a570-129832dce953

您的集群现已准备就绪。若要在集群上执行操作,您还需要更新 Kubernetes 配置 (kubeconfig),指向该集群,这样 kubectl 命令才能生效。从您的终端上的输出中,复制配置更新命令,然后执行这个命令,结果应当类似于以下内容:

aws eks update-kubeconfig --name ClusterStack-cluster --region <YOUR-REGION> --role-arn arn:aws:iam::<YOUR-ACCT-NUMBER>:role/ClusterStack-iam

输出应如下所示:

Added new 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           443/TCP   15m

总结

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

下一项:安装 CDK8s