使用用户托管网络进行安装
使用此过程启动具有用户托管网络的群集。用户托管网络是指您为安装显式提供外部负载平衡器的部署。
图 1 显示了用户托管的网络设置(包括外部负载平衡器)中,由 3 个控制平面节点和 2 个工作节点运行的群集。群集中的节点之间以及节点与外部站点之间的所有通信均通过单个 172.16.0.0/24 交换矩阵虚拟网络进行。
另一台机器充当辅助安装客户端。您可以在辅助安装器客户端中使用 curl 命令对辅助安装服务发出 API 调用来创建群集。在此过程中的示例中,我们还使用辅助安装客户端计算机为子网托管 DNS/DHCP 服务器。
将显示本地管理员连接到可通过网关访问的单独网络。这是许多安装的典型情况,本地管理员通过企业 LAN 管理交换矩阵和群集。在随后的过程中,我们将本地管理员站点称为您的本地计算机。
将所有节点连接在一起的是数据中心交换矩阵,这在示例中显示为单个子网。在实际安装中,数据中心交换矩阵是一个由脊叶式交换机所构建的网络,可为群集提供物理连接。
在 Apstra 托管的数据中心中,您需要通过跨底层交换矩阵交换机创建的叠加虚拟网络指定此连接。
此过程使用红帽托管的辅助安装服务,并涵盖在启动主机之前注册群集的更常见的早期绑定用例。
- 登录辅助安装器客户端计算机。辅助安装客户端计算机是向辅助安装服务发出辅助安装 API 调用的位置。
- 通过设置在后续步骤中使用的环境变量来准备部署。
- 创建一个 SSH 密钥,用于访问群集中的节点。将密钥保存到环境变量。
root@ai-client:~# ssh-keygen
在此示例中,我们将 SSH 密钥存储在其默认位置 ~/.ssh/id_rsa.pubexport CLUSTER_SSHKEY=$(cat ~/.ssh/id_rsa.pub)
- 将红帽帐户中的图像提取密钥下载到本地计算机。您的安装程序可以利用 pull secret 访问为 OpenShift 组件提供容器映像的服务和注册表。
如果您使用红帽托管的辅助安装程序,则可以从 https://console.redhat.com/openshift/downloads 页面下载密钥文件(拉密钥)。将提取密钥文件复制到辅助安装客户端计算机。在此示例中,我们将提取密钥存储在名为 pull-secret.txt 的文件中。
去除任何空格,将内容转换为 JSON 字符串格式,然后存储为环境变量,如下所示:
export PULL_SECRET=$(sed '/^[[:space:]]*$/d' pull-secret.txt | jq -R .)
- 从 Red Hat 帐户复制离线访问令牌。OpenShift 群集管理器 API 令牌允许您(在辅助安装客户端机器上)与红帽托管的辅助安装 API 服务进行交互。
令牌是一个字符串,您可以将其复制并粘贴到本地环境变量中。如果您使用 Red Hat 托管辅助安装程序,则可以从 https://console.redhat.com/openshift/downloads 复制 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 4xx 响应。在令牌到期时刷新,或者,在令牌到期之前定期刷新。令牌未过期时升级没有坏处。
- 设置剩余环境变量。
表 1 列出了在此过程中需要设置的所有环境变量,包括之前步骤中描述的环境变量。
表 1:环境变量 变量 说明 示例 CLUSTER_SSHKEY 您生成的(公共)ssh 密钥。此密钥将安装在所有群集节点上。 – PULL_SECRET 下载、去除并转换为 JSON 字符串格式的映像提取密钥。 – OFFLINE_ACCESS_TOKEN 复制的 OpenShift 群集管理器 API 令牌。 – 令 牌 从OFFLINE_ACCESS_TOKEN生成(刷新)的令牌。 – CLUSTER_NAME 要调用群集的名称。这是将在 Red Hat 混合云控制台 UI 中出现的名称。 注意:此名称必须小写。
我的群集 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 地址的子网前缀长度。这将定义用于 Pod IP 地址分配的 CLUSTER_NET IP 地址子集。 23 AI_URL 辅助安装服务的 URL。此示例使用 Red Hat 托管的辅助式安装程序。 https://api.openshift.com
- 创建一个 SSH 密钥,用于访问群集中的节点。将密钥保存到环境变量。
- 使用辅助安装服务注册群集。通过注册,您可以向辅助安装人员服务告知要创建的群集的属性。作为响应,辅助安装服务会创建一个群集资源,并返回一个可唯一标识该群集资源的群集标识符。
- 创建描述您要创建的群集的文件。在本例中,我们将文件命名为 deployment.json。
cat << EOF > ./deployment.json { "kind": "Cluster", "name": "$CLUSTER_NAME", "openshift_version": "<openshift_version>", "ocp_release_image": "quay.io/openshift-release-dev/ocp-release:<coreOS_version>-x86_64", "base_dns_domain": "$CLUSTER_DOMAIN", "hyperthreading": "all", "cluster_network_cidr": "$CLUSTER_NET", "cluster_network_host_prefix": $CLUSTER_HOST_PFX, "service_network_cidr": "$CLUSTER_SVC_NET", "user_managed_networking": true, "ssh_public_key": "$CLUSTER_SSHKEY", "pull_secret": $PULL_SECRET } EOF
注意:确保您为正在使用的(例如
4.8.39
)指定 <coreOS_version> https://www.juniper.net/documentation/en_US/release-independent/contrail-cloud-native/topics/reference/cloud-native-contrail-supported-platforms.pdf <openshift_version> 中列出的(例如4.8
)。 - 注册群集并将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')
- 更新群集属性以指定您希望群集使用 CN2 作为网络技术。
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
注册群集后,您可以将浏览器指向 Red Hat 混合云控制台 ( 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
- 注册 InfraEnv。作为响应,辅助安装服务会分配一个 InfraEnv ID,并根据指定的基础架构环境构建发现启动 ISO。参考刚刚创建的 infra-envs.json 文件。将 InfraEnv ID 存储在变量中。
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-点火.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-iso$CLUSTER_ID,引用名称中的群集标识符。
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 ./ai-liveiso-$CLUSTER_ID.iso
- 创建描述基础架构环境的文件。在本例中,我们将它命名为 infra-envs.json。
- 使用发现 boot ISO 启动 3 个控制平面节点。
- 选择适合您的基础架构的启动方法。确保机器启动连接到可以访问 Red Hat 托管辅助安装服务的网络。
在 图 1 所示的示例网络中,节点有一个接口,并且该接口连接到了 172.16.0.0/24 网络,而 172.16.0.0/24 网络与辅助安装服务具有外部连接。
- 检查群集状态:
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'
- 确认角色已分配。
在浏览器上,转至 Red Hat 混合云控制台 (https://console.redhat.com/openshift),然后单击您的群集以查看群集的详细信息。您可以按群集名称或群集 ID 搜索群集。
只有当节点(主机)出现并成功将角色分配为控制平面节点时,才继续下一步。由于我们仅启动 3 个控制平面节点,因此您将看到在 UI 中分配的角色,即 控制平面,辅助角色。
- 选择适合您的基础架构的启动方法。确保机器启动连接到可以访问 Red Hat 托管辅助安装服务的网络。
- 重复步骤 5 以启动工作节点。
查询主机角色时,您将看到工作节点处于 自动分配 状态。这是意料之中的。辅助安装安装服务稍后在安装群集时为这些节点分配角色。
- 如果您使用 DPDK 数据路径运行工作线程节点,则按如下标记运行 DPDK 数据路径的每个工作角色节点:
curl --location --request PATCH $AI_URL'/api/assisted-install/v2/infra-envs/$INFRA_ENVS_ID/hosts/$HOST_ID --header 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --data-raw '{"node_labels":[{"key": "agent-mode","value": "dpdk"},{"key": "node-role.kubernetes.io/dpdk","value" : ""}]}'
- 将 CN2 清单(在安装前下载)上传到辅助安装服务。
为方便,您可以使用以下 bash 脚本。脚本假定您已将清单放置在 清单 目录中。如果您使用此脚本,请确保:
- 您将所有要使用的清单放在此目录中,包括要从子目录使用的所有清单
- 您不会将任何其他 YAML 文件放置在此目录中
该脚本会遍历清单目录中的所有 *.yaml 文件,将其编码在 base64 中,并应用于群集。
尽管下载的清单包已包含 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
辅助安装服务会基于您定义的群集资源创建群集。首先,辅助安装器将其中一个控制平面节点分配为自举节点,进而准备其他节点。您将看到,非自举程序节点一个接一个地重新启动到群集中,非自举控制平面节点先重新启动,再重新启动工作节点,最后重新启动自举节点。
安装可能需要一小时或更多时间。您可以在 Red Hat 混合云控制台 (https://console.redhat.com/openshift) 上观看安装进度。
如果 Red Hat 混合云控制台显示安装停止,请使用用户名 core 登录每个节点,并确保主机可以解析域名,尤其是您在 DNS/DHCP 服务器中配置的域名,以及 Red Hat 辅助安装服务和瞻博网络存储库域名。最常见的安装问题可以追溯到网络配置错误,如错误的 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 文件中。
- 验证安装。
- 检查所有 Pod 的状态。确认所有 Pod 均处于“正在运行”或“已完成”状态。
kubectl get pods -A -o wide
- 对于未处于“运行”或“已完成”状态的 Pod,请使用 kubectl 描述命令进一步调查。
kubectl describe pod <pod name> -n <namespace>
一个常见问题是无法下载映像。如果是这种情况:
- 检查您的网络是否可以访问瞻博网络存储库
- 检查故障 Pod 所在的节点是否配置为访问 DNS 服务器
- 检查故障 Pod 所在的节点是否可以按主机名对存储库执行 ping 操作
- 检查所有 Pod 的状态。确认所有 Pod 均处于“正在运行”或“已完成”状态。
- (可选)登录到 OpenShift Web 控制台以监控您的群集。
Web 控制台 URL 的形式为: https://console-openshift-console.apps.<cluster-name><cluster-domain>。
- 确保要访问 Web 控制台的浏览器位于可以访问 Web 控制台 URL 的机器上。您可能需要将用于该控制台主机名的条目添加到该机器上的 /etc/host 文件中。请记住,此映射是在安装前的 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 控制台。