×

某些平台组件(例如Web控制台)使用路由进行通信,并且必须信任其他组件的证书才能与它们交互。如果您使用的是自定义公钥基础结构 (PKI),则必须对其进行配置,以便其私有签名的CA证书在整个集群中得到识别。

您可以利用Proxy API添加集群范围的受信任CA证书。您必须在安装期间或运行时执行此操作。

  • 安装期间,配置集群范围的代理。您必须在install-config.yaml文件的additionalTrustBundle设置中定义您的私有签名的CA证书。

    安装程序会生成一个名为user-ca-bundle的ConfigMap,其中包含您定义的附加CA证书。然后,集群网络操作符会创建一个trusted-ca-bundle ConfigMap,它将这些CA证书与Red Hat Enterprise Linux CoreOS (RHCOS)信任捆绑包合并;此ConfigMap在Proxy对象的trustedCA字段中引用。

  • 运行时修改默认Proxy对象以包含您的私有签名的CA证书(集群代理启用工作流程的一部分)。这涉及创建包含应由集群信任的私有签名的CA证书的ConfigMap,然后使用引用私有签名证书的ConfigMap的trustedCA修改代理资源。

安装程序配置的additionalTrustBundle字段和代理资源的trustedCA字段用于管理集群范围的信任捆绑包;additionalTrustBundle用于安装时,而代理的trustedCA用于运行时。

trustedCA字段引用包含集群组件使用的自定义证书和密钥对的ConfigMap

在安装过程中配置集群范围的代理

生产环境可以拒绝直接访问互联网,而是提供HTTP或HTTPS代理。您可以通过在install-config.yaml文件中配置代理设置来配置新的OpenShift Container Platform集群以使用代理。

先决条件
  • 您有一个现有的install-config.yaml文件。

  • 您查看了集群需要访问的站点,并确定其中任何站点是否需要绕过代理。默认情况下,所有集群出站流量都使用代理,包括对托管云提供商API的调用。如果需要,您已将站点添加到Proxy对象的spec.noProxy字段以绕过代理。

    Proxy对象的status.noProxy字段已填充了安装配置中networking.machineNetwork[].cidrnetworking.clusterNetwork[].cidrnetworking.serviceNetwork[]字段的值。

    对于Amazon Web Services (AWS)、Google Cloud Platform (GCP)、Microsoft Azure和Red Hat OpenStack Platform (RHOSP)上的安装,Proxy对象的status.noProxy字段也填充了实例元数据端点 (169.254.169.254)。

步骤
  1. 编辑您的install-config.yaml文件并添加代理设置。例如

    apiVersion: v1
    baseDomain: my.domain.com
    proxy:
      httpProxy: http://<username>:<pswd>@<ip>:<port> (1)
      httpsProxy: https://<username>:<pswd>@<ip>:<port> (2)
      noProxy: example.com (3)
    additionalTrustBundle: | (4)
        -----BEGIN CERTIFICATE-----
        <MY_TRUSTED_CA_CERT>
        -----END CERTIFICATE-----
    additionalTrustBundlePolicy: <policy_to_add_additionalTrustBundle> (5)
    1 用于创建集群外部HTTP连接的代理URL。URL方案必须为http
    2 用于创建集群外部HTTPS连接的代理URL。
    3 需要排除代理的目的地域名、IP 地址或其他网络 CIDR 的逗号分隔列表。在域名前加.仅匹配子域名。例如,.y.com匹配x.y.com,但不匹配y.com。使用*绕过所有目的地的代理。
    4 如果提供,安装程序会在openshift-config命名空间中生成一个名为user-ca-bundle的配置映射,其中包含代理 HTTPS 连接所需的一个或多个附加 CA 证书。集群网络操作符 (Cluster Network Operator) 然后创建一个trusted-ca-bundle配置映射,将这些内容与 Red Hat Enterprise Linux CoreOS (RHCOS) 信任捆绑包合并,并且此配置映射在Proxy对象的trustedCA字段中被引用。除非代理的身份证书由 RHCOS 信任捆绑包中的授权机构签署,否则additionalTrustBundle字段是必需的。
    5 可选:确定Proxy对象的配置策略,以便在trustedCA字段中引用user-ca-bundle配置映射。允许的值为ProxyonlyAlways。使用Proxyonly仅在配置http/https代理时引用user-ca-bundle配置映射。使用Always始终引用user-ca-bundle配置映射。默认值为Proxyonly

    安装程序不支持代理readinessEndpoints字段。

    如果安装程序超时,请重新启动,然后使用安装程序的wait-for命令完成部署。例如

    $ ./openshift-install wait-for install-complete --log-level debug
  2. 保存文件并在安装 OpenShift Container Platform 时引用它。

安装程序创建一个名为cluster的集群范围代理,它使用提供的install-config.yaml文件中的代理设置。如果未提供代理设置,仍然会创建cluster Proxy对象,但它将具有空spec

仅支持名为clusterProxy对象,不能创建其他代理。

启用集群范围代理

Proxy对象用于管理集群范围的出站代理。当安装或升级集群时未配置代理,仍然会生成Proxy对象,但它将具有空spec。例如

apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
  name: cluster
spec:
  trustedCA:
    name: ""
status:

集群管理员可以通过修改此cluster Proxy对象来配置 OpenShift Container Platform 的代理。

仅支持名为clusterProxy对象,不能创建其他代理。

启用集群范围代理会导致机器配置操作符 (MCO) 触发节点重启。

先决条件
  • 集群管理员权限

  • 已安装 OpenShift Container Platform oc CLI 工具

步骤
  1. 创建一个包含代理 HTTPS 连接所需任何附加 CA 证书的配置映射。

    如果代理的身份证书由 RHCOS 信任捆绑包中的授权机构签署,则可以跳过此步骤。

    1. 创建一个名为user-ca-bundle.yaml的文件,内容如下,并提供 PEM 编码证书的值

      apiVersion: v1
      data:
        ca-bundle.crt: | (1)
          <MY_PEM_ENCODED_CERTS> (2)
      kind: ConfigMap
      metadata:
        name: user-ca-bundle (3)
        namespace: openshift-config (4)
      1 此数据键必须命名为ca-bundle.crt
      2 一个或多个用于签署代理身份证书的 PEM 编码 X.509 证书。
      3 将从Proxy对象引用的配置映射名称。
      4 配置映射必须位于openshift-config命名空间中。
    2. 从此文件创建配置映射

      $ oc create -f user-ca-bundle.yaml
  2. 使用oc edit命令修改Proxy对象

    $ oc edit proxy/cluster
  3. 配置代理所需的字段

    apiVersion: config.openshift.io/v1
    kind: Proxy
    metadata:
      name: cluster
    spec:
      httpProxy: http://<username>:<pswd>@<ip>:<port> (1)
      httpsProxy: https://<username>:<pswd>@<ip>:<port> (2)
      noProxy: example.com (3)
      readinessEndpoints:
      - http://www.google.com (4)
      - https://www.google.com
      trustedCA:
        name: user-ca-bundle (5)
    1 用于创建集群外部HTTP连接的代理URL。URL方案必须为http
    2 用于在集群外部创建 HTTPS 连接的代理 URL。URL 方案必须是httphttps。为支持 URL 方案的代理指定一个 URL。例如,如果大多数代理配置为使用https但它们仅支持http,则会报告错误。此错误消息可能不会传播到日志中,而是可能显示为网络连接故障。如果使用侦听来自集群的https连接的代理,则可能需要将集群配置为接受代理使用的 CA 和证书。
    3 需要排除代理的目的地域名、域名、IP 地址或其他网络 CIDR 的逗号分隔列表。

    在域名前加.仅匹配子域名。例如,.y.com匹配x.y.com,但不匹配y.com。使用*绕过所有目的地的代理。如果扩展安装配置中networking.machineNetwork[].cidr字段定义的网络中未包含的工作节点,则必须将它们添加到此列表中以防止连接问题。

    如果httpProxyhttpsProxy字段均未设置,则忽略此字段。

    4 一个或多个集群外部的 URL,用于在将httpProxyhttpsProxy值写入状态之前执行就绪检查。
    5 openshift-config命名空间中配置映射的引用,该配置映射包含代理 HTTPS 连接所需的附加 CA 证书。请注意,在此处引用之前,配置映射必须已存在。除非代理的身份证书由 RHCOS 信任捆绑包中的授权机构签署,否则此字段是必需的。
  4. 保存文件以应用更改。

使用操作符注入证书

将自定义 CA 证书通过 ConfigMap 添加到集群后,集群网络操作符会将用户提供的 CA 证书和系统 CA 证书合并到一个捆绑包中,并将合并的捆绑包注入请求信任捆绑包注入的操作符。

在向配置映射添加config.openshift.io/inject-trusted-cabundle="true"标签后,其中的现有数据将被删除。集群网络操作符拥有配置映射,并且仅接受ca-bundle作为数据。必须使用单独的配置映射来存储service-ca.crt,方法是使用service.beta.openshift.io/inject-cabundle=true注释或类似的配置。在同一个配置映射上添加config.openshift.io/inject-trusted-cabundle="true"标签和service.beta.openshift.io/inject-cabundle=true注释可能会导致问题。

操作符通过创建具有以下标签的空 ConfigMap 来请求此注入

config.openshift.io/inject-trusted-cabundle="true"

空 ConfigMap 的示例

apiVersion: v1
data: {}
kind: ConfigMap
metadata:
  labels:
    config.openshift.io/inject-trusted-cabundle: "true"
  name: ca-inject (1)
  namespace: apache
1 指定空 ConfigMap 名称。

操作符将此 ConfigMap 挂载到容器的本地信任存储中。

仅当证书未包含在 Red Hat Enterprise Linux CoreOS (RHCOS) 信任捆绑包中时,才需要添加受信任的 CA 证书。

证书注入不仅限于操作符。当创建带有config.openshift.io/inject-trusted-cabundle=true标签的空 ConfigMap 时,集群网络操作符会在任何命名空间中注入证书。

ConfigMap 可以驻留在任何命名空间中,但是 ConfigMap 必须作为卷挂载到需要自定义 CA 的 Pod 中的每个容器中。例如

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-example-custom-ca-deployment
  namespace: my-example-custom-ca-ns
spec:
  ...
    spec:
      ...
      containers:
        - name: my-container-that-needs-custom-ca
          volumeMounts:
          - name: trusted-ca
            mountPath: /etc/pki/ca-trust/extracted/pem
            readOnly: true
      volumes:
      - name: trusted-ca
        configMap:
          name: trusted-ca
          items:
            - key: ca-bundle.crt (1)
              path: tls-ca-bundle.pem (2)
1 ca-bundle.crt作为 ConfigMap 密钥是必需的。
2 tls-ca-bundle.pem作为 ConfigMap 路径是必需的。