第 5 章 OpenShift Service Mesh 和 cert-manager


cert-manager 工具是 Kubernetes 上 X.509 证书管理的解决方案。它提供了一个统一的 API,将应用程序与私钥或公钥基础架构 (PKI) 集成,如 Vault、Google Cloud Certificate Authority Service、Ret 的 Encrypt 和其他供应商。

cert-manager 工具通过尝试在配置的证书过期前更新证书来确保证书有效且最新状态。

重要

在创建并安装 Istio 资源前,必须安装 cert-manager 工具。

5.1. 关于 cert-manager Operator istio-csr 代理

重要

Red Hat OpenShift 的 cert-manager Operator 的 Istio- csr 集成只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

Red Hat OpenShift 的 cert-manager Operator 增强了在 Red Hat OpenShift Service Mesh 和 Istio 中保护工作负载和 control plane 组件的证书管理。它支持通过 cert-manager issuers 发布、发布和更新用于相互传输层安全(mTLS)的证书。

通过将 Istio 与 cert-manager Operator 管理的 istio-csr 代理集成,您可以启用 Istio 来直接请求和管理证书。该集成简化了安全配置,并将证书管理集中在集群中。

注意

在创建并安装 Istio 资源前,必须安装 Red Hat OpenShift 的 cert-manager Operator。

您可以通过部署 istio-csr 代理并配置使用 istio-csr 代理来处理工作负载和 control plane 证书签名请求的 Istio 资源,将 cert-manager Operator 与 OpenShift Service Mesh 集成。以下流程创建自签名 签发者 对象。

先决条件

  • 您已为 Red Hat OpenShift 版本 1.15.1 安装了 cert-manager Operator。
  • 已登陆到 OpenShift Container Platform 4.14 或更高版本。
  • 已安装 OpenShift Service Mesh Operator。
  • 有一个 IstioCNI 实例在集群中运行。
  • 已安装 istioctl 命令。

流程

  1. 运行以下命令来创建 istio-system 命名空间:

    $ oc create namespace istio-system
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来修补 cert-manager Operator 来安装 istio-csr 代理:

    $ oc -n cert-manager-operator patch subscription openshift-cert-manager-operator \
      --type='merge' -p \
      '{"spec":{"config":{"env":[{"name":"UNSUPPORTED_ADDON_FEATURES","value":"IstioCSR=true"}]}}}'
    Copy to Clipboard Toggle word wrap
  3. 通过为 istio-csr 代理创建 Issuer 对象来创建 root 证书颁发机构(CA)签发者:

    1. 运行以下命令,为安装 istio-csr 代理创建一个新项目:

      $ oc new-project istio-csr
      Copy to Clipboard Toggle word wrap
    2. 创建类似以下示例的 Issuer 对象:

      注意

      selfSigned issuer 用于演示、测试或概念验证环境。对于生产环境部署,请使用安全可靠的 CA。

      issuer.yaml 文件示例

      apiVersion: cert-manager.io/v1
      kind: Issuer
      metadata:
        name: selfsigned
        namespace: istio-system
      spec:
        selfSigned: {}
      ---
      apiVersion: cert-manager.io/v1
      kind: Certificate
      metadata:
        name: istio-ca
        namespace: istio-system
      spec:
        isCA: true
        duration: 87600h
        secretName: istio-ca
        commonName: istio-ca
        privateKey:
          algorithm: ECDSA
          size: 256
        subject:
          organizations:
            - cluster.local
            - cert-manager
        issuerRef:
          name: selfsigned
          kind: Issuer
          group: cert-manager.io
      ---
      apiVersion: cert-manager.io/v1
      kind: Issuer
      metadata:
        name: istio-ca
        namespace: istio-system
      spec:
        ca:
          secretName: istio-ca
      Copy to Clipboard Toggle word wrap

    3. 运行以下命令来创建对象:

      $ oc apply -f issuer.yaml
      Copy to Clipboard Toggle word wrap
    4. 运行以下命令,等待 istio-ca 证书包含 "Ready" 状态条件:

      $ oc wait --for=condition=Ready certificates/istio-ca -n istio-system
      Copy to Clipboard Toggle word wrap
  4. 创建 IstioCSR 自定义资源:

    1. 创建类似以下示例的 IstioCSR 自定义资源:

      istioCSR.yaml 文件示例

      apiVersion: operator.openshift.io/v1alpha1
      kind: IstioCSR
      metadata:
        name: default
        namespace: istio-csr
      spec:
        istioCSRConfig:
          certManager:
            issuerRef:
              name: istio-ca
              kind: Issuer
              group: cert-manager.io
          istiodTLSConfig:
            trustDomain: cluster.local
          istio:
            namespace: istio-system
      Copy to Clipboard Toggle word wrap

    2. 运行以下命令来创建 istio-csr 代理:

      $ oc create -f istioCSR.yaml
      Copy to Clipboard Toggle word wrap
    3. 运行以下命令验证 istio-csr 部署是否已就绪:

      $ oc get deployment -n istio-csr
      Copy to Clipboard Toggle word wrap
  5. 安装 istio 资源:

    注意

    配置禁用 Istio 的内置 CA 服务器,并将来自 istiod 的证书签名请求转发到 istio-csr 代理。istio-csr 代理从 cert-manager Operator 获取 istiod 和网格工作负载的证书。istiod TLS 证书由 istio-csr 代理生成的证书挂载到 pod 中,位于已知位置以供使用。

    1. 创建类似以下示例的 Istio 对象:

      istio.yaml 文件示例

      apiVersion: sailoperator.io/v1
      kind: Istio
      metadata:
        name: default
      spec:
        version: v1.24-latest
        namespace: istio-system
        values:
          global:
            caAddress: cert-manager-istio-csr.istio-csr.svc:443
          pilot:
            env:
              ENABLE_CA_SERVER: "false"
      Copy to Clipboard Toggle word wrap

    2. 运行以下命令来创建 Istio 资源:

      $ oc apply -f istio.yaml
      Copy to Clipboard Toggle word wrap
    3. 运行以下命令,验证 istio 资源是否显示 "Ready" 状态条件:

      $ oc wait --for=condition=Ready istios/default -n istio-system
      Copy to Clipboard Toggle word wrap

您可以使用示例 httpbin 服务和 sleep 应用程序来验证工作负载之间的流量。检查工作负载代理证书,以验证 cert-manager Operator 是否已正确安装。

  1. 创建命名空间:

    1. 运行以下命令来创建 apps-1 命名空间:

      $ oc new-project apps-1
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令来创建 apps-2 命名空间:

      $ oc new-project apps-2
      Copy to Clipboard Toggle word wrap
  2. 在命名空间中添加 istio-injection=enabled 标签:

    1. 运行以下命令,在 apps-1 命名空间中添加 istio-injection=enabled 标签:

      $ oc label namespaces apps-1 istio-injection=enabled
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,在 apps-2 命名空间中添加 istio-injection=enabled 标签:

      $ oc label namespaces apps-2 istio-injection=enabled
      Copy to Clipboard Toggle word wrap
  3. 在命名空间中部署 httpbin 应用程序:

    1. 运行以下命令,在 apps-1 命名空间中部署 httpbin 应用程序:

      $ oc apply -n apps-1 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/httpbin/httpbin.yaml
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,在 apps-2 命名空间中部署 httpbin 应用程序:

      $ oc apply -n apps-2 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/httpbin/httpbin.yaml
      Copy to Clipboard Toggle word wrap
  4. 在命名空间中部署 sleep 应用程序:

    1. 运行以下命令,在 apps-1 命名空间中部署 sleep 应用程序:

      $ oc apply -n apps-1 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/sleep/sleep.yaml
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,在 apps-2 命名空间中部署 sleep 应用程序:

      $ oc apply -n apps-2 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/sleep/sleep.yaml
      Copy to Clipboard Toggle word wrap
  5. 验证创建的 apps 已注入了 sidecar:

    1. 运行以下命令,验证创建的 apps 已注入 apps-1 命名空间:

      $ oc get pods -n apps-1
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,验证创建的 apps 是否为 apps-2 命名空间注入了 sidecar:

      $ oc get pods -n apps-2
      Copy to Clipboard Toggle word wrap
  6. 创建网格范围严格的 mutual Transport Layer Security (mTLS)策略,如下例所示:

    注意

    在严格的 mTLS 模式中启用 PeerAuthentication 会验证证书是否被正确分布,且 mTLS 通信功能在工作负载之间正常工作。

    peer_auth.yaml 文件示例

    apiVersion: security.istio.io/v1beta1
    kind: PeerAuthentication
    metadata:
      name: default
      namespace: istio-system
    spec:
      mtls:
        mode: STRICT
    Copy to Clipboard Toggle word wrap

  7. 运行以下命令来应用 mTLS 策略:

    $ oc apply -f peer_auth.yaml
    Copy to Clipboard Toggle word wrap
  8. 运行以下命令,验证 apps-1/sleep 应用程序可以访问 apps-2/httpbin 服务:

    $ oc -n apps-1 exec "$(oc -n apps-1 get pod \
      -l app=sleep -o jsonpath={.items..metadata.name})" \
      -c sleep -- curl -sIL http://httpbin.apps-2.svc.cluster.local:8000
    Copy to Clipboard Toggle word wrap

    输出示例

    HTTP/1.1 200 OK
    access-control-allow-credentials: true
    access-control-allow-origin: *
    content-security-policy: default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' camo.githubusercontent.com
    content-type: text/html; charset=utf-8
    date: Wed, 18 Jun 2025 09:20:55 GMT
    x-envoy-upstream-service-time: 14
    server: envoy
    transfer-encoding: chunked
    Copy to Clipboard Toggle word wrap

  9. 运行以下命令,验证 apps-2/sleep 应用程序可以访问 apps-1/httpbin 服务:

    $ oc -n apps-2 exec "$(oc -n apps-1 get pod \
      -l app=sleep -o jsonpath={.items..metadata.name})" \
      -c sleep -- curl -sIL http://httpbin.apps-2.svc.cluster.local:8000
    Copy to Clipboard Toggle word wrap

    输出示例

    HTTP/1.1 200 OK
    access-control-allow-credentials: true
    access-control-allow-origin: *
    content-security-policy: default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' camo.githubusercontent.com
    content-type: text/html; charset=utf-8
    date: Wed, 18 Jun 2025 09:21:23 GMT
    x-envoy-upstream-service-time: 16
    server: envoy
    transfer-encoding: chunked
    Copy to Clipboard Toggle word wrap

  10. 运行以下命令,验证 httpbin 工作负载证书是否与预期匹配:

    $ istioctl proxy-config secret -n apps-1 \
      $(oc get pods -n apps-1 -o jsonpath='{.items..metadata.name}' --selector app=httpbin) \
      -o json | jq -r '.dynamicActiveSecrets[0].secret.tlsCertificate.certificateChain.inlineBytes' \
      | base64 --decode | openssl x509 -text -noout
    Copy to Clipboard Toggle word wrap

    输出示例

    ...
    Issuer: O = cert-manager + O = cluster.local, CN = istio-ca
    ...
    X509v3 Subject Alternative Name:
    URI:spiffe://cluster.local/ns/apps-1/sa/httpbin
    Copy to Clipboard Toggle word wrap

您可以通过完成以下步骤,使用 OpenShift Service Mesh 卸载 cert-manager Operator。在删除以下资源前,请验证没有 Red Hat OpenShift Service Mesh 或 Istio 组件引用 Istio-CSR 代理或它发布的证书。当这些资源仍在使用时删除这些资源可能会破坏网格功能。

流程

  1. 运行以下命令来删除 IstioCSR 自定义资源:

    $ oc -n <istio-csr_project_name> delete istiocsrs.operator.openshift.io default
    Copy to Clipboard Toggle word wrap
  2. 删除相关资源:

    1. 运行以下命令列出 cluster scoped-resources:

      $ oc get clusterrolebindings,clusterroles -l "app=cert-manager-istio-csr,app.kubernetes.io/name=cert-manager-istio-csr"
      Copy to Clipboard Toggle word wrap

      保存列出的资源的名称,供以后参考。

    2. 运行以下命令,列出 istio-csr 代理部署的命名空间中的资源:

      $ oc get certificate,deployments,services,serviceaccounts -l "app=cert-manager-istio-csr,app.kubernetes.io/name=cert-manager-istio-csr" -n <istio_csr_project_name>
      Copy to Clipboard Toggle word wrap

      保存列出的资源的名称,供以后参考。

    3. 运行以下命令,列出 Red Hat OpenShift Service Mesh 或 Istio 部署命名空间中的资源:

      $ oc get roles,rolebindings \
        -l "app=cert-manager-istio-csr,app.kubernetes.io/name=cert-manager-istio-csr" \
        -n <istio_csr_project_name>
      Copy to Clipboard Toggle word wrap

      保存列出的资源的名称,供以后参考。

    4. 对于前面步骤中列出的每个资源,运行以下命令来删除资源:

      $ oc -n <istio_csr_project_name> delete <resource_type>/<resource_name>
      Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat