×

裸机断开连接的环境架构

下图显示了断开连接的环境的示例架构

Disconnected architecture diagram

  1. 配置基础设施服务,包括支持 TLS 的注册表证书部署、Web 服务器和 DNS,以确保断开连接的部署正常工作。

  2. openshift-config命名空间中创建一个配置映射。在此示例中,配置映射名为registry-config。配置映射的内容是注册表 CA 证书。配置映射的数据字段必须包含以下键/值

    • 键:<registry_dns_domain_name>..<port>,例如registry.hypershiftdomain.lab..5000:。指定端口时,请确保在注册表 DNS 域名后放置..

    • 值:证书内容

      有关创建配置映射的更多信息,请参见 *为托管控制平面的断开连接安装配置 TLS 证书*。

  3. 修改images.config.openshift.io自定义资源 (CR) 规范,并添加一个名为additionalTrustedCA的新字段,其值为name: registry-config

  4. 创建一个包含两个数据字段的配置映射。一个字段包含RAW格式的registries.conf文件,另一个字段包含注册表CA,命名为ca-bundle.crt。此配置映射属于multicluster-engine命名空间,其名称在其他对象中被引用。有关配置映射示例,请参见以下示例配置

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: custom-registries
      namespace: multicluster-engine
      labels:
        app: assisted-service
    data:
      ca-bundle.crt: |
        -----BEGIN CERTIFICATE-----
        # ...
        -----END CERTIFICATE-----
      registries.conf: |
        unqualified-search-registries = ["registry.access.redhat.com", "docker.io"]
    
        [[registry]]
        prefix = ""
        location = "registry.redhat.io/openshift4"
        mirror-by-digest-only = true
    
        [[registry.mirror]]
          location = "registry.ocp-edge-cluster-0.qe.lab.redhat.com:5000/openshift4"
    
        [[registry]]
        prefix = ""
        location = "registry.redhat.io/rhacm2"
        mirror-by-digest-only = true
    # ...
    # ...
  5. 在多集群引擎 Operator 命名空间中,您创建multiclusterengine CR,它启用 Agent 和hypershift-addon附加组件。多集群引擎 Operator 命名空间必须包含配置映射才能修改断开连接部署中的行为。该命名空间还包含multicluster-engineassisted-servicehypershift-addon-manager Pod。

  6. 创建部署托管集群所需的以下对象

    • 密钥:密钥包含拉取密钥、SSH 密钥和 etcd 加密密钥。

    • 配置映射:配置映射包含私有注册表的 CA 证书。

    • HostedClusterHostedCluster资源定义用户打算创建的集群的配置。

    • NodePoolNodePool资源标识引用用于数据平面的机器的节点池。

  7. 创建托管集群对象后,HyperShift Operator 将创建HostedControlPlane命名空间以容纳控制平面 Pod。该命名空间还托管组件,例如 Agent、裸机主机 (BMH) 和InfraEnv资源。稍后,您将创建InfraEnv资源,并在创建 ISO 后,创建包含底板管理控制器 (BMC) 凭据的 BMH 及其密钥。

  8. openshift-machine-api命名空间中的 Metal3 Operator 检查新的 BMH。然后,Metal3 Operator 尝试连接到 BMC 以使用通过多集群引擎 Operator 命名空间中的AgentServiceConfig CR 指定的已配置LiveISORootFS值启动它们。

  9. HostedCluster资源的工作节点启动后,将启动一个 Agent 容器。此 Agent 与 Assisted Service 建立联系,后者协调完成部署的操作。最初,您需要将NodePool资源扩展到HostedCluster资源的工作节点数量。Assisted Service 管理剩余的任务。

  10. 此时,您需要等待部署过程完成。

在断开连接的环境中在裸机上部署托管控制平面的要求

要在断开连接的环境中配置托管控制平面,您必须满足以下先决条件

  • CPU:提供的 CPU 数量决定了可以同时运行多少个托管集群。通常,每个节点使用 16 个 CPU,共 3 个节点。对于最小开发,您可以为每个节点使用 12 个 CPU,共 3 个节点。

  • 内存:RAM 的数量会影响可以托管多少个托管集群。每个节点使用 48 GB RAM。对于最小开发,18 GB RAM 可能就足够了。

  • 存储:为多集群引擎 Operator 使用 SSD 存储。

    • 管理集群:250 GB。

    • 注册表:所需的存储空间取决于托管的版本、操作符和镜像的数量。可以接受的数量可能是 500 GB,最好与托管托管集群的磁盘分开。

    • Web 服务器:所需的存储空间取决于托管的 ISO 和镜像的数量。可以接受的数量可能是 500 GB。

  • 生产环境:对于生产环境,请将管理集群、注册表和 Web 服务器分别放在不同的磁盘上。此示例说明了生产环境的可能配置

    • 注册表:2 TB

    • 管理集群:500 GB

    • Web 服务器:2 TB

提取发行版镜像摘要

您可以使用标记的镜像提取 OpenShift Container Platform 发行版镜像摘要。

步骤
  • 通过运行以下命令获取镜像摘要

    $ oc adm release info <tagged_openshift_release_image> | grep "Pull From"

    <tagged_openshift_release_image>替换为受支持的 OpenShift Container Platform 版本的标记镜像,例如quay.io/openshift-release-dev/ocp-release:4.14.0-x8_64

    示例输出
    Pull From: quay.io/openshift-release-dev/ocp-release@sha256:69d1292f64a2b67227c5592c1a7d499c7d00376e498634ff8e1946bc9ccdddfe

为托管控制平面的断开连接安装配置虚拟机管理程序

以下信息仅适用于虚拟机环境。

步骤
  1. 要部署虚拟管理集群,请通过输入以下命令访问所需的软件包

    $ sudo dnf install dnsmasq radvd vim golang podman bind-utils net-tools httpd-tools tree htop strace tmux -y
  2. 通过输入以下命令启用并启动 Podman 服务

    $ systemctl enable --now podman
  3. 要使用kcli部署管理集群和其他虚拟组件,请通过输入以下命令安装和配置虚拟机管理程序

    $ sudo yum -y install libvirt libvirt-daemon-driver-qemu qemu-kvm
    $ sudo usermod -aG qemu,libvirt $(id -un)
    $ sudo newgrp libvirt
    $ sudo systemctl enable --now libvirtd
    $ sudo dnf -y copr enable karmab/kcli
    $ sudo dnf -y install kcli
    $ sudo kcli create pool -p /var/lib/libvirt/images default
    $ kcli create host kvm -H 127.0.0.1 local
    $ sudo setfacl -m u:$(id -un):rwx /var/lib/libvirt/images
    $ kcli create network  -c 192.168.122.0/24 default
  4. 启用网络管理器调度程序以确保虚拟机可以解析所需的域、路由和注册表。要启用网络管理器调度程序,请在/etc/NetworkManager/dispatcher.d/目录中创建一个名为forcedns的脚本,其中包含以下内容

    #!/bin/bash
    
    export IP="192.168.126.1" (1)
    export BASE_RESOLV_CONF="/run/NetworkManager/resolv.conf"
    
    if ! [[ `grep -q "$IP" /etc/resolv.conf` ]]; then
    export TMP_FILE=$(mktemp /etc/forcedns_resolv.conf.XXXXXX)
    cp $BASE_RESOLV_CONF $TMP_FILE
    chmod --reference=$BASE_RESOLV_CONF $TMP_FILE
    sed -i -e "s/dns.base.domain.name//" -e "s/search /& dns.base.domain.name /" -e "0,/nameserver/s/nameserver/& $IP\n&/" $TMP_FILE (2)
    mv $TMP_FILE /etc/resolv.conf
    fi
    echo "ok"
    1 修改IP变量以指向托管 OpenShift Container Platform 管理集群的虚拟机管理程序接口的 IP 地址。
    2 dns.base.domain.name替换为 DNS 基本域名。
  5. 创建文件后,通过输入以下命令添加权限。

    $ chmod 755 /etc/NetworkManager/dispatcher.d/forcedns
  6. 运行脚本并验证输出是否返回ok

  7. 配置ksushy以模拟虚拟机的底板管理控制器 (BMC)。输入以下命令

    $ sudo dnf install python3-pyOpenSSL.noarch python3-cherrypy -y
    $ kcli create sushy-service --ssl --ipv6 --port 9000
    $ sudo systemctl daemon-reload
    $ systemctl enable --now ksushy
  8. 通过输入以下命令测试服务是否正常运行

    $ systemctl status ksushy
  9. 如果您在开发环境中工作,请配置虚拟机管理程序系统以允许通过环境中的不同虚拟网络进行各种类型的连接。

    如果您在生产环境中工作,则必须为firewalld服务建立适当的规则并配置 SELinux 策略以维护安全的环境。

    • 对于 SELinux,请输入以下命令

      $ sed -i s/^SELINUX=.*$/SELINUX=permissive/ /etc/selinux/config; setenforce 0
    • 对于firewalld,请输入以下命令

      $ systemctl disable --now firewalld
    • 对于libvirtd,请输入以下命令

      $ systemctl restart libvirtd
      $ systemctl enable --now libvirtd

裸机上的 DNS 配置

托管集群的 API 服务器作为NodePort服务公开。必须存在指向可以访问 API 服务器的目标的api.<hosted_cluster_name>.<base_domain>的 DNS 条目。

DNS 条目可以像指向托管集群中运行托管控制平面的节点之一的记录一样简单。该条目还可以指向部署以将传入流量重定向到入口 Pod 的负载均衡器。

示例 DNS 配置
api.example.krnl.es.    IN A 192.168.122.20
api.example.krnl.es.    IN A 192.168.122.21
api.example.krnl.es.    IN A 192.168.122.22
api-int.example.krnl.es.    IN A 192.168.122.20
api-int.example.krnl.es.    IN A 192.168.122.21
api-int.example.krnl.es.    IN A 192.168.122.22
`*`.apps.example.krnl.es. IN A 192.168.122.23

如果您正在为 IPv6 网络上的断开连接的环境配置 DNS,则配置如下例所示。

IPv6 网络的示例 DNS 配置
api.example.krnl.es.    IN A 2620:52:0:1306::5
api.example.krnl.es.    IN A 2620:52:0:1306::6
api.example.krnl.es.    IN A 2620:52:0:1306::7
api-int.example.krnl.es.    IN A 2620:52:0:1306::5
api-int.example.krnl.es.    IN A 2620:52:0:1306::6
api-int.example.krnl.es.    IN A 2620:52:0:1306::7
`*`.apps.example.krnl.es. IN A 2620:52:0:1306::10

如果您正在为双栈网络上的断开连接的环境配置 DNS,请确保包含 IPv4 和 IPv6 的 DNS 条目。

双栈网络的示例 DNS 配置
host-record=api-int.hub-dual.dns.base.domain.name,192.168.126.10
host-record=api.hub-dual.dns.base.domain.name,192.168.126.10
address=/apps.hub-dual.dns.base.domain.name/192.168.126.11
dhcp-host=aa:aa:aa:aa:10:01,ocp-master-0,192.168.126.20
dhcp-host=aa:aa:aa:aa:10:02,ocp-master-1,192.168.126.21
dhcp-host=aa:aa:aa:aa:10:03,ocp-master-2,192.168.126.22
dhcp-host=aa:aa:aa:aa:10:06,ocp-installer,192.168.126.25
dhcp-host=aa:aa:aa:aa:10:07,ocp-bootstrap,192.168.126.26

host-record=api-int.hub-dual.dns.base.domain.name,2620:52:0:1306::2
host-record=api.hub-dual.dns.base.domain.name,2620:52:0:1306::2
address=/apps.hub-dual.dns.base.domain.name/2620:52:0:1306::3
dhcp-host=aa:aa:aa:aa:10:01,ocp-master-0,[2620:52:0:1306::5]
dhcp-host=aa:aa:aa:aa:10:02,ocp-master-1,[2620:52:0:1306::6]
dhcp-host=aa:aa:aa:aa:10:03,ocp-master-2,[2620:52:0:1306::7]
dhcp-host=aa:aa:aa:aa:10:06,ocp-installer,[2620:52:0:1306::8]
dhcp-host=aa:aa:aa:aa:10:07,ocp-bootstrap,[2620:52:0:1306::9]

在断开连接的环境中为托管控制平面部署注册表

对于开发环境,请使用 Podman 容器部署小型自托管注册表。对于生产环境,请部署企业托管注册表,例如 Red Hat Quay、Nexus 或 Artifactory。

步骤

要使用 Podman 部署小型注册表,请完成以下步骤

  1. 以特权用户身份访问${HOME}目录并创建以下脚本

    #!/usr/bin/env bash
    
    set -euo pipefail
    
    PRIMARY_NIC=$(ls -1 /sys/class/net | grep -v podman | head -1)
    export PATH=/root/bin:$PATH
    export PULL_SECRET="/root/baremetal/hub/openshift_pull.json" (1)
    
    if [[ ! -f $PULL_SECRET ]];then
      echo "Pull Secret not found, exiting..."
      exit 1
    fi
    
    dnf -y install podman httpd httpd-tools jq skopeo libseccomp-devel
    export IP=$(ip -o addr show $PRIMARY_NIC | head -1 | awk '{print $4}' | cut -d'/' -f1)
    REGISTRY_NAME=registry.$(hostname --long)
    REGISTRY_USER=dummy
    REGISTRY_PASSWORD=dummy
    KEY=$(echo -n $REGISTRY_USER:$REGISTRY_PASSWORD | base64)
    echo "{\"auths\": {\"$REGISTRY_NAME:5000\": {\"auth\": \"$KEY\", \"email\": \"[email protected]\"}}}" > /root/disconnected_pull.json
    mv ${PULL_SECRET} /root/openshift_pull.json.old
    jq ".auths += {\"$REGISTRY_NAME:5000\": {\"auth\": \"$KEY\",\"email\": \"[email protected]\"}}" < /root/openshift_pull.json.old > $PULL_SECRET
    mkdir -p /opt/registry/{auth,certs,data,conf}
    cat <<EOF > /opt/registry/conf/config.yml
    version: 0.1
    log:
      fields:
        service: registry
    storage:
      cache:
        blobdescriptor: inmemory
      filesystem:
        rootdirectory: /var/lib/registry
      delete:
        enabled: true
    http:
      addr: :5000
      headers:
        X-Content-Type-Options: [nosniff]
    health:
      storagedriver:
        enabled: true
        interval: 10s
        threshold: 3
    compatibility:
      schema1:
        enabled: true
    EOF
    openssl req -newkey rsa:4096 -nodes -sha256 -keyout /opt/registry/certs/domain.key -x509 -days 3650 -out /opt/registry/certs/domain.crt -subj "/C=US/ST=Madrid/L=San Bernardo/O=Karmalabs/OU=Guitar/CN=$REGISTRY_NAME" -addext "subjectAltName=DNS:$REGISTRY_NAME"
    cp /opt/registry/certs/domain.crt /etc/pki/ca-trust/source/anchors/
    update-ca-trust extract
    htpasswd -bBc /opt/registry/auth/htpasswd $REGISTRY_USER $REGISTRY_PASSWORD
    podman create --name registry --net host --security-opt label=disable --replace -v /opt/registry/data:/var/lib/registry:z -v /opt/registry/auth:/auth:z -v /opt/registry/conf/config.yml:/etc/docker/registry/config.yml -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry" -e "REGISTRY_HTTP_SECRET=ALongRandomSecretForRegistry" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -v /opt/registry/certs:/certs:z -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key docker.io/library/registry:latest
    [ "$?" == "0" ] || !!
    systemctl enable --now registry
    1 PULL_SECRET的位置替换为您设置的相应位置。
  2. 将脚本文件命名为registry.sh并保存。运行脚本时,它会提取以下信息:

    • 基于虚拟机主机名的注册表名称

    • 必要的凭据和用户访问详细信息

  3. 通过添加执行标志来调整权限,如下所示:

    $ chmod u+x ${HOME}/registry.sh
  4. 要运行没有任何参数的脚本,请输入以下命令:

    $ ${HOME}/registry.sh

    脚本启动服务器。该脚本使用systemd服务进行管理。

  5. 如果您需要管理脚本,可以使用以下命令:

    $ systemctl status
    $ systemctl start
    $ systemctl stop

注册表的根文件夹位于/opt/registry目录中,并包含以下子目录:

  • certs包含 TLS 证书。

  • auth包含凭据。

  • data包含注册表镜像。

  • conf包含注册表配置。

在断开连接的环境中为托管控制平面设置管理集群

要设置 OpenShift Container Platform 管理集群,您可以使用 dev-scripts,或者如果您基于虚拟机,则可以使用kcli工具。以下说明特定于kcli工具。

步骤
  1. 确保已准备好正确的网络在虚拟机中使用。这些网络将同时托管管理集群和托管集群。输入以下kcli命令:

    $ kcli create network -c 192.168.126.0/24 -P dhcp=false -P dns=false -d 2620:52:0:1306::0/64 --domain dns.base.domain.name --nodhcp dual

    其中:

    • -c指定网络的 CIDR。

    • -P dhcp=false将网络配置为禁用 DHCP,DHCP 由您配置的dnsmasq处理。

    • -P dns=false将网络配置为禁用 DNS,DNS 也由您配置的dnsmasq处理。

    • --domain设置要搜索的域名。

    • dns.base.domain.name是 DNS 基本域名。

    • dual是您正在创建的网络的名称。

  2. 创建网络后,请查看以下输出:

    [root@hypershiftbm ~]# kcli list network
    Listing Networks...
    +---------+--------+---------------------+-------+------------------+------+
    | Network |  Type  |         Cidr        |  Dhcp |      Domain      | Mode |
    +---------+--------+---------------------+-------+------------------+------+
    | default | routed |   192.168.122.0/24  |  True |     default      | nat  |
    | ipv4    | routed | 2620:52:0:1306::/64 | False | dns.base.domain.name | nat  |
    | ipv4    | routed |   192.168.125.0/24  | False | dns.base.domain.name | nat  |
    | ipv6    | routed | 2620:52:0:1305::/64 | False | dns.base.domain.name | nat  |
    +---------+--------+---------------------+-------+------------------+------+
    [root@hypershiftbm ~]# kcli info network ipv6
    Providing information about network ipv6...
    cidr: 2620:52:0:1306::/64
    dhcp: false
    domain: dns.base.domain.name
    mode: nat
    plan: kvirt
    type: routed
  3. 确保已准备好拉取密钥和kcli计划文件,以便您可以部署 OpenShift Container Platform 管理集群。

    1. 确认拉取密钥与kcli计划文件位于同一文件夹中,并且拉取密钥文件名为openshift_pull.json

    2. 添加包含 OpenShift Container Platform 定义的kcli计划,该计划位于mgmt-compact-hub-dual.yaml文件中。确保您更新文件内容以匹配您的环境。

      plan: hub-dual
      force: true
      version: stable
      tag: "4.x.y-x86_64" (1)
      cluster: "hub-dual"
      dualstack: true
      domain: dns.base.domain.name
      api_ip: 192.168.126.10
      ingress_ip: 192.168.126.11
      service_networks:
      - 172.30.0.0/16
      - fd02::/112
      cluster_networks:
      - 10.132.0.0/14
      - fd01::/48
      disconnected_url: registry.dns.base.domain.name:5000
      disconnected_update: true
      disconnected_user: dummy
      disconnected_password: dummy
      disconnected_operators_version: v4.14
      disconnected_operators:
      - name: metallb-operator
      - name: lvms-operator
        channels:
        - name: stable-4.14
      disconnected_extra_images:
      - quay.io/user-name/trbsht:latest
      - quay.io/user-name/hypershift:BMSelfManage-v4.14-rc-v3
      - registry.redhat.io/openshift4/ose-kube-rbac-proxy:v4.10
      dualstack: true
      disk_size: 200
      extra_disks: [200]
      memory: 48000
      numcpus: 16
      ctlplanes: 3
      workers: 0
      manifests: extra-manifests
      metal3: true
      network: dual
      users_dev: developer
      users_devpassword: developer
      users_admin: admin
      users_adminpassword: admin
      metallb_pool: dual-virtual-network
      metallb_ranges:
      - 192.168.126.150-192.168.126.190
      metallb_autoassign: true
      apps:
      - users
      - lvms-operator
      - metallb-operator
      vmrules:
      - hub-bootstrap:
          nets:
          - name: ipv6
            mac: aa:aa:aa:aa:10:07
      - hub-ctlplane-0:
          nets:
          - name: ipv6
            mac: aa:aa:aa:aa:10:01
      - hub-ctlplane-1:
          nets:
          - name: ipv6
            mac: aa:aa:aa:aa:10:02
      - hub-ctlplane-2:
          nets:
          - name: ipv6
            mac: aa:aa:aa:aa:10:03
      1 4.x.y替换为您要使用的受支持的 OpenShift Container Platform 版本。
  4. 要配置管理集群,请输入以下命令:

    $ kcli create cluster openshift --pf mgmt-compact-hub-dual.yaml
后续步骤

接下来,配置 Web 服务器。

在断开连接的环境中为托管控制平面配置 Web 服务器

您需要配置一个额外的 Web 服务器来托管与您作为托管集群部署的 OpenShift Container Platform 版本关联的 Red Hat Enterprise Linux CoreOS (RHCOS) 镜像。

步骤

要配置 Web 服务器,请完成以下步骤:

  1. 通过输入以下命令,从您要使用的 OpenShift Container Platform 版本中提取openshift-install二进制文件:

    $ oc adm -a ${LOCAL_SECRET_JSON} release extract --command=openshift-install "${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}-${ARCHITECTURE}"
  2. 运行以下脚本。该脚本在/opt/srv目录中创建一个文件夹。该文件夹包含用于配置工作节点的 RHCOS 镜像。

    #!/bin/bash
    
    WEBSRV_FOLDER=/opt/srv
    ROOTFS_IMG_URL="$(./openshift-install coreos print-stream-json | jq -r '.architectures.x86_64.artifacts.metal.formats.pxe.rootfs.location')" (1)
    LIVE_ISO_URL="$(./openshift-install coreos print-stream-json | jq -r '.architectures.x86_64.artifacts.metal.formats.iso.disk.location')" (2)
    
    mkdir -p ${WEBSRV_FOLDER}/images
    curl -Lk ${ROOTFS_IMG_URL} -o ${WEBSRV_FOLDER}/images/${ROOTFS_IMG_URL##*/}
    curl -Lk ${LIVE_ISO_URL} -o ${WEBSRV_FOLDER}/images/${LIVE_ISO_URL##*/}
    chmod -R 755 ${WEBSRV_FOLDER}/*
    
    ## Run Webserver
    podman ps --noheading | grep -q websrv-ai
    if [[ $? == 0 ]];then
        echo "Launching Registry pod..."
        /usr/bin/podman run --name websrv-ai --net host -v /opt/srv:/usr/local/apache2/htdocs:z quay.io/alosadag/httpd:p8080
    fi
    1 您可以在 OpenShift CI 发行页面上找到ROOTFS_IMG_URL值。
    2 您可以在 OpenShift CI 发行页面上找到LIVE_ISO_URL值。

下载完成后,将运行一个容器以在 Web 服务器上托管镜像。该容器使用官方 HTTPd 镜像的变体,这也使其能够与 IPv6 网络一起工作。

在断开连接的环境中配置托管控制平面的镜像

镜像是从外部注册表(例如registry.redhat.comquay.io)获取镜像并将其存储在您的私有注册表中的过程。

在以下过程中,使用oc-mirror工具,这是一个使用ImageSetConfiguration对象的二进制文件。在文件中,您可以指定以下信息:

  • 要镜像的 OpenShift Container Platform 版本。这些版本位于quay.io中。

  • 要镜像的其他 Operators。单独选择软件包。

  • 要添加到存储库的其他镜像。

先决条件

在开始镜像过程之前,请确保注册表服务器正在运行。

步骤

要配置镜像,请完成以下步骤:

  1. 确保您的${HOME}/.docker/config.json文件已更新为要从中镜像的注册表以及您计划将镜像推送到其中的私有注册表。

  2. 使用以下示例,创建一个ImageSetConfiguration对象用于镜像。根据需要替换值以匹配您的环境:

    apiVersion: mirror.openshift.io/v1alpha2
    kind: ImageSetConfiguration
    storageConfig:
      registry:
        imageURL: registry.<dns.base.domain.name>:5000/openshift/release/metadata:latest (1)
    mirror:
      platform:
        channels:
        - name: candidate-4.17
          minVersion: 4.x.y-build  (2)
          maxVersion: 4.x.y-build (2)
          type: ocp
        kubeVirtContainer: true (3)
        graph: true
      additionalImages:
      - name: quay.io/karmab/origin-keepalived-ipfailover:latest
      - name: quay.io/karmab/kubectl:latest
      - name: quay.io/karmab/haproxy:latest
      - name: quay.io/karmab/mdns-publisher:latest
      - name: quay.io/karmab/origin-coredns:latest
      - name: quay.io/karmab/curl:latest
      - name: quay.io/karmab/kcli:latest
      - name: quay.io/user-name/trbsht:latest
      - name: quay.io/user-name/hypershift:BMSelfManage-v4.17
      - name: registry.redhat.io/openshift4/ose-kube-rbac-proxy:v4.10
      operators:
      - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.17
        packages:
        - name: lvms-operator
        - name: local-storage-operator
        - name: odf-csi-addons-operator
        - name: odf-operator
        - name: mcg-operator
        - name: ocs-operator
        - name: metallb-operator
        - name: kubevirt-hyperconverged (4)
    1 <dns.base.domain.name>替换为 DNS 基本域名。
    2 4.x.y-build替换为您要使用的受支持的 OpenShift Container Platform 版本。
    3 如果您还想要镜像 Red Hat Enterprise Linux CoreOS (RHCOS) 引导镜像(用于 KubeVirt 提供程序)的容器磁盘镜像,则将此可选标志设置为true。此标志仅在 oc-mirror v2 中可用。
    4 对于使用 KubeVirt 提供程序的部署,请包含此行。
  3. 通过输入以下命令启动镜像过程:

    $ oc-mirror --v2 --config imagesetconfig.yaml docker://${REGISTRY}

    镜像过程完成后,您将有一个名为oc-mirror-workspace/results-XXXXXX/的新文件夹,其中包含要在托管集群上应用的 IDMS 和目录源。

  4. 通过如下配置imagesetconfig.yaml文件来镜像 OpenShift Container Platform 的夜间版或 CI 版本:

    apiVersion: mirror.openshift.io/v2alpha1
    kind: ImageSetConfiguration
    mirror:
      platform:
        graph: true
        release: registry.ci.openshift.org/ocp/release:4.x.y-build (1)
        kubeVirtContainer: true (2)
    # ...
    1 4.x.y-build替换为您要使用的受支持的 OpenShift Container Platform 版本。
    2 如果您还想要镜像 Red Hat Enterprise Linux CoreOS (RHCOS) 引导镜像(用于 KubeVirt 提供程序)的容器磁盘镜像,则将此可选标志设置为true。此标志仅在 oc-mirror v2 中可用。
  5. 通过输入以下命令将更改应用于文件:

    $ oc-mirror --v2 --config imagesetconfig.yaml docker://${REGISTRY}
  6. 请按照在断开连接的网络上安装中的步骤镜像最新的多集群引擎 Operator 镜像。

在管理集群中应用对象

镜像过程完成后,您需要在管理集群中应用两个对象:

  • ImageContentSourcePolicy (ICSP) 或 ImageDigestMirrorSet (IDMS)

  • 目录源

使用oc-mirror工具时,输出工件位于名为oc-mirror-workspace/results-XXXXXX/的文件夹中。

ICSP或IDMS启动MachineConfig更改,此更改不会重启您的节点,但会重启每个节点上的kubelet。节点标记为READY后,您需要应用新生成的目录源。

目录源在openshift-marketplace Operator中启动操作,例如下载目录镜像并处理它以检索该镜像中包含的所有PackageManifests

步骤
  1. 要检查新的源,请使用新的CatalogSource作为源运行以下命令

    $ oc get packagemanifest
  2. 要应用工件,请完成以下步骤

    1. 通过输入以下命令创建ICSP或IDMS工件

      $ oc apply -f oc-mirror-workspace/results-XXXXXX/imageContentSourcePolicy.yaml
    2. 等待节点就绪,然后输入以下命令

      $ oc apply -f catalogSource-XXXXXXXX-index.yaml
  3. 镜像OLM目录并配置托管集群以指向镜像。

    使用management(默认)OLMCatalogPlacement模式时,用于OLM目录的镜像流不会自动使用来自管理集群上的ICSP的覆盖信息进行修改。

    1. 如果OLM目录使用原始名称和标签正确镜像到内部注册表,请向HostedCluster资源添加hypershift.openshift.io/olm-catalogs-is-registry-overrides注释。格式为"sr1=dr1,sr2=dr2",其中源注册表字符串为键,目标注册表为值。

    2. 要绕过OLM目录镜像流机制,请在HostedCluster资源上使用以下四个注释来直接指定用于OLM Operator目录的四个镜像的地址

      • hypershift.openshift.io/certified-operators-catalog-image

      • hypershift.openshift.io/community-operators-catalog-image

      • hypershift.openshift.io/redhat-marketplace-catalog-image

      • hypershift.openshift.io/redhat-operators-catalog-image

在这种情况下,不会创建镜像流,并且必须在刷新内部镜像以引入Operator更新时更新注释的值。

后续步骤

通过完成部署用于托管控制平面断开连接安装的多集群引擎 Operator中的步骤来部署多集群引擎 Operator。

部署用于托管控制平面断开连接安装的多集群引擎 Operator

Kubernetes Operator 的多集群引擎在跨提供商部署集群方面发挥着至关重要的作用。如果您没有安装多集群引擎 Operator,请查看以下文档以了解安装它的先决条件和步骤

部署AgentServiceConfig资源

AgentServiceConfig自定义资源是多集群引擎 Operator一部分的 Assisted Service 附加组件的重要组成部分。它负责裸机集群部署。启用附加组件后,您将部署AgentServiceConfig资源以配置附加组件。

除了配置AgentServiceConfig资源外,您还需要包含其他配置映射,以确保多集群引擎 Operator在断开连接的环境中正常运行。

步骤
  1. 通过添加以下包含断开连接详细信息以自定义部署的配置映射来配置自定义注册表

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: custom-registries
      namespace: multicluster-engine
      labels:
        app: assisted-service
    data:
      ca-bundle.crt: |
        -----BEGIN CERTIFICATE-----
        -----END CERTIFICATE-----
      registries.conf: |
        unqualified-search-registries = ["registry.access.redhat.com", "docker.io"]
    
        [[registry]]
        prefix = ""
        location = "registry.redhat.io/openshift4"
        mirror-by-digest-only = true
    
        [[registry.mirror]]
          location = "registry.dns.base.domain.name:5000/openshift4" (1)
    
        [[registry]]
        prefix = ""
        location = "registry.redhat.io/rhacm2"
        mirror-by-digest-only = true
        # ...
        # ...
    1 dns.base.domain.name替换为 DNS 基本域名。

    该对象包含两个字段

    • 自定义CA:此字段包含加载到部署的各种进程中的证书颁发机构 (CA)。

    • 注册表:Registries.conf字段包含有关需要从镜像注册表而不是原始源注册表中使用的镜像和命名空间的信息。

  2. 通过添加AssistedServiceConfig对象来配置 Assisted Service,如下例所示

    apiVersion: agent-install.openshift.io/v1beta1
    kind: AgentServiceConfig
    metadata:
      annotations:
        unsupported.agent-install.openshift.io/assisted-service-configmap: assisted-service-config (1)
      name: agent
      namespace: multicluster-engine
    spec:
      mirrorRegistryRef:
        name: custom-registries (2)
      databaseStorage:
        storageClassName: lvms-vg1
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
      filesystemStorage:
        storageClassName: lvms-vg1
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi
      osImages: (3)
      - cpuArchitecture: x86_64 (4)
        openshiftVersion: "4.14"
        rootFSUrl: http://registry.dns.base.domain.name:8080/images/rhcos-414.92.202308281054-0-live-rootfs.x86_64.img (5)
        url: http://registry.dns.base.domain.name:8080/images/rhcos-414.92.202308281054-0-live.x86_64.iso
        version: 414.92.202308281054-0
      - cpuArchitecture: x86_64
       openshiftVersion: "4.15"
       rootFSUrl: http://registry.dns.base.domain.name:8080/images/rhcos-415.92.202403270524-0-live-rootfs.x86_64.img
       url: http://registry.dns.base.domain.name:8080/images/rhcos-415.92.202403270524-0-live.x86_64.iso
       version: 415.92.202403270524-0
    1 metadata.annotations["unsupported.agent-install.openshift.io/assisted-service-configmap"]注释引用 Operator 使用来自定义行为的配置映射名称。
    2 spec.mirrorRegistryRef.name注释指向包含 Assisted Service Operator 使用的断开连接注册表信息的配置映射。此配置映射在部署过程中添加这些资源。
    3 spec.osImages字段包含此 Operator 可用于部署的不同版本。此字段是必需的。此示例假设您已下载RootFSLiveISO文件。
    4 为要部署的每个 OpenShift Container Platform 版本添加cpuArchitecture子部分。在此示例中,包含了 4.14 和 4.15 的cpuArchitecture子部分。
    5 rootFSUrlurl字段中,将dns.base.domain.name替换为DNS基本域名。
  3. 通过将所有对象连接到单个文件中并将它们应用于管理集群来部署所有对象。为此,请输入以下命令

    $ oc apply -f agentServiceConfig.yaml

    该命令会触发两个 Pod。

    示例输出
    assisted-image-service-0                               1/1     Running   2             11d (1)
    assisted-service-668b49548-9m7xw                       2/2     Running   5             11d (2)
    
    1 assisted-image-service Pod 负责创建 Red Hat Enterprise Linux CoreOS (RHCOS) 引导镜像模板,该模板针对您部署的每个集群进行定制。
    2 assisted-service 指的是 Operator。
后续步骤

通过完成为托管控制平面的断开连接安装配置 TLS 证书中的步骤来配置 TLS 证书。

为托管控制平面的断开连接安装配置 TLS 证书

为了确保在断开连接的部署中正常运行,您需要在管理集群和托管集群的工作节点中配置注册表 CA 证书。

将注册表 CA 添加到管理集群

要将注册表 CA 添加到管理集群,请完成以下步骤。

步骤
  1. 创建一个类似于以下示例的配置映射

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: <config_map_name> (1)
      namespace: <config_map_namespace> (2)
    data: (3)
      <registry_name>..<port>: | (4)
        -----BEGIN CERTIFICATE-----
        -----END CERTIFICATE-----
      <registry_name>..<port>: |
        -----BEGIN CERTIFICATE-----
        -----END CERTIFICATE-----
      <registry_name>..<port>: |
        -----BEGIN CERTIFICATE-----
        -----END CERTIFICATE-----
    1 指定配置映射的名称。
    2 指定配置映射的命名空间。
    3 data字段中,指定注册表名称和注册表证书内容。将<port>替换为注册表服务器正在运行的端口;例如,5000
    4 确保使用|而不是其他方法(例如| -)来定义配置映射中的数据。如果您使用其他方法,则 Pod 读取证书时可能会出现问题。
  2. 修补集群范围的对象image.config.openshift.io以包含以下规范

    spec:
      additionalTrustedCA:
        - name: registry-config

    通过此修补程序,控制平面节点可以从私有注册表检索镜像,并且 HyperShift Operator 可以提取托管集群部署的 OpenShift Container Platform 负载。

    修补对象的过程可能需要几分钟才能完成。

将注册表 CA 添加到托管集群的工作节点

为了让托管集群中的数据平面工作节点能够从私有注册表中检索镜像,您需要将注册表 CA 添加到工作节点。

步骤
  1. hc.spec.additionalTrustBundle文件中,添加以下规范

    spec:
      additionalTrustBundle:
        - name: user-ca-bundle (1)
    1 user-ca-bundle条目是您在下一步中创建的配置映射。
  2. 在创建HostedCluster对象的同一命名空间中,创建user-ca-bundle配置映射。配置映射类似于以下示例

    apiVersion: v1
    data:
      ca-bundle.crt: |
        // Registry1 CA
        -----BEGIN CERTIFICATE-----
        -----END CERTIFICATE-----
    
        // Registry2 CA
        -----BEGIN CERTIFICATE-----
        -----END CERTIFICATE-----
    
        // Registry3 CA
        -----BEGIN CERTIFICATE-----
        -----END CERTIFICATE-----
    
    kind: ConfigMap
    metadata:
      name: user-ca-bundle
      namespace: <hosted_cluster_namespace> (1)
    1 指定创建HostedCluster对象的命名空间。

在裸机上创建托管集群

托管集群是一个 OpenShift Container Platform 集群,其控制平面和 API 端点托管在管理集群上。托管集群包括控制平面及其相应的数据平面。

部署托管集群对象

通常,HyperShift 运算符会创建HostedControlPlane命名空间。但是,在这种情况下,您希望在 HyperShift 运算符开始协调HostedCluster对象之前包含所有对象。然后,当运算符启动协调过程时,它可以找到所有已就绪的对象。

步骤
  1. 创建一个包含以下关于命名空间信息的 YAML 文件

    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      creationTimestamp: null
      name: <hosted_cluster_namespace>-<hosted_cluster_name> (1)
    spec: {}
    status: {}
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      creationTimestamp: null
      name: <hosted_cluster_namespace> (2)
    spec: {}
    status: {}
    1 <hosted_cluster_name>替换为您的托管集群名称。
    2 <hosted_cluster_namespace>替换为您的托管集群命名空间名称。
  2. 创建一个 YAML 文件,其中包含要包含在HostedCluster部署中的配置映射和密钥的信息

    ---
    apiVersion: v1
    data:
      ca-bundle.crt: |
        -----BEGIN CERTIFICATE-----
        -----END CERTIFICATE-----
    kind: ConfigMap
    metadata:
      name: user-ca-bundle
      namespace: <hosted_cluster_namespace> (1)
    ---
    apiVersion: v1
    data:
      .dockerconfigjson: xxxxxxxxx
    kind: Secret
    metadata:
      creationTimestamp: null
      name: <hosted_cluster_name>-pull-secret (2)
      namespace: <hosted_cluster_namespace> (1)
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: sshkey-cluster-<hosted_cluster_name> (2)
      namespace: <hosted_cluster_namespace> (1)
    stringData:
      id_rsa.pub: ssh-rsa xxxxxxxxx
    ---
    apiVersion: v1
    data:
      key: nTPtVBEt03owkrKhIdmSW8jrWRxU57KO/fnZa8oaG0Y=
    kind: Secret
    metadata:
      creationTimestamp: null
      name: <hosted_cluster_name>-etcd-encryption-key (2)
      namespace: <hosted_cluster_namespace> (1)
    type: Opaque
    1 <hosted_cluster_namespace>替换为您的托管集群命名空间名称。
    2 <hosted_cluster_name>替换为您的托管集群名称。
  3. 创建一个 YAML 文件,其中包含 RBAC 角色,以便 Assisted Service 代理可以与托管控制平面位于同一HostedControlPlane命名空间中,并且仍然由集群 API 管理

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      creationTimestamp: null
      name: capi-provider-role
      namespace: <hosted_cluster_namespace>-<hosted_cluster_name>  (1) (2)
    rules:
    - apiGroups:
      - agent-install.openshift.io
      resources:
      - agents
      verbs:
      - '*'
    1 <hosted_cluster_namespace>替换为您的托管集群命名空间名称。
    2 <hosted_cluster_name>替换为您的托管集群名称。
  4. 创建一个包含HostedCluster对象信息的 YAML 文件,根据需要替换值

    apiVersion: hypershift.openshift.io/v1beta1
    kind: HostedCluster
    metadata:
      name: <hosted_cluster_name> (1)
      namespace: <hosted_cluster_namespace> (2)
    spec:
      additionalTrustBundle:
        name: "user-ca-bundle"
      olmCatalogPlacement: guest
      imageContentSources: (3)
      - source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
        mirrors:
        - registry.<dns.base.domain.name>:5000/openshift/release (4)
      - source: quay.io/openshift-release-dev/ocp-release
        mirrors:
        - registry.<dns.base.domain.name>:5000/openshift/release-images (4)
      - mirrors:
      ...
      ...
      autoscaling: {}
      controllerAvailabilityPolicy: SingleReplica
      dns:
        baseDomain: <dns.base.domain.name> (4)
      etcd:
        managed:
          storage:
            persistentVolume:
              size: 8Gi
            restoreSnapshotURL: null
            type: PersistentVolume
        managementType: Managed
      fips: false
      networking:
        clusterNetwork:
        - cidr: 10.132.0.0/14
        - cidr: fd01::/48
        networkType: OVNKubernetes
        serviceNetwork:
        - cidr: 172.31.0.0/16
        - cidr: fd02::/112
      platform:
        agent:
          agentNamespace: <hosted_cluster_namespace>-<hosted_cluster_name>  (1) (2)
        type: Agent
      pullSecret:
        name: <hosted_cluster_name>-pull-secret (1)
      release:
        image: registry.<dns.base.domain.name>:5000/openshift/release-images:4.x.y-x86_64  (4) (5)
      secretEncryption:
        aescbc:
          activeKey:
            name: <hosted_cluster_name>-etcd-encryption-key (1)
        type: aescbc
      services:
      - service: APIServer
        servicePublishingStrategy:
          type: LoadBalancer
      - service: OAuthServer
        servicePublishingStrategy:
          type: Route
      - service: OIDC
        servicePublishingStrategy:
          type: Route
      - service: Konnectivity
        servicePublishingStrategy:
          type: Route
      - service: Ignition
        servicePublishingStrategy:
          type: Route
      sshKey:
        name: sshkey-cluster-<hosted_cluster_name> (1)
    status:
      controlPlaneEndpoint:
        host: ""
        port: 0
    1 <hosted_cluster_name>替换为您的托管集群名称。
    2 <hosted_cluster_namespace>替换为您的托管集群命名空间名称。
    3 imageContentSources部分包含托管集群中用户工作负载的镜像引用。
    4 <dns.base.domain.name>替换为 DNS 基本域名。
    5 4.x.y替换为您要使用的受支持的 OpenShift Container Platform 版本。
  5. HostedCluster对象中添加一个注释,指向 OpenShift Container Platform 版本中的 HyperShift 运算符版本

    1. 通过输入以下命令获取镜像有效负载

      $ oc adm release info registry.<dns.base.domain.name>:5000/openshift-release-dev/ocp-release:4.x.y-x86_64 | grep hypershift

      其中<dns.base.domain.name>是 DNS 基本域名,4.x.y是您要使用的受支持的 OpenShift Container Platform 版本。

      示例输出
      hypershift        sha256:31149e3e5f8c5e5b5b100ff2d89975cf5f7a73801b2c06c639bf6648766117f8
    2. 使用 OpenShift Container Platform Images 命名空间,通过输入以下命令检查摘要

      podman pull registry.<dns.base.domain.name>:5000/openshift-release-dev/ocp-v4.0-art-dev@sha256:31149e3e5f8c5e5b5b100ff2d89975cf5f7a73801b2c06c639bf6648766117f8

      其中<dns.base.domain.name>是 DNS 基本域名。

      示例输出
      podman pull registry.dns.base.domain.name:5000/openshift/release@sha256:31149e3e5f8c5e5b5b100ff2d89975cf5f7a73801b2c06c639bf6648766117f8
      Trying to pull registry.dns.base.domain.name:5000/openshift/release@sha256:31149e3e5f8c5e5b5b100ff2d89975cf5f7a73801b2c06c639bf6648766117f8...
      Getting image source signatures
      Copying blob d8190195889e skipped: already exists
      Copying blob c71d2589fba7 skipped: already exists
      Copying blob d4dc6e74b6ce skipped: already exists
      Copying blob 97da74cc6d8f skipped: already exists
      Copying blob b70007a560c9 done
      Copying config 3a62961e6e done
      Writing manifest to image destination
      Storing signatures
      3a62961e6ed6edab46d5ec8429ff1f41d6bb68de51271f037c6cb8941a007fde

      HostedCluster对象中设置的发布镜像必须使用摘要而不是标签;例如,quay.io/openshift-release-dev/ocp-release@sha256:e3ba11bd1e5e8ea5a0b36a75791c90f29afb0fdbe4125be4e48f69c76a5c47a0

  6. 通过将所有在 YAML 文件中定义的对象连接到一个文件中并将其应用于管理集群来创建所有对象。为此,请输入以下命令

    $ oc apply -f 01-4.14-hosted_cluster-nodeport.yaml
    示例输出
    NAME                                                  READY   STATUS    RESTARTS   AGE
    capi-provider-5b57dbd6d5-pxlqc                        1/1     Running   0          3m57s
    catalog-operator-9694884dd-m7zzv                      2/2     Running   0          93s
    cluster-api-f98b9467c-9hfrq                           1/1     Running   0          3m57s
    cluster-autoscaler-d7f95dd5-d8m5d                     1/1     Running   0          93s
    cluster-image-registry-operator-5ff5944b4b-648ht      1/2     Running   0          93s
    cluster-network-operator-77b896ddc-wpkq8              1/1     Running   0          94s
    cluster-node-tuning-operator-84956cd484-4hfgf         1/1     Running   0          94s
    cluster-policy-controller-5fd8595d97-rhbwf            1/1     Running   0          95s
    cluster-storage-operator-54dcf584b5-xrnts             1/1     Running   0          93s
    cluster-version-operator-9c554b999-l22s7              1/1     Running   0          95s
    control-plane-operator-6fdc9c569-t7hr4                1/1     Running   0          3m57s
    csi-snapshot-controller-785c6dc77c-8ljmr              1/1     Running   0          77s
    csi-snapshot-controller-operator-7c6674bc5b-d9dtp     1/1     Running   0          93s
    csi-snapshot-webhook-5b8584875f-2492j                 1/1     Running   0          77s
    dns-operator-6874b577f-9tc6b                          1/1     Running   0          94s
    etcd-0                                                3/3     Running   0          3m39s
    hosted-cluster-config-operator-f5cf5c464-4nmbh        1/1     Running   0          93s
    ignition-server-6b689748fc-zdqzk                      1/1     Running   0          95s
    ignition-server-proxy-54d4bb9b9b-6zkg7                1/1     Running   0          95s
    ingress-operator-6548dc758b-f9gtg                     1/2     Running   0          94s
    konnectivity-agent-7767cdc6f5-tw782                   1/1     Running   0          95s
    kube-apiserver-7b5799b6c8-9f5bp                       4/4     Running   0          3m7s
    kube-controller-manager-5465bc4dd6-zpdlk              1/1     Running   0          44s
    kube-scheduler-5dd5f78b94-bbbck                       1/1     Running   0          2m36s
    machine-approver-846c69f56-jxvfr                      1/1     Running   0          92s
    oauth-openshift-79c7bf44bf-j975g                      2/2     Running   0          62s
    olm-operator-767f9584c-4lcl2                          2/2     Running   0          93s
    openshift-apiserver-5d469778c6-pl8tj                  3/3     Running   0          2m36s
    openshift-controller-manager-6475fdff58-hl4f7         1/1     Running   0          95s
    openshift-oauth-apiserver-dbbc5cc5f-98574             2/2     Running   0          95s
    openshift-route-controller-manager-5f6997b48f-s9vdc   1/1     Running   0          95s
    packageserver-67c87d4d4f-kl7qh                        2/2     Running   0          93s

    托管集群可用时,输出如下例所示。

    示例输出
    NAMESPACE   NAME         VERSION   KUBECONFIG                PROGRESS   AVAILABLE   PROGRESSING   MESSAGE
    clusters    hosted-dual            hosted-admin-kubeconfig   Partial    True          False         The hosted control plane is available

为托管集群创建 NodePool 对象

NodePool是一组可扩展的工作节点,与托管集群关联。NodePool机器架构在一个特定池内保持一致,并且独立于控制平面的机器架构。

步骤
  1. 创建一个 YAML 文件,其中包含关于NodePool对象的信息,根据需要替换值

    apiVersion: hypershift.openshift.io/v1beta1
    kind: NodePool
    metadata:
      creationTimestamp: null
      name: <hosted_cluster_name> \(1)
      namespace: <hosted_cluster_namespace> \(2)
    spec:
      arch: amd64
      clusterName: <hosted_cluster_name>
      management:
        autoRepair: false \(3)
        upgradeType: InPlace \(4)
      nodeDrainTimeout: 0s
      platform:
        type: Agent
      release:
        image: registry.<dns.base.domain.name>:5000/openshift/release-images:4.x.y-x86_64 \(5)
      replicas: 2 (6)
    status:
      replicas: 2
    1 <hosted_cluster_name>替换为您的托管集群名称。
    2 <hosted_cluster_namespace>替换为您的托管集群命名空间名称。
    3 autoRepair字段设置为false,因为如果删除节点,则不会重新创建节点。
    4 upgradeType设置为InPlace,这表示在升级期间重用相同的裸机节点。
    5 NodePool中包含的所有节点都基于以下 OpenShift Container Platform 版本:4.x.y-x86_64。将<dns.base.domain.name>值替换为您的 DNS 基本域名,并将4.x.y值替换为您要使用的受支持的 OpenShift Container Platform 版本。
    6 您可以将replicas值设置为2,以在托管集群中创建两个节点池副本。
  2. 通过输入以下命令创建NodePool对象

    $ oc apply -f 02-nodepool.yaml
    示例输出
    NAMESPACE   NAME          CLUSTER   DESIRED NODES   CURRENT NODES   AUTOSCALING   AUTOREPAIR   VERSION                              UPDATINGVERSION   UPDATINGCONFIG   MESSAGE
    clusters    hosted-dual   hosted    0                               False         False        4.x.y-x86_64

为托管集群创建 InfraEnv 资源

InfraEnv资源是一个 Assisted Service 对象,其中包含基本细节,例如pullSecretRefsshAuthorizedKey。这些细节用于创建为托管集群定制的 Red Hat Enterprise Linux CoreOS (RHCOS) 引导镜像。

您可以托管多个InfraEnv资源,并且每个资源都可以采用某些类型的主机。例如,您可能希望将服务器场划分为具有更大 RAM 容量的主机。

步骤
  1. 创建一个 YAML 文件,其中包含关于InfraEnv资源的信息,根据需要替换值

    apiVersion: agent-install.openshift.io/v1beta1
    kind: InfraEnv
    metadata:
      name: <hosted_cluster_name>
      namespace: <hosted-cluster-namespace>-<hosted_cluster_name>  (1) (2)
    spec:
      pullSecretRef: (3)
        name: pull-secret
      sshAuthorizedKey: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDk7ICaUE+/k4zTpxLk4+xFdHi4ZuDi5qjeF52afsNkw0w/glILHhwpL5gnp5WkRuL8GwJuZ1VqLC9EKrdmegn4MrmUlq7WTsP0VFOZFBfq2XRUxo1wrRdor2z0Bbh93ytR+ZsDbbLlGngXaMa0Vbt+z74FqlcajbHTZ6zBmTpBVq5RHtDPgKITdpE1fongp7+ZXQNBlkaavaqv8bnyrP4BWahLP4iO9/xJF9lQYboYwEEDzmnKLMW1VtCE6nJzEgWCufACTbxpNS7GvKtoHT/OVzw8ArEXhZXQUS1UY8zKsX2iXwmyhw5Sj6YboA8WICs4z+TrFP89LmxXY0j6536TQFyRz1iB4WWvCbH5n6W+ABV2e8ssJB1AmEy8QYNwpJQJNpSxzoKBjI73XxvPYYC/IjPFMySwZqrSZCkJYqQ023ySkaQxWZT7in4KeMu7eS2tC+Kn4deJ7KwwUycx8n6RHMeD8Qg9flTHCv3gmab8JKZJqN3hW1D378JuvmIX4V0= (4)
    1 <hosted_cluster_name>替换为您的托管集群名称。
    2 <hosted_cluster_namespace>替换为您的托管集群命名空间名称。
    3 pullSecretRef指的是与InfraEnv位于同一命名空间中的配置映射引用,其中使用拉取密钥。
    4 sshAuthorizedKey表示放置在引导镜像中的 SSH 公钥。SSH 密钥允许作为core用户访问工作节点。
  2. 通过输入以下命令创建InfraEnv资源

    $ oc apply -f 03-infraenv.yaml
    示例输出
    NAMESPACE              NAME     ISO CREATED AT
    clusters-hosted-dual   hosted   2023-09-11T15:14:10Z

为托管集群创建工作节点

如果您正在裸机平台上工作,则创建工作节点对于确保BareMetalHost中的详细信息配置正确至关重要。

如果您正在使用虚拟机,则可以完成以下步骤来为 Metal3 运算符创建空工作节点。为此,您使用kcli工具。

步骤
  1. 如果这不是您第一次尝试创建工作节点,则必须首先删除之前的设置。为此,请通过输入以下命令删除计划

    $ kcli delete plan <hosted_cluster_name> (1)
    1 <hosted_cluster_name>替换为您的托管集群名称。
    1. 当系统提示您确认是否要删除计划时,键入y

    2. 确认您看到一条消息,指出该计划已删除。

  2. 输入以下命令创建虚拟机

    1. 输入以下命令以创建第一个虚拟机

      $ kcli create vm \
        -P start=False \(1)
        -P uefi_legacy=true \(2)
        -P plan=<hosted_cluster_name> \(3)
        -P memory=8192 -P numcpus=16 \(4)
        -P disks=[200,200] \(5)
        -P nets=["{\"name\": \"<network>\", \"mac\": \"aa:aa:aa:aa:11:01\"}"] \(6)
        -P uuid=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa1101 \
        -P name=<hosted_cluster_name>-worker0 (7)
      1 如果您不希望虚拟机 (VM) 在创建后自动启动,请包含start=False
      2 包含uefi_legacy=true以指示您将使用 UEFI 传统引导以确保与以前的 UEFI 实现兼容。
      3 <hosted_cluster_name>替换为您的托管集群名称。plan=<hosted_cluster_name>语句指示计划名称,该名称将一组机器标识为集群。
      4 包含memory=8192numcpus=16参数以指定 VM 的资源,包括 RAM 和 CPU。
      5 包含disks=[200,200]以指示您正在 VM 中创建两个精简配置磁盘。
      6 包含nets=[{"name": "<network>", "mac": "aa:aa:aa:aa:02:13"}]以提供网络详细信息,包括要连接到的网络名称、网络类型 (ipv4ipv6dual) 和主接口的 MAC 地址。
      7 <hosted_cluster_name>替换为您的托管集群名称。
    2. 输入以下命令以创建第二个虚拟机

      $ kcli create vm \
        -P start=False \(1)
        -P uefi_legacy=true \(2)
        -P plan=<hosted_cluster_name> \(3)
        -P memory=8192 -P numcpus=16 \(4)
        -P disks=[200,200] \(5)
        -P nets=["{\"name\": \"<network>\", \"mac\": \"aa:aa:aa:aa:11:02\"}"] \(6)
        -P uuid=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa1102
        -P name=<hosted_cluster_name>-worker1 (7)
      1 如果您不希望虚拟机 (VM) 在创建后自动启动,请包含start=False
      2 包含uefi_legacy=true以指示您将使用 UEFI 传统引导以确保与以前的 UEFI 实现兼容。
      3 <hosted_cluster_name>替换为您的托管集群名称。plan=<hosted_cluster_name>语句指示计划名称,该名称将一组机器标识为集群。
      4 包含memory=8192numcpus=16参数以指定 VM 的资源,包括 RAM 和 CPU。
      5 包含disks=[200,200]以指示您正在 VM 中创建两个精简配置磁盘。
      6 包含nets=[{"name": "<network>", "mac": "aa:aa:aa:aa:02:13"}]以提供网络详细信息,包括要连接到的网络名称、网络类型 (ipv4ipv6dual) 和主接口的 MAC 地址。
      7 <hosted_cluster_name>替换为您的托管集群名称。
    3. 输入以下命令以创建第三个虚拟机

      $ kcli create vm \
        -P start=False \(1)
        -P uefi_legacy=true \(2)
        -P plan=<hosted_cluster_name> \(3)
        -P memory=8192 -P numcpus=16 \(4)
        -P disks=[200,200] \(5)
        -P nets=["{\"name\": \"<network>\", \"mac\": \"aa:aa:aa:aa:11:03\"}"] \(6)
        -P uuid=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa1103
        -P name=<hosted_cluster_name>-worker2 (7)
      1 如果您不希望虚拟机 (VM) 在创建后自动启动,请包含start=False
      2 包含uefi_legacy=true以指示您将使用 UEFI 传统引导以确保与以前的 UEFI 实现兼容。
      3 <hosted_cluster_name>替换为您的托管集群名称。plan=<hosted_cluster_name>语句指示计划名称,该名称将一组机器标识为集群。
      4 包含memory=8192numcpus=16参数以指定 VM 的资源,包括 RAM 和 CPU。
      5 包含disks=[200,200]以指示您正在 VM 中创建两个精简配置磁盘。
      6 包含nets=[{"name": "<network>", "mac": "aa:aa:aa:aa:02:13"}]以提供网络详细信息,包括要连接到的网络名称、网络类型 (ipv4ipv6dual) 和主接口的 MAC 地址。
      7 <hosted_cluster_name>替换为您的托管集群名称。
  3. 输入restart ksushy命令以重新启动ksushy工具,以确保该工具检测到您添加的 VM

    $ systemctl restart ksushy
    示例输出
    +---------------------+--------+-------------------+----------------------------------------------------+-------------+---------+
    |         Name        | Status |         Ip        |                       Source                       |     Plan    | Profile |
    +---------------------+--------+-------------------+----------------------------------------------------+-------------+---------+
    |    hosted-worker0   |  down  |                   |                                                    | hosted-dual |  kvirt  |
    |    hosted-worker1   |  down  |                   |                                                    | hosted-dual |  kvirt  |
    |    hosted-worker2   |  down  |                   |                                                    | hosted-dual |  kvirt  |
    +---------------------+--------+-------------------+----------------------------------------------------+-------------+---------+

为托管集群创建裸机主机

裸机主机是一个openshift-machine-api对象,它包含物理和逻辑细节,以便 Metal3 运算符可以识别它。这些细节与其他 Assisted Service 对象(称为代理)相关联。

先决条件

在创建裸金属主机和目标节点之前,您必须准备好目标机器。

步骤

要创建裸金属主机,请完成以下步骤:

  1. 创建一个包含以下信息的 YAML 文件:

    由于您至少有一个包含裸金属主机凭据的密钥,因此您需要为每个工作节点创建至少两个对象。

    apiVersion: v1
    kind: Secret
    metadata:
      name: <hosted_cluster_name>-worker0-bmc-secret \(1)
      namespace: <hosted_cluster_namespace>-<hosted_cluster_name> \(2)
    data:
      password: YWRtaW4= \(3)
      username: YWRtaW4= \(4)
    type: Opaque
    # ...
    apiVersion: metal3.io/v1alpha1
    kind: BareMetalHost
    metadata:
      name: <hosted_cluster_name>-worker0
      namespace: <hosted_cluster_namespace>-<hosted_cluster_name> \(2)
      labels:
        infraenvs.agent-install.openshift.io: <hosted_cluster_name> \(5)
      annotations:
        inspect.metal3.io: disabled
        bmac.agent-install.openshift.io/hostname: <hosted_cluster_name>-worker0 \(6)
    spec:
      automatedCleaningMode: disabled \(7)
      bmc:
        disableCertificateVerification: true \(8)
        address: redfish-virtualmedia://[192.168.126.1]:9000/redfish/v1/Systems/local/<hosted_cluster_name>-worker0 \(9)
        credentialsName: <hosted_cluster_name>-worker0-bmc-secret \(10)
      bootMACAddress: aa:aa:aa:aa:02:11 \(11)
      online: true (12)
    1 <hosted_cluster_name>替换为您的托管集群名称。
    2 <hosted_cluster_name>替换为您的托管集群名称。将<hosted_cluster_namespace>替换为您的托管集群命名空间名称。
    3 以 Base64 格式指定底板管理控制器 (BMC) 的密码。
    4 以 Base64 格式指定 BMC 的用户名。
    5 <hosted_cluster_name>替换为您的托管集群名称。infraenvs.agent-install.openshift.io 字段作为 Assisted Installer 和BareMetalHost 对象之间的链接。
    6 <hosted_cluster_name>替换为您的托管集群名称。bmac.agent-install.openshift.io/hostname 字段表示部署过程中采用的节点名称。
    7 automatedCleaningMode字段可以防止节点被 Metal3 Operator 删除。
    8 disableCertificateVerification 字段设置为true 以绕过客户端的证书验证。
    9 <hosted_cluster_name>替换为您的托管集群名称。address字段表示工作节点的 BMC 地址。
    10 <hosted_cluster_name>替换为您的托管集群名称。credentialsName字段指向存储用户和密码凭据的密钥。
    11 bootMACAddress字段指示节点启动的接口MAC地址。
    12 online字段定义创建BareMetalHost对象后节点的状态。
  2. 通过输入以下命令部署BareMetalHost对象:

    $ oc apply -f 04-bmh.yaml

    在此过程中,您可以查看以下输出:

    • 此输出表示该过程正在尝试连接节点。

      示例输出
      NAMESPACE         NAME             STATE         CONSUMER   ONLINE   ERROR   AGE
      clusters-hosted   hosted-worker0   registering              true             2s
      clusters-hosted   hosted-worker1   registering              true             2s
      clusters-hosted   hosted-worker2   registering              true             2s
    • 此输出表示节点正在启动。

      示例输出
      NAMESPACE         NAME             STATE          CONSUMER   ONLINE   ERROR   AGE
      clusters-hosted   hosted-worker0   provisioning              true             16s
      clusters-hosted   hosted-worker1   provisioning              true             16s
      clusters-hosted   hosted-worker2   provisioning              true             16s
    • 此输出表示节点已成功启动。

      示例输出
      NAMESPACE         NAME             STATE         CONSUMER   ONLINE   ERROR   AGE
      clusters-hosted   hosted-worker0   provisioned              true             67s
      clusters-hosted   hosted-worker1   provisioned              true             67s
      clusters-hosted   hosted-worker2   provisioned              true             67s
  3. 节点启动后,请注意命名空间中的代理,例如:

    示例输出
    NAMESPACE         NAME                                   CLUSTER   APPROVED   ROLE          STAGE
    clusters-hosted   aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0411             true       auto-assign
    clusters-hosted   aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0412             true       auto-assign
    clusters-hosted   aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0413             true       auto-assign

    这些代理表示可用于安装的节点。要将节点分配给托管集群,请扩展节点池。

扩展节点池

创建裸金属主机后,其状态将从Registering更改为Provisioning,最后变为Provisioned。节点将使用代理的LiveISO和名为agent的默认 Pod 启动。该代理负责接收来自 Assisted Service Operator 的指令以安装 OpenShift Container Platform 负载。

步骤
  1. 要扩展节点池,请输入以下命令:

    $ oc -n <hosted_cluster_namespace> scale nodepool <hosted_cluster_name> --replicas 3

    其中:

    • <hosted_cluster_namespace>是托管集群命名空间的名称。

    • <hosted_cluster_name>是托管集群的名称。

  2. 扩展过程完成后,请注意代理已分配给托管集群。

    示例输出
    NAMESPACE         NAME                                   CLUSTER   APPROVED   ROLE          STAGE
    clusters-hosted   aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0411   hosted    true       auto-assign
    clusters-hosted   aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0412   hosted    true       auto-assign
    clusters-hosted   aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0413   hosted    true       auto-assign
  3. 还要注意节点池副本已设置。

    示例输出
    NAMESPACE   NAME     CLUSTER   DESIRED NODES   CURRENT NODES   AUTOSCALING   AUTOREPAIR   VERSION       UPDATINGVERSION   UPDATINGCONFIG   MESSAGE
    clusters    hosted   hosted    3                               False         False        4.x.y-x86_64                                     Minimum availability requires 3 replicas, current 0 available

    4.x.y替换为您要使用的受支持的 OpenShift Container Platform 版本。

  4. 等待节点加入集群。在此过程中,代理将提供其阶段和状态的更新。