使用群集托管网络安装
此程序用于启动具有群集管理网络的群集。群集托管网络是指辅助安装程序在群集中为您安装集成负载均衡器和入口的部署。
图 1 显示了一个由 3 个控制平面节点和 2 个工作器节点组成的群集,这些群集在群集托管的网络设置中的裸机服务器或虚拟机上运行,其中负载平衡器(未显示)集成在群集中。辅助安装程序流量和 Kubernetes 控制平面流量使用 172.16.0.0/24 交换矩阵虚拟网络。Contrail 控制平面流量和用户数据平面流量使用 10.16.0.0/24 交换矩阵虚拟网络。

单独的计算机充当辅助安装程序客户端。在辅助安装程序客户端中,您可以使用 curl 命令向辅助安装程序服务发出 API 调用以创建群集。在此过程中的示例中,我们还使用辅助安装程序客户端计算机来托管子网的 DNS/DHCP 服务器。
在两个关系图中,本地管理员都连接到单独的网络。这在许多安装中很常见,其中本地管理员从企业 LAN 管理结构和群集。在下面的过程中,我们将本地管理员工作站称为本地计算机。
将所有节点连接在一起的是数据中心交换矩阵,在示例中显示为两个子网。在实际安装中,数据中心交换矩阵是一个脊叶式交换机网络,为群集提供物理连接。
在 Apstra 管理的数据中心中,您可以通过在底层交换矩阵交换机上创建的叠加虚拟网络指定此连接。
此过程使用 Red Hat 托管的辅助安装程序服务,并涵盖更常见的早期绑定用例,即在启动主机之前注册群集。
- 登录到辅助安装程序客户端计算机。辅助安装程序客户端计算机是向辅助安装程序服务发出辅助安装程序 API 调用的位置。
- 通过设置将在后续步骤中使用的环境变量来准备部署。
- 创建将用于访问群集中节点的 SSH 密钥。将密钥保存到环境变量。
root@ai-client:~# ssh-keygen
在此示例中,我们将 SSH 密钥存储在其默认位置 ~/. ssh/id_rsa.pub。export CLUSTER_SSHKEY=$(cat ~/.ssh/id_rsa.pub)
- 将映像提取密钥从您的红帽帐户下载到本地计算机上。拉取密钥允许您的安装访问为 OpenShift 组件提供容器映像的服务和注册表。
如果您使用的是红帽托管的辅助安装程序,则可以从下载页面下载拉取密钥文件(pull-secret)。将拉取密钥文件复制到辅助安装程序客户端计算机。在此示例中,我们将拉取密钥存储在名为 pull-secret.txt 的文件中。
去除任何空格,将内容转换为 JSON 字符串格式,并存储为环境变量,如下所示:
export PULL_SECRET=$(sed '/^[[:space:]]*$/d' pull-secret.txt | jq -R .)
- 从您的红帽帐户复制离线访问令牌。OpenShift 集群管理器 API 令牌允许您(在辅助安装程序客户端计算机上)与红帽托管的辅助安装程序 API 服务进行交互。
令牌是可以复制并粘贴到本地环境变量的字符串。如果您使用的是红帽托管的辅助安装程序,则可以从 下载 页面复制 API 令牌。
export OFFLINE_ACCESS_TOKEN='<paste offline access token here>'
- 从OFFLINE_ACCESS_TOKEN生成(刷新)令牌。每当发出 API 命令时,您都将使用此生成的令牌。
export TOKEN=$(curl --silent --data-urlencode "grant_type=refresh_token" --data-urlencode "client_id=cloud-services" --data-urlencode "refresh_token=${OFFLINE_ACCESS_TOKEN}" https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token | jq -r .access_token)
注意:此令牌定期过期。当此令牌过期时,每当发出 API 命令时,都会收到 HTTP 400 响应。令牌过期时刷新令牌,或者,在过期前定期刷新令牌。在令牌未过期时刷新令牌并没有什么坏处。
- 设置其余的环境变量。
表 1 列出了需要在此过程中设置的所有环境变量,包括前面步骤中描述的环境变量。
表 1:环境变量 变量 描述 示例 CLUSTER_SSHKEY 您生成的(公共)ssh 密钥。此密钥将安装在所有群集节点上。 – PULL_SECRET 已下载、剥离并转换为 JSON 字符串格式的映像拉取机密。 – OFFLINE_ACCESS_TOKEN 您复制的 OpenShift 集群管理器 API 令牌。 – 令 牌 从OFFLINE_ACCESS_TOKEN生成(刷新)的令牌。 – CLUSTER_NAME 要调用群集的名称。这是将显示在红帽混合云控制台用户界面中的名称。 注意:此名称必须为小写。
我的集群 CLUSTER_DOMAIN 要分配给群集的基本域。将在此域中为群集对象分配名称。 Contrail.lan CLUSTER_NET 叠加群集网络。Pod 在此网络上分配 IP 地址。 10.128.0.0/14 CLUSTER_SVC_NET 叠加服务网络。在此网络上为服务分配 IP 地址。 172.31.0.0/16 CLUSTER_HOST_PFX 用于从CLUSTER_NET分配 IP 地址的子网前缀长度。这将定义用于容器 IP 地址分配的 CLUSTER_NET IP 地址子集。 23 CLUSTER_MACHINE_NET 主机连接的计算机网络。这是用于 Kubernetes 控制平面流量的交换矩阵虚拟网络。 172.16.0.0/24 CLUSTER_API_VIP 要分配给 API 终结点的虚拟 IP 地址。这是内部负载均衡器将用于将 API 流量分发到后端节点的前端 IP 地址。
选择CLUSTER_MACHINE_NET中未使用的 IP 地址。
172.16.0.100 CLUSTER_INGRESS_VIP 要分配为入口的虚拟 IP 地址。这是内部负载均衡器将用于将应用程序流量分发到后端节点的前端 IP 地址。
选择CLUSTER_MACHINE_NET中未使用的 IP 地址。
172.16.0.101 AI_URL 辅助安装程序服务的 URL。此示例使用 Red Hat 托管的辅助安装程序。 https://api.openshift.com
- 创建将用于访问群集中节点的 SSH 密钥。将密钥保存到环境变量。
- 向辅助安装程序服务注册群集。通过注册,可以告知辅助安装程序服务要创建的群集的属性。作为响应,辅助安装程序服务创建一个群集资源,并返回唯一标识该群集资源的群集标识符。
- 创建描述要创建的群集的文件。在此示例中,我们将文件命名为 deployment.json。
cat << EOF > ./deployment.json { "kind": "Cluster", "name": "$CLUSTER_NAME", "openshift_version": "4.8", "ocp_release_image": "quay.io/openshift-release-dev/ocp-release:4.8.0-x86_64", "base_dns_domain": "$CLUSTER_DOMAIN", "hyperthreading": "all", "machine_networks": [{"cidr": "$CLUSTER_MACHINE_NET"}], "ingress_vip": "$CLUSTER_INGRESS_VIP", "cluster_network_cidr": "$CLUSTER_NET", "cluster_network_host_prefix": $CLUSTER_HOST_PFX, "service_network_cidr": "$CLUSTER_SVC_NET", "user_managed_networking": false, "vip_dhcp_allocation": false, "ssh_public_key": "$CLUSTER_SSHKEY", "pull_secret": $PULL_SECRET } EOF
- 注册群集并将CLUSTER_ID保存到环境变量。引用刚刚创建的deployment.json文件。
export CLUSTER_ID=$(curl -s -X POST "$AI_URL/api/assisted-install/v2/clusters" -d @./deployment.json --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" | jq -r '.id')
- 更新群集属性以指定您希望群集使用 Contrail 作为网络技术。
curl --header "Content-Type: application/json" --request PATCH --data '"{\"networking\":{\"networkType\":\"Contrail\"}}"' -H "Authorization: Bearer $TOKEN" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/install-config
- 查看更改。
curl -s -X GET --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/install-config | jq -r
注册集群后,您可以将浏览器指向红帽混合云控制台 ( https://console.redhat.com/openshift) 以观察安装进度。您可以按集群名称或集群 ID 搜索集群。 - 创建描述要创建的群集的文件。在此示例中,我们将文件命名为 deployment.json。
- 生成发现启动 ISO。您将使用此 ISO 引导群集中的节点。
ISO 会根据您将设置的基础架构环境针对您的基础架构进行自定义。
- 创建描述基础结构环境的文件。在此示例中,我们将其命名为 infra-envs.json。
cat << EOF > ./infra-envs.json { "name": "$CLUSTER_NAME", "ssh_authorized_key": "$CLUSTER_SSHKEY", "pull_secret": $PULL_SECRET, "image_type": "full-iso", "cluster_id": "$CLUSTER_ID", "openshift_version": "4.8", "cpu_architecture": "x86_64" } EOF
- 告知辅助安装程序服务基于指定的基础结构环境构建发现引导 ISO。引用刚刚创建的infra-envs.json文件。作为回报,辅助安装程序服务会分配您需要存储的 InfraEnv 标识符。
export INFRA_ENVS_ID=$(curl -s -X POST "$AI_URL/api/assisted-install/v2/infra-envs" -d @infra-envs.json --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" | jq -r '.id')
- 使用扩展 API 服务器的正确证书修补 ISO。
您可以通过应用点火文件来执行此操作。将以下内容复制到 infra-ignition.json 文件中。内容包含一个编码脚本,该脚本使用正确的证书配置扩展 API 服务器。
{"ignition_config_override": "{\"ignition\":{\"version\":\"3.1.0\"},\"systemd\":{\"units\":[{\"name\":\"ca-patch.service\",\"enabled\":true,\"contents\":\"[Service]\\nType=oneshot\\nExecStart=/usr/local/bin/ca-patch.sh\\n\\n[Install]\\nWantedBy=multi-user.target\"}]},\"storage\":{\"files\":[{\"path\":\"/usr/local/bin/ca-patch.sh\",\"mode\":720,\"contents\":{\"source\":\"data:text/plain;charset=utf-8;base64,IyEvYmluL2Jhc2gKc3VjY2Vzcz0wCnVudGlsIFsgJHN1Y2Nlc3MgLWd0IDEgXTsgZG8KICB0bXA9JChta3RlbXApCiAgY2F0IDw8RU9GPiR7dG1wfSB8fCB0cnVlCmRhdGE6CiAgcmVxdWVzdGhlYWRlci1jbGllbnQtY2EtZmlsZTogfAokKHdoaWxlIElGUz0gcmVhZCAtYSBsaW5lOyBkbyBlY2hvICIgICAgJGxpbmUiOyBkb25lIDwgPChjYXQgL2V0Yy9rdWJlcm5ldGVzL2Jvb3RzdHJhcC1zZWNyZXRzL2FnZ3JlZ2F0b3ItY2EuY3J0KSkKRU9GCiAgS1VCRUNPTkZJRz0vZXRjL2t1YmVybmV0ZXMvYm9vdHN0cmFwLXNlY3JldHMva3ViZWNvbmZpZyBrdWJlY3RsIC1uIGt1YmUtc3lzdGVtIHBhdGNoIGNvbmZpZ21hcCBleHRlbnNpb24tYXBpc2VydmVyLWF1dGhlbnRpY2F0aW9uIC0tcGF0Y2gtZmlsZSAke3RtcH0KICBpZiBbWyAkPyAtZXEgMCBdXTsgdGhlbgoJcm0gJHt0bXB9CglzdWNjZXNzPTIKICBmaQogIHJtICR7dG1wfQogIHNsZWVwIDYwCmRvbmUK\"}}]},\"kernelArguments\":{\"shouldExist\":[\"ipv6.disable=1\"]}}"}
应用刚刚创建的点火文件。curl -s -X PATCH $AI_URL/api/assisted-install/v2/infra-envs/$INFRA_ENVS_ID -d @infra-ignition.json --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" | jq -r '.id'
- 下载 ISO。在此示例中,我们将其称为 ai-liveiso-$CLUSTER_ID.iso,并引用名称中的集群标识符。
export IMAGE_URL=$(curl -H "Authorization: Bearer $TOKEN" -L "$AI_URL/api/assisted-install/v2/infra-envs/$INFRA_ENVS_ID/downloads/image-url" | jq -r '.url') curl -H "Authorization: Bearer $TOKEN" -L "$IMAGE_URL" -o /var/lib/libvirt/images/ai-liveiso-$CLUSTER_ID.iso
- 创建描述基础结构环境的文件。在此示例中,我们将其命名为 infra-envs.json。
- 使用发现引导 ISO 引导 3 个控制平面节点。
- 选择最适合您的基础架构的引导方法。确保计算机启动时连接到有权访问红帽托管的辅助安装程序服务的网络。
- 检查群集状态:
curl -s -X GET --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -H "get_unregistered_clusters: false" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID?with_hosts=true | jq -r '.status'
当节点成功启动时,状态应指示 就绪 。 - 检查验证状态:
curl -s -X GET --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -H "get_unregistered_clusters: false" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID?with_hosts=true | jq -r '.validations_info' | jq .
验证状态显示是否已正确定义群集。输出中不应有错误。 - 检查主机:
curl -s -X GET --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -H "get_unregistered_clusters: false" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID?with_hosts=true | jq -r '.hosts'
输出显示已启动的所有节点的详细信息。您可以筛选特定信息,例如主机 ID:curl -s -X GET --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -H "get_unregistered_clusters: false" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID?with_hosts=true | jq -r '.hosts[].id'
和主持人角色:curl -s -X GET --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -H "get_unregistered_clusters: false" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID?with_hosts=true | jq -r '.hosts[].role'
- 确认已分配角色。
在浏览器上,转到红帽混合云控制台 (https://console.redhat.com/openshift),然后单击您的集群以查看集群的详细信息。您可以按群集名称或群集 ID 搜索群集。
仅当节点(主机)启动且角色已成功分配为控制平面节点时,才继续执行下一步。由于我们只启动了 3 个控制平面节点,因此你将看到在 UI 中分配的角色为 控制平面、辅助角色。
- 设置 API 流量的虚拟 IP 地址。
curl -X PATCH "$AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID" -H "accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -d "{ \"api_vip\": \"$CLUSTER_API_VIP\"}"
- 重复步骤 5 以启动工作器节点。
查询主机角色时,你将看到工作器节点处于 自动分配 状态。这是意料之中的。稍后安装群集时,辅助安装程序服务会为这些节点分配角色。
- 将 Contrail 清单(在安装之前下载)上载到辅助安装程序服务。请务必包含特定于群集托管网络的其他清单。
为方便起见,您可以使用以下 bash 脚本。该脚本假定你已将清单放在 清单 目录中。如果使用此脚本,请确保:
- 将要使用的所有清单放在此目录中,包括要从子目录中使用的所有清单
- 不要在此目录中放置任何其他 YAML 文件
该脚本循环遍历清单目录中的所有 *.yaml 文件,以 base64 对其进行编码,并将其应用于群集。
#!/bin/bash MANIFESTS=(manifests/*.yaml) total=${#MANIFESTS[@]} i=0 for file in "${MANIFESTS[@]}"; do i=$(( i + 1 )) eval "CONTRAIL_B64_MANIFEST=$(cat $file | base64 -w0)"; eval "BASEFILE=$(basename $file)"; eval "echo '{\"file_name\":\"$BASEFILE\", \"folder\":\"manifests\", \"content\":\"$CONTRAIL_B64_MANIFEST\"}' > $file.b64"; printf "\nProcessing file: $file\n" curl -s -X POST "$AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/manifests" -d @$file.b64 --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" done echo echo echo "Total Manifests: $total" echo echo "Manifest List:" curl -s -X GET "$AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/manifests" --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" | jq -r
- 开始安装群集。
curl -X POST "$AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/actions/install" -H "accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" | jq
辅助安装程序服务基于您定义的群集资源创建群集。首先,辅助安装程序将其中一个控制平面节点分配为引导节点,进而准备其他节点。您将看到非引导程序节点逐个重新启动到群集中,非引导控制平面节点首先重新启动,然后是工作节点,最后是引导节点。
安装可能需要一个小时或更长时间。您可以在红帽混合云控制台 (https://console.redhat.com/openshift) 上查看安装进度。
如果红帽混合云控制台显示安装停止,请使用用户名 core 登录每个节点,并确保主机可以解析域名,尤其是您在 DNS/DHCP 服务器中配置的域名,以及红帽辅助安装程序服务和瞻博网络存储库域名。最常见的安装问题可以追溯到网络配置错误,例如不正确的 DNS 配置。此外,在某些环境中,节点可能会关闭而不是重新启动。在这种情况下,请手动启动已关闭的节点。
- 下载集群的 kubeconfig。
- 将 kubeconfig 下载到本地 kubeconfig 文件。
curl -s -X GET "$AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/downloads/credentials?file_name=kubeconfig" -H "accept: application/octet-stream" -H "Authorization: Bearer $TOKEN" > kubeconfig
- 将 kubeconfig 复制到 ~/.kube/config。kubeconfig 必须位于默认的 ~/.kube/config 位置,因为contrailstatus您稍后将使用的命令期望 kubeconfig 位于其默认位置。
- 将 kubeconfig 下载到本地 kubeconfig 文件。
- 验证安装。
- 检查所有容器的状态。确认所有容器都处于“正在运行”或“已完成”状态。
kubectl get -pods -A -o wide
- 对于那些未处于“正在运行”或“已完成”状态的 Pod,请使用 kubectl 描述命令进一步调查。
kubectl describe pod <pod name> -n <namespace>
一个常见问题是无法下载映像。如果是这种情况:
- 检查您的网络是否可以访问瞻博网络存储库
- 检查故障 Pod 所在的节点是否配置为访问 DNS 服务器
- 检查故障 Pod 所在的节点是否可以按主机名 ping 存储库
- 检查所有容器的状态。确认所有容器都处于“正在运行”或“已完成”状态。
- (可选)登录到 OpenShift Web 控制台以监控您的集群。
Web 控制台 URL 的格式为:https://console-openshift-console.apps.. .<cluster-name><cluster-domain>
- 确保要访问 Web 控制台的浏览器位于有权访问 Web 控制台 URL 的计算机上。您可能需要将该控制台的主机名条目添加到该计算机上的 /etc/hosts 文件中。回想一下,此映射是您在安装之前在 DNS 服务器中配置的 *.apps.mycluster.contrail.lan 映射。
- 下载 kubeadmin 密码。
curl -s -X GET "$AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/downloads/credentials?file_name=kubeadmin-password" -H "accept: application/octet-stream" -H "Authorization: Bearer $TOKEN"
- 使用用户名 kubeadmin 和下载的密码登录 OpenShift Web 控制台。