使用静态 IP 地址进行安装

本页面介绍如何使用静态 IP 地址将 GKE On-Prem 安装到 VMware vSphere 6.5 或 6.7 Update 3 环境。您也可以使用 DHCP 服务器进行安装

概览

本页面上的说明展示了如何创建一个管理员集群和一个用户集群,后者有三个节点。创建集群后,您可以创建其他用户集群在用户集群中添加或移除节点

准备工作

  1. 按照以下主题中所述设置您的环境:

  2. 在 vSphere 中创建管理员工作站

  3. 如果您想使用手动负载平衡,请了解如何启用手动负载平衡

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

    ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
  5. 如果您使用了代理,所有 gkectl 命令会自动使用 config.yaml 中为来自管理员工作站的互联网请求设置的那个代理。这是推荐环境,在该环境中,您的管理员工作站和所有集群都使用同一代理。在本例中,您无需设置代理环境变量。

    手动代理选项:如果您的管理员工作站不在同一代理的后面,您必须手动配置环境,以确保它可以访问互联网。您可以设置 HTTPS_PROXY 环境变量以代理所有 HTTPS 请求(包括 gkectl 命令),但您还必须为要为其排除代理的所有请求配置 NO_PROXY 环境变量。

    如果您还需要单独运行 gcloudgsutil 命令,则可以将 Google Cloud CLI 配置为始终使用特定代理。如需查看相关说明,请参阅配置 gcloud CLI 以在代理/防火墙后使用

    使用以下选项为 gkectl 命令手动设置代理:

    • 所有 gkectl 命令

      您可以使用 HTTPS_PROXYNO_PROXY 环境变量来手动设置所有 gkectl 命令的代理方式:

      • 为您的 gkectl 命令设置不同的代理。示例:
        HTTPS_PROXY="http://my.other.proxy"
        NO_PROXY="10.0.1.0/24,private-registry.example,10.0.2.1"
      • gkectl 命令排除代理。示例:HTTPS_PROXY=""
      export HTTP_PROXY="http://[PROXY_ADDRESS]"
      export HTTPS_PROXY="http://[PROXY_ADDRESS]"
      export NO_PROXY="[NO_PROXY_ADDRESSES]"

      其中

      • [PROXY_ADDRESS] 可以为空 ("")、代理 IP 地址或代理主机名。
      • [NO_PROXY_ADDRESSES] 可以是一个以英文逗号分隔的列表,其中包含要排除在代理范围之外的网址、IP 地址或主机名。

    • 单条 gkectl 命令

      您还可以在单条 gkectl 命令前面添加环境变量作为前缀,以便使用仅为该调用指定的代理。

      示例:

      如需通过与配置文件 (config.yaml) 中指定的不同的代理来代理 gkectl 命令,请使用 HTTPS_PROXY 环境变量:

      • 使用 http://my.other.proxy 代理:
        • HTTPS_PROXY="http://my.other.proxy" gkectl create cluster --config config.yaml
        • HTTPS_PROXY="http://my.other.proxy" gkectl prepare --config config.yaml
      • 使用空值排除代理:
        • HTTPS_PROXY="" gkectl create cluster --config config.yaml
        • HTTPS_PROXY="" gkectl check-config --config config.yaml
  6. 使用您的 Google Cloud 用户帐号凭据登录 Google Cloud。该用户帐号必须至少具有 Viewer IAM 角色:

    gcloud auth login
  7. 设置默认项目。设置默认 Google Cloud 会使所有 gcloud CLI 命令针对该项目运行,这样就无需针对每条命令指定您的项目:

    gcloud config set project [PROJECT_ID]
    

    请将 [PROJECT_ID] 替换为您的项目 ID。(您可以在 Google Cloud 控制台中或通过运行 gcloud config get-value project 查找项目 ID。)

选择要安装的容器映像注册表

为了进行安装,GKE On-Prem 需要知道从何处拉取其容器化集群组件。您可以采用以下两种方法:

Container Registry

默认情况下,GKE On-Prem 使用由 Container Registry 托管且由 Google 拥有的现有容器映像注册表。除了设置代理以允许来自 gcr.io 的流量之外,您无需进行额外的设置。

私有 Docker 注册表

您可以选择使用私有 Docker 注册表进行安装。GKE On-Prem 将其集群组件推送到该 Docker 注册表。如需指定私有 Docker 注册表,请设置 privateregistryconfig 字段。

配置要安装的私有 Docker 注册表(可选)

本部分介绍如何配置现有 Docker 注册表以便安装 GKE On-Prem。如需了解如何创建 Docker 注册表,请参阅运行可外部访问的注册表。配置注册表后,请填充 GKE On-Prem 配置文件的 privateregistryconfig 字段。

如果要使用私有 Docker 注册表进行安装,则管理员工作站虚拟机必须信任签署证书的 CA。GKE On-Prem 不支持不安全的 Docker 注册表。启动 Docker 注册表时,您必须提供证书和密钥。证书可由公共证书授权机构 (CA) 签名,也可以自签名。

如需建立这种信任,请从您的管理员工作站虚拟机执行以下步骤:

  1. 创建用于存放证书的文件夹:

    sudo mkdir -p /etc/docker/certs.d/[REGISTRY_SERVER]
    

    其中,[REGISTRY_SERVER] 是运行您的 Docker 注册表的虚拟机的 IP 地址或主机名。

  2. 将您的证书文件复制到 /etc/docker/certs.d/[REGISTRY_SERVER]/ca.crt。即使文件最初具有不同的名称,您也必须将其命名为 ca.crt

  3. 重启 Docker 服务:

    sudo service docker restart
  4. 验证您是否可以登录 Docker:

    docker login -u [USERNAME] -p [PASSWORD] [REGISTRY_SERVER]

    其中,[USERNAME][PASSWORD] 是用于登录 Docker 注册表的凭据。

现在,当您在安装期间运行 gkectl prepare 时,安装所需的映像将被推送到您的 Docker 注册表。

排查注册表配置问题

  • GET https://[REGISTRY_SERVER]/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers):确保运行 Docker 注册表的虚拟机拥有正确的 IP 地址。

  • login attempt to https://[REGISTRY_SERVER]/v2/ failed with status: 401 Unauthorized:确保您的用户名和密码正确无误。

  • GET https://[REGISTRY_SERVER]/v1/users/: x509: certificate signed by unknown authority:您的管理员工作站虚拟机不信任该证书。

配置静态 IP 地址

如果您要使用静态 IP 地址,则需要创建两个主机配置文件:一个用于管理员集群,一个用于用户集群。主机配置文件告诉 GKE On-Prem 应向集群节点分配哪些 IP 地址和主机名。

管理员集群的静态 IP 地址

管理员集群需要以下节点的地址:

  • 一个用于管理员集群控制层面的节点
  • 两个在管理员集群中用于插件的节点
  • 一个管理员集群升级期间的偶发临时节点
  • 对于每个关联的用户集群,一个或三个节点

对于高可用性 (HA) 用户集群,管理员集群有三个节点,用于为用户集群运行控制层面组件。对于非 HA 用户集群,管理员集群有一个节点,用于为用户集群运行控制层面组件。

假设 N 是您打算创建的非 HA 用户集群的数量,H 是您打算创建的 HA 用户集群的数量。则在管理员集群的主机配置文件中,必须至少指定以下数量的 IP 地址:

4 + N + 3 x H

例如,假设您打算创建一个管理员集群和一个 HA 用户集群。则您需要为管理员集群预留七个 IP 地址。以下是一个管理员主机配置文件的示例,其中指定了七个 IP 地址:

hostconfig:
  dns: 172.16.255.1
  tod: 216.239.35.0
  otherdns:
  - 8.8.8.8
  - 8.8.4.4
  othertod:
  - ntp.ubuntu.com
blocks:
  - netmask: 255.255.252.0
    gateway: 172.16.23.254
    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
     - ip: 172.16.20.15
      hostname: admin-host6
      - ip: 172.16.20.16
      hostname: admin-host7

如上例所示,主机配置文件包含 YAML 数据结构。

ips 字段是 IP 地址和主机名的数组。它们是 GKE On-Prem 将分配给管理员集群节点的 IP 地址和主机名。

在主机配置文件中,您还可以指定管理员集群节点将使用的 DNS 服务器、时间服务器和默认网关的地址。

用户集群的静态 IP 地址

在一个用户集群中,每个节点都需要一个 IP 地址,此外,集群还需要一个额外的 IP 地址用于用户集群升级期间的临时节点。

例如,假设您打算创建一个包含五个节点的用户集群。则您需要为该用户集群预留六个 IP 地址。下面是一个用户主机配置文件的示例,其中指定了六个 IP/主机名对。

hostconfig:
  dns: 172.16.255.1
  tod: 216.239.35.0
  otherdns:
  - 8.8.8.8
  - 8.8.4.4
  othertod:
  - ntp.ubuntu.com
blocks:
  - netmask: 255.255.252.0
    gateway: 172.16.23.254
    ips:
    - ip: 172.16.20.17
      hostname: user-host1
    - ip: 172.16.20.18
      hostname: user-host2
    - ip: 172.16.20.19
      hostname: user-host3
    - ip: 172.16.20.20
      hostname: user-host4
    - ip: 172.16.20.21
      hostname: user-host5
    - ip: 172.16.20.22
      hostname: user-host6

每个 hostname 都会被解析为不包括其域名的本地主机名。如果您指定了完全限定的域名,系统会对域名进行删减。例如,host1.enterprise.net 变为 host1hostname 字段的值必须为小写字母。

在管理员工作站中创建服务帐号的私钥

准备安装中,您创建了四个服务帐号。现在,您需要为每个服务帐号创建一个 JSON 私钥文件。您将在安装过程中提供这些密钥。

列出服务帐号的电子邮件地址

首先,列出您的 Google Cloud 项目中的服务帐号:

gcloud iam service-accounts list

对于名为 my-gcp-project 的 Google Cloud 项目,此命令的输出如下所示:

gcloud iam service-accounts list
... EMAIL
    allowlisted-service-account@my-gcp-project.iam.gserviceaccount.com
    connect-register-service-account@my-gcp-project.iam.gserviceaccount.com
    connect-agent-service-account@my-gcp-project.iam.gserviceaccount.com
    log-mon-service-account@my-gcp-project.iam.gserviceaccount.com

记下每个帐号的电子邮件地址。对于以下各个部分,您需要提供相关帐号的电子邮件帐号。

已列入许可名单的服务帐号

gcloud iam service-accounts
keys create whitelisted-key.json --iam-account [ALLOWLISTED_SERVICE_ACCOUNT_EMAIL]

其中,[ALLOWLISTED_SERVICE_ACCOUNT_EMAIL] 是已列入许可名单的服务帐号的电子邮件地址。

注册服务帐号

gcloud iam service-accounts keys create register-key.json \
--iam-account [REGISTER_SERVICE_ACCOUNT_EMAIL]

其中,[REGISTER_SERVICE_ACCOUNT_EMAIL] 是注册服务帐号的电子邮件地址。

Connect 服务帐号

gcloud iam service-accounts keys create connect-key.json \
--iam-account [CONNECT_SERVICE_ACCOUNT_EMAIL]

其中,[CONNECT_SERVICE_ACCOUNT_EMAIL] 是 Connect 服务帐号的电子邮件地址。

Cloud Monitoring 服务帐号

gcloud iam service-accounts keys create stackdriver-key.json \
--iam-account [STACKDRIVER_SERVICE_ACCOUNT_EMAIL]

其中,[STACKDRIVER_SERVICE_ACCOUNT_EMAIL] 是 Cloud Monitoring 服务帐号的电子邮件地址。

生成配置文件

如需开始安装,请运行 gkectl create-config 来生成配置文件。您可以使用环境的规范和所需的集群规范来修改该文件。

如需生成文件,请运行以下命令。其中 --config [PATH] 为可选项,并接受配置文件的路径和名称。如果省略 --config,则系统会在当前工作目录中创建 config.yaml

gkectl create-config [--config [PATH]]

修改配置文件

现在您已生成配置文件,接下来需要对其进行修改,以适合您的环境并满足您对集群的预期。以下部分介绍了每个字段、其所需的值以及在哪里可以找到相关信息。默认情况下,某些字段会被注释掉。如果这些字段中的任何一个与您的安装相关,请取消注释并提供值。

本部分中的说明展示了如何使用单条命令创建一个管理员集群和一个用户集群。从 1.2 版开始,您可以分别创建管理员集群和用户集群

bundlepath

GKE On-Prem 软件包文件包含特定 GKE On-Prem 版本中的所有组件。创建管理员工作站时,该工作站会随附完整软件包 (/var/lib/gke/bundles/gke-onprem-vsphere-[VERSION]-full.tgz)。此软件包版本与您用来创建管理员工作站的已导入 OVA 版本一致。

bundlepath 的值设置为管理员工作站的软件包文件的路径。也就是说,将 bundlepath 设置为:

/var/lib/gke/bundles/gke-onprem-vsphere-[VERSION]-full.tgz

其中,[VERSION] 是要安装的 GKE On-Prem 版本。最新版本为 1.3.2-gke.1。

请注意,您可以将软件包文件保存在其他位置,也可以为其指定其他名称。您只需确保配置文件中 bundlepath 的值是软件包文件的路径即可。

vCenter 规范

vcenter 规范包含 vCenter Server 实例的相关信息。GKE On-Prem 需要此信息才能与 vCenter Server 进行通信。

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

打开证书文件以查看主题通用名称和主题备用名称:

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。在浏览器中输入该网址。此时会下载根证书。

下载的文件名为 downloads.zip

解压该文件:

unzip downloads.zip

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

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

代理规范

如果您的网络位于代理服务器后面,请用 HTTPS 代理以及要从代理中排除的地址填充 proxy 字段。例如:

proxy:
  url: "https://username:password@domain"
  noproxy: "10.0.1.0/24,private-registry.example,10.0.2.1"

管理员集群规范

admincluster 规范包含 GKE On-Prem 创建管理员集群所需的信息。

admincluster.vcenter.network

admincluster.vcenter.network 中,您可以为管理员集群节点指定一个 vCenter 网络。请注意,这会替换您在 vcenter 中提供的全局设置。例如:

admincluster:
  vcenter:
    network: MY-ADMIN-CLUSTER-NETWORK

admincluster.ipblockfilepath

由于您使用的是静态 IP 地址,因此必须有一个主机配置文件,如配置静态 IP 地址中所述。在 admincluster.ipblockfilepath 字段中提供主机配置文件的路径。例如:

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

admincluster.manuallbspec(手动负载平衡模式)

管理员集群中的 Ingress 控制器实现为 NodePort 类型的 Service。该 Service 有一个用于 HTTP 的 ServicePort 和一个用于 HTTPS 的 ServicePort。如果您使用的是手动负载平衡模式,则必须为这些 ServicePort 选择 nodePort 值。在 ingresshttpnodeportingresshttpsnodeport 中指定 nodePort 值。例如:

admincluster:
  ...
  manuallbspec:
    ingresshttpnodeport: 32527
    ingresshttpsnodeport: 30139

管理员集群中的 Kubernetes API 服务器实现为 NodePort 类型的 Service。如果您使用的是手动负载平衡,则必须为该 Service 选择 nodePort 值。在 controlplanenodeport 中指定 nodePort 值,例如:

admincluster:
  ...
  manuallbspec:
    ...
    controlplanenodeport: 30968

管理员集群中的插件服务器实现为 NodePort 类型的 Service。如果您使用的是手动负载平衡,则必须为该 Service 选择 nodePort 值。在 controlplanenodeport 中指定 nodePort 值,例如:

admincluster:
  manuallbspec:
    ...
    addonsnodeport: 30562

admincluster.bigip.credentials(集成负载平衡模式)

如果您未使用集成负载平衡模式,请将 admincluster.bigip 注释掉。

如果您使用的是集成负载平衡模式,则 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 字段。

admincluster.vips.controlplanevip 的值设置为您已选择在负载平衡器上为管理员集群的 Kubernetes API 服务器配置的 IP 地址。将 ingressvip 的值设置为您已选择在负载平衡器上为管理员集群的 Ingress 控制器配置的 IP 地址。例如:

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

admincluster.serviceiprange 和 admincluster.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 包含 GKE On-Prem 创建初始用户集群所需的信息。

停用 VMware DRS 反亲和性规则(可选)

GKE On-Prem 会自动为您的用户集群节点创建 VMware 分布式资源调度器 (DRS) 反亲和性规则,使其分布到数据中心内的至少三个物理主机上。

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

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

如果您没有启用 DRS,或者没有至少三个主机可供安排 vSphere 虚拟机,请将 usercluster.antiaffinitygroups.enabled: false 添加到您的配置文件中。例如:

usercluster:
  ...
  antiaffinitygroups:
    enabled: false

如需了解详情,请参阅 1.1.0-gke.6 版的版本说明

适用于运行超过三个节点的集群
如果 vSphere vMotion 将一个节点迁移到其他主机,则该节点的工作负载需要重启,然后才能重新分布到各个主机中。

usercluster.vcenter.network

usercluster.vcenter.network 中,您可以为您的用户集群节点指定 vCenter 网络。请注意,这会替换您在 vcenter 中提供的全局设置。例如:

usercluster:
  vcenter:
    network: MY-USER-CLUSTER-NETWORK

usercluster.ipblockfilepath

由于您使用的是静态 IP 地址,因此必须有一个主机配置文件,如配置静态 IP 地址中所述。在 usercluster.ipblockfilepath 字段中提供主机配置文件的路径。例如:

usercluster:
  ipblockfilepath: "/my-config-folder/my-user-hostconfig.yaml"

usercluster.manuallbspec(手动负载平衡模式)

用户集群中的 Ingress 控制器实现为 NodePort 类型的 Service。该 Service 有一个用于 HTTP 的 ServicePort 和一个用于 HTTPS 的 ServicePort。如果您使用的是手动负载平衡模式,则必须为这些 ServicePort 选择 nodePort 值。在 ingresshttpnodeportingresshttpsnodeport 中指定 nodePort 值。例如:

usercluster:
  manuallbspec:
    ingresshttpnodeport: 30243
    ingresshttpsnodeport: 30879

用户集群中的 Kubernetes API 服务器实现为 NodePort 类型的 Service。如果您使用的是手动负载平衡,则必须为该 Service 选择 nodePort 值。在 controlplanenodeport 中指定 nodePort 值。例如:

usercluster:
  ...
  manuallbspec:
    ...
    controlplanenodeport: 30562

usercluster.bigip.credentials(集成负载平衡模式)

如果您使用的是集成负载平衡模式,GKE On-Prem 需要知道要用于用户集群的 F5 BIG-IP 负载平衡器的 IP 地址或主机名、用户名和密码。设置 usercluster.bigip 下的值以提供此信息。例如:

usercluster:
  ...
  bigip:
    credentials:
      address: "203.0.113.5"
      username: "my-user-f5-name"
      password: "8%jfQATKO$#z"
  ...

usercluster.bigip.partition(集成负载平衡模式)

如果您使用的是集成负载平衡模式,则必须为用户集群创建 BIG-IP 分区。将 usercluster.bigip.partition 设置为分区的名称。例如:

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

usercluster.vips

无论您是为用户集群使用集成负载平衡还是手动负载平衡,都需要填写 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

usercluster.clustername

usercluster.clustername 的值设置为您选择的名称。请选择长度不超过 40 个字符的名称。例如:

usercluster:
  ...
  clustername: "my-user-cluster-1"

usercluster.masternode.replicas

usercluster.masternode.replicas 字段指定您希望用户集群具有的控制层面节点数。用户集群的控制层面节点运行用户控制层面,即 Kubernetes 控制层面组件。此值必须为 13

  • 将此字段设置为 1 以运行一个用户控制层面。
  • 如果您想拥有由三个控制层面节点(均运行用户控制层面)组成的高可用性 (HA) 用户控制层面,请将此字段设置为 3

usercluster.masternode.cpususercluster.masternode.memorymb

usercluster.masternode.cpususercluster.masternode.memorymb 字段指定为用户集群的每个控制层面节点分配的 CPU 数量和内存大小(以兆字节为单位)。例如:

usercluster:
  ...
  masternode:
    cpus: 4
    memorymb: 8192

usercluster.workernode.replicas

usercluster.workernode.replicas 字段指定您希望用户集群拥有的工作器节点数。工作器节点运行集群工作负载。

usercluster.workernode.cpususercluster.workernode.memorymb

usercluster.masternode.cpususercluster.masternode.memorymb 字段指定为用户集群的每个工作器节点分配的 CPU 数量和内存大小(以兆字节为单位)。例如:

usercluster:
  ...
  workernode:
    cpus: 4
    memorymb: 8192
    replicas: 3

usercluster.oidc

如果您希望用户集群的客户端使用 OIDC 身份验证,请为 usercluster.oidc 下的字段设置值。配置 OIDC 是可选操作。

如需了解如何配置 OIDC,请参阅使用 OIDC 进行身份验证

关于安装 1.0.2-gke.3 版

1.0.2-gke.3 版本引入了以下 OIDC 字段 (usercluster.oidc)。这些字段允许从 Google Cloud 控制台登录集群:

  • usercluster.oidc.kubectlredirecturl
  • usercluster.oidc.clientsecret
  • usercluster.oidc.usehttpproxy

在 1.0.2-gke.3 版中,如果要使用 OIDC,即使您不想从 Google Cloud 控制台登录集群,也必须填写 clientsecret 字段。在这种情况下,您可以为 clientsecret 提供一个占位值:

oidc:
clientsecret: "secret"

usercluster.sni

服务器名称指示 (SNI) 是传输层安全协议 (TLS) 的扩展,可让服务器在单个 IP 地址和 TCP 端口上提供多个证书,具体取决于客户端指定的主机名。

如果您的 CA 已作为受信任的 CA 分发到用户集群外部的客户端,并且您希望依赖此链来识别可信集群,则可以使用向负载平衡器的外部客户端提供的额外证书来配置 Kubernetes API 服务器 IP 地址。

如需将 SNI 用于您的用户集群,您需要拥有自己的 CA 和公钥基础架构 (PKI)。您可以为每个用户集群预配单独的服务证书,GKE On-Prem 会将每个额外的服务证书添加到其各自的用户集群。

如需为用户集群的 Kubernetes API 服务器配置 SNI,请提供 usercluster.sni.certpath(外部证书的路径)和 usercluster.sni.keypath(外部证书私钥文件的路径)的值。例如:

usercluster:
  ...
  sni:
    certpath: "/my-cert-folder/example.com.crt"
    keypath: "/my-cert-folder/example.com.key"

lbmode

您可以使用集成负载平衡或手动负载平衡。您选择的负载平衡模式将用于管理员集群和初始用户集群。它也将用于您未来创建的任何其他用户集群。

通过将 lbmode 的值设置为 IntegratedManual 来指定负载平衡选项。例如:

lbmode: Integrated

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-folder/register-key.json"
  agentserviceaccountkeypath: "/my-key-folder/connect-key.json"

stackdriver

stackdriver 规范包含 GKE On-Prem 在存储由本地集群生成的日志条目时所需的信息。

stackdriver.projectid 设置为 Google Cloud 项目的 ID,您可以在其中查看与本地集群有关的 Stackdriver 日志。

stackdriver.clusterlocation 设置为您要在其中存储 Stackdriver 日志的 Google Cloud 地区。建议选择一个靠近您的本地数据中心的区域。

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

stackdriver.serviceaccountkeypath 设置为 Stackdriver Logging 服务帐号的 JSON 密钥文件路径。

例如:

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

privateregistryconfig

如果您有私有 Docker 注册表,则 privateregistryconfig 字段包含 GKE On-Prem 用于将映像推送到该私有注册表的信息。如果您没有指定私有注册表,则 gkectl 会在安装期间从其 Container Registry 代码库 gcr.io/gke-on-prem-release 中拉取 GKE On-Prem 的容器映像。

privatedockerregistry.credentials 下,将 address 设置为运行您的私有 Docker 注册表的机器的 IP 地址。将 usernamepassword 设置为您的私有 Docker 注册表的用户名和密码。您为 address 设置的值会自动添加到 proxy.noproxy 中。

当 Docker 从您的私有注册表中拉取映像时,该注册表必须通过提供证书来证明其身份。注册表的证书由证书授权机构 (CA) 签名。Docker 使用 CA 的证书来验证该注册表的证书。

privateregistryconfig.cacertpath 设置为 CA 的证书路径。例如:

privateregistryconfig
  ...
  cacertpath: /my-cert-folder/registry-ca.crt

gcrkeypath

gcrkeypath 的值设置为您的 allowlistedservice 帐号的 JSON 密钥文件路径。

例如:

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

cloudauditlogging

如果要将 Kubernetes 审核日志发送到您的 Google Cloud 项目,请填充 cloudauditlogging 规范。例如:

cloudauditlogging:
  projectid: "my-project"
  # A GCP region where you would like to store audit logs for this cluster.
  clusterlocation: "us-west1"
  # The absolute or relative path to the key file for a GCP service account used to
  # send audit logs from the cluster
  serviceaccountkeypath: "/my-key-folder/audit-logging-key.json"

详细了解如何使用审核日志记录功能

验证配置文件

从管理员工作站完成此步骤。

修改配置文件后,请运行 gkectl check-config 验证文件是否有效并可用于安装:

gkectl check-config --config [PATH_TO_CONFIG] --fast

如果该命令返回任何 FAILURE 消息,请修复问题并再次验证文件。使用 --fast 标志可跳过创建测试虚拟机的检查,具体取决于通过 gkectl prepare 从管理员工作站上传到 vCenter 的节点操作系统映像。

跳过验证

以下 gkectl 命令会自动对配置文件运行验证:

  • gkectl prepare
  • gkectl create cluster
  • gkectl upgrade

如需跳过命令的验证,请传入 --skip-validation-all。例如,如需跳过对 gkectl prepare 的所有验证,请运行以下命令:

gkectl prepare --config [PATH_TO_CONFIG] --skip-validation-all

如需查看跳过特定验证的所有可用标志,请运行以下命令:

gkectl check-config --help

运行 gkectl prepare

在安装之前,您需要在管理员工作站上运行 gkectl prepare 以初始化您的 vSphere 环境。gkectl prepare 执行以下任务:

  • 将节点操作系统映像导入 vSphere,并将其标记为模板。

  • 如果您使用的是私有 Docker 注册表,会将 GKE On-Prem 映像推送到您的注册表。

  • 您可以选择验证容器映像的版本证明,从而验证这些映像是由 Google 构建和签名的,并已准备好部署。

使用 GKE On-Prem 配置文件运行 gkectl prepare,其中 --validate-attestations 是可选的:

gkectl prepare --config [CONFIG_FILE] --validate-attestations

--validate-attestations 的正输出为 Image [IMAGE_NAME] validated

再次验证配置文件

通过运行 gkectl prepare 上传节点操作系统映像后,运行不带 --fast 标志的 gkectl check-config,以执行创建测试虚拟机的额外检查。

gkectl check-config --config [PATH_TO_CONFIG]

如果该命令返回任何 FAILURE 消息,请修复问题并再次验证文件。

安装 GKE On-Prem

您已创建指定环境情况和集群预期情况的配置文件,并已验证该文件。您已运行 gkectl prepare 以使用 GKE On-Prem 软件初始化环境。现在,您可以开始全新安装 GKE On-Prem 了。

如需安装 GKE On-Prem,您需要创建管理员集群和用户集群。以下步骤会在同一过程中同时创建管理员集群和用户集群。如果要分别创建每个集群,请参阅分别创建管理员集群和用户集群了解详情。

如需创建管理员集群和用户集群,请执行以下操作:

  1. 通过运行 gkectl create cluster 命令创建管理员集群和用户集群。

    gkectl create cluster --config [CONFIG_FILE]

    其中 [CONFIG_FILE] 是您之前创建的配置文件。

    gkectl create cluster 命令会在当前目录中创建名为 [CLUSTER_NAME]-kubeconfigkubeconfig 文件,其中 [CLUSTER_NAME]您为 cluster 设置的名称。例如:MY-VSPHERE-CLUSTER-kubeconfig

    GKE On-Prem 文档使用以下占位符来引用这些 kubeconfig 文件:

    • 管理员集群:[ADMIN_CLUSTER_KUBECONFIG]
    • 用户集群:[USER_CLUSTER_KUBECONFIG]
  2. 验证集群是否已创建且可正常运行:

    1. 如需验证管理员集群,请运行以下命令:

      kubectl get nodes --kubeconfig [ADMIN_CLUSTER_KUBECONFIG]

      输出会显示管理员集群节点。

    2. 如需验证用户集群,请运行以下命令:

      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
      

了解如何重复使用配置文件来创建其他用户集群

继续安装

如果安装在管理员集群创建后中断,您可以按照以下步骤继续安装:

  1. 从配置文件中移除 admincluster 规范。
  2. 同时使用 --kubeconfig--skip-validation-all 标志运行 gkectl create cluster,以传入管理员集群的 kubeconfig 文件并跳过预检检查:

    gkectl create cluster \
    --config [CONFIG_FILE] \
    --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] \
    --skip-validation-all
    

    其中,[ADMIN_CLUSTER_NAME] 是管理员集群的 kubeconfig,它是在您启动安装时在工作目录中创建的。

将集群连接到 Google

  • 当您填充 gkeconnect 规范时,您的用户集群会自动注册到 Google Cloud 控制台。您可以在 Google Cloud 控制台的 Kubernetes 集群菜单中查看已注册的 GKE On-Prem 集群。然后,您可以登录集群以查看其工作负载。

  • 如果您在创建集群后一小时内未在 Google Cloud 控制台中看到该集群,请参阅排查连接问题

启用 Ingress

用户集群运行后,您必须通过创建网关对象来启用 Ingress。网关清单的第一部分始终如下所示:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: istio-autogenerated-k8s-ingress
  namespace: gke-system
spec:
  selector:
    istio: ingress-gke-system

您可以根据需要定制清单的其余部分。例如,此清单显示客户端可以使用 HTTP/2 协议和任何主机名在端口 80 上发送请求:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: istio-autogenerated-k8s-ingress
  namespace: gke-system
spec:
  selector:
    istio: ingress-gke-system
  servers:
  - port:
      number: 80
      protocol: HTTP2
      name: http
    hosts:
    - "*"

如果您希望接受 HTTPS 请求,则必须提供 Ingress 控制器可向客户端提供的一个或多个证书。

如需提供证书,请执行以下操作:

  1. 创建一个包含您的证书和密钥的 Secret。
  2. 创建一个网关对象,或修改引用您的 Secret 的现有网关对象。网关对象的名称必须是 istio-autogenerated-k8s-ingress

例如,假设您已创建证书文件 ingress-wildcard.crt 和密钥文件 ingress-wildcard.key

创建一个名为 ingressgateway-wildcard-certs 的 Secret:

kubectl create secret tls \
    --namespace gke-system \
    ingressgateway-wildcard-certs \
    --cert ./ingress-wildcard.crt \
    --key ./ingress-wildcard.key

以下是一个引用您的 Secret 的网关清单。客户端可以使用 HTTPS 协议和与 *.example.com 匹配的任何主机名在端口 443 上调用。请注意,证书中的主机名必须与清单中的主机名(在此示例中为 *.example.com)匹配:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: istio-autogenerated-k8s-ingress
  namespace: gke-system
spec:
  selector:
    istio: ingress-gke-system
  servers:
  - port:
      number: 80
      protocol: HTTP2
      name: http
    hosts:
    - "*"
  - hosts:
    - "*.example.com"
    port:
      name: https-demo-wildcard
      number: 443
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: ingressgateway-wildcard-certs

您可以通过修改网关清单为不同的主机创建多个 TLS 证书。

将清单保存到名为 my-gateway.yaml 的文件中,然后创建网关:

kubectl apply -f my-gateway.yaml

现在,您可以按标准方式使用 Kubernetes Ingress 对象。

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

从 GKE On-Prem 1.2 版开始,您可以分别创建管理员集群和用户集群。也就是说,您可以先创建一个管理员集群,然后根据需要创建一个或多个用户集群。

在 1.2 版之前:

  • 您的第一个用户集群始终使用管理员集群的数据存储区。随后创建的用户集群可以使用与管理员集群的数据存储区不同的数据存储区。

  • 如果您为一个用户集群指定了单独的数据存储区,则该用户集群工作器节点和工作器节点的 PersistentVolume (PV) 将使用这一单独的数据存储区。但是,用户控制层面虚拟机和关联的 PV 使用管理员集群的数据存储区。

从 1.2 版开始:

  • 任何用户集群(即使是第一个用户集群)都可以使用与管理员集群的数据存储区不同的数据存储区。

  • 如果您为一个用户集群指定了单独的数据存储区,则该用户集群工作器节点、用户集群工作器节点的 PV、用户控制层面虚拟机和用户控制层面虚拟机的 PV 都使用这一单独的数据存储区。

如需仅创建管理员集群,请从集群配置文件中移除整个 usercluster 部分。然后输入 gkectl create 命令:

gkectl create --config [ADMIN_CONFIG_FILE]

其中 [ADMIN_CONFIG_FILE] 是已移除 usercluster 部分的配置文件的路径。

接下来,创建一个移除整个 admincluster 部分的配置文件。在此文件中,您可以指定与管理员集群的数据存储区不同的 vSphere 数据存储区。如需指定数据存储区,请输入 vcenter.credentials.datastore 的值。例如:

vcenter:
  credentials:
    ...
  ...
  datastore: "my-user-cluster-datastore"

如需创建用户集群,请输入以下命令:

gkectl create --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] --config [USER_CLUSTER_CONFIG]

其中:

  • [ADMIN_CLUSTER_KUBECONFIG] 是您的管理员集群的 kubeconfig 文件。
  • [USER_CLUSTER_CONFIG] 是您的用户集群的配置文件。

GKE On-Prem 限制

限制 说明
集群和节点的上限和下限

请参阅配额和限制。您的环境性能可能会影响这些限制。

用户集群名称的唯一性

注册到同一 Google Cloud 项目的所有用户集群都必须具有唯一的名称。

不能部署到多个 vCenter 和/或 vSphere 数据中心

目前,您只能将一个管理员集群和一组关联的用户集群部署到单个 vCenter 和/或 vSphere 数据中心。您不能将同一管理员集群和用户集群部署到多个 vCenter 和/或 vSphere 数据中心。

创建集群后不能以声明方式更改集群配置 虽然您可以创建其他集群调整现有集群的大小,但无法通过配置文件更改现有集群。

问题排查

如需了解详情,请参阅问题排查

使用 gkectl 诊断集群问题

使用 gkectl diagnose 命令识别集群问题并与 Google 共享集群信息。请参阅诊断集群问题

以 verbose 模式运行 gkectl 命令

-v5

gkectl 错误记录到 stderr

--alsologtostderr

在管理员工作站中查找 gkectl 日志

即使未传入其调试标志,您也可以在以下管理员工作站目录中查看 gkectl 日志:

/home/ubuntu/.config/gke-on-prem/logs

在管理员集群中查找 Cluster API 日志

如果虚拟机在管理员控制层面启动后无法启动,您可以通过在管理员集群中检查 Cluster API 控制器的日志来尝试进行调试:

  1. kube-system 命名空间中找到 Cluster API 控制器 pod 的名称,其中 [ADMIN_CLUSTER_KUBECONFIG] 是管理员集群的 kubeconfig 文件的路径:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] -n kube-system get pods | grep clusterapi-controllers
  2. 打开 pod 的日志,其中 [POD_NAME] 是 pod 的名称。您可以选择使用 grep 或类似工具来搜索错误:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] -n kube-system logs [POD_NAME] vsphere-controller-manager

使用管理员集群控制层面节点的 kubeconfig 调试 F5 BIG-IP 问题

安装完成后,GKE On-Prem 会在管理员工作站的主目录中生成一个名为 internal-cluster-kubeconfig-debug 的 kubeconfig 文件。此 kubeconfig 文件与管理员集群的 kubeconfig 完全相同,只是它直接指向管理员集群的控制层面节点(该节点上运行着管理员控制层面)。您可以使用 internal-cluster-kubeconfig-debug 文件调试 F5 BIG-IP 问题。

gkectl check-config 验证失败:找不到 F5 BIG-IP 分区

表现

验证失败,因为找不到 F5 BIG-IP 分区(即使分区存在)。

潜在原因

F5 BIG-IP API 的问题可能会导致验证失败。

解决方法

尝试再次运行 gkectl check-config

gkectl prepare --validate-attestations 失败:无法验证版本证明

表现

如果使用可选的 --validate-attestations 标志运行 gkectl prepare,则系统会返回以下错误:

could not validate build attestation for gcr.io/gke-on-prem-release/.../...: VIOLATES_POLICY
潜在原因

受影响的映像可能没有证明。

解决方法

请按照创建管理员工作站中的说明,尝试重新下载并部署管理员工作站 OVA。如果问题仍然存在,请与 Google 联系以获取帮助。

使用引导集群的日志进行调试

在安装期间,GKE On-Prem 会创建临时引导集群。成功安装后,GKE On-Prem 会删除引导集群,留下您的管理员集群和用户集群。通常情况下,您无需与此集群进行交互。

如果在安装过程中出现问题,并且您确实向 gkectl create cluster 传递了 --cleanup-external-cluster=false,则使用引导集群的日志进行调试可能会有用。您可以找到 pod,然后获取其日志:

kubectl --kubeconfig /home/ubuntu/.kube/kind-config-gkectl get pods -n kube-system
kubectl --kubeconfig /home/ubuntu/.kube/kind-config-gkectl -n kube-system get logs [POD_NAME]

后续步骤