×

访问托管集群

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

先决条件

要通过直接从资源获取kubeconfig文件和凭据来访问托管集群,您必须熟悉托管集群的访问密钥。托管集群(托管)命名空间包含托管集群资源和访问密钥。托管控制平面命名空间是托管控制平面运行的位置。

密钥名称格式如下:

  • kubeconfig密钥:<托管集群命名空间>-<名称>-admin-kubeconfig。例如,clusters-hypershift-demo-admin-kubeconfig

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

kubeconfig 密钥包含一个 Base64 编码的 kubeconfig 字段,您可以对其进行解码并保存到文件中,然后使用以下命令。

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

kubeadmin 密码密钥也是 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

调整托管集群的 NodePool 对象大小

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

  • 当您按节点池扩展副本时,会创建一个机器。对于每台机器,集群 API 提供程序都会找到并安装一个满足节点池规范中指定要求的代理。您可以通过检查其状态和条件来监控代理的安装。

  • 缩减节点池时,代理会与相应的集群解除绑定。在您可以重用代理之前,必须使用 Discovery 镜像重新启动它们。

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

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

    集群 API 代理提供程序会随机选择两个代理,然后将其分配给托管集群。这些代理会经历不同的状态,最终作为 OpenShift Container Platform 节点加入托管集群。代理按以下顺序经过各个状态:

    • 绑定 (binding)

    • 发现 (discovering)

    • 不足 (insufficient)

    • 安装 (installing)

    • 安装中 (installing-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. 输入提取命令获取新托管集群的 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

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

  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 集群操作符缺失。

  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

添加节点池

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

步骤
  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> 替换为工作节点数,例如 2
    4 --agentLabelSelector 标志是可选的。节点池使用带有 size=medium 标签的代理。
  2. 通过列出 clusters 命名空间中的 nodepool 资源来检查节点池的状态

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

    $ 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

为托管集群启用节点自动缩放

当您的托管集群需要更多容量并且有备用代理可用时,您可以启用自动缩放来安装新的工作节点。

步骤
  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 密钥

    $ 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,您必须手动删除计算节点。

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

禁用托管集群的节点自动缩放

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

步骤
  • 输入以下命令以禁用托管集群的节点自动缩放

    $ 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" 设置为您指定的整数值。

处理裸机托管集群中的入口

每个 OpenShift Container Platform 集群都有一个默认的应用程序入口控制器,通常与其关联一个外部 DNS 记录。例如,如果您创建一个名为 example、基础域为 krnl.es 的托管集群,则可以预期通配符域 *.apps.example.krnl.es 是可路由的。

步骤

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

  1. 通过创建一个包含 MetalLB 运算符配置的 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. 运算符运行后,创建 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文件,配置一个新的负载均衡器服务,将入口流量路由到入口部署。

      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

启用裸机上的机器健康检查

您可以启用裸机上的机器健康检查,以自动修复和替换不健康的托管集群节点。您必须拥有已准备好安装在托管集群中的其他代理机器。

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

  • 您不能修改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. 通过运行以下命令验证NodePool资源是否已更新为autoRepair: true

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

禁用裸机上的机器健康检查

要禁用托管集群节点的机器健康检查,请修改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