创建管理员集群和用户集群

本页面介绍了如何创建管理员集群和用户集群。

通过 SSH 连接到管理员工作站

通过 SSH 连接到管理员工作站:

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

其中,[IP_ADDRESS] 是您的管理员工作站的 IP 地址。

在管理员工作站上完成本主题中的所有其余步骤。

登录

使用您的 Google Cloud 用户帐号凭据登录 Google Cloud。该用户帐号必须至少具有 Viewer IAM 角色:

gcloud auth login

gcloud 注册为 Docker 凭据帮助程序。(详细了解此命令):

gcloud auth configure-docker

为您的管理员集群配置静态 IP

如需指定您要用于管理员集群的静态 IP 地址,请创建一个名为 admin-hostconfig.yaml 的主机配置文件。在本练习中,您需要指定五个 IP 地址以供管理员集群使用。

以下是包含五个主机的主机配置文件的示例:

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 的主机配置文件。

以下是包含三个主机的主机配置文件的示例:

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 服务器的 IP 地址或主机名。

在填写 vsphere.credentials.address field 之前,请下载并检查您的 vCenter 服务器的服务证书。输入以下命令以下载证书并将其保存到名为 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 名称:

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"
    ...

您必须选择证书中显示的值。例如,如果 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 虚拟机的逻辑分组。如果您使用的不是默认资源池,请将其名称提供给 vcenter.resourcepool。例如:

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

如果您希望 GKE On-Prem 将其节点部署到 vSphere 集群的默认资源池,请向 vcenter.resourcepool 提供空字符串。例如:

vcenter:
  ...
  resourcepool: ""

vcenter.datadisk

GKE On-Prem 会创建一个虚拟机磁盘 (VMDK) 来保存管理员集群的 Kubernetes 对象数据。安装程序会为您创建 VMDK,但您必须在 vcenter.datadisk 字段中提供 VMDK 的名称。例如:

vcenter:
  ...
  datadisk: "my-disk.vmdk"
vSAN 数据存储区:为 VMDK 创建文件夹

如果您使用的是 vSAN 数据存储区,则需要将 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 版本中,一个已知问题会要求您向 vcenter.datadisk 提供文件夹的通用唯一标识符 (UUID) 路径,而不是文件路径。从上述 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 发送请求时,服务器必须通过提供证书或证书软件包向客户端证明其身份。为了验证证书或软件包,GKE On-Prem 必须具有信任链中的根证书。

vcenter.cacertpath 设置为根证书的路径。例如:

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

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

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

如果 vCenter 服务器使用默认 VMware CA 颁发的证书,您可以通过以下几种方式获取根证书:

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

    其中,[SERVER_ADDRESS] 是 vCenter 服务器的地址。

  • 在浏览器中,输入 vCenter 服务器的地址。在右侧的灰色框中,点击下载受信任的根 CA 证书 (Download trusted root CA certificates)。

  • 输入以下命令以获取服务证书:

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

    在输出结果中,找到如下网址:https://[SERVER_ADDRESS]/afd/vecs/ca。在浏览器中输入该网址。此时会下载根证书。

下载的文件名为 download.zip

安装解压缩命令并解压缩文件:

sudo apt-get install unzip
unzip download.zip

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

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 的值设置为您已选择在负载平衡器上为管理员集群的 Ingress 服务配置的 IP 地址。例如:

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

admincluster.serviceiprangeadmincluster.podiprange

管理员集群必须拥有用于 Service 的 IP 地址范围以及用于 pod 的 IP 地址范围。这些范围由 admincluster.serviceiprangeadmincluster.podiprange 字段指定。当您运行 gkectl create-config 时,系统会填充这些字段。您也可以将填充值更改为您选择的值。

Service 和 pod 范围不得重叠。此外,Service 和 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 的值设置为您已选择在负载平衡器上为用户集群的 Ingress 服务配置的 IP 地址。例如:

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

usercluster.serviceiprangeusercluster.podiprange

用户集群必须拥有用于 Service 的 IP 地址范围以及用于 pod 的 IP 地址范围。这些范围由 usercluster.serviceiprangeusercluster.podiprange 字段指定。当您运行 gkectl create-config 时,系统会填充这些字段。如果愿意,您可以将填充值更改为您选择的值。

Service 和 pod 范围不得重叠。此外,Service 和 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 分布式资源调度器 (DRS) 反亲和性规则,使其分布到数据中心内的至少三个物理主机上。从 1.1.0-gke.6 版开始,此功能会自动为新集群和现有集群启用。

为了使用此功能,您的 vSphere 环境必须满足以下条件:

回想一下,如果您拥有 vSphere Standard 许可,则无法启用 VMware DRS。

如果您没有启用 DRS,或者没有至少三个主机可供安排 vSphere 虚拟机,请将 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 的值设置为 Connect 服务帐号的 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.proxyconfigsecretname 设置为您在 kube-system 命名空间中定义的 Kubernetes Secret。此密钥应具有定义 https_proxy_url 的单个值。默认 Secret stackdriver-proxy-config 是不可变的,仅用作示例。

如果集群的网络由 VPC 控制,请将 stackdriver.enablevpc 设置为 true。这样可以确保所有遥测流都通过 Google 的受限 IP 地址。

stackdriver.serviceaccountkeypath 设置为 Google 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"。注意:如需详细了解此命令,请参阅运行预检检查

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