K8s环境下Istio服务网格HTTP转HTTPS配置全流程问题咨询
Istio服务网格HTTP转HTTPS完整落地指南
核心概念答疑
1. Istio mTLS与常规TLS的区别
- 常规TLS为单向认证:仅服务端向客户端出示证书,客户端校验服务端身份,多用于公网HTTPS场景
- Istio mTLS为双向认证:服务调用的两端都会向对方出示证书校验身份,完全由Sidecar代理自动完成,业务服务无感知,证书由Istio CA自动签发、轮转,无需业务维护
- 外部客户端访问内部服务时,mTLS作用是保障Ingress网关到内部服务、以及内部服务之间的流量全程加密,避免集群内部流量被窃听篡改
2. 外部到内部流量配置逻辑
不需要修改内部服务的任何配置:
- 无需为每个内部服务单独申请公网证书,仅需为Istio Ingress网关配置一套公网TLS证书即可
- 内部服务继续保留80端口提供HTTP服务即可,无需切换为443端口或开启HTTPS
- 流量链路:外部客户端 →(HTTPS,网关卸载证书)→ Istio Ingress网关 →(mTLS加密,Sidecar自动处理)→ 内部服务Sidecar →(HTTP明文)→ 业务服务
3. 证书方案选型
- 测试/内部场景:完全可以直接用
openssl生成自签名证书,创建为tls类型的Secret存放到istio-system命名空间即可,仅Ingress网关需要使用该证书,不需要多服务共用,配合kubed跨命名空间同步也没有问题 - 生产场景:推荐部署
cert-manager,部署成本仅1小时左右,可实现证书自动签发、自动续期,避免手动维护证书过期的风险,长期来看投入产出比很高
完整落地操作步骤
步骤1:开启全局mTLS
创建全局PeerAuthentication资源,强制所有服务间流量走mTLS:
apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: default namespace: istio-system spec: mtls: mode: STRICT
注意:如果还有部分服务未接入Istio Sidecar,可先将模式改为
PERMISSIVE,兼容未接入Sidecar的服务,待全量接入后再切换为STRICT模式。
步骤2:生成TLS证书
自签名证书生成命令:openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=你的业务域名/O=组织名称"
如果使用公网CA签发的证书,直接替换生成的tls.crt和tls.key即可。
步骤3:创建网关证书Secret
将证书存放到Istio网关所在的命名空间:kubectl create secret tls istio-ingressgateway-certs --namespace istio-system --key tls.key --cert tls.crt
步骤4:配置Ingress网关开启HTTPS
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: business-gateway namespace: istio-system spec: selector: istio: ingressgateway servers: # HTTPS 443端口配置 - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: istio-ingressgateway-certs # 关联上一步创建的Secret hosts: - "你的业务域名" # 可选:HTTP 80端口自动跳转到HTTPS - port: number: 80 name: http protocol: HTTP hosts: - "你的业务域名" tls: httpsRedirect: true
步骤5:配置路由规则转发到内部服务
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: business-service-vs spec: hosts: - "你的业务域名" gateways: - istio-system/business-gateway http: - route: - destination: host: 内部服务名.服务所在命名空间.svc.cluster.local port: number: 80 # 内部服务的HTTP端口,无需修改
流量架构图示
┌─────────────────┐ HTTPS(公网证书卸载) ┌──────────────────────┐ │ 外部客户端 ├───────────────────────────────────►│ Istio Ingress Gateway│ └─────────────────┘ └───────────┬──────────┘ mTLS加密(Sidecar自动处理) ▼ ┌────────────────────────────────────────────────────────────────────────────────┐ │ K8s集群(Istio服务网格) │ │ ┌──────────────┐ mTLS加密 ┌──────────────┐ mTLS加密 ┌──────────────┐ │ │ │ 服务A Sidecar │◄────────────────►│ 服务B Sidecar │◄────────────────►│ 服务C Sidecar │ │ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ │ HTTP │ HTTP │ HTTP │ │ ┌──────┴───────┐ ┌──────┴───────┐ ┌──────┴───────┐ │ │ │ 业务服务A │ │ 业务服务B │ │ 业务服务C │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ └────────────────────────────────────────────────────────────────────────────────────────┘
内容的提问来源于stack exchange,提问作者TDN
相关产品推荐
相关产品推荐

