5.2. 在裸机上管理托管的 control plane


在裸机上部署托管的 control plane 后,您可以通过完成以下任务来管理托管集群。

5.2.1. 访问托管集群

您可以通过直接从资源获取 kubeconfig 文件和 kubeadmin 凭证来访问托管集群,或使用 hcp 命令行界面生成 kubeconfig 文件。

先决条件

要通过直接从资源获取 kubeconfig 文件和凭证来访问托管集群,您必须熟悉托管集群的访问 secret。托管的集群(hosting) 命名空间包含托管的集群资源和访问 secret。托管 control plane 命名空间是托管 control plane 运行的位置。

secret 名称格式如下:

  • kubeconfig secret: <hosted_cluster_namespace>-<name>-admin-kubeconfig。例如 clusters-hypershift-demo-admin-kubeconfig
  • kubeadmin 密码 secret: <hosted_cluster_namespace>-<name>-kubeadmin-password。例如,clusters-hypershift-demo-kubeadmin-password

kubeconfig secret 包含一个 Base64 编码的 kubeconfig 字段,您可以解码并保存到要使用以下命令使用的文件中:

$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes

kubeadmin 密码 secret 也为 Base64 编码的。您可以对它进行解码,并使用密码登录到托管集群的 API 服务器或控制台。

流程

  • 要使用 hcp CLI 访问托管集群来生成 kubeconfig 文件,请执行以下步骤:

    1. 输入以下命令生成 kubeconfig 文件:

      $ hcp create kubeconfig --namespace <hosted_cluster_namespace> --name <hosted_cluster_name> > <hosted_cluster_name>.kubeconfig
    2. 保存 kubeconfig 文件后,您可以输入以下示例命令来访问托管集群:

      $ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes

5.2.2. 为托管集群扩展 NodePool 对象

您可以通过在托管集群中添加节点来扩展 NodePool 对象。当您扩展节点池时,请考虑以下信息:

  • 当您由节点池扩展副本时,会创建一个机器。对于每台机器,Cluster API 供应商会找到并安装一个满足节点池规格中指定的要求的 Agent。您可以通过检查其状态和条件来监控代理的安装。
  • 当您缩减节点池时,代理会从对应的集群绑定。在重复使用代理前,您必须使用 Discovery 镜像重启它们。

流程

  1. NodePool 对象扩展到两个节点:

    $ oc -n <hosted_cluster_namespace> scale nodepool <nodepool_name> --replicas 2

    Cluster API 代理供应商会随机选择两个分配给托管集群的代理。这些代理会经历不同的状态,最终将托管集群作为 OpenShift Container Platform 节点加入。代理按以下顺序传递状态:

    • binding
    • discovering
    • insufficient
    • installing
    • install-in-progress
    • added-to-existing-cluster
  2. 输入以下命令:

    $ oc -n <hosted_control_plane_namespace> get agent

    输出示例

    NAME                                   CLUSTER         APPROVED   ROLE          STAGE
    4dac1ab2-7dd5-4894-a220-6a3473b67ee6   hypercluster1   true       auto-assign
    d9198891-39f4-4930-a679-65fb142b108b                   true       auto-assign
    da503cf1-a347-44f2-875c-4960ddb04091   hypercluster1   true       auto-assign

  3. 输入以下命令:

    $ oc -n <hosted_control_plane_namespace> get agent -o jsonpath='{range .items[*]}BMH: {@.metadata.labels.agent-install\.openshift\.io/bmh} Agent: {@.metadata.name} State: {@.status.debugInfo.state}{"\n"}{end}'

    输出示例

    BMH: ocp-worker-2 Agent: 4dac1ab2-7dd5-4894-a220-6a3473b67ee6 State: binding
    BMH: ocp-worker-0 Agent: d9198891-39f4-4930-a679-65fb142b108b State: known-unbound
    BMH: ocp-worker-1 Agent: da503cf1-a347-44f2-875c-4960ddb04091 State: insufficient

  4. 输入 extract 命令,获取新的托管集群的 kubeconfig :

    $ oc extract -n <hosted_cluster_namespace> secret/<hosted_cluster_name>-admin-kubeconfig --to=- > kubeconfig-<hosted_cluster_name>
  5. 代理访问 added-to-existing-cluster 状态后,输入以下命令验证是否可以看到托管的集群中的 OpenShift Container Platform 节点:

    $ oc --kubeconfig kubeconfig-<hosted_cluster_name> get nodes

    输出示例

    NAME           STATUS   ROLES    AGE     VERSION
    ocp-worker-1   Ready    worker   5m41s   v1.24.0+3882f8f
    ocp-worker-2   Ready    worker   6m3s    v1.24.0+3882f8f

    集群 Operator 开始通过向节点添加工作负载来协调。

  6. 输入以下命令验证在扩展 NodePool 对象时是否创建了两台机器:

    $ oc -n <hosted_control_plane_namespace> get machines

    输出示例

    NAME                            CLUSTER               NODENAME       PROVIDERID                                     PHASE     AGE   VERSION
    hypercluster1-c96b6f675-m5vch   hypercluster1-b2qhl   ocp-worker-1   agent://da503cf1-a347-44f2-875c-4960ddb04091   Running   15m   4.x.z
    hypercluster1-c96b6f675-tl42p   hypercluster1-b2qhl   ocp-worker-2   agent://4dac1ab2-7dd5-4894-a220-6a3473b67ee6   Running   15m   4.x.z

    clusterversion 协调过程最终达到缺少 Ingress 和 Console 集群 Operator 的时间点。

  7. 输入以下命令:

    $ oc --kubeconfig kubeconfig-<hosted_cluster_name> get clusterversion,co

    输出示例

    NAME                                         VERSION   AVAILABLE   PROGRESSING   SINCE   STATUS
    clusterversion.config.openshift.io/version             False       True          40m     Unable to apply 4.x.z: the cluster operator console has not yet successfully rolled out
    
    NAME                                                                             VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
    clusteroperator.config.openshift.io/console                                      4.12z     False       False         False      11m     RouteHealthAvailable: failed to GET route (https://console-openshift-console.apps.hypercluster1.domain.com): Get "https://console-openshift-console.apps.hypercluster1.domain.com": dial tcp 10.19.3.29:443: connect: connection refused
    clusteroperator.config.openshift.io/csi-snapshot-controller                      4.12z     True        False         False      10m
    clusteroperator.config.openshift.io/dns                                          4.12z     True        False         False      9m16s

5.2.2.1. 添加节点池

您可以通过指定名称、副本数和任何其他信息,如代理标签选择器,为托管集群创建节点池。

流程

  1. 要创建节点池,请输入以下信息:

    $ hcp create nodepool agent \
      --cluster-name <hosted_cluster_name> \1
      --name <nodepool_name> \2
      --node-count <worker_node_count> \3
      --agentLabelSelector size=medium 4
    1
    <hosted_cluster_name> 替换为托管集群的名称。
    2
    <nodepool_name> 替换为节点池的名称,例如 <hosted_cluster_name>-extra-cpu
    3
    <worker_node_count> 替换为 worker 节点数,例如 2
    4
    --agentLabelSelector 标志是可选的。节点池使用带有 size=medium 标签的代理。
  2. 通过列出 cluster 命名空间中的 nodepool 资源来检查节点池的状态:

    $ oc get nodepools --namespace clusters
  3. 输入以下命令提取 admin-kubeconfig secret:

    $ oc extract -n <hosted_control_plane_namespace> secret/admin-kubeconfig --to=./hostedcluster-secrets --confirm

    输出示例

    hostedcluster-secrets/kubeconfig

  4. 一段时间后,您可以输入以下命令来检查节点池的状态:

    $ oc --kubeconfig ./hostedcluster-secrets get nodes

验证

  • 输入以下命令验证可用节点池的数量是否与预期的节点池数量匹配:

    $ oc get nodepools --namespace clusters

5.2.2.2. 为托管集群启用节点自动扩展

当托管集群和备用代理有更多容量时,您可以启用自动扩展来安装新的 worker 节点。

流程

  1. 要启用自动扩展,请输入以下命令:

    $ oc -n <hosted_cluster_namespace> patch nodepool <hosted_cluster_name> --type=json -p '[{"op": "remove", "path": "/spec/replicas"},{"op":"add", "path": "/spec/autoScaling", "value": { "max": 5, "min": 2 }}]'
    注意

    在示例中,最少的节点数量为 2,最大值为 5。添加的最大节点数可能会被您的平台绑定。例如,如果您使用 Agent 平台,则最大节点数量由可用代理数量绑定。

  2. 创建需要新节点的工作负载。

    1. 使用以下示例创建一个包含工作负载配置的 YAML 文件:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        creationTimestamp: null
        labels:
          app: reversewords
        name: reversewords
        namespace: default
      spec:
        replicas: 40
        selector:
          matchLabels:
            app: reversewords
        strategy: {}
        template:
          metadata:
            creationTimestamp: null
            labels:
              app: reversewords
          spec:
            containers:
            - image: quay.io/mavazque/reversewords:latest
              name: reversewords
              resources:
                requests:
                  memory: 2Gi
      status: {}
    2. 将文件保存为 workload-config.yaml
    3. 输入以下命令应用 YAML:

      $ oc apply -f workload-config.yaml
  3. 输入以下命令提取 admin-kubeconfig secret:

    $ oc extract -n <hosted_cluster_namespace> secret/<hosted_cluster_name>-admin-kubeconfig --to=./hostedcluster-secrets --confirm

    输出示例

    hostedcluster-secrets/kubeconfig

  4. 您可以输入以下命令来检查新节点是否处于 Ready 状态:

    $ oc --kubeconfig ./hostedcluster-secrets get nodes
  5. 要删除节点,请输入以下命令删除工作负载:

    $ oc --kubeconfig ./hostedcluster-secrets -n <namespace> delete deployment <deployment_name>
  6. 等待几分钟,无需额外容量。在 Agent 平台上,代理已停用,可以被重复使用。您可以输入以下命令确认节点已被删除:

    $ oc --kubeconfig ./hostedcluster-secrets get nodes
注意

对于 IBM Z 代理,计算节点只适用于带有 KVM 代理的 IBM Z。对于 z/VM 和 LPAR,您必须手动删除计算节点。

代理只能用于带有 KVM 的 IBM Z。对于 z/VM 和 LPAR,重新创建代理以将其用作计算节点。

5.2.2.3. 为托管集群禁用节点自动扩展

要禁用节点自动扩展,请完成以下步骤。

流程

  • 输入以下命令为托管集群禁用节点自动扩展:

    $ oc -n <hosted_cluster_namespace> patch nodepool <hosted_cluster_name> --type=json -p '[\{"op":"remove", "path": "/spec/autoScaling"}, \{"op": "add", "path": "/spec/replicas", "value": <specify_value_to_scale_replicas>]'

    命令从 YAML 文件中删除 "spec.autoScaling",并添加 "spec.replicas",并将 "spec.replicas" 设置为您指定的整数值。

5.2.3. 在裸机上的托管集群中处理 ingress

每个 OpenShift Container Platform 集群都有一个默认应用程序 Ingress Controller,它通常关联有一个外部 DNS 记录。例如,如果您创建一个名为 example 的托管集群,其基域为 krnl.es,您可以预期通配符域 *.apps.example.krnl.es 可以被路由。

流程

要为 *.apps 域设置负载均衡器和通配符 DNS 记录,请在客户机集群上执行以下操作:

  1. 通过创建包含 MetalLB Operator 配置的 YAML 文件来部署 MetalLB:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: metallb
      labels:
        openshift.io/cluster-monitoring: "true"
      annotations:
        workload.openshift.io/allowed: management
    ---
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: metallb-operator-operatorgroup
      namespace: metallb
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: metallb-operator
      namespace: metallb
    spec:
      channel: "stable"
      name: metallb-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
  2. 将文件保存为 metallb-operator-config.yaml
  3. 输入以下命令应用配置:

    $ oc apply -f metallb-operator-config.yaml
  4. Operator 运行后,创建 MetalLB 实例:

    1. 创建包含 MetalLB 实例的配置的 YAML 文件:

      apiVersion: metallb.io/v1beta1
      kind: MetalLB
      metadata:
        name: metallb
        namespace: metallb
    2. 将文件保存为 metallb-instance-config.yaml
    3. 输入以下命令创建 MetalLB 实例:

      $ oc apply -f metallb-instance-config.yaml
  5. 使用单个 IP 地址创建 IPAddressPool 资源。此 IP 地址必须与集群节点使用的网络位于同一个子网中。

    1. 创建一个文件,如 ipaddresspool.yaml,其内容类似以下示例:

      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        namespace: metallb
        name: <ip_address_pool_name> 1
      spec:
        addresses:
          - <ingress_ip>-<ingress_ip> 2
        autoAssign: false
      1
      指定 IPAddressPool 资源名称。
      2
      指定环境的 IP 地址。例如: 192.168.122.23
    2. 输入以下命令为 IP 地址池应用配置:

      $ oc apply -f ipaddresspool.yaml
  6. 创建 L2 广告。

    1. 创建一个文件,如 l2advertisement.yaml,内容类似以下示例:

      apiVersion: metallb.io/v1beta1
      kind: L2Advertisement
      metadata:
        name: <l2_advertisement_name> 1
        namespace: metallb
      spec:
        ipAddressPools:
         - <ip_address_pool_name> 2
      1
      指定 L2Advertisement 资源名称。
      2
      指定 IPAddressPool 资源名称。
    2. 输入以下命令应用配置:

      $ oc apply -f l2advertisement.yaml
  7. 创建 LoadBalancer 类型的服务后,MetalLB 为该服务添加外部 IP 地址。

    1. 配置一个新的负载均衡器服务,通过创建名为 metallb-loadbalancer-service.yaml 的 YAML 文件将入口流量路由到 ingress 部署:

      kind: Service
      apiVersion: v1
      metadata:
        annotations:
          metallb.universe.tf/address-pool: ingress-public-ip
        name: metallb-ingress
        namespace: openshift-ingress
      spec:
        ports:
          - name: http
            protocol: TCP
            port: 80
            targetPort: 80
          - name: https
            protocol: TCP
            port: 443
            targetPort: 443
        selector:
          ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
        type: LoadBalancer
    2. 保存 metallb-loadbalancer-service.yaml 文件。
    3. 输入以下命令应用 YAML 配置:

      $ oc apply -f metallb-loadbalancer-service.yaml
    4. 输入以下命令访问 OpenShift Container Platform 控制台:

      $ curl -kI https://console-openshift-console.apps.example.krnl.es

      输出示例

      HTTP/1.1 200 OK

    5. 检查 clusterversionclusteroperator 值,以验证所有内容是否正在运行。输入以下命令:

      $ oc --kubeconfig <hosted_cluster_name>.kubeconfig get clusterversion,co

      输出示例

      NAME                                         VERSION   AVAILABLE   PROGRESSING   SINCE   STATUS
      clusterversion.config.openshift.io/version   4.x.y      True        False        3m32s   Cluster version is 4.x.y
      
      NAME                                                                             VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
      clusteroperator.config.openshift.io/console                                      4.x.y     True        False         False      3m50s
      clusteroperator.config.openshift.io/ingress                                      4.x.y     True        False         False      53m

      <4.x.y > 替换为您要使用的受支持 OpenShift Container Platform 版本,如 4.17.0-multi

5.2.4. 在裸机上启用机器健康检查

您可以在裸机上启用机器健康检查,以修复并自动替换不健康的受管集群节点。您必须具有可在受管集群上安装的附加代理机器。

在启用机器健康检查前请考虑以下限制:

  • 您无法修改 MachineHealthCheck 对象。
  • 只有在至少有两个节点处于 FalseUnknown 状态超过 8 分钟时,机器健康检查才会替换节点。

为受管集群节点启用机器健康检查后,MachineHealthCheck 对象会在托管集群中创建。

流程

要在托管集群中启用机器健康检查,请修改 NodePool 资源。完成以下步骤:

  1. 验证 NodePool 资源中的 spec.nodeDrainTimeout 值是否大于 0s。将 <hosted_cluster_namespace> 替换为托管集群命名空间的名称,将 <nodepool_name> 替换为节点池名称。运行以下命令:

    $ oc get nodepool -n <hosted_cluster_namespace> <nodepool_name> -o yaml | grep nodeDrainTimeout

    输出示例

    nodeDrainTimeout: 30s

  2. 如果 spec.nodeDrainTimeout 值不大于 0s,请运行以下命令修改值:

    $ oc patch nodepool -n <hosted_cluster_namespace> <nodepool_name> -p '{"spec":{"nodeDrainTimeout": "30m"}}' --type=merge
  3. 通过将 NodePool 资源中的 spec.management.autoRepair 字段设置为 true 来启用机器健康检查。运行以下命令:

    $ oc patch nodepool -n <hosted_cluster_namespace> <nodepool_name> -p '{"spec": {"management": {"autoRepair":true}}}' --type=merge
  4. 运行以下命令,使用 autoRepair: true 值验证 NodePool 资源是否已更新:

    $ oc get nodepool -n <hosted_cluster_namespace> <nodepool_name> -o yaml | grep autoRepair

5.2.5. 在裸机上禁用机器健康检查

要禁用受管集群节点的机器健康检查,请修改 NodePool 资源。

流程

  1. 通过将 NodePool 资源中的 spec.management.autoRepair 字段设置为 false 来禁用机器健康检查。运行以下命令:

    $ oc patch nodepool -n <hosted_cluster_namespace> <nodepool_name> -p '{"spec": {"management": {"autoRepair":false}}}' --type=merge
  2. 运行以下命令,验证 NodePool 资源是否使用 autoRepair: false 值更新:

    $ oc get nodepool -n <hosted_cluster_namespace> <nodepool_name> -o yaml | grep autoRepair
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.