관리자 및 사용자 클러스터 만들기

이 페이지에서는 관리자 클러스터와 사용자 클러스터를 만드는 방법을 보여줍니다.

관리자 워크스테이션에 SSH를 통해 연결

관리자 워크스테이션에 SSH를 통해 연결합니다.

ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]

여기서 [IP_ADDRESS]는 관리자 워크스테이션의 IP 주소입니다.

관리자 워크스테이션에서 이 주제의 나머지 단계를 모두 수행합니다.

로그인

Google Cloud 사용자 계정 사용자 인증 정보를 사용하여 Google Cloud에 로그인합니다. 사용자 계정에는 최소한 IAM 뷰어 이상의 역할이 있어야 합니다.

gcloud auth login

gcloud를 Docker 사용자 인증 정보 도우미로 등록합니다. (이 명령어에 대해 자세히 알아보기)

gcloud auth configure-docker

관리자 클러스터의 고정 IP 구성

관리자 클러스터에 사용할 고정 IP 주소를 지정하려면 admin-hostconfig.yaml이라는 호스트 구성 파일을 만듭니다. 이 실습에서는 관리자 클러스터에서 사용할 5개의 IP 주소를 지정해야 합니다.

다음은 호스트가 5개인 호스트 구성 파일의 예시입니다.

hostconfig:
  dns: 172.16.255.1
  tod: 192.138.210.214
  otherdns:
  - 8.8.8.8
  - 8.8.4.4
  othertod:
  - ntp.ubuntu.com
  searchdomainsfordns:
  - "my.local.com"
blocks:
  - netmask: 255.255.252.0
    gateway: 110.116.232.1
    ips:
    - ip: 172.16.20.10
      hostname: admin-host1
    - ip: 172.16.20.11
      hostname: admin-host2
    - ip: 172.16.20.12
      hostname: admin-host3
    - ip: 172.16.20.13
      hostname: admin-host4
    - ip: 172.16.20.14
      hostname: admin-host5

ips 필드는 IP 주소와 호스트 이름의 배열입니다. 이러한 주소는 GKE On-Prem이 관리자 클러스터 노드에 할당할 IP 주소와 호스트 이름입니다.

호스트 구성 파일에서 관리자 클러스터 노드가 사용할 DNS 서버, 시간 서버, 기본 게이트웨이의 주소도 지정합니다.

searchdomainsfordns 필드는 클러스터에서 사용할 DNS 검색 도메인 배열입니다. 이러한 도메인은 도메인 검색 목록의 일부로 사용됩니다.

사용자 클러스터의 고정 IP 구성

사용자 클러스터에 사용할 고정 IP 주소를 지정하려면 user-hostconfig.yaml이라는 호스트 구성 파일을 만듭니다.

다음은 호스트가 3개인 호스트 구성 파일의 예시입니다.

hostconfig:
  dns: 172.16.255.1
  tod: 192.138.210.214
  otherdns:
  - 8.8.8.8
  - 8.8.4.4
  othertod:
  - ntp.ubuntu.com
  searchdomainsfordns:
  - "my.local.com"
blocks:
  - netmask: 255.255.252.0
    gateway: 110.116.232.1
    ips:
    - ip: 172.16.20.15
      hostname: user-host1
    - ip: 172.16.20.16
      hostname: user-host2
    - ip: 172.16.20.17
      hostname: user-host3

ips 필드는 IP 주소와 호스트 이름의 배열입니다. 이러한 주소는 GKE On-Prem이 사용자 클러스터 노드에 할당할 IP 주소와 호스트 이름입니다.

searchdomainsfordns 필드는 클러스터에서 사용할 DNS 검색 도메인 배열입니다. 이러한 도메인은 도메인 검색 목록의 일부로 사용됩니다.

GKE On-Prem 구성 파일 만들기

다음 YAML을 config.yaml이라는 파일에 복사합니다.

bundlepath: "/var/lib/gke/bundles/gke-onprem-vsphere-1.2.2-gke.2-full.tgz"
vcenter:
  credentials:
    address: ""
    username: ""
    password: ""
  datacenter: ""
  datastore: ""
  cluster: ""
  network: ""
  resourcepool: ""
  datadisk: ""
  cacertpath: ""
proxy:
  url: ""
  noproxy: ""
admincluster:
  ipblockfilepath: "admin-hostconfig.yaml"
  bigip:
    credentials: &bigip-credentials
      address: ""
      username: ""
      password: ""
    partition: ""
  vips:
    controlplanevip: ""
    ingressvip: ""
  serviceiprange: 10.96.232.0/24
  podiprange: 192.168.0.0/16
usercluster:
  ipblockfilepath: "user-hostconfig.yaml"
  bigip:
    credentials: *bigip-credentials
    partition: ""
  vips:
    controlplanevip: ""
    ingressvip: ""
  clustername: "initial-user-cluster"
  masternode:
    cpus: 4
    memorymb: 8192
    replicas: 1
  workernode:
    cpus: 4
    memorymb: 8192
    replicas: 3
  serviceiprange: 10.96.0.0/12
  podiprange: 192.168.0.0/16
lbmode: Integrated
gkeconnect:
  projectid: ""
  registerserviceaccountkeypath: ""
  agentserviceaccountkeypath: ""
stackdriver:
  projectid: ""
  clusterlocation: ""
  enablevpc: false
  serviceaccountkeypath: ""
gcrkeypath: ""

구성 파일 수정

다음 섹션의 설명대로 config.yaml을 수정합니다.

vcenter.credentials.address

vcenter.credentials.address 필드에는 vCenter Server의 IP 주소 또는 호스트 이름이 포함됩니다.

vsphere.credentials.address field를 입력하기 전에 사용 중인 vCenter Server의 인증서를 다운로드하고 검사합니다. 다음 명령어를 입력하여 인증서를 다운로드하고 vcenter.pem이라는 파일로 저장합니다.

true | openssl s_client -connect [VCENTER_IP]:443 -showcerts 2>/dev/null | sed -ne '/-BEGIN/,/-END/p' > vcenter.pem

여기서 [VCENTER_IP]는 vCenter Server의 IP 주소입니다.

인증서 파일을 열어서 제목 일반 이름 및 제목 대체 이름을 확인합니다.

openssl x509 -in vcenter.pem -text -noout

결과에 Subject 일반 이름(CN)이 표시됩니다. 이 이름은 IP 주소이거나 호스트 이름일 수 있습니다. 예를 들면 다음과 같습니다.

Subject: ... CN = 203.0.113.100
Subject: ... CN = my-host.my-domain.example

결과의 Subject Alternative Name 아래에는 DNS 이름이 1개 이상 포함될 수도 있습니다.

X509v3 Subject Alternative Name:
    DNS:vcenter.my-domain.example

Subject 일반 이름을 선택하거나 Subject Alternative Name 아래에서 구성 파일의 vcenter.credentials.address 값으로 사용할 DNS 이름 중 하나를 선택합니다. 예를 들면 다음과 같습니다.

vcenter:
  credentials:
    address: "203.0.113.1"
    ...
vcenter:
  credentials:
    address: "my-host.my-domain.example"
    ...

인증서에 표시되는 값을 선택해야 합니다. 예를 들어 IP 주소가 인증서에 표시되지 않으면 이를 vcenter.credentials.address에 사용할 수 없습니다.

vcenter.credentials

GKE On-Prem에는 vCenter Server의 사용자 이름과 비밀번호가 필요합니다. 이 정보를 제공하려면 vcenter.credentials 아래에서 usernamepassword 값을 설정하세요. 예를 들면 다음과 같습니다.

vcenter:
  credentials:
    ...
    username: "my-name"
    password: "my-password"

vcenter.datacenter, .datastore, .cluster, .network

GKE On-Prem에는 vSphere 환경 구조에 대한 정보가 필요합니다. 이 정보를 제공하려면 vcenter 아래에서 값을 설정하세요. 예를 들면 다음과 같습니다.

vcenter:
  ...
  datacenter: "MY-DATACENTER"
  datastore: "MY-DATASTORE"
  cluster: "MY-VSPHERE-CLUSTER"
  network: "MY-VIRTUAL-NETWORK"

vcenter.resourcepool

vSphere 리소스 풀은 vSphere 클러스터에서 vSphere VM을 논리적으로 묶은 그룹입니다. 기본값이 아닌 리소스 풀을 사용하는 경우 vcenter.resourcepool에 리소스 풀 이름을 제공합니다. 예를 들면 다음과 같습니다.

vcenter:
  ...
  resourcepool: "my-pool"

GKE On-Prem이 해당 노드를 vSphere 클러스터의 기본 리소스 풀에 배포하도록 하려면 vcenter.resourcepool에 빈 문자열을 제공합니다. 예를 들면 다음과 같습니다.

vcenter:
  ...
  resourcepool: ""

vcenter.datadisk

GKE On-Prem은 관리자 클러스터의 Kubernetes 객체 데이터를 저장할 가상 머신 디스크(VMDK)를 만듭니다. 설치 프로그램에서 자동으로 VMDK를 만들지만 vcenter.datadisk 필드에 VMDK 이름을 제공해야 합니다. 예를 들면 다음과 같습니다.

vcenter:
  ...
  datadisk: "my-disk.vmdk"
vSAN Datastore: VMDK에 폴더 만들기

vSAN Datastore를 사용하는 경우 VMDK를 폴더에 두어야 합니다. 폴더는 수동으로 미리 만들어야 합니다. 이렇게 하려면 govc를 사용하여 폴더를 만들면 됩니다.

govc datastore.mkdir -namespace=true my-gke-on-prem-folder

그런 다음 vcenter.datadisk를 폴더가 포함된 VMDK 경로로 설정합니다. 예를 들면 다음과 같습니다.

vcenter:
...
datadisk: "my-gke-on-prem-folder/my-disk.vmdk"

버전 1.1.1에서는 알려진 문제로 인해 해당 파일 경로 대신 폴더의 범용 고유 식별자(UUID) 경로를 vcenter.datadisk에 제공해야 합니다. 위 govc 명령어의 결과에서 이를 복사합니다.

그런 다음 vcenter.datadisk 필드에 폴더의 UUID를 제공합니다. UUID 앞에 슬래시를 사용하지 마세요. 예를 들면 다음과 같습니다.

vcenter:
...
datadisk: "14159b5d-4265-a2ba-386b-246e9690c588/my-disk.vmdk"

이 문제는 버전 1.1.2 이상에서 해결되었습니다.

vcenter.cacertpath

GKE On-Prem과 같은 클라이언트가 vCenter Server로 요청을 전송할 때 서버는 인증서 또는 인증서 번들을 제공하여 클라이언트에 해당 ID를 입증해야 합니다. 인증서 또는 번들을 확인하려면 GKE On-Prem의 신뢰 체인에 루트 인증서가 있어야 합니다.

vcenter.cacertpath를 루트 인증서의 경로로 설정합니다. 예를 들면 다음과 같습니다.

vcenter:
  ...
  cacertpath: "/my-cert-folder/the-root.crt"

VMware 설치에는 vCenter Server에 인증서를 발급하는 인증 기관(CA)이 포함됩니다. 신뢰 체인의 루트 인증서는 VMware에서 생성된 자체 서명 인증서입니다.

기본값인 VMWare CA를 사용하지 않을 경우 다른 인증 기관을 사용하도록 VMware를 구성할 수 있습니다.

vCenter Server에 기본 VMware CA에서 발급된 인증서가 사용될 경우에는 루트 인증서를 가져올 수 있는 몇 가지 방법이 있습니다.

  • curl -k "https://[SERVER_ADDRESS]/certs/download.zip" > download.zip

    여기서 [SERVER_ADDRESS]는 vCenter Server의 주소입니다.

  • 브라우저에서 vCenter Server의 주소를 입력합니다. 오른쪽 회색 상자에서 신뢰할 수 있는 루트 CA 인증서 다운로드를 클릭합니다.

  • 다음 명령어를 입력하여 사용 중인 인증서를 가져옵니다.

    true | openssl s_client -connect [SERVER_ADDRESS]:443 -showcerts

    결과에서 https://[SERVER_ADDRESS]/afd/vecs/ca와 비슷한 URL을 찾습니다. 브라우저에 이 URL을 입력합니다. 루트 인증서를 다운로드합니다.

다운로드한 파일 이름은 download.zip입니다.

unzip 명령어를 설치하고 파일의 압축을 풉니다.

sudo apt-get install unzip
unzip download.zip

처음에 unzip 명령어가 작동하지 않으면 명령어를 다시 입력합니다.

certs/lin에서 인증서 파일을 찾습니다.

proxy

네트워크가 프록시 서버 뒤에 있는 경우 proxy.url을 프록시 서버의 주소로 설정합니다.

proxy.noproxy에 IP 주소, IP 주소 범위, 호스트 이름, 도메인 이름 목록을 제공합니다. GKE On-Prem이 이러한 주소, 호스트 또는 도메인 중 하나에 요청을 보내면 해당 요청이 직접 전송됩니다. 프록시 서버로는 요청이 전송되지 않습니다. 예를 들면 다음과 같습니다.

proxy:
  url: "https://my-proxy.example.local"
  noproxy: "10.151.222.0/24, my-host.example.local,10.151.2.1"

admincluster.ipblockfilepath

고정 IP 주소를 사용 중이므로 고정 IP 구성의 설명대로 호스트 구성 파일이 있어야 합니다. 호스트 구성 파일의 경로를 admincluster.ipblockfilepath 필드에 입력합니다. 예를 들면 다음과 같습니다.

admincluster:
  ipblockfilepath: "/my-config-directory/admin-hostconfig.yaml"

admincluster.bigip.credentials

GKE On-Prem에는 F5 BIG-IP 부하 분산기의 IP 주소 또는 호스트 이름, 사용자 이름, 비밀번호가 필요합니다. 이 정보를 제공하려면 admincluster.bigip 아래에서 값을 설정하세요. 예를 들면 다음과 같습니다.

admincluster:
  ...
  bigip:
    credentials:
      address: "203.0.113.2"
      username: "my-admin-f5-name"
      password: "rJDlm^%7aOzw"

admincluster.bigip.partition

앞에서 관리자 클러스터의 BIG-IP 파티션을 만들었습니다. admincluster.bigip.partition을 파티션 이름으로 설정합니다. 예를 들면 다음과 같습니다.

admincluster:
  ...
  bigip:
    partition: "my-admin-f5-partition"

admincluster.vips

admincluster.vips.controlplanevip의 값을 관리자 클러스터의 Kubernetes API 서버에 부하 분산기에서 구성한 IP 주소로 설정합니다. ingressvip의 값을 부하 분산기에서 관리자 클러스터의 인그레스 서비스에 대해 구성한 IP 주소로 설정합니다. 예를 들면 다음과 같습니다.

admincluster:
  ...
  vips:
    controlplanevip: 203.0.113.3
    ingressvip: 203.0.113.4

admincluster.serviceiprangeadmincluster.podiprange

관리자 클러스터에는 서비스에 사용할 IP 주소 범위와 pod에 사용할 IP 주소 범위가 있어야 합니다. 이러한 범위는 admincluster.serviceiprangeadmincluster.podiprange 필드로 지정됩니다. 이러한 필드는 gkectl create-config를 실행할 때 채워집니다. 필요에 따라 채워진 값을 원하는 값으로 변경할 수 있습니다.

서비스 및 pod 범위는 겹치지 않아야 합니다. 또한 서비스 및 pod 범위는 클러스터의 노드에 사용되는 IP 주소와 겹치지 않아야 합니다.

예를 들면 다음과 같습니다.

admincluster:
  ...
  serviceiprange: 10.96.232.0/24
  podiprange: 192.168.0.0/16

usercluster.bigip.partition

앞에서 사용자 클러스터의 BIG-IP 파티션을 만들었습니다. usercluster.bigip.partition을 파티션 이름으로 설정합니다. 예를 들면 다음과 같습니다.

usercluster:
  ...
  bigip:
    partition: "my-user-f5-partition"
  ...

usercluster.vips

usercluster.vips.controlplanevip 값을 사용자 클러스터의 Kubernetes API 서버에 부하 분산기에서 구성한 IP 주소로 설정합니다. ingressvip의 값을 부하 분산기에서 사용자 클러스터의 인그레스 서비스에 대해 구성한 IP 주소로 설정합니다. 예를 들면 다음과 같습니다.

usercluster:
  ...
  vips:
    controlplanevip: 203.0.113.6
    ingressvip: 203.0.113.7

usercluster.serviceiprangeusercluster.podiprange

사용자 클러스터에는 서비스에 사용할 IP 주소 범위와 pod에 사용할 IP 주소 범위가 있어야 합니다. 이러한 범위는 usercluster.serviceiprangeusercluster.podiprange 필드로 지정됩니다. 이러한 필드는 gkectl create-config를 실행할 때 채워집니다. 필요에 따라 채워진 값을 원하는 값으로 변경할 수 있습니다.

서비스 및 pod 범위는 겹치지 않아야 합니다. 또한 서비스 및 pod 범위는 클러스터의 노드에 사용되는 IP 주소와 겹치지 않아야 합니다.

예를 들면 다음과 같습니다.

usercluster:
  ...
  serviceiprange: 10.96.233.0/24
  podiprange: 172.16.0.0/12

VMware DRS 안티어피니티 규칙 사용 중지

버전 1.1.0-gke.6부터 GKE On-Prem은 사용자 클러스터 노드에 대해 VMware Distributed Resource Scheduler(DRS) 안티어피니티 규칙을 자동으로 만들어 데이터 센터에 있는 최소 3개 이상의 물리적 호스트에 분산되도록 합니다. 버전 1.1.0-gke.6부터 이 기능은 새 클러스터와 기존 클러스터에서 자동으로 사용 설정됩니다.

이 기능을 사용하려면 vSphere 환경이 다음 조건을 충족해야 합니다.

  • VMware DRS가 사용 설정되어 있습니다. VMware DRS에는 vSphere Enterprise Plus 라이선스 버전이 필요합니다. DRS를 사용 설정하는 방법은 클러스터에서 VMware DRS 사용 설정을 참조하세요.
  • vcenter 필드에 제공된 vSphere 사용자 계정에는 Host.Inventory.EditCluster 권한이 포함됩니다.
  • 사용 가능한 물리적 호스트가 3개 이상입니다.

vSphere 스탠더드 라이선스가 있으면 VMware DRS를 사용 설정할 수 없습니다.

DRS가 사용 설정되지 않았거나 vSphere VM을 예약할 수 있는 호스트가 최소 세 개 이상 없으면 구성 파일에 usercluster.antiaffinitygroups.enabled: false를 추가합니다. 예를 들면 다음과 같습니다.

usercluster:
  ...
  antiaffinitygroups:
    enabled: false

gkeconnect

gkeconnect 사양에는 GKE On-Prem이 Google Cloud Console에서 온프렘 클러스터 관리를 설정하는 데 필요한 정보가 포함되어 있습니다.

gkeconnect.projectid를 온프렘 클러스터를 관리하려는 Google Cloud 프로젝트의 프로젝트 ID로 설정합니다.

gkeconnect.registerserviceaccountkeypath 값을 등록 서비스 계정의 JSON 키 파일 경로로 설정합니다. gkeconnect.agentserviceaccountkeypath의 값을 연결 서비스 계정에 대한 JSON 키 파일의 경로로 설정합니다.

예를 들면 다음과 같습니다.

gkeconnect:
  projectid: "my-project"
  registerserviceaccountkeypath: "/my-key-directory/register-key.json"
  agentserviceaccountkeypath: "/my-key-directory/connect-key.json"

stackdriver

stackdriver 사양에는 GKE On-Prem이 온프렘 클러스터에서 생성된 로그 항목을 저장하기 위해 필요한 정보가 포함되어 있습니다.

stackdriver.projectid를 Google Cloud의 작업 제품군과 연결하려는 Google Cloud 프로젝트의 프로젝트 ID로 설정합니다. Connect는 이 프로젝트를 통해 클러스터 로그를 Stackdriver로 내보냅니다.

stackdriver.clusterlocation을 로그를 저장하려는 Google Cloud 리전으로 설정합니다. 온프렘 데이터 센터와 가까운 리전을 선택하는 것이 좋습니다.

stackdriver.proxyconfigsecretnamekube-system 네임스페이스에 정의한 Kubernetes 보안 비밀로 설정합니다. 이 보안 비밀에는 https_proxy_url을 정의하는 단일 값이 있어야 합니다. 기본 보안 비밀 stackdriver-proxy-config는 변경할 수 없으며 단순히 예시입니다.

클러스터의 네트워크가 VPC로 제어되는 경우 stackdriver.enablevpctrue로 설정합니다. 이렇게 하면 모든 원격 분석이 Google의 제한된 IP 주소를 통해 이동합니다.

stackdriver.serviceaccountkeypathGoogle Cloud 운영 제품군 서비스 계정에 대한 JSON 키 파일의 경로로 설정합니다.

예를 들면 다음과 같습니다.

stackdriver:
  projectid: "my-project"
  clusterlocation: "us-west1"
  enablevpc: false
  serviceaccountkeypath: "/my-key-directory/stackdriver-key.json"

gcrkeypath

gcrkeypath 값을 허용 목록에 포함된 서비스 계정의 JSON 키 파일 경로로 설정합니다. 예를 들면 다음과 같습니다. 참고: 이 명령어에 대한 자세한 내용은 실행 전 검사 실행을 참조하세요.

gcrkeypath: "/my-key-directory/whitelisted-key.json"

구성 파일 검사

구성 파일을 수정한 후에는 gkectl check-config를 실행하여 파일이 올바르고 설치에 사용될 수 있는지 확인합니다.

gkectl check-config --config config.yaml

명령어가 FAILURE 메시지를 반환하면 문제를 해결하고 파일 유효성을 다시 검사합니다.

시간이 오래 걸리는 검사를 건너뛰려면 --fast 플래그를 전달합니다. 개별 검사를 건너뛰려면 --skip-validation-xxx 플래그를 사용합니다. check-config 명령어에 대해 자세히 알아보려면 실행 전 검사 실행을 참조하세요.

gkectl prepare 실행

gkectl prepare를 실행하여 vSphere 환경을 초기화합니다.

gkectl prepare --config config.yaml --skip-validation-all

관리자 및 사용자 클러스터 만들기

관리자 클러스터 및 사용자 클러스터를 만듭니다.

gkectl create cluster --config config.yaml --skip-validation-all

gkectl create cluster 명령어는 현재 디렉터리에 kubeconfig라는 파일을 만듭니다. GKE On-Prem 문서는 자리표시자 [ADMIN_CLUSTER_KUBECONFIG]를 사용하여 이 파일을 참조합니다.

관리자 클러스터가 생성되었는지 확인하려면 다음 명령어를 입력합니다.

kubectl get nodes --kubeconfig [ADMIN_CLUSTER_KUBECONFIG]

결과에 관리자 클러스터 노드가 표시됩니다.

gkectl create cluster 명령어는 현재 디렉터리에 init-user-cluster-kubeconfig라는 파일을 만듭니다. GKE On-Prem 문서는 자리표시자 [USER_CLUSTER_KUBECONFIG]를 사용하여 이 파일을 참조합니다.

사용자 클러스터가 생성되었는지 확인하려면 다음 명령어를 입력합니다.

kubectl get nodes --kubeconfig [USER_CLUSTER_KUBECONFIG]

결과에 사용자 클러스터 노드가 표시됩니다. 예를 들면 다음과 같습니다.

NAME                        STATUS   ROLES    AGE   VERSION
xxxxxx-1234-ipam-15008527   Ready    <none>   12m   v1.14.7-gke.24
xxxxxx-1234-ipam-1500852a   Ready    <none>   12m   v1.14.7-gke.24
xxxxxx-1234-ipam-15008536   Ready    <none>   12m   v1.14.7-gke.24