创建管理工作站

本文档介绍了如何创建可用于创建 GKE On-Prem 集群的管理员工作站。

在本文档中,您将创建一个具有静态 IP 地址的管理员工作站。这与基本安装过程一致,该过程会创建使用静态 IP 地址的集群。

如果您要创建使用动态主机配置协议 (DHCP) 来获取 IP 地址的管理员工作站,请参阅使用 DHCP 创建管理员工作站

本文档中的步骤使用 gkeadm 命令行工具,该工具可用于 Linux、Windows 10、Windows Server 2019 和 macOS Catalina。

下载 gkeadm

Linux

下载 gkeadm 命令行工具并使其可执行:

gsutil cp gs://gke-on-prem-release-public/gkeadm/1.5.2-gke.3/linux/gkeadm ./
chmod +x gkeadm

Windows

下载 gkeadm 命令行工具:

gsutil cp gs://gke-on-prem-release-public/gkeadm/1.5.2-gke.3/windows/gkeadm.exe ./

macOS

下载 gkeadm 命令行工具并使其可执行:

gsutil cp gs://gke-on-prem-release-public/gkeadm/1.5.2-gke.3/darwin/gkeadm ./
chmod +x gkeadm

生成配置文件模板

gkeadm 工具需要配置文件才能创建管理员工作站。如需生成配置文件模板,请运行以下命令:

./gkeadm create config

输出是名为 admin-ws-config.yaml 的文件:

填充值

配置文件中的以下字段会填充默认值或生成的值。例如:

adminWorkstation:
  name: gke-admin-ws-200617-113711
  cpus: 4
  memoryMB: 8192
  diskGB: 50
  dataDiskName: gke-on-prem-admin-workstation-data-disk/gke-admin-ws-200617-113711-data-disk.vmdk
  dataDiskMB: 512
  ntpServer: ntp.ubuntu.com

保留所有默认值和生成的值。

请注意 dataDiskName 的生成值。系统会为您创建此虚拟机磁盘 (VMDK)。稍后,如果您手动删除管理员工作站,则系统会自动删除 VMDK。

填写配置文件的其余部分

在配置文件中,输入字段值(如本部分所述)。

gcp.whitelistedServiceAccountKeyPath

字符串。组件访问服务帐号的 JSON 密钥文件的路径。这是 GKE On-Prem 用于从 Container Registry 下载组件的帐号。如需了解如何创建 JSON 密钥文件,请参阅服务帐号和密钥

gkeadm 创建管理员工作站时,它会在管理员工作站上激活您的组件访问服务帐号。

例如:

gcp:
  whitelistedServiceAccountKeyPath: "my-key-folder/component-access-key.json"

vCenter.credentials.address

字符串。您的 vCenter 服务器的 IP 地址或主机名。

在填写 address 字段之前,请下载并检查您的 vCenter 服务器的服务证书。输入以下命令以下载证书并将其保存到名为 vcenter.pem 的文件中。

true | openssl s_client -connect VCENTER_IPVCENTER_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 名称:

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

选择 Subject 通用名称或 Subject Alternative Name 下的一个 DNS 名称,以在配置文件中用作 vcenter.credentials.address 的值。例如:

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

vCenter.credentials.username

字符串。vCenter Server 用户帐号。用户帐号应具有 Administrator 角色或同等权限。请参阅 vSphere 要求

例如:

vCenter:
  credentials:
    username: "administrator@vsphere.local"

vCenter.credentials.password

字符串。vCenter Server 用户帐号的密码。例如:

vCenter:
  credentials:
    password: "#STyZ2T#Ko2o"

vCenter.datacenter

字符串。您的 vSphere 数据中心的名称。例如:

vCenter:
  datacenter: "MY-DATACENTER"

vCenter.datastore

字符串。您的 vSphere 数据存储区的名称。例如:

vCenter:
  datastore: "MY-DATASTORE"

vCenter.cluster

字符串。您的 vSphere 集群的名称。例如:

vCenter:
  cluster: "MY-CLUSTER"

vCenter.network

字符串。要在其中创建管理员工作站的 vSphere 网络的名称。

如果名称中包含特殊字符,您必须对其使用转义序列。

特殊字符 转义序列
正斜杠 (/) %2f
反斜杠 (\) %5c
百分号 (%) %25

如果网络名称不唯一,则可以指定网络的路径,例如 /DATACENTER/network/NETWORK_NAME

例如:

vCenter:
  network: "MY-VM-NETWORK"

vCenter.resourcePool

字符串。如果您使用的是非默认资源池,请提供您的 vSphere 资源池的名称。例如:

vCenter:
  resourcePool: "MY-POOL"

如果您使用的是默认资源池,请提供以下值:

vCenter:
  resourcePool: "MY_CLUSTER/Resources"

MY_CLUSTER 替换为您的 vSphere 集群名称。

请参阅为独立主机指定根资源池

vCenter.caCertPath

字符串。当客户端(如 GKE On-Prem)向您的 vCenter 服务器发送请求时,服务器必须通过提供证书或证书软件包来向客户端证明其身份。为了验证证书或软件包,GKE On-Prem 必须具有信任链中的根证书。

vCenter.caCertPath 设置为根证书的路径。例如:

vCenter:
  caCertPath: "/usr/local/google/home/me/certs/vcenter-ca-cert.pem"

VMware 安装的证书授权机构 (CA) 会向您的 vCenter 服务器颁发证书。信任链中的根证书是由 VMware 创建的自签名证书。

如果您不想使用默认的 VMWare CA,则可以将 VMware 配置为使用其他证书授权机构

如果您的 vCenter 服务器使用默认 VMware CA 颁发的证书,请按如下方式下载该证书:

curl "https://SERVER_ADDRESS/certs/download.zip" > download.zip

SERVER_ADDRESS 替换为您的 vCenter 服务器的地址。

安装 unzip 命令并解压缩证书文件:

sudo apt-get install unzip
unzip downloads.zip

如果首次解压缩命令无效,请再次输入该命令。

certs/lin 中可找到证书文件。

proxyUrl

字符串:如果用于运行 gkeadm 的机器使用代理服务器访问互联网,请将此字段设置为代理服务器的网址。例如:

proxyUrl: "https://my-proxy.example.local"

adminWorkstation.network.ipAllocationMode

字符串。将此项设置为 "static"。例如:

adminWorkstation:
  network:
    ipAllocationMode: "static"

adminWorkstation.network.hostConfig.ip

字符串。您为自己的管理员工作站选择的 IP 地址。例如:

adminWorkstation:
  network:
    hostconfig:
      ip: "172.16.5.1"

adminWorkstation.network.hostConfig.gateway

字符串。包含您的管理员工作站的网络的默认网关 IP 地址。例如:

adminWorkstation:
  network:
    hostconfig:
      gateway: "172.16.6.254"

adminWorkstation.network.hostConfig.netmask

字符串。包含您的管理员工作站的网络的网络掩码。例如:

adminWorkstation:
  network:
    hostconfig:
      netmask: "255.255.248.0"

adminWorkstation.network.hostConfig.dns

字符串数组。管理员工作站可以使用的 DNS 服务器的 IP 地址数组。例如:

adminWorkstation:
  network:
    hostconfig:
      dns:
      - "172.16.255.1"
      - "172.16.255.2"

adminWorkstation.proxyUrl

字符串。如果您的网络在代理服务器后端,并且您希望管理员工作站和 GKE On-Prem 集群使用同一个代理服务器,请将 adminworkstation.proxyURL 设置为代理服务器的网址。例如:

adminworkstation:
  proxyUrl: "http://aw-proxy.example"

adminWorkstation.ntpServer

字符串。您的管理员工作站将使用的网络时间协议服务器的主机名或 IP 地址。例如:

adminWorkstation:
  ntpServer: "216.239.35.0"

如果您将此字段留空,则 GKE On-Prem 使用 "ntp.ubuntu.com"

以下是已完成的 admin-ws-config.yaml 文件的示例:

gcp:
  whitelistedServiceAccountKeyPath: "my-key-folder/component-access-key.json"
vCenter:
  credentials:
    address: "203.0.113.1"
    username: "administrator.vsphere.local"
    password: "#STyZ2T#Ko2o"
  datacenter: "MY-DATACENTER"
  datastore: "MY-DATASTORE"
  cluster: "MY-CLUSTER"
  network: "MY-VM-NETWORK"
  resourcePool: "MY-POOL"
  caCertPath: "/usr/local/google/home/me/certs/the-root.cert"
proxyUrl: ""
adminWorkstation:
  name: "gke-admin-ws-200617-113711"
  cpus: 4
  memoryMB: 8192
  diskGB: 50
  dataDiskName: "gke-on-prem-admin-workstation-data-disk/gke-admin-ws-200617-113711-data-disk.vmdk"
  dataDiskMB: 512
  network:
    ipAllocationMode: "static"
    hostConfig:
      ip: "172.16.5.1"
      gateway: "172.16.6.254"
      netmask: "255.255.248.0"
      dns:
      - "172.16.255.1"
      - "172.16.255.2"
  proxyUrl: ""
  ntpServer: "ntp.ubuntu.com"

创建管理员工作站

您设置为 SDK account 属性的 Google 帐号必须具有以下 IAM 角色gkeadm 才能为您创建和管理服务帐号:

  • resourcemanager.projectIamAdmin
  • serviceusage.serviceUsageAdmin
  • iam.serviceAccountCreator
  • iam.serviceAccountKeyAdmin

查看 SDK account 属性的值:

gcloud config get-value account

如需授予角色,您必须拥有 Cloud 项目的特定权限。如需了解详情,请参阅授予、更改和撤消对资源的访问权限

如果您拥有所需的权限,则可以自行授予这些角色。否则,必须由您所在组织中的其他人为您授予这些角色。

要授予这些角色,请执行以下操作:

Linux 和 macOS

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="user:ACCOUNT" \
    --role="roles/resourcemanager.projectIamAdmin"

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="user:ACCOUNT" \
    --role="roles/serviceusage.serviceUsageAdmin"

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="user:ACCOUNT" \
    --role="roles/iam.serviceAccountCreator"

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="user:ACCOUNT" \
    --role="roles/iam.serviceAccountKeyAdmin"

Windows

gcloud projects add-iam-policy-binding PROJECT_ID ^
    --member="user:ACCOUNT" ^
    --role="roles/resourcemanager.projectIamAdmin"

gcloud projects add-iam-policy-binding PROJECT_ID ^
    --member="user:ACCOUNT" ^
    --role="roles/serviceusage.serviceUsageAdmin"

gcloud projects add-iam-policy-binding PROJECT_ID ^
    --member="user:ACCOUNT" ^
    --role="roles/iam.serviceAccountCreator"

gcloud projects add-iam-policy-binding PROJECT_ID ^
    --member="user:ACCOUNT" ^
    --role="roles/iam.serviceAccountKeyAdmin"

替换以下内容:

  • PROJECT_ID:您的 SDK project 属性的值
  • ACCOUNT:您的 SDK account 属性的值。

创建管理员工作站和一组服务帐号。如果您希望手动创建和配置服务帐号,则可以省略 --auto-create-service-accounts 标志。

./gkeadm create admin-workstation --auto-create-service-accounts

输出内容中会包含有关管理员工作站创建过程的详细信息。例如,您可以看到 gkeadm 执行了以下任务:

  • 运行预检检查。

  • 下载 OVA 映像,并将其上传为 vSphere 模板。

  • 创建 SSH 密钥。

  • 创建管理员工作站虚拟机。

  • 显示在管理员工作站上安装的 gkectl 和 Docker 版本。

  • 显示有关管理员工作站上的 NTP 服务器的信息。

  • 创建服务帐号及其 JSON 密钥文件。这些服务帐号是组件访问服务帐号的父帐号项目的成员。

  • 为服务帐号分配适当的 IAM 角色。这些角色是在组件访问服务帐号的父帐号项目中授予的。

  • 将服务帐号的 JSON 密钥文件复制到管理员工作站。

  • 将 vCenter 服务器的 CA 证书文件复制到管理员工作站。

  • 在管理员工作站上准备 admin-cluster.yamluser-cluster.yaml。稍后,您将使用这些配置文件创建集群。

...
- Validation Category: vCenter
    - [SUCCESS] Credentials
    - [SUCCESS] Version
    - [SUCCESS] Datacenter
    - [SUCCESS] Datastore
    - [SUCCESS] Resource Pool
    - [SUCCESS] Folder
    - [SUCCESS] Network
    - [SUCCESS] Datadisk

All validation results were SUCCESS.

******************************************
Admin workstation VM successfully created:
- Name:    my-admin-workstation
- IP:      172.16.5.1
- SSH Key: /usr/local/google/home/me/.ssh/gke-admin-workstation
******************************************

Printing gkectl and docker versions on admin workstation...
gkectl version
gkectl 1.4.0-gke.13 (git-b39331512)

docker version
Client:
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.9
 Git commit:        6a30dfca03
 Built:             Mon Sep 30 22:47:02 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Getting ... service account...<

Creating other service accounts and JSON key files...
    - connect-agent-sa-2007081316
    - connect-register-sa-2007081316
    - log-mon-sa-2007081316

Enabling APIs...
    - project my-project
        - serviceusage.googleapis.com
        - iam.googleapis.com
        - cloudresourcemanager.googleapis.com

Configuring IAM roles for service accounts...
    - my-component-access-sa for project my-project
        - roles/serviceusage.serviceUsageViewer
        - roles/iam.serviceAccountCreator
        - roles/iam.roleViewer
    - connect-agent-sa-2007081316 for project my-project
        - roles/gkehub.connect
    - connect-register-sa-2007081316 for project my-project
        - roles/gkehub.admin
        - roles/serviceusage.serviceUsageViewer
    - log-mon-sa-2007081316 for project my-project
        - roles/stackdriver.resourceMetadata.writer
        - roles/logging.logWriter
        - roles/monitoring.metricWriter

Copying files to admin workstation...
    - /usr/local/google/home/me/certs/vcenter-ca-cert.pem
    - /usr/local/google/home/me/service-account-keys/component-access-key.json
    - connect-agent-sa-2007081316.json
    - connect-register-sa-2007081316.json
    - log-mon-sa-2007081316.json

Preparing "admin-cluster.yaml" for gkectl...
Preparing "user-cluster.yaml" for gkectl...

********************************************************************
Admin workstation is ready to use.

Admin workstation information saved to /usr/local/google/home/me/my-admin-workstation
This file is required for future upgrades
SSH into the admin workstation with the following command:
ssh -i /usr/local/google/home/me/.ssh/gke-admin-workstation ubuntu@172.16.5.1
********************************************************************

与管理员工作站建立 SSH 连接

在上述输出内容的末尾附近,有一条命令,您可以使用该命令通过 SSH 连接到管理员工作站。现在输入该命令。例如:

ssh -i /usr/local/google/home/me/.ssh/gke-admin-workstation ubuntu@172.16.5.1

列出管理员工作站上的文件:

ls -1

在输出内容中,您可以查看您的服务帐号的两个集群配置文件、您的 CA 证书文件和 JSON 密钥文件:

admin-cluster.yaml
connect-agent-sa-2007081316.json
connect-register-sa-2007081316.json
log-mon-sa-2007081316.json
user-cluster.yaml
vcenter-ca-cert.pem
component-access-key.json

检查集群配置文件

在管理员工作站上,gkeadm 创建了两个集群配置文件:admin-cluster.yamluser-cluster.yaml。您可以使用这些文件创建管理员集群和用户集群。

使用文本编辑器打开 admin-cluster.yaml。请注意,许多字段已填充了您在 admin-ws-config.yaml 文件中提供的值。例如:

apiVersion: v1
kind: AdminCluster
bundlePath: /var/lib/gke/bundles/gke-onprem-vsphere-1.4.0-gke.13-full.tgz
vCenter:
  address: 203.0.113.1
  datacenter: MY-DATACENTER
  cluster: MY-CLUSTER
  resourcePool: MY-POOL
  datastore: MY-DATASTORE
  caCertPath: vcenter-ca-cert.pem
  credentials:
    username: administrator@vsphere.local
    password: STyZ2T#Ko2o
...
gcrKeyPath: component-access-key.json
stackdriver:
  projectID: my-project-id
  serviceAccountKeyPath: log-mon-sa-2007081316.json

打开 user-cluster.yaml。 请注意,许多字段已填充了您在 admin-ws-config.yaml 文件中提供的值。例如:

apiVersion: v1
kind: UserCluster
gkeOnPremVersion: 1.4.0-gke.13
...
stackdriver:
  projectID: my-project-id
  serviceAccountKeyPath: log-mon-sa-2007081316.json
gkeConnect:
  projectID: my-project-id
  registerServiceAccountKeyPath: connect-register-sa-2007081316.json
  agentServiceAccountKeyPath: connect-agent-sa-2007081316.json

使用单个 Cloud 项目

GKE On-Prem 配置文件中有多个字段可供您指定 Google Cloud 项目 ID。例如,您可以为 gkeconnect 指定一个项目 ID,而为 stackdriver 指定另一个项目 ID:

gkeconnect:
  projectid: ""
...
stackdriver:
  projectid: ""

gkeadm 准备 GKE On-Prem 配置文件时,它会将所有 projectid 字段设置为组件访问服务帐号的父帐号项目。此外,gkeadm 还针对特定项目(服务帐号的父帐号项目)向您的服务帐号授予角色。简而言之,gkeadm 使用了一个 Cloud 项目。

如果您要灵活地使用多个 Google Cloud 项目,则必须手动填写 projectid 字段并向您的服务帐号手动授予角色。如需了解详情,请参阅使用多个 Google Cloud 项目