大家好!今天,我想和大家聊聊在处理Kubernetes服务网格标准——Istio时,最重要但也最容易混淆的Gateway TLS模式。
为了安全地将外部流量引入我们的集群,安全连接(HTTPS)是必不可少的。Istio Gateway是如何调整这种安全级别的呢?
我将详细探讨最常用的SIMPLE模式和MUTUAL模式之间的区别,以及在配置过程中经常遇到的CLI错误解决方案。🚀

1. 稍等!创建Secret时遇到错误了吗? 🚨
要将证书应用到Istio网关,您必须首先创建一个Kubernetes Secret。但是,您经常会遇到以下错误:
error: flag needs an argument: --from-file
bash: tls.crt=/root/certificates/booking.example.com.crt: No such file or directory
这通常是由于命令过长时,换行符(Enter)处理不当造成的。因为终端在没有反斜杠()的情况下换行时,会认为命令已结束并执行它。
✅ 正确的解决方案
将选项写在一行,或者在换行时务必加上。特别是对于mTLS,请不要忘记必须同时包含CA证书(ca.crt)!
# mTLS 密钥创建示例(简洁地写在一行!)
kubectl create secret generic booking-credential-mutual -n istio-system
--from-file=ca.crt=/root/certificates/example.com.crt
--from-file=tls.crt=/root/certificates/booking.example.com.crt
--from-file=tls.key=/root/certificates/booking.example.com.key
好了,现在材料(证书)已经准备就绪,我们开始“烹饪”(配置TLS模式)吧!👨🍳
2. mode: SIMPLE (单向TLS) 🌐
SIMPLE模式是我们平时上网时常见的标准HTTPS方式。
💡 工作原理
这种方式意味着“只有服务器(Gateway)出示身份证明”。
- 客户端(用户) ➡️ 网关: “我想连接。”
- 网关 ➡️ 客户端: “是的,我就是那个网站(服务器)。请检查我的证书。” 📜
- 客户端: “嗯,是由可信机构(CA)颁发的。通过!” ✅
- 🔒 开始加密通信
🎯 特点和用途
- 网关不检查客户端是谁。(任何人都可以连接)
- 用途: 常见的Web服务、网上商店、博客等面向大众的公开服务。
📝 YAML配置示例
只需指定包含服务器证书和密钥的Secret(credentialName)即可。
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: my-simple-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- "example.com"
tls:
mode: SIMPLE # 👈 这里!
credentialName: booking-credential # 只需要服务器证书(tls.crt, tls.key)
3. mode: MUTUAL (双向TLS / mTLS) 🤝
MUTUAL模式是一种安全性大大增强的方式。顾名思义,它是“相互(Mutual)”认证。通常称为mTLS。
💡 工作原理
这种方式意味着“服务器和客户端都交换身份证明”。
- 客户端 ➡️ 网关: “连接请求!”
- 网关 ➡️ 客户端: “首先,请检查我的身份证明(服务器证书)。” 📜
- 网关 ➡️ 客户端: “但是你是谁?也请出示你的身份证明(客户端证书)。” 👮♂️
- 客户端 ➡️ 网关: “这是我的证书。” 🪪
- 网关: (使用其CA证书进行验证)“哦,你确实是我们的公司合作伙伴。通过!” ✅
- 🔒 开始双向加密通信
🎯 特点和用途
- 客户端也必须拥有有效证书才能连接。(否则会被400错误等拒绝)
- 用途: 金融API、合作伙伴专用系统、内部管理页面、物联网设备通信等,当只有受信任的实体才能连接时。
📝 YAML配置示例
在这里,不仅需要服务器证书,用于客户端验证的CA证书也必须包含在Secret中。
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: my-mutual-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- "booking.example.com"
tls:
mode: MUTUAL # 👈 强大的安全性!
credentialName: booking-credential-mutual # 这里必须包含 ca.crt!
4. 一目了然的总结 📊
| 类别 | SIMPLE (单向) | MUTUAL (双向) |
|---|---|---|
| 认证主体 | 客户端验证服务器 | 双方相互验证 |
| 客户端所需 | 无(只需浏览器) | 客户端证书(Client Cert) |
| 网关所需 | 服务器证书 + 密钥 | 服务器证书 + 密钥 + CA证书 |
| 安全强度 | 一般(数据加密) | 最高(数据加密 + 访问控制) |
| 推荐场景 | 公共网站 | 安全性重要的内部/B2B系统 |
—
🏁 总结
引入Istio的一个重要原因正是其强大的安全功能。
- 如果为普通用户提供服务 👉 SIMPLE
- 如果只有经过验证的系统之间需要通信 👉 MUTUAL
根据情况选择这两种模式是Istio安全的第一步。希望今天的总结能帮助您构建安全的集群!感谢阅读。😊
发表回复