双向 TLS¶
本示例说明如何让 proxyless gRPC 工作负载通过 Dubbo 控制面获得 mTLS 安全能力。xDS 是控制面向数据面下发服务发现、路由和安全策略的协议;mTLS 由 grpc-engine 注入、proxyless controller 和 xDS 进程接管,不在业务代码里写证书加载、TLS 握手或策略切换。
前提条件¶
- 已安装 Dubbo 控制平面的 Kubernetes 集群
- 已配置
kubectl访问集群 - 已安装
MeshService和PeerAuthenticationCRD - 工作负载开启
grpc-engine注入模板
0 侵入接入方式¶
业务代码不需要 import xds-api、不需要把 Server 或 Dial 改成 xDS API。Pod 被注入后,proxyless controller 会为每个工作负载生成 Secret,里面包含:
/etc/dubbo/proxy/grpc-bootstrap.json/etc/dubbo/proxy/dubbo-grpc-xds.json/etc/dubbo/proxy/cert-chain.pem/etc/dubbo/proxy/key.pem/etc/dubbo/proxy/root-cert.pem
同一个 runtime 配置文件里会带上控制面计算后的路由和安全信息。权重来自 MeshService,客户端出站 TLS 来自 MeshService.trafficPolicy.tls.mode,服务端入站 mTLS 来自 PeerAuthentication。
部署要求¶
Pod 所在命名空间需要开启注入:
kubectl create ns grpc-app --dry-run=client -o yaml | kubectl apply -f -
kubectl label namespace grpc-app dubbo-injection=enabled --overwrite
注入后,业务容器会获得 xDS 和证书配置:
GRPC_XDS_BOOTSTRAPXDS_ADDRESSCA_ADDRESSDUBBO_GRPC_XDS_CONFIGGRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORTDUBBO_GRPC_XDS_CREDENTIALS/etc/dubbo/proxy证书挂载
下发 mTLS 策略¶
MeshService 负责客户端出站 TLS 策略,PeerAuthentication 负责服务端入站 mTLS 策略。两者同时存在后,客户端和服务端都由 controller 生成的 runtime config 和 xDS CDS/LDS 配置驱动。
cat <<EOF | kubectl apply -f -
apiVersion: networking.dubbo.apache.org/v1alpha3
kind: MeshService
metadata:
name: provider-mtls
namespace: grpc-app
spec:
hosts:
- provider.grpc-app.svc.cluster.local
trafficPolicy:
tls:
mode: DUBBO_MUTUAL
routes:
- service:
- name: v1
host: provider.grpc-app.svc.cluster.local
labels:
version: v1
port:
number: 17070
weight: 50
- name: v2
host: provider.grpc-app.svc.cluster.local
labels:
version: v2
port:
number: 17070
weight: 50
---
apiVersion: security.dubbo.apache.org/v1alpha3
kind: PeerAuthentication
metadata:
name: grpc-app-strict-mtls
namespace: grpc-app
spec:
mtls:
mode: STRICT
EOF
验证¶
确认注入后的 runtime config 已经包含权重和安全策略:
关键字段应包含:
routes[].destinations[].weight=50routes[].destinations[].tlsMode=DUBBO_MUTUALservices[].ports[].mtlsMode=STRICT
确认 xDS 进程已经连接控制面,并且请求仍然成功:
确认控制面已经生成安全 xDS 配置:
- CDS 中的目标 cluster 带
UpstreamTlsContext - LDS 中的入站 listener 带
DownstreamTlsContext DownstreamTlsContext.requireClientCertificate=true
只有连接 Dubbo xDS 的 proxyless gRPC 进程可以验证这条安全链路。普通 HTTP 示例只能验证连通性,不能证明实际 mTLS 握手。