기존 Kubernetes 클러스터에 TLS 활성화

기존 Kubernetes 클러스터에 TLS 활성화 (Enable TLS on Existing Kubernetes Cluster)

이 문서는 이미 Kubernetes에 배포된 Consul 클러스터에 가동 중지 시간을 최소화하면서 TLS를 점진적으로 롤아웃하는 방법을 설명해요. 서비스 메시를 사용하지 않는 경우와 사용하는 경우의 절차를 각각 다룰게요.

출처: 문서

본문

Consul Helm 버전 0.16.0부터 차트는 클러스터 내 통신을 위한 TLS를 지원합니다. 이미 Kubernetes에 Consul 클러스터가 배포되어 있다면 애플리케이션 가동 중지 시간을 최소화하는 방식으로 TLS를 구성할 수 있습니다. Consul은 이미 기존 클러스터에서 가동 중지 없이 TLS를 롤아웃하는 것을 지원합니다. 그러나 Kubernetes 사용 사례에 따라 업그레이드 절차가 다를 수 있습니다.

Consul 서비스 메시 없는 점진적 TLS 롤아웃 (Gradual TLS Rollout without Consul Service Mesh)

서비스 메시를 사용하지 않는다면 이 프로세스를 따릅니다.

  1. 다음 구성으로 Helm 업그레이드를 실행합니다:

    global:
      tls:
        enabled: true
        # This configuration sets `verify_outgoing`, `verify_server_hostname`,
        # and `verify_incoming` to `false` on servers and clients,
        # which allows TLS-disabled nodes to join the cluster.
        verify: false
    server:
      updatePartition: <number_of_server_replicas>
    

    이 업그레이드는 consul-k8s 구성 요소의 롤링 업데이트를 트리거합니다.

  2. Consul 서버 업그레이드에 설명된 대로 서버의 롤링 업그레이드를 수행합니다.

  3. global.tls.verify를 true로 설정해 TLS 검증을 켜면서 단계 1과 2를 반복합니다.

Consul 서비스 메시와 함께 점진적 TLS 롤아웃 (Gradual TLS Rollout with Consul Service Mesh)

사이드카 Envoy 프록시가 서비스 디스커버리를 위해 Consul 클라이언트 에이전트와 정기적으로 통신해야 하므로, TLS가 활성화된 프록시를 애플리케이션 파드에 다시 주입하지 않고는 클라이언트에서 TLS를 활성화할 수 없습니다. 최소 가동 중지로 TLS 롤아웃을 수행하려면 새 Kubernetes 노드 풀을 추가하고 애플리케이션을 그쪽으로 마이그레이션할 것을 권장합니다.

  1. 동일한 새 노드 풀을 추가합니다.

  2. kubectl cordon을 실행해 기존 풀의 모든 노드를 cordon 처리합니다. 이 명령은 Kubernetes가 해당 노드에 새 워크로드를 스케줄링하지 않고 대신 새 TLS 활성화 노드에 스케줄링하도록 보장합니다.

  3. 업그레이드를 위해 다음 Helm 구성 파일을 만듭니다:

    global:
      tls:
        enabled: true
        # This configuration sets `verify_outgoing`, `verify_server_hostname`,
        # and `verify_incoming` to `false` on servers and clients,
        # which allows TLS-disabled nodes to join the cluster.
        verify: false
    server:
      updatePartition: <number_of_server_replicas>
    client:
      updateStrategy: |
        type: OnDelete
    

    이 구성에서 Consul 서버 업그레이드에 설명된 대로 server.updatePartition을 서버 복제본 수로 설정합니다.

  4. 위 구성 파일로 helm upgrade를 실행합니다.

  5. 이 시점에 모든 구성 요소(예: Consul 서비스 메시 webhook과 sync catalog)는 새 노드 풀에서 실행되어야 합니다.

  6. 모든 메시 활성화 애플리케이션을 다시 배포합니다. 재배포를 트리거하는 한 가지 방법은 기존 풀의 노드에서 kubectl drain을 실행하는 것입니다. 이제 서비스 메시 webhook이 TLS를 인지하므로 사이드카 프록시에 TLS 구성을 추가합니다. 또한 Kubernetes는 이러한 애플리케이션을 새 노드 풀에 스케줄링해야 합니다.

  7. Consul 서버 업그레이드에 설명된 서버의 롤링 업그레이드를 수행합니다.

  8. 모든 것이 정상이면 기존 노드 풀을 삭제합니다.

  9. 마지막으로 Helm 구성 파일에서 global.tls.verify를 true로 설정하고 client.updateStrategy 속성을 제거한 후 서버의 롤링 업그레이드를 수행합니다.

참고: 노드 풀을 완전히 복제하지 않고도 이 업그레이드를 수행할 수 있습니다. 기존 노드 풀 내의 Kubernetes 노드 하위 집합을 drain하고 그것을 "새 노드 풀"로 취급할 수 있습니다. 그런 다음 위 지침을 따릅니다. 이 과정을 노드 풀의 나머지 노드에 대해 반복합니다.

더 알아보기 (Learn more)