目录
转载请注明出处
环境说明
- Centos 7.9
- Docker 24.0.7
- Kubernetes 1.23.5
操作说明
以下指令全部在Kubernetes 的 Master节点执行
下载Istio
1.转到 Istio 发布(https://github.com/istio/istio/releases/tag/1.20.3) 页面,下载针对您操作系统的安装文件, 或使用以下命令下载并提取最新版本(Linux 或 macOS):
curl -L https://istio.io/downloadIstio | sh -
# 上面的命令下载最新版本(用数值表示)的 Istio。 可以给命令行传递变量,用来下载指定的、不同处理器体系的版本。
# 例如,要为 x86_64 架构下载 Istio 1.20.3,请运行:
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.20.3 TARGET_ARCH=x86_64 sh -
2.转到 Istio 包目录。例如,如果包是 istio-1.20.3:
cd istio-1.20.3
安装目录包含:
- samples/ 目录下的示例应用程序
- bin/ 目录下的 istioctl 客户端二进制文件。
3.将 istioctl 客户端添加到路径(Linux 或 macOS):
export PATH=$PWD/bin:$PATH
安装Istio
- 1.采用官方的demo配置组合安装
istioctl install --set profile=demo -y
# 完成后出现以下提示
# ✔ Istio core installed
# ✔ Istiod installed
# ✔ Egress gateways installed
# ✔ Ingress gateways installed
# ✔ Installation complete
- 2.给命名空间添加标签,指示 Istio 在部署应用的时候,自动注入 Envoy 边车代理:
kubectl label namespace default istio-injection=enabled
# 执行成功后出现以下提示
# namespace/default labeled
部署应用
1.使用官方的Bookinfo(https://istio.io/latest/zh/docs/examples/bookinfo/)示例进行部署, 下载的安装包中已经包含这部分内容
[root@master istio-1.20.3]# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
# 执行完成后如下图
有一些镜像需要拉取, 因此部署时需要花一点时间, 可以通过以下指令查询, 等待所有的pod和service创建成功
kubectl get pods,svc
# 下图所示则代表部署成功
# 当每个 Pod 准备就绪时,Istio边车将伴随应用一起部署
对外暴露应用程序
此时,BookInfo 应用已经部署,但还不能被外界访问。 要开放访问,您需要创建 Istio 入站网关(Ingress Gateway
), 它会在网格边缘把一个路径映射到路由。
- 1.把应用关联到 Istio 网关:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
# 执行后出现以下提示
# gateway.networking.istio.io/bookinfo-gateway created
# virtualservice.networking.istio.io/bookinfo created
- 2.确保配置文件没有问题:
istioctl analyze
# 执行后出现以下提示
# ✔ No validation issues found when analyzing namespace: default.
- 3.查看istio-ingressgateway暴露的端口
[root@master istio-1.20.3]# kubectl get svc istio-ingressgateway -n istio-system
# 可以看到istio-ingressgateway的80端口映射的NodePort为58304
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 10.105.170.54 <pending> 15021:18854/TCP,80:58304/TCP,443:42985/TCP,31400:62338/TCP,15443:51096/TCP 16m
- 4.获取Bookinfo的外部访问路径
# 复制以下命令, 粘贴到SSH窗口, 将获取到访问的地址, 如下图
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
echo "http://$GATEWAY_URL/productpage"
- 5.使用浏览器访问Bookinfo地址
访问地址(由上一步获取到的): http://192.168.21.224:58304/productpage
至此 Istio 和 Bookinfo 示例应用已经部署完成并可以访问
部署仪表板
Istio 和几个遥测应用做了集成。 遥测能帮您了解服务网格的结构、展示网络的拓扑结构、分析网格的健康状态。
使用下面说明部署 Kiali 仪表板
、 以及 Prometheus
、 Grafana
、 还有 Jaeger
。
- 1.安装 Kiali 和其他插件,等待部署完成。
[root@master istio-1.20.3]# kubectl apply -f samples/addons
- 2.查看组件是否部署完成
# 部署需要拉取镜像, 当执行以下命令发现所有组件都部署成功即可
kubectl -n istio-system get svc,po
- 3.设置代理暴露kiali允许外部访问
# kiali默认的服务类型为ClusterIP, 外部不可访问
# 开启外部访问的方式有很多
# 例如: 使用 Ingress 代理
# 例如: 使用 kubectl -n istio-system edit service kiali 命令修改服务类型为NodePort
# 例如: 使用 kubectl port-forward --address 0.0.0.0 -n istio-system service/kiali 32001:20001 进行转发
# 这里临时使用了端口转发的方式
[root@master istio-1.20.3]# kubectl port-forward --address 0.0.0.0 -n istio-system service/kiali 32001:20001
也可以创建istio gateway来实现外部访问
- 4.使用浏览器访问kiali
访问地址为(宿主机Node的IP:转发的端口): 192.168.21.223:32001\
- 5.生成测试数据
可以看到虽然kaili的页面我们能访问, 但是里面是没有监控数据的, 要查看追踪数据,必须向服务发送请求。请求的数量取决于 Istio 的采样率。 采样率在安装 Istio 时设置,默认采样速率为 1%。在第一个跟踪可见之前,您需要发送至少 100 个请求。 使用以下命令向 productpage 服务发送 100 个请求:
# 执行以下命令发送100次请求
# $GATEWAY_URL为上面部署的Bookinfo访问的地址
for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
# for i in $(seq 1 100); do curl -s -o /dev/null "http://192.168.21.223:58304/productpage"; done
当命令执行完之后, 刷新页面再次查看, 就可以看到追踪数据了
卸载
如果不再需要istio的时候, 可以按照以下方式进行卸载
删除BookInfo应用
cd istio-1.20.3
# 执行卸载脚本
sh samples/bookinfo/platform/kube/cleanup.sh
删除Istio
Istio 卸载程序按照层次结构逐级的从 istio-system 命令空间中删除 RBAC 权限和所有资源。对于不存在的资源报错,可以安全的忽略掉,毕竟它们已经被分层地删除了。
cd istio-1.20.3
# 卸载监控组件
kubectl delete -f samples/addons
# 卸载istio
# 若终端关闭过, 先执行以下命令
# cd istio-1.20.3
# export PATH=$PWD/bin:$PATH
istioctl uninstall -y --purge
删除命名空间
# istio-system 默认情况下并不会被移除。 不需要的时候,使用下面命令移除它:
kubectl delete namespace istio-system
删除Envoy 边车代理的标签
kubectl label namespace default istio-injection-
参考链接
https://istio.io/latest/zh/docs/setup/getting-started/
https://istio.io/latest/zh/docs/examples/bookinfo/