在 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-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 堆疊。在您這樣做之前,您需要設定 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