中文官网:https://istio.io/latest/zh/
前言
目前的Java分布式框架,已经比较成熟了,比如spring cloud和dubbo,可以实现比较好的服务治理。istio也有它的适用场景,服务治理方面做得也不错,它的适用场景:
- 跨语言,运行与k8s平台的容器里面,不限于开发语言,Java、Go、Ruby、Python...都可以支持;
- 代码侵入性低,老旧项目不改动或少改动代码就可以微服务化;
- 服务治理平台升级,不需要动业务代码;
- 灰度发布,基于Envoy代理,istio可以很好的处理服务灰度发布和浏览控制;
- ...
环境
minikube跑的k8s环境,搭建minikube环境,可查看我的另外一篇文章《Kubernetes—minikube安装(笔记)》
安装istio(官网搬运工)
下载 Istio
# 转到 Istio 发布 页面,下载针对你操作系统的安装文件, 或用自动化工具下载并提取最新版本(Linux 或 macOS):
curl -L https://istio.io/downloadIstio | sh -
# 转到 Istio 包目录。例如,如果包是 istio-1.9.1:
cd istio-1.9.1
# 将 istioctl 客户端加入搜索路径(Linux or macOS):
export PATH=$PWD/bin:$PATH
安装 Istio
# 采用demo配置组合,还有其他安装配置:default、demo、minimal、sds,可自行官网查看
istioctl install --set profile=demo -y
# 给命名空间添加标签,指示Istio在部署应用的时候,自动的注入Envoy边车代理
kubectl label namespace default istio-injection=enabled
部署bookinfo示例应用
bookinfo的架构
# 部署 Bookinfo 示例应用:
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
# (这里会花几分钟启pod)
# 查看service
kubectl get services
# 查看pod
kubectl get pods
# 验证方方面面均工作无误
kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>"
对外开放应用程序
# 把应用关联到 Istio 网关:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
# 确保配置文件没有问题
istioctl analyze
确定入站IP和端口
# 设置入站端口:
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
# 确认端口被成功的赋值给了每一个环境变量:
echo "$INGRESS_PORT"
echo "$SECURE_INGRESS_PORT"
# 设置入站 IP:
export INGRESS_HOST=$(minikube ip)
# 确认 IP 地址被成功的赋值给了环境变量:
echo "$INGRESS_HOST"
# 设置环境变量 GATEWAY_URL:
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
# 确保 IP 地址和端口均成功的赋值给了环境变量:
echo "$GATEWAY_URL"
# 验证外部访问
# 运行下面命令,获取 Bookinfo 应用的外部访问地址
echo "http://$GATEWAY_URL/productpage"
# 把上面命令的输出地址复制粘贴到浏览器并访问,确认 Bookinfo 应用的产品页面是否可以打开
kiali仪表板
测试请求:
用jmeter测试请求bookinfo项目: http://192.168.11.223:30267/productpage
使用下面说明部署 Kiali 仪表板、 以及 Prometheus、 Grafana、 还有 Jaeger
注意,如果是本机测试环境Kiali 、 Prometheus、 Grafana、 Jaeger 需要nodePort出来才能访问!
# 安装 Kiali 和其他插件,等待部署完成。
kubectl apply -f samples/addons
kubectl rollout status deployment/kiali -n istio-system
# 访问 Kiali 仪表板
istioctl dashboard kiali
kiali界面
kiali需要nodePort出来,端口可添加nodePort属性指定,30000-32767范围内,不写的话会随机:
1.修改samples/addons/kiali.yaml,加上type: NodePort,然后再执行 kubectl apply -f samples/addons 部署;
2.查看执行kubectl get svc -n istio-system,查看service;
3.浏览器访问 http://192.168.11.223:<nodePort>
Kiali界面
Jaeger链路追踪面板
Jaeger需要nodePort出来,端口可添加nodePort属性指定,30000-32767范围内,不写的话会随机::
1.修改samples/addons/jaeger.yaml,加上type: NodePort,然后再执行 kubectl apply -f samples/addons/jaeger.yaml 部署;
2.查看执行kubectl get svc -n istio-system,查看service;
3.浏览器访问 http://192.168.11.223:<nodePort>
Prometheus 查询度量指标
Prometheus需要nodePort出来,端口可添加nodePort属性指定,30000-32767范围内,不写的话会随机::
1.修改samples/addons/prometheus.yaml,加上type: NodePort,然后再执行 kubectl apply -f samples/addons/prometheus.yaml 部署;
2.查看执行kubectl get svc -n istio-system,查看service;
3.浏览器访问 http://192.168.11.223:<nodePort>
Grafana 可视化指标
Grafana也是需要nodePort出来,端口可添加nodePort属性指定,30000-32767范围内,不写的话会随机::
1.修改samples/addons/grafana.yaml,加上type: NodePort,然后再执行 kubectl apply -f samples/addons/grafana.yaml 部署;
2.查看执行kubectl get svc -n istio-system,查看service;
3.浏览器访问 http://192.168.11.223:<nodePort>/dashboard/db/istio-mesh-dashboard