安装 GKE On-Prem

本页面介绍如何在 vSphere 中安装 GKE On-Prem。本页面上的说明介绍了如何创建一个管理员集群和一个用户集群。创建管理员集群和初始用户集群后,您可以创建其他用户集群

准备工作

  1. 按照系统要求中的说明设置您的本地环境。

  2. 完成使用入门中的步骤。

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

  4. 创建私有 Docker 注册表(如果您想使用该注册表)。

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

  6. 配置静态 IP 地址(如果您想使用静态 IP 地址)。

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

    ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
    
  8. 授权 gcloud 访问 Google Cloud:

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

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

    gcloud config set project [PROJECT_ID]
    

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

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

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

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

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

gcloud iam service-accounts list

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

gcloud iam service-accounts list
NAME                                    EMAIL
                                        access-service-account@my-gcp-project.iam.gserviceaccount.com
                                        register-service-account@my-gcp-project.iam.gserviceaccount.com
                                        connect-service-account@my-gcp-project.iam.gserviceaccount.com
                                        stackdriver-service-account@my-gcp-project.iam.gserviceaccount.com

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

访问服务帐号

gcloud iam service-accounts keys create access-key-file \
--iam-account [ACCESS_SERVICE_ACCOUNT_EMAIL]

其中,[ACCESS_SERVICE_ACCOUNT_EMAIL] 是访问服务帐号的电子邮件地址。

注册服务帐号

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

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

Connect 服务帐号

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

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

Cloud Monitoring 服务帐号

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

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

为 Google Cloud CLI 激活访问服务帐号

为 gcloud CLI 激活访问服务帐号会导致所有 gcloudgsutil 命令都以该服务帐号的身份运行。由于您的访问服务帐号已列入许可名单,可以访问 GKE On-Prem 二进制文件,因此激活 gcloud CLI 帐号可让您从 Cloud Storage 下载 GKE On-Prem 的二进制文件。

如需激活您的访问服务帐号,请运行以下命令。如果该帐号的密钥文件不在当前工作目录中,请务必提供该文件的路径:

gcloud auth activate-service-account --key-file=access-key.json

生成配置文件

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

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

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

修改配置文件

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

bundlepath

GKE On-Prem 软件包是一组 YAML 文件。总的来说,YAML 文件描述了特定版本的 GKE On-Prem 中的所有组件。

创建管理员工作站时,该工作站会随附软件包 (/var/lib/gke/bundles/gke-onprem-vsphere-[VERSION]-full.tgz)。

bundlepath 的值设置为软件包文件的路径。也就是说,将 bundlepath 设置为:

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

其中,[VERSION] 是要安装的 GKE On-Prem 版本。

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

gkeplatformversion

gkeplatformversion 字段包含您要安装的 GKE On-Prem 版本的 Kubernetes 版本。其格式如下:

[KUBERNETES_VERSION]-[GKE_PATCH]

Kubernetes 版本的一个例子是 1.12.7-gke.19。

在您运行 gkectl create-config 时,系统会为您填充此字段。

bundlepathgkeplatformversion 的版本控制方案不同。但是,给定的软件包版本具有相应的 GKE 平台版本。例如,如果软件包版本为 1.0.10,则 GKE 平台版本必须为 1.12.7-gke.19。

如需了解软件包版本与 GKE 平台版本之间的对应关系,请提取软件包文件并查看 YAML 文件。尤其要打开 gke-onprem-vsphere-[VERSION]-images.yaml 并查看 osImages 字段。您可以在操作系统映像文件的名称中查看 GKE 平台版本。例如,在以下操作系统映像中,您可以看到 GKE 平台版本为 1.12.7-gke.19。

osImages:
  admin: "gs://gke-on-prem-os-ubuntu-release/gke-on-prem-osimage-1.12.7-gke.19-20190516-905ef43658.ova"

vcenter

您可以使用此字段为 vCenter Server 声明全局设置。GKE On-Prem 需要知道 vCenter Server 实例的 IP 地址、用户名和密码。设置 vcenter 下的值以提供此信息。例如:

vcenter:
  credentials:
    address: "203.0.113.1"
    username: "my-name"
    password: "my-password"

GKE On-Prem 需要一些有关您的 vSphere 环境结构的信息。设置 vcenter 下的值以提供此信息。例如:

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

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

vcenter:
  ...
  datadisk: "my-disk.vmdk"

如果您希望 GKE On-Prem 将 VMDK 放在目录中,则必须提前手动创建目录。例如,您可以使用 govc 创建目录:

govc datastore.mkdir my-gke-on-prem-directory

然后,您可以在 vcenter.datadisk 字段中添加该目录:

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

当客户端(如 GKE On-Prem)将请求发送到 vCenter Server 时,服务器必须通过提供证书来向客户端证明其身份。该证书由证书授权机构 (CA) 进行签名。客户端使用 CA 的证书来验证服务器的证书。

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

vcenter:
  ...
  cacertpath: "/my-cert-directory/altostrat.crt"

如需了解如何下载 CA 的证书,请参阅如何下载和安装 vCenter Server 根证书

如果您的 vCenter 服务器使用的是自签名证书,您可以通过从管理员工作站使用 openssl 连接到 vCenter 来提取证书:

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

gcrkeypath

gcrkeypath 的值设置为访问服务帐号的 JSON 密钥文件路径。例如:

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

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 密钥文件路径。

如果您希望 Connect Agent 使用代理与 Google Cloud 通信,请将 gkeconnect.proxy 的值设置为代理的网址。请使用格式 http(s)://[PROXY_ADDRESS]

例如:

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

stackdriver

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

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

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

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

例如:

stackdriver:
  projectid: "my-project"
  clusterlocation: "us-west1"
  proxyconfigsecretname: ""
  enablevpc: false
  serviceaccountkeypath: "/my-key-directory/logging-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 注册表的用户名和密码。

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

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

例如:

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

admincluster

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

vCenter 网络 - 管理员集群

admincluster.vcenter.network 中,您可以为您的管理员集群选择不同的 vCenter 网络。请注意,这会覆盖您在 vcenter 中提供的全局设置。例如:

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

DHCP 或静态 IP 地址 - 管理员集群

决定是否要使用动态主机配置协议 (DHCP) 将 IP 地址分配给管理员集群节点。另一种方法是为您的集群节点使用静态 IP 地址。请注意,如果您选择使用手动负载平衡模式,则必须对集群节点使用静态 IP 地址。

如果您选择使用 DHCP,请将 admincluster.ipblockfilepath 字段注释掉。

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

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

集成式负载平衡 - 管理员集群

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

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

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

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

手动负载平衡 - 管理员集群

如果您使用的是手动负载平衡模式,则必须对集群节点使用静态 IP 地址。验证您是否已为 admincluster.ipblockfilepath 设置值。例如:

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

管理员集群中的 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

vips - 管理员集群

无论您是为管理员集群使用集成负载平衡还是手动负载平衡,都需要填写 admincluster.vips 字段。

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

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

serviceiprange 和 podiprange - 管理员集群

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

Service 和 pod 范围不得重叠。此外,您为管理员集群选择的 Service 和 Pod 范围不得与您为用户集群选择的 Service 和 Pod 范围重叠。

例如:

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

usercluster

usercluster 字段包含 GKE On-Prem 创建初始用户集群所需的信息。

vCenter 网络 - 管理员集群

admincluster.vcenter.network 中,您可以为您的用户集群选择不同的 vCenter 网络。请注意,这会覆盖您在 vcenter 中提供的全局设置。例如:

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

DHCP 或静态 IP 地址 - 用户集群

决定是否要使用 DHCP 将 IP 地址分配给您的用户集群节点。另一种方法是为您的集群节点使用静态 IP 地址。请注意,如果您选择了手动负载平衡模式,则必须对集群节点使用静态 IP 地址。

如果您选择使用 DHCP,请将 usercluster.ipblockfilepath 字段注释掉。

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

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

集成式负载平衡 - 用户集群

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

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

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

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

手动负载平衡 - 用户集群

如果您使用的是手动负载平衡模式,则必须对集群节点使用静态 IP 地址。验证您是否已为 usercluster.ipblockfilepath 设置值。例如:

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

用户集群中的 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

vips - 用户集群

无论您是为用户集群使用集成负载平衡还是手动负载平衡,都需要填写 usercluster.vips 字段。

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

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

serviceiprange 和 podiprange - 用户集群

用户集群必须拥有用于 Service 的 IP 地址范围以及用于 pod 的 IP 地址范围。这些范围由 usercluster.serviceiprangeusercluster.podiprange 字段指定。当您运行 gkectl create-config 时,系统会填充这些字段。您也可以将填充值更改为您选择的值。如需了解如何选择 Service 和 Pod IP 地址范围,请参阅优化 IP 地址分配

Service 和 pod 范围不得重叠。此外,您为用户集群选择的 Service 和 Pod 范围不得与您为管理员集群选择的 Service 和 Pod 范围重叠。

例如:

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

clustername

usercluster.clustername 的值设置为您选择的名称。例如:

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

masternode

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

  • 将此字段设置为 1 以运行一个用户控制层面。
  • 如果您希望拥有高可用性用户控制层面,请将此字段设置为 3。系统将创建三个用户控制层面。

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

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

oidc

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

1.0.2-gke.3 版中添加了以下必填字段。这些字段可让您从 Google Cloud 控制台登录集群:

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

如果您不想通过 Google Cloud 控制台登录集群,但想要使用 OIDC,则可以为这些字段传入占位值:

oidc:
  kubectlredirecturl: "redirect.invalid"
  clientsecret: "secret"
  usehttpproxy: "false"

如需了解详情,请参阅使用 OIDC 进行身份验证

sni

如果要为用户集群的 Kubernetes API 服务器提供其他服务证书,请提供 usercluster.sni.certpathusercluster.sni.keypath 的值。例如:

usercluster:
  ...
  sni:
    certpath: "/my-cert-directory/my-second-cert.crt"
    keypath: "/my-cert-directory/my-second-cert.key"

workernode

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

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

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

验证配置文件

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

gkectl check-config --config [PATH_TO_CONFIG]

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

跳过验证

以下 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

安装 GKE On-Prem

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

如需安装 GKE On-Prem,请运行以下命令:

gkectl create cluster --config [CONFIG_FILE]

其中,[CONFIG_FILE] 是您生成和修改的配置文件。

您可以重复使用配置文件来创建其他用户集群

将集群连接到 Google

  • 创建用户集群时,系统会自动向 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 对象。

问题排查

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

使用 gkectl 诊断集群问题

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

默认日志记录行为

对于 gkectlgkeadm,使用默认日志记录设置便已足够:

  • 默认情况下,日志条目的保存方式如下:

    • 对于 gkectl,默认日志文件为 /home/ubuntu/.config/gke-on-prem/logs/gkectl-$(date).log,该文件与运行 gkectl 的本地目录中的 logs/gkectl-$(date).log 文件进行符号链接。
    • 对于 gkeadm,默认日志文件是运行 gkeadm 的本地目录中的 logs/gkeadm-$(date).log
  • 所有日志条目都会保存在日志文件中,即使它们不输出到终端(当 --alsologtostderrfalse 时)也是如此。
  • -v5 详细程度(默认)涵盖支持团队所需的所有日志条目。
  • 日志文件还包含已执行的命令和失败消息。

我们建议您在需要帮助时将日志文件发送给支持团队。

为日志文件指定非默认位置

要为 gkectl 日志文件指定非默认位置,请使用 --log_file 标志。您指定的日志文件不会与本地目录进行符号链接。

要为 gkeadm 日志文件指定非默认位置,请使用 --log_file 标志。

在管理员集群中查找 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]

后续步骤