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개 단계를 수행합니다.

  1. Yaml 구성 파일에 대한 문자열을 생성하는 데 도움이 되는 k8s 라이브러리를 가져옵니다.
  2. 서비스 조회에 사용할 포드에 적용할 레이블 세트를 정의합니다.
  3. 배포를 정의합니다. 배포를 정의하면 클러스터의 컨테이너가 구동되지만 로드 밸런서의 트래픽을 수신하도록 구성되지는 않습니다.
  4. 로드 밸런서에 배포를 노출하기 위한 서비스를 정의합니다.

레이블은 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

결론

이 모듈에서는 CDK8s를 사용하여 Kubernetes 구성 파일을 생성하는 방법을 배웠습니다. 각각 고유한 구성 파일을 포함한 배포와 서비스로 애플리케이션이 분할되었습니다.

이제 이러한 파일을 참조하도록 CDK 프로젝트를 업데이트하고 kubectl을 사용하여 EKS 클러스터에 배포할 준비가 되었습니다.

다음 단계: CDK로 배포

내용이 마음에 드셨는지요.

피드백을 제공해 주셔서 감사합니다.
이 페이지가 도움이 되어 기쁩니다. 지속적인 개선에 도움이 되는 추가 세부 정보를 공유해 주시겠습니까?
닫기
피드백을 제공해 주셔서 감사합니다.
이 페이지가 도움이 되지 못해 죄송합니다. 지속적인 개선에 도움이 되는 추가 세부 정보를 공유해 주시겠습니까?
닫기