通过这个task,你将学会如何:
这个task假设你有一个k8s集群:
以下命令假设服务部署在default命名空间上。适用参数 -n yournamespace
去指定其他命名空间。
验证集群级的CA正在运行:
kubectl get deploy -l istio=istio-ca -n istio-system
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
istio-ca 1 1 1 1 1m
如果 “AVAILABLE” 列是1表示Istio CA启动。
1.验证在ConfigMap中设置的AuthPolicy。
kubectl get configmap istio -o yaml -n istio-system | grep authPolicy | head -1
如果行 authPolicy: MUTUAL_TLS
没有被注释(没有 #
),代表Istio相互TLS认证开启。
当开启相互TLS认证的Istio运行时,你可以在一个服务的Envoy中使用curl向另一个服务发送请求。例如,在开启Bookinfo 示例应用后,你可以ssh进入 productpage
服务的Envoy容器,然后通过curl向其他服务发送请求。
下面是几个步骤:
1.获取productpage pod名
kubectl get pods -l app=productpage
NAME READY STATUS RESTARTS AGE
productpage-v1-4184313719-5mxjc 2/2 Running 0 23h
保证pod是 “Running”。
2.ssh进入Envoy容器
kubectl exec -it productpage-v1-4184313719-5mxjc -c istio-proxy /bin/bash
3.确认密钥/证书在 /etc/certs/ 目录中。
ls /etc/certs/
cert-chain.pem key.pem root-cert.pem
注意那个 cert-chain.pem
是需要提交给另一方的Envoy证书。 key.pem
是搭配 cert-chain.pem
的Envoy的私钥。 root-cert.pem
是确认另一方证书的根证书。目前我们只有一个CA,所以所有的Envoys都有相同的 root-cert.pem
。
4.确认 ‘curl’ 已经安装
curl
如果curl已安装,你将会看到类似内容
curl: try 'curl --help' or 'curl --manual' for more information
否则运行下面的命令重新开始
kubectl apply -f <(istioctl kube-inject --debug -f samples/bookinfo/kube/bookinfo.yaml)
注意:istio proxy镜像没有安装curl,而debug镜像安装了。在命令上使用 “–debug
” 标识会重新部署使用debug镜像的服务。
5.向其他服务发送请求,如details
curl https://details:9080/details/0 -v --key /etc/certs/key.pem --cert /etc/certs/cert-chain.pem --cacert /etc/certs/root-cert.pem -k
...
error fetching CN from cert:The requested data were not available.
...
< HTTP/1.1 200 OK
< content-type: text/html; charset=utf-8
< content-length: 1867
< server: envoy
< date: Thu, 11 May 2017 18:59:42 GMT
< x-envoy-upstream-service-time: 2
...
服务名和端口定义在 here
注意Istio使用 Kubernetes service account 作为服务身份,这比服务名提供了更强的安全性(更多信息 here )。因此在Istio中的证书没有服务名,这个是curl需要确认服务身份的信息。因此,我们使用curl的 ‘-k’
参数防止curl客户端没有在服务端提供的证书中发现和确认服务名 (i.e., productpage.ns.svc.cluster.local
)而导致的异常中止。
请检查安全命名在 here 了解更多关于Istio中客户端如何确认服务端身份的信息。
我们在上面演示和确认的是服务端从客户端接受连接。尝试不使用 --key
及 --cert
,并观察到你不被允许连接,并且得不到HTTP 200状态码。