가상 머신에서 클라이언트 에이전트 구성

가상 머신에서 클라이언트 에이전트 구성

가상 머신(VM)에서 Consul 클라이언트 에이전트를 구성하는 방법을 설명해 드릴게요. 애플리케이션 워크로드가 실행되는 노드에 클라이언트 에이전트를 배포하고, K8s 클러스터에 합류하는 방법까지 살펴보아요.

출처: 문서

본문

이 페이지는 가상 머신(VM)에서 Consul 클라이언트 에이전트를 구성하는 과정을 설명해요. 프로덕션 환경을 위한 자동화된 과정은 Consul 가상 머신 시작하기 튜토리얼에서 다뤄요.

개요

Consul 클라이언트 에이전트는 애플리케이션 워크로드가 실행되는 노드에 배포해야 하는 장기 실행(long-running) 프로세스예요. 클라이언트 에이전트는 암호화된 gossip 통신을 사용하여 Consul 서버 에이전트와 통신하므로, Consul 카탈로그를 쿼리할 때 Consul DNS 요청이 정상적인 결과를 반환해요.

클라이언트 에이전트를 배포하는 과정은 다음 단계로 구성돼요:

  1. 올바른 버전의 Consul 바이너리가 설치되어 있는지 확인해요.

  2. 클라이언트 에이전트 구성을 업데이트해요.

  3. 클라이언트 에이전트 구성을 노드에 추가해요.

  4. Consul 데이터 디렉터리의 권한이 올바른지 확인해요.

  5. Consul 바이너리를 시작해요.

또한 retry_join 스탠자를 구성하여 Consul 에이전트가 시작할 때 자동으로 클러스터에 합류하도록 할 수도 있어요. 이 기능을 클라우드 자동 합류(cloud auto-join) 라고 해요. 구성 요구 사항은 클라우드 프로바이더에 따라 달라져요. 자세한 내용은 클라우드 프로바이더에 클러스터 자동 합류를 참고해 주세요.

클라이언트 에이전트 구성

클러스터에 합류하는 데 필요한 다음 정보로 구성을 업데이트해 주세요:

  • 데이터센터 이름
  • Consul 서버 주소

클러스터의 기존 보안에 따라 클라이언트 구성을 다음 추가 매개변수로 업데이트해야 할 수 있어요:

  • CA 인증서
  • TLS 서버 이름
  • 유효한 ACL 토큰

자세한 내용은 Consul 에이전트 구성 파일 참조를 참고해 주세요.

K8s의 Consul 클러스터 합류

VM에서 실행되는 Consul 에이전트는 Kubernetes 내에서 실행되는 Consul 서버 클러스터에도 합류할 수 있어요.

자동 합류

Kubernetes 내에서 실행되는 클러스터에 합류하려면 "k8s" 클라우드 자동 합류 프로바이더를 사용하는 것을 권장해요.

자동 합류 프로바이더는 Kubernetes API를 사용하여 합류할 IP 주소를 동적으로 발견해요. 표준 kubeconfig 파일로 Kubernetes에 인증해요. 자동 합류는 모든 주요 호스팅 Kubernetes 서비스와 셀프 호스팅 설치에서 작동해요. kubeconfig 파일의 토큰은 Consul 서버가 배포된 네임스페이스에서 pod를 나열할 수 있는 권한이 있어야 해요.

다음 명령은 Consul 에이전트가 공식 Helm 차트를 실행하는 클러스터에 합류하게 해줘요. 이 명령은 기본 LAN Gossip 포트인 8301에서 수신하는 Consul 서버가 있다고 가정해요.

$ consul agent -retry-join 'provider=k8s label_selector="app=consul,component=server"'

Pod 네트워크에서의 자동 합류

기본 Consul Helm 차트 설치에서는 서버 RPC에 대해 pod IP를 통해 Consul 서버에 라우팅할 수 있어요. 결과적으로 Kubernetes에서 실행되는 Consul 클러스터에 합류하는 외부 에이전트는 해당 pod IP에 연결할 수 있어야 해요.

많은 호스팅 Kubernetes 환경에서 pod IP가 외부 VM에서 라우팅 가능하도록 호스팅 프로바이더를 명시적으로 구성해야 해요. 자세한 내용은 Azure AKS CNI, AWS EKS CNI, GKE VPC-native clusters 같은 호스팅 프로바이더 문서를 참고해 주세요.

공식 Helm 차트를 통해 기본 값으로 설치된 Kubernetes의 Consul에 외부 에이전트를 합류시키려면:

  1. Kubernetes의 서버 pod IP가 VM에서 라우팅 가능한지, 그리고 VM이 해당 pod IP에서 포트 8301(gossip용)과 포트 8300(서버 RPC용)에 접근할 수 있는지 확인해 주세요.

  2. Kubernetes에서 실행되는 서버 pod가 gossip 포트(기본 8301)에서 VM의 광고된 IP로 라우팅할 수 있는지 확인해 주세요.

  3. 외부 VM의 $HOME/.kube/config에 Kubernetes 클러스터용 kubeconfig 파일이 있는지 확인해 주세요.

  4. 외부 VM에서 다음을 실행해 주세요:

consul agent \
  -advertise="$ADVERTISE_IP" \
  -retry-join='provider=k8s label_selector="app=consul,component=server"' \
  -bind=0.0.0.0 \
  -hcl='leave_on_terminate = true' \
  -hcl='ports { grpc = 8502 }' \
  -config-dir=$CONFIG_DIR \
  -datacenter=$DATACENTER \
  -data-dir=$DATA_DIR \
  1. consul members를 실행하여 합류가 성공했는지 확인해 주세요.
/ $ consul members
Node                                           Address           Status  Type    Build  Protocol  DC   Segment
consul-consul-server-0                         10.138.0.43:9301  alive    server  1.9.1  2         dc1  <all>
external-agent                                 10.138.0.38:8301  alive    client  1.9.0  2         dc1  <default>
gke-external-agent-default-pool-32d15192-grs4  10.138.0.43:8301  alive    client  1.9.1  2         dc1  <default>
gke-external-agent-default-pool-32d15192-otge  10.138.0.44:8301  alive    client  1.9.1  2         dc1  <default>
gke-external-agent-default-pool-32d15192-vo7k  10.138.0.42:8301  alive    client  1.9.1  2         dc1  <default>

호스트 포트를 통한 자동 합류

외부 VM이 Kubernetes pod IP에 연결할 수 없지만 Kubernetes 클러스터의 노드 내부 호스트 IP에는 연결할 수 있다면, 호스트 IP에 노드 포트를 노출하여 외부 VM을 Kubernetes Consul 서비스에 합류시킬 수 있어요.

  1. 다음 값으로 공식 Helm 차트를 설치해 주세요:
client:
  exposeGossipPorts: true # exposes client gossip ports as hostPorts
server:
  exposeGossipAndRPCPorts: true # exposes the server gossip and RPC ports as hostPorts
  ports:
    # Configures the server gossip port
    serflan:
      # Note that this needs to be different than 8301, to avoid conflicting with the client gossip hostPort
      port: 9301

이 설치는 클라이언트 gossip 포트, 서버 gossip 포트, 서버 RPC 포트를 hostIP:hostPort로 노출해요. hostIP는 클라이언트/서버 pod가 배포된 VM의 내부 IP라는 점에 유의해 주세요.

  1. Kubernetes 노드의 IP가 VM에서 라우팅 가능한지, 그리고 VM이 해당 노드 IP에서 포트 8301과 9301(gossip용), 포트 8300(서버 RPC용)에 접근할 수 있는지 확인해 주세요.

  2. Kubernetes에서 실행되는 서버 pod가 gossip 포트(기본 8301)에서 VM의 광고 IP로 라우팅할 수 있는지 확인해 주세요.

  3. 외부 VM의 $HOME/.kube/config에 Kubernetes 클러스터용 kubeconfig 파일이 있는지 확인해 주세요.

  4. 외부 VM에서 다음을 실행해 주세요:

consul agent \
  -advertise="$ADVERTISE_IP" \
  -retry-join='provider=k8s host_network=true label_selector="app=consul,component=server"'
  -bind=0.0.0.0 \
  -hcl='leave_on_terminate = true' \
  -hcl='ports { grpc = 8502 }' \
  -config-dir=$CONFIG_DIR \
  -datacenter=$DATACENTER \
  -data-dir=$DATA_DIR \

retry-join 인수에 host_network=true가 추가된 것에 유의해 주세요.

  1. consul members를 실행하여 합류가 성공했는지 확인해 주세요.
/ $ consul members
Node                                           Address           Status  Type    Build  Protocol  DC   Segment
consul-consul-server-0                         10.138.0.43:9301  alive    server  1.9.1  2         dc1  <all>
external-agent                                 10.138.0.38:8301  alive    client  1.9.0  2         dc1  <default>
gke-external-agent-default-pool-32d15192-grs4  10.138.0.43:8301  alive    client  1.9.1  2         dc1  <default>
gke-external-agent-default-pool-32d15192-otge  10.138.0.44:8301  alive    client  1.9.1  2         dc1  <default>
gke-external-agent-default-pool-32d15192-vo7k  10.138.0.42:8301  alive    client  1.9.1  2         dc1  <default>

수동 합류

자동 합류를 사용할 수 없다면 최소 하나의 Consul 서버 주소와 함께 -retry-join 매개변수를 사용하는 옵션도 있어요.

$ consul agent -retry-join=$CONSUL_SERVER_IP:$CONSUL_GOSSIP_PORT

수동 합류를 사용할 때는 kubeconfig 파일이 필요하지 않아요.

IP 주소를 하드코딩하는 대신 Consul 서버 pod가 실행 중인 pod IP 또는 호스트 IP로 확인되는 DNS 항목을 설정하는 것을 권장해요.

더 알아보기 (Learn more)