istio网格服务的实现需要基于注入,istio的注入指的是在原基础的pod中再新创建一个容器,以sidecar的形式和原来的容器一起运行。以bookinfo的默认实例来说。
未注入前的实例为:
将sidecar进行注入后:
原来是服务与服务之间相互调用,但是注入后所有微服务都将与一个 Envoy sidecar 打包在一起,它拦截服务的传入和传出调用,通过 Istio 控制平面、路由、遥测收集和整个应用程序的策略执行提供外部控制所需的钩子。
同时自动注入也非常的简单,只需要给需要注入的命名空间打上一个标签即可。
kubectl label namespaces default istio-injection=enabled
或者我们不想让命名空间下的所有服务都进行注入,那我们也可以手动注入单个服务。
kube-inject -f xxx.yaml | kubectl apply -f - ##首先需要拿到yaml文件,让istio注入文件后直接apply
部署bookinfo
kubectl apply -f bookinfo/platform/kube/bookinfo.yaml
部署完成后等待应用启动
[root@localhost addons]# kubectl get pod
NAME READY STATUS RESTARTS AGE
details-v1-5498c86cf5-tqbpj 2/2 Running 2 (18h ago) 4d16h
productpage-v1-65b75f6885-5fjng 2/2 Running 2 (18h ago) 4d16h
ratings-v1-b477cf6cf-br7h9 2/2 Running 2 (18h ago) 4d16h
reviews-v1-79d546878f-ft946 2/2 Running 2 (18h ago) 4d16h
reviews-v2-548c57f459-4cbhs 2/2 Running 2 (18h ago) 4d16h
reviews-v3-6dd79655b9-dn7gc 2/2 Running 2 (18h ago) 4d16h
这个时候我们可以看到READY是两个,再通过kubectl describe pod details-v1-5498c86cf5-tqbpj
命令查看内部具体增加的什么容器。
从上面的图片可以看到,里面除了有一个默认的details容器外还有一个istio-proxy的容器,这个容器就是前面所说到的sidecar服务,主要用来做流量转发和流量劫持的,但是这个还不是注入的本质,再看创建容器之前还做了什么操作。
在创建容器之前还有一个初始化的步骤。
从图中我们看到,这个初始化的本质其实还是对iptables进行一些操作。
介绍完这些之后再回来看看示例。
[root@localhost ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.68.37.147 <none> 9080/TCP 4d16h
kubernetes ClusterIP 10.68.0.1 <none> 443/TCP 11d
productpage ClusterIP 10.68.165.107 <none> 9080/TCP 4d16h
ratings ClusterIP 10.68.126.87 <none> 9080/TCP 4d16h
reviews ClusterIP 10.68.101.69 <none> 9080/TCP 4d16h
[root@localhost ~]# curl 10.68.165.107:9080 | grep -o ".* "
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1683 100 1683 0 0 650k 0 --:--:-- --:--:-- --:--:-- 821k
<title>Simple Bookstore App</title>
示例设置完成后无法在网页上直接访问,下来需要设置网关入口。
kubectl apply -f istio-1.14.3/samples/bookinfo/networking/bookinfo-gateway.yaml
网关设置完成需要确认网关确实创建
[root@localhost ~]# kubectl get gateways.networking.istio.io
NAME AGE
bookinfo-gateway 4d16h
如何访问,需要将ingress设置为nodeport
[root@localhost ~]# kubectl get svc -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana NodePort 10.68.234.129 <none> 3000:30587/TCP 4d18h
istio-egressgateway ClusterIP 10.68.246.26 <none> 80/TCP,443/TCP 4d18h
istio-ingressgateway NodePort 10.68.169.170 <none> 15021:31793/TCP,80:32192/TCP,443:31965/TCP,31400:30983/TCP,15443:32007/TCP 4d18h
istiod ClusterIP 10.68.124.64 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 4d18h
jaeger-collector ClusterIP 10.68.47.19 <none> 14268/TCP,14250/TCP,9411/TCP 4d18h
kiali NodePort 10.68.130.213 <none> 20001:30134/TCP,9090:32608/TCP 4d18h
prometheus ClusterIP 10.68.99.184 <none> 9090/TCP 4d18h
tracing ClusterIP 10.68.175.144 <none> 80/TCP,16685/TCP 4d18h
这时候访问网页。
同时不断的刷新就可以看到网页的星星有不同的变化,因为reviews
服务有三个版本,通过默认调用service会均匀的负载到reviews中。想要更直观的查看服务的调用可以再将kiali也使用nodeport暴露出来在网页上进行查看。