本页面介绍如何使用静态 IP 地址将 GKE On-Prem 安装到 VMware vSphere 6.5 或 6.7 Update 3 环境。您也可以使用 DHCP 服务器进行安装。
概览
本页面上的说明展示了如何创建一个管理员集群和一个用户集群,后者有三个节点。创建集群后,您可以创建其他用户集群并在用户集群中添加或移除节点。
准备工作
按照以下主题中所述设置您的环境:
在 vSphere 中创建管理员工作站。
如果您想使用手动负载平衡,请了解如何启用手动负载平衡。
通过 SSH 连接到管理员工作站:
ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
如果您使用代理,则需要为代理配置 Google Cloud CLI,以便运行
gcloud
和gsutil
命令。如需查看相关说明,请参阅配置 gcloud CLI 以在代理/防火墙后使用。使用您的 Google Cloud 用户帐号凭据登录 Google Cloud。该用户帐号必须至少具有 Viewer IAM 角色:
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 地址
如果您要使用静态 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: 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.61 hostname: admin-host1 - ip: 10.116.232.62 hostname: admin-host2 - ip: 10.116.232.63 hostname: admin-host3 - ip: 10.116.232.64 hostname: admin-host4 - ip: 10.116.232.65 hostname: admin-host5 - ip: 10.116.232.66 hostname: admin-host6 - ip: 10.116.232.67 hostname: admin-host7
如上例所示,主机配置文件包含 YAML 数据结构。
ips
字段是 IP 地址和主机名的数组。它们是 GKE On-Prem 将分配给管理员集群节点的 IP 地址和主机名。
在主机配置文件中,您还可以指定管理员集群节点将使用的 DNS 服务器、时间服务器和默认网关的地址。
用户集群的静态 IP 地址
在一个用户集群中,每个节点都需要一个 IP 地址,此外,集群还需要一个额外的 IP 地址用于用户集群升级期间的临时节点。
例如,假设您打算创建一个包含五个节点的用户集群。则您需要为该用户集群预留六个 IP 地址。下面是一个用户主机配置文件的示例,其中指定了六个 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 blocks: - netmask: 255.255.252.0 gateway: 110.116.232.1 ips: - ip: 10.116.232.71 hostname: user-host1 - ip: 10.116.232.72 hostname: user-host2 - ip: 10.116.232.73 hostname: user-host3 - ip: 10.116.232.74 hostname: user-host4 - ip: 10.116.232.75 hosthame: user-host5 - ip: 10.116.232.76 hostname: user-host6
每个 hostname
都会被解析为不包括其域名的本地主机名。如果您指定了完全限定的域名,系统会对域名进行删减。例如,host1.enterprise.net
变为 host1
。hostname
字段的值必须为小写字母。
在管理员工作站中创建服务帐号的私钥
在准备安装中,您创建了四个服务帐号。现在,您需要为每个服务帐号创建一个 JSON 私钥文件。您将在安装过程中提供这些密钥。
列出服务帐号的电子邮件地址
首先,列出您的 Google Cloud 项目中的服务帐号:
gcloud iam service-accounts list
对于名为 my-gcp-project
的 Google Cloud 项目,此命令的输出如下所示:
gcloud iam service-accounts list ... 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 服务帐号的电子邮件地址。
生成配置文件
如需开始安装,请运行 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.2.2-gke.2。
请注意,您可以将软件包文件保存在其他位置,也可以为其指定其他名称。您只需确保配置文件中 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 -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"
proxy.url
是 HTTPS 代理的网址。proxy.noproxy
包括不应代理的 CIDR 范围、IP 地址、网域和主机名。例如,不应代理对集群节点 IP 地址的调用。因此,如果您的子网仅包含集群节点,则可以在noproxy
字段中列出该子网的 CIDR 范围。如果您用于私有 Docker 注册表,则不应代理对该私有注册表的调用。因此,您需要在noproxy
字段中列出该私有 Docker 注册表的地址。
管理员集群规范
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 密钥文件路径。
例如:
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 地址。将 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] --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,请运行以下命令:
gkectl create cluster --config [CONFIG_FILE]
其中,[CONFIG_FILE] 是您生成和修改的配置文件。
您可以重复使用配置文件来创建其他用户集群。
继续安装
如果安装在管理员集群创建后中断,您可以按照以下步骤继续安装:
- 从配置文件中移除
admincluster
规范。 同时使用
--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 控制器可向客户端提供的一个或多个证书。
如需提供证书,请执行以下操作:
- 创建一个包含您的证书和密钥的 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 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 共享集群信息。请参阅诊断集群问题。
默认日志记录行为
对于 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]