$ oc create namespace istio-system
cert-manager 工具是 Kubernetes 上 X.509 证书管理的解决方案。它提供了一个统一的 API,用于将应用程序与私有或公钥基础设施 (PKI)(例如 Vault、Google Cloud 证书颁发机构服务、Let’s Encrypt 和其他提供商)集成。
在创建和安装您的 |
cert-manager 工具通过在证书过期前配置的时间尝试续订证书来确保证书有效且最新。
cert-manager 工具通过名为istio-csr
的外部代理与 Istio 集成。istio-csr
代理通过以下方式处理来自 Istio 代理和controlplane
的证书签名请求 (CSR)
验证工作负载的身份。
通过 cert-manager 为工作负载创建 CSR。
然后,cert-manager 工具会向已配置的 CA 发行者创建 CSR,后者将对证书进行签名。
Red Hat 提供对与 |
以下 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
您可以通过部署istio-csr
然后创建一个使用istio-csr
代理处理工作负载和控制平面证书签名请求的Istio
资源来将 cert-manager 与 OpenShift Service Mesh 集成。此示例创建了一个自签名Issuer
,但也可以使用任何其他Issuer
。
必须在安装 |
通过运行以下命令创建istio-system
命名空间
$ oc create namespace istio-system
通过在 YAML 文件中创建Issuer
对象来创建根发行者。
创建一个类似于以下示例的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
证书包含“就绪”状态条件,方法是运行以下命令
$ oc wait --for=condition=Ready certificates/istio-ca -n istio-system
将istio-ca
证书复制到cert-manager
命名空间,以便istio-csr
可以使用它
通过运行以下命令将密钥复制到本地文件
$ oc get -n istio-system secret istio-ca -o jsonpath='{.data.tls\.crt}' | base64 -d > ca.pem
通过运行以下命令在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 资源默认使用就地更新策略。如果您计划在创建和安装Istio
资源时将spec.updateStrategy
保留为InPlace
,请按照此步骤操作。
通过运行以下命令将 Jetstack 图表存储库添加到您的本地 Helm 存储库
$ helm repo add jetstack https://charts.jetstack.io --force-update
通过运行以下命令安装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 资源默认使用就地更新策略。如果您计划在创建和安装Istio
资源时将spec.updateStrategy
更改为RevisionBased
,请按照此步骤操作。
将所有 Istio 修订版指定给您的istio-csr
部署。请参阅“istio-csr 部署”。
通过运行以下命令将 Jetstack 图表添加到您的本地 Helm 存储库
$ helm repo add jetstack https://charts.jetstack.io --force-update
通过运行以下命令使用您的修订版名称安装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-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
资源
$ oc apply -f istio.yaml
运行以下命令等待Istio
对象就绪
$ oc wait --for=condition=Ready istios/default -n istio-system
您可以使用示例httpbin
服务和sleep
应用程序来检查工作负载之间的通信。您还可以检查代理的工作负载证书,以验证 cert-manager 工具是否已正确安装。
运行以下命令创建sample
命名空间
$ oc new-project sample
运行以下命令查找您的活动 Istio 修订版本
$ oc get istiorevisions
运行以下命令将活动修订版本的注入标签添加到sample
命名空间
$ 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
如果您使用基于修订版本的更新策略部署了 Istio 资源,则每次更新控制平面时都必须传递所有修订版本。您必须按以下顺序执行更新
使用新的修订版本更新istio-csr
部署。
更新Istio.spec.version
参数/字段的值。
在此示例中,controlplane
正在从v1.23.0
更新到1.23.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
。
类似于以下示例更新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 |
运行以下命令从您的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}"