4.2. 安装 cert-manager
您可以通过部署 istio-csr
将 cert-manager 与 OpenShift Service Mesh 集成,然后创建一个使用 istio-csr
代理来处理工作负载和 control plane 证书签名请求的 Istio
资源。这个示例创建了一个自签名的 Issuer
,但可以使用任何其他 Issuer
。
在安装 Istio
资源前,您必须安装 cert-manager。
流程
运行以下命令来创建
istio-system
命名空间:$ oc create namespace istio-system
通过在 YAML 文件中创建
Issuer
对象来创建 root 签发者。创建类似以下示例的
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 ---
运行以下命令来创建对象:
$ oc apply -f issuer.yaml
运行以下命令,等待
istio-ca
证书包含 "Ready" 状态条件:$ oc wait --for=condition=Ready certificates/istio-ca -n istio-system
将
istio-ca
证书复制到cert-manager
命名空间中,以便 istio-csr 可以使用它:运行以下命令,将 secret 复制到本地文件中:
$ oc get -n istio-system secret istio-ca -o jsonpath='{.data.tls\.crt}' | base64 -d > ca.pem
运行以下命令,从
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
,请按照以下步骤操作。
流程
运行以下命令,将 Jetstack chart 仓库添加到本地 Helm 仓库中:
$ helm repo add jetstack https://charts.jetstack.io --force-update
运行以下命令来安装
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
,请按照以下步骤操作。
流程
-
指定
istio-csr
部署的所有 Istio 修订版本。请参阅"istio-csr 部署"。 运行以下命令,将 Jetstack chart 添加到本地 Helm 仓库中:
$ helm repo add jetstack https://charts.jetstack.io --force-update
运行以下命令,使用您的修订名称安装
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 和用户工作负载发布证书。
流程
创建
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
运行以下命令来创建
Istio
资源:$ oc apply -f istio.yaml
运行以下命令等待
Istio
对象就绪:$ oc wait --for=condition=Ready istios/default -n istio-system
4.2.4. 验证 cert-manager 安装
您可以使用示例 httpbin
服务和 sleep
应用程序来检查工作负载之间的通信。您还可以检查代理的工作负载证书,以验证是否已正确安装了 cert-manager 工具。
流程
运行以下命令来创建
示例
命名空间:$ oc new-project sample
运行以下命令查找活跃的 Istio 修订版本:
$ oc get istiorevisions
运行以下命令,将活跃修订版本的注入标签添加到
示例
命名空间中:$ oc label namespace sample istio.io/rev=<your-active-revision-name> --overwrite=true
运行以下命令来部署示例
httpbin
服务:$ oc apply -n sample -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yaml
运行以下命令来部署示例
sleep
应用程序:$ oc apply -n sample -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/sleep/sleep.yaml
运行以下命令等待两个应用程序就绪:
$ oc rollout status -n sample deployment httpbin sleep
运行以下命令,验证
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
运行以下命令输出
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