Kubernetes의 Consul에 외부 서비스 등록

Kubernetes의 Consul에 외부 서비스 등록

비-Kubernetes 노드에서 실행되는 서비스가 Kubernetes 내에서 실행되는 Consul 클러스터에 합류하는 방법을 설명해 드릴게요. 직접 curl로 페이지를 분석한 내용을 바탕으로 해요.

출처: 문서

본문

비-Kubernetes 노드에서 실행되는 서비스는 Kubernetes 내에서 실행되는 Consul 클러스터에 합류할 수 있어요.

자동 합류

Kubernetes 내에서 실행되는 클러스터에 합류하는 권장 방법은 "k8s" 클라우드 자동 합류 프로바이더를 사용하는 거예요.

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

아래 자동 합류 문자열은 공식 Helm 차트를 사용하는 클러스터에 Consul 서버 에이전트를 합류시켜요:

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

참고: 이 자동 합류 명령은 pod 네트워크에서 합류하든 호스트 포트를 통해 합류하든 기본 gossip 포트인 8301에서만 연결해요. 데이터센터의 구성원이 된 Consul 서버는 외부 서비스가 자동 합류로 연결할 수 있도록 이 포트에서 수신하고 있어야 해요.

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에 포트를 노출하여 두 네트워크를 연결할 수 있어요.

  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>

수동 합류

자동 합류를 사용할 수 없다면 두 자동 합류 섹션 중 하나의 지침을 따르되 -retry-join 플래그에 provider 키를 사용하는 대신 최소 하나의 Consul 서버 주소를 전달해 주세요. 예: -retry-join=$CONSUL_SERVER_IP:$SERVER_SERFLAN_PORT.

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

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

더 알아보기 (Learn more)