13.9 在Gateway上使用HTTPS

上一章

13.11 网格中的服务健康检查

下一章

更多图书

13.10 在HTTPS服务上开启mTLS

当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