이미 Terraform을 사용하여 Google Cloud 및 온프레미스 VMware 리소스를 관리하는 경우 Terraform을 사용하여 VMware용 Google Distributed Cloud 소프트웨어 전용 관리자 클러스터를 만듭니다. gkectl 또는 Google Cloud 콘솔을 사용하여 관리자 클러스터를 만들 수도 있습니다.
시작하기 전에
관리자 워크스테이션 만들기에 설명된 대로 관리자 워크스테이션을 설정했고 로그인할 수 있는지 확인합니다.
서비스 계정의 JSON 키 파일이 관리자 워크스테이션에 있는지 확인합니다.
IP 주소 계획 문서를 검토합니다. 3개의 컨트롤 플레인 노드 및 컨트롤 플레인 VIP에 사용할 수 있는 IP 주소가 충분한지 확인합니다. kubeception 사용자 클러스터를 만들려면 해당 사용자 클러스터의 제어 영역 노드에 사용할 수 있는 충분한 IP 주소가 있어야 합니다.
부하 분산 개요를 검토하고 사용하려는 부하 분산기 종류에 대한 결정을 다시 확인합니다. 수동 부하 분산기의 경우 관리자 클러스터를 만들기 전에 부하 분산기를 설정해야 합니다.
gkectl를 사용하여 관리자 클러스터를 만드는 경우 Google Distributed Cloud 구성요소에 공개 또는 비공개 레지스트리를 사용할지 결정합니다. 비공개 Docker 레지스트리 사용에 관한 자세한 내용은privateRegistry을 참고하세요. Terraform과 Google Cloud 콘솔 모두 시스템 구성요소에 비공개 Docker 레지스트리를 사용하는 것을 지원하지 않습니다.관리자 클러스터 노드에서 실행하려는 운영체제 유형을 결정합니다.
조직에서 아웃바운드 트래픽이 프록시 서버를 통과해야 하는 경우 필요한 API와 Artifact Registry 주소를 허용 목록에 추가해야 합니다.
버전 1.29 이상에서는 서버 측 프리플라이트 검사가 기본적으로 사용 설정됩니다. 서버 측 프리플라이트 검사에는 추가 방화벽 규칙이 필요합니다. 관리자 클러스터의 방화벽 규칙에서 '프리플라이트 검사'를 검색하고 필요한 모든 방화벽 규칙이 구성되었는지 확인합니다. 서버 측 프리플라이트 검사는 관리자 워크스테이션에서 로컬로 실행되는 대신 부트스트랩 클러스터에서 실행됩니다.
절차 개요
관리자 클러스터를 만들려면 먼저 관리자 워크스테이션에서 gkectl register bootstrap 명령어를 실행해야 합니다. 이 명령어는 관리자 워크스테이션에 Docker의 Kubernetes(kind) 클러스터를 배포합니다. 이 부트스트랩 클러스터는 관리자 클러스터를 만드는 데 필요한 Kubernetes 컨트롤러를 호스팅합니다. 관리자 클러스터를 만들면 부트스트랩 클러스터의 컨트롤러가 노드를 프로비저닝하고, 프리플라이트 검사를 실행하고 Fleet에 관리자 클러스터를 등록합니다. 관리자 클러스터가 성공적으로 생성된 후 부트스트랩 클러스터가 자동으로 삭제됩니다.
Terraform을 사용하여 관리자 클러스터를 만드는 대략적인 단계는 다음과 같습니다.
구성 파일을 작성합니다. google_gkeonprem_vmware_admin_cluster 리소스와 다음 예시를 사용하여
main.tf구성 파일을 만듭니다.bootstrap클러스터를 만듭니다.gkectl register bootstrap를 실행하여 부트스트랩 클러스터를 만듭니다. 명령어로 부트스트랩 클러스터 생성이 완료되면 출력에 관리자 클러스터 구성을 완료하라는 메시지가 표시됩니다. 이 프로세스는 관리자 클러스터가 생성될 때까지 계속 실행됩니다.관리자 클러스터를 만듭니다. 다른 터미널 창이나 GKE On-Prem API에 액세스할 수 있는 다른 컴퓨터에서
terraform명령어를 실행하여 완료된main.tf구성 파일에 지정된 대로 새 관리자 클러스터를 만듭니다.
구성 파일 작성
다음 예에서는 MetalLB를 사용하여 컨트롤 플레인 노드가 3개인 고가용성 (HA) 관리자 클러스터를 만드는 방법을 보여줍니다. 1.28 이상에서는 새 관리자 클러스터가 고가용성이어야 합니다. 이 요구사항으로 인해 control_plane_node.replicas를 3으로 설정해야 합니다.
자세한 내용과 다른 예시는 google_gkeonprem_vmware_admin_cluster 참고 문서를 확인하세요. 시스템 이미지에 비공개 레지스트리를 사용하는 방법에 대한 자세한 내용은 비공개 컨테이너 레지스트리 구성을 참고하세요.
다음 예시에서 자리표시자 변수를 입력한 후 main.tf에 복사하여 붙여넣습니다. gkeadm을 사용하여 관리자 워크스테이션을 만든 경우 관리자 워크스테이션 구성 파일을 열어 vCenter 섹션의 값을 해당 자리표시자 변수에 복사할 수 있습니다.
resource "google_gkeonprem_vmware_admin_cluster" "admin-cluster-metallb" {
provider = google-beta
name = "ADMIN_CLUSTER_NAME"
project = "PROJECT_ID"
location = "REGION"
description = "DESCRIPTION"
bootstrap_cluster_membership = "projects/PROJECT_ID/locations/REGION/memberships/bootstrap-ADMIN_CLUSTER_NAME"
on_prem_version = "VERSION"
image_type = "IMAGE_TYPE"
vcenter {
address = "VCENTER_ADDRESS"
datacenter = "DATA_CENTER"
cluster = "VCENTER_CLUSTER"
resource_pool = "RESOURCE_POOL"
datastore = "DATASTORE"
ca_cert_data = "CA_CERT_DATA"
}
network_config {
service_address_cidr_blocks = ["10.96.232.0/24"]
pod_address_cidr_blocks = ["192.168.0.0/16"]
vcenter_network = "NETWORK"
dhcp_ip_config {
enabled = true
}
host_config {
dns_servers = ["DNS_SERVERS"]
ntp_servers = ["NTP_SERVERS"]
}
ha_control_plane_config {
control_plane_ip_block {
gateway = "GATEWAY"
netmask = "NETMASK"
ips {
hostname = "CONTROL_PLANE_HOST_1"
ip = "CONTROL_PLANE_NODE_IP_1"
}
ips {
hostname = "CONTROL_PLANE_HOST_2"
ip = "CONTROL_PLANE_NODE_IP_2"
}
ips {
hostname = "CONTROL_PLANE_HOST_3"
ip = "CONTROL_PLANE_NODE_IP_3"
}
}
}
}
control_plane_node {
cpus = NUM_CPUS
memory = MEMORY
replicas = 3
}
load_balancer {
vip_config {
control_plane_vip = "CONTROL_PLANE_VIP"
}
metal_lb_config {
enabled = true
}
}
}
다음을 바꿉니다.
ADMIN_CLUSTER_NAME: 관리자 클러스터의 이름입니다. 이름의 최대 길이는 20자(영문 기준)입니다.PROJECT_ID: Google Cloud 프로젝트 IDREGION: GKE On-Prem API (gkeonprem.googleapis.com), Fleet 서비스(gkehub.googleapis.com), Connect 서비스(gkeconnect.googleapis.com)가 실행되는 Google Cloud 리전입니다.us-west1또는 다른 지원되는 리전을 지정합니다.location필드는gkectl register bootstrap명령어의--location플래그에 해당합니다.DESCRIPTION: 관리자 클러스터에 대한 설명입니다.VERSION: 클러스터의 Google Distributed Cloud 버전입니다. Terraform을 사용한 클러스터 만들기는 버전 1.28 이상에서만 지원됩니다. 여기에 지정하는 버전은gkectl register bootstrap명령어의--bundle-path플래그에 지정하는 번들 버전과 일치해야 합니다. 버전 목록은 Google Distributed Cloud 버전을 참고하세요.IMAGE_TYPE: 관리자 클러스터 노드에서 실행할 OS 이미지 유형입니다. 'ubuntu_containerd', 'cos', 'ubuntu_cgv2' 또는 'cos_cgv2' 중 하나를 지정합니다.VCENTER_ADDRESS: vCenter Server 주소입니다.관리자 워크스테이션 구성 파일:
vCenter.credentials.address필드의 값을 사용합니다.vcenter.address필드는gkectl register bootstrap명령어의--vcenter-address플래그에 해당합니다.
DATA_CENTER: vCenter 데이터 센터의 이름입니다.관리자 워크스테이션 구성 파일:
vCenter.datacenter필드의 값을 사용합니다.vcenter.datacenter필드는gkectl register bootstrap명령어의--vcenter-datacenter플래그에 해당합니다.
VCENTER_CLUSTER: vCenter 클러스터의 이름입니다.관리자 워크스테이션 구성 파일:
vCenter.cluster필드의 값을 사용합니다.vcenter.cluster필드는gkectl register bootstrap명령어의--vcenter-cluster플래그에 해당합니다.
RESOURCE_POOL: vCenter 리소스 풀의 이름 또는 경로입니다.관리자 워크스테이션 구성 파일:
vCenter.resourcePool필드의 값을 사용합니다.vcenter.resource_pool필드는gkectl register bootstrap명령어의--vcenter-resource-pool플래그에 해당합니다.
DATASTORE: vCenter 데이터 저장소의 이름입니다. 지정하는 값은 경로가 아닌 이름이어야 합니다. 경로를 입력해야 하는 경우folder = "FOLDER"필드를 추가합니다.관리자 워크스테이션 구성 파일:
vCenter.datastore필드의 값을 사용합니다.vcenter.datastore필드는gkectl register bootstrap명령어의--vcenter-datastore플래그에 해당합니다.
클러스터 노드에 VM 스토리지 정책을 사용하려면
vcenter.datastore필드를 삭제하고 대신vcenter.storage_policy_name를 추가합니다. 또한gkectl register bootstrap명령어에--vcenter-storage-policy플래그를 추가합니다.vcenter.datastore또는vcenter.storage_policy_name중 하나의 값을 지정해야 하며, 둘 다 지정할 수는 없습니다.FOLDER: 클러스터 VM이 위치하게 될 vCenter 폴더의 이름입니다. 폴더를 사용하지 않는 경우 이 필드를 삭제합니다.관리자 워크스테이션 구성 파일:
vCenter.folder필드의 값을 사용합니다.vcenter.folder필드는gkectl register bootstrap명령어의--vcenter-folder플래그에 해당합니다.
CA_CERT_DATA: PEM 형식의 vCenter CA 인증서로, 모든 줄바꿈이\n문자열로 대체됩니다.다음 명령어를 실행하여 줄바꿈을
\n로 바꿉니다.awk 'ORS="\\n" {print}' CA_CERT_PATH_LOCALCA_CERT_PATH_LOCAL를 vCenter Server의 루트 CA 인증서 경로로 바꿉니다.gkeadm을 사용하여 관리자 워크스테이션을 만든 경우 관리자 워크스테이션 구성 파일의caCertPath필드에 있는 값(로컬 컴퓨터의 경로)을 사용할 수 있습니다.gkeadmCA 인증서 파일을 관리 워크스테이션에 복사했습니다.gkectl register bootstrap명령어의--vcenter-ca-cert-path플래그에 관리자 워크스테이션 경로를 지정해야 합니다.이전 명령어의 출력을 복사하여
CA_CERT_DATA자리표시자 변수에 붙여넣습니다.
NETWORK: vCenter 네트워크의 이름입니다.관리자 워크스테이션 구성 파일:
vCenter.network필드의 값을 사용합니다.network_config.vcenter_network필드는gkectl register bootstrap명령어의--vcenter-network플래그에 해당합니다.
GATEWAY: 컨트롤 플레인 클러스터 노드가 있는 서브넷의 기본 게이트웨이 IP 주소입니다.NETMASK: 컨트롤 플레인 클러스터 노드가 있는 서브넷의 넷마스크입니다.DNS_SERVERS: DNS 서버의 IP 주소입니다.NTP_SERVERS: 시간 (NTP) 서버의 IP 주소입니다.control_plane_ip_block.ips섹션에서 컨트롤 플레인 노드 3개의 IP 주소와 호스트 이름(선택사항)을 입력합니다. 호스트 이름을 입력하지 않으면 구성에서hostname필드를 삭제합니다.NUM_CPUS: 관리자 클러스터의 각 컨트롤 플레인 노드에 대한 vCPU 수입니다. 최소 4개여야 합니다.MEMORY: 관리자 클러스터의 각 컨트롤 플레인 노드에 대한 메모리 용량(메비바이트)입니다. 최소 8192여야 하지만 16384를 권장합니다.CONTROL_PLANE_VIP: 관리자 클러스터의 Kubernetes API 서버에 대해 부하 분산기에서 구성하도록 선택한 IP 주소입니다.
선택사항: 비공개 레지스트리 구성
기본적으로 클러스터를 만들거나 업그레이드하는 중에 Google Distributed Cloud는 구성요소 액세스 서비스 계정을 사용하여 gcr.io/gke-on-prem-release에서 시스템 이미지를 가져옵니다.
원하는 경우 자체 컨테이너 레지스트리 서버를 제공하여 대신 비공개 레지스트리 서버에서 시스템 이미지를 가져오도록 할 수 있습니다.
비공개 레지스트리를 구성하려면 다음 단계를 따르세요.
관리자 클러스터 구성 파일에 다음을 추가합니다.
private_registry_config { address = "ADDRESS" ca_cert = "CA_CERT" }다음을 바꿉니다.
ADDRESS: 비공개 레지스트리를 실행하는 머신의 IP 주소 또는 FQDN (정규화된 도메인 이름)입니다.CA_CERT: 공개 키의 CA 인증서 데이터로, 모든 줄바꿈이\n문자열로 대체됩니다.
다음 명령어를 실행하여 줄바꿈을
\n로 바꿉니다.awk 'ORS="\\n" {print}' PUBLIC_KEY_PATHPUBLIC_KEY_PATH를 공개 키 경로로 바꿉니다.이전 명령어의 출력을 복사하여
CA_CERT자리표시자 변수에 붙여넣습니다.
네트워크가 프록시 서버 뒤에 있는 경우 다음을 추가합니다.
proxy { url: "PROXY_SERVER_ADDRESS" no_proxy: "BYPASS_LIST" }다음을 바꿉니다.
PROXY_SERVER_ADDRESS: 프록시 서버의 HTTP 주소입니다. 포트 번호가 스키마의 기본 포트와 동일하더라도 포함합니다.BYPASS_LIST: 프록시 서버를 거치지 않아야 하는 IP 주소, IP 주소 범위, 호스트 이름, 도메인 이름의 쉼표로 구분된 목록입니다.
예:
url: "http://my-proxy.example.local:80" no_proxy: "192.0.2.0/24,my-host.example.local,198.51.100.0"Google Distributed Cloud가 이러한 주소, 호스트 또는 도메인 중 하나에 요청을 보내면 요청은 프록시 서버를 우회하고 대상으로 직접 전송됩니다.
일반 클러스터와 고급 클러스터의 차이점을 비롯해 비공개 레지스트리 사용에 대한 자세한 내용은 비공개 컨테이너 레지스트리 구성을 참고하세요.
구성 파일 및 계획 확인
main.tf이 있는 디렉터리에서 다음 명령어를 실행합니다.
Terraform을 초기화합니다.
terraform initTerraform은 Google Cloud 제공업체와 같은 필요한 라이브러리를 설치합니다. 필요한 경우
maint.tf의 오류를 수정합니다.Terraform 계획을 만듭니다.
terraform plan -out tfplan구성을 검토하고 필요한 경우 변경합니다.
계획을 적용하기 전에 다음 섹션에 설명된 대로 부트스트랩 클러스터를 먼저 만들어야 합니다.
부트스트랩 클러스터 만들기
gkectl register bootstrap 명령어를 실행하면 vCenter 계정 사용자 이름과 비밀번호를 묻는 메시지가 표시됩니다. 사용 가능한 사용자 인증 정보가 있는지 확인합니다. gkeadm을 사용하여 관리자 워크스테이션을 만든 경우 사용자 이름과 비밀번호는 credential.yaml 파일에 있습니다.
SSH를 사용하여 관리자 워크스테이션에 로그인합니다.
Google Cloud CLI로 인증합니다.
gcloud auth login
다음 명령어를 실행하여 부트스트랩 클러스터를 만듭니다. 플래그 값 중 다수는
main.tf필드와 동일합니다. 하지만 명령어는 제공된 자리표시자 변수에 지정해야 하는 추가 값을 사용합니다.gkectl register bootstrap \ --target-cluster-name=ADMIN_CLUSTER_NAME \ --project-id=PROJECT_ID \ --location=REGION \ --vcenter-address=VCENTER_ADDRESS \ --vcenter-datacenter=DATA_CENTER \ --vcenter-cluster=VCENTER_CLUSTER \ --vcenter-resource-pool=RESOURCE_POOL \ --vcenter-datastore=DATASTORE \ --vcenter-network=NETWORK \ --vcenter-ca-cert-path=CA_CERT_PATH \ --bundle-path=BUNDLE_PATH \ --component-access-service-account-key-path=COMPONENT_ACCESS_SA_PATH \ --register-service-account-key-path=CONNECT_REGISTER_SA_PATH \ --stackdriver-service-account-key-path=LOG_MON_SA_PATH \ --cloud-audit-logging-service-account-key-path=CLOUD_AUDIT_SA_PATH \ --admin-kubeconfig-out=KUBECONFIG_NAME다음을 관리자 워크스테이션 경로로 바꿉니다.
CA_CERT_PATH: vCenter Server의 루트 CA 인증서 경로입니다.BUNDLE_PATH: 번들 파일의 경로입니다.gkeadm을 사용하여 관리자 워크스테이션을 만든 경우 번들 파일은/var/lib/gke/bundles/에 있습니다. 파일 이름은 Google Distributed Cloud 버전에 따라 다릅니다(예:gke-onprem-vsphere-1.31.0-gke.889-full.tgz).COMPONENT_ACCESS_SA_PATH: 구성요소 액세스 서비스 계정의 키 파일 경로입니다.CONNECT_REGISTER_SA_PATH: connect-register 서비스 계정의 키 파일 경로입니다.LOG_MON_SA_PATH: 로깅-모니터링 서비스 계정의 키 파일 경로입니다.CLOUD_AUDIT_SA_PATH: 감사 로깅 서비스 계정의 경로입니다. 감사 로깅 서비스 계정을 만들지 않은 경우 로깅-모니터링 서비스 계정의 키 파일 경로를 지정합니다.KUBECONFIG_NAME:gkectl register bootstrap명령어가 만드는 kubeconfig 파일의 이름입니다. 이 플래그를 지정하지 않으면 명령어는 현재 작업 디렉터리에kubeconfig라는 이름의 파일을 만듭니다.kubeconfig라는 기존 파일이 있으면 명령어가 파일을 덮어씁니다.
다음 플래그에 맞게 명령어를 수정합니다.
main.tf에서 폴더를 지정한 경우 다음 플래그를 추가합니다.--vcenter-folder=FOLDERmain.tf에서 VM 스토리지 정책을 지정한 경우--vcenter-datastore를 삭제하고 다음 플래그를 추가합니다.--vcenter-storage-policy-name=STORAGE_POLICY_NAME관리자 워크스테이션이 프록시 서버 뒤에 있는 네트워크에 있는 경우 다음 플래그를 추가합니다.
--proxy-url=PROXY_URL--no-proxy=NO_PROXY
다음을 바꿉니다.
- PROXY_URL: 프록시 서버의 URL입니다.
- NO_PROXY: 프록시에서 제외된 도메인 및 IP 주소의 값(쉼표로 구분)입니다.
플래그를 추가하는 경우 명령줄 연속 백슬래시 문자 (\)를 추가해야 합니다.
메시지가 표시되면 vCenter 사용자 이름을 입력하거나 복사하여 붙여넣습니다. 사용자 이름이 화면에 다시 표시되지 않습니다.
메시지가 표시되면 vCenter 비밀번호를 입력하거나 복사하여 붙여넣습니다. 비밀번호가 화면에 다시 표시되지 않습니다.
이 명령어는 다양한 유효성 검사를 실행합니다. gkectl이 부트스트랩 클러스터를 성공적으로 만들면 다음과 비슷한 출력이 표시되며 가독성을 위해 잘립니다.
Running workstation validations
- Validation Category: Workstation
- [SUCCESS] Workstation OS
- [SUCCESS] Workstation Hardware
- [SUCCESS] Workstation Package
- [SUCCESS] Workstation NTP
- [SUCCESS] Workstation Docker
...
All validation results were SUCCESS.
Unpacking GKE on-prem bundle: /var/lib/gke/bundles/gke-onprem-vsphere-1.31.0-gke.889-full.tgz
...
Successfully created and registered the bootstrap cluster
...
Waiting for preflight checks to run or OnPremAdminCluster to be applied...... -
이 프로세스는 관리자 클러스터가 생성될 때까지 계속 실행됩니다.
관리자 클러스터를 만들기 전에 gkectl register bootstrap 명령어를 종료하면 관리자 클러스터 만들기가 실패하며 다음 명령어를 사용하여 부트스트랩 클러스터를 삭제해야 합니다.
gkectl delete bootstrap \
--target-cluster-name=ADMIN_CLUSTER_NAME \
--project-id=PROJECT_ID \
--location=REGION \
--register-service-account-key-path=CONNECT_REGISTER_SA_PATH
관리자 클러스터 만들기
Terraform 계획을 적용하여 관리자 클러스터를 만듭니다.
terraform apply "tfplan"
관리자 클러스터를 만드는 데 15분 이상 걸립니다. Google Cloud 콘솔의 GKE 클러스터 페이지에서 클러스터를 볼 수 있습니다.
관리자 클러스터에 연결
gkectl register bootstrap 명령어는 관리자 워크스테이션에서 관리자 클러스터용 kubeconfig 파일을 만듭니다. gkectl register bootstrap을 실행할 때 --admin-kubeconfig-out 플래그를 지정하지 않으면 명령어가 명령어를 실행한 디렉터리에 kubeconfig라는 kubeconfig 파일을 만듭니다.
클러스터의 사용자 인증 정보가 포함되어 있으므로 이 kubeconfig에 대한 액세스를 제한해야 합니다.
또한 커넥트 게이트웨이를 통해 읽기 전용 kubectl 명령어를 실행할 수 있습니다.
gcloud CLI가 설치된 컴퓨터에서 다음 명령어를 실행하여 Connect 게이트웨이를 통해 클러스터에 액세스할 수 있는
kubeconfig항목을 가져옵니다.gcloud container fleet memberships get-credentials ADMIN_CLUSTER_NAME \ --project=PROJECT_ID출력은 다음과 비슷합니다.
Starting to build Gateway kubeconfig... Current project_id: PROJECT_ID A new kubeconfig entry "connectgateway_PROJECT_ID_global_ADMIN_CLUSTER_NAME" has been generated and set as the current context.이제 커넥트 게이트웨이를 통해 다음과 같은 읽기 전용
kubectl명령어를 실행할 수 있습니다.kubectl get pods -A관리자 클러스터에 대한 전체 관리 권한이 필요한 경우 연결 게이트웨이 설정을 참고하세요.