×

先决条件

  • 您有一个充当管理集群的断开连接的OpenShift Container Platform环境。

  • 您有一个内部注册表来镜像镜像。更多信息,请参见关于断开连接安装镜像

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

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

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

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

  • 要镜像的其他操作符。分别选择软件包。

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

先决条件

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

步骤

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

  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目录已使用原始名称和标签正确镜像到内部注册表,请将hypershift.openshift.io/olm-catalogs-is-registry-overrides注释添加到HostedCluster资源。格式为"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,请查看以下文档以了解先决条件和安装步骤

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

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

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

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

步骤
  1. 创建一个类似于以下示例的config map

    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 指定config map的名称。
    2 指定config map的命名空间。
    3 data字段中,指定注册表名称和注册表证书内容。将<port>替换为注册表服务器运行的端口;例如,5000
    4 确保config map中的数据仅使用|定义,而不是使用其他方法,例如| -。如果您使用其他方法,则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条目是您在下一步中创建的config map。
  2. 在创建HostedCluster对象的同一命名空间中,创建user-ca-bundle config map。config map类似于以下示例

    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 Virtualization上创建托管集群

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

在OpenShift Virtualization上部署托管控制平面的要求

在准备在OpenShift Virtualization上部署托管控制平面时,请考虑以下信息

  • 在裸机上运行管理集群。

  • 每个托管集群必须具有集群范围的唯一名称。

  • 不要使用clusters作为托管集群名称。

  • 不能在多集群引擎 Operator 管理的集群的命名空间中创建托管集群。

  • 配置托管控制平面的存储时,请考虑推荐的etcd实践。为确保满足延迟要求,请将快速存储设备专用于在每个控制平面节点上运行的所有托管控制平面etcd实例。您可以使用LVM存储为托管etcd pod配置本地存储类。有关更多信息,请参阅“推荐的etcd实践”和“使用逻辑卷管理器存储的持久性存储”。

使用CLI创建具有KubeVirt平台的托管集群

要创建托管集群,您可以使用托管控制平面命令行界面hcp

步骤
  1. 输入以下命令

    $ hcp create cluster kubevirt \
      --name <hosted-cluster-name> \ (1)
      --node-pool-replicas <worker-count> \ (2)
      --pull-secret <path-to-pull-secret> \ (3)
      --memory <value-for-memory> \ (4)
      --cores <value-for-cpu> \ (5)
      --etcd-storage-class=<etcd-storage-class> (6)
    
    1 指定托管集群的名称,例如example
    2 指定工作程序数量,例如2
    3 指定您的pull secret的路径,例如/user/name/pullsecret
    4 指定内存值,例如,6Gi
    5 指定 CPU 值,例如,2
    6 指定 etcd 存储类名称,例如,lvm-storageclass

    您可以使用 --release-image 标志来使用特定的 OpenShift Container Platform 版本设置托管集群。

    根据 --node-pool-replicas 标志,将为集群创建一个包含两个虚拟机工作节点副本的默认节点池。

  2. 片刻之后,通过输入以下命令验证托管控制平面 Pod 是否正在运行

    $ oc -n clusters-<hosted-cluster-name> get pods
    示例输出
    NAME                                                  READY   STATUS    RESTARTS   AGE
    capi-provider-5cc7b74f47-n5gkr                        1/1     Running   0          3m
    catalog-operator-5f799567b7-fd6jw                     2/2     Running   0          69s
    certified-operators-catalog-784b9899f9-mrp6p          1/1     Running   0          66s
    cluster-api-6bbc867966-l4dwl                          1/1     Running   0          66s
    .
    .
    .
    redhat-operators-catalog-9d5fd4d44-z8qqk              1/1     Running   0          66s

    具有由 KubeVirt 虚拟机支持的工作节点的托管集群通常需要 10-15 分钟才能完全预配。

  3. 要检查托管集群的状态,请通过输入以下命令查看相应的 HostedCluster 资源

    $ oc get --namespace clusters hostedclusters

    查看以下示例输出,它说明了一个完全预配的 HostedCluster 对象

    NAMESPACE   NAME      VERSION   KUBECONFIG                 PROGRESS    AVAILABLE   PROGRESSING   MESSAGE
    clusters    example   4.x.0     example-admin-kubeconfig   Completed   True        False         The hosted control plane is available

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

配置 OpenShift Virtualization 上托管控制平面的默认 Ingress 和 DNS

每个 OpenShift Container Platform 集群都包含一个默认的应用程序 Ingress 控制器,它必须具有与其关联的通配符 DNS 记录。默认情况下,使用 HyperShift KubeVirt 提供程序创建的托管集群会自动成为运行 KubeVirt 虚拟机的 OpenShift Container Platform 集群的子域。

例如,您的 OpenShift Container Platform 集群可能具有以下默认 Ingress DNS 条目:

*.apps.mgmt-cluster.example.com

因此,名为 guest 并运行在该底层 OpenShift Container Platform 集群上的 KubeVirt 托管集群具有以下默认 Ingress:

*.apps.guest.apps.mgmt-cluster.example.com
步骤

为了使默认 Ingress DNS 正确工作,托管 KubeVirt 虚拟机的集群必须允许通配符 DNS 路由。

  • 您可以通过输入以下命令来配置此行为:

    $ oc patch ingresscontroller -n openshift-ingress-operator default --type=json -p '[{ "op": "add", "path": "/spec/routeAdmission", "value": {wildcardPolicy: "WildcardsAllowed"}}]'

当您使用默认的托管集群 Ingress 时,连接仅限于 443 端口上的 HTTPS 流量。 80 端口上的普通 HTTP 流量将被拒绝。此限制仅适用于默认的 Ingress 行为。

自定义 Ingress 和 DNS 行为

如果您不想使用默认的 Ingress 和 DNS 行为,您可以在创建时使用唯一的基域配置 KubeVirt 托管集群。此选项需要在创建过程中进行手动配置步骤,并涉及三个主要步骤:集群创建、负载均衡器创建和通配符 DNS 配置。

部署指定基域的托管集群

要创建指定基域的托管集群,请完成以下步骤。

步骤
  1. 输入以下命令

    $ hcp create cluster kubevirt \
      --name <hosted_cluster_name> \ (1)
      --node-pool-replicas <worker_count> \ (2)
      --pull-secret <path_to_pull_secret> \ (3)
      --memory <value_for_memory> \ (4)
      --cores <value_for_cpu> \ (5)
      --base-domain <basedomain> (6)
    
    1 指定托管集群的名称。
    2 指定工作程序数量,例如2
    3 指定您的pull secret的路径,例如/user/name/pullsecret
    4 指定内存值,例如,6Gi
    5 指定 CPU 值,例如,2
    6 指定基域,例如,hypershift.lab

    因此,托管集群具有为集群名称和基域配置的 Ingress 通配符,例如 .apps.example.hypershift.lab。托管集群保持 Partial 状态,因为在创建具有唯一基域的托管集群后,您必须配置所需的 DNS 记录和负载均衡器。

  2. 通过输入以下命令查看托管集群的状态

    $ oc get --namespace clusters hostedclusters
    示例输出
    NAME            VERSION   KUBECONFIG                       PROGRESS   AVAILABLE   PROGRESSING   MESSAGE
    example                   example-admin-kubeconfig         Partial    True        False         The hosted control plane is available
  3. 通过输入以下命令访问集群

    $ hcp create kubeconfig --name <hosted_cluster_name> > <hosted_cluster_name>-kubeconfig
    $ oc --kubeconfig <hosted_cluster_name>-kubeconfig get co
    示例输出
    NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
    console                                    4.x.0     False       False         False      30m     RouteHealthAvailable: failed to GET route (https://console-openshift-console.apps.example.hypershift.lab): Get "https://console-openshift-console.apps.example.hypershift.lab": dial tcp: lookup console-openshift-console.apps.example.hypershift.lab on 172.31.0.10:53: no such host
    ingress                                    4.x.0     True        False         True       28m     The "default" ingress controller reports Degraded=True: DegradedConditions: One or more other status conditions indicate a degraded state: CanaryChecksSucceeding=False (CanaryChecksRepetitiveFailures: Canary route checks for the default ingress controller are failing)

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

后续步骤

要修复输出中的错误,请完成“设置负载均衡器”和“设置通配符 DNS”中的步骤。

如果您的托管集群位于裸机上,您可能需要 MetalLB 来设置负载均衡器服务。有关更多信息,请参阅“配置 MetalLB”。

设置负载均衡器

设置负载均衡器服务,该服务将 Ingress 流量路由到 KubeVirt VM 并将通配符 DNS 条目分配给负载均衡器 IP 地址。

步骤
  1. 公开托管集群 Ingress 的 NodePort 服务已经存在。您可以导出节点端口并创建目标这些端口的负载均衡器服务。

    1. 通过输入以下命令获取 HTTP 节点端口

      $ oc --kubeconfig <hosted_cluster_name>-kubeconfig get services -n openshift-ingress router-nodeport-default -o jsonpath='{.spec.ports[?(@.name=="http")].nodePort}'

      记下 HTTP 节点端口值以在下一步中使用。

    2. 通过输入以下命令获取 HTTPS 节点端口

      $ oc --kubeconfig <hosted_cluster_name>-kubeconfig get services -n openshift-ingress router-nodeport-default -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}'

      记下 HTTPS 节点端口值以在下一步中使用。

  2. 通过输入以下命令创建负载均衡器服务

    oc apply -f -
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: <hosted_cluster_name>
      name: <hosted_cluster_name>-apps
      namespace: clusters-<hosted_cluster_name>
    spec:
      ports:
      - name: https-443
        port: 443
        protocol: TCP
        targetPort: <https_node_port> (1)
      - name: http-80
        port: 80
        protocol: TCP
        targetPort: <http-node-port> (2)
      selector:
        kubevirt.io: virt-launcher
      type: LoadBalancer
    1 指定您在上一步中记下的 HTTPS 节点端口值。
    2 指定您在上一步中记下的 HTTP 节点端口值。

设置通配符 DNS

设置引用负载均衡器服务外部 IP 地址的通配符 DNS 记录或 CNAME。

步骤
  1. 通过输入以下命令获取外部 IP 地址

    $ oc -n clusters-<hosted_cluster_name> get service <hosted-cluster-name>-apps -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
    示例输出
    192.168.20.30
  2. 配置引用外部 IP 地址的通配符 DNS 条目。查看以下示例 DNS 条目:

    *.apps.<hosted_cluster_name\>.<base_domain\>.

    DNS 条目必须能够在集群内部和外部进行路由。

    DNS 解析示例
    dig +short test.apps.example.hypershift.lab
    
    192.168.20.30
  3. 通过输入以下命令检查托管集群状态是否已从 Partial 变为 Completed

    $ oc get --namespace clusters hostedclusters
    示例输出
    NAME            VERSION   KUBECONFIG                       PROGRESS    AVAILABLE   PROGRESSING   MESSAGE
    example         4.x.0     example-admin-kubeconfig         Completed   True        False         The hosted control plane is available

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

完成部署

您可以从两个角度监控托管集群的部署:控制平面和数据平面。

监控控制平面

在部署过程中,您可以通过收集以下构件的信息来监控控制平面

  • HyperShift 运算符

  • HostedControlPlane Pod

  • 裸机主机

  • 代理

  • InfraEnv 资源

  • HostedClusterNodePool 资源

步骤
  • 输入以下命令来监控控制平面

    $ export KUBECONFIG=/root/.kcli/clusters/hub-ipv4/auth/kubeconfig
    $ watch "oc get pod -n hypershift;echo;echo;oc get pod -n clusters-hosted-ipv4;echo;echo;oc get bmh -A;echo;echo;oc get agent -A;echo;echo;oc get infraenv -A;echo;echo;oc get hostedcluster -A;echo;echo;oc get nodepool -A;echo;echo;"

监控数据平面

在部署过程中,您可以通过收集以下构件的信息来监控数据平面

  • 集群版本

  • 节点,特别是关于节点是否已加入集群的信息

  • 集群运算符

步骤
  • 输入以下命令

    $ oc get secret -n clusters-hosted-ipv4 admin-kubeconfig -o jsonpath='{.data.kubeconfig}' |base64 -d > /root/hc_admin_kubeconfig.yaml
    $ export KUBECONFIG=/root/hc_admin_kubeconfig.yaml
    $ watch "oc get clusterversion,nodes,co"