ACM 인증서를 사용하여 Kubernetes 워크로드 보호 - AWS 인증서 관리자

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

ACM 인증서를 사용하여 Kubernetes 워크로드 보호

Kubernetes용 AWS 컨트롤러(ACK)와 함께 AWS Certificate Manager 내보내기 가능한 퍼블릭 인증서를 사용하여 ACM에서 Kubernetes 워크로드로 퍼블릭 TLS 인증서를 발급하고 내보낼 수 있습니다. 이 통합을 통해 Amazon Elastic Kubernetes Service(Amazon EKS) 포드를 보호하고 Kubernetes 수신 시 TLS를 종료할 수 있습니다. 시작하려면 GitHub의 Kubernetes용 ACM 컨트롤러를 참조하세요.

AWS Kubernetes용 컨트롤러(ACK)는 Kubernetes API를 확장하여 네이티브 Kubernetes 매니페스트를 사용하여 AWS 리소스를 관리합니다. ACM용 ACK 서비스 컨트롤러는 Kubernetes 워크플로 내에서 자동화된 인증서 수명 주기 관리를 제공합니다. Kubernetes에서 ACM 인증서 리소스를 생성하면 ACK 컨트롤러는 다음 작업을 수행합니다.

  1. 인증서 서명 요청(CSR)을 생성하는 ACM에서 인증서를 요청합니다.

  2. 도메인 검증이 완료되고 ACM이 인증서를 발급할 때까지 기다립니다.

  3. exportTo 필드가 지정된 경우는 발급된 인증서와 프라이빗 키를 내보내고 지정된 Kubernetes 보안 암호에 저장합니다.

  4. exportTo 필드를 지정하고 인증서를 갱신할 수 있는 경우는 만료 전에 Kubernetes 보안 암호를 갱신된 인증서로 업데이트합니다.

공개적으로 발급된 인증서는 ACM이 발급하기 전에 도메인 검증이 필요합니다. Amazon Route 53용 ACK 서비스 컨트롤러를 사용하여 호스팅 영역에 필요한 DNS 검증 CNAME 레코드를 자동으로 생성할 수 있습니다.

인증서 사용 옵션

다음과 같은 몇 가지 방법으로 Kubernetes에서 ACM 인증서를 사용할 수 있습니다.

  1. 로드 밸런서 종료(내보내기 제외): ACK를 통해 인증서를 발급하고 이를 사용하여 AWS 로드 밸런서에서 TLS를 종료합니다. 인증서는 ACM에 남아 있으며 AWS Load Balancer 컨트롤러에서 자동으로 검색됩니다. 이 접근 방식은 인증서를 내보낼 필요가 없습니다.

  2. 수신 종료(내보내기 포함): ACM에서 인증서를 내보내고 수신 수준에서 TLS 종료를 위해 Kubernetes 보안 암호에 저장합니다. 이렇게 하면 Kubernetes 워크로드 내에서 직접 인증서를 사용할 수 있습니다.

참고

프라이빗 인증서가 필요한 사용 사례는 cert-manager 플러그인인 AWS Kubernetes용 프라이빗 CA 커넥터를 참조하세요.

사전 조건

ACM용 ACK 서비스 컨트롤러를 설치하기 전에 다음이 있는지 확인합니다.

  • Kubernetes 클러스터.

  • Helm이 설치되었습니다.

  • 클러스터와 통신하도록 구성된 kubectl.

  • eksctl EKS에서 포드 자격 증명 연결을 구성하기 위해 설치됩니다.

ACM용 ACK 서비스 컨트롤러 설치

Helm을 사용하여 Amazon EKS 클러스터에 ACM용 ACK 서비스 컨트롤러를 설치합니다.

  1. ACK 컨트롤러의 네임스페이스를 생성합니다.

    $ kubectl create namespace ack-system --dry-run=client -o yaml | kubectl apply -f -
  2. ACK 컨트롤러에 대한 포드 자격 증명 연결을 생성합니다. CLUSTER_NAME을 클러스터 이름으로 바꾸고 REGION을 AWS 리전으로 바꿉니다.

    $ eksctl create podidentityassociation --cluster CLUSTER_NAME --region REGION \ --namespace ack-system \ --create-service-account \ --service-account-name ack-acm-controller \ --permission-policy-arns arn:aws:iam::aws:policy/AWSCertificateManagerFullAccess
  3. Amazon ECR 퍼블릭 레지스트리에 로그인합니다.

    $ aws ecr-public get-login-password --region us-east-1 | helm registry login --username AWS --password-stdin public.ecr.aws
  4. ACM용 ACK 서비스 컨트롤러를 설치합니다. REGION을 해당 AWS 리전으로 바꿉니다.

    $ helm install -n ack-system ack-acm-controller oci://public.ecr.aws/aws-controllers-k8s/acm-chart --set serviceAccount.create=false --set serviceAccount.name=ack-acm-controller --set aws.region=REGION
  5. 컨트롤러가 실행 중인지 확인합니다.

    $ kubectl get pods -n ack-system

포드 자격 증명 연결에 대한 자세한 내용은 Amazon EKS 사용 설명서의 EKS 포드 자격 증명을 참조하세요.

예: 수신 시 TLS 종료

다음 예제에서는 ACM 인증서를 내보내고 이를 사용하여 Kubernetes 수신 수준에서 TLS를 종료하는 방법을 보여줍니다. 이 구성은 ACM 인증서를 생성하고, Kubernetes 보안 암호로 내보내고, TLS 종료에 인증서를 사용하도록 수신 리소스를 구성합니다.

이 예시에서는 다음이 적용됩니다.

  • 내보낸 인증서를 저장하기 위해 보안 암호가 생성됩니다(exported-cert-secret).

  • ACK 인증서 리소스는 도메인에 대해 ACM에서 인증서를 요청하고 exported-cert-secret 보안 암호로 내보냅니다.

  • 수신 리소스는 exported-cert-secret를 참조하여 수신 트래픽에 대한 TLS를 종료합니다.

${HOSTNAME}을 사용자 이름으로 바꿉니다.

apiVersion: v1 kind: Secret type: kubernetes.io/tls metadata: name: exported-cert-secret namespace: demo-app data: tls.crt: "" tls.key: "" --- apiVersion: acm.services.k8s.aws/v1alpha1 kind: Certificate metadata: name: exportable-public-cert namespace: demo-app spec: domainName: ${HOSTNAME} options: certificateTransparencyLoggingPreference: ENABLED exportTo: namespace: demo-app name: exported-cert-secret key: tls.crt --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-traefik namespace: demo-app spec: tls: - hosts: - ${HOSTNAME} secretName: exported-cert-secret ingressClassName: traefik rules: - host: ${HOSTNAME} http: paths: - path: / pathType: Prefix backend: service: name: whoami port: number: 80

배포되면 ACM용 ACK 서비스 컨트롤러는 갱신을 포함하여 인증서 수명 주기를 자동으로 관리합니다. ACM이 인증서를 갱신하면 컨트롤러는 exported-cert-secret 보안 암호를 새 인증서로 업데이트하여 수신이 수동 개입 없이 유효한 인증서를 계속 사용하도록 합니다.