멀티 클러스터 인그레스 설정

개요

서로 다른 리전에 위치한 여러 Google Kubernetes Engine 클러스터에서 애플리케이션이 실행되는 경우, 사용자와 가장 가까운 리전의 클러스터로 트래픽을 라우팅할 수 있습니다.

이 페이지에서는 kubemci 명령줄 도구로 Kubernetes 인그레스를 사용하여 서로 다른 리전의 여러 클러스터 간에 트래픽을 라우팅하도록 Cloud HTTP 부하 분산기를 구성합니다.

시작하기 전에

이 작업을 준비하려면 다음 단계를 수행합니다.

  • Cloud SDK가 설치되었는지 확인합니다.
  • 다음 명령어를 사용하여 gcloud를 시작합니다.

    gcloud init
    • 사용할 계정을 선택하거나 새 계정으로 로그인합니다.
    • 프로젝트 ID를 입력하거나 새 프로젝트를 만듭니다.
    • 기본 컴퓨팅 리전과 영역을 구성합니다.
  • 인증하고 Google Cloud SDK가 Google Cloud Platform 서비스에서 데이터를 보고 관리하도록 허용합니다.

    gcloud auth login
  • 인증하고 Google Auth Library가 Google Cloud Platform 서비스에서 데이터를 보고 관리하도록 허용합니다.

    gcloud auth application-default login
  • kubectl 명령줄 도구를 설치합니다.

    gcloud components install kubectl
  • 동일한 GCP 프로젝트와 네트워크에서 실행되는 GKE 클러스터가 둘 이상이어야 합니다.

kubemci 명령줄 도구 다운로드

kubemci는 멀티 클러스터 인그레스를 만들고 구성하는 데 사용되는 기본 명령줄 도구입니다.

바이너리 중 하나를 다운로드하고 실행 파일 경로에 저장합니다.

바이너리가 실행 파일인지 확인합니다. 이것은 다음 명령어를 사용하여 바이너리의 디렉토리에서 수행할 수 있습니다.

chmod +x ./kubemci

멀티 클러스터 인그레스 만들기

클러스터 준비

멀티 클러스터 인그레스에서 사용하려는 각 서비스는 모든 클러스터에서 동일하게 구성되어야 합니다. 특히 서비스는 다음 조건을 충족해야 합니다.

  • 모든 클러스터에서 이름이 동일합니다.
  • 모든 클러스터에서 동일한 네임스페이스에 있습니다.
  • NodePort 유형입니다.
  • 모든 클러스터에 동일한 포트 번호를 사용합니다.

    예를 들어 인그레스에 service-fooservice-bar라는 두 서비스가 필요한 경우:

    • service-foo는 모든 클러스터에서 포트 30016의 nodePort입니다.
    • service-bar는 모든 클러스터에서 포트 30017의 nodePort입니다.

자세한 안내는 각 클러스터에 nodePort 서비스 배포 섹션을 참조하세요.

kubeconfig 파일 만들기

kubemci 명령줄 도구에는 트래픽을 수신할 GKE 클러스터의 클러스터 연결 정보가 포함된 kubeconfig 파일이 필요합니다.

각 클러스터에 다음 명령어를 실행하여 모든 클러스터의 사용자 인증 정보가 포함된 kubeconfig 파일을 만듭니다.

KUBECONFIG=[PATH/TO/MCI_KUBECONFIG_FILE]
gcloud container clusters get-credentials \
    --zone=[ZONE_NAME] [CLUSTER_NAME]

예:

KUBECONFIG=~/mcikubeconfig gcloud container clusters get-credentials --zone=us-east4-a  cluster-us-east
KUBECONFIG=~/mcikubeconfig gcloud container clusters get-credentials --zone=europe-west1-c  cluster-eu-west
KUBECONFIG=~/mcikubeconfig gcloud container clusters get-credentials --zone=asia-east1-b  cluster-apac-east

각 클러스터에 NodePort 서비스 배포

서비스 매니페스트 파일과 애플리케이션 배포 매니페스트 파일을 같은 디렉토리에 배치하면 쉽게 배포할 수 있습니다. 예를 들어 다음 두 파일은 모두 app/ 디렉토리에 저장됩니다.

배포 매니페스트 파일의 예

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: my-app
  replicas: 2
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: hello-app
        image: gcr.io/google-samples/hello-app:1.0

서비스 매니페스트 파일의 예

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-app
  name: service-foo
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
    name: http
    nodePort: 30061
  selector:
    app: my-app
  type: NodePort

다음 루프를 실행하여 모든 클러스터를 반복하고 nodePort 서비스와 함께 애플리케이션을 배포하기 위한 컨텍스트를 얻을 수 있습니다.

KUBECONFIG=[PATH/TO/MCI_KUBECONFIG_FILE]
for ctx in $(kubectl config get-contexts -o name); do
  kubectl --context="${ctx}" create -f [PATH/TO/APP/FILES]
done

고정 IP 예약

다음 명령어를 실행하여 Google Cloud Platform에서 멀티 클러스터 인그레스의 고정 IP를 요청합니다.

gcloud compute addresses create --global [IP_RESOURCE_NAME]

예를 들어 IP 리소스 my-mci-ip의 이름을 지정하는 경우, 다음과 같습니다.

gcloud compute addresses create --global my-mci-ip

인그레스 리소스 준비

각 클러스터의 인그레스 리소스 사양에는 멀티 클러스터 인그레스 값으로 구성된 메타데이터 annotations 필드와 backend 필드가 있어야 합니다.

다음은 예시 인그레스 리소스 파일인 mcingress.yaml입니다.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-foo
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-mci-ip
    kubernetes.io/ingress.class: gce-multi-cluster
spec:
  backend:
    serviceName: service-foo
    servicePort: 80

annotations 추가 또는 수정:

  • kubernetes.io/ingress.global-static-ip-name의 값을 [IP_RESOURCE_NAME]으로 설정합니다.
  • kubernetes.io/ingress.class의 값을 gce-multi-cluster로 설정합니다.

backend 서비스 설정:

  • serviceName의 값을 기본 서비스의 이름으로 설정합니다.
  • servicePort의 값을 기본 서비스의 포트로 설정합니다.

멀티 클러스터 인그레스 배포

kubemci를 사용하여 다음 명령어로 멀티 클러스터 인그레스를 만듭니다.

kubemci create [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[optional PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]
예:
kubemci create my-mci \
    --ingress=mcingress.yaml \
    --gcp-project=my-gcp-project \
    --kubeconfig=~/mcikubeconfig

일련의 메시지를 출력하여 만들기 프로세스를 확인합니다. 예를 들면 다음과 같습니다.

Ensuring health checks
...
Health check mci1-hc-30061--my-mci created successfully
...
Backend service mci1-be-30061--my-mci created successfully
...
URL Map mci1-um--my-mci created successfully
...
Target http proxy mci1-tp--my-mci created successfully
...
Forwarding rule mci1-fw--my-mci created successfully
...
Firewall rule mci1-fr--my-mci created successfully

Success.

멀티 클러스터 인그레스의 상태 가져오기

다음 명령어를 실행하면 kubemci를 사용하여 만든 기존의 모든 멀티 클러스터 인그레스를 나열할 수 있습니다.

kubemci list --gcp-project=[PROJECT_ID]

다음과 비슷한 멀티 클러스터 인그레스 목록이 출력됩니다.

NAME           IP              CLUSTERS
my-mci   1.2.3.4   gke_my-gcp-project_asia-east1-b_cluster-asia-east, gke_my-gcp-project_europe-west1-c_cluster-eu-west, gke_my-gcp-project_us-east4-a_cluster-us-east

그러고 나서 다음 명령으로 특정 멀티 클러스터 인그레스의 상태를 가져올 수 있습니다.

kubemci get-status [INGRESS_NAME] --gcp-project=[PROJECT_ID]

다음과 비슷한 상태 메시지가 출력됩니다.

Load balancer my-mci has IPAddress 1.2.3.4 and is spread across 3 clusters
(gke_project-name_asia-east1-b_cluster-asia-east, gke_project-name_europe-west1-c_cluster-eu-west,
gke_project-name_us-east4-a_cluster-us-east)

기존 멀티 클러스터 인그레스 업데이트

--force 플래그 사용

기존의 멀티 클러스터 인그레스를 업데이트하려면 kubemci create 명령어를 --force 플래그와 함께 실행합니다.

kubemci create [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE] \
    --force

삭제, 다시 만들기

또는 멀티 클러스터 인그레스를 삭제한 다음 다시 만들어 업데이트할 수 있습니다,

kubemci delete [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]
kubemci create [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]

기존 멀티 클러스터 인그레스에서 클러스터 제거

기존 멀티 클러스터 인그레스에서 클러스터를 제거하려면 먼저 클러스터에서 제거할 클러스터 목록이 포함된 kubeconfig를 만든 다음 kubemci remove-clusters 명령어를 실행합니다.

kubemci remove-clusters [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/REMOVAL_KUBECONFIG_FILE]

멀티 클러스터 인그레스 삭제

멀티 클러스터 인그레스를 삭제하려면 kubemci delete 명령을 사용합니다.

kubemci delete [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]

일련의 메시지를 출력하여 삭제 프로세스를 확인합니다. 예를 들면 다음과 같습니다.

Deleting Ingress from cluster: gke_project-name_asia-east1-b_cluster-asia-east...
...
firewall rule mci1-fr--my-mci deleted successfully
...
http forwarding rule mci1-fw--my-mci deleted successfully
...
target HTTPS proxy mci1-tps--my-mci deleted successfully
...
ssl cert mci1-ssl--my-mci deleted successfully
...
url map mci1-um--my-mci deleted successfully
...
Successfully deleted all backend services
...
Successfully deleted all health checks

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine 문서