apiVersion: maistra.io/v2
kind: ServiceMeshControlPlane
spec:
version: v2.6
security:
dataPlane:
mtls: true
如果您的服务网格应用程序由复杂的微服务阵列构成,您可以使用 Red Hat OpenShift 服务网格来自定义这些服务之间通信的安全性。OpenShift Dedicated 的基础架构以及服务网格的流量管理功能可帮助您管理应用程序的复杂性并保护微服务。
如果您有一个项目,请将您的项目添加到 ServiceMeshMemberRoll
资源。
如果您没有项目,请安装 Bookinfo 示例应用程序 并将其添加到 ServiceMeshMemberRoll
资源。示例应用程序有助于说明安全概念。
相互传输层安全性 (mTLS) 是一种允许双方相互验证身份的协议。它是某些协议(IKE、SSH)中的默认身份验证模式,而在其他协议(TLS)中则是可选的。您可以无需更改应用程序或服务代码即可使用 mTLS。TLS 完全由服务网格基础设施以及两个 sidecar 代理之间处理。
默认情况下,Red Hat OpenShift 服务网格中的 mTLS 已启用并设置为宽松模式,其中服务网格中的 sidecar 既接受纯文本流量,也接受使用 mTLS 加密的连接。如果您的网格中配置为使用严格 mTLS 的服务正在与网格外部的服务通信,则这些服务之间的通信可能会中断,因为严格的 mTLS 要求客户端和服务器都能够验证彼此的身份。在将工作负载迁移到服务网格时,请使用宽松模式。然后,您可以跨网格、命名空间或应用程序启用严格的 mTLS。
在服务网格控制平面级别跨网格启用 mTLS 可以保护服务网格中的所有流量,而无需重写您的应用程序和工作负载。您可以在数据平面级别在 ServiceMeshControlPlane
资源中保护网格中的命名空间。要自定义流量加密连接,请在应用程序级别使用 PeerAuthentication
和 DestinationRule
资源配置命名空间。
如果您的工作负载不与外部服务通信,则可以快速在网格中启用 mTLS,而不会中断通信。您可以通过将 ServiceMeshControlPlane
资源中的 spec.security.dataPlane.mtls
设置为 true
来启用它。操作符将创建所需的资源。
apiVersion: maistra.io/v2
kind: ServiceMeshControlPlane
spec:
version: v2.6
security:
dataPlane:
mtls: true
您也可以使用 OpenShift Dedicated Web 控制台启用 mTLS。
登录到 Web 控制台。
单击**项目**菜单,然后选择安装服务网格控制平面的项目,例如**istio-system**。
点击操作符 → 已安装的操作符。
在提供的API下点击服务网格控制平面。
点击您的ServiceMeshControlPlane
资源的名称,例如basic
。
在详细信息页面上,点击安全部分中数据平面安全的切换按钮。
您还可以通过创建策略为单个服务配置 mTLS。
使用以下示例创建一个 YAML 文件。
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: <namespace>
spec:
mtls:
mode: STRICT
将<namespace>
替换为服务所在的命名空间。
运行以下命令在服务所在的命名空间中创建资源。它必须与您刚刚创建的策略资源中的namespace
字段匹配。
$ oc create -n <namespace> -f <policy.yaml>
如果您未使用自动 mTLS 并将 |
创建目标规则以配置服务网格在向网格中的其他服务发送请求时使用 mTLS。
使用以下示例创建一个 YAML 文件。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: default
namespace: <namespace>
spec:
host: "*.<namespace>.svc.cluster.local"
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
将<namespace>
替换为服务所在的命名空间。
运行以下命令在服务所在的命名空间中创建资源。它必须与您刚刚创建的DestinationRule
资源中的namespace
字段匹配。
$ oc create -n <namespace> -f <destination-rule.yaml>
如果您的环境对服务网格中的加密流量有特定要求,您可以通过设置ServiceMeshControlPlane
资源中的spec.security.controlPlane.tls.minProtocolVersion
或spec.security.controlPlane.tls.maxProtocolVersion
来控制允许的加密功能。在您的服务网格控制平面资源中配置的这些值定义了网格组件在通过 TLS 安全通信时使用的最小和最大 TLS 版本。
默认值为TLS_AUTO
,不指定 TLS 版本。
值 | 描述 |
---|---|
|
默认值 |
|
TLS 版本 1.0 |
|
TLS 版本 1.1 |
|
TLS 版本 1.2 |
|
TLS 版本 1.3 |
登录到 Web 控制台。
单击**项目**菜单,然后选择安装服务网格控制平面的项目,例如**istio-system**。
点击操作符 → 已安装的操作符。
在提供的API下点击服务网格控制平面。
点击您的ServiceMeshControlPlane
资源的名称,例如basic
。
点击YAML选项卡。
在 YAML 编辑器中插入以下代码片段。将minProtocolVersion
中的值替换为 TLS 版本值。在此示例中,最小 TLS 版本设置为TLSv1_2
。
kind: ServiceMeshControlPlane
spec:
security:
controlPlane:
tls:
minProtocolVersion: TLSv1_2
点击保存。
点击刷新以验证更改是否已正确更新。
Kiali 控制台提供了几种方法来验证您的应用程序、服务和工作负载是否启用了 mTLS 加密。
在标题的右侧,当网格严格为整个服务网格启用了 mTLS 时,Kiali 会显示一个锁图标。这意味着网格中的所有通信都使用 mTLS。
当网格配置为PERMISSIVE
模式或网格范围 mTLS 配置中存在错误时,Kiali 会显示一个空心锁图标。
图表页面可以选择在图表边缘显示安全徽章,以指示 mTLS 是否已启用。要启用图表上的安全徽章,请从显示菜单下的显示徽章中选中安全复选框。当边显示锁图标时,表示至少存在一个启用 mTLS 的请求。如果同时存在 mTLS 和非 mTLS 请求,侧面板将显示使用 mTLS 的请求百分比。
应用程序详细信息概述页面在至少存在一个启用 mTLS 的请求的图表边缘显示安全图标。
工作负载详细信息概述页面在至少存在一个启用 mTLS 的请求的图表边缘显示安全图标。
服务详细信息概述页面在至少存在一个启用 mTLS 的请求的图表边缘显示安全图标。另请注意,Kiali 在配置为 mTLS 的端口旁边的网络部分显示锁图标。
基于角色的访问控制 (RBAC) 对象决定用户或服务是否允许在项目中执行给定的操作。您可以在网格中为您的工作负载定义网格范围、命名空间范围和工作负载范围的访问控制。
要配置 RBAC,请在您要配置访问权限的命名空间中创建一个AuthorizationPolicy
资源。如果您要配置网格范围的访问权限,请使用安装服务网格控制平面的项目,例如istio-system
。
例如,使用 RBAC,您可以创建执行以下操作的策略:
配置项目内通信。
允许或拒绝对默认命名空间中的所有工作负载的完全访问。
允许或拒绝入口网关访问。
要求访问令牌。
授权策略包括选择器、操作和规则列表
selector
字段指定策略的目标。
action
字段指定是允许还是拒绝请求。
rules
字段指定何时触发操作。
from
字段指定对请求来源的约束。
to
字段指定对请求目标和参数的约束。
when
字段指定要应用规则的其他条件。
创建您的AuthorizationPolicy
资源。以下示例显示一个资源,该资源更新入口策略AuthorizationPolicy
以拒绝 IP 地址访问入口网关。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: ingress-policy
namespace: istio-system
spec:
selector:
matchLabels:
app: istio-ingressgateway
action: DENY
rules:
- from:
- source:
ipBlocks: ["1.2.3.4"]
在您编写资源后运行以下命令以在您的命名空间中创建您的资源。命名空间必须与您的AuthorizationPolicy
资源中的metadata.namespace
字段匹配。
$ oc create -n istio-system -f <filename>
考虑以下其他常用配置示例。
您可以使用AuthorizationPolicy
配置您的服务网格控制平面以允许或拒绝与您的网格或网格中的服务通信的流量。
您可以使用以下AuthorizationPolicy
资源示例拒绝来自任何不在bookinfo
命名空间中的源的请求。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: httpbin-deny
namespace: bookinfo
spec:
selector:
matchLabels:
app: httpbin
version: v1
action: DENY
rules:
- from:
- source:
notNamespaces: ["bookinfo"]
以下示例显示一个允许全部授权策略,允许完全访问bookinfo
命名空间中的所有工作负载。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: allow-all
namespace: bookinfo
spec:
action: ALLOW
rules:
- {}
以下示例显示一个策略,拒绝访问bookinfo
命名空间中的所有工作负载。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: deny-all
namespace: bookinfo
spec:
{}
您可以设置授权策略,根据IP地址添加允许或拒绝列表。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: ingress-policy
namespace: istio-system
spec:
selector:
matchLabels:
app: istio-ingressgateway
action: ALLOW
rules:
- from:
- source:
ipBlocks: ["1.2.3.4", "5.6.7.0/24"]
您可以使用JSON Web Token (JWT)来限制可以访问您的网格的内容。身份验证后,用户或服务可以访问与该令牌关联的路由和服务。
创建一个RequestAuthentication
资源,该资源定义工作负载支持的身份验证方法。以下示例接受由http://127.0.0.1:8080/auth/realms/master
颁发的JWT。
apiVersion: "security.istio.io/v1beta1"
kind: "RequestAuthentication"
metadata:
name: "jwt-example"
namespace: bookinfo
spec:
selector:
matchLabels:
app: httpbin
jwtRules:
- issuer: "http://127.0.0.1:8080/auth/realms/master"
jwksUri: "http://keycloak.default.svc:8080/auth/realms/master/protocol/openid-connect/certs"
然后,在相同的命名空间中创建一个AuthorizationPolicy
资源,以与您创建的RequestAuthentication
资源一起工作。以下示例要求在向httpbin
工作负载发送请求时,在Authorization
标头中存在JWT。
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
name: "frontend-ingress"
namespace: bookinfo
spec:
selector:
matchLabels:
app: httpbin
action: DENY
rules:
- from:
- source:
notRequestPrincipals: ["*"]
密码套件和椭圆曲线Diffie-Hellman (ECDH曲线)可以帮助您保护您的服务网格。您可以使用spec.security.controlplane.tls.cipherSuites
定义密码套件的逗号分隔列表,并使用spec.security.controlplane.tls.ecdhCurves
在您的ServiceMeshControlPlane
资源中定义ECDH曲线。如果这两个属性为空,则使用默认值。
如果您的服务网格使用TLS 1.2或更早版本,则cipherSuites
设置有效。在与TLS 1.3协商时,它无效。
按优先级顺序设置逗号分隔列表中的密码套件。例如,ecdhCurves: CurveP256, CurveP384
将CurveP256
设置为比CurveP384
更高的优先级。
配置密码套件时,必须包含 |
支持的密码套件:
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA
支持的ECDH曲线:
CurveP256
CurveP384
CurveP521
X25519
您可以从ServiceMeshControlPlane
(SMCP)规范中配置您自己的JSON Web Key Sets (JWKS)解析器证书颁发机构(CA)。
编辑ServiceMeshControlPlane
规范文件
$ oc edit smcp <smcp-name>
通过将ServiceMeshControlPlane
规范中mtls
字段的值设置为true
来启用数据平面的mtls
,如下例所示
spec:
security:
dataPlane:
mtls: true # enable mtls for data plane
# JWKSResolver extra CA
# PEM-encoded certificate content to trust an additional CA
jwksResolverCA: |
-----BEGIN CERTIFICATE-----
[...]
[...]
-----END CERTIFICATE-----
...
保存更改。OpenShift Dedicated会自动应用它们。
将创建一个ConfigMap
,例如pilot-jwks-cacerts-<SMCP name>
,其中包含CA .pem data
。
pilot-jwks-cacerts-<SMCP name>
kind: ConfigMap
apiVersion: v1
data:
extra.pem: |
-----BEGIN CERTIFICATE-----
[...]
[...]
-----END CERTIFICATE-----
默认情况下,Red Hat OpenShift Service Mesh会生成一个自签名根证书和密钥,并使用它们来签名工作负载证书。您也可以使用用户定义的证书和密钥,使用用户定义的根证书来签名工作负载证书。此任务演示了将证书和密钥插入服务网格的示例。
安装启用相互TLS的Red Hat OpenShift Service Mesh以配置证书。
此示例使用来自Maistra存储库的证书。对于生产环境,请使用您从证书颁发机构获得的自己的证书。
部署Bookinfo示例应用程序,以按照这些说明验证结果。
需要OpenSSL来验证证书。
要使用现有的签名(CA)证书和密钥,必须创建一个信任链文件,其中包含CA证书、密钥和根证书。必须为每个相应的证书使用以下确切的文件名。CA证书名为ca-cert.pem
,密钥为ca-key.pem
,签署ca-cert.pem
的根证书名为root-cert.pem
。如果您的工作负载使用中间证书,则必须在cert-chain.pem
文件中指定它们。
将来自Maistra存储库的示例证书保存在本地,并将<path>
替换为您证书的路径。
创建一个名为cacert
的密钥,其中包含输入文件ca-cert.pem
、ca-key.pem
、root-cert.pem
和cert-chain.pem
。
$ oc create secret generic cacerts -n istio-system --from-file=<path>/ca-cert.pem \
--from-file=<path>/ca-key.pem --from-file=<path>/root-cert.pem \
--from-file=<path>/cert-chain.pem
在ServiceMeshControlPlane
资源中,将spec.security.dataPlane.mtls true
设置为true
,并配置certificateAuthority
字段,如下例所示。默认的rootCADir
是/etc/cacerts
。如果密钥和证书安装在默认位置,则不需要设置privateKey
。服务网格从密钥挂载文件中读取证书和密钥。
apiVersion: maistra.io/v2
kind: ServiceMeshControlPlane
spec:
security:
dataPlane:
mtls: true
certificateAuthority:
type: Istiod
istiod:
type: PrivateKey
privateKey:
rootCADir: /etc/cacerts
创建/更改/删除cacert
密钥后,必须重启服务网格控制平面istiod
和gateway
pod,以便更改生效。使用以下命令重启pod
$ oc -n istio-system delete pods -l 'app in (istiod,istio-ingressgateway, istio-egressgateway)'
删除pod后,Operator将自动重新创建它们。
重启bookinfo应用程序pod,以便sidecar代理获取密钥更改。使用以下命令重启pod
$ oc -n bookinfo delete pods --all
您应该看到类似于以下的输出
pod "details-v1-6cd699df8c-j54nh" deleted
pod "productpage-v1-5ddcb4b84f-mtmf2" deleted
pod "ratings-v1-bdbcc68bc-kmng4" deleted
pod "reviews-v1-754ddd7b6f-lqhsv" deleted
pod "reviews-v2-675679877f-q67r2" deleted
pod "reviews-v3-79d7549c7-c2gjs" deleted
使用以下命令验证pod是否已创建并已准备就绪
$ oc get pods -n bookinfo
使用Bookinfo示例应用程序验证工作负载证书是否已由插入CA的证书签名。此过程需要您在计算机上安装openssl
。
要从bookinfo工作负载中提取证书,请使用以下命令
$ sleep 60
$ oc -n bookinfo exec "$(oc -n bookinfo get pod -l app=productpage -o jsonpath={.items..metadata.name})" -c istio-proxy -- openssl s_client -showcerts -connect details:9080 > bookinfo-proxy-cert.txt
$ sed -n '/-----BEGIN CERTIFICATE-----/{:start /-----END CERTIFICATE-----/!{N;b start};/.*/p}' bookinfo-proxy-cert.txt > certs.pem
$ awk 'BEGIN {counter=0;} /BEGIN CERT/{counter++} { print > "proxy-cert-" counter ".pem"}' < certs.pem
运行该命令后,您的工作目录中应该有三个文件:proxy-cert-1.pem
、proxy-cert-2.pem
和proxy-cert-3.pem
。
验证根证书是否与管理员指定的证书相同。将<path>
替换为您证书的路径。
$ openssl x509 -in <path>/root-cert.pem -text -noout > /tmp/root-cert.crt.txt
在终端窗口中运行以下语法。
$ openssl x509 -in ./proxy-cert-3.pem -text -noout > /tmp/pod-root-cert.crt.txt
通过在终端窗口中运行以下语法来比较证书。
$ diff -s /tmp/root-cert.crt.txt /tmp/pod-root-cert.crt.txt
您应该看到以下结果:Files /tmp/root-cert.crt.txt and /tmp/pod-root-cert.crt.txt are identical
验证CA证书是否与管理员指定的证书相同。将<path>
替换为您证书的路径。
$ openssl x509 -in <path>/ca-cert.pem -text -noout > /tmp/ca-cert.crt.txt
在终端窗口中运行以下语法。
$ openssl x509 -in ./proxy-cert-2.pem -text -noout > /tmp/pod-cert-chain-ca.crt.txt
通过在终端窗口中运行以下语法来比较证书。
$ diff -s /tmp/ca-cert.crt.txt /tmp/pod-cert-chain-ca.crt.txt
您应该看到以下结果:Files /tmp/ca-cert.crt.txt and /tmp/pod-cert-chain-ca.crt.txt are identical.
验证从根证书到工作负载证书的证书链。将<path>
替换为您证书的路径。
$ openssl verify -CAfile <(cat <path>/ca-cert.pem <path>/root-cert.pem) ./proxy-cert-1.pem
您应该看到以下结果:./proxy-cert-1.pem: OK
cert-manager工具是用于Kubernetes上X.509证书管理的解决方案。它提供了一个统一的API,用于将应用程序与私有或公共密钥基础设施(PKI)集成,例如Vault、Google Cloud证书颁发机构服务、Let’s Encrypt和其他提供商。
cert-manager工具通过在证书过期前配置的时间尝试续订证书来确保证书有效且最新。
对于Istio用户,cert-manager还提供了与istio-csr
的集成,istio-csr
是一个证书颁发机构(CA)服务器,它处理来自Istio代理的证书签名请求(CSR)。然后,服务器将签名委托给cert-manager,cert-manager将CSR转发到配置的CA服务器。
Red Hat提供与 |
以下cert-manager版本之一
适用于Red Hat OpenShift 1.10或更高版本的cert-manager Operator
社区cert-manager Operator 1.11或更高版本
cert-manager 1.11或更高版本
OpenShift Service Mesh Operator 2.4或更高版本
istio-csr
0.6.0或更高版本
为了避免在使用 |
您可以安装cert-manager
工具来管理TLS证书的生命周期,并确保它们有效且最新。如果您在环境中运行Istio,您还可以安装istio-csr
证书颁发机构(CA)服务器,该服务器处理来自Istio代理的证书签名请求(CSR)。istio-csr
CA将签名委托给cert-manager
工具,后者再委托给配置的CA。
创建根集群颁发者
创建cluster-issuer
对象,如下例所示
cluster-issuer.yaml
示例apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: selfsigned-root-issuer
namespace: cert-manager
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: root-ca
namespace: cert-manager
spec:
isCA: true
duration: 21600h # 900d
secretName: root-ca
commonName: root-ca.my-company.net
subject:
organizations:
- my-company.net
issuerRef:
name: selfsigned-root-issuer
kind: Issuer
group: cert-manager.io
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: root-ca
spec:
ca:
secretName: root-ca
selfsigned-root-issuer 颁发者和root-ca 证书的命名空间是cert-manager ,因为root-ca 是集群颁发者,所以cert-manager会在其自身的命名空间中查找引用的密钥。对于Red Hat OpenShift的cert-manager Operator,命名空间称为cert-manager 。 |
使用以下命令创建对象
$ oc apply -f cluster-issuer.yaml
创建istio-ca
对象,如下例所示
istio-ca.yaml
示例apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: istio-ca
namespace: istio-system
spec:
isCA: true
duration: 21600h
secretName: istio-ca
commonName: istio-ca.my-company.net
subject:
organizations:
- my-company.net
issuerRef:
name: root-ca
kind: ClusterIssuer
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 -n istio-system -f istio-ca.yaml
安装istio-csr
$ helm install istio-csr jetstack/cert-manager-istio-csr \
-n istio-system \
-f deploy/examples/cert-manager/istio-csr/istio-csr.yaml
istio-csr.yaml
示例replicaCount: 2
image:
repository: quay.io/jetstack/cert-manager-istio-csr
tag: v0.6.0
pullSecretName: ""
app:
certmanager:
namespace: istio-system
issuer:
group: cert-manager.io
kind: Issuer
name: istio-ca
controller:
configmapNamespaceSelector: "maistra.io/member-of=istio-system"
leaderElectionNamespace: istio-system
istio:
namespace: istio-system
revisions: ["basic"]
server:
maxCertificateDuration: 5m
tls:
certificateDNSNames:
# This DNS name must be set in the SMCP spec.security.certificateAuthority.cert-manager.address
- cert-manager-istio-csr.istio-system.svc
部署SMCP
$ oc apply -f mesh.yaml -n istio-system
mesh.yaml
示例apiVersion: maistra.io/v2
kind: ServiceMeshControlPlane
metadata:
name: basic
spec:
addons:
grafana:
enabled: false
kiali:
enabled: false
prometheus:
enabled: false
proxy:
accessLogging:
file:
name: /dev/stdout
security:
certificateAuthority:
cert-manager:
address: cert-manager-istio-csr.istio-system.svc:443
type: cert-manager
dataPlane:
mtls: true
identity:
type: ThirdParty
tracing:
type: None
---
apiVersion: maistra.io/v1
kind: ServiceMeshMemberRoll
metadata:
name: default
spec:
members:
- httpbin
- sleep
当配置security.certificateAuthority.type: cert-manager 时,必须设置security.identity.type: ThirdParty 。 |
使用示例httpbin
服务和sleep
应用程序检查来自入口网关的mTLS流量,并验证cert-manager
工具是否已安装。
部署HTTP和sleep
应用程序
$ oc new-project <namespace>
$ oc apply -f https://raw.githubusercontent.com/maistra/istio/maistra-2.4/samples/httpbin/httpbin.yaml
$ oc apply -f https://raw.githubusercontent.com/maistra/istio/maistra-2.4/samples/sleep/sleep.yaml
验证sleep
是否可以访问httpbin
服务
$ oc exec "$(oc get pod -l app=sleep -n <namespace> \
-o jsonpath={.items..metadata.name})" -c sleep -n <namespace> -- \
curl http://httpbin.<namespace>:8000/ip -s -o /dev/null \
-w "%{http_code}\n"
200
检查来自入口网关到httpbin
服务的mTLS流量
$ oc apply -n <namespace> -f https://raw.githubusercontent.com/maistra/istio/maistra-2.4/samples/httpbin/httpbin-gateway.yaml
获取istio-ingressgateway
路由
INGRESS_HOST=$(oc -n istio-system get routes istio-ingressgateway -o jsonpath='{.spec.host}')
验证来自入口网关到httpbin
服务的mTLS流量
$ curl -s -I http://$INGRESS_HOST/headers -o /dev/null -w "%{http_code}" -s
有关如何安装适用于OpenShift Dedicated的cert-manager Operator的信息,请参阅:安装适用于Red Hat OpenShift的cert-manager Operator。