K8s 服务网格基本介绍与快速部署-Day 01

1. 服务网格基本介绍

1.1 什么是云原生

1.1.1 云原生概念诞生日

2013年,Pivotal公司的Matt Stine首次提出这一概念。

1.1.2 云原生架构特征

# 2017 Pivotal 定义云原生特征定义如下:
(1)DevOps
(2)CICD
(3)微服务
(4)容器化

# 2018 CNCF 定义云原生v1.0
(1)容器化
(2)微服务
(3)服务网格
(4)不可变基础设施(除了镜像,其他不准动)

1.2 Sidecar

1.2.1 什么是Sidecar

在k8s中,我们运行的pod,里面一般只有一个容器,而Sidecar,就是在一个pod中,运行多个容器,又称之为边车模式。

1.2.2 为什么需要Sidecar

一般情况下,我们的业务服务代码组成如下:
(1)非功能性代码:特定业务代码,主要实现业务逻辑。
(2)功能性代码:这部分代码属于通用性代码,和业务无关,比如服务发现、负载均衡。
(3)第三方调用:如用户单,调用短信网关发送短信。

那么不管是什么功能,每个开发注定会重复写后面2个代码。那么我们可以把后面的2个通用的非业务功能做成sdk,让开发的业务代码载入就可以。 
这个时候,就有了spring cloud微服务框架,将上面的功能性代码做成sdk,让开发使用时载入就行。

但是spring cloud只支持java,限制了技术栈,并且还有其他问题:
如sdk更新,那么开发需要重新将sdk和业务代码打包,然后部署。
如sdk出现了安全问题,就算业务代码没动,也得跟着一起更新。
这就造成了很高的耦合度。

所以,后面就有了Sidecar,把这部分通用的功能独立出来,部署成一个独立的应用,开发只需要专注业务代码即可,当业务服务需要使用通用性工能的时候,直接调用一下就行。

1.2.3 Sidecar解决的问题

让服务集中解决业务逻辑的问题,网络相关的功能则与业务逻辑剥离,并封装为独立的运行单元并作为服务的反向透明代理,从而不再与业务紧密关联。

换句话说,微服务的业务程序独立运行,而网络功能则以独立的代理层工作于客户端与服务之间,专门为代理的服务提供熔断、限流、追踪、指标采集和服务发现等功能。

也就是上面说的,一个pod中,运行2个容器。

1.3 Service Mesh(服务网格)的雏形

(1)每个服务都使用一个专用的代理Sidecar来完成高级网络功能
(2)各服务间仅通过Sidecar代理互相通信
(3)各代理之间形成了一个网状网络,2017年,William为其创建一个专用定义,并称之为Service Mesh

绿色的是业务容器,蓝色的是Sidecar容器。
业务容器间的调用,都必须经过Sidecar容器,由Sidecar容器代理请求。

K8s 服务网格基本介绍与快速部署-Day 01_第1张图片

1.4 新一代Service Mesh

为Service Mesh中各独立工作的代理提供集中式的“控制平面”。
支持开发按需使用开发语言。

1.4.1 简介

(1)逻辑上会分为控制平面和数据平面。
(2)实际的服务流量仍然直接在各代理(数据平面)之间完成,但控制平面知道每个代理实例。
(3)控制平面使代理能够实现诸如访问控制和指标收集之类的事情。

1.4.2 为啥需要控制平面

部署每一个Sidecar的时候,都需要对其进行配置(配置文件),但是这样服务一多,改起来就特别费劲。
所以就有了控制平面这个概念,直接在k8s集群中部署一个控制平面,它会发现集群中所有的Sidecar实例,后续所有的Sidecar配置都由控制平面统一下发。

K8s 服务网格基本介绍与快速部署-Day 01_第2张图片

1.5 “服务治理”方式的演进小结

K8s 服务网格基本介绍与快速部署-Day 01_第3张图片

1.6. 服务网格

1.6.1 概念

指专注于处理服务间通信的基础设施,它负责在现代云原生应用组成的复杂拓扑中可靠地传递请求;
治理模式:除了处理业务逻辑的相关功能外,每个微服务还必须实现此前单体应用模型中用于网络间通信的基础功能,甚至还包括分布式应用程序之间的通信环境中应该实现的其它网络功能。
例如熔断、限流、应用跟踪、指标采集、服务发现和负载均衡等。

1.6.2 服务网格的功能

(1)控制服务间通信: 熔断、重试、超时、故障注入、负载均衡和故障转移等;
(2)服务发现:通过专用的服务总线发现服务端点;
(3)可观测:指标数据采集、监控、分布式日志记录和分布式追踪;
(4)安全性:TLS/SSL通信和密钥管理;
(5)身份认证和授权检查:身份认证,以及基于黑白名单或RBAC的访问控制功能;
(6)部署:对容器技术的原生支持,例如Docker和Kubernetes等;
(7)服务间的通信协议:HTTP 1.1、HTTP 2.0和gRPC等;
(8)健康状态检测:监测上游服务的健康状态;

1.6.3 服务网格的组成

1.6.3.1 数据平面
触及系统中的每个数据包或请求,负责服务发现、健康检查、路由、负载均衡、身份验证/授权和可观测性等;
1.6.3.2 控制平面
为网格中的所有正在运行的数据平面提供策略和配置,从而将所有数据平面联合构建为分布式系统,它不接触系统中的任何数据包或请求;
例如:负责的任务包括例如确定两个服务Service X到Sevice Y之间的路由,Service Y相关集群的负载均衡机制、断路策略、流量转移机制等,并将决策下发给Service X和Service Y的Sidecar;
1.6.3.3 控制平面提供的功能
(1)工作负载调度程序:借助于底层的基础设施(例如kubernetes)完成服务及其Sidecar运行位置的调度决策;
(2)服务发现:服务网格中的服务发现;
(4)控制平面UI:管理人员的操作接口,用于配置全局级别的设置,例如部署、身份认证和授权、路由及负载均衡等;

1.7. 企业应用云原生架构升级实践

1.8. 服务网格和K8S间的关系

(1)K8s
解决容器编排与调度的问题。
本质上是应用的生命周期管理工具。
为服务网格提供基础支撑。

(2)Service Mesh
解决分布式应用间的通信问题。
本质上服务通信治理工具。
是对K8S在网络功能方面的扩展和延伸。

K8s 服务网格基本介绍与快速部署-Day 01_第4张图片

1.9. Service Mesh 产品发展史

K8s 服务网格基本介绍与快速部署-Day 01_第5张图片

2. Istio快速部署

官方文档:https://istio.io/latest/zh/docs/

2.1 下载istio 1.14

2.1.1 下载二进制安装包

官网的下载方式需要,这里直接去github下载对应的安装包
github:https://github.com/istio/istio/releases/tag/1.14.3

K8s 服务网格基本介绍与快速部署-Day 01_第6张图片

[root@k8s-harbor01 ~]# cd /usr/local/
[root@k8s-harbor01 local]# ll -rth
总用量 32M
……省略部分内容
-rw-------  1 root root 21M 87 21:23 istio-1.14.3-linux-amd64.tar.gz

[root@k8s-harbor01 local]# tar xf istio-1.14.3-linux-amd64.tar.gz

2.1.2 创建软连接

方便后续版本替换

[root@k8s-harbor01 local]# ln -s istio-1.14.3 istio
[root@k8s-harbor01 local]# ll -rt
lrwxrwxrwx  1 root root       12 87 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 87 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

2.2 安装istio控制平面

2.2.1 查看istio 配置文件

[root@k8s-harbor01 local]# cd istio
[root@k8s-harbor01 istio]# istioctl profile list
Istio configuration profiles:
    default # 生产环境用
    demo # 测试环境用
    empty
    external
    minimal
    openshift
    preview
    remote

2.2.2 安装istio

[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入口网关)

2.2.3 修改istio-ingressgateway svc类型为NodePort

默认类型是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

K8s 服务网格基本介绍与快速部署-Day 01_第7张图片
在这里插入图片描述

2.2.4 给命名空间添加istio标签

被打上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

2.2.5 创建测试pod

[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个容器,其中一个就是自动注入的

K8s 服务网格基本介绍与快速部署-Day 01_第8张图片

2.3 安装istio相关插件

2.3.1 插件所在目录

[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 729 2022 extras
-rw-r--r-- 1 root root 245578 729 2022 grafana.yaml # 监控前端
-rw-r--r-- 1 root root   2533 729 2022 jaeger.yaml # 分布式链路追踪
-rw-r--r-- 1 root root  11727 729 2022 kiali.yaml # 可展示监控和分布式链路追踪的前端
-rw-r--r-- 1 root root  14114 729 2022 prometheus.yaml # 监控后端
-rw-r--r-- 1 root root   5194 729 2022 README.md

2.3.2 安装所有插件

[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

2.4 通过Ingress Gateway对外开放插件访问

统一通过Ingress Gateway的外部地址进行访问

2.4.1 clone大佬提供的资源清单

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 88 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 613 13:43 LICENSE
drwxr-xr-x 4 root root    55 613 13:43 Muliti-Cluster-demo
drwxr-xr-x 5 root root    61 613 13:43 Observability
-rw-r--r-- 1 root root  1102 613 13:43 README.md
drwxr-xr-x 7 root root   182 613 13:43 Security
drwxr-xr-x 8 root root   173 613 13:43 ServiceEntry-and-WorkloadEntry
drwxr-xr-x 9 root root   124 613 13:43 Traffic-Management-Basics

2.4.2 部署kiali

2.4.2.1 资源清单介绍

仅介绍,不操作

[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 613 13:43 kiali-destinationrule.yaml
-rw-r--r-- 1 root root 285 613 13:43 kiali-gateway.yaml
-rw-r--r-- 1 root root 323 613 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配置
2.4.2.2 部署kiali
[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

2.4.3 浏览器访问kiali

K8s 服务网格基本介绍与快速部署-Day 01_第9张图片

3. 示例:Bookinfo 应用

官方文档:https://istio.io/latest/zh/docs/examples/bookinfo/

3.1 介绍

该示例主要是模仿在线书店的一个分类,显示一本书的信息。 页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。
这个示例部署了一个用于演示多种 Istio 特性的应用,该应用由四个单独的微服务构成。
(1)productpage:这个微服务会调用 details 和 reviews 两个微服务,用来生成页面。
(2)details:这个微服务中包含了书籍的信息。
(3)reviews:这个微服务中包含了书籍相关的评论。它还会调用 ratings 微服务。
(4)ratings:这个微服务中包含了由书籍评价组成的评级信息。

reviews 微服务有 3 个版本:
(1)v1 版本不会调用 ratings 服务。
(2)v2 版本会调用 ratings 服务,并使用 15 个黑色星形图标来显示评分信息。
(3)v3 版本会调用 ratings 服务,并使用 15 个红色星形图标来显示评分信息。

3.2 架构

Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子: 它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。
K8s 服务网格基本介绍与快速部署-Day 01_第10张图片

3.3 部署应用

要在 Istio 中运行这一应用,无需对应用自身做出任何改变。
只要简单的在 Istio 环境中对服务进行配置和运行,具体一点说就是把 Envoy sidecar 注入到每个服务之中。 最终的部署结果将如下图所示:

K8s 服务网格基本介绍与快速部署-Day 01_第11张图片
所有的微服务都和 Envoy sidecar 集成在一起,被集成服务所有的出入流量都被 sidecar 所劫持,这样就为外部控制准备了所需的 Hook,然后就可以利用 Istio 控制平面为应用提供服务路由、遥测数据收集以及策略实施等功能。

3.3.1 启动应用服务

[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 729 2022 build_push_update_images.sh
drwxr-xr-x 2 root root 4096 729 2022 networking
drwxr-xr-x 3 root root   18 729 2022 platform
drwxr-xr-x 2 root root   46 729 2022 policy
-rw-r--r-- 1 root root 3539 729 2022 README.md
drwxr-xr-x 8 root root  123 729 2022 src
-rw-r--r-- 1 root root 6329 729 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

3.2 访问Bookinfo

3.2.1 创建一个Bookinfo专用gateway和VirtualService

[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

3.2.2 浏览器访问

K8s 服务网格基本介绍与快速部署-Day 01_第12张图片

K8s 服务网格基本介绍与快速部署-Day 01_第13张图片
K8s 服务网格基本介绍与快速部署-Day 01_第14张图片

3.2.3 模拟循环访问,在kiali查看请求链路

3.2.3.1 模拟请求
[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
……省略部分输出
3.2.3.2 kiali页面查看

从下面的实时请求链路可以看到流量都经过了哪些服务
K8s 服务网格基本介绍与快速部署-Day 01_第15张图片

3.2.3.3 查看数据报文流向

K8s 服务网格基本介绍与快速部署-Day 01_第16张图片
K8s 服务网格基本介绍与快速部署-Day 01_第17张图片

3.2.3.4 查看流量分配比例

K8s 服务网格基本介绍与快速部署-Day 01_第18张图片
K8s 服务网格基本介绍与快速部署-Day 01_第19张图片

4. Istio的流量治理示例

Bookinfo 示例包含四个独立的微服务,每个微服务都有多个版本。
其中一个微服务reviews的三个不同版本已经部署并同时运行。
在浏览器中访问Bookinfo应用程序的/productpage 并刷新几次,就可以发现,有时书评的输出包含星级评分,有时则不包含。
这是因为没有明确的默认服务版本可路由,Istio 默认使用循环(轮询)方式将请求路由到所有可用版本。

4.1 应用默认目标规则

在使用 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

4.2 配置请求路由(指定请求路由到指定版本)

此任务的最初目标是应用将所有流量路由到微服务的 v1 (版本 1)的规则。
稍后,您将应用规则根据 HTTP 请求 header 的值路由流量。

通过配置请求路由,可以将请求动态路由到微服务的多个版本。

4.2.1 应用 Virtual Service

要仅路由到一个版本,请应用为微服务设置默认版本的 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

4.2.2 模拟请求

[root@k8s-harbor01 kube]# while true ; do elinks -dump 10.31.200.101:32417/productpage; sleep 0.$RANDOM; done

4.2.3 kiali查看

K8s 服务网格基本介绍与快速部署-Day 01_第20张图片

4.3 将指定用户的请求路由到指定版本(基于用户身份)

接下来,您将更改路由配置,以便将来自特定用户的所有流量路由到特定服务版本。在这种情况下,来自名为 Jason 的用户的所有流量将被路由到服务 reviews:v2。

请注意,Istio 对用户身份没有任何特殊的内置机制。事实上,productpage 服务在所有到 reviews 服务的 HTTP 请求中都增加了一个自定义的 end-user 请求头,从而达到了本例子的效果。

4.3.1 配置VirtualService,启用基于用户的路由

[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

4.3.2 确认规则已创建

[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

4.3.3 用jason用户登录Bookinfo

K8s 服务网格基本介绍与快速部署-Day 01_第21张图片
K8s 服务网格基本介绍与快速部署-Day 01_第22张图片

4.3.4 用其他用户登录Bookinfo

随便输入一个用户就行
K8s 服务网格基本介绍与快速部署-Day 01_第23张图片

你可能感兴趣的:(服务网格,云原生,istio)