在 Amazon EKS 上部署容器 Web 應用程式

入門指南

單元 1:建立 EKS 叢集

在本單元中,您將了解如何建立 Amazon EKS 叢集

簡介

在部署容器化的應用程式之前,我們需要建立 Kubernetes 叢集。我們將使用 Amazon EKS 建立叢集。在本指南中,Amazon EKS 叢集由控制平面組成,並使用 Amazon EC2 作為工作節點。若要建立 Kubernetes 叢集,我們將要使用 AWS CDK。AWS CDK 可讓您以可預測和可重複方式彈性啟用 Kubernetes 叢集的佈建。

您將學到的內容

  • 建置 AWS CDK 應用程式來建立 Amazon EKS 叢集,以 Amazon EC2 作為工作節點
  • 測試並對 Kubernetes 叢集執行基本作業

 完成時間

10 分鐘

 單元先決條件

  • 有管理員等級存取權限的 AWS 帳戶**
  • 建議的瀏覽器:最新版的 Chrome 或 Firefox

[**]過去 24 小時內建立的帳戶可能尚未有權存取本教學課程所需的服務。

實作

一旦您已定義 IAM 角色和 EKS 叢集,下一個步驟就是部署 CDK 堆疊。在您這樣做之前,您需要設定 CDK 以知道要使用哪個帳戶 ID 和區域,方法是變更eks/cluster/app.py 並註銷第 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

有 2 個主要資源,您需要在本單元中建立它們,即 Amazon EKS 叢集和 AWS IAM 角色。透過建立 IAM 角色並將其附加至叢集,它將授予 systems:masters 權限。若要這樣做,我們需要將 aws_cdk.aws-iamaws_cdk.aws-eks 程式庫新增至 CDK 應用程式。aws_cdk.aws-ec2pyyaml 都是部署步驟所需的程式庫。您需要確保您使用的程式庫符合 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 堆疊。在您這樣做之前,您需要設定 CDK 以知道要使用哪個帳戶 ID 和區域,方法是變更eks/cluster/app.py 並註銷第 24 行:

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

這將使用 AWS CLI 中設定的帳戶 ID 和區域。在您可以使用 CDK 之前,它需要進行 Bootstrap - 這將建立 CDK 的必要基礎設施,以在您的帳戶中管理必要的基礎設施。若要 Bootstrap CDK,請執行 cdk bootstrap。您應該會看到如下的輸出:

cdk bootstrap

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

一旦 Bootstrap 完成,您就會執行 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

結論

在本單元中,我們涵蓋了使用 CLI 建立 Amazon EKS 叢集。在下一個單元中,我們將安裝並了解 CDK8s。

下一步:安裝 CDK8s

讓我們知道我們表現如何。