×

关于私有集群

默认情况下,OpenShift Container Platform 使用公共可访问的 DNS 和端点进行配置。部署私有集群后,您可以将 DNS、Ingress 控制器和 API 服务器设置为私有。

如果集群有任何公共子网,管理员创建的负载均衡器服务可能对公众开放。为确保集群安全,请验证这些服务是否被显式注释为私有。

DNS

如果您在安装程序配置的基础架构上安装 OpenShift Container Platform,安装程序会在预先存在的公共区域中创建记录,并在可能的情况下为集群自身的 DNS 解析创建私有区域。在公共区域和私有区域中,安装程序或集群都会为*.apps(用于Ingress对象)和api(用于 API 服务器)创建 DNS 条目。

公共区域和私有区域中的*.apps记录是相同的,因此,当您删除公共区域时,私有区域会无缝地为集群提供所有 DNS 解析。

Ingress 控制器

由于默认的Ingress对象被创建为公共的,因此负载均衡器是面向互联网的,并且位于公共子网中。

Ingress Operator 会为 Ingress Controller 生成一个默认证书,作为占位符,直到您配置自定义默认证书。请勿在生产集群中使用 Operator 生成的默认证书。Ingress Operator 不会轮换其自身的签名证书或其生成的默认证书。Operator 生成的默认证书仅作为您配置的自定义默认证书的占位符。

API 服务器

默认情况下,安装程序会为 API 服务器创建合适的网络负载均衡器,用于内部和外部流量。

在 Amazon Web Services (AWS) 上,会创建单独的公共和私有负载均衡器。这两个负载均衡器是相同的,只是内部负载均衡器上提供了一个额外的端口,用于集群内部使用。尽管安装程序会根据 API 服务器的需求自动创建或销毁负载均衡器,但集群不会管理或维护它们。只要保留集群对 API 服务器的访问权限,就可以手动修改或移动负载均衡器。对于公共负载均衡器,端口 6443 已打开,并且针对/readyz路径配置了 HTTPS 健康检查。

在 Google Cloud Platform 上,会创建一个单一的负载均衡器来管理内部和外部 API 流量,因此您无需修改负载均衡器。

在 Microsoft Azure 上,会创建公共和私有负载均衡器。但是,由于当前实现的限制,您只需在私有集群中保留这两个负载均衡器。

配置要在私有区域中发布的 DNS 记录

对于所有 OpenShift Container Platform 集群(无论是公共的还是私有的),DNS 记录默认情况下都会在公共区域中发布。

您可以从集群 DNS 配置中删除公共区域,以避免将 DNS 记录公开给公众。您可能希望避免公开敏感信息,例如内部域名、内部 IP 地址或组织中的集群数量,或者您可能根本不需要公开发布记录。如果所有应该能够连接到集群内服务的客户端都使用具有私有区域 DNS 记录的私有 DNS 服务,则无需为集群创建公共 DNS 记录。

部署集群后,您可以通过修改DNS自定义资源 (CR) 来修改其 DNS,使其仅使用私有区域。以这种方式修改DNS CR 意味着随后创建的任何 DNS 记录都不会发布到公共 DNS 服务器,这将使 DNS 记录的知识仅限于内部用户。这可以在您将集群配置为私有集群时完成,或者如果您永远都不希望 DNS 记录公开可解析时完成。

或者,即使在私有集群中,您也可以保留公共区域的 DNS 记录,因为它允许客户端解析在该集群上运行的应用程序的 DNS 名称。例如,一个组织可以拥有连接到公共互联网的机器,然后为某些私有 IP 范围建立 VPN 连接以连接到私有 IP 地址。来自这些机器的 DNS 查询使用公共 DNS 来确定这些服务的私有地址,然后通过 VPN 连接到私有地址。

步骤
  1. 通过运行以下命令并观察输出结果来查看集群的DNS CR

    $ oc get dnses.config.openshift.io/cluster -o yaml
    示例输出
    apiVersion: config.openshift.io/v1
    kind: DNS
    metadata:
      creationTimestamp: "2019-10-25T18:27:09Z"
      generation: 2
      name: cluster
      resourceVersion: "37966"
      selfLink: /apis/config.openshift.io/v1/dnses/cluster
      uid: 0e714746-f755-11f9-9cb1-02ff55d8f976
    spec:
      baseDomain: <base_domain>
      privateZone:
        tags:
          Name: <infrastructure_id>-int
          kubernetes.io/cluster/<infrastructure_id>: owned
      publicZone:
        id: Z2XXXXXXXXXXA4
    status: {}

    请注意,spec部分包含私有区域和公共区域。

  2. 通过运行以下命令来修补DNS CR 以删除公共区域

    $ oc patch dnses.config.openshift.io/cluster --type=merge --patch='{"spec": {"publicZone": null}}'
    示例输出
    dns.config.openshift.io/cluster patched

    Ingress Operator 在为IngressController对象创建 DNS 记录时会查阅DNS CR 定义。如果只指定私有区域,则只创建私有记录。

    删除公共区域后,不会修改现有的 DNS 记录。如果您不再希望公开发布它们,则必须手动删除以前发布的公共 DNS 记录。

验证
  • 通过运行以下命令并观察输出结果来查看集群的DNS CR,并确认已删除公共区域

    $ oc get dnses.config.openshift.io/cluster -o yaml
    示例输出
    apiVersion: config.openshift.io/v1
    kind: DNS
    metadata:
      creationTimestamp: "2019-10-25T18:27:09Z"
      generation: 2
      name: cluster
      resourceVersion: "37966"
      selfLink: /apis/config.openshift.io/v1/dnses/cluster
      uid: 0e714746-f755-11f9-9cb1-02ff55d8f976
    spec:
      baseDomain: <base_domain>
      privateZone:
        tags:
          Name: <infrastructure_id>-int
          kubernetes.io/cluster/<infrastructure_id>-wfpg4: owned
    status: {}

将 Ingress Controller 设置为私有

部署集群后,您可以修改其 Ingress Controller 以仅使用私有区域。

步骤
  1. 修改默认 Ingress Controller 以仅使用内部端点

    $ oc replace --force --wait --filename - <<EOF
    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      namespace: openshift-ingress-operator
      name: default
    spec:
      endpointPublishingStrategy:
        type: LoadBalancerService
        loadBalancer:
          scope: Internal
    EOF
    示例输出
    ingresscontroller.operator.openshift.io "default" deleted
    ingresscontroller.operator.openshift.io/default replaced

    公共 DNS 条目将被删除,私有区域条目将被更新。

将 API 服务器限制为私有

将集群部署到 Amazon Web Services (AWS) 或 Microsoft Azure 后,您可以重新配置 API 服务器以仅使用私有区域。

先决条件
  • 安装 OpenShift CLI (oc)。

  • 以具有admin权限的用户身份访问 Web 控制台。

步骤
  1. 在您的云提供商的 Web 门户或控制台中,执行以下操作

    1. 找到并删除相应的负载均衡器组件

      • 对于 AWS,请删除外部负载均衡器。私有区域中的 API DNS 条目已指向内部负载均衡器,该负载均衡器使用相同的配置,因此您无需修改内部负载均衡器。

      • 对于 Azure,请删除公共负载均衡器的api-internal-v4规则。

    2. 对于 Azure,将 Ingress Controller 端点发布范围配置为Internal。有关更多信息,请参见“将 Ingress Controller 端点发布范围配置为 Internal”。

    3. 对于 Azure 公共负载均衡器,如果将 Ingress Controller 端点发布范围配置为Internal并且公共负载均衡器中没有现有的入站规则,则必须显式创建出站规则以提供后端地址池的出站流量。有关更多信息,请参阅有关添加出站规则的 Microsoft Azure 文档。

    4. 删除公共区域中的api.$clustername.$yourdomainapi.$clustername DNS 条目。

  2. AWS 集群:删除外部负载均衡器

    您只能对安装程序预配的基础设施 (IPI) 集群运行以下步骤。对于用户预配的基础设施 (UPI) 集群,您必须手动删除或禁用外部负载均衡器。

    • 如果您的集群使用控制平面机器集,请删除控制平面机器集自定义资源中配置公共或外部负载均衡器的行

      # ...
      providerSpec:
        value:
      # ...
          loadBalancers:
          - name: lk4pj-ext (1)
            type: network (2)
          - name: lk4pj-int
            type: network
      # ...
      1 删除外部负载均衡器的name值(以-ext结尾)。
      2 删除外部负载均衡器的type值。
    • 如果您的集群不使用控制平面机器集,则必须从每个控制平面机器中删除外部负载均衡器。

      1. 从您的终端运行以下命令列出集群机器:

        $ oc get machine -n openshift-machine-api
        示例输出
        NAME                            STATE     TYPE        REGION      ZONE         AGE
        lk4pj-master-0                  running   m4.xlarge   us-east-1   us-east-1a   17m
        lk4pj-master-1                  running   m4.xlarge   us-east-1   us-east-1b   17m
        lk4pj-master-2                  running   m4.xlarge   us-east-1   us-east-1a   17m
        lk4pj-worker-us-east-1a-5fzfj   running   m4.xlarge   us-east-1   us-east-1a   15m
        lk4pj-worker-us-east-1a-vbghs   running   m4.xlarge   us-east-1   us-east-1a   15m
        lk4pj-worker-us-east-1b-zgpzg   running   m4.xlarge   us-east-1   us-east-1b   15m

        控制平面机器的名称包含master

      2. 从每个控制平面机器上移除外部负载均衡器。

        1. 运行以下命令来编辑控制平面机器对象:

          $ oc edit machines -n openshift-machine-api <control_plane_name> (1)
          1 指定要修改的控制平面机器对象的名称。
        2. 移除描述外部负载均衡器的行,这些行在以下示例中已标记。

          # ...
          providerSpec:
            value:
          # ...
              loadBalancers:
              - name: lk4pj-ext (1)
                type: network (2)
              - name: lk4pj-int
                type: network
          # ...
          1 删除外部负载均衡器的name值(以-ext结尾)。
          2 删除外部负载均衡器的type值。
        3. 保存您的更改并退出对象规范。

        4. 对每个控制平面机器重复此过程。

在 Azure 上配置私有存储端点

您可以利用 Image Registry Operator 在 Azure 上使用私有端点,这使得在私有 Azure 集群上部署 OpenShift Container Platform 时能够无缝配置私有存储帐户。这允许您部署镜像仓库而无需公开面向公众的存储端点。

请勿在 Microsoft Azure Red Hat OpenShift (ARO) 上配置私有存储端点,因为该端点可能使您的 Microsoft Azure Red Hat OpenShift 集群进入不可恢复的状态。

您可以通过两种方式之一配置 Image Registry Operator 以使用 Azure 上的私有存储端点:

  • 通过配置 Image Registry Operator 来发现 VNet 和子网名称。

  • 使用用户提供的 Azure 虚拟网络 (VNet) 和子网名称。

在 Azure 上配置私有存储端点的限制

在 Azure 上配置私有存储端点时,适用以下限制:

  • 当配置 Image Registry Operator 以使用私有存储端点时,将禁用对存储帐户的公共网络访问。因此,只有在注册表 Operator 配置中设置disableRedirect: true时,才能从 OpenShift Container Platform 外部拉取镜像。如果启用重定向,注册表会将客户端重定向到直接从存储帐户拉取镜像,由于禁用了公共网络访问,这将不再有效。有关更多信息,请参阅“在 Azure 上使用私有存储端点时禁用重定向”。

  • 此操作无法由 Image Registry Operator 撤消。

通过启用 Image Registry Operator 来发现 VNet 和子网名称,在 Azure 上配置私有存储端点

以下步骤说明了如何通过配置 Image Registry Operator 来发现 VNet 和子网名称来设置 Azure 上的私有存储端点。

先决条件
  • 您已配置镜像仓库在 Azure 上运行。

  • 您的网络已使用安装程序预配的基础设施安装方法设置。

    对于具有自定义网络设置的用户,请参阅“使用用户提供的 VNet 和子网名称在 Azure 上配置私有存储端点”。

步骤
  1. 编辑 Image Registry Operator config 对象并将networkAccess.type设置为Internal

    $ oc edit configs.imageregistry/cluster
    # ...
    spec:
      # ...
       storage:
          azure:
            # ...
            networkAccess:
              type: Internal
    # ...
  2. 可选:输入以下命令以确认 Operator 已完成预配。这可能需要几分钟时间。

    $ oc get configs.imageregistry/cluster -o=jsonpath="{.spec.storage.azure.privateEndpointName}" -w
  3. 可选:如果注册表通过路由公开,并且您正在将存储帐户配置为私有,则如果希望集群外部的拉取继续工作,则必须禁用重定向。输入以下命令以禁用 Image Operator 配置中的重定向:

    $ oc patch configs.imageregistry cluster --type=merge -p '{"spec":{"disableRedirect": true}}'

    启用重定向后,将无法从集群外部拉取镜像。

验证
  1. 运行以下命令获取注册表服务名称:

    $ oc get imagestream -n openshift
    示例输出
    NAME   IMAGE REPOSITORY                                                 TAGS     UPDATED
    cli    image-registry.openshift-image-registry.svc:5000/openshift/cli   latest   8 hours ago
    ...
  2. 运行以下命令进入调试模式:

    $ oc debug node/<node_name>
  3. 运行建议的chroot命令。例如:

    $ chroot /host
  4. 输入以下命令登录到您的容器注册表:

    $ podman login --tls-verify=false -u unused -p $(oc whoami -t) image-registry.openshift-image-registry.svc:5000
    示例输出
    Login Succeeded!
  5. 输入以下命令以验证您可以从注册表拉取镜像:

    $ podman pull --tls-verify=false image-registry.openshift-image-registry.svc:5000/openshift/tools
    示例输出
    Trying to pull image-registry.openshift-image-registry.svc:5000/openshift/tools/openshift/tools...
    Getting image source signatures
    Copying blob 6b245f040973 done
    Copying config 22667f5368 done
    Writing manifest to image destination
    Storing signatures
    22667f53682a2920948d19c7133ab1c9c3f745805c14125859d20cede07f11f9

使用用户提供的 VNet 和子网名称在 Azure 上配置私有存储端点

使用以下步骤配置已禁用公共网络访问并位于 Azure 上的私有存储端点背后的存储帐户。

先决条件
  • 您已配置镜像仓库在 Azure 上运行。

  • 您必须知道 Azure 环境中使用的 VNet 和子网名称。

  • 如果您的网络是在 Azure 中的单独资源组中配置的,则您还必须知道其名称。

步骤
  1. 编辑 Image Registry Operator config 对象并使用您的 VNet 和子网名称配置私有端点。

    $ oc edit configs.imageregistry/cluster
    # ...
    spec:
      # ...
       storage:
          azure:
            # ...
            networkAccess:
              type: Internal
              internal:
                subnetName: <subnet_name>
                vnetName: <vnet_name>
                networkResourceGroupName: <network_resource_group_name>
    # ...
  2. 可选:输入以下命令以确认 Operator 已完成预配。这可能需要几分钟时间。

    $ oc get configs.imageregistry/cluster -o=jsonpath="{.spec.storage.azure.privateEndpointName}" -w

    启用重定向后,将无法从集群外部拉取镜像。

验证
  1. 运行以下命令获取注册表服务名称:

    $ oc get imagestream -n openshift
    示例输出
    NAME   IMAGE REPOSITORY                                                 TAGS     UPDATED
    cli    image-registry.openshift-image-registry.svc:5000/openshift/cli   latest   8 hours ago
    ...
  2. 运行以下命令进入调试模式:

    $ oc debug node/<node_name>
  3. 运行建议的chroot命令。例如:

    $ chroot /host
  4. 输入以下命令登录到您的容器注册表:

    $ podman login --tls-verify=false -u unused -p $(oc whoami -t) image-registry.openshift-image-registry.svc:5000
    示例输出
    Login Succeeded!
  5. 输入以下命令以验证您可以从注册表拉取镜像:

    $ podman pull --tls-verify=false image-registry.openshift-image-registry.svc:5000/openshift/tools
    示例输出
    Trying to pull image-registry.openshift-image-registry.svc:5000/openshift/tools/openshift/tools...
    Getting image source signatures
    Copying blob 6b245f040973 done
    Copying config 22667f5368 done
    Writing manifest to image destination
    Storing signatures
    22667f53682a2920948d19c7133ab1c9c3f745805c14125859d20cede07f11f9

可选:在 Azure 上使用私有存储端点时禁用重定向

默认情况下,使用镜像仓库时会启用重定向。重定向允许将流量从注册表 Pod 卸载到对象存储,这使得拉取速度更快。当启用重定向并且存储帐户为私有时,集群外部的用户将无法从注册表拉取镜像。

在某些情况下,用户可能希望禁用重定向,以便集群外部的用户可以从注册表拉取镜像。

使用以下步骤禁用重定向。

先决条件
  • 您已配置镜像仓库在 Azure 上运行。

  • 您已配置了一个路由。

步骤
  • 输入以下命令以禁用镜像仓库配置中的重定向:

    $ oc patch configs.imageregistry cluster --type=merge -p '{"spec":{"disableRedirect": true}}'
验证
  1. 运行以下命令获取注册表服务名称:

    $ oc get imagestream -n openshift
    示例输出
    NAME   IMAGE REPOSITORY                                           TAGS     UPDATED
    cli    default-route-openshift-image-registry.<cluster_dns>/cli   latest   8 hours ago
    ...
  2. 输入以下命令登录到您的容器注册表:

    $ podman login --tls-verify=false -u unused -p $(oc whoami -t) default-route-openshift-image-registry.<cluster_dns>
    示例输出
    Login Succeeded!
  3. 输入以下命令以验证您可以从注册表拉取镜像:

    $ podman pull --tls-verify=false default-route-openshift-image-registry.<cluster_dns>
    /openshift/tools
    示例输出
    Trying to pull default-route-openshift-image-registry.<cluster_dns>/openshift/tools...
    Getting image source signatures
    Copying blob 6b245f040973 done
    Copying config 22667f5368 done
    Writing manifest to image destination
    Storing signatures
    22667f53682a2920948d19c7133ab1c9c3f745805c14125859d20cede07f11f9