×

访问托管集群

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

先决条件

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

密钥名称格式如下:

  • kubeconfig 密钥:<hosted_cluster_namespace>-<name>-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 提供程序都会找到并安装满足节点池规范中指定的 requirement 的代理。您可以通过检查其状态和条件来监控代理的安装。

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

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

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

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

    • 绑定

    • 发现

    • 不足

    • 安装

    • 安装中

    • 添加到现有集群

  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。您可以添加的节点的最大数量可能受您的平台限制。例如,如果您使用代理平台,则节点的最大数量受可用代理数量的限制。

  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. 您可以通过输入以下命令检查新节点是否处于就绪状态:

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

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

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

对于 IBM Z 代理,仅对于带有 KVM 代理的 IBM Z,才会将计算节点与集群分离。对于 z/VM 和 LPAR,您必须手动删除计算节点。

只有对于带有 KVM 的 IBM Z,才能重复使用代理。对于 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"设置为指定的整数值。

处理非裸机代理机器上的托管集群中的 Ingress

每个 OpenShift Container Platform 集群都有一个默认的应用程序 Ingress Controller,通常与其关联一个外部 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 文件,配置一个新的负载均衡器服务,将 Ingress 流量路由到 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

在非裸机代理机器上启用机器健康检查

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

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

  • 您无法修改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