TLS 인증서를 사용하여 Amazon EKS 애플리케이션의 HTTPS 연결을 활성화하려면 어떻게 해야 하나요?

3분 분량
0

전송 계층 보안(TLS) 인증서를 사용하여 Amazon Elastic Kubernetes Service(Amazon EKS) 애플리케이션의 HTTPS 연결을 활성화하고 싶습니다.

간략한 설명

Amazon EKS 애플리케이션의 HTTPS 연결을 활성화하려면 다음을 수행해야 합니다.

  • 사용자 지정 도메인을 위한 유효한 TLS 인증서를 받습니다.
  • 로드 밸런서 서비스 유형을 사용하여 Kubernetes 서비스를 노출하거나 AWS Load Balancer Controller를 사용하여 Kubernetes 수신 객체를 노출합니다.
  • 사용자 지정 도메인을 로드 밸런서의 DNS에 연결합니다.

해결 방법

사용자 지정 도메인을 위한 유효한 TLS 인증서 받기:

1.    사용자 지정 도메인을 위한 퍼블릭 AWS Certificate Manager(ACM)를 요청하거나 자체 TLS 인증서를 ACM에 업로드합니다.

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

3.    샘플 NGINX 배포를 생성하려면 다음 명령을 실행합니다.

$ kubectl create deploy web --image=nginx --port 80 --replicas=3

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

$ kubectl get pods -l app=web

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

로드 밸런서 서비스 유형을 사용하여 Kubernetes 서비스 노출

참고: 수신 객체를 사용하여 애플리케이션을 노출하려면 수신 객체를 사용하여 Kubernetes 서비스 노출 섹션으로 건너뛰세요.

1.    LoadBalancer 서비스 유형을 사용하여 service.yaml 매니페스트 파일을 생성합니다. 예를 들어 다음과 같습니다.

cat <<EOF > loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
  name: lb-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-tls-cert: arn:aws:acm:{region}:{user id}:certificate/{id}
    # Only run TLS on the port named "https" below.
    service.beta.kubernetes.io/aws-load-balancer-tls-ports: "https"
    # By default In-tree controller will create a Classic LoadBalancer if you require a NLB uncomment below annotation.
    # service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  selector:
    app: web
  ports:
  - name: http
    port: 80
    targetPort: 80
  - name: https
    port: 443
    targetPort: 80
  type: LoadBalancer
EOF

2.    ACM의 ARN을 포함하도록 service.beta.kubernetes.io/aws-load-balancer-tls-cert 주석을 편집합니다.

3.    다음 명령을 실행하여 loadbalancer.yaml 파일을 적용합니다.

$ kubectl create -f loadbalancer.yaml

4.    사용자 지정 도메인을 로드 밸런서의 DNS에 연결 섹션으로 건너뜁니다.

수신 객체를 사용하여 Kubernetes 서비스 노출

참고: 다음 해결 방법에서는 Amazon EKS 클러스터에 AWS Load Balancer Controller를 설치했다고 가정합니다.

1.    다음 예를 기반으로 NodePort 유형의 Kubernetes 서비스를 생성합니다.

cat  <<EOF  > ingressservice.yaml
apiVersion: v1
kind: Service
metadata:
  name: web-nginx
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: NodePort
  selector:
    app: web
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "web-nginx-ingress"
  annotations:
    # Below annotation is to specify if the loadbalancer is "internal" or "internet-facing"    
    alb.ingress.kubernetes.io/scheme: internet-facing
    # TODO: Fill in with the ARN of your certificate.
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:xxxx:certificate/xxxxxx
    # TODO: Fill in the listening ports.
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    # Set HTTP to HTTPS redirects. Every HTTP listener configured will be redirected to below mentioned port over HTTPS.
    alb.ingress.kubernetes.io/tls-redirect: '443'
  labels:
    app: web
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: "web-nginx"
                port:
                  number: 80
EOF

참고: 앞서 언급한 수신 매니페스트는 HTTP 및 HTTPS를 수신한 다음, ALB에서 TLS를 종료하고 HTTP를 HTTPS로 리디렉션합니다.

2.    다음 명령을 실행하여 ingressservice.yaml 파일을 적용합니다.

$ kubectl create -f ingressservice.yaml

사용자 지정 도메인을 로드 밸런서의 DNS에 연결

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

$ kubectl get service

2.    다음 명령을 실행하여 Ingress 유형 서비스의 DNS URL을 반환합니다.

$ kubectl get ingress/web-nginx-ingress

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

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

https://yourdomain.com

AWS 공식
AWS 공식업데이트됨 한 달 전