istio版本
根据istio与k8s版本关系我们需要在k8s1.24版本上安装1.14的istio。本篇以1.14.3为例
k8s1.24安装文档参考
下载
https://github.com/istio/istio/releases
安装
安装istioctl
- 解压缩
istio-1.14.3-linux-amd64.tar.gz
cp bin/istioctl /usr/bin/
- istioctl version
[root@k8s-master istio-1.14.3]# istioctl version
no running Istio pods in "istio-system"
1.14.3
部署
istioctl profile list
istioctl install --set profile=demo
- 检查
[root@k8s-master istio-1.14.3]# kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-egressgateway-666cdd84d7-gbh52 1/1 Running 0 103m
istio-ingressgateway-58f4c4f77f-cw9x5 1/1 Running 0 103m
istiod-dfb7f5d4f-bwmjb 1/1 Running 0 108m
如果pull image error ,可手动pull istio/pilot:1.14.3
检查
再次查看version多了数据平面和控制平面
[root@k8s-master istio-1.14.3]# istioctl version
client version: 1.14.3
control plane version: 1.14.3
data plane version: 1.14.3 (2 proxies)
查看pod
[root@k8s-master istio-1.14.3]# kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-egressgateway-666cdd84d7-gbh52 1/1 Running 0 149m
istio-ingressgateway-58f4c4f77f-cw9x5 1/1 Running 0 149m
istiod-dfb7f5d4f-bwmjb 1/1 Running 0 154m
查看svc
[root@k8s-master istio-1.14.3]# kubectl get svc -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-egressgateway ClusterIP 10.107.69.244 <none> 80/TCP,443/TCP 150m
istio-ingressgateway LoadBalancer 10.102.233.5 <pending> 15021:30557/TCP,80:31590/TCP,443:30507/TCP,31400:30760/TCP,15443:31432/TCP 150m
istiod ClusterIP 10.102.113.11 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 155m
- 发现istio-ingressgateway的EXTERNAL-IP为pending
如果 EXTERNAL-IP 有值(IP 地址或主机名),则说明您的环境具有可用于 Ingress 网关的外部负载均衡器。如果 EXTERNAL-IP 值是<none>
(或一直是<pending>
),则说明可能您的环境并没有为 Ingress 网关提供外部负载均衡器的功能。通过手动添加外部IP - 手动添加外部ip
kubectl edit svc istio-ingressgateway -n istio-system
添加externalIp
spec:
allocateLoadBalancerNodePorts: true
clusterIP: 10.102.233.5
externalIPs:
- 10.0.2.4
- 10.0.2.5
- 10.0.2.6
clusterIPs:
- 10.102.233.5
因为我是3台k8s集群(1master 2node),所以我加了3个外部IP,这样就可以用这3个IP的任意一个对外提供服务了,默认端口80。externalIPs ip任意设置,也可设置一个不存在的ip,但是如果设置一个不存在的ip在集群外是无法访问的,故无意义,或者设置一个外网网卡的ip更有意义
打标签 允许自动注入
kubectl label namespace default istio-injection=enabled
测试
运行一个容器尝试一下
kubectl run client-$RANDOM --image=ikubernetes/admin-box:v1.2 --restart=Never -it --rm --command -- /bin/bash
查看下自动注入的容器
[root@k8s-master istio-1.14.3]# kubectl get pods |grep client-8899
client-8899 2/2 Running 0 9m26s
[root@k8s-master istio-1.14.3]# kubectl describe pod client-8899
······
istio-proxy:
Container ID: docker://23a14454217026d9bcb4888bc6ab1246a3a662e78796345e6838703314561b57
Image: docker.io/istio/proxyv2:1.14.3
Image ID: docker-pullable://istio/proxyv2@sha256:b7dc502a51251f7e97ae849382177ebd0ab19668e40f49d6bab5048debfefd48
Port: 15090/TCP
Host Port: 0/TCP
······
查看istio下的代理
istioctl proxy-status
可以使用istioctl proxy-status或istioctl ps命令查看网格的状态。如果输出结果中缺少某个代理,说明该代理当前没有连接到Pilot实例,因而无法接收到任何配置。如果状态为stale,表示当前存在网络故障,或Pilot需要扩容。
istio插件(如果不需要插件,则忽略)
安装istio插件
cd istio
kubectl apply -f samples/addons/
包含kiali/prometheus/jaeger等插件
创建kiali路由
- kiali说明
kiali是一个Istio的可视化工具,如果Istio安装过程中指定安装profile=demo的话将会自动安装kiali。Kiali与Istio的主程序都会在namespace=istio-system中出现。
当然demo工程中还包含其它的功能
Kiali 包含很多的监控项目,可以和链路检测、节点健康结合形成一个完整的工具。在Kiali中,官方文档指出,可以通过修改yaml的方式修改路由、注入异常等操作,但是我经过测试发现,修改yaml非常麻烦,虽然提供了可视化工具,但是从本质上来讲,对于修改只是提供了编辑器的功能,而不是操作的方式。
- 创建kiali gateway 和路由
git clone https://github.com/iKubernetes/istio-in-practise.git
cd istio-in-practise/Traffic-Management-Basics
kubectl apply -f kiali-port-80/
输出
destinationrule.networking.istio.io/kiali created
gateway.networking.istio.io/kiali-gateway created
virtualservice.networking.istio.io/kiali-virtualservice created
- 查看创建的gateweay & virtualservice
[root@k8s-master Traffic-Management-Basics]# kubectl get gateway -n istio-system
NAME AGE
kiali-gateway 65s
[root@k8s-master Traffic-Management-Basics]# kubectl get virtualservices -n istio-system
NAME GATEWAYS HOSTS AGE
kiali-virtualservice ["kiali-gateway"] ["kiali.magedu.com"] 103s
- 访问kiail
在自己本地的hosts文件添加解析
10.0.2.4 kiali.magedu.com
直接浏览器访问 kiail.magedu.com
验证kiali
- 部署bookinfo
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
- 创建客户端
kubectl apply -f samples/sleep/sleep.yaml
- 进入到sleep中直接productpage
- 将 productpage开放外部访问
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
- 直接浏览器访问外部IP
- 模拟持续访问
while true; do elinks --dump 10.211.55.24/productpage; sleep 0.$RANDOM; done
- 回到kiali查看采集信息
- 创建destination-rule
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
- 创建访问v1的定义
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
- 创建v2规则
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
- 直接访问web是不带星的版本
- 登陆jason访问是带星的版本
- 再次查看kiali也访问到了v2