当Envoy代理跟随使用HTTPS协议的服务部署时,不管服务是否启用mTLS,代理会自动降级为4层协议处理,这就意味着Envoy不会终止原始HTTPS流量。这也是Istio可以处理使用HTTPS协议服务的原因。
【实验】
1)创建my-nginx服务的HTTPS证书:
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/nginx.key -out /tmp/nginx.crt -subj '/CN=*.my-nginx.com/O=my-nginx' $ kubectl create ns foo $ kubectl create secret tls nginxsecret -n foo --key /tmp/nginx.key --cert /tmp/nginx.crt $ kubectl get secret nginxsecret -n foo NAME TYPE DATA AGE nginxsecret kubernetes.io/tls 2 10s
2)创建Nginx的HTTPS配置:
$ kubectl create configmap nginxconfigmap -n foo --from-file=istio/miscellaneous/https-default.conf $ kubectl get configmap nginxconfigmap -n foo NAME DATA AGE nginxconfigmap 1 10s
3)创建测试Pod:
$ kubectl apply -f kubernetes/dns-test.yaml $ kubectl get pod NAME READY STATUS RESTARTS AGE dns-test 2/2 Running 0 7s
4)部署nginx服务,不使用Envoy代理:
$ kubectl apply -f kubernetes/my-nginx.yaml -n foo $ kubectl get pod -n foo NAME READY STATUS RESTARTS AGE my-nginx-97744d9bd-sj2mn 1/1 Running 0 34s
5)服务访问测试:
$ kubectl exec dns-test -c dns-test -- curl -sk https://my-nginx.foo/ Hello from nginx in foo
6)部署Nginx服务,使用Envoy代理:
$ kubectl apply -f <(istioctl kube-inject -f kubernetes/my-nginx.yaml) -n foo $ kubectl get pod -n foo NAME READY STATUS RESTARTS AGE my-nginx-5c7d4cf55b-tkp6n 2/2 Running 0 46s
7)关闭Nginx服务的mTLS:
$ kubectl apply -f istio/security/mtls-my-nginx-disable.yaml -n foo
8)服务访问测试:
$ kubectl exec dns-test -c dns-test -- curl -sk https://my-nginx.foo/ Hello from nginx in foo
9)开启Nginx服务的mTLS:
$ kubectl apply -f istio/security/mtls-my-nginx-enable.yaml -n foo
10)服务访问测试:
$ kubectl exec dns-test -c dns-test -- curl -sk https://my-nginx.foo/ Hello from nginx in foo
从上面的测试可以看出,当my-nginx服务不在网格内时,可以正常访问。当my-nginx服务在网格内时,关闭和启用mTLS的情况下都能正常访问my-nginx服务。
11)清理:
$ kubectl delete ns foo $ kubectl delete -f kubernetes/dns-test.yaml