第 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
命令。
流程
运行以下命令来创建
istio-system
命名空间:oc create namespace istio-system
$ oc create namespace istio-system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来修补 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"}]}}}'
$ 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 Copied! Toggle word wrap Toggle overflow 通过为
istio-csr
代理创建Issuer
对象来创建 root 证书颁发机构(CA)签发者:运行以下命令,为安装
istio-csr
代理创建一个新项目:oc new-project istio-csr
$ oc new-project istio-csr
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建类似以下示例的
Issuer
对象:注意selfSigned
issuer 用于演示、测试或概念验证环境。对于生产环境部署,请使用安全可靠的 CA。issuer.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建对象:
oc apply -f issuer.yaml
$ oc apply -f issuer.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,等待
istio-ca
证书包含 "Ready" 状态条件:oc wait --for=condition=Ready certificates/istio-ca -n istio-system
$ oc wait --for=condition=Ready certificates/istio-ca -n istio-system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建
IstioCSR
自定义资源:创建类似以下示例的
IstioCSR
自定义资源:istioCSR.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
istio-csr
代理:oc create -f istioCSR.yaml
$ oc create -f istioCSR.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证
istio-csr
部署是否已就绪:oc get deployment -n istio-csr
$ oc get deployment -n istio-csr
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
安装
istio
资源:注意配置禁用 Istio 的内置 CA 服务器,并将来自
istiod
的证书签名请求转发到istio-csr
代理。istio-csr
代理从 cert-manager Operator 获取istiod
和网格工作负载的证书。istiod
TLS 证书由istio-csr
代理生成的证书挂载到 pod 中,位于已知位置以供使用。创建类似以下示例的
Istio
对象:istio.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
Istio
资源:oc apply -f istio.yaml
$ oc apply -f istio.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证
istio
资源是否显示 "Ready" 状态条件:oc wait --for=condition=Ready istios/default -n istio-system
$ oc wait --for=condition=Ready istios/default -n istio-system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
您可以使用示例 httpbin
服务和 sleep
应用程序来验证工作负载之间的流量。检查工作负载代理证书,以验证 cert-manager Operator 是否已正确安装。
创建命名空间:
运行以下命令来创建
apps-1
命名空间:oc new-project apps-1
$ oc new-project apps-1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
apps-2
命名空间:oc new-project apps-2
$ oc new-project apps-2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在命名空间中添加
istio-injection=enabled
标签:运行以下命令,在
apps-1
命名空间中添加istio-injection=enabled
标签:oc label namespaces apps-1 istio-injection=enabled
$ oc label namespaces apps-1 istio-injection=enabled
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在
apps-2
命名空间中添加istio-injection=enabled
标签:oc label namespaces apps-2 istio-injection=enabled
$ oc label namespaces apps-2 istio-injection=enabled
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在命名空间中部署
httpbin
应用程序:运行以下命令,在
apps-1
命名空间中部署httpbin
应用程序:oc apply -n apps-1 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/httpbin/httpbin.yaml
$ oc apply -n apps-1 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/httpbin/httpbin.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在
apps-2
命名空间中部署httpbin
应用程序:oc apply -n apps-2 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/httpbin/httpbin.yaml
$ oc apply -n apps-2 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/httpbin/httpbin.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在命名空间中部署
sleep
应用程序:运行以下命令,在
apps-1
命名空间中部署sleep
应用程序:oc apply -n apps-1 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/sleep/sleep.yaml
$ oc apply -n apps-1 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/sleep/sleep.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在
apps-2
命名空间中部署sleep
应用程序:oc apply -n apps-2 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/sleep/sleep.yaml
$ oc apply -n apps-2 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/sleep/sleep.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证创建的 apps 已注入了 sidecar:
运行以下命令,验证创建的 apps 已注入
apps-1
命名空间:oc get pods -n apps-1
$ oc get pods -n apps-1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证创建的 apps 是否为
apps-2
命名空间注入了 sidecar:oc get pods -n apps-2
$ oc get pods -n apps-2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建网格范围严格的 mutual Transport Layer Security (mTLS)策略,如下例所示:
注意在严格的 mTLS 模式中启用
PeerAuthentication
会验证证书是否被正确分布,且 mTLS 通信功能在工作负载之间正常工作。peer_auth.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用 mTLS 策略:
oc apply -f peer_auth.yaml
$ oc apply -f peer_auth.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证
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
$ 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 Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证
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
$ 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 Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证
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
$ 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 Copied! Toggle word wrap Toggle overflow 输出示例
... Issuer: O = cert-manager + O = cluster.local, CN = istio-ca ... X509v3 Subject Alternative Name: URI:spiffe://cluster.local/ns/apps-1/sa/httpbin
... 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 Copied! Toggle word wrap Toggle overflow
您可以通过完成以下步骤,使用 OpenShift Service Mesh 卸载 cert-manager Operator。在删除以下资源前,请验证没有 Red Hat OpenShift Service Mesh 或 Istio 组件引用 Istio-CSR
代理或它发布的证书。当这些资源仍在使用时删除这些资源可能会破坏网格功能。
流程
运行以下命令来删除
IstioCSR
自定义资源:oc -n <istio-csr_project_name> delete istiocsrs.operator.openshift.io default
$ oc -n <istio-csr_project_name> delete istiocsrs.operator.openshift.io default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除相关资源:
运行以下命令列出 cluster scoped-resources:
oc get clusterrolebindings,clusterroles -l "app=cert-manager-istio-csr,app.kubernetes.io/name=cert-manager-istio-csr"
$ oc get clusterrolebindings,clusterroles -l "app=cert-manager-istio-csr,app.kubernetes.io/name=cert-manager-istio-csr"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 保存列出的资源的名称,供以后参考。
运行以下命令,列出
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>
$ 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 Copied! Toggle word wrap Toggle overflow 保存列出的资源的名称,供以后参考。
运行以下命令,列出 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>
$ 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 Copied! Toggle word wrap Toggle overflow 保存列出的资源的名称,供以后参考。
对于前面步骤中列出的每个资源,运行以下命令来删除资源:
oc -n <istio_csr_project_name> delete <resource_type>/<resource_name>
$ oc -n <istio_csr_project_name> delete <resource_type>/<resource_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow