×

cert-manager 工具是 Kubernetes 上 X.509 证书管理的解决方案。它提供了一个统一的 API,用于将应用程序与私有或公钥基础设施 (PKI)(例如 Vault、Google Cloud 证书颁发机构服务、Let’s Encrypt 和其他提供商)集成。

在创建和安装您的Istio资源之前,必须安装 cert-manager 工具。

cert-manager 工具通过在证书过期前配置的时间尝试续订证书来确保证书有效且最新。

关于将 Service Mesh 与 cert-manager 和 istio-csr 集成

cert-manager 工具通过名为istio-csr的外部代理与 Istio 集成。istio-csr代理通过以下方式处理来自 Istio 代理和controlplane的证书签名请求 (CSR)

  1. 验证工作负载的身份。

  2. 通过 cert-manager 为工作负载创建 CSR。

然后,cert-manager 工具会向已配置的 CA 发行者创建 CSR,后者将对证书进行签名。

Red Hat 提供对与istio-csr和 cert-manager 集成的支持。Red Hat 不直接支持istio-csr或社区 cert-manager 组件。此处显示的社区 cert-manager 的使用仅用于演示目的。

先决条件
  • 以下 cert-manager 版本之一

    • Red Hat cert-manager Operator 1.10 或更高版本

    • community cert-manager Operator 1.11 或更高版本

    • cert-manager 1.11 或更高版本

  • Red Hat OpenShift Service Mesh 3.0 或更高版本

  • 集群中正在运行IstioCNI实例

  • 已安装 Istio CLI(istioctl)工具

  • 已安装jq

  • 已安装 Helm

安装 cert-manager

您可以通过部署istio-csr然后创建一个使用istio-csr代理处理工作负载和控制平面证书签名请求的Istio资源来将 cert-manager 与 OpenShift Service Mesh 集成。此示例创建了一个自签名Issuer,但也可以使用任何其他Issuer

必须在安装Istio资源之前安装 cert-manager。

步骤
  1. 通过运行以下命令创建istio-system命名空间

    $ oc create namespace istio-system
  2. 通过在 YAML 文件中创建Issuer对象来创建根发行者。

    1. 创建一个类似于以下示例的Issuer对象

      示例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 # 10 years
        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
      ---
    2. 通过运行以下命令创建对象

      $ oc apply -f issuer.yaml
    3. 等待istio-ca证书包含“就绪”状态条件,方法是运行以下命令

      $ oc wait --for=condition=Ready certificates/istio-ca -n istio-system
  3. istio-ca证书复制到cert-manager命名空间,以便istio-csr可以使用它

    1. 通过运行以下命令将密钥复制到本地文件

      $ oc get -n istio-system secret istio-ca -o jsonpath='{.data.tls\.crt}' | base64 -d > ca.pem
    2. 通过运行以下命令在cert-manager命名空间中从本地证书文件创建密钥

      $ oc create secret generic -n cert-manager istio-root-ca --from-file=ca.pem=ca.pem
后续步骤

要安装istio-csr,必须按照您想要的更新策略类型遵循istio-csr安装说明。默认情况下,当您创建和安装Istio资源时,spec.updateStrategy设置为InPlace。安装istio-csr后,您将创建和安装Istio资源。

使用就地更新策略安装 istio-csr 代理

Istio 资源默认使用就地更新策略。如果您计划在创建和安装Istio资源时将spec.updateStrategy保留为InPlace,请按照此步骤操作。

步骤
  1. 通过运行以下命令将 Jetstack 图表存储库添加到您的本地 Helm 存储库

    $ helm repo add jetstack https://charts.jetstack.io --force-update
  2. 通过运行以下命令安装istio-csr图表

    $ helm upgrade cert-manager-istio-csr jetstack/cert-manager-istio-csr \
        --install \
        --namespace cert-manager \
        --wait \
        --set "app.tls.rootCAFile=/var/run/secrets/istio-csr/ca.pem" \
        --set "volumeMounts[0].name=root-ca" \
        --set "volumeMounts[0].mountPath=/var/run/secrets/istio-csr" \
        --set "volumes[0].name=root-ca" \
        --set "volumes[0].secret.secretName=istio-root-ca" \
        --set "app.istio.namespace=istio-system"

使用基于修订版的更新策略安装 istio-csr 代理

Istio 资源默认使用就地更新策略。如果您计划在创建和安装Istio资源时将spec.updateStrategy更改为RevisionBased,请按照此步骤操作。

步骤
  1. 将所有 Istio 修订版指定给您的istio-csr部署。请参阅“istio-csr 部署”。

  2. 通过运行以下命令将 Jetstack 图表添加到您的本地 Helm 存储库

    $ helm repo add jetstack https://charts.jetstack.io --force-update
  3. 通过运行以下命令使用您的修订版名称安装istio-csr图表

    $ helm upgrade cert-manager-istio-csr jetstack/cert-manager-istio-csr \
        --install \
        --namespace cert-manager \
        --wait \
        --set "app.tls.rootCAFile=/var/run/secrets/istio-csr/ca.pem" \
        --set "volumeMounts[0].name=root-ca" \
        --set "volumeMounts[0].mountPath=/var/run/secrets/istio-csr" \
        --set "volumes[0].name=root-ca" \
        --set "volumes[0].secret.secretName=istio-root-ca" \
        --set "app.istio.namespace=istio-system" \
        --set "app.istio.revisions={default-v1-23-0}"

    修订版本名称使用以下格式:<istio-name>-v<major_version>-<minor_version>-<patch_version>。例如:default-v1-23-0

附加资源

安装 Istio 资源

按照就地或基于修订版本的更新策略过程安装istio-csr后,您可以安装Istio资源。

您需要禁用 Istio 内置的 CA 服务器,并指示 istiod 使用istio-csr CA 服务器。istio-csr CA 服务器为 istiod 和用户工作负载颁发证书。

步骤
  1. 创建Istio对象,如下例所示

    示例istio.yaml对象
    apiVersion: sailoperator.io/v1alpha1
    kind: Istio
    metadata:
      name: default
    spec:
      version: v1.23.0
      namespace: istio-system
      values:
        global:
          caAddress: cert-manager-istio-csr.cert-manager.svc:443
        pilot:
          env:
            ENABLE_CA_SERVER: "false"
          volumeMounts:
            - mountPath: /tmp/var/run/secrets/istiod/tls
              name: istio-csr-dns-cert
              readOnly: true

    如果您使用基于修订版本的更新策略安装了 CSR 代理,则需要将以下内容添加到您的Istio对象 YAML 中

    kind: Istio
    metadata:
      name: default
    spec:
      updateStrategy:
        type: RevisionBased
  2. 运行以下命令创建Istio资源

    $ oc apply -f istio.yaml
  3. 运行以下命令等待Istio对象就绪

    $ oc wait --for=condition=Ready istios/default -n istio-system

验证 cert-manager 安装

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

步骤
  1. 运行以下命令创建sample命名空间

    $ oc new-project sample
  2. 运行以下命令查找您的活动 Istio 修订版本

    $ oc get istiorevisions
  3. 运行以下命令将活动修订版本的注入标签添加到sample命名空间

    $ oc label namespace sample istio.io/rev=<your-active-revision-name> --overwrite=true
  4. 运行以下命令部署示例httpbin服务

    $ oc apply -n sample -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yaml
  5. 运行以下命令部署示例sleep应用程序

    $ oc apply -n sample -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/sleep/sleep.yaml
  6. 运行以下命令等待这两个应用程序就绪

    $ oc rollout status -n sample deployment httpbin sleep
  7. 运行以下命令验证sleep应用程序是否可以访问httpbin服务

    $ oc exec "$(oc get pod -l app=sleep -n sample \
         -o jsonpath={.items..metadata.name})" -c sleep -n sample -- \
         curl http://httpbin.sample:8000/ip -s -o /dev/null \
         -w "%{http_code}\n"
    成功输出示例
    200
  8. 运行以下命令打印httpbin服务的工作负载证书并验证输出

    $ istioctl proxy-config secret -n sample $(oc get pods -n sample -o jsonpath='{.items..metadata.name}' --selector app=httpbin) -o json | jq -r '.dynamicActiveSecrets[0].secret.tlsCertificate.certificateChain.inlineBytes' | base64 --decode | openssl x509 -text -noout
    输出示例
    ...
    Issuer: O = cert-manager + O = cluster.local, CN = istio-ca
    ...
    X509v3 Subject Alternative Name:
      URI:spiffe://cluster.local/ns/sample/sa/httpbin

使用基于修订版本的更新策略更新 istio-csr 代理

如果您使用基于修订版本的更新策略部署了 Istio 资源,则每次更新控制平面时都必须传递所有修订版本。您必须按以下顺序执行更新

  1. 使用新的修订版本更新istio-csr部署。

  2. 更新Istio.spec.version参数/字段的值。

基于修订版本的控制平面的示例更新

在此示例中,controlplane正在从v1.23.0更新到1.23.1

  1. 运行以下命令使用新的修订版本更新istio-csr部署:

    $ helm upgrade cert-manager-istio-csr jetstack/cert-manager-istio-csr \
    --wait \
      --reuse-values \
      --set "app.istio.revisions={<old_revision>,<new_revision>}"

    其中

    old_revision

    <istio-name>-v<major_version>-<minor_version>-<patch_version>格式指定旧修订版本。例如:default-v1-23-0

    new_revision

    <istio-name>-v<major_version>-<minor_version>-<patch_version>格式指定新修订版本。例如:default-v1-23-1

  2. 类似于以下示例更新Istio对象中的istio.spec.version

    示例istio.yaml文件
    apiVersion: sailoperator.io/v1alpha1
    kind: Istio
    metadata:
      name: default
    spec:
      version: <new_revision> (1)
    1 更新到以字母 *v* 为前缀的新修订版本,例如v1.23.1
  3. 运行以下命令从您的istio-csr部署中删除旧修订版本

    helm upgrade cert-manager-istio-csr jetstack/cert-manager-istio-csr \
      --install \
      --namespace cert-manager \
      --wait \
      --reuse-values \
      --set "app.istio.revisions={default-v1-23-1}"