启用每服务双向认证
在本教程中,您将学习:
- 注解Kubernetes服务以禁用(或启用)一个选定服务的双向TLS身份验证。
- 修改Istio网格配置以解除控制服务的相互TLS身份验证。
在这个初始设置中,我们期望默认命名空间中的休眠实例可以与httpbin服务进行通信,但是传统命名空间中的休眠实例不能,因为它没有边车来使能mTLS。
"origin": "127.0.0.1"
}
kubectl exec $(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name} -n legacy) -n legacy -- curl http://httpbin.default:8000/ip -s
如果我们希望在不更改网格验证设置下禁用httpbin(在端口8000上)的mTLS,我们可以通过将此注释添加到httpbin服务定义来实现。
annotations:
auth.istio.io/8000: NONE
要进行快速验证,运行kubectl edit svc httpbin并添加上面的注解(或者编辑原始的httpbin.yaml文件并重新应用它)。 应用更改之后,由于mTLS已被删除sleep.legacy的请求现在应该是成功的。
注意:
注解可以用于相反的方向,例如:对单个服务启用mTLS,只需使用注解值MUTUAL_TLS而非NONE。 人们可以使用此选项在选定的服务上启用mTLS,而不是在整个网格中启用它。
由于不能在Istio 0.3中注解控制服务,例如:API服务器。所以在网格配置中引入来指定不应使用mTLS的服务列表。 如果你的应用程序需要与任何控制服务通信,则应在其中列出其完全限定域名(FQDN)。
作为Demo的一部分,我们将展示该字段的影响。
默认情况下(0.3或更高版本),该列表包含kubernetes.default.svc.cluster.local(这是通用设置中的API服务器服务的名称)。 你可以通过运行以下命令来验证:
mtlsExcludedServices: ["kubernetes.default.svc.cluster.local"]
然后预计请求kubernetes.default服务应该是可能的:
{
"kind": "APIVersions",
"versions": [
],
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "104.199.122.14"
}
]
}
上面相同的测试请求现在失败了(失败码为35),这是由于休眠的边车再次开启了mTLS:
kubectl exec $(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name}) -c sleep -- curl https://kubernetes.default:443/api/ -k -s