1.7. 将目标受管集群导入到 hub 集群

您可以从不同的 Kubernetes 云供应商导入集群。导入后,目标集群就成为 Red Hat Advanced Cluster Management for Kubernetes hub 集群的受管集群。除非另有指定,否则在可以访问 hub 集群和目标受管集群的任意位置完成导入任务。

hub 集群无法管理任何其他 hub 集群,但可以管理自己。hub 集群被配置为自动导入和自助管理。您不需要手动导入 hub 集群。

但是,如果您删除 hub 集群并尝试再次导入它,则需要添加 local-cluster:true 标签。

从以下说明中进行选择以通过控制台或 CLI 设置受管集群:

所需的用户类型或访问权限级别:集群管理员

1.7.1. 使用控制台导入现有集群

安装 Red Hat Advanced Cluster Management for Kubernetes 后,就可以导入集群来进行管理。您可以从控制台和 CLI 导入。

按照以下步骤从控制台导入。在此过程中,您需要通过终端来进行身份验证。

1.7.1.1. 先决条件

  • 您需要一个已部署的 Red Hat Advanced Cluster Management for Kubernetes hub 集群。如果要导入裸机集群,则必须在 Red Hat OpenShift Container Platform 版本 4.8 或更高版本上安装了 hub 集群。
  • 您需要一个要管理的集群,以及互联网连接。
  • 安装 kubectl。要安装 kubectl,请参阅 Kubernetes 文档中的安装和设置 kubectl
  • 您需要 base64 命令行工具。
  • 注: 如果要导入不是由 OpenShift Container Platform 创建的集群,则需要定义 multiclusterhub.spec.imagePullSecret。安装 Red Hat Advanced Cluster Management 时可能会创建此 secret。

    如果您需要创建新服务,请完成以下步骤:

    1. cloud.redhat.com 下载 Kubernetes pull secret。
    2. 将 pull secret 添加到 hub 集群的命名空间。
    3. 运行以下命令,在 hub 集群的命名空间中创建新 secret:

      oc create secret generic pull-secret -n <open-cluster-management> --from-file=.dockerconfigjson=<path-to-pull-secret> --type=kubernetes.io/dockerconfigjson

      open-cluster-management 替换为 hub 集群的命名空间的名称。hub 集群的默认命名空间是 open-cluster-management

      path-to-pull-secret 替换为您下载的 pull secret 的路径。

      在导入时,secret 会自动复制到受管集群。

      如需了解更多与 pull secret 相关的信息,请参阅使用镜像 pull secret了解并创建服务帐户

      如需有关如何定义此 secret 的更多信息,请参阅自定义镜像 pull secret。

  • 确保您要导入的集群中已删除代理。必须删除 open-cluster-management-agentopen-cluster-management-agent-addon 命名空间以避免错误。
  • 有关在 Red Hat OpenShift Dedicated 环境中导入,请参阅以下备注:

    • 您必须在 Red Hat OpenShift Dedicated 环境中部署了 hub 集群。
    • Red Hat OpenShift Dedicated 的默认权限是 dedicated-admin,但不包含创建命名空间的所有权限。您必须具有 cluster-admin 权限才能使用 Red Hat Advanced Cluster Management for Kubernetes 导入和管理集群。

所需的用户类型或访问权限级别:集群管理员

1.7.1.2. 导入集群

您可以从 Red Hat Advanced Cluster Management for Kubernetes 控制台中为每个可用的云供应商导入现有集群。

注: hub 集群无法管理不同的 hub 集群。hub 集群被设置为自动导入和管理自身,因此您不必手动导入 hub 集群来管理自己。

  1. 在导航菜单中选择 Infrastructure > Clusters
  2. Managed cluster 选项卡中,点 Import cluster
  3. 为集群提供名称。默认情况下,命名空间用于集群名称和命名空间。

重要: 当您创建集群时,Red Hat Advanced Cluster Management 控制器为集群及其资源创建一个命名空间。确保只在该命名空间中包含该集群实例的资源。销毁集群会删除命名空间和所有资源。

  1. 如果要将其添加到现有集群集 中,请指定 Cluster set,则指定具有 cluster-admin 权限的现有集群集。如果在创建集群时没有 cluster-admin 权限,则必须选择一个具有 clusterset-admin 权限的集群集。如果您在指定的集群集中没有正确的权限,集群创建会失败。如果没有要选择的集群设置选项,请联系集群管理员,为集群集提供 clusterset-admin 权限。

    每个受管集群都必须与受管集群集关联。如果您没有将受管集群分配给 ManagedClusterSet,则会自动添加到 default 受管集群集中。

  2. 可选: 添加任何 附加标签

    注: 如果您导入 Red Hat OpenShift Dedicated 集群,且没有添加 vendor=OpenShiftDedicated 标签指定一个厂商,或者添加了 vendor=auto-detect 标签,则 managed-by=platform 标签会自动添加到集群中。您可以使用此添加标签将集群标识为一个 Red Hat OpenShift Dedicated 集群,并作为一个组来获取 Red Hat OpenShift Dedicated 集群。

  3. 选择您要用来标识从以下选项导入的集群的导入模式

    • 手动运行导入命令:根据您提供的信息生成可复制和运行的导入命令。点 Save import and generate code 生成用于部署 open-cluster-management-agent-addon 的命令。此时会显示确认信息。

      1. Import an existing cluster 窗口中,选择 Copy 命令将生成的命令和令牌复制到剪贴板。

        重要:命令中包含复制到每个导入集群的 pull secret 信息。具有访问导入集群权限的所有用户都可以查看 pull secret 信息。考虑在 https://cloud.redhat.com/ 创建一个二级 pull secret,或创建一个服务帐户来保护个人凭证。

      2. 登录到您要导入的受管集群。
      3. 对于 Red Hat OpenShift Dedicated 环境:完成以下步骤:

        1. 创建 open-cluster-management-agentopen-cluster-management 命名空间或受管集群上的项目。
        2. 在 OpenShift Container Platform 目录中找到 klusterlet Operator。
        3. open-cluster-management 命名空间中或您创建的项目中安装它。

          重要: 不要在 open-cluster-management-agent 命名空间中安装 Operator。

        4. 通过完成以下步骤,从导入命令中提取 bootstrap secret:

          1. 生成导入命令:

            1. 从 Red Hat Advanced Cluster Management 控制台主导航中选择 Infrastructure > Clusters
            2. 选择 Add a cluster > Import an existing cluster
            3. 添加集群信息,选择 Save import and generate code
          2. 复制导入命令。
          3. 将导入命令粘贴到您创建的名为 import-command 的文件中。
          4. 运行以下命令以将内容插入新文件中:

            cat import-command | awk '{split($0,a,"&&"); print a[3]}' | awk '{split($0,a,"|"); print a[1]}' | sed -e "s/^ echo //" | base64 -d
          5. 在输出中找到并复制名为 bootstrap-hub-kubeconfig 的 secret。
          6. 将 secret 应用到受管集群上的 open-cluster-management-agent 命名空间。
          7. 使用安装的 Operator 中的示例创建 klusterlet 资源,clusterName 应该与导入过程中设置的集群名称相同。

            注:managedcluster 资源在 hub 中成功注册时,会安装两个 klusterlet operator。一个 klusterlet operator 位于 open-cluster-management 命名空间中,另一个位于 open-cluster-management-agent 命名空间中。多个 operator 并不会影响 klusterlet 的功能。

      4. 对于不在 Red Hat OpenShift Dedicated 环境中的集群导入,请完成以下步骤:

        1. 如有必要,为您的受管集群配置 kubectl 命令。

          请参阅支持的供应商以了解如何配置 kubectl 命令行界面。

        2. 要将 open-cluster-management-agen-addon 部署到受管集群,请运行您复制的命令和令牌。
      5. 选择 View clusterOverview 页面中查看集群概述。
    • 为现有集群输入服务器 URL 和 API 令牌 :提供您要导入的集群的服务器 URL 和 API 令牌。
    • kubeconfig :复制并粘贴您要导入的集群 kubeconfig 文件的内容。
  4. 可选: 在集群详情页中配置 Cluster API address,它为运行 oc get managedcluster 命令时在表中显示的 URL。

    1. 使用具有 cluster-admin 权限的 ID 登录到 hub 集群。
    2. 为目标受管集群配置 kubectl

      请参阅支持的供应商了解如何配置 kubectl

    3. 输入以下命令编辑您要导入的集群的受管集群条目:

      oc edit managedcluster <cluster-name>

      使用受管集群的名称替换 cluster-name

    4. 在 YAML 文件中的 ManagedCluster spec 中添加 ManagedClusterClientConfigs,如下例所示:

      spec:
        hubAcceptsClient: true
        managedClusterClientConfigs:
        - url: https://multicloud-console.apps.new-managed.dev.redhat.com

      将 URL 值替换为提供对您要导入的受管集群的外部访问的 URL。

集群已导入。您可以选择 Import another 来导入另一个。

1.7.1.3. 删除导入的集群

完成以下步骤以删除导入的集群以及在受管集群上创建的 open-cluster-management-agent-addon

Clusters 页面上,点 Actions > Detach cluster 从管理中删除集群。

注意: 如果您试图分离名为 local-cluster 的 hub 集群,请注意 disableHub selfManagement 的默认设置为 false 。此设置会导致 hub 集群在分离时会重新导入自己并管理自己,并协调 MultiClusterHub 控制器。hub 集群可能需要几小时时间来完成分离过程并重新导入。如果要在等待进程完成后重新导入 hub 集群,您可以输入以下命令来重启 multiclusterhub-operator pod 并更快地重新导入:

oc delete po -n open-cluster-management `oc get pod -n open-cluster-management | grep multiclusterhub-operator| cut -d' ' -f1`

您可以通过将 disableHubSelfManagement 值改为 true 来更改 hub 集群的值,使其不会自动导入。如需更多信息,请参阅 disableHubSelfManagement 主题。

1.7.2. 使用 CLI 导入受管集群

安装 Red Hat Advanced Cluster Management for Kubernetes 后,就可以使用 Red Hat OpenShift Container Platform CLI 导入集群来管理。您可以使用您要导入的集群的 kubeconfig 文件导入集群,也可以在要导入的集群中手动运行导入命令。这两个流程都已被记录在文档中。

重要: hub 集群无法管理不同的 hub 集群。hub 集群被设置为自动导入并管理自己。您不必手动导入 hub 集群来自己管理。

但是,如果您删除 hub 集群并尝试再次导入它,则需要添加 local-cluster:true 标签。

1.7.2.1. 先决条件

  • 您需要一个已部署的 Red Hat Advanced Cluster Management for Kubernetes hub 集群。如果要导入裸机集群,则必须在 Red Hat OpenShift Container Platform 版本 4.6 或更高版本上安装了 hub 集群。
  • 您需要一个需要管理的独立集群,且具有互联网连接。
  • 您需要 Red Hat OpenShift Container Platform CLI 版本 4.6 或更高版本来运行 oc 命令。如需有关安装和配置 Red Hat OpenShift Container Platform CLI oc 的信息,请参阅 OpenShift CLI 入门
  • 您需要安装 Kubernetes CLI kubectl。要安装 kubectl,请参阅 Kubernetes 文档中的安装和设置 kubectl

    注: 通过控制台下载 CLI 工具的安装文件。

  • 如果您导入不是由 OpenShift Container Platform 创建的集群,则需要定义一个 multiclusterhub.spec.imagePullSecret。安装 Red Hat Advanced Cluster Management for Kubernetes 时可能已创建此 secret。如需有关定义 secret 的更多信息,请参阅自定义 Image Pull Secret

1.7.2.2. 支持的构架

  • Linux (x86_64, s390x, ppc64le)
  • macOS

1.7.2.3. 准备导入

  1. 运行以下命令登录到您的 hub 集群

    oc login
  2. 在 hub 集群中运行以下命令以创建项目和命名空间: 请注意: CLUSTER_NAME 中定义的集群名称也用作 YAML 文件和命令中的集群命名空间:

    oc new-project ${CLUSTER_NAME}

    重要: cluster.open-cluster-management.io/managedCluster 标签会自动添加到受管集群命名空间中并从中删除。不要手动将其添加到受管集群或从受管集群中删除。

  3. 使用以下示例内容,创建一个名为 managed-cluster.yaml 的文件:

    apiVersion: cluster.open-cluster-management.io/v1
    kind: ManagedCluster
    metadata:
      name: ${CLUSTER_NAME}
      labels:
        cloud: auto-detect
        vendor: auto-detect
    spec:
      hubAcceptsClient: true

    cloudvendor 的值被设置为 auto-detect 时,Red Hat Advanced Cluster Management 会检测您要导入的集群的云和厂商类型。您可以选择将 auto-detect 的值替换为集群的 cloud 和 vendor 值。请参见以下示例:

    cloud: Amazon
    vendor: OpenShift
  4. 输入以下命令将 YAML 文件应用到 ManagedCluster 资源:

    oc apply -f managed-cluster.yaml

使用自动导入 secret使用手动命令导入集群继续导入集群。

1.7.2.4. 使用自动导入 secret 导入集群

要使用自动导入 secret,您必须创建一个 secret,其中包含集群的 kubeconfig 文件或 kube API 服务器和集群的令牌对。

  1. 检索您要导入的集群的 kubeconfig 文件或 kube API 服务器和令牌。请参阅 Kubernetes 集群的文档,了解在哪里可以找到您的 kubeconfig 文件或 kube API 服务器和令牌。
  2. 在 ${CLUSTER_NAME} 命名空间中创建 auto-import-secret.yaml 文件。

    1. 创建名为 auto-import-secret.yaml 的 YAML 文件,其中包含类似以下模板的内容:

      apiVersion: v1
      kind: Secret
      metadata:
        name: auto-import-secret
        namespace: <cluster_name>
      stringData:
        autoImportRetry: "5"
        # If you are using the kubeconfig file, add the following value for the kubeconfig file
        # that has the current context set to the cluster to import:
        kubeconfig: |- <kubeconfig_file>
        # If you are using the token/server pair, add the following two values instead of
        # the kubeconfig file:
        token: <Token to access the cluster>
        server: <cluster_api_url>
      type: Opaque
    2. 使用以下命令应用 ${CLUSTER_NAME} 命名空间中的 YAML 文件:

      oc apply -f auto-import-secret.yaml

      注:默认情况下,自动导入 secret 只使用一次,在导入过程完成后会被删除。如果要保留自动导入 secret,请将 managedcluster-import-controller.open-cluster-management.io/keeping-auto-import-secret 添加到 secret。您可以运行以下命令来添加它:

    oc -n <cluster_name> annotate secrets auto-import-secret managedcluster-import-controller.open-cluster-management.io/keeping-auto-import-secret=""
  3. 验证您的导入集群的 JOINEDAVAILABLE 状态。在 hub 集群中运行以下命令:

    oc get managedcluster ${CLUSTER_NAME}
  4. 在受管集群中运行以下命令来登录到受管集群:

    oc login
  5. 运行以下命令,以验证您要导入的集群中的 pod 状态:

    oc get pod -n open-cluster-management-agent

继续 导入 klusterlet 附加组件

1.7.2.5. 使用手动命令导入集群

重要: 导入命令包含复制到每个导入集群的 pull secret 信息。具有访问导入集群权限的所有用户都可以查看 pull secret 信息。

  1. 运行以下命令,获取由导入控制器在 hub 集群上生成的 klusterlet-crd.yaml 文件:

    oc get secret ${CLUSTER_NAME}-import -n ${CLUSTER_NAME} -o jsonpath={.data.crds\\.yaml} | base64 --decode > klusterlet-crd.yaml
  2. 运行以下命令,获取导入控制器在 hub 集群上生成的 import.yaml 文件:

    oc get secret ${CLUSTER_NAME}-import -n ${CLUSTER_NAME} -o jsonpath={.data.import\\.yaml} | base64 --decode > import.yaml

    在要导入的集群中执行以下步骤:

  3. 输入以下命令登录到您导入的受管集群:

    oc login
  4. 运行以下命令应用您在第 1 步中生成的 klusterlet-crd.yaml

    oc apply -f klusterlet-crd.yaml
  5. 运行以下命令应用您之前生成的 import.yaml 文件:

    oc apply -f import.yaml
  6. 验证您要导入的集群的 JOINEDAVAILABLE 状态。在 hub 集群中运行以下命令:

    oc get managedcluster ${CLUSTER_NAME}

继续 导入 klusterlet 附加组件

1.7.2.6. 导入 klusterlet 附加组件

您可以通过完成以下步骤来创建并应用 klusterlet 附加组件配置文件:

  1. 创建一个类似以下示例的 YAML 文件:

    apiVersion: agent.open-cluster-management.io/v1
    kind: KlusterletAddonConfig
    metadata:
      name: <cluster_name>
      namespace: <cluster_name>
    spec:
      applicationManager:
        enabled: true
      certPolicyController:
        enabled: true
      iamPolicyController:
        enabled: true
      policyController:
        enabled: true
      searchCollector:
        enabled: true
  2. 将文件保存为 klusterlet-addon-config.yaml
  3. 运行以下命令来应用 YAML:

    oc apply -f klusterlet-addon-config.yaml

    ManagedCluster-Import-Controller 将生成一个名为 ${CLUSTER_NAME}-import 的 secret。${CLUSTER_NAME}-import secret 包括 import.yaml,用户会把它应用到一个受管集群来安装 klusterlet.

    附加组件安装在您导入的集群后为 AVAILABLE

  4. 运行以下命令,验证您要导入的集群上附加组件的 pod 状态:

    oc get pod -n open-cluster-management-agent-addon

集群现已导入。

1.7.2.7. 使用 CLI 删除导入的集群

要删除集群,请运行以下命令:

oc delete managedcluster ${CLUSTER_NAME}

cluster_name 替换为集群的名称。

您的集群现已被删除。

1.7.3. 使用自定义 ManagedClusterImageRegistry CRD 导入集群

有时您可能需要覆盖您要导入的受管集群中的镜像 registry。您可以通过创建一个 ManagedClusterImageRegistry 自定义资源定义(CRD)来完成此操作。

ManagedClusterImageRegistry CRD 是一个命名空间范围的资源。

ManagedClusterImageRegistry CRD 为要选择的放置指定一组受管集群,但需要与自定义镜像 registry 不同的镜像。使用新镜像更新受管集群后,会在每个受管集群中添加以下标签进行识别: open-cluster-management.io/image-registry=<namespace>.<managedClusterImageRegistryName>

以下示例显示了 ManagedClusterImageRegistry CRD:

apiVersion: imageregistry.open-cluster-management.io/v1alpha1
kind: ManagedClusterImageRegistry
metadata:
  name: <imageRegistryName>
  namespace: <namespace>
spec:
  placementRef:
    group: cluster.open-cluster-management.io
    resource: placements
    name: <placementName>
  pullSecret:
    name: <pullSecretName>
  registries:
  - mirror: <mirrored-image-registry-address>
    source: <image-registry-address>
  - mirror: <mirrored-image-registry-address>
    source: <image-registry-address>

spec 部分中:

  • placementName 替换为选择一组受管集群的放置名称。
  • pullSecretName 替换为用于从自定义镜像 registry 中拉取镜像的 pull secret 名称。
  • 列出每个 sourcemirror registry 的值。将 mirrored-image-registry-addressimage-registry-address 替换为每个 registry 的 mirrorsource 的值。

    • 示例 1:要将名为 registry.redhat.io/rhacm2 的源 registry 替换为 localhost:5000/rhacm2,并将 registry.redhat.io/multicluster-engine 替换为 localhost:5000/multicluster-engine,请使用以下示例:

      registries:
      - mirror: localhost:5000/rhacm2/
          source: registry.redhat.io/rhacm2
      - mirror: localhost:5000/multicluster-engine
          source: registry.redhat.io/multicluster-engine
    • 示例 2: 要将源镜像 registry.redhat.io/rhacm2/registration-rhel8-operator 替换为 localhost:5000/rhacm2-registration-rhel8-operator,请使用以下示例:

      registries:
      - mirror: localhost:5000/rhacm2-registration-rhel8-operator
          source: registry.redhat.io/rhacm2/registration-rhel8-operator

1.7.3.1. 使用 ManagedClusterImageRegistry CRD 导入集群

完成以下步骤,使用 ManagedClusterImageRegistry CRD 导入集群:

  1. 在您要导入集群的命名空间中创建 pull secret。对于这些步骤,是 myNamespace

    $ kubectl create secret docker-registry myPullSecret \
      --docker-server=<your-registry-server> \
      --docker-username=<my-name> \
      --docker-password=<my-password>
  2. 在您创建的命名空间中创建一个放置。

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: Placement
    metadata:
      name: myPlacement
      namespace: myNamespace
    spec:
      clusterSets:
      - myClusterSet
      tolerations:
      - key: "cluster.open-cluster-management.io/unreachable"
        operator: Exists

    注: 需要 unreachable 容限才能使配置来选择集群。

  3. 创建一个 ManagedClusterSet 资源,并将其绑定到命名空间。

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: ManagedClusterSet
    metadata:
      name: myClusterSet
    
    ---
    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: ManagedClusterSetBinding
    metadata:
      name: myClusterSet
      namespace: myNamespace
    spec:
      clusterSet: myClusterSet
  4. 在命名空间中创建 ManagedClusterImageRegistry CRD。

    apiVersion: imageregistry.open-cluster-management.io/v1alpha1
    kind: ManagedClusterImageRegistry
    metadata:
      name: myImageRegistry
      namespace: myNamespace
    spec:
      placementRef:
        group: cluster.open-cluster-management.io
        resource: placements
        name: myPlacement
      pullSecret:
        name: myPullSecret
      registry: myRegistryAddress
  5. 从 Red Hat Advanced Cluster Management 控制台导入受管集群,并将其添加到受管集群集中。
  6. 在标签 open-cluster-management.io/image-registry=myNamespace.myImageRegistry 添加到受管集群后,在受管集群中复制并运行导入命令。

1.7.4. 修改集群的 klusterlet 附加组件设置

您可以使用 hub 集群修改 KlusterletAddonConfig 的设置,以更改您的配置。

KlusterletAddonConfig 控制器根据 klusterletaddonconfigs.agent.open-cluster-management.io Kubernetes 资源中的设置管理启用和禁用的功能。查看以下 KlusterletAddonConfig 示例:

apiVersion: agent.open-cluster-management.io/v1
kind: KlusterletAddonConfig
metadata:
  name: <cluster-name>
  namespace: <cluster-name>
spec:
  clusterName: <cluster-name>
  clusterNamespace: <cluster-name>
  clusterLabels:
    cloud: auto-detect
    vendor: auto-detect
  applicationManager:
    enabled: true
  certPolicyController:
    enabled: true
  iamPolicyController:
    enabled: true
  policyController:
    enabled: true
  searchCollector:
    enabled: false
  version: 2.5.0

1.7.4.1. klusterlet 附加组件设置描述

以下设置可以在 klusterletaddonconfigs.agent.open-cluster-management.io Kubernetes 资源中更新:

表 1.2. klusterlet 附加组件设置列表

设置名称描述

applicationmanager

truefalse

此控制器在受管集群中管理应用程序订阅生命周期。

certPolicyController

truefalse

此控制器在受管集群中强制实施基于证书的策略。

iamPolicyController

truefalse

此控制器在受管集群上强制实施基于 IAM 的策略生命周期。

policyController

truefalse

此控制器在受管集群上强制执行所有其他策略规则。

searchCollector

truefalse

此控制器用于定期将资源索引数据推送回 hub 集群。

1.7.4.2. 使用 hub 集群中的控制台进行修改

您可以使用 hub 集群修改 klusterletaddonconfigs.agent.open-cluster-management.io 资源设置。完成以下步骤以更改设置:

  1. 登录到 hub 集群的 Red Hat Advanced Cluster Management for Kubernetes 控制台。
  2. 在 hub 集群控制台的标头菜单中选择 Search 图标。
  3. 在搜索参数中输入以下值:kind:klusterletaddonconfigs
  4. 选择您要更新的端点资源。
  5. 找到 spec 部分并选择 Edit 以编辑内容。
  6. 修改设置。
  7. 选择 Save 以应用您的更改。

1.7.4.3. 使用 hub 集群中的命令行进行修改

您必须有权访问 cluster-name 命名空间才能使用 hub 集群修改设置。完成以下步骤:

  1. 登录到 hub 集群。
  2. 输入以下命令以编辑资源:

    kubectl edit klusterletaddonconfigs.agent.open-cluster-management.io <cluster-name> -n <cluster-name>
  3. 找到 spec 部分。
  4. 根据需要修改您的设置。