OpenStack에 Google Distributed Cloud 클러스터 배포

이 가이드에서는 지원되는 운영체제가 있는 OpenStack 가상 머신(VM)에 Google Distributed Cloud를 샘플 배포하는 과정을 안내합니다. 이 배포에서는 스크립트를 사용하여 OpenStack VM에의 하이브리드 클러스터 설치를 간소화합니다. 또한 이 가이드는 Load Balancing as a Service(LBaaS)를 사용 설정하는 한 가지 방법을 보여줍니다. Google Distributed Cloud에서 OpenStack LBaaS 및 Kubernetes OpenStack 클라우드 제공업체를 사용하여 OpenStack 클러스터 외부의 Kubernetes 서비스를 노출할 수 있습니다.

Google Distributed Cloud는 OpenStack VM을 자동으로 프로비저닝하지 않으며, VM 프로비저닝은 이 가이드의 범위에서 다루지 않습니다. VM 요구사항을 확인하고 예시 배포를 검토하려면 OpenStack VM 생성을 위한 Terraform 예시를 참조하세요.

이 가이드는 다음 섹션들로 구성됩니다.

  1. Google Distributed Cloud 배포

  2. Octavia 부하 분산기와 통합할 수 있도록 Google Distributed Cloud에서 Kubernetes용 OpenStack 클라우드 제공업체 구성

  3. Kubernetes 통합을 위해 OpenStack 클라우드 제공업체 검사

이 가이드에서는 OpenStack Ussuri가 사용되지만, Google Distributed Cloud에는 특정 버전의 OpenStack에 대한 요구사항이 없습니다. 이 가이드에서는 OpenStack VM을 사용하여 OpenStack에서 실행되는 2노드 Google Distributed Cloud 개념 증명 환경을 제공합니다. 고가용성 제어 영역을 포함하는 프로덕션 환경을 만드는 방법에 대한 자세한 내용은 프로덕션 환경 요구사항을 위한 Google Distributed Cloud 문서를 참조하세요.

배포 예시

이 가이드에서는 OpenStack LBaaS와 통합되는 OpenStack에 Google Distributed Cloud를 배포하는 예시를 제공합니다. OpenStack 환경에 맞는 명령어 및 구성을 이해하고 그에 따라 조정해야 합니다. 다음 다이어그램에서는 결과 배포를 보여줍니다.

OpenStack에 설치된 Google Distributed Cloud

기본 요건

  • LBaaS v2가 배포되고 작동하는 OpenStack Ussuri
  • bmctl 도구 다운로드를 위한 서비스 계정
  • 배포 예시에 표시된 대로 OpenStack VM 및 네트워크를 구성합니다. OpenStack 환경에서 비슷한 설정을 프로비저닝하려면 다음 옵션을 사용합니다.
    1. Terraform 스크립트를 사용하여 리소스를 자동으로 프로비저닝합니다.
    2. 리소스를 수동으로 프로비저닝합니다.
  • 다음 OpenStack VM이 준비되어 있고 SSH를 통해 제공되어야 합니다.
이름 IP 주소 목적
abm-ws 10.200.0.10(비공개 IP)
floating_ip(비공개 IP)
관리자 워크스테이션으로 작동하며 다른 머신에 Google Distributed Cloud를 배포하는 데 사용됩니다.
abm-cp1 10.200.0.11 GKE 클러스터 제어 영역: 이 호스트는 Kubernetes 제어 영역 및 부하 분산기를 실행합니다.
abm-w1 10.200.0.12 GKE 클러스터 워커 노드: 이 호스트는 Kubernetes 워크로드를 실행합니다.

Google Distributed Cloud 배포

이 섹션에서는 다음 작업을 완료하는 방법을 보여줍니다.

  1. abm-ws 관리자 워크스테이션 VM에서 필요한 도구 설치
  2. 배포를 안전하게 완료하는 데 필요한 프로젝트 ID 및 서비스 계정 구성
  3. 클러스터 구성 파일 만들기
  4. 클러스터 만들기

필요한 도구 설치

  1. abm-ws VM의 비공개 유동 IP 주소를 가져옵니다.

    export OPENSTACK_IPS=$(openstack floating ip list --tags=abm_ws_floatingip -f json)
    export FLOATING_IP=$(jq -c '.[]."Floating IP Address"' <<< $OPENSTACK_IPS | tr -d '"')
    
  2. SSH를 사용하여 abm-ws VM에 안전하게 연결하고 root 사용자로 로그인할 수 있는지 확인합니다. Terraform 스크립트로 구성된 root 사용자는 abm입니다.

    ssh ubuntu@$FLOATING_IP
    sudo -u abm -i
    
  3. SSH를 사용하여 다른 노드에 연결할 수 있는지 확인합니다.

    ssh abm@10.200.0.11 'echo SSH to $HOSTNAME succeeded'
    ssh abm@10.200.0.12 'echo SSH to $HOSTNAME succeeded'
    

    이전 명령어에 예상되는 응답은 다음과 같습니다.

    SSH to abm-cp1 succeeded
    SSH to abm-w1 succeeded
    
  4. abm-ws VM에 kubectl 명령줄 유틸리티를 다운로드합니다.

    curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
    chmod +x kubectl
    sudo mv kubectl /usr/local/sbin/
    
  5. abm-ws VM에 Docker를 설치합니다.

    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh
    sudo usermod -aG docker abm
    newgrp docker
    

Google Cloud 프로젝트 및 서비스 계정 구성

  1. 사용자 계정의 Google Cloud CLI 액세스 사용자 인증 정보를 가져옵니다.

    이러한 사용자 인증 정보는 이후 gcloud 명령어에 사용됩니다.

    gcloud auth login
    
  2. Google Distributed Cloud를 등록하려는 Google Cloud 프로젝트를 사용하도록 Google Cloud CLI가 구성되었는지 확인합니다.

    gcloud config set project PROJECT_ID
    
  3. 관리자 워크스테이션에서 사용자 계정에 대해 애플리케이션 기본 사용자 인증 정보(ADC)를 설정합니다. 이 사용자 인증 정보는 클러스터 만들기를 위해 bmctl 도구를 사용할 때 사용됩니다.

    gcloud auth application-default login
    
  4. bm-gcr 서비스 계정을 만듭니다. 이 서비스 계정을 사용하여 Google Distributed Cloud 클러스터에서 인증합니다.

    gcloud iam service-accounts create bm-gcr
    gcloud iam service-accounts keys create bm-gcr.json \
        --iam-account=bm-gcr@PROJECT_ID.iam.gserviceaccount.com
    
  5. 필요한 API를 사용 설정합니다.

    gcloud services enable \
        anthos.googleapis.com \
        anthosaudit.googleapis.com \
        anthosgke.googleapis.com \
        cloudresourcemanager.googleapis.com \
        connectgateway.googleapis.com \
        container.googleapis.com \
        gkeconnect.googleapis.com \
        gkehub.googleapis.com \
        gkeonprem.googleapis.com \
        iam.googleapis.com \
        logging.googleapis.com \
        monitoring.googleapis.com \
        opsconfigmonitoring.googleapis.com \
        serviceusage.googleapis.com \
        stackdriver.googleapis.com \
        storage.googleapis.com
    
  6. bm-gcr 서비스 계정에 추가 권한을 부여합니다. 권한을 추가하면 개별 서비스에 대해 여러 서비스 계정을 만들 필요가 없습니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/gkehub.connect"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/gkehub.admin"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/monitoring.metricWriter"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/monitoring.dashboardEditor"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/stackdriver.resourceMetadata.writer"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/opsconfigmonitoring.resourceMetadata.writer"
    

클러스터 구성 파일 만들기

  1. bmctl 명령줄 유틸리티를 다운로드합니다.

    mkdir baremetal && cd baremetal
    gsutil cp gs://anthos-baremetal-release/bmctl/1.29.200-gke.243/linux-amd64/bmctl .
    chmod a+x bmctl
    sudo mv bmctl /usr/local/sbin/
    
  2. 클러스터의 Google Distributed Cloud 작업공간을 만듭니다.

    bmctl create config -c CLUSTER_NAME
    
  3. Google Distributed Cloud 클러스터의 구성 파일을 만듭니다.

    cat > bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME.yaml << EOB
    ---
    gcrKeyPath: /home/abm/bm-gcr.json
    sshPrivateKeyPath: /home/abm/.ssh/id_rsa
    gkeConnectAgentServiceAccountKeyPath: /home/abm/bm-gcr.json
    gkeConnectRegisterServiceAccountKeyPath: /home/abm/bm-gcr.json
    cloudOperationsServiceAccountKeyPath: /home/abm/bm-gcr.json
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: openstack-cluster-ns
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: openstack-cluster-ns
      annotations:
        baremetal.cluster.gke.io/external-cloud-provider: "true"
    spec:
      type: hybrid
      anthosBareMetalVersion: 1.29.200-gke.243
      gkeConnect:
        projectID: PROJECT_ID
      controlPlane:
        nodePoolSpec:
          clusterName: CLUSTER_NAME
          nodes:
          - address: 10.200.0.11
      clusterNetwork:
        pods:
          cidrBlocks:
          - 192.168.0.0/16
        services:
          cidrBlocks:
          - 10.96.0.0/20
      loadBalancer:
        mode: manual
        ports:
          controlPlaneLBPort: 443
        vips:
          controlPlaneVIP: 10.200.0.101
          ingressVIP: 10.200.0.102
      clusterOperations:
        location: us-central1
        projectID: PROJECT_ID
      storage:
        lvpNodeMounts:
          path: /mnt/localpv-disk
          storageClassName: node-disk
        lvpShare:
          numPVUnderSharedPath: 5
          path: /mnt/localpv-share
          storageClassName: standard
      nodeAccess:
        loginUser: abm
    
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: NodePool
    metadata:
      name: node-pool-1
      namespace: openstack-cluster-ns
    spec:
      clusterName: CLUSTER_NAME
      nodes:
      - address: 10.200.0.12
    EOB
    

클러스터 만들기

  1. 클러스터를 만듭니다.

    bmctl create cluster -c CLUSTER_NAME
    

bmctl 명령어를 실행하면 새 하이브리드 클러스터 설정이 시작됩니다. 여기에는 노트에 대한 프리플라이트 검사 수행, 관리자 및 사용자 클러스터 만들기, Connect를 사용하여 Google Cloud에 클러스터 등록이 포함됩니다. 전체 설정은 최대 15분까지 걸릴 수 있습니다. 클러스터를 만드는 동안 다음 출력이 표시됩니다.

Please check the logs at bmctl-workspace/CLUSTER_NAME/log/create-cluster-20210926-020741/create-cluster.log
[2021-09-26 02:07:59+0000] Creating bootstrap cluster... ⠦ kind get kubeconfig --name bmctl > ~/.kube/config && k get pods --all-namespaces
[2021-09-26 02:07:59+0000] Creating bootstrap cluster... OK
[2021-09-26 02:10:48+0000] Installing dependency components... OK
[2021-09-26 02:13:42+0000] Waiting for preflight check job to finish... OK
[2021-09-26 02:15:22+0000] - Validation Category: machines and network
[2021-09-26 02:15:22+0000]  - [PASSED] gcp
[2021-09-26 02:15:22+0000]  - [PASSED] node-network
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.11
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.11-gcp
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.12
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.12-gcp
[2021-09-26 02:15:22+0000] Flushing logs... OK
[2021-09-26 02:15:23+0000] Applying resources for new cluster
[2021-09-26 02:15:24+0000] Waiting for cluster to become ready OK
[2021-09-26 02:25:04+0000] Writing kubeconfig file
[2021-09-26 02:25:04+0000] kubeconfig of created cluster is at bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig, please run
[2021-09-26 02:25:04+0000] kubectl --kubeconfig bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig get nodes
[2021-09-26 02:25:04+0000] to get cluster node status.
[2021-09-26 02:25:04+0000] Please restrict access to this file as it contains authentication credentials of your cluster.
[2021-09-26 02:25:04+0000] Waiting for node pools to become ready OK
[2021-09-26 02:25:24+0000] Moving admin cluster resources to the created admin cluster
[2021-09-26 02:25:53+0000] Flushing logs... OK
[2021-09-26 02:25:53+0000] Deleting bootstrap cluster...

클러스터 확인 및 상호작용

bmctl-workspace 디렉터리 내부의 abm-ws VM에서 클러스터 kubeconfig 파일을 찾을 수 있습니다. 배포를 확인하려면 다음 단계를 완료하세요.

  1. 클러스터 구성 파일의 경로로 KUBECONFIG 환경 변수를 설정하여 클러스터에서 kubectl 명령어를 실행합니다.

    export KUBECONFIG=$HOME/bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
    kubectl get nodes
    

    다음 출력과 비슷하게 출력된 클러스터 노드가 표시됩니다.

    NAME      STATUS   ROLES                  AGE     VERSION
    abm-cp1   Ready    control-plane,master   5m24s   v1.20.5-gke.1301
    abm-w1    Ready    <none>                 2m17s   v1.20.5-gke.1301
    

Google Cloud 콘솔에서 클러스터에 로그인

Google Cloud 콘솔에서 워크로드를 관측하려면 클러스터에 로그인해야 합니다. 클러스터에 로그인하는 방법에 대한 안내 및 자세한 내용은 Google Cloud 콘솔에서 클러스터로 작업을 참조하세요.

삭제

관리자 워크스테이션(abm-ws) VM에서 다음 명령어를 실행하여 클러스터를 삭제할 수 있습니다.

export KUBECONFIG=$HOME/bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
bmctl reset --cluster CLUSTER_NAME

다음 단계