Amazon EKS에 컨테이너 웹 앱 배포
시작 가이드
모듈 1: EKS 클러스터 생성
이 모듈에서는 Amazon EKS 클러스터를 생성하는 방법을 배웁니다.
소개
컨테이너식 애플리케이션을 배포하기 전에 Kubernetes 클러스터를 생성해야 합니다. Amazon EKS를 사용하여 클러스터를 생성할 것입니다. 이 가이드에서 Amazon EKS 클러스터는 제어 영역으로 구성되며 Amazon EC2를 작업자 노드로 사용합니다. Kubernetes 클러스터를 생성하기 위해 AWS CDK를 사용할 것입니다. AWS CDK는 Kubernetes 클러스터를 예측 가능하고 반복 가능한 방식으로 프로비저닝할 수 있는 유연성을 제공합니다.
배우게 될 내용
- Amazon EC2를 작업자 노드로 사용하는 Amazon EKS 클러스터를 생성하기 위한 AWS CDK 애플리케이션 구축
- Kubernetes 클러스터에 대한 기본적인 작업 테스트 및 수행
완료 시간
10분
모듈 선행 조건
- 관리자 수준의 액세스 권한이 있는 AWS 계정**
- 권장 브라우저: 최신 버전의 Chrome 또는 Firefox
[**]생성된 지 24시간이 지나지 않은 계정은 이 자습서를 완료하는 데 필요한 서비스에 액세스할 권한이 아직 없을 수 있습니다.
구현
IAM 역할과 EKS 클러스터를 정의한 후 다음 단계는 CDK 스택을 배포하는 것입니다. 그 전에 eks/cluster/app.py를 변경하고 24번 줄의 주석 처리를 제거하여 사용할 계정 ID 및 리전을 확인하도록 CDK를 구성해야 합니다.
AWS CDK 애플리케이션 구축
이 단계에서는 작업 폴더를 준비합니다. 루트 폴더인 eks 안에 2개의 서로 다른 폴더를 생성할 것입니다. 첫 번째 폴더인 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를 실행합니다.
EKS를 사용하여 Kubernetes 클러스터를 구축할 때는 새 VPC를 생성하는 것이 모범 사례입니다. 설명서에서 이에 대한 자세한 내용을 읽어볼 수 있습니다. 이 가이드에서는 간편한 배포를 위해 각 신규 계정에 제공되는 기본 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번 줄의 주석 처리를 제거하여 사용할 계정 ID 및 리전을 확인하도록 CDK를 구성해야 합니다.
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