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

3분 분량
0

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

간략한 설명

Kubernetes Service 객체에 대해 Elastic Load Balancing 수준에서 HTTPS 트래픽을 종료하려면 다음을 수행해야 합니다.

  1. 사용자 지정 도메인에 대해 공개 ACM 인증서를 요청합니다.
  2. type(유형) 필드를 LoadBalancer로 설정하여 Kubernetes 서비스를 게시합니다.
  3. service.beta.kubernetes.io/aws-load-balancer-ssl-cert 주석을 사용하여 Kubernetes 서비스에서 ACM 인증서의 Amazon 리소스 이름(ARN)을 지정합니다(Kubernetes 웹사이트 참조). 주석을 사용하면 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 Deployment 객체를 생성하려면 다음 명령을 실행합니다.

$ kubectl create -f deployment.yaml

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

$ kubectl get pods

참고: 포드에는 app=echo-pod 레이블이 지정되어 있습니다. 이 레이블을 포트 집합을 식별하기 위한 Service 객체의 선택기로 사용할 수 있습니다.

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.    Service 객체를 생성하려면 다음 명령을 실행합니다.

$ 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

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

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


AWS 공식
AWS 공식업데이트됨 2년 전