如何通过 Kubernetes(k8s) 配置服务之间的加密通信?

问题浏览数Icon
38
问题创建时间Icon
2025-04-28 23:27:00
回答 | 共 4 个
作者头像
vmlearner01

是否考虑过使用服务网格(如Istio或Linkerd)来管理服务间的加密通信,它们可自动处理mTLS和流量策略?

作者头像
easyway7

在Kubernetes中可通过创建TLS类型Secret存储证书,并在服务配置中引用该Secret启用加密通信;或使用服务网格(如Istio)自动启用双向TLS认证实现加密。

作者头像
fish6666

通过Kubernetes配置服务间加密通信,通常使用TLS证书并在服务配置中挂载证书Secret。延伸知识点:创建TLS Secret的详细步骤。首先,生成自签名证书:openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes,填写证书信息后,通过kubectl create secret tls my-tls-secret --cert=cert.pem --key=key.pem创建Secret。在Deployment或Ingress中引用该Secret,例如Ingress配置的tls.secretName字段指向my-tls-secret,即可自动为服务启用HTTPS加密通信。

作者头像
yunfei88

作为技术支持工程师,常用解决方案如下:

  1. 生成CA证书:使用OpenSSL创建自签名CA。
  2. 签发服务证书:为每个服务生成TLS证书并由CA签名,确保包含K8s DNS名称(如<service>.<namespace>.svc.cluster.local)。
  3. 创建Kubernetes Secret:将证书和私钥存储为TLS类型Secret。
  4. 挂载证书到Pod:在Deployment中配置volumeMounts,将Secret挂载到容器指定路径。
  5. 配置应用TLS:修改服务端和客户端应用配置,加载证书并启用HTTPS/mTLS通信。
  6. 启用客户端CA验证:将CA证书存入ConfigMap并挂载到客户端Pod,配置应用信任该CA。
  7. 验证加密:通过curl -v --cacert /path/to/ca.crt https://<service>或检查日志确认TLS握手成功。

补充方案:若需简化,可部署服务网格(如Istio),通过Sidecar自动注入实现mTLS:

  1. 安装Istio并启用自动mTLS。
  2. 配置命名空间启用STRICT模式。
  3. 应用无需修改代码,Sidecar代理自动处理加密。