我们来讲述现在主流的ServiceMesh思想以及在K8S中的使用Istio

首先是,ServiceMesh这个思想如何理解

简单来说的架构如下图

图片

我们在整个集群架构中,利用Networking Stack进行全局的网络控制

其次是我们真正的服务A,B,在进行交互的时候,是由一个sideCar作为媒介进行控制的

SideCar容器控制真正Service的网络访问,而规则取决于Networking Stack

如果全局去看,那么一个部署的服务网格图如下

图片

其中绿色代表着我们自己的服务,而蓝色则是sideCar,也就是我们ServiceMesh提供的代理

应用到Istio则是如下

图片

我们进入Istio,并进行一个基础的部署

https://istio.io/latest/zh/docs/

首先是在K8S中安装属于我们的Istio,操作如下

https://istio.io/latest/zh/docs/setup/getting-started/

curl -L https://istio.io/downloadIstio | sh – #这就解压好了

cd istio-1.13.2 #进入其中

export PATH=$PWD/bin:$PATH #配置环境变量

#之后利用其进行安装

#安装时候可以配置不同的平台,不同平台的安装参数如下

https://istio.io/latest/zh/docs/setup/platform-setup/

istioctl install –set profile=demo -y

#我们使用的配置是demo

这样就定义了CRD和部署了对应的operator,

之后在使用,我们可以声明哪个命名空间使用istio注入sidecar(istio中称之为envoy)

kubectl label namespace test istio-injection=enabled

这样我们就部署好了一个基本的servicemesh平台,而在公有云上,还有脱胎于其的serviceless

https://www.alibabacloud.com/zh/product/severless-application-engine?spm=a3c0i.7919406.6791778070.dnavpricing0.3e8e2129T1dJej

也就是只需要进行打包镜像上传至阿里云,然后就配置其使用方式,并利用Serviceless平台进行网络管理,进行部署

在ServiceLess中,我们想要调用,就可以@FeignClient(“http://aservice”)

然后我们就可以尝试运行一个示例的应用

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n test

在其中这些Pod的时候启动的时候,会同时部署上Istio边车应用

图片

每一个就绪的状态值都是 2/2才对,部署完成,我们需要考虑如何在外网访问到应用程序,这涉及到一个Istio的Ingress Gateway

首先是部署一个gateway 网关

apiVersion: networking.istio.io/v1alpha3

kind: Gateway

metadata:

name: bookinfo-gateway

spec:

selector:

istio: ingressgateway # use istio default controller

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

首先是一个CRD对象 Gateway,其中代理了对应80的端口的的所有访问

其次是一个虚拟服务对象,其中说明了哪些前缀需要访问到不同的svc

这样我们apply -f 一下这个文件

之后查看对应的网格边缘对象

图片

利用对应的端口进行了NodePort的方式进行暴露,也让我们可以进行简单的访问测试

其次是对于Istio相关展示的大屏的安装

需要安装的组件有Kiali,Prometheus Grafana Jaeger

安装相关的组件,只需要按照相关文档执行

kubectl apply -f samples/addons

kubectl rollout status deployment/kiali -n istio-system

如果出现问题,只需要再进行一次命令执行即可

之后我们说下Istio上如何进行流量管理,如何进行金丝雀发布

首先是进行一个请求路由的配置

首先需要配置一个Istio中的一个自定义对象

– apiVersion: networking.istio.io/v1beta1

kind: VirtualService

spec:

hosts:

– details

http:

– route:

– destination:

host: details

subset: v1

– apiVersion: networking.istio.io/v1beta1

kind: VirtualService

spec:

hosts:

– productpage

http:

– route:

– destination:

host: productpage

subset: v1

– apiVersion: networking.istio.io/v1beta1

kind: VirtualService

spec:

hosts:

– ratings

http:

– route:

– destination:

host: ratings

subset: v1

– apiVersion: networking.istio.io/v1beta1

kind: VirtualService

spec:

hosts:

– reviews

http:

– route:

– destination:

host: reviews

subset: v1

声明了代理的host和指向的service

这一个就好比是K8S中的Service

更上层的在之前声明的Gateway里,这就好比是Ingress

而在VirtualService中,我们声明的host其实就是实际的K8S的Service

我们来看一个VirtualService如何和Service类似声明路由规则

apiVersion: networking.istio.io/v1beta1

kind: VirtualService

spec:

hosts:

– reviews

http:

– match:

– headers:

end-user:

exact: jason

route:

– destination:

host: reviews

subset: v2

– route:

– destination:

host: reviews

subset: v1

上面声明了http下的数组中,我们指定了一个match headers 的规则,如果匹配上了,走的destination为 v2版本的reviews

没有就匹配下面v1版本的reviews

而这个subset中的v1 v2 其实就是选择的SERVICE下的Pod中有对应label的部分Pod

图片

这样就利用了header管理起了流量规则

然后是简单的金丝雀发布

类似Service中类似,我们利用

apiVersion: networking.istio.io/v1alpha3

kind: VirtualService

metadata:

name: reviews

spec:

hosts:

– reviews

http:

– route:

– destination:

host: reviews

subset: v1

weight: 50

– destination:

host: reviews

subset: v3

weight: 50

`

我们在一个route下声明了多个destination,并标记了weight

这就是有流量50% 50%的进行不同的分配

发表评论

邮箱地址不会被公开。 必填项已用*标注