在从单体应用程序向分布式微服务架构的转型过程中,开发人员和运维人员面临诸多挑战,Istio 提供了一个完整的解决方案,通过为整个服务网格提供行为洞察和操作控制来满足微服务应用程序的多样化需求。
本文将以1.12.3版集群为例,说明在Kubernetes集群上快速安装Istio的步骤,并提供了服务治理示例。
wget https://github.com/istio/istio/releases/download/1.0.6/istio-1.0.6-linux.tar.gz tar -zxvf istio-1.0.6-linux.tar.gz
说明:
解压后的目录包含如下内容:
* install/中包含安装.yaml 文件,可根据需求进行选择安装,本文以istio-demo.yaml为例; * samples/中包含示例应用; * bin/目录中放置istioctl 客户端二进制文件
export PATH=$PWD/bin:$PATH kubectl apply -f install/kubernetes/istio-demo.yaml
命令执行完后,可以看到集群中新增了一个命名空间istio-system;
kubectl get namespace
输出如下
NAME STATUS AGE default Active 16h istio-system Active 7m37s jke-system Active 15h kube-public Active 16h kube-system Active 16h
等待一段时间后,查看istio-system各主要服务是否已经正常启动;
kubectl get pod -n istio-system
输出如下
NAME READY STATUS RESTARTS AGE grafana-5f88cdf98b-mbvgp 1/1 Running 0 10m istio-citadel-5bbbc98c6d-v7kxq 1/1 Running 0 10m istio-cleanup-secrets-kgjqx 0/1 Completed 0 10m istio-egressgateway-5c65dbd6bc-54mxh 1/1 Running 0 10m istio-galley-589df589c9-p82l5 1/1 Running 0 10m istio-grafana-post-install-64svr 0/1 Completed 3 10m istio-ingressgateway-679d5cdc94-hsrkd 1/1 Running 0 10m istio-pilot-74ddc6cf47-4jwhk 2/2 Running 0 10m istio-policy-777fbbd848-x7hpf 2/2 Running 0 10m istio-security-post-install-4zjnj 0/1 Completed 3 10m istio-sidecar-injector-7d559f664c-4qqd2 1/1 Running 0 9m59s istio-telemetry-588dd6494-wgtqp 2/2 Running 0 10m istio-tracing-6445d6dbbf-88jx4 1/1 Running 0 9m59s prometheus-66f96fdfbc-44htl 1/1 Running 0 10m servicegraph-658fd9f76d-jrvdp 1/1 Running 0 10m
说明:
istio主要组件说明如下:
* pilot负责服务发现和流量治理; * mixer负责访问控制和调用信息收集; * ingressgateway作为外部流量的入口; * citadel用于证书管理和安全管理;
以上各组件运行正常,则说明istio安装完成;
如需卸载istio,请执行如下命令:
kubectl delete -f install/kubernetes/istio-demo.yaml
示例应用是一个线上图书目录系统,显示图书相关信息,包括书名、ISBN、页数等图书详情以及图书预览功能,由四个独立的微服务组成,包括详情(detail)、产品页(productpage)、评价(ratings)、星级展示(reviews)。
部署示例应用 ,注入代理服务,执行如下命令:
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
等待一段时间,执行如下命令确定服务已正常启动:
kubectl get service
输出如下:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 10.0.255.166 <none> 9080/TCP 10s kubernetes ClusterIP 10.0.248.1 <none> 443/TCP 16h productpage ClusterIP 10.0.249.165 <none> 9080/TCP 9s ratings ClusterIP 10.0.249.23 <none> 9080/TCP 10s reviews ClusterIP 10.0.252.48 <none> 9080/TCP 10s
` kubectl get pod ` 输出如下:
NAME READY STATUS RESTARTS AGE details-v1-5c8dc9bffb-5v5bl 2/2 Running 0 3m17s productpage-v1-7dd5bcc8c8-z6hpv 2/2 Running 0 3m16s ratings-v1-56d96b5d8-9h9lz 2/2 Running 0 3m17s reviews-v1-7d9c799d9c-6rvt9 2/2 Running 0 3m17s reviews-v2-8d79fbcfb-dxzfw 2/2 Running 0 3m16s reviews-v3-6c9c86db7f-gjsrx 2/2 Running 0 3m16s
* 输出结果表明,detail, productpage, ratings, reviews四个示例服务已启动,并且reviews启动了3个版本
执行如下命令,定义一个LoadBalance类型的Service作为入口网关;
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
输出结果如下:
kubectl get svc istio-ingressgateway -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.0.250.151 114.XXX.XXX.XXX 80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:30570/TCP,8060:30615/TCP,853:32610/TCP,15030:30259/TCP,15031:31241/TCP 47m
curl -I http://{external-IP}/productpage HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 5723 server: envoy date: Fri, 19 Apr 2019 09:56:40 GMT x-envoy-upstream-service-time: 55 注:external-IP字段使用service绑定的外网IP替换
或在浏览器中输入地址http://{external-IP}/productpage验证输出结果,多次刷新,可以看到三种不同版本的评价星级随机出现。
依次执行如下命令,进行服务治理,并查看输出结果
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
执行如下命令后,刷新上一步中的浏览器地址会发现评价星级在不展示和红色五角星两种情况随机出现
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
查看上一步操作中对应的yaml文件验证,发现v1和v3两个版本的reviews各50%
- destination: host: reviews subset: v1 weight: 50 - destination: host: reviews subset: v3 weight: 50
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml yaml文件对应配置如下: - destination: host: reviews subset: v3