6.3. 在断开连接的环境中在裸机上部署托管的 control plane


当您在裸机上置备托管的 control plane 时,您可以使用 Agent 平台。Kubernetes Operator 的 Agent 平台和多集群引擎协同工作,以启用断开连接的部署。Agent 平台使用中央基础架构管理服务将 worker 节点添加到托管的集群中。有关中央基础架构管理服务简介,请参阅 启用中央基础架构管理服务

6.3.1. 裸机的断开连接的环境架构

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

Disconnected architecture diagram

  1. 配置基础架构服务,包括带有 TLS 支持、Web 服务器和 DNS 的 registry 证书部署,以确保断开连接的部署正常工作。
  2. openshift-config 命名空间中创建配置映射。在本例中,配置映射名为 registry-config。配置映射的内容是 Registry CA 证书。配置映射的 data 字段必须包含以下键/值:

    • 键:<registry_dns_domain_name>..<port>,例如 registry.hypershiftdomain.lab..5000:。在指定端口时,请确保在 registry DNS 域名后放置 ..
    • 值: 证书内容

      有关创建配置映射的更多信息,请参阅为托管 control plane 的断开连接的安装配置 TLS 证书

  3. 修改 images.config.openshift.io 自定义资源(CR)规格,并添加名为 additionalTrustedCA 的新字段,值为 name: registry-config
  4. 创建一个包含两个数据字段的配置映射。一个字段包含 RAW 格式的 registries.conf 文件,另一个字段包含 Registry 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. 在 multicluster engine Operator 命名空间中,您要创建 multiclusterengine CR,该 CR 启用 Agent 和 hypershift-addon 附加组件。multicluster engine Operator 命名空间必须包含配置映射才能修改断开连接的部署中的行为。命名空间还包含 multicluster-engineassisted-servicehypershift-addon-manager pod。
  6. 创建部署托管集群所需的以下对象:

    • secret :Secret 包含 pull secret、SSH 密钥和 etcd 加密密钥。
    • 配置映射:配置映射包含私有 registry 的 CA 证书。
    • HostedCluster: HostedCluster 资源定义用户创建的集群的配置。
    • NodePool: NodePool 资源标识引用用于数据平面的机器的节点池。
  7. 创建托管集群对象后,HyperShift Operator 会建立 HostedControlPlane 命名空间来容纳 control plane pod。命名空间还托管组件,如 Agents、裸机主机 (BMH)和 InfraEnv 资源。之后,您可以创建 InfraEnv 资源,并在 ISO 创建后创建 BMH 及其包含基板管理控制器(BMC)凭证的 secret。
  8. openshift-machine-api 命名空间中的 Metal3 Operator 会检查新的 BMH。然后,Metal3 Operator 会尝试连接到 BMC 来使用 multicluster engine Operator 命名空间中的 AgentServiceConfig CR 指定的 LiveISORootFS 值来启动它们。
  9. 启动 HostedCluster 资源的 worker 节点后,会启动一个 Agent 容器。此代理与 Assisted Service 建立联系人,它会编配操作以完成部署。最初,您需要将 NodePool 资源扩展到 HostedCluster 资源的 worker 节点数量。Assisted Service 管理剩余的任务。
  10. 此时,您需要等待部署过程完成。

6.3.2. 在断开连接的环境中在裸机上部署托管 control plane 的要求

要在断开连接的环境中配置托管的 control plane,您必须满足以下先决条件:

  • CPU:提供的 CPU 数量决定了并发运行多少个托管集群。通常,每个节点使用 16 个 CPU 用于 3 个节点。对于最小开发,您可以对 3 个节点使用 12 个 CPU。
  • Memory :RAM 量会影响可以托管的托管集群的数量。每个节点使用 48 GB RAM。对于最小开发,18 GB RAM 可能已足够。
  • Storage:为多集群引擎 Operator 使用 SSD 存储。

    • 管理集群: 250 GB.
    • Registry:所需的存储取决于托管的发行版本、操作器和镜像的数量。一个可接受的数字可能是 500 GB,最好与托管托管集群的磁盘分开。
    • Web 服务器:所需的存储取决于托管的 ISO 和镜像的数量。可接受的数字可能为 500 GB。
  • 生产环境: 对于生产环境,将管理集群、registry 和 Web 服务器分开在不同的磁盘上。本例演示了生产环境的可能配置:

    • Registry: 2 TB
    • 管理集群:500 GB
    • Web 服务器:2 TB

6.3.3. 提取发行镜像摘要

您可以使用标记的镜像提取 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

6.3.4. 为托管 control plane 的断开连接的安装配置虚拟机监控程序

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

流程

  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 部署管理集群和其他虚拟组件,请输入以下命令来安装和配置 hypervisor:

    $ 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. 启用网络管理器分配程序,以确保虚拟机能够解析所需的域、路由和 registry。要启用网络管理器分配程序,在 /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. 如果您在开发环境中工作,请将 hypervisor 系统配置为允许环境中通过不同虚拟网络进行各种连接。

    注意

    如果您在生产环境中工作,您必须为 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

6.3.5. 裸机上的 DNS 配置

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

DNS 条目可以是一个简单的记录,指向运行托管 control plane 的受管集群中的一个节点。该条目也可以指向部署的负载均衡器,将传入的流量重定向到入口 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 配置示例

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]

6.3.6. 在断开连接的环境中为托管的 control plane 部署 registry

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

流程

要使用 Podman 部署小 registry,请完成以下步骤:

  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\": \"sample-email@domain.ltd\"}}}" > /root/disconnected_pull.json
    mv ${PULL_SECRET} /root/openshift_pull.json.old
    jq ".auths += {\"$REGISTRY_NAME:5000\": {\"auth\": \"$KEY\",\"email\": \"sample-email@domain.ltd\"}}" < /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 并保存。运行脚本时,它会拉取以下信息:

    • registry 名称,基于 hypervisor 主机名
    • 所需的凭证和用户访问详情
  3. 通过添加执行标记来调整权限,如下所示:

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

    $ ${HOME}/registry.sh

    脚本将启动服务器。该脚本使用 systemd 服务来管理目的。

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

    $ systemctl status
    $ systemctl start
    $ systemctl stop

registry 的根目录位于 /opt/registry 目录中,包含以下子目录:

  • certs 包含 TLS 证书。
  • auth 包含凭据。
  • data 包含 registry 镜像。
  • conf 包含 registry 配置。

6.3.7. 在断开连接的环境中为托管 control plane 设置管理集群

要设置 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. 确保 pull secret 和 kcli 计划文件已就位,以便您可以部署 OpenShift Container Platform 管理集群:

    1. 确认 pull secret 与 kcli 计划位于同一个文件夹中,并且 pull secret 文件名为 openshift_pull.json
    2. mgmt-compact-hub-dual.yaml 文件中添加 kcli 计划,其中包含 OpenShift Container Platform 定义。确保更新文件内容以匹配您的环境:

      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
      使用您要使用的支持的 OpenShift Container Platform 版本替换 4.x.y
  4. 要置备管理集群,请输入以下命令:

    $ kcli create cluster openshift --pf mgmt-compact-hub-dual.yaml

后续步骤

接下来,配置 Web 服务器。

6.3.8. 在断开连接的环境中为托管 control plane 配置 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 目录中创建文件夹。文件夹包含用于置备 worker 节点的 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 Release 页上找到 ROOTFS_IMG_URL 值。
    2
    您可以在 OpenShift CI Release 页上找到 LIVE_ISO_URL 值。

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

6.3.9. 在断开连接的环境中为托管 control plane 配置镜像镜像

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

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

  • 要镜像的 OpenShift Container Platform 版本。版本位于 quay.io 中。
  • 要镜像的额外 Operator。单独选择软件包。
  • 要添加到存储库中的额外镜像。

先决条件

在启动镜像过程前,请确保 registry 服务器正在运行。

流程

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

  1. 确保 ${HOME}/.docker/config.json 文件已使用您要从镜像(mirror)的 registry 更新,并使用您要将镜像推送到的私有 registry。
  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 3
          type: ocp
        kubeVirtContainer: true 4
        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 5
    1
    <dns.base.domain.name> 替换为 DNS 基本域名。
    2 3
    4.x.y-build 替换为您要使用的受支持 OpenShift Container Platform 版本。
    4
    如果要为 KubeVirt 供应商为 Red Hat Enterprise Linux CoreOS (RHCOS) 引导镜像镜像容器磁盘镜像,则将此可选标志设置为 true。这个标志只可用于 oc-mirror v2。
    5
    对于使用 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
    如果要为 KubeVirt 供应商为 Red Hat Enterprise Linux CoreOS (RHCOS) 引导镜像镜像容器磁盘镜像,则将此可选标志设置为 true。这个标志只可用于 oc-mirror v2。
  5. 输入以下命令将更改应用到文件:

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

6.3.10. 在管理集群中应用对象

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

  • 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 目录正确镜像到内部 registry,请将 hypershift.openshift.io/olm-catalogs-is-registry-overrides 注解添加到 HostedCluster 资源。格式为 "sr1=dr1,sr2=dr2",其中源 registry 字符串是一个键,目标 registry 是一个值。
    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 更新中刷新内部镜像以拉取(pull)时更新注解值。

后续步骤

通过完成 为托管 control plane 断开连接的安装部署多集群引擎 Operator 中的步骤来部署多集群引擎 Operator。

6.3.11. 为托管 control plane 的断开连接的安装部署 multicluster engine Operator

Kubernetes Operator 的多集群引擎在跨供应商部署集群时会扮演重要角色。如果您没有安装 multicluster engine Operator,请参阅以下文档来了解安装它的先决条件和步骤:

6.3.11.1. 部署 AgentServiceConfig 资源

AgentServiceConfig 自定义资源是 Assisted Service add-on 的基本组件,它是 multicluster engine Operator 的一部分。它负责裸机集群部署。启用附加组件后,您将部署 AgentServiceConfig 资源来配置附加组件。

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

流程

  1. 通过添加以下配置映射来配置自定义 registry,其中包含自定义部署断开连接的详情:

    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 基本域名。

    对象包含两个字段:

    • Custom CAs:此字段包含加载到部署不同进程的证书颁发机构(CA)。
    • Registry: Registries.conf 字段包含有关需要从镜像 registry 而不是原始源 registry 使用的镜像和命名空间的信息。
  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 使用断开连接的 registry 信息的配置映射。此配置映射在部署过程中添加这些资源。
    3
    spec.osImages 字段包含可供此 Operator 部署的不同版本。这个字段是必须的。本例假设您已下载了 RootFSLiveISO 文件。
    4
    为您要部署的每个 OpenShift Container Platform 版本添加 cpuArchitecture 子部分。在本例中,cpuArchitecture 子部分包含在 4.14 和 4.15 中。
    5
    rootFSUrlurl 字段中,将 dns.base.domain.name 替换为 DNS 基域名称。
  3. 通过将所有对象串联到一个文件中,并将它们应用到管理集群,以部署它们。要做到这一点,请输入以下命令:

    $ oc apply -f agentServiceConfig.yaml

    命令会触发两个容器集。

    输出示例

    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。

后续步骤

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

6.3.12. 为托管 control plane 的断开连接的安装配置 TLS 证书

为确保断开连接的部署中正常工作,您需要在管理集群中配置 registry CA 证书,并为托管集群配置 worker 节点。

6.3.12.1. 将 registry CA 添加到管理集群中

要将 registry 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 字段中,指定 registry 名称和 registry 证书内容。将 <port> 替换为 registry 服务器运行的端口,例如 5000
    4
    确保在配置映射中的数据仅使用 | 定义,而不是有其他方法,如 | -。如果使用其他方法,pod 在读取证书时可能会出现问题。
  2. 对集群范围的对象 image.config.openshift.io 进行补丁,使其包含以下规格:

    spec:
      additionalTrustedCA:
        - name: registry-config

    因此,control plane 节点可以从私有 registry 检索镜像,HyperShift Operator 可以为托管集群部署提取 OpenShift Container Platform 有效负载。

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

6.3.12.2. 将 registry CA 添加到托管集群的 worker 节点

要让托管的集群中的 data plane worker 可以从私有 registry 检索镜像,您需要将 registry CA 添加到 worker 节点。

流程

  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 对象的命名空间。

6.3.13. 在裸机上创建托管集群

托管的集群是一个 OpenShift Container Platform 集群,其 control plane 和 API 端点托管在管理集群中。托管的集群包括控制平面和它的对应的数据平面。

6.3.13.1. 部署托管集群对象

通常,HyperShift Operator 会创建 HostedControlPlane 命名空间。但是,在这种情况下,您要在 HyperShift Operator 开始协调 HostedCluster 对象前包括所有对象。然后,当 Operator 启动协调过程时,它会找到所有对象。

流程

  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 文件,其中包含以下有关配置映射和 secret 的信息,以包含在 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> 3
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: sshkey-cluster-<hosted_cluster_name> 4
      namespace: <hosted_cluster_namespace> 5
    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 6
      namespace: <hosted_cluster_namespace> 7
    type: Opaque
    1 3 5 7
    <hosted_cluster_namespace> 替换为托管集群命名空间的名称。
    2 4 6
    <hosted_cluster_name> 替换为您的托管集群。
  3. 创建包含 RBAC 角色的 YAML 文件,以便 Assisted Service 代理可以与托管的 control plane 位于同一个 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. 创建一个 YAML 文件,其中包含有关 HostedCluster 对象的信息,根据需要替换值:

    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 5
      - mirrors:
      ...
      ...
      autoscaling: {}
      controllerAvailabilityPolicy: SingleReplica
      dns:
        baseDomain: <dns.base.domain.name> 6
      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> 7 8
        type: Agent
      pullSecret:
        name: <hosted_cluster_name>-pull-secret 9
      release:
        image: registry.<dns.base.domain.name>:5000/openshift/release-images:4.x.y-x86_64 10 11
      secretEncryption:
        aescbc:
          activeKey:
            name: <hosted_cluster_name>-etcd-encryption-key 12
        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> 13
    status:
      controlPlaneEndpoint:
        host: ""
        port: 0
    1 7 9 12 13
    <hosted_cluster_name> 替换为您的托管集群。
    2 8
    <hosted_cluster_namespace> 替换为托管集群命名空间的名称。
    3
    imageContentSources 部分包含对托管集群中用户工作负载的镜像引用。
    4 5 6 10
    <dns.base.domain.name> 替换为 DNS 基本域名。
    11
    使用您要使用的支持的 OpenShift Container Platform 版本替换 4.x.y
  5. HostedCluster 对象中添加注解,指向 OpenShift Container Platform 发行版本中的 HyperShift Operator 发行版本:

    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

6.3.13.2. 为托管集群创建 NodePool 对象

NodePool 是与托管集群关联的一组可扩展的 worker 节点。NodePool 机器架构在特定池中保持一致,独立于 control plane 的机器架构。

流程

  1. 使用有关 NodePool 对象的以下信息创建 YAML 文件,根据需要替换值:

    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

6.3.13.3. 为托管集群创建 InfraEnv 资源

InfraEnv 资源是一个 Assisted Service 对象,其中包含重要详情,如 pullSecretRefsshAuthorizedKey。这些详情用于创建为托管集群自定义的 Red Hat Enterprise Linux CoreOS (RHCOS) 引导镜像。

您可以托管多个 InfraEnv 资源,各自采用特定类型的主机。例如,您可能想要在具有更大 RAM 容量的主机间划分服务器场。

流程

  1. 使用以下有关 InfraEnv 资源的信息创建一个 YAML 文件,根据需要替换值:

    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 相同的命名空间中的配置映射引用,其中使用 pull secret。
    4
    sshAuthorizedKey 代表位于引导镜像中的 SSH 公钥。SSH 密钥允许以 core 用户身份访问 worker 节点。
  2. 运行以下命令来创建 InfraEnv 资源:

    $ oc apply -f 03-infraenv.yaml

    输出示例

    NAMESPACE              NAME     ISO CREATED AT
    clusters-hosted-dual   hosted   2023-09-11T15:14:10Z

6.3.13.4. 为托管集群创建 worker 节点

如果您在裸机平台上工作,创建 worker 节点至关重要,以确保正确配置了 BareMetalHost 中的详情。

如果使用虚拟机,您可以完成以下步骤,为 Metal3 Operator 创建空 worker 节点以使用。要做到这一点,您可以使用 kcli 工具。

流程

  1. 如果这不是您第一次尝试创建 worker 节点,您必须首先删除之前的设置。要做到这一点,请输入以下命令删除计划:

    $ 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 参数,以指定虚拟机的资源,包括 RAM 和 CPU。
      5
      包含 disk=[200,200],以指示您在虚拟机中创建两个精简配置的磁盘。
      6
      包括 nets=[{"name": "<network>", "mac": "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 参数,以指定虚拟机的资源,包括 RAM 和 CPU。
      5
      包含 disk=[200,200],以指示您在虚拟机中创建两个精简配置的磁盘。
      6
      包括 nets=[{"name": "<network>", "mac": "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 参数,以指定虚拟机的资源,包括 RAM 和 CPU。
      5
      包含 disk=[200,200],以指示您在虚拟机中创建两个精简配置的磁盘。
      6
      包括 nets=[{"name": "<network>", "mac": "aa:aa:aa:02:13"}] 以提供网络详情,包括要连接的网络名称、ipv4ipv6dual)以及主接口的 MAC 地址。
      7
      <hosted_cluster_name> 替换为托管集群的名称。
  3. 输入 restart ksushy 命令来重启 ksushy 工具,以确保工具检测到您添加的虚拟机:

    $ 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  |
    +---------------------+--------+-------------------+----------------------------------------------------+-------------+---------+

6.3.13.5. 为托管集群创建裸机主机

裸机主机 是一个 openshift-machine-api 对象,其中包含物理和逻辑详情,以便它可以被 Metal3 Operator 识别。这些详细信息与其他 Assisted Service 对象关联,称为代理(agent)

先决条件

在创建裸机主机和目标节点前,您必须让目标机器就绪。

流程

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

  1. 使用以下信息创建 YAML 文件:

    因为至少有一个 secret 包含裸机主机凭证,所以您需要为每个 worker 节点至少创建两个对象。

    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> \5
      labels:
        infraenvs.agent-install.openshift.io: <hosted_cluster_name> \6
      annotations:
        inspect.metal3.io: disabled
        bmac.agent-install.openshift.io/hostname: <hosted_cluster_name>-worker0 \7
    spec:
      automatedCleaningMode: disabled \8
      bmc:
        disableCertificateVerification: true \9
        address: redfish-virtualmedia://[192.168.126.1]:9000/redfish/v1/Systems/local/<hosted_cluster_name>-worker0 \10
        credentialsName: <hosted_cluster_name>-worker0-bmc-secret \11
      bootMACAddress: aa:aa:aa:aa:02:11 \12
      online: true 13
    1
    <hosted_cluster_name> 替换为您的托管集群。
    2 5
    <hosted_cluster_name> 替换为您的托管集群。将 <hosted_cluster_namespace> 替换为托管集群命名空间的名称。
    3
    以 Base64 格式指定基板管理控制器(BMC)的密码。
    4
    以 Base64 格式指定 BMC 的用户名。
    6
    <hosted_cluster_name> 替换为您的托管集群。infraenvs.agent-install.openshift.io 字段充当 Assisted Installer 和 BareMetalHost 对象之间的链接。
    7
    <hosted_cluster_name> 替换为您的托管集群。bmac.agent-install.openshift.io/hostname 字段表示部署期间采用的节点名称。
    8
    automatedCleaningMode 字段可防止 Metal3 Operator 擦除节点。
    9
    disableCertificateVerification 字段设为 true,以从客户端绕过证书验证。
    10
    <hosted_cluster_name> 替换为您的托管集群。address 字段表示 worker 节点的 BMC 地址。
    11
    <hosted_cluster_name> 替换为您的托管集群。credentialsName 字段指向存储用户和密码凭证的 secret。
    12
    bootMACAddress 字段指示节点从其启动的接口 MAC 地址。
    13
    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

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

6.3.13.6. 扩展节点池

创建裸机主机后,其状态会从 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

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

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

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.