2013年,Pivotal公司的Matt Stine首次提出这一概念。
# 2017 Pivotal 定义云原生特征定义如下:
(1)DevOps
(2)CICD
(3)微服务
(4)容器化
# 2018 CNCF 定义云原生v1.0
(1)容器化
(2)微服务
(3)服务网格
(4)不可变基础设施(除了镜像,其他不准动)
在k8s中,我们运行的pod,里面一般只有一个容器,而Sidecar,就是在一个pod中,运行多个容器,又称之为边车模式。
一般情况下,我们的业务服务代码组成如下:
(1)非功能性代码:特定业务代码,主要实现业务逻辑。
(2)功能性代码:这部分代码属于通用性代码,和业务无关,比如服务发现、负载均衡。
(3)第三方调用:如用户单,调用短信网关发送短信。
那么不管是什么功能,每个开发注定会重复写后面2个代码。那么我们可以把后面的2个通用的非业务功能做成sdk,让开发的业务代码载入就可以。
这个时候,就有了spring cloud微服务框架,将上面的功能性代码做成sdk,让开发使用时载入就行。
但是spring cloud只支持java,限制了技术栈,并且还有其他问题:
如sdk更新,那么开发需要重新将sdk和业务代码打包,然后部署。
如sdk出现了安全问题,就算业务代码没动,也得跟着一起更新。
这就造成了很高的耦合度。
所以,后面就有了Sidecar,把这部分通用的功能独立出来,部署成一个独立的应用,开发只需要专注业务代码即可,当业务服务需要使用通用性工能的时候,直接调用一下就行。
让服务集中解决业务逻辑的问题,网络相关的功能则与业务逻辑剥离,并封装为独立的运行单元并作为服务的反向透明代理,从而不再与业务紧密关联。
换句话说,微服务的业务程序独立运行,而网络功能则以独立的代理层工作于客户端与服务之间,专门为代理的服务提供熔断、限流、追踪、指标采集和服务发现等功能。
也就是上面说的,一个pod中,运行2个容器。
(1)每个服务都使用一个专用的代理Sidecar来完成高级网络功能
(2)各服务间仅通过Sidecar代理互相通信
(3)各代理之间形成了一个网状网络,2017年,William为其创建一个专用定义,并称之为Service Mesh
绿色的是业务容器,蓝色的是Sidecar容器。
业务容器间的调用,都必须经过Sidecar容器,由Sidecar容器代理请求。
为Service Mesh中各独立工作的代理提供集中式的“控制平面”。
支持开发按需使用开发语言。
(1)逻辑上会分为控制平面和数据平面。
(2)实际的服务流量仍然直接在各代理(数据平面)之间完成,但控制平面知道每个代理实例。
(3)控制平面使代理能够实现诸如访问控制和指标收集之类的事情。
部署每一个Sidecar的时候,都需要对其进行配置(配置文件),但是这样服务一多,改起来就特别费劲。
所以就有了控制平面这个概念,直接在k8s集群中部署一个控制平面,它会发现集群中所有的Sidecar实例,后续所有的Sidecar配置都由控制平面统一下发。
指专注于处理服务间通信的基础设施,它负责在现代云原生应用组成的复杂拓扑中可靠地传递请求;
治理模式:除了处理业务逻辑的相关功能外,每个微服务还必须实现此前单体应用模型中用于网络间通信的基础功能,甚至还包括分布式应用程序之间的通信环境中应该实现的其它网络功能。
例如熔断、限流、应用跟踪、指标采集、服务发现和负载均衡等。
(1)控制服务间通信: 熔断、重试、超时、故障注入、负载均衡和故障转移等;
(2)服务发现:通过专用的服务总线发现服务端点;
(3)可观测:指标数据采集、监控、分布式日志记录和分布式追踪;
(4)安全性:TLS/SSL通信和密钥管理;
(5)身份认证和授权检查:身份认证,以及基于黑白名单或RBAC的访问控制功能;
(6)部署:对容器技术的原生支持,例如Docker和Kubernetes等;
(7)服务间的通信协议:HTTP 1.1、HTTP 2.0和gRPC等;
(8)健康状态检测:监测上游服务的健康状态;
触及系统中的每个数据包或请求,负责服务发现、健康检查、路由、负载均衡、身份验证/授权和可观测性等;
为网格中的所有正在运行的数据平面提供策略和配置,从而将所有数据平面联合构建为分布式系统,它不接触系统中的任何数据包或请求;
例如:负责的任务包括例如确定两个服务Service X到Sevice Y之间的路由,Service Y相关集群的负载均衡机制、断路策略、流量转移机制等,并将决策下发给Service X和Service Y的Sidecar;
(1)工作负载调度程序:借助于底层的基础设施(例如kubernetes)完成服务及其Sidecar运行位置的调度决策;
(2)服务发现:服务网格中的服务发现;
(4)控制平面UI:管理人员的操作接口,用于配置全局级别的设置,例如部署、身份认证和授权、路由及负载均衡等;
(1)K8s
解决容器编排与调度的问题。
本质上是应用的生命周期管理工具。
为服务网格提供基础支撑。
(2)Service Mesh
解决分布式应用间的通信问题。
本质上服务通信治理工具。
是对K8S在网络功能方面的扩展和延伸。
官方文档:https://istio.io/latest/zh/docs/
官网的下载方式需要,这里直接去github下载对应的安装包
github:https://github.com/istio/istio/releases/tag/1.14.3
[root@k8s-harbor01 ~]# cd /usr/local/
[root@k8s-harbor01 local]# ll -rth
总用量 32M
……省略部分内容
-rw------- 1 root root 21M 8月 7 21:23 istio-1.14.3-linux-amd64.tar.gz
[root@k8s-harbor01 local]# tar xf istio-1.14.3-linux-amd64.tar.gz
方便后续版本替换
[root@k8s-harbor01 local]# ln -s istio-1.14.3 istio
[root@k8s-harbor01 local]# ll -rt
lrwxrwxrwx 1 root root 12 8月 7 21:25 istio -> istio-1.14.3
[root@k8s-harbor01 local]# ln -s /usr/local/istio/bin/istioctl /usr/local/bin/
[root@k8s-harbor01 local]# ll /usr/local/bin/istioctl
lrwxrwxrwx 1 root root 29 8月 7 21:26 /usr/local/bin/istioctl -> /usr/local/istio/bin/istioctl
[root@k8s-master01 local]# istioctl version
no running Istio pods in "istio-system"
1.14.3
[root@k8s-harbor01 local]# cd istio
[root@k8s-harbor01 istio]# istioctl profile list
Istio configuration profiles:
default # 生产环境用
demo # 测试环境用
empty
external
minimal
openshift
preview
remote
[root@k8s-harbor01 local]# istioctl install --set profile=demo -y # 会下载几个istio需要的镜像文件,并部署pod在istio-system名称空间下,该命令执行需要一定的时间
# 安装完成
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Egress gateways installed
✔ Installation complete Making this installation the default for injection and validation.
Thank you for installing Istio 1.14. Please take a few minutes to tell us about your install/upgrade experience! https://forms.gle/yEtCbt45FZ3VoDT5A
# 查看pod
[root@k8s-harbor01 local]# kubectl get po,svc -n istio-system
NAME READY STATUS RESTARTS AGE
pod/istio-egressgateway-55748d4c9b-scxln 1/1 Running 0 21m
pod/istio-ingressgateway-66867b46f4-qdfgt 1/1 Running 0 21m
pod/istiod-744dc8cf66-mkdwj 1/1 Running 0 28m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/istio-egressgateway ClusterIP 10.100.74.117 <none> 80/TCP,443/TCP 21m
service/istio-ingressgateway LoadBalancer 10.100.188.102 <pending> 15021:30855/TCP,80:30604/TCP,443:32738/TCP,31400:32338/TCP,15443:32096/TCP 21m
service/istiod ClusterIP 10.100.43.25 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 28m
[root@k8s-harbor01 local]# istioctl version
client version: 1.14.3 # 客户端
control plane version: 1.14.3 # 控制平面(istiod)
data plane version: 1.14.3 (2 proxies) # 数据平面(istio-egressgateway出口网关、istio-ingressgateway入口网关)
默认类型是LoadBalancer。
LoadBalancer 类型的服务,实际上是用来对接云服务厂商的,如果我们没有对接云服务厂商的话,可以将这里类型改成 NodePort。
注意:如果集群proxy使用的ipvc,千万不要在LoadBalancer中配置任何集群中的节点地址,否则会导致网络出现异常。iptables可以。
详情见馆长博客:https://zhangguanzhang.github.io/2023/07/13/k8s-externalIPs/
[root@k8s-harbor01 local]# kubectl edit svc -n istio-system istio-ingressgateway
被打上istio标签的ns中所有的pod,都会被自动注入Envoy 边车代理,从而实现所有进出业务流量代理
[root@k8s-harbor01 local]# kubectl label namespace default istio-injection=enabled
namespace/default labeled
[root@k8s-harbor01 local]# kubectl get ns -l istio-injection=enabled
NAME STATUS AGE
default Active 104d
[root@k8s-harbor01 local]# kubectl run client-istio-test --image=ikubernetes/admin-box:v1.2 --restart=Never -it --rm --command -- /bin/bash
If you don't see a command prompt, try pressing enter.
root@client-istio-test /#
# 开一个新终端查看
[root@k8s-harbor01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
client-istio-test 2/2 Running 0 39s # 可以看到该pod中运行了2个容器,其中一个就是自动注入的
[root@k8s-harbor01 local]# cd istio/samples/addons/
[root@k8s-harbor01 addons]# pwd
/usr/local/istio/samples/addons
[root@k8s-harbor01 addons]# ll
总用量 280
drwxr-xr-x 2 root root 113 7月 29 2022 extras
-rw-r--r-- 1 root root 245578 7月 29 2022 grafana.yaml # 监控前端
-rw-r--r-- 1 root root 2533 7月 29 2022 jaeger.yaml # 分布式链路追踪
-rw-r--r-- 1 root root 11727 7月 29 2022 kiali.yaml # 可展示监控和分布式链路追踪的前端
-rw-r--r-- 1 root root 14114 7月 29 2022 prometheus.yaml # 监控后端
-rw-r--r-- 1 root root 5194 7月 29 2022 README.md
[root@k8s-harbor01 addons]# kubectl apply -f .
[root@k8s-harbor01 addons]# kubectl get po -n istio-system|grep '0/'
grafana-6794b7cd4d-g9p8x 0/1 ContainerCreating 0 44s
jaeger-7bb75985cf-p6dzl 0/1 ContainerCreating 0 43s
kiali-577d898bfd-h278c 0/1 ContainerCreating 0 43s
prometheus-55f7f779f8-87bnb 0/2 ContainerCreating 0 43s
# 等待一段时间
[root@k8s-harbor01 addons]# kubectl get po -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-6794b7cd4d-g9p8x 1/1 Running 0 3m21s
istio-egressgateway-55748d4c9b-scxln 1/1 Running 0 13h
istio-ingressgateway-66867b46f4-qdfgt 1/1 Running 0 13h
istiod-744dc8cf66-mkdwj 1/1 Running 0 13h
jaeger-7bb75985cf-p6dzl 1/1 Running 0 3m20s
kiali-577d898bfd-h278c 1/1 Running 0 3m20s
prometheus-55f7f779f8-87bnb 2/2 Running 0 3m20s
统一通过Ingress Gateway的外部地址进行访问
github:https://github.com/iKubernetes/istio-in-practise
[root@k8s-harbor01 ~]# mkdir bookinfo-istio
[root@k8s-harbor01 ~]# cd bookinfo-istio
[root@k8s-harbor01 istio]# git clone https://github.com/iKubernetes/istio-in-practise.git # 如果拉不下来可以直接下载zip包
[root@k8s-harbor01 istio]# ll -h
总用量 112K
-rw------- 1 root root 112K 8月 8 21:27 istio-in-practise-main.zip
[root@k8s-harbor01 istio]# unzip istio-in-practise-main.zip
[root@k8s-harbor01 istio-in-practise-main]# ll
总用量 40
-rw-r--r-- 1 root root 34523 6月 13 13:43 LICENSE
drwxr-xr-x 4 root root 55 6月 13 13:43 Muliti-Cluster-demo
drwxr-xr-x 5 root root 61 6月 13 13:43 Observability
-rw-r--r-- 1 root root 1102 6月 13 13:43 README.md
drwxr-xr-x 7 root root 182 6月 13 13:43 Security
drwxr-xr-x 8 root root 173 6月 13 13:43 ServiceEntry-and-WorkloadEntry
drwxr-xr-x 9 root root 124 6月 13 13:43 Traffic-Management-Basics
仅介绍,不操作
[root@k8s-harbor01 istio-in-practise-main]# cd Traffic-Management-Basics/
[root@k8s-harbor01 Traffic-Management-Basics]# cd kiali-port-20001/
[root@k8s-harbor01 kiali-port-20001]# ll
总用量 12
-rw-r--r-- 1 root root 182 6月 13 13:43 kiali-destinationrule.yaml
-rw-r--r-- 1 root root 285 6月 13 13:43 kiali-gateway.yaml
-rw-r--r-- 1 root root 323 6月 13 13:43 kiali-virtualservice.yaml
[root@k8s-harbor01 kiali-port-20001]# cat kiali-gateway.yaml # 就是个gateway资源,
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: kiali-gateway
namespace: istio-system
spec:
selector:
app: istio-ingressgateway
servers:
- port:
number: 80
name: http-kiali
protocol: HTTP
hosts: # 指明主机头为kiali.magedu.com,通过该地址就能访问到kiali。但是由于istio入口网关是nodeport,所以只能用IP访问,如果要使用域名,可以安装一个ingress或者nginx。
#- "kiali.magedu.com"
- '*'
---
[root@k8s-harbor01 kiali-port-20001]# cat kiali-virtualservice.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: kiali-virtualservice
namespace: istio-system
spec:
hosts:
#- "kiali.magedu.com"
- '*'
gateways:
- kiali-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: kiali # 流量进来后,会和kiali服务的20001端口建立映射关系
port:
number: 20001
---
[root@k8s-harbor01 kiali-port-20001]# cat kiali-destinationrule.yaml # 流量分发配置
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: kiali
namespace: istio-system
spec:
host: kiali
trafficPolicy:
tls:
mode: DISABLE # 关闭tls配置
[root@k8s-harbor01 kiali-port-80]# kubectl apply -f .
destinationrule.networking.istio.io/kiali created
gateway.networking.istio.io/kiali-gateway created
virtualservice.networking.istio.io/kiali-virtualservice created
[root@k8s-harbor01 kiali-port-80]# kubectl get gateway -n istio-system
NAME AGE
kiali-gateway 48s
[root@k8s-harbor01 kiali-port-80]# kubectl get vs -n istio-system
NAME GATEWAYS HOSTS AGE
kiali-virtualservice ["kiali-gateway"] ["kiali.magedu.com"] 75s
[root@k8s-harbor01 kiali-port-80]# kubectl get gateway -n istio-system
NAME AGE
kiali-gateway 12s
官方文档:https://istio.io/latest/zh/docs/examples/bookinfo/
该示例主要是模仿在线书店的一个分类,显示一本书的信息。 页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。
这个示例部署了一个用于演示多种 Istio 特性的应用,该应用由四个单独的微服务构成。
(1)productpage:这个微服务会调用 details 和 reviews 两个微服务,用来生成页面。
(2)details:这个微服务中包含了书籍的信息。
(3)reviews:这个微服务中包含了书籍相关的评论。它还会调用 ratings 微服务。
(4)ratings:这个微服务中包含了由书籍评价组成的评级信息。
reviews 微服务有 3 个版本:
(1)v1 版本不会调用 ratings 服务。
(2)v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
(3)v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。
Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子: 它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。
要在 Istio 中运行这一应用,无需对应用自身做出任何改变。
只要简单的在 Istio 环境中对服务进行配置和运行,具体一点说就是把 Envoy sidecar 注入到每个服务之中。 最终的部署结果将如下图所示:
所有的微服务都和 Envoy sidecar 集成在一起,被集成服务所有的出入流量都被 sidecar 所劫持,这样就为外部控制准备了所需的 Hook,然后就可以利用 Istio 控制平面为应用提供服务路由、遥测数据收集以及策略实施等功能。
[root@k8s-harbor01 kiali-port-80]# cd /usr/local/istio/samples/bookinfo/
[root@k8s-harbor01 bookinfo]# ll
总用量 20
-rwxr-xr-x 1 root root 3869 7月 29 2022 build_push_update_images.sh
drwxr-xr-x 2 root root 4096 7月 29 2022 networking
drwxr-xr-x 3 root root 18 7月 29 2022 platform
drwxr-xr-x 2 root root 46 7月 29 2022 policy
-rw-r--r-- 1 root root 3539 7月 29 2022 README.md
drwxr-xr-x 8 root root 123 7月 29 2022 src
-rw-r--r-- 1 root root 6329 7月 29 2022 swagger.yaml
[root@k8s-harbor01 bookinfo]# cd platform/kube/
[root@k8s-harbor01 kube]# ls
bookinfo-certificate.yaml bookinfo-details.yaml bookinfo-ratings-discovery.yaml bookinfo-ratings-v2.yaml bookinfo.yaml README.md
bookinfo-db.yaml bookinfo-ingress.yaml bookinfo-ratings-v2-mysql-vm.yaml bookinfo-ratings.yaml cleanup.sh
bookinfo-details-v2.yaml bookinfo-mysql.yaml bookinfo-ratings-v2-mysql.yaml bookinfo-reviews-v2.yaml productpage-nodeport.yaml
[root@k8s-harbor01 kube]# kubectl apply -f bookinfo.yaml # 会创建6个pod
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
[root@k8s-harbor01 kube]# kubectl get po # 拉镜像时间有点久,可以提前拉取下来
NAME READY STATUS RESTARTS AGE
details-v1-58c888794b-56c9n 2/2 Running 0 13m
productpage-v1-5c9b8f457d-tsdhn 2/2 Running 0 13m
ratings-v1-6fb94bb7cd-f5jc4 2/2 Running 0 13m
reviews-v1-6dbbc44b9d-gcgtf 2/2 Running 0 13m
reviews-v2-7fcd6bfb8b-jsdls 2/2 Running 0 13m
reviews-v3-6b778f96f4-m4bwl 2/2 Running 0 13m
[root@k8s-harbor01 kube]# istioctl ps # 可以看到相关的配置信息已经下发完成了
NAME CLUSTER CDS LDS EDS RDS ECDS ISTIOD VERSION
details-v1-58c888794b-56c9n.default Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-744dc8cf66-mkdwj 1.14.3
istio-egressgateway-55748d4c9b-scxln.istio-system Kubernetes SYNCED SYNCED SYNCED NOT SENT NOT SENT istiod-744dc8cf66-mkdwj 1.14.3
istio-ingressgateway-66867b46f4-qdfgt.istio-system Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-744dc8cf66-mkdwj 1.14.3
productpage-v1-5c9b8f457d-tsdhn.default Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-744dc8cf66-mkdwj 1.14.3
ratings-v1-6fb94bb7cd-f5jc4.default Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-744dc8cf66-mkdwj 1.14.3
reviews-v1-6dbbc44b9d-gcgtf.default Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-744dc8cf66-mkdwj 1.14.3
reviews-v2-7fcd6bfb8b-jsdls.default Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-744dc8cf66-mkdwj 1.14.3
reviews-v3-6b778f96f4-m4bwl.default Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-744dc8cf66-mkdwj 1.14.3
[root@k8s-harbor01 kube]# cat ../../../../samples/bookinfo/networking/bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # istio-ingressgateway的一个标签
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
[root@k8s-harbor01 kube]# kubectl apply -f ../../../../samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created
[root@k8s-harbor01 kube]# kubectl get gateway
NAME AGE
bookinfo-gateway 18s
[root@k8s-harbor01 kube]# while true ; do elinks -dump 10.31.200.101:32417/productpage; sleep 0.$RANDOM; done
[1]BookInfo Sample
[2]Sign in
[3]×
Please sign in
[4]_____________________
[5]_____________________
[6]Sign in [7]Cancel
……省略部分输出
Bookinfo 示例包含四个独立的微服务,每个微服务都有多个版本。
其中一个微服务reviews的三个不同版本已经部署并同时运行。
在浏览器中访问Bookinfo应用程序的/productpage 并刷新几次,就可以发现,有时书评的输出包含星级评分,有时则不包含。
这是因为没有明确的默认服务版本可路由,Istio 默认使用循环(轮询)方式将请求路由到所有可用版本。
在使用 Istio 控制 Bookinfo 版本路由之前,您需要在目标规则中定义好可用的版本,命名为 subsets 。
# 运行以下命令为 Bookinfo 服务创建的默认的目标规则
[root@k8s-harbor01 kube]# find / -name destination-rule-all.yaml
/usr/local/istio-1.14.3/samples/bookinfo/networking/destination-rule-all.yaml
[root@k8s-harbor01 kube]# kubectl apply -f /usr/local/istio-1.14.3/samples/bookinfo/networking/destination-rule-all.yaml
destinationrule.networking.istio.io/productpage created
destinationrule.networking.istio.io/reviews created
destinationrule.networking.istio.io/ratings created
destinationrule.networking.istio.io/details created
此任务的最初目标是应用将所有流量路由到微服务的 v1 (版本 1)的规则。
稍后,您将应用规则根据 HTTP 请求 header 的值路由流量。
通过配置请求路由,可以将请求动态路由到微服务的多个版本。
要仅路由到一个版本,请应用为微服务设置默认版本的 Virtual Service。在这种情况下,Virtual Service 将所有流量路由到每个微服务的 v1 版本。
[root@k8s-harbor01 ~]# find / -type f -name virtual-service-all-v1.yaml
/usr/local/istio-1.14.3/samples/bookinfo/networking/virtual-service-all-v1.yaml
[root@k8s-harbor01 ~]# kubectl apply -f /usr/local/istio-1.14.3/samples/bookinfo/networking/virtual-service-all-v1.yaml #这样所有的请求都只会打到v1上
virtualservice.networking.istio.io/productpage created
virtualservice.networking.istio.io/reviews created
virtualservice.networking.istio.io/ratings created
virtualservice.networking.istio.io/details created
[root@k8s-harbor01 ~]# kubectl get vs
NAME GATEWAYS HOSTS AGE
bookinfo ["bookinfo-gateway"] ["*"] 14h
details ["details"] 14s
productpage ["productpage"] 14s
ratings ["ratings"] 14s
reviews ["reviews"] 14s
[root@k8s-harbor01 kube]# while true ; do elinks -dump 10.31.200.101:32417/productpage; sleep 0.$RANDOM; done
接下来,您将更改路由配置,以便将来自特定用户的所有流量路由到特定服务版本。在这种情况下,来自名为 Jason 的用户的所有流量将被路由到服务 reviews:v2。
请注意,Istio 对用户身份没有任何特殊的内置机制。事实上,productpage 服务在所有到 reviews 服务的 HTTP 请求中都增加了一个自定义的 end-user 请求头,从而达到了本例子的效果。
[root@k8s-harbor01 kube]# cat /usr/local/istio-1.14.3/samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route: # 当用户请求头是end-user=jason时,请求路由到reviews:v2,其他路由到v1
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
[root@k8s-harbor01 kube]# kubectl apply -f /usr/local/istio-1.14.3/samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
virtualservice.networking.istio.io/reviews configured
[root@k8s-harbor01 kube]# kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"networking.istio.io/v1alpha3","kind":"VirtualService","metadata":{"annotations":{},"name":"reviews","namespace":"default"},"spec":{"hosts":["reviews"],"http":[{"match":[{"headers":{"end-user":{"exact":"jason"}}}],"route":[{"destination":{"host":"reviews","subset":"v2"}}]},{"route":[{"destination":{"host":"reviews","subset":"v1"}}]}]}}
creationTimestamp: "2023-08-18T03:09:56Z"
generation: 2
name: reviews
namespace: default
resourceVersion: "212630"
uid: edbbff98-84d8-47ea-b238-473476311a56
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1