在这个 Installation guide,我们将展示如何在sidecars间启动 mutual TLS authentication 。这个设置将会被网格中的所有sidecars应用。
在这个指导中,你将学会:
- 注释k8s服务以禁用(或启用)选择性服务的相互TLS身份认证
- 修改Istio网格配置以排除控制服务的相互TLS身份认证
Before you begin
- 理解Istio mutual TLS authentication 概念
- 熟悉 testing Istio mutual TLS authentication.
- 安装了带有相互TLS身份认证的Istio
- 启动带Istio sidecar的 httpbin demo 。同时为了测试目的,运行两个 sleep 实例,一个带sidecar,一个不带(在不同的命名空间)。下面命令帮助你启动这些服务。
kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml)
kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml)
kubectl create ns legacy && kubectl apply -f samples/sleep/sleep.yaml -n legacy
在这个初始化安装中,我们期望在default命名空间的sleep 实例能够和httpbin服务通信,而另一个在legacy 命名空间的不能,因为它没有进行mTLS的sidecar。
kubectl exec $(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name}) -c sleep -- curl http://httpbin.default:8000/ip -s
{
"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
command terminated with exit code 56
Disable mutual TLS authentication for “httpbin” service
如果我们想要为httpbin(在8000端口)关闭mTLS,而不改变网格的身份认证设置,我们可以通过为httpbin 服务定义添加下面这个注解。
annotations:
auth.istio.io/8000: NONE
为了快速测试,运行 kubectl edit svc httpbin
并在其上添加注解(或者你可以编辑原始的httpbin.yaml文件并重新应用)。更改被应用后, 来自sleep.legacy请求现在应该成功了,因为mTLS被取消了。
注意:
- 注解可以产生相反的效果,换句话说,通过使用
MUTUAL_TLS
注解值而不是NONE
为服务开启mTLS。人们能够使用这个注解为选择性的服务启用mTLS,而不是在整个网格中启用。 - 注解可以针对没有sidecar的服务,通知Istio当客户端对那个服务产生调用时不采用mTLS。实际上,如果一个系统有一些不被Istio管理的服务(没有sidecar),这是修复对这些服务的通信问题的一个推荐做法。
Disable mutual TLS authentication for control services
因为我们不能注解控制服务,如API server,在 Istio 0.3中,我们推荐 mtls_excluded_services 的网格配置来指定那些不应使用mTLS的服务。如果你的应用需要和任何控制服务进行通信,这必须使用全限定域名。
在demo的这部分,我们将展示这个字段的影响。
默认情况下(0.3或之后版本),这个list包含 kubernetes.default.svc.cluster.local
(在通常安装中是API server服务的名称)。你可以通过运行下列命令来确认:
kubectl get configmap -n istio-system istio -o yaml | grep mtlsExcludedServices
mtlsExcludedServices: ["kubernetes.default.svc.cluster.local"]
然后期望 kubernetes.default 服务能够成功请求:
kubectl exec $(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name}) -c sleep -- curl https://kubernetes.default:443/api/ -k -s
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "104.199.122.14"
}
]
}
现在,运行 kubectl edit configmap istio -n istio-system
然后清除mtlsExcludedServices ,并且重启pilot:
kubectl get pod $(kubectl get pod -l istio=pilot -n istio-system -o jsonpath={.items..metadata.name}) -n istio-system -o yaml | kubectl replace --force -f -
上面的测试请求失败并返回code 35, 因为sleep 的sidecar再次开始使用mTLS了:
kubectl exec $(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name}) -c sleep -- curl https://kubernetes.default:443/api/ -k -s
command terminated with exit code 35