本页面介绍如何将 GKE On-Prem 安装到使用静态 IP 地址的 VMware vSphere 6.5 环境。您也可以使用 DHCP 服务器进行安装。
概览
本页面上的说明介绍了如何创建管理员集群和一个具有三个节点的用户集群。
创建集群后,您可以创建其他用户集群并在用户集群中添加或移除节点。
准备工作
按照系统要求中的说明设置您的本地环境。
完成准备安装中的步骤。
在 vSphere 中创建管理员工作站。
如果您想使用手动负载平衡,请了解如何启用手动负载平衡。
通过 SSH 连接到管理员工作站:
ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
如果您使用代理,则需要为代理配置 Google Cloud CLI,以便运行
gcloud
和gsutil
命令。如需查看相关说明,请参阅配置 gcloud CLI 以在代理/防火墙后使用。使用您的帐号凭据登录 Google Cloud:
gcloud auth login
将
gcloud
注册为 Docker 凭据帮助程序。(详细了解此命令):gcloud auth configure-docker
设置默认项目。设置默认 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 注册表。
在安装之前,您需要配置注册表。在安装过程中,您需要在 GKE On-Prem 配置文件中填充有关该注册表的信息。
配置要安装的私有 Docker 注册表(可选)
本部分介绍如何配置现有 Docker 注册表以便安装 GKE On-Prem。如需了解如何创建 Docker 注册表,请参阅运行可外部访问的注册表。配置该注册表后,请填充 GKE On-Prem 配置文件的 privateregistryconfig
字段。
如果要使用私有 Docker 注册表进行安装,则管理员工作站虚拟机必须信任签署证书的 CA。GKE On-Prem 不支持不安全的 Docker 注册表。启动 Docker 注册表时,您必须提供证书和密钥。证书可由公共证书授权机构 (CA) 签名,也可以自签名。
如需建立这种信任,请从您的管理员工作站虚拟机执行以下步骤:
创建用于存放证书的文件夹:
sudo mkdir -p /etc/docker/certs.d/[REGISTRY_SERVER]
其中,[REGISTRY_SERVER] 是运行您的 Docker 注册表的虚拟机的 IP 地址或主机名。
将您的证书文件复制到
/etc/docker/certs.d/[REGISTRY_SERVER]/ca.crt
。即使文件最初具有不同的名称,您也必须将其命名为ca.crt
。重启 Docker 服务:
sudo service docker restart
验证您是否可以登录 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 地址
在安装期间,您将生成 GKE On-Prem 配置文件。您生成的配置文件包含两个 ipblockfilepath
字段:
admincluster.ipblockfilepath
usercluster.ipblockfilepath
。
ipblockfilepath
接受包含主机配置(或 hostconfig
)文件的 YAML 文件的路径(如下所述)。
如果要使用静态 IP 地址,您需要在管理员工作站中创建两个 YAML 文件:一个包含由管理员集群使用的 hostconfig
,另一个由用户集群使用。
在管理员集群 IP 地址配置中,您至少需要 N + 4 个 IP 地址/主机名对,其中 N 是您计划创建的用户集群数量。
您可以选择创建高可用性用户集群。一个 HA 用户集群使用三个用户控制层面。每个运行用户控制层面的虚拟机都需要自己的静态 IP 地址。由于用户控制层面由管理员集群管理,因此这些值应在管理员集群的 hostconfig
文件中提供。
示例
以下是带有三个主机的 hostconfig
文件的示例。您的文件可能看起来有所不同,具体取决于您的环境。例如,您可以使用更多 ip
/hostname
对来扩展 ips
数组:
hostconfig: dns: 172.16.255.1 tod: 192.138.210.214 otherdns: - 8.8.8.8 - 8.8.4.4 othertod: - ntp.ubuntu.com blocks: - netmask: 255.255.252.0 gateway: 110.116.232.1 ips: - ip: 10.116.232.23 hostname: host1.enterprise.net # will be trimmed to host1 - ip: 10.116.232.65 hostname: host2.enterprise.net # will be trimmed to host2 - ip: 10.116.232.66 hostname: host3.enterprise.net # will be trimmed to host3
YAML 文件包含两个部分:hostconfig
和 blocks
。
hostconfig
hostconfig
包含静态应用到所有集群节点的网络参数。hostconfig
配置以下值:
dns
:用于节点的 DNS 服务器的 IP 地址。tod
:用于节点的时间服务器的 IP 地址。otherdns
:用于节点的备用 DNS 服务器。othertod
:用于节点的备用时间服务器。
blocks
blocks
包含静态 IP 地址块的数组。目前,GKE On-Prem 仅考虑使用第一个地址块来分配 IP 地址。每个地址块代表一个网络及其中的 IP 地址。
netmask
和 gateway
netmask
和 gateway
表示用于节点的网络掩码和默认网关。
blocks: - netmask: 255.255.252.0 gateway: 110.116.232.1
ips
ips
数组会列出您分配的 IP 地址。数组中的每个对象都包含一个 IPv4 地址及其主机名:
blocks: ... ips: - ip: [IPV4_ADDRESS] hostname: [HOSTNAME] - ip: [IPV4_ADDRESS] hostname: [HOSTNAME] - ip: [IPV4_ADDRESS] hostname: [HOSTNAME] ...
GKE On-Prem 会跟踪此地址块中可用和分配的 IP 地址,并为集群中的每个节点分配一个可用的 IP 地址。请确保数组中的 IP 地址数量确实大于集群中的节点数,并且每个 IP 地址对于环境的网络而言都是唯一的。
hostname
解释为没有域名的本地主机名。如果您指定了完全限定的域名 (FQDN),则该域名会被删除。例如,host1.enterprise.net
变为 host1
。hostname
值必须小写。
创建 hostconfig
文件
以下示例为具有三个节点的用户集群的 hostconfig
文件:
将以下模板复制到 YAML 文件:
hostconfig: dns: tod: blocks: - netmask: gateway: ips: - ip: hostname: - ip: hostname: - ip: hostname:
使用不同的名称(例如
admin-cluster-hostconfig.yaml
和user-cluster-hostconfig.yaml
)保存文件。在安装过程中,请使用适当的文件修改配置文件的
admincluster.ipblockfilepath
和usercluster.ipblockfilepath
字段。
在管理员工作站中创建服务帐号的私钥
在准备安装中,您创建了四个服务帐号。现在,您需要为每个服务帐号创建一个 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.json \ --iam-account [ACCESS_SERVICE_ACCOUNT_EMAIL]
其中,[ACCESS_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 服务帐号的电子邮件地址。
为 Google Cloud CLI 激活访问服务帐号
为 gcloud CLI 激活访问服务帐号会导致所有 gcloud
和 gsutil
命令都以该服务帐号的身份运行。由于您的访问服务帐号已列入许可名单,可以访问 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 软件包文件包含特定 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.1.2-gke.0。
请注意,您可以将软件包文件保存在其他位置,也可以为其指定其他名称。您只需确保配置文件中 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
下设置 username
和 password
值。例如:
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 my-gke-on-prem-folder
目前,已知问题要求您向
vcenter.datadisk
提供文件夹的通用唯一标识符 (UUID) 路径,而不是文件路径。如需查找文件夹的 UUID,请打开 vCenter 客户端,选择您的数据存储区,然后选择文件夹。复制文件夹的 UUID。您还可以运行以下命令,其中 [ADMIN_CONTROL_PLANE_VM] 是运行管理员控制层面的 vSphere 虚拟机:govc vm.info -json ./vm/[ADMIN_CONTROL_PLANE_VM] | jq '.VirtualMachines[0].Config.Hardware.Device[] | select(.Backing | has("FileName")) | .Backing.FileName'
然后,在
vcenter.datadisk
字段中提供该文件夹的 UUID。例如:vcenter: ... datadisk: "14159b5d-4265-a2ba-386b-246e9690c588/my-disk.vmdk"
vcenter.cacertpath
当客户端(如 GKE On-Prem)将请求发送到 vCenter Server 时,服务器必须通过提供证书来向客户端证明其身份。该证书由证书授权机构 (CA) 进行签名。客户端使用 CA 的证书来验证服务器的证书。
将 vcenter.cacertpath
设置为 CA 的证书路径。例如:
vcenter: ... cacertpath: "/my-cert-folder/altostrat.crt"
无论您的 vCenter 服务器使用的是自签名证书还是由公共 CA 签名的证书,您都可以在管理员工作站上运行以下命令来获取 CA 证书:
true | openssl s_client -connect [VCENTER_IP]:443 -showcerts 2>/dev/null | sed -ne '/-BEGIN/,/-END/p' > vcenter.pem
其中,[VCENTER_IP] 是 vCenter 服务器的 IP 地址。
代理规范
如果您的网络位于代理服务器后面,请用 HTTPS 代理以及要从代理中排除的地址填充 proxy
字段。例如:
proxy: url: "https://password:username@domain" noproxy: "100.151.222.0/24,corp.domain,100.151.2.1"
proxy.url
是 HTTPS 代理的网址。proxy.noproxy
包括不应使用代理的 CIDR、网域和 IP 地址。如果您使用的是私有 Docker 注册表,则这通常包括 vSphere 子网和私有注册表地址。
管理员集群规范
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
值。在 ingresshttpnodeport
和 ingresshttpsnodeport
中指定 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.serviceiprange
和 admincluster.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 反亲和性规则(可选)
从 1.1.0-gke.6 版开始,GKE On-Prem 会自动为您的用户集群节点创建 VMware 分布式资源调度器 (DRS) 反亲和性规则,使其分布到数据中心内的至少三个物理主机上。从 1.1.0-gke.6 版开始,此功能会自动为新集群和现有集群启用。
为了使用此功能,您的 vSphere 环境必须满足以下条件:
- VMware DRS 已启用。VMware DRS 需要 vSphere Enterprise Plus 许可版本。如需了解如何启用 DRS,请参阅在集群中启用 VMware DRS。
- 在
vcenter
字段中提供的 vSphere 用户帐号拥有Host.Inventory.EditCluster
权限。 - 至少有三个物理主机可用。
如果您没有启用 DRS,或者没有至少三个主机可供安排 vSphere 虚拟机,请将 usercluster.antiaffinitygroups.enabled: false
添加到您的配置文件中。例如:
usercluster: ... antiaffinitygroups: enabled: false
- 适用于运行超过三个节点的集群
- 如果 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
值。在 ingresshttpnodeport
和 ingresshttpsnodeport
中指定 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.serviceiprange
和 usercluster.podiprange
用户集群必须拥有用于 Service 的 IP 地址范围以及用于 pod 的 IP 地址范围。这些范围由 usercluster.serviceiprange
和 usercluster.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 控制层面组件。此值必须为 1
或 3
:
- 将此字段设置为
1
以运行一个用户控制层面。 - 如果您想拥有由三个控制层面节点(均运行用户控制层面)组成的高可用性 (HA) 用户控制层面,请将此字段设置为
3
。
usercluster.masternode.cpus
和 usercluster.masternode.memorymb
usercluster.masternode.cpus
和 usercluster.masternode.memorymb
字段指定为用户集群的每个控制层面节点分配的 CPU 数量和内存大小(以兆字节为单位)。例如:
usercluster: ... masternode: cpus: 4 memorymb: 8192
usercluster.workernode.replicas
usercluster.workernode.replicas
字段指定您希望用户集群拥有的工作器节点数。工作器节点运行集群工作负载。
usercluster.workernode.cpus
和 usercluster.workernode.memorymb
usercluster.masternode.cpus
和 usercluster.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
的值设置为 Integrated
或 Manual
来指定负载平衡选项。例如:
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-folder/register-key.json" agentserviceaccountkeypath: "/my-key-folder/connect-key.json" proxy: https://203.0.113.20
stackdriver
stackdriver
规范包含 GKE On-Prem 在存储由本地集群生成的日志条目时所需的信息。
将 stackdriver.projectid
设置为您要在其中查看与本地集群有关的 Stackdriver 日志的 Google Cloud 项目的 ID。
将 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 地址。将 username
和 password
设置为您的私有 Docker 注册表的用户名和密码。
当 Docker 从您的私有注册表中拉取映像时,该注册表必须通过提供证书来证明其身份。注册表的证书由证书授权机构 (CA) 签名。Docker 使用 CA 的证书来验证该注册表的证书。
将 privateregistryconfig.cacertpath
设置为 CA 的证书路径。例如:
privateregistryconfig ... cacertpath: /my-cert-folder/registry-ca.crt
gcrkeypath
将 gcrkeypath
的值设置为访问服务帐号的 JSON 密钥文件路径。例如:
gcrkeypath: "/my-key-folder/access-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]
如果该命令返回任何 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] 是您生成和修改的配置文件。
您可以重复使用配置文件来创建其他用户集群。
恢复安装
如果在创建管理员集群后安装中断,您可以通过以下方式恢复安装:
- 从配置文件中移除
admincluster
规范。 - 再次运行
gkectl create cluster
,传入管理员集群的 kubeconfig 文件。
gkectl create cluster --config [CONFIG_FILE] \ --kubeconfig [ADMIN_CLUSTER_KUBECONFIG]
其中,[ADMIN_CLUSTER_NAME] 是管理员集群的 kubeconfig,它是在您启动安装时在工作目录中创建的。
已知问题
目前,如果您要创建 HA 用户集群,则无法恢复安装。此问题将在未来的版本中得到解决。
将集群连接到 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 控制器可向客户端提供的一个或多个证书。
如需提供证书,请执行以下操作:
- 创建一个包含您的证书和密钥的 Secret。
- 创建一个网关对象,或修改引用您的 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 限制
限制 | 说明 |
---|---|
集群和节点的上限和下限 | 请参阅配额和限制。您的环境性能可能会影响这些限制。 |
用户集群名称的唯一性 | 注册到同一 Google Cloud 项目的所有用户集群都必须具有唯一的名称。 |
不能部署到多个 vCenter 和/或 vSphere 数据中心 | 目前,您只能将一个管理员集群和一组关联的用户集群部署到单个 vCenter 和/或 vSphere 数据中心。您不能将同一管理员集群和用户集群部署到多个 vCenter 和/或 vSphere 数据中心。 |
创建集群后不能以声明方式更改集群配置 | 虽然您可以创建其他集群和调整现有集群的大小,但无法通过配置文件更改现有集群。 |
问题排查
如需了解详情,请参阅问题排查。
使用 gkectl
诊断集群问题
使用 gkectl diagnose
命令识别集群问题并与 Google 共享集群信息。请参阅诊断集群问题。
默认日志记录行为
对于 gkectl
和 gkeadm
,使用默认日志记录设置便已足够:
-
默认情况下,日志条目的保存方式如下:
- 对于
gkectl
,默认日志文件为/home/ubuntu/.config/gke-on-prem/logs/gkectl-$(date).log
,该文件与运行gkectl
的本地目录中的logs/gkectl-$(date).log
文件进行符号链接。 - 对于
gkeadm
,默认日志文件是运行gkeadm
的本地目录中的logs/gkeadm-$(date).log
。
- 对于
- 所有日志条目都会保存在日志文件中,即使它们不输出到终端(当
--alsologtostderr
为false
时)也是如此。 -v5
详细程度(默认)涵盖支持团队所需的所有日志条目。- 日志文件还包含已执行的命令和失败消息。
我们建议您在需要帮助时将日志文件发送给支持团队。
为日志文件指定非默认位置
要为 gkectl
日志文件指定非默认位置,请使用 --log_file
标志。您指定的日志文件不会与本地目录进行符号链接。
要为 gkeadm
日志文件指定非默认位置,请使用 --log_file
标志。
在管理员集群中查找 Cluster API 日志
如果虚拟机在管理员控制层面启动后无法启动,您可以通过在管理员集群中检查 Cluster API 控制器的日志来尝试进行调试:
在
kube-system
命名空间中找到 Cluster API 控制器 pod 的名称,其中 [ADMIN_CLUSTER_KUBECONFIG] 是管理员集群的 kubeconfig 文件的路径:kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] -n kube-system get pods | grep clusterapi-controllers
打开 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]