第 10 章 单节点 OpenShift 集群的 worker 节点


10.1. 将 worker 节点添加到单节点 OpenShift 集群

单节点 OpenShift 集群可减少部署到单个主机的主机先决条件。这对在受限环境或网络边缘的环境中部署非常有用。但是,有时您需要为集群添加额外的容量,例如在电信和网络边缘场景中。在这种情况下,您可以将 worker 节点添加到单节点集群中。

注意

与多节点集群不同,默认所有入口流量都路由到单一 control-plane 节点,即使添加了额外的 worker 节点。

您可以通过几种方法将 worker 节点添加到单节点集群中。您可以使用 Red Hat OpenShift Cluster Manager 手动将 worker 节点添加到集群中,或者直接使用 Assisted Installer REST API。

重要

添加 worker 节点不会扩展集群 control plane,它不为集群提供高可用性。对于单节点 OpenShift 集群,通过故障转移到另一站点来处理高可用性。将 worker 节点添加到单节点 OpenShift 集群时,建议最多测试两个 worker 节点。超过推荐的 worker 节点数量可能会导致整体性能较低,包括集群失败。

注意

要添加 worker 节点,您必须有权访问 OpenShift Cluster Manager。当使用基于 Agent 的安装程序在断开连接的环境中安装集群时,不支持此方法。

10.1.1. 安装单节点 OpenShift worker 节点的要求

要安装单节点 OpenShift worker 节点,您必须处理以下要求:

  • 管理主机:您必须有一个计算机准备 ISO 和监控安装。
  • Production-grade server: 安装单节点 OpenShift worker 节点需要有足够资源的服务器才能运行 OpenShift Container Platform 服务和生产环境工作负载。

    表 10.1. 最低资源要求
    profilevCPUmemoryStorage

    最小值

    2 个 vCPU 内核

    8GB RAM

    100GB

    注意

    当未启用并发多线程(SMT)或超线程时,一个 vCPU 相当于一个物理内核。启用后,使用以下公式来计算对应的比率:

    (每个内核的线程数 x 内核数)x 插槽数 = vCPU

    使用虚拟介质引导时,服务器必须具有基板管理控制器(BMC)。

  • 网络: 如果服务器没有连接到可路由的网络,则 worker 节点服务器必须可以访问互联网或访问本地 registry。worker 节点服务器必须具有 DHCP 保留或静态 IP 地址,并可访问单节点 OpenShift 集群 Kubernetes API、入口路由和集群节点域名。您必须将 DNS 配置为将 IP 地址解析到单节点 OpenShift 集群以下每个完全限定域名 (FQDN):

    表 10.2. 所需的 DNS 记录
    用法FQDN描述

    Kubernetes API

    api.<cluster_name>.<base_domain>

    添加 DNS A/AAAA 或 CNAME 记录。此记录必须由集群外的客户端解析。

    内部 API

    api-int.<cluster_name>.<base_domain>

    在手动创建 ISO 时,添加 DNS A/AAAA 或 CNAME 记录。此记录必须由集群内的节点解析。

    Ingress 路由

    *.apps.<cluster_name>.<base_domain>

    添加以节点为目标的通配符 DNS A/AAAA 或 CNAME 记录。此记录必须由集群外的客户端解析。

    如果没有持久的 IP 地址,apiserveretcd 之间的通信可能会失败。

10.1.2. 使用 Assisted Installer 和 OpenShift Cluster Manager 添加 worker 节点

您可以使用 Assisted Installer 将 worker 节点添加到 Red Hat OpenShift Cluster Manager 上创建的单节点 OpenShift 集群。

重要

只有在运行 OpenShift Container Platform 版本 4.11 并已启动的集群才支持将 worker 节点添加到单节点 OpenShift 集群。

先决条件

  • 使用辅助安装程序访问安装的单节点 OpenShift 集群。
  • 安装 OpenShift CLI (oc) 。
  • 以具有 cluster-admin 特权的用户身份登录。
  • 确保将 worker 节点添加到集群中的集群需要的所有 DNS 记录。

流程

  1. 登录到 OpenShift Cluster Manager,并点您要添加 worker 节点的单节点集群。
  2. Add hosts,再下载新 worker 节点的发现 ISO,添加 SSH 公钥和配置集群范围的代理设置。
  3. 使用发现 ISO 引导目标主机,并等待在控制台中发现主机。主机被发现后,开始安装。
  4. 当安装继续进行时,安装会为 worker 节点生成待处理的证书签名请求 (CSR)。出现提示时,批准待处理的 CSR 以完成安装。

    当 worker 节点正常运行时,它会作为集群 web 控制台中的 worker 节点列出。

重要

新的 worker 节点将使用与原始集群相同的方法进行加密。

10.1.3. 使用 Assisted Installer API 添加 worker 节点

您可以使用 Assisted Installer REST API 将 worker 节点添加到单节点 OpenShift 集群。在添加 worker 节点前,您必须登录到 OpenShift Cluster Manager 并针对 API 进行身份验证。

10.1.3.1. 针对 Asssisted Installer REST API 进行身份验证

在使用 Assisted Installer REST API 之前,您必须使用您生成的 JSON Web 令牌 (JWT) 进行身份验证。

先决条件

流程

  1. 登录到 OpenShift Cluster Manager 并复制您的 API 令牌。
  2. 运行以下命令,使用复制的 API 令牌设置 $OFFLINE_TOKEN 变量:

    $ export OFFLINE_TOKEN=<copied_api_token>
  3. 使用之前设置的 $OFFLINE_TOKEN 变量来设置 $JWT_TOKEN 变量:

    $ export JWT_TOKEN=$(
      curl \
      --silent \
      --header "Accept: application/json" \
      --header "Content-Type: application/x-www-form-urlencoded" \
      --data-urlencode "grant_type=refresh_token" \
      --data-urlencode "client_id=cloud-services" \
      --data-urlencode "refresh_token=${OFFLINE_TOKEN}" \
      "https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token" \
      | jq --raw-output ".access_token"
    )
    注意

    JWT 令牌仅会有效 15 分钟。

验证

  • 可选:运行以下命令来检查您可以访问 API:

    $ curl -s https://api.openshift.com/api/assisted-install/v2/component-versions -H "Authorization: Bearer ${JWT_TOKEN}" | jq

    输出示例

    {
        "release_tag": "v2.5.1",
        "versions":
        {
            "assisted-installer": "registry.redhat.io/rhai-tech-preview/assisted-installer-rhel8:v1.0.0-175",
            "assisted-installer-controller": "registry.redhat.io/rhai-tech-preview/assisted-installer-reporter-rhel8:v1.0.0-223",
            "assisted-installer-service": "quay.io/app-sre/assisted-service:ac87f93",
            "discovery-agent": "registry.redhat.io/rhai-tech-preview/assisted-installer-agent-rhel8:v1.0.0-156"
        }
    }

10.1.3.2. 使用 Assisted Installer REST API 添加 worker 节点

您可以使用 Assisted Installer REST API 将 worker 节点添加到集群中。

先决条件

  • 安装 OpenShift Cluster Manager CLI (ocm)。
  • 以具有集群创建权限的用户身份登录 OpenShift Cluster Manager
  • 安装 jq
  • 确保将 worker 节点添加到集群中的集群需要的所有 DNS 记录。

流程

  1. 针对引导安装程序 REST API 进行身份验证,并为会话生成 JSON Web 令牌 (JWT)。生成的 JWT 令牌仅会有效 15 分钟。
  2. 运行以下命令设置 $API_URL 变量:

    $ export API_URL=<api_url> 1
    1
    <api_url> 替换为 Assisted Installer API URL,例如 https://api.openshift.com
  3. 运行以下命令导入单节点 OpenShift 集群:

    1. 设置 $OPENSHIFT_CLUSTER_ID 变量。登录到集群并运行以下命令:

      $ export OPENSHIFT_CLUSTER_ID=$(oc get clusterversion -o jsonpath='{.items[].spec.clusterID}')
    2. 设置用于导入集群的 $CLUSTER_REQUEST 变量:

      $ export CLUSTER_REQUEST=$(jq --null-input --arg openshift_cluster_id "$OPENSHIFT_CLUSTER_ID" '{
        "api_vip_dnsname": "<api_vip>", 1
        "openshift_cluster_id": $openshift_cluster_id,
        "name": "<openshift_cluster_name>" 2
      }')
      1
      <api_vip> 替换为集群 API 服务器的主机名。这可以是 API 服务器的 DNS 域,也可以是 worker 节点可访问的单一节点的 IP 地址。例如: api.compute-1.example.com
      2
      <openshift_cluster_name> 替换为集群的纯文本名称。集群名称应与在第 1 天集群安装过程中设置的集群名称匹配。
    3. 导入集群并设置 $CLUSTER_ID 变量。运行以下命令:

      $ CLUSTER_ID=$(curl "$API_URL/api/assisted-install/v2/clusters/import" -H "Authorization: Bearer ${JWT_TOKEN}" -H 'accept: application/json' -H 'Content-Type: application/json' \
        -d "$CLUSTER_REQUEST" | tee /dev/stderr | jq -r '.id')
  4. 运行以下命令,为集群生成 InfraEnv 资源并设置 $INFRA_ENV_ID 变量:

    1. 从位于 console.redhat.com 的 Red Hat OpenShift Cluster Manager 下载 pull secret 文件。
    2. 设置 $INFRA_ENV_REQUEST 变量:

      export INFRA_ENV_REQUEST=$(jq --null-input \
          --slurpfile pull_secret <path_to_pull_secret_file> \1
          --arg ssh_pub_key "$(cat <path_to_ssh_pub_key>)" \2
          --arg cluster_id "$CLUSTER_ID" '{
        "name": "<infraenv_name>", 3
        "pull_secret": $pull_secret[0] | tojson,
        "cluster_id": $cluster_id,
        "ssh_authorized_key": $ssh_pub_key,
        "image_type": "<iso_image_type>" 4
      }')
      1
      <path_to_pull_secret_file> 替换为在 console.redhat.com 上从 Red Hat OpenShift Cluster Manager 下载的 pull secret 的本地文件的路径。
      2
      <path_to_ssh_pub_key> 替换为访问主机所需的公共 SSH 密钥的路径。如果没有设置这个值,则无法在发现模式下访问主机。
      3
      <infraenv_name> 替换为 InfraEnv 资源的纯文本名称。
      4
      <iso_image_type> 替换为 ISO 镜像类型,可以是 full-isominimal-iso
    3. $INFRA_ENV_REQUEST 发布到 /v2/infra-envs API,并设置 $INFRA_ENV_ID 变量:

      $ INFRA_ENV_ID=$(curl "$API_URL/api/assisted-install/v2/infra-envs" -H "Authorization: Bearer ${JWT_TOKEN}" -H 'accept: application/json' -H 'Content-Type: application/json' -d "$INFRA_ENV_REQUEST" | tee /dev/stderr | jq -r '.id')
  5. 运行以下命令,获取集群 worker 节点的发现 ISO 的 URL:

    $ curl -s "$API_URL/api/assisted-install/v2/infra-envs/$INFRA_ENV_ID" -H "Authorization: Bearer ${JWT_TOKEN}" | jq -r '.download_url'

    输出示例

    https://api.openshift.com/api/assisted-images/images/41b91e72-c33e-42ee-b80f-b5c5bbf6431a?arch=x86_64&image_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTYwMjYzNzEsInN1YiI6IjQxYjkxZTcyLWMzM2UtNDJlZS1iODBmLWI1YzViYmY2NDMxYSJ9.1EX_VGaMNejMhrAvVRBS7PDPIQtbOOc8LtG8OukE1a4&type=minimal-iso&version=$VERSION

  6. 下载 ISO:

    $ curl -L -s '<iso_url>' --output rhcos-live-minimal.iso 1
    1
    <iso_url> 替换为上一步中的 ISO URL。
  7. 从下载的 rhcos-live-minimal.iso 中引导新的 worker 主机。
  8. 获取没有安装的集群中的主机列表。继续运行以下命令,直到新主机显示:

    $ curl -s "$API_URL/api/assisted-install/v2/clusters/$CLUSTER_ID" -H "Authorization: Bearer ${JWT_TOKEN}" | jq -r '.hosts[] | select(.status != "installed").id'

    输出示例

    2294ba03-c264-4f11-ac08-2f1bb2f8c296

  9. 为新的 worker 节点设置 $HOST_ID 变量,例如:

    $ HOST_ID=<host_id> 1
    1
    <host_id> 替换为上一步中的主机 ID。
  10. 运行以下命令检查主机是否已就绪:

    注意

    确保复制整个命令,包括完整的 jq 表达式。

    $ curl -s $API_URL/api/assisted-install/v2/clusters/$CLUSTER_ID -H "Authorization: Bearer ${JWT_TOKEN}" | jq '
    def host_name($host):
        if (.suggested_hostname // "") == "" then
            if (.inventory // "") == "" then
                "Unknown hostname, please wait"
            else
                .inventory | fromjson | .hostname
            end
        else
            .suggested_hostname
        end;
    
    def is_notable($validation):
        ["failure", "pending", "error"] | any(. == $validation.status);
    
    def notable_validations($validations_info):
        [
            $validations_info // "{}"
            | fromjson
            | to_entries[].value[]
            | select(is_notable(.))
        ];
    
    {
        "Hosts validations": {
            "Hosts": [
                .hosts[]
                | select(.status != "installed")
                | {
                    "id": .id,
                    "name": host_name(.),
                    "status": .status,
                    "notable_validations": notable_validations(.validations_info)
                }
            ]
        },
        "Cluster validations info": {
            "notable_validations": notable_validations(.validations_info)
        }
    }
    ' -r

    输出示例

    {
      "Hosts validations": {
        "Hosts": [
          {
            "id": "97ec378c-3568-460c-bc22-df54534ff08f",
            "name": "localhost.localdomain",
            "status": "insufficient",
            "notable_validations": [
              {
                "id": "ntp-synced",
                "status": "failure",
                "message": "Host couldn't synchronize with any NTP server"
              },
              {
                "id": "api-domain-name-resolved-correctly",
                "status": "error",
                "message": "Parse error for domain name resolutions result"
              },
              {
                "id": "api-int-domain-name-resolved-correctly",
                "status": "error",
                "message": "Parse error for domain name resolutions result"
              },
              {
                "id": "apps-domain-name-resolved-correctly",
                "status": "error",
                "message": "Parse error for domain name resolutions result"
              }
            ]
          }
        ]
      },
      "Cluster validations info": {
        "notable_validations": []
      }
    }

  11. 当上一个命令显示主机就绪时,通过运行以下命令来使用 /v2/infra-envs/{infra_env_id}/hosts/{host_id}/actions/install API 开始安装:

    $ curl -X POST -s "$API_URL/api/assisted-install/v2/infra-envs/$INFRA_ENV_ID/hosts/$HOST_ID/actions/install"  -H "Authorization: Bearer ${JWT_TOKEN}"
  12. 当安装继续进行时,安装会为 worker 节点生成待处理的证书签名请求 (CSR)。

    重要

    您必须批准 CSR 才能完成安装。

    运行以下 API 调用以监控集群安装:

    $ curl -s "$API_URL/api/assisted-install/v2/clusters/$CLUSTER_ID" -H "Authorization: Bearer ${JWT_TOKEN}" | jq '{
        "Cluster day-2 hosts":
            [
                .hosts[]
                | select(.status != "installed")
                | {id, requested_hostname, status, status_info, progress, status_updated_at, updated_at, infra_env_id, cluster_id, created_at}
            ]
    }'

    输出示例

    {
      "Cluster day-2 hosts": [
        {
          "id": "a1c52dde-3432-4f59-b2ae-0a530c851480",
          "requested_hostname": "control-plane-1",
          "status": "added-to-existing-cluster",
          "status_info": "Host has rebooted and no further updates will be posted. Please check console for progress and to possibly approve pending CSRs",
          "progress": {
            "current_stage": "Done",
            "installation_percentage": 100,
            "stage_started_at": "2022-07-08T10:56:20.476Z",
            "stage_updated_at": "2022-07-08T10:56:20.476Z"
          },
          "status_updated_at": "2022-07-08T10:56:20.476Z",
          "updated_at": "2022-07-08T10:57:15.306369Z",
          "infra_env_id": "b74ec0c3-d5b5-4717-a866-5b6854791bd3",
          "cluster_id": "8f721322-419d-4eed-aa5b-61b50ea586ae",
          "created_at": "2022-07-06T22:54:57.161614Z"
        }
      ]
    }

  13. 可选: 运行以下命令以查看集群的所有事件:

    $ curl -s "$API_URL/api/assisted-install/v2/events?cluster_id=$CLUSTER_ID" -H "Authorization: Bearer ${JWT_TOKEN}" | jq -c '.[] | {severity, message, event_time, host_id}'

    输出示例

    {"severity":"info","message":"Host compute-0: updated status from insufficient to known (Host is ready to be installed)","event_time":"2022-07-08T11:21:46.346Z","host_id":"9d7b3b44-1125-4ad0-9b14-76550087b445"}
    {"severity":"info","message":"Host compute-0: updated status from known to installing (Installation is in progress)","event_time":"2022-07-08T11:28:28.647Z","host_id":"9d7b3b44-1125-4ad0-9b14-76550087b445"}
    {"severity":"info","message":"Host compute-0: updated status from installing to installing-in-progress (Starting installation)","event_time":"2022-07-08T11:28:52.068Z","host_id":"9d7b3b44-1125-4ad0-9b14-76550087b445"}
    {"severity":"info","message":"Uploaded logs for host compute-0 cluster 8f721322-419d-4eed-aa5b-61b50ea586ae","event_time":"2022-07-08T11:29:47.802Z","host_id":"9d7b3b44-1125-4ad0-9b14-76550087b445"}
    {"severity":"info","message":"Host compute-0: updated status from installing-in-progress to added-to-existing-cluster (Host has rebooted and no further updates will be posted. Please check console for progress and to possibly approve pending CSRs)","event_time":"2022-07-08T11:29:48.259Z","host_id":"9d7b3b44-1125-4ad0-9b14-76550087b445"}
    {"severity":"info","message":"Host: compute-0, reached installation stage Rebooting","event_time":"2022-07-08T11:29:48.261Z","host_id":"9d7b3b44-1125-4ad0-9b14-76550087b445"}

  14. 登录到集群并批准待处理的 CSR 以完成安装。

验证

  • 检查新 worker 节点是否已成功添加到集群中,状态为 Ready

    $ oc get nodes

    输出示例

    NAME                           STATUS   ROLES           AGE   VERSION
    control-plane-1.example.com    Ready    master,worker   56m   v1.28.5
    compute-1.example.com          Ready    worker          11m   v1.28.5

10.1.4. 手动将 worker 节点添加到单节点 OpenShift 集群

您可以通过从 Red Hat Enterprise Linux CoreOS (RHCOS) ISO 启动 worker 节点,并使用集群 worker.ign 文件手动将 worker 节点添加到单节点 OpenShift 集群中。

先决条件

  • 在裸机上安装单节点 OpenShift 集群。
  • 安装 OpenShift CLI (oc) 。
  • 以具有 cluster-admin 特权的用户身份登录。
  • 确保将 worker 节点添加到集群中的集群需要的所有 DNS 记录。

流程

  1. 设置 OpenShift Container Platform 版本:

    $ OCP_VERSION=<ocp_version> 1
    1
    <ocp_version> 替换为当前版本,如 latest-4.15
  2. 设置主机架构:

    $ ARCH=<architecture> 1
    1
    <architecture> 替换为目标主机架构,如 aarch64x86_64
  3. 运行以下命令,从正在运行的单节点集群获取 worker.ign 数据:

    $ oc extract -n openshift-machine-api secret/worker-user-data-managed --keys=userData --to=- > worker.ign
  4. 在 Web 服务器上托管 worker.ign 文件,可从您的网络访问。
  5. 运行以下命令下载 OpenShift Container Platform 安装程序并使其可用:

    $ curl -k https://mirror.openshift.com/pub/openshift-v4/clients/ocp/$OCP_VERSION/openshift-install-linux.tar.gz > openshift-install-linux.tar.gz
    $ tar zxvf openshift-install-linux.tar.gz
    $ chmod +x openshift-install
  6. 检索 RHCOS ISO URL:

    $ ISO_URL=$(./openshift-install coreos print-stream-json | grep location | grep $ARCH | grep iso | cut -d\" -f4)
  7. 下载 RHCOS ISO:

    $ curl -L $ISO_URL -o rhcos-live.iso
  8. 使用 RHCOS ISO 和托管的 worker.ign 文件来安装 worker 节点:

    1. 使用 RHCOS ISO 和您首选的安装方法引导目标主机。
    2. 当目标主机从 RHCOS ISO 引导时,打开目标主机上的控制台。
    3. 如果您的本地网络没有启用 DHCP,则需要使用新主机名创建 ignition 文件,并在运行 RHCOS 安装前配置 worker 节点静态 IP 地址。执行以下步骤:

      1. 使用静态 IP 配置 worker 主机网络连接。在目标主机控制台中运行以下命令:

        $ nmcli con mod <network_interface> ipv4.method manual /
        ipv4.addresses <static_ip> ipv4.gateway <network_gateway> ipv4.dns <dns_server> /
        802-3-ethernet.mtu 9000

        其中:

        <static_ip>
        是主机静态 IP 地址和 CIDR,如 10.1.101.50/24
        <network_gateway>
        是网络网关,如 10.1.101.1
      2. 激活修改的网络接口:

        $ nmcli con up <network_interface>
      3. 创建新的 ignition 文件 new-worker.ign,其中包含对原始 worker.ign 的引用,以及 coreos-installer 程序用来在新 worker 主机上填充 /etc/hostname 文件的额外指令。例如:

        {
          "ignition":{
            "version":"3.2.0",
            "config":{
              "merge":[
                {
                  "source":"<hosted_worker_ign_file>" 1
                }
              ]
            }
          },
          "storage":{
            "files":[
              {
                "path":"/etc/hostname",
                "contents":{
                  "source":"data:,<new_fqdn>" 2
                },
                "mode":420,
                "overwrite":true,
                "path":"/etc/hostname"
              }
            ]
          }
        }
        1
        <hosted_worker_ign_file> 是原始 worker.ign 文件的本地可访问的 URL。例如 :http://webserver.example.com/worker.ign
        2
        <new_fqdn> 是您为 worker 节点设置的新 FQDN。例如,new-worker.example.com
      4. 在 Web 服务器上托管 new-worker.ign 文件,可从您的网络访问。
      5. 运行以下 coreos-installer 命令,传递 ignition-url 和硬盘详情:

        $ sudo coreos-installer install --copy-network /
        --ignition-url=<new_worker_ign_file> <hard_disk> --insecure-ignition

        其中:

        <new_worker_ign_file>
        是托管 new-worker.ign 文件的本地可访问 URL,例如 http://webserver.example.com/new-worker.ign
        <hard_disk>
        是安装 RHCOS 的硬盘,例如 /dev/sda
    4. 对于启用了 DHCP 的网络,您不需要设置静态 IP。在目标主机控制台中运行以下 coreos-installer 命令以安装该系统:

      $ coreos-installer install --ignition-url=<hosted_worker_ign_file> <hard_disk>
    5. 要手动启用 DHCP,请将以下 NMStateConfig CR 应用到单节点 OpenShift 集群:

      apiVersion: agent-install.openshift.io/v1
      kind: NMStateConfig
      metadata:
        name: nmstateconfig-dhcp
        namespace: example-sno
        labels:
          nmstate_config_cluster_name: <nmstate_config_cluster_label>
      spec:
        config:
          interfaces:
            - name: eth0
              type: ethernet
              state: up
              ipv4:
                enabled: true
                dhcp: true
              ipv6:
                enabled: false
        interfaces:
          - name: "eth0"
            macAddress: "AA:BB:CC:DD:EE:11"
      重要

      使用静态 IP 地址成功部署 worker 节点需要 NMStateConfig CR,如果单节点 OpenShift 使用静态 IP 地址部署,则使用动态 IP 地址添加带有动态 IP 地址的 worker 节点。集群网络 DHCP 不会自动为新 worker 节点设置这些网络设置。

  9. 当安装继续进行时,安装会为 worker 节点生成待处理的证书签名请求 (CSR)。出现提示时,批准待处理的 CSR 以完成安装。
  10. 安装完成后,重启主机。主机加入集群作为新的 worker 节点。

验证

  • 检查新 worker 节点是否已成功添加到集群中,状态为 Ready

    $ oc get nodes

    输出示例

    NAME                           STATUS   ROLES           AGE   VERSION
    control-plane-1.example.com    Ready    master,worker   56m   v1.28.5
    compute-1.example.com          Ready    worker          11m   v1.28.5

10.1.5. 批准机器的证书签名请求

当您将机器添加到集群时,会为您添加的每台机器生成两个待处理证书签名请求(CSR)。您必须确认这些 CSR 已获得批准,或根据需要自行批准。必须首先批准客户端请求,然后批准服务器请求。

先决条件

  • 您已将机器添加到集群中。

流程

  1. 确认集群可以识别这些机器:

    $ oc get nodes

    输出示例

    NAME      STATUS    ROLES   AGE  VERSION
    master-0  Ready     master  63m  v1.28.5
    master-1  Ready     master  63m  v1.28.5
    master-2  Ready     master  64m  v1.28.5

    输出中列出了您创建的所有机器。

    注意

    在有些 CSR 被批准前,前面的输出可能不包括计算节点(也称为 worker 节点)。

  2. 检查待处理的 CSR,并确保添加到集群中的每台机器都有 PendingApproved 状态的客户端请求:

    $ oc get csr

    输出示例

    NAME        AGE     REQUESTOR                                                                   CONDITION
    csr-8b2br   15m     system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   Pending
    csr-8vnps   15m     system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   Pending
    ...

    在本例中,两台机器加入集群。您可能会在列表中看到更多已批准的 CSR。

  3. 如果 CSR 没有获得批准,在您添加的机器的所有待处理 CSR 都处于 Pending 状态 后,请批准集群机器的 CSR:

    注意

    由于 CSR 会自动轮转,因此请在将机器添加到集群后一小时内批准您的 CSR。如果没有在一小时内批准它们,证书将会轮转,每个节点会存在多个证书。您必须批准所有这些证书。批准客户端 CSR 后,Kubelet 为服务证书创建一个二级 CSR,这需要手动批准。然后,如果 Kubelet 请求具有相同参数的新证书,则后续提供证书续订请求由 machine-approver 自动批准。

    注意

    对于在未启用机器 API 的平台上运行的集群,如裸机和其他用户置备的基础架构,您必须实施一种方法来自动批准 kubelet 提供证书请求(CSR)。如果没有批准请求,则 oc exec、ocrshoc logs 命令将无法成功,因为 API 服务器连接到 kubelet 时需要服务证书。与 Kubelet 端点联系的任何操作都需要此证书批准。该方法必须监视新的 CSR,确认 CSR 由 system: nodesystem:admin 组中的 node-bootstrapper 服务帐户提交,并确认节点的身份。

    • 要单独批准,请对每个有效的 CSR 运行以下命令:

      $ oc adm certificate approve <csr_name> 1
      1
      <csr_name> 是当前 CSR 列表中 CSR 的名称。
    • 要批准所有待处理的 CSR,请运行以下命令:

      $ oc get csr -o go-template='{{range .items}}{{if not .status}}{{.metadata.name}}{{"\n"}}{{end}}{{end}}' | xargs --no-run-if-empty oc adm certificate approve
      注意

      在有些 CSR 被批准前,一些 Operator 可能无法使用。

  4. 现在,您的客户端请求已被批准,您必须查看添加到集群中的每台机器的服务器请求:

    $ oc get csr

    输出示例

    NAME        AGE     REQUESTOR                                                                   CONDITION
    csr-bfd72   5m26s   system:node:ip-10-0-50-126.us-east-2.compute.internal                       Pending
    csr-c57lv   5m26s   system:node:ip-10-0-95-157.us-east-2.compute.internal                       Pending
    ...

  5. 如果剩余的 CSR 没有被批准,且处于 Pending 状态,请批准集群机器的 CSR:

    • 要单独批准,请对每个有效的 CSR 运行以下命令:

      $ oc adm certificate approve <csr_name> 1
      1
      <csr_name> 是当前 CSR 列表中 CSR 的名称。
    • 要批准所有待处理的 CSR,请运行以下命令:

      $ oc get csr -o go-template='{{range .items}}{{if not .status}}{{.metadata.name}}{{"\n"}}{{end}}{{end}}' | xargs oc adm certificate approve
  6. 批准所有客户端和服务器 CSR 后,机器将 处于 Ready 状态。运行以下命令验证:

    $ oc get nodes

    输出示例

    NAME      STATUS    ROLES   AGE  VERSION
    master-0  Ready     master  73m  v1.28.5
    master-1  Ready     master  73m  v1.28.5
    master-2  Ready     master  74m  v1.28.5
    worker-0  Ready     worker  11m  v1.28.5
    worker-1  Ready     worker  11m  v1.28.5

    注意

    批准服务器 CSR 后可能需要几分钟时间让机器过渡到 Ready 状态

其他信息

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.