Helm으로 Kubernetes에 Consul 설치하기

Helm으로 Kubernetes에 Consul 설치하기 (Install Consul on Kubernetes with Helm)

이 문서는 공식 Consul Helm 차트를 사용해 Kubernetes에 Consul을 설치하는 방법을 알려드릴게요. 멀티 클러스터 환경에서 교차 파티션(cross-partition)이나 교차 데이터센터 통신이 필요할 때 권장되는 방식이에요.

출처: 문서

본문

이 항목은 공식 Consul Helm 차트를 사용하여 Kubernetes에 Consul을 설치하는 방법을 설명합니다. 교차 파티션 또는 교차 데이터센터 통신을 포함하는 멀티 클러스터 배포를 위해 Kubernetes에 Consul을 설치한다면 이 방법을 권장합니다.

Consul K8s CLI를 사용하여 Kubernetes에 Consul을 설치하는 방법은 Consul K8s CLI로 Kubernetes에 Consul 설치 [/consul/docs/deploy/server/k8s/consul-k8s]를 참조하세요.

소개 (Introduction)

교차 파티션 또는 교차 데이터센터 통신을 포함하는 멀티 클러스터 설치를 위해 Kubernetes에 Consul을 설치할 때는 Consul Helm 차트를 사용하는 것이 좋습니다. Helm 차트는 Consul을 실행하는 데 필요한 모든 구성 요소를 설치하고 구성합니다.

워크로드가 Kubernetes에 완전히 배포된 경우 Consul은 Kubernetes에서 직접 실행되어 Consul 기능을 활용할 수 있습니다. 이기종 워크로드의 경우 Consul 에이전트는 Kubernetes 내부 또는 외부에서 실행되는 서버에 합류할 수 있습니다. 일반적인 아키텍처에 대해 자세히 알아보려면 Kubernetes의 Consul 아키텍처 [/consul/docs/architecture/control-plane/k8s]를 참조하세요.

Helm 차트는 여러 유용한 구성을 노출하고 복잡한 리소스를 자동으로 설정하지만, Consul을 자동으로 운영하지는 않습니다. Consul 클러스터를 모니터링, 백업, 업그레이드하는 방법을 여전히 숙지해야 합니다.

Helm 차트는 필수 구성이 없으므로 기본 구성으로 Consul 클러스터를 설치합니다. 프로덕션에 들어가기 전에 구성 옵션 [/consul/docs/reference/k8s/helm]에 대해 학습하는 것을 강력히 권장합니다.

경고

기본적으로 Helm은 새 사용자에게 최적화된 바로 사용 가능한(out-of-box) 환경을 위해 보안 구성을 비활성화한 상태로 Consul을 설치합니다. 올바르게 보안된 Kubernetes 클러스터를 사용하거나 Consul의 보안 기능 [/consul/docs/secure]을 이해하고 활성화한 후 프로덕션에 들어가는 것을 강력히 권장합니다. 일부 보안 기능은 Helm 차트에서 지원되지 않으며 추가 수동 구성이 필요합니다.

Kubernetes용 서비스 메시로 Consul을 직접 체험하려면 Getting Started with Consul service mesh [/consul/tutorials/get-started-kubernetes] 튜토리얼을 따라해 보세요.

요구 사항 (Requirements)

Helm으로 Kubernetes에 Consul을 설치하려면 다음 요구 사항을 충족해야 합니다:

요구 사항에 따라 다음을 할 수 있습니다:

  • 기본 Helm 차트 구성을 사용하여 기본 설치 [/consul/docs/deploy/server/k8s/helm#install-consul]를 수행합니다. Consul을 테스트하거나 보안 요구 사항이 없는 테스트 환경을 설정하는 경우 이 옵션을 사용하세요.
  • Helm 차트 구성 파라미터를 수정하여 사용자 지정 설치 [/consul/docs/deploy/server/k8s/helm#custom-installation]를 수행합니다. 프로덕션에 Consul을 설치하는 경우 권장되는 접근 방식입니다.

HashiCorp Helm 저장소 추가 (Add HashiCorp Helm Repository)

설치 전에 HashiCorp 저장소를 Helm에 추가합니다.

$ helm repo add hashicorp https://helm.releases.hashicorp.com
 "hashicorp" has been added to your repositories

Consul 설치 (Install Consul)

  • Consul 차트에 접근할 수 있는지 확인합니다:
$ helm search repo hashicorp/consul
NAME                CHART VERSION   APP VERSION DESCRIPTION
hashicorp/consul    2.0.1           2.0.1       Official HashiCorp Consul Chart
  • Helm으로 Kubernetes에 Consul을 설치하기 전에 consul Kubernetes 네임스페이스가 존재하지 않는지 확인합니다. Consul을 전용 네임스페이스에 설치하는 것이 좋습니다.
$ kubectl get namespace
NAME              STATUS   AGE
default           Active   18h
kube-node-lease   Active   18h
kube-public       Active   18h
kube-system       Active   18h

참고

기본 consul이 아닌 K8s 네임스페이스에서 Consul을 배포하거나 업그레이드할 때 오류가 발생하면 다음 기술적 제약 사항 목록을 참조하세요.

  • Consul은 대상 K8s 네임스페이스를 자동으로 감지할 수 없으며, Helm 또는 consul-k8s 도구 파라미터에 -namespace로 명시적으로 나열해야 합니다.

  • Consul은 대상 K8s 네임스페이스를 connectInjector.k8sAllowNamspaces Helm 차트 값에 추가해야 합니다. 자세한 내용은 Consul Helm 차트 참조 [/consul/docs/reference/k8s/helm#v-connectinject-k8sallownamespaces]에서 이 특정 설정을 참조하세요.

  • Helm을 사용하여 Kubernetes에 Consul을 설치합니다. Helm 차트는 배포를 설정하는 모든 작업을 수행합니다. 설치 후 에이전트는 자동으로 클러스터를 형성하고, 리더를 선출하며, 필요한 에이전트를 실행합니다.

  • 다음 명령을 실행하여 기본 구성으로 Kubernetes에 최신 버전의 Consul을 설치합니다.

$ helm install consul hashicorp/consul --set global.name=consul --create-namespace --namespace consul

Helm 설치의 -n 플래그 값을 수정하여 원하는 전용 네임스페이스에 Consul을 설치할 수도 있습니다.

  • Kubernetes에 특정 버전의 Consul을 설치하려면 --version 플래그와 함께 다음 명령을 실행하세요:
$ export VERSION=1.0.1 && \
    helm install consul hashicorp/consul \
      --set global.name=consul \
      --version ${VERSION} \
      --create-namespace \
      --namespace consul

사용자 지정 설치 (Custom installation)

설치를 사용자 지정하려면 기본 설정을 재정의하는 values.yaml 파일을 만듭니다. 어떤 설정이 가능한지 알아보려면 helm inspect values hashicorp/consul을 실행하거나 Helm 차트 참조 [/consul/docs/reference/k8s/helm]를 검토하세요.

다음 섹션에는 참고로 사용할 수 있는 사용자 지정 예시가 포함되어 있습니다:

  • 최소 Consul 서비스 메시 설치 [/consul/docs/deploy/server/k8s/helm#minimal-values-yaml-for-consul-service-mesh]
  • API 게이트웨이 구성 선택 [/consul/docs/deploy/server/k8s/helm#select-api-gateway-configuration]
  • OpenShift 클러스터에 Consul 설치 [/consul/docs/deploy/server/k8s/helm#install-consul-on-openshift-clusters]
  • Consul CNI 플러그인 활성화 [/consul/docs/deploy/server/k8s/helm#enable-the-consul-cni-plugin]
  • 선택한 네임스페이스에 Consul 서비스 메시 활성화 [/consul/docs/deploy/server/k8s/helm#enable-consul-service-mesh-on-select-namespaces]

Consul 서비스 메시용 최소 values.yaml (Minimal values.yaml for Consul service mesh)

다음 values.yaml 구성 파일에는 Consul 서비스 메시 [/consul/docs/connect/k8s]를 활성화하는 데 필요한 최소 설정이 포함되어 있습니다:

values.yaml

global:
  name: consul

values.yaml 파일을 만든 후 --values 플래그와 함께 helm install을 실행합니다:

$ helm install consul hashicorp/consul --create-namespace --namespace consul --values values.yaml
NAME: consul
...

API 게이트웨이 구성 선택 (Select API gateway configuration)

완전히 기능하는 Consul 배포에는 API 게이트웨이가 필요합니다. 아래 다이어그램을 사용하여 플랫폼을 식별하고 인프라에 맞는 올바른 API 게이트웨이 구현을 선택하세요.

이 표는 다이어그램과 동일한 정보를 보여주며 각 플랫폼 구성에 필요한 Helm 값을 설명합니다.

| | 플랫폼 | 플랫폼 구성 | 게이트웨이 | Helm 값 | | OCP ≤ 4.18 | TCPRoute 필요 | 표준 API 게이트웨이 | global.installK8sNetworkingCRDs=true, global.openshift.crds.enableTcpRoute=true | | OCP ≥ 4.19 | TCPRoute 불필요 | 표준 API 게이트웨이 | global.installK8sNetworkingCRDs=false, global.openshift.isOcpGreaterthan4_18=true, global.openshift.crds.enableTcpRoute=false | | OCP ≥ 4.19 | TCPRoute 존재/필요 | Consul API 게이트웨이 | global.installK8sNetworkingCRDs=false, global.openshift.isOcpGreaterthan4_18=true, global.openshift.crds.enableTcpRoute=false, global.openshift.crds.consulapi.enabled=true | | Non-OCP | 플랫폼이 CRD를 관리하지 않음 | 표준 API 게이트웨이 | global.installK8sNetworkingCRDs=true, global.crds.enableTcpRoute=true | | Non-OCP | 플랫폼이 CRD를 관리, TCPRoute 불필요 | 표준 API 게이트웨이 | global.installK8sNetworkingCRDs=false, global.crds.enableTcpRoute=false | | Non-OCP | 플랫폼이 CRD를 관리, TCPRoute 필요 | Consul API 게이트웨이 | global.installK8sNetworkingCRDs=false, global.crds.enableTcpRoute=false, global.crds.consulapi.enabled=true |

OpenShift 클러스터에 Consul 설치 (Install Consul on OpenShift clusters)

Red Hat OpenShift [https://www.redhat.com/en/technologies/cloud-computing/openshift]는 보안에 민감하고 의견이 반영된(opinionated) Kubernetes 래퍼입니다. OpenShift 관리 Kubernetes에 Consul을 설치하려면 다음 명령을 실행하여 OCP 버전과 클러스터에 TCPRoute 리소스가 있는지 확인합니다:

  • OCP 버전을 확인합니다.
oc version
  • 클러스터가 TCPRoute를 사용하는지 확인합니다.
kubectl get tcproutes -A

출력을 사용하여 올바른 탭을 선택합니다:

  • OCP 버전이 4.19 이상이고 TCPRoute 리소스가 없으면 OpenShift >= 4.19, TCPRoute 불필요 탭을 사용합니다.
  • OCP 버전이 4.19 이상이고 TCPRoute 리소스가 있으면 OpenShift >= 4.19, TCPRoute 필요 탭을 사용합니다.
  • OCP 버전이 4.18 이하이면 OpenShift <= 4.18 탭을 사용합니다.

values.yaml (OpenShift <= 4.18, 표준 API 게이트웨이)

global:
  installK8sNetworkingCRDs: true
  openshift:
    enabled: true
    crds:
      enableTcpRoute: true

values.yaml (OpenShift >= 4.19, TCPRoute 불필요, 표준 API 게이트웨이)

global:
  installK8sNetworkingCRDs: false
  openshift:
    enabled: true
    isOcpGreaterthan4_18: true
    crds:
      enableTcpRoute: false

values.yaml (OpenShift >= 4.19, TCPRoute 필요, Consul API 게이트웨이)

global:
  installK8sNetworkingCRDs: false
  openshift:
    enabled: true
    isOcpGreaterthan4_18: true
    crds:
      enableTcpRoute: false
      consulapi:
        enabled: true

추가 정보는 Helm 차트 참조 [/consul/docs/reference/k8s/helm#v-global-openshift]의 openshift를 참조하세요.

Consul 구성 업데이트 (Update your Consul configuration)

이미 Consul을 설치했고 변경하고 싶다면 helm upgrade를 실행해야 합니다. 자세한 내용은 업그레이드 [/consul/docs/upgrade/k8s]를 참조하세요.

Consul CNI 플러그인 활성화 (Enable the Consul CNI plugin)

기본적으로 Consul이 투명 프록시 모드 [/consul/docs/k8s/connect/transparent-proxy]일 때 Consul은 Kubernetes 포드 시작 프로세스의 일부로 connect-inject-init init 컨테이너를 주입합니다. 이 컨테이너는 사이드카 프록시를 통해 서비스 메시의 트래픽 리다이렉션을 구성합니다. 리다이렉션을 구성하려면 컨테이너에 높은 CAP_NET_ADMIN 권한이 필요하며, 이는 조직의 보안 정책과 호환되지 않을 수 있습니다.

대신 트래픽 리다이렉션을 수행하도록 Consul 컨테이너 네트워크 인터페이스(CNI) 플러그인을 활성화할 수 있습니다. 플러그인은 로컬 Kubernetes kubelet에 의해 실행되므로 네트워크를 구성하는 데 필요한 높은 권한을 이미 가지고 있습니다.

Consul Helm 차트는 Consul CNI 플러그인 설치를 담당합니다. 플러그인이 설치되도록 구성하려면 values.yaml 파일에 다음 구성을 추가하세요:

values.yaml (참조 구성)

global:
  name: consul
connectInject:
  enabled: true
  cni:
    enabled: true
    logLevel: info
    cniBinDir: "/opt/cni/bin"
    cniNetDir: "/etc/cni/net.d"

values.yaml (GKE 구성)

global:
  name: consul
connectInject:
  enabled: true
  cni:
    enabled: true
    logLevel: info
    cniBinDir: "/home/kubernetes/bin"
    cniNetDir: "/etc/cni/net.d"

values.yaml (OpenShift 구성)

global:
  name: consul
  openshift:
    enabled: true
connectInject:
  enabled: true
  cni:
    enabled: true
    logLevel: info
    multus: true
    cniBinDir: "/var/lib/cni/bin"
    cniNetDir: "/etc/kubernetes/cni/net.d"

다음 표는 사용 가능한 CNI 플러그인 옵션을 설명합니다:

| | 옵션 | 설명 | 기본값 | | cni.enabled | CNI 플러그인을 활성화하거나 비활성화하는 불리언 값. true이면 플러그인이 서비스 메시의 트래픽 리다이렉션을 담당. false이면 connect-inject init 컨테이너가 리다이렉션을 처리. | false | | cni.logLevel | 설치 관리자와 플러그인의 로그 수준을 지정하는 문자열 값. 다음 값을 지정할 수 있음: info, debug, error. | info | | cni.namespace | CNI 플러그인을 설치할 네임스페이스를 설정. CNI 리소스에 대한 전역 네임스페이스 설정을 재정의함. 예: kube-system | consul-k8s 설치에 사용되는 네임스페이스, 예: consul | | cni.multus | multus CNI 플러그인 지원을 활성화하는 불리언 값. true이면 multus가 활성화됨. false이면 Consul CNI가 체인드 플러그인(chained plugin)으로 작동. | false | | cni.cniBinDir | CNI 플러그인이 설치되는 Kubernetes 노드의 위치를 지정하는 문자열 값. | /opt/cni/bin | | cni.cniNetDir | CNI 구성을 저장하는 Kubernetes 노드의 위치를 지정하는 문자열 값. | /etc/cni/net.d |

참고

GKE Autopilot 클러스터는 Consul CNI 플러그인 설치를 지원하지 않습니다.

  • Consul CNI 플러그인 설치 관리자는 Kubernetes 노드 수준 hostPath 볼륨에 대한 쓰기 권한이 필요합니다. 이 접근 권한은 CNI 바이너리를 노드 CNI bin 디렉터리에 배치하고, /etc/cni/net.d 아래에 CNI 구성을 쓰고, CNI 설치를 조정(예: 토큰 회전 및 CNI 플러그인 구성 업데이트)하는 데 필요합니다.
  • GKE Autopilot은 쓰기 모드의 hostPath 볼륨을 제한하고 권한 있는 워크로드를 차단하므로 autogke-no-write-mode-hostpath 및 autogke-disallow-privilege 같은 입장(admission) 오류로 CNI 설치가 실패할 수 있습니다. Google의 Autopilot 보안 제한 [https://docs.cloud.google.com/kubernetes-engine/docs/concepts/autopilot-security#built-in-security]을 참조하세요.
  • GKE Autopilot에서 트래픽 리다이렉션을 구성하려면 Pod 수준에서 CAP_NET_ADMIN 권한이 있는 connect-inject-init 컨테이너를 사용하세요. Autopilot에서 클러스터에 --workload-policies=allow-net-admin을 사용하여 NET_ADMIN을 활성화하고 Pod 보안 컨텍스트에서 NET_ADMIN을 허용하여 init 컨테이너가 iptables를 구성할 수 있게 하세요.

선택한 네임스페이스에 Consul 서비스 메시 활성화 (Enable Consul service mesh on select namespaces)

기본적으로 Consul 서비스 메시는 kube-system과 local-path-storage를 제외한 Kubernetes 클러스터의 거의 모든 네임스페이스에서 활성화됩니다. 서비스 메시를 네임스페이스 하위 집합으로 제한하려면:

  • 서비스 메시를 배포하려는 각 네임스페이스에 연결된 레이블과 일치하는 namespaceSelector를 지정합니다. 레이블별로 선택한 네임스페이스에서 기본적으로 서비스 메시를 활성화하려면 connectInject.default 값을 true로 설정해야 합니다.

values.yaml

global:
  name: consul
connectInject:
  enabled: true
  default: true
  namespaceSelector: |
    matchLabels:
      connect-inject : enabled
  • Consul 서비스 메시를 활성화하려는 네임스페이스에 레이블을 지정합니다.
$ export NAMESPACE=foo && \
    kubectl create ns $NAMESPACE && \
    kubectl label namespace $NAMESPACE connect-inject=enabled
  • --values 플래그와 함께 helm install을 실행합니다:
$ helm install consul hashicorp/consul --create-namespace --namespace consul --values values.yaml
NAME: consul

사용법 (Usage)

설치 후 Consul UI를 보고 Consul HTTP API에 접근할 수 있습니다.

Consul UI 보기 (Viewing the Consul UI)

Consul UI는 Helm 차트를 사용할 때 기본적으로 활성화됩니다.

보안상의 이유로 기본적으로 LoadBalancer 서비스를 통해 노출되지 않습니다. UI를 방문하려면 kubectl port-forward를 사용해야 합니다.

TLS 비활성화 상태에서 포트 포워딩 (Port forward with TLS disabled)

TLS가 비활성화된 상태로 실행 중이면 Consul UI는 8500 포트에서 http를 통해 접근할 수 있습니다:

$ kubectl port-forward service/consul-server --namespace consul 8500:8500

포트 포워딩을 설정한 후 http://localhost:8500 [http://localhost:8500]으로 이동합니다.

TLS 활성화 상태에서 포트 포워딩 (Port forward with TLS enabled)

TLS가 활성화된 상태로 실행 중이면 Consul UI는 8501 포트에서 https를 통해 접근할 수 있습니다:

$ kubectl port-forward service/consul-server --namespace consul 8501:8501

포트 포워딩을 설정한 후 https://localhost:8501 [https://localhost:8501]로 이동합니다.

팁

Consul 인증 기관(CA)이 자체 서명되어 브라우저의 신뢰 저장소에 없기 때문에 브라우저의 SSL 경고를 클릭하여 통과해야 합니다.

ACL 활성화 (ACLs enabled)

ACL이 활성화된 경우 모든 리소스를 표시하고 UI에서 수정하려면 ACL 토큰을 입력해야 합니다.

전체 권한이 있는 부트스트랩 토큰을 검색하려면 다음을 실행합니다:

$ kubectl get secrets/consul-bootstrap-acl-token --template='{{.data.token | base64decode }}'
e7924dd1-dc3f-f644-da54-81a73ba0a178%

그런 다음 토큰을 UI의 ACLs 탭에 붙여넣습니다(% 제외).

참고

멀티 클러스터 페더레이션을 사용하는 경우 보조 데이터센터는 권한이 적은 별도의 토큰을 사용하므로 부트스트랩 토큰을 검색하려면 kubectl 컨텍스트가 기본 데이터센터에 있어야 합니다.

서비스를 통해 UI 노출 (Exposing the UI through a service)

Kubernetes Service를 통해 UI를 노출하려면 ui.service 차트 값 [/consul/docs/reference/k8s/helm#v-ui-service]을 구성하세요. 이 서비스는 Consul 서버에 요청을 허용하므로 외부에 공개해서는 안 됩니다.

Consul HTTP API 접근 (Access the Consul HTTP API)

기술적으로 수신 중인 모든 에이전트가 HTTP API에 응답할 수 있지만, 로컬 Consul 노드와 통신하는 것은 중요한 캐싱 동작이 있으며 서비스와 체크 [/consul/api-docs/agent]를 위한 더 간단한 /agent 엔드포인트를 사용할 수 있습니다.

노드에 대한 정보를 찾으려면 downward API [https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/]를 사용할 수 있습니다.

다음은 예시 포드 스펙입니다. 포드뿐만 아니라 포드 템플릿이 있는 모든 것(StatefulSets, Deployments, Jobs 등)도 Consul API에 접근할 수 있으므로 Consul에도 접근할 수 있습니다.

apiVersion: v1
kind: Pod
metadata:
  name: consul-example
spec:
  containers:
    - name: example
      image: 'hashicorp/consul:latest'
      env:
        - name: HOST_IP
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
      command:
        - '/bin/sh'
        - '-ec'
        - |
          export CONSUL_HTTP_ADDR="${HOST_IP}:8500"
          consul kv put hello world
  restartPolicy: Never

다음 예시 Deployment는 중첩된 포드 스펙에서 호스트 IP에 접근하는 방법을 보여줍니다:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: consul-example-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: consul-example
  template:
    metadata:
      labels:
        app: consul-example
    spec:
      containers:
        - name: example
          image: 'hashicorp/consul:latest'
          env:
            - name: HOST_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.hostIP
          command:
            - '/bin/sh'
            - '-ec'
            - |
              export CONSUL_HTTP_ADDR="${HOST_IP}:8500"
              consul kv put hello world

더 알아보기 (Learn more)