ACM을 사용하여 Amazon EKS 워크로드에서 HTTPS 트래픽을 종료하려면 어떻게 해야 하나요

3분 분량
0

AWS Certificate Manager(ACM)를 사용하여 Amazon Elastic Kubernetes Service(Amazon EKS) 워크로드에서 HTTPS 트래픽을 종료하려고 합니다.

간략한 설명

Kubernetes 서비스 객체의 Elastic Load Balancin 수준에서 HTTPS 트래픽을 종료하려면 다음을 수행해야 합니다.

  1. 사용자 지정 도메인의 퍼블릭 ACM 인증서를 요청하세요.
  2. 유형 필드를 LoadBalancer로 설정하여 Kubernetes 서비스를 게시합니다.
  3. Kubernetes 웹사이트에서 service.beta.kubernetes.io/aws-load-balancer-ssl-cert 주석을 사용하여 Kubernetes 서비스에서 ACM 인증서의 아마존 리소스 이름(ARN)을 지정하세요. 주석을 통해 Kubernetes API 서버는 생성 시 해당 인증서를 Classic Load Balancer와 연결할 수 있습니다.
  4. 사용자 지정 도메인을 로드밸런서에 연결합니다.

다음의 해결책은 다음과 같은 사항을 가정합니다.

  • 관련 작업자 노드가 있는 활성 Amazon EKS 클러스터가 있습니다.
  • Classic Load Balancer를 사용하고 있습니다.

**참고:**Application Load Balancer를 사용하려면 Amazon EKS에 애플리케이션 로드 밸런싱을 배포해야 합니다.

**참고:**Network Load Balancer에서 TLS 연결을 종료하는 것은 Kubernetes 1.15 이상에서만 지원됩니다. 자세한 내용을 보려면 Kubernetes 웹 사이트에서 AWS NLB를 사용한 TLS 종료 지원을 참조하십시오.

해결 방법

1.    사용자 지정 도메인의 퍼블릭 ACM 인증서 요청하세요.

2.    로드밸런서의 HTTPS 리스너에 사용할 인증서의 ARN을 식별합니다.

3.    Amazon EKS 클러스터에 등록된 노드를 식별하려면 kubectl이 구성된 환경에서 다음 명령을 실행합니다.

$ kubectl get nodes

4.    텍스트 편집기에서 다음을 기반으로 deployment.yaml 매니페스트 파일을 생성합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echo-pod
  template:
    metadata:
      labels:
        app: echo-pod
    spec:
      containers:
      - name: echoheaders
        image: k8s.gcr.io/echoserver:1.10
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

5.    Kubernetes 배포 객체를 생성하려면 다음 명령어를 실행합니다.

$ kubectl create -f deployment.yaml

6.    Amazon EKS 클러스터에 Kubernetes 포드가 배포되었는지 확인하려면 다음 명령을 실행합니다.

$ kubectl get pods

참고: 포드의 레이블은 app=echo-pod입니다. 이 레이블을 서비스 객체의 선택기로 사용하여 포드 집합을 식별할 수 있습니다.

7.    텍스트 편집기에서 다음 예제를 기반으로 service.yaml 매니페스트 파일을 생성하세요. 그런 다음 service.beta.kubernetes.io/aws-load-balancer-ssl-cert 주석을 편집하여 2단계의 ACM ARN을 제공합니다.

apiVersion: v1
kind: Service
metadata:
  name: echo-service
  annotations:
    # Note that the backend talks over HTTP.
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    # TODO: Fill in with the ARN of your certificate.
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:{region}:{user id}:certificate/{id}
    # Only run SSL on the port named "https" below.
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
spec:
  selector:
    app: echo-pod
  ports:
  - name: http
    port: 80
    targetPort: 8080
  - name: https
    port: 443
    targetPort: 8080
  type: LoadBalancer

8.    서비스 객체를 생성하려면 다음 명령을 실행합니다.

$ kubectl create -f service.yaml

9.    LoadBalancer 유형 서비스의 DNS URL을 반환하려면 다음 명령을 실행합니다.

$ kubectl get service

참고: 클러스터에서 실행 중인 활성 서비스가 여러 개 있는 경우 명령 출력에서 LoadBalancer 유형의 올바른 서비스 URL을 가져오십시오.

10.    Amazon Elastic Compute Cloud(Amazon EC2) 콘솔을 열고 Load Balancers를 선택합니다.

11.    로드 밸런서를 선택한 다음, 리스너를 선택합니다.

12.    리스너 ID의 경우 로드 밸런서 포트가 443으로 설정되어 있는지 확인합니다.

13.    SSL 인증서의 경우 YAML 파일에서 정의한 SSL 인증서가 로드 밸런서에 연결되어 있는지 확인합니다.

14.    사용자 지정 도메인 이름을 로드 밸런서 이름과 연결합니다.

15.    웹 브라우저에서 다음 HTTPS 프로토콜로 사용자 지정 도메인을 테스트합니다.

https://yourdomain.com

응답이 성공하면 클라이언트에 대한 세부 정보가 포함된 웹 페이지가 반환됩니다. 이 응답에는 호스트 이름, 포드 정보, 서버 값, 요청 정보 및 요청 헤더가 포함됩니다.

중요: ACM과의 통합을 통해 로드 밸런서에 4096비트 RSA 키 또는 EC 키가 포함된 인증서를 설치할 수 없습니다. 로드 밸런서에서 키를 사용하려면 4096비트 RSA 또는 EC 키가 포함된 인증서를 AWS Identity and Access Management(IAM)에 업로드해야 합니다. 그런 다음, 해당 ARN을 service.beta.kubernetes.io/aws-load-balancer-ssl-cert 주석과 함께 사용합니다.