我们来讲述现在主流的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
也就是只需要进行打包镜像上传至阿里云,然后就配置其使用方式,并利用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%的进行不同的分配