4.2. 安装 cert-manager


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

重要

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

流程

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

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

    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 证书包含 "Ready" 状态条件:

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

    1. 运行以下命令,将 secret 复制到本地文件中:

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

      $ 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 资源。

4.2.1. 使用原位更新策略安装 istio-csr 代理

Istio 资源默认使用 in place 更新策略。如果您计划在创建并安装 Istio 资源时将 spec.updateStrategy 设置为 InPlace,请按照以下步骤操作。

流程

  1. 运行以下命令,将 Jetstack chart 仓库添加到本地 Helm 仓库中:

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

    $ 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"

后续步骤

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

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

流程

  1. 指定 istio-csr 部署的所有 Istio 修订版本。请参阅"istio-csr 部署"。
  2. 运行以下命令,将 Jetstack chart 添加到本地 Helm 仓库中:

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

    $ 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

其他资源

后续步骤

4.2.3. 安装 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

4.2.4. 验证 cert-manager 安装

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

流程

  1. 运行以下命令来创建 示例 命名空间:

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

    $ oc get istiorevisions
  3. 运行以下命令,将活跃修订版本的注入标签添加到 示例 命名空间中:

    $ 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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.