istio版本

根据istio与k8s版本关系我们需要在k8s1.24版本上安装1.14的istio。本篇以1.14.3为例

k8s1.24安装文档参考

下载

https://github.com/istio/istio/releases

1.14.3版本

安装

安装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等插件

WX20220804-204646@2x

创建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

WX20220804-205009@2x

验证kiali

  • 部署bookinfo
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml 

WX20220804-205202@2x

  • 创建客户端
kubectl apply -f samples/sleep/sleep.yaml

WX20220804-205241@2x

  • 进入到sleep中直接productpage

WX20220804-205309@2x

  • 将 productpage开放外部访问
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
  • 直接浏览器访问外部IP
    WX20220804-205342@2x
  • 模拟持续访问
 while true; do elinks --dump 10.211.55.24/productpage; sleep 0.$RANDOM; done
  • 回到kiali查看采集信息

WX20220804-205408@2x

  • 创建destination-rule
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
  • 创建访问v1的定义
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

WX20220804-205434@2x

  • 创建v2规则
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
  • 直接访问web是不带星的版本

WX20220804-205458@2x

  • 登陆jason访问是带星的版本

WX20220804-205516@2x

  • 再次查看kiali也访问到了v2
    WX20220804-205531@2x

参考