Amazon EKS에 컨테이너 웹 앱 배포
시작 가이드
모듈 3: 배포 생성
이 모듈에서는 CDK를 사용하여 배포를 생성하고 애플리케이션을 시작합니다.
소개
이 모듈에서는 AWS CDK8s를 사용하여 애플리케이션에 대한 서비스 및 배포 구성을 생성합니다. AWS CDK8s에서 Kubernetes API 객체는 구문으로 표현됩니다. 이러한 구문을 사용하여 서비스 및 배포를 정의할 수 있습니다. CDK8s에서 생성되는 출력은 Kubernetes 구성 파일입니다. 이 모듈의 출력을 이전 모듈의 AWS CDK 코드와 통합하여 애플리케이션을 배포하는 데 사용합니다.
배우게 될 내용
- CDK8s 구문을 사용하여 Kubernetes API 객체 정의
- CDK8s를 사용하여 서비스 및 배포 정의
- CDK8s를 사용하여 Kubernetes 구성 생성
완료 시간
5분
모듈 선행 조건
- 관리자 수준의 액세스 권한이 있는 AWS 계정**
- 권장 브라우저: 최신 버전의 Chrome 또는 Firefox
[**]생성된 지 24시간이 지나지 않은 계정은 이 자습서를 완료하는 데 필요한 서비스에 액세스할 권한이 아직 없을 수 있습니다.
구현
애플리케이션 정의
이 단계에서는 main.py를 수정하여 CDK8s 애플리케이션을 정의합니다. 초기화 후의 결과는 다음과 같습니다.
#!/usr/bin/env python
from constructs import Construct
from cdk8s import App, Chart
class MyChart(Chart):
def __init__(self, scope: Construct, id: str):
super().__init__(scope, id)
# define resources here
app = App()
MyChart(app, "cdk8s")
app.synth()
애플리케이션을 배포하려면 4개 단계를 수행합니다.
- Yaml 구성 파일에 대한 문자열을 생성하는 데 도움이 되는 k8s 라이브러리를 가져옵니다.
- 서비스 조회에 사용할 포드에 적용할 레이블 세트를 정의합니다.
- 배포를 정의합니다. 배포를 정의하면 클러스터의 컨테이너가 구동되지만 로드 밸런서의 트래픽을 수신하도록 구성되지는 않습니다.
- 로드 밸런서에 배포를 노출하기 위한 서비스를 정의합니다.
레이블은 Kubernetes 객체에 연결되는 키/값 페어입니다. 배포 중에 실행할 포드를 태깅합니다. ReplicationController는 로드 밸런서에 노출하기 위한 서비스를 생성할 때 동일한 레이블을 사용하여 포드를 선택합니다. 이 작업을 위해 label = {"app": "cdk8s"} 코드를 사용합니다.
그런 다음 이러한 레이블을 배포에 사용합니다. Kubernetes에서 배포는 배포 단위 및 원하는 상태를 명시적으로 선언하는 것입니다. 이 가이드에서는 Amazon ECR 퍼블릭 갤러리에서 호스트되는 샘플 애플리케이션을 사용합니다. 가져오려는 컨테이너 이미지의 URL은 public.ecr.aws/s9u7u6x1/sample app 001:no-db입니다.
배포 및 서비스를 생성하려면 파일의 맨 위에서 다른 가져오기 아래에 from imports import k8s를 추가하고 다음 코드에서 # define resources here 아래에 붙여 넣는 방법으로 main.py를 업데이트합니다. 이제 파일은 다음과 같아야 합니다.
#!/usr/bin/env python
from constructs import Construct
from cdk8s import App, Chart
from imports import k8s
class MyChart(Chart):
def __init__(self, scope: Construct, id: str):
super().__init__(scope, f"{id}-deployment")
# define resources here
# Label used for tagging pods to link in the service
label = {"app": "cdk8s"}
# Creates the deployment to spin up pods with your container
k8s.KubeDeployment(self, 'deployment',
spec=k8s.DeploymentSpec(
replicas=2,
selector=k8s.LabelSelector(match_labels=label),
template=k8s.PodTemplateSpec(
metadata=k8s.ObjectMeta(labels=label),
spec=k8s.PodSpec(containers=[
k8s.Container(
name='cdk8s',
image='public.ecr.aws/s9u7u6x1/sample_app_001:no-db',
ports=[k8s.ContainerPort(container_port=80)])]))))
# Creates the service to expose the pods to traffic from the loadbalancer
super().__init__(scope, f"{id}-service")
k8s.KubeService(self, 'service',
spec=k8s.ServiceSpec(
type='LoadBalancer',
ports=[k8s.ServicePort(port=80, target_port=k8s.IntOrString.from_number(80))],
selector=label))
app = App()
MyChart(app, "cdk8s")
app.synth()
이 메서드에서 super()에 대한 호출이 두 번 수행된 것을 알 수 있습니다. 지정된 이름을 사용하여 Yaml 파일을 생성하고, 이 클래스가 상속하는 상위 클래스 구문을 호출하여 해당 시점 이후에 생성된 모든 구성을 추가합니다. 그러면 서비스 구성에 대한 파일과 배포에 대한 두 번째 파일이 생성됩니다.
이제 cdk8s synth를 실행하여 구성 파일을 생성할 수 있습니다. 출력은 다음과 같습니다.
cdk8s synth
dist/cdk8s-deployment.k8s.yaml
dist/cdk8s-service.k8s.yaml