사용자 지정 Consul 주입(injection) 동작

사용자 지정 Consul 주입(injection) 동작

Consul 인젝터를 활성화하여 Kubernetes에서 Consul의 서비스 메시 기능을 사용하는 방법과, Consul 및 Kubernetes 네임스페이스의 기본값 같은 사용자 지정 주입 동작을 구성하는 방법을 설명해 드릴게요.

출처: 문서

본문

이 페이지는 Kubernetes에서 Consul의 서비스 메시 기능을 사용할 수 있도록 Consul 인젝터를 활성화하는 과정과, Consul 및 Kubernetes 네임스페이스의 기본값 같은 사용자 지정 주입 동작을 구성하는 과정을 설명해요.

connect 인젝터 활성화

서비스 메시 사이드카 프록시는 consul-k8s 프로젝트에서 제공하는 connect 인젝터에 대한 mutating admission webhook 호출을 통해 주입돼요. 이를 통해 위의 사용 섹션에 표시된 자동 pod 변경이 활성화돼요. mutating admission webhook의 설치는 Helm 차트를 사용하여 자동화돼요.

connect 인젝터를 설치하려면 Helm 값으로 connect 주입 기능을 활성화하고, 기존 설치의 경우 helm upgrade, 새 설치의 경우 helm install로 설치를 업그레이드해 주세요.

connectInject:
  enabled: true

이렇게 하면 주입 어노테이션이 true로 설정된 경우에 주입하도록 인젝터가 구성돼요. Helm 차트의 다른 값은 인젝터가 실행되는 네임스페이스를 제한하거나, 기본적으로 주입을 활성화하는 데 사용할 수 있어요.

주입 확인

설치를 확인하려면 위의 "사용(Usage)" 섹션에서 "Accepting Inbound Connections" 예시를 실행해 주세요. 이 예시를 실행한 후 kubectl get pod static-server --output yaml을 실행해 보세요. 원시 YAML 출력에서 connect 주입 컨테이너와 consul.hashicorp.com/connect-inject-status가 injected로 설정된 어노테이션을 볼 수 있어야 해요. 이를 통해 주입이 제대로 작동하는지 확인할 수 있어요.

이런 항목이 보이지 않으면 kubectl logs를 인젝터 pod에 대해 실행하고 오류가 있는지 확인해 주세요.

어노테이션으로 주입 제어

기본적으로 인젝터는 pod(디플로이먼트가 아닌)의 주입 어노테이션이 true로 설정된 경우에만 주입해요:

annotations:
  'consul.hashicorp.com/connect-inject': 'true'

주입 기본값

인젝터가 항상 주입하도록 하려면 Helm 차트에서 기본값을 true로 설정할 수 있어요:

connectInject:
  enabled: true
  default: true

그런 다음 어노테이션을 통해 특정 pod를 제외할 수 있어요:

annotations:
  'consul.hashicorp.com/connect-inject': 'false'

네임스페이스에 대한 주입 제어

k8sAllowNamespaces 및 k8sDenyNamespaces 키를 통해 주입이 허용되는 Kubernetes 네임스페이스를 제어할 수 있어요:

connectInject:
  enabled: true
  k8sAllowNamespaces: ['*']
  k8sDenyNamespaces: []

기본 구성(위에 표시)에서는 모든 네임스페이스의 서비스가 주입될 수 있어요. 주입 여부는 connectInject.default 값과 consul.hashicorp.com/connect-inject 어노테이션 값에 따라 달라져요.

특정 네임스페이스에서만 주입을 활성화하려면 k8sAllowNamespaces 키에 해당 네임스페이스만 나열할 수 있어요. 아래 구성에서는 my-ns-1 및 my-ns-2 네임스페이스만 주입에 활성화돼요. 다른 모든 네임스페이스는 connect 주입 어노테이션이 설정되어 있어도 무시돼요.

connectInject:
  enabled: true
  k8sAllowNamespaces: ['my-ns-1', 'my-ns-2']
  k8sDenyNamespaces: []

특정 네임스페이스 제외 모든 네임스페이스에서 주입을 활성화하려면 allow 목록에 *를 사용하여 모든 네임스페이스를 허용한 다음 deny 목록에 제외할 네임스페이스를 지정할 수 있어요:

connectInject:
  enabled: true
  k8sAllowNamespaces: ['*']
  k8sDenyNamespaces: ['no-inject-ns-1', 'no-inject-ns-2']

참고: deny 목록은 allow 목록보다 우선해요. 네임스페이스가 두 목록 모두에 있으면 동기화되지 않아요.

참고: kube-system 및 kube-public 네임스페이스는 절대 주입되지 않아요.

Consul Enterprise 네임스페이스

Consul Enterprise 1.7 이상은 Consul 네임스페이스를 지원해요. Kubernetes pod가 Consul에 등록될 때 어느 Consul 네임스페이스에 등록할지 제어할 수 있어요.

세 가지 옵션을 사용할 수 있어요:

  1. 단일 대상 네임스페이스 (Single Destination Namespace) – 네임스페이스에 관계없이 모든 Kubernetes pod를 동일한 Consul 네임스페이스에 등록해요.

다음과 같이 구성할 수 있어요:

global:
  enableConsulNamespaces: true

connectInject:
  enabled: true
  consulNamespaces:
    consulDestinationNamespace: 'my-consul-ns'

참고: 대상 네임스페이스가 존재하지 않으면 생성해요.

  1. 네임스페이스 미러링 (Mirror Namespaces) – 각 Kubernetes pod를 해당 Kubernetes 네임스페이스와 동일한 이름의 Consul 네임스페이스에 등록해요. 예를 들어 Kubernetes 네임스페이스 ns-1의 pod foo는 Consul 네임스페이스 ns-1로 동기화돼요. 미러링된 네임스페이스가 Consul에 존재하지 않으면 생성돼요.

다음과 같이 구성할 수 있어요:

global:
  enableConsulNamespaces: true

connectInject:
  enabled: true
  consulNamespaces:
    mirroringK8S: true
  1. 접두사가 있는 네임스페이스 미러링 (Mirror Namespaces With Prefix) – 각 Kubernetes pod를 해당 Kubernetes 네임스페이스와 동일한 이름 + 접두사의 Consul 네임스페이스에 등록해요. 예를 들어 접두사 k8s-가 주어지면 Kubernetes 네임스페이스 ns-1의 pod foo는 Consul 네임스페이스 k8s-ns-1로 동기화돼요.

다음과 같이 구성할 수 있어요:

global:
  enableConsulNamespaces: true

connectInject:
  enabled: true
  consulNamespaces:
    mirroringK8S: true
    mirroringK8SPrefix: 'k8s-'

Consul Enterprise 네임스페이스 업스트림

투명 프록시가 활성화되고 ACL이 비활성화된 경우 업스트림은 Consul 네임스페이스 간에 자동으로 구성돼요. ACL이 활성화된 경우 의도를 지정하여 구성해야 하며, 이를 통해 Consul 네임스페이스 간의 서비스가 서로 통신할 수 있게 해요.

consul.hashicorp.com/connect-service-upstreams 어노테이션을 통해 업스트림을 명시적으로 지정하려면 [service-name].[namespace]:[port]:[optional datacenter] 형식을 사용해 주세요:

annotations:
  'consul.hashicorp.com/connect-inject': 'true'
  'consul.hashicorp.com/connect-service-upstreams': '[service-name].[namespace]:[port]:[optional datacenter]'

자세한 내용은 consul.hashicorp.com/connect-service-upstreams를 참고해 주세요.

참고: 업스트림 어노테이션으로 업스트림을 지정할 때는 KubeDNS 대신 업스트림 어노테이션의 포트와 함께 localhost:<port>를 사용하여 업스트림 애플리케이션에 연결해야 해요.

더 알아보기 (Learn more)