6.2 部署服务

上一章

6.4 在Istio中部署微服务

下一章

更多图书

6.3 访问服务

对于服务的访问,我们先在Kubernetes集群内进行访问测试,有两种访问方式如下所示:

·通过Cluster IP访问。

·通过集群内的DNS访问。

当如上的两种服务访问方式正常后,我们可以通过NodePort暴露给外部,然后使用浏览器进行访问测试。

1.在kubenetes集群内访问测试

(1)通过Cluster IP访问


$ kubectl get svc
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP   6h6m
service-go       ClusterIP   10.108.207.28    <none>        80/TCP    4h48m
service-js       ClusterIP   10.97.251.7      <none>        80/TCP    4h48m
service-lua      ClusterIP   10.103.165.139   <none>        80/TCP    4h48m
service-node     ClusterIP   10.102.21.34     <none>        80/TCP    4h48m
service-python   ClusterIP   10.103.119.8     <none>        80/TCP    4h48m
$ curl http://10.108.207.28/env
{"message":"go v2"}
$ curl http://10.103.165.139/env
{"message":"lua v1"}
$ curl http://10.102.21.34/env
{"message":"node v1","upstream":[{"message":"go v1","response_time":"0.01"}]}
$ curl http://10.103.119.8/env
{"message":"python v1","upstream":[{"message":"lua v2","response_time":0.12},{"message":"node v2","response_time":0.12,"upstream":[{"message":"go v2","response_time":"0.01"}]}]}
$ curl -I http://10.97.251.7/
HTTP/1.1 200 OK
last-modified: Sun, 16 Dec 2018 07:49:03 GMT
content-length: 548
content-disposition: inline; filename="index.html"
accept-ranges: bytes
content-type: text/html; charset=utf-8
vary: Accept-Encoding
date: Sun, 13 Jan 2019 10:27:13 GMT
Connection: keep-alive

(2)通过集群内的DNS访问

1)创建用于访问的测试容器:


$ kubectl apply -f kubernetes/dns-test.yaml

2)服务解析测试:


$ kubectl exec dns-test -c dns-test -- nslookup service-go
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name:      service-go
Address 1: 10.108.207.28 service-go.default.svc.cluster.local
$ kubectl exec dns-test -c dns-test -- nslookup service-node
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name:      service-node
Address 1: 10.102.21.34 service-node.default.svc.cluster.local
$ kubectl exec dns-test -c dns-test -- nslookup service-lua
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name:      service-lua
Address 1: 10.103.165.139 service-lua.default.svc.cluster.local
$ kubectl exec dns-test -c dns-test -- nslookup service-python
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name:      service-python
Address 1: 10.103.119.8 service-python.default.svc.cluster.local
$ kubectl exec dns-test -c dns-test -- nslookup service-js
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name:      service-js
Address 1: 10.97.251.7 service-js.default.svc.cluster.local

3)服务访问测试:


$ kubectl exec dns-test -c dns-test -- curl -s http://service-go/env
{"message":"go v2"}
$ kubectl exec dns-test -c dns-test -- curl -s http://service-node/env
{"message":"node v1","upstream":[{"message":"go v2","response_time":"0.01"}]}
$ kubectl exec dns-test -c dns-test -- curl -s http://service-lua/env
{"message":"lua v1"}
$ kubectl exec dns-test -c dns-test -- curl -s http://service-python/env
{"message":"python v2","upstream":[{"message":"lua v2","response_time":0.05},{"message":"node v2","upstream":[{"message":"go v1","response_time":"0.00"}],"response_time":0.05}]}
$ kubectl exec dns-test -c dns-test -- curl -s -I http://service-js/
HTTP/1.1 200 OK
last-modified: Sun, 16 Dec 2018 07:49:13 GMT
content-length: 505
content-disposition: inline; filename="index.html"
accept-ranges: bytes
content-type: text/html; charset=utf-8
vary: Accept-Encoding
date: Sun, 13 Jan 2019 10:31:23 GMT
Connection: keep-alive

2.在浏览器中访问测试

1)使用NodePort暴露服务。使用NodePort暴露sevice-js和service-python服务的v1版本:


$ kubectl expose deployment service-js-v1 --type=NodePort --name=service-js-nodeport --port=80 --target-port=80
service/service-js-nodeport exposed
$ kubectl expose deployment service-python-v1 --type=NodePort --name=service-python-nodeport --port=80 --target-port=80
service/service-python-nodeport exposed

2)在浏览器中访问sevice-js和service-python服务。

获取service-js外部访问地址:


$ SERVICE_JS_PORT=$(kubectl get service service-js-nodeport -o jsonpath='{.spec.ports[0].nodePort}')
$ HOST=$(kubectl get node lab2 -o 'jsonpath={.status.addresses[0].address}')
$ GATEWAY_URL=$HOST:$SERVICE_JS_PORT
$ echo http://$GATEWAY_URL/
$ curl -I http://$GATEWAY_URL/

获取service-python外部访问地址:


$ SERVICE_PYTHON_PORT=$(kubectl get service service-python-nodeport -o jsonpath='{.spec.ports[0].nodePort}')
$ HOST=$(kubectl get node lab2 -o 'jsonpath={.status.addresses[0].address}')
$ GATEWAY_URL=$HOST:$SERVICE_PYTHON_PORT
$ echo http://$GATEWAY_URL/env
$ curl http://$GATEWAY_URL/env

使用上面步骤获取的URL地址在浏览器中访问。

访问service-js地址,结果如图6-6所示。

图6-6 在浏览器中访问测试

访问service-python服务地址,结果如下:


{"message":"python v1","upstream":[{"message":"lua v1","response_time":0.15},{"message":"node v1","response_time":0.25,"upstream":[{"message":"go v2","response_time":"0.01"}]}]}

【清理】

删除访问测试服务时创建的资源:


$ kubectl delete service service-js-nodeport service-python-nodeport
service "service-js-nodeport" deleted
service "service-python-nodeport" deleted
$ kubectl delete -f kubernetes/dns-test.yaml 
pod "dns-test" deleted
$ kubectl delete -f service/go/service-go.yaml
$ kubectl delete -f service/node/service-node.yaml
$ kubectl delete -f service/lua/service-lua.yaml
$ kubectl delete -f service/python/service-python.yaml
$ kubectl delete -f service/js/service-js.yaml