K8s中Service我们知道是网络方面的服务,而Virtual Service是istio中的概念, 虚拟服务(Virtual Service)以及目标规则(Destination Rule)是 Istio 流量路由的两大基石。虚拟服务可以将流量路由到 Istio 服务网格中的服务。每个虚拟服务由一组路由规则组成,这些路由规则按顺序进行评估。
虚拟服务相当于 K8s 服务的 sidecar,在原本 K8s 服务的功能之上,提供了更加丰富的路由控制。
在之前的文章中以istio自带的示例做了一些演示,但是有的地方还是比较难懂,在这里再参考一下九析大佬的文章,再进行有目的的学习。

创建虚拟服务

首先再创建一个ns并开启自动注入进行试验。

[root@localhost ~]# kubectl create ns test
[root@localhost ~]# kubectl label ns test istio-injection=enabled

首先创建两个deployment并创建相应的svc关联到deploy

apiVersion: apps/v1
kind: Deployment
metadata:labels:type: web              ##共有的labelapp: nginxname: nginx-deploy      ##创建nginx的deploy
spec:replicas: 1selector:matchLabels:app: nginxtype: webtemplate:metadata:labels:app: nginxtype: webspec:containers:- name: nginximage: nginx:1.14-alpineimagePullPolicy: IfNotPresentports:- containerPort: 80name: portprotocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:type: web             ##共有的labelapp: nginxname: tomcat-deploy     ##创建tomcat的deploy
spec:replicas: 1selector:matchLabels:app: tomcattype: webtemplate:metadata:labels:app: tomcattype: webspec:containers:- name: tomcatimage: docker.io/kubeguide/tomcat-app:v1imagePullPolicy: IfNotPresentports:- containerPort: 8080name: portprotocol: TCP
---
apiVersion: v1
kind: Service
metadata:name: web-svc
spec:ports:- name: portport: 8080protocol: TCPtargetPort: 8080selector:type: web                 ##将有type=web标签的deploy和svc绑定起来

创建完成之后apply一下(nginx和tomcat的端口不一样,所以访问的时候应该只能访问到tomcat的8080端口,访问nginx时会报错,这时候需要进入pod手动去更改端口)

[root@localhost ~]# kubectl get pod -n test
NAME                             READY   STATUS    RESTARTS   AGE
nginx-deploy-64f67cc576-dhj2j    2/2     Running   0          6m34s
tomcat-deploy-5b9c4b6b64-j7hwr   2/2     Running   0          4m53s
[root@localhost ~]# kubectl get svc -n test
NAME      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
web-svc   ClusterIP   10.68.56.93   <none>        8080/TCP   4m7s

这样的做法在访问服务时,就会出现一次tomcat一次nginx这个时默认50-50的轮询。

[root@localhost ~]# curl 10.68.56.93:8080
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>Apache Tomcat/8.0.35</title><link href="favicon.ico" rel="icon" type="image/x-icon" /><link href="favicon.ico" rel="shortcut icon" type="image/x-icon" /><link href="tomcat.css" rel="stylesheet" type="text/css" /></head>
...[root@localhost ~]# curl 10.68.56.93:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

如果想要更细的控制,那就需要引入istio中的一些概念
1、首先用DR指定目的地

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule                  ##创建DR
metadata:name: test-dr                       ##DR的名字
spec: host: web-svc                       ##走web-svc这个svcsubsets:                            ##在web-svc这个svc上创建相应的目的地- name: tomcat                    ##规则名字叫tomcatlabels:                         ##选择一个标签有app=tomcat的pod作为目的地app: tomcat- name: nginx                    ##nginx同理labels:app: nginx

创建完成后可以查看

[root@localhost test]# kubectl apply -f dr-test.yaml -n test
destinationrule.networking.istio.io/test-dr created
[root@localhost test]# kubectl get -n test destinationrules.networking.istio.io
NAME      HOST      AGE
test-dr   web-svc   21s

2、再创建vsvc,将vsvc也绑定到k8s中的svc再细化时通过DR去设定规则

apiVersion: networking.istio.io/v1beta1
kind: VirtualService                    ##创建vsvc
metadata:name: test-virtual-svc                ##vsvc的名字
spec:hosts:- web-svc                            ##host绑定web-svc的svchttp:- route:- destination:                  ##设定规则,在web-svc之上通过DR这个目的地路由的规则host: web-svcsubset: nginxweight: 25                   ##权重25%- destination:host: web-svcsubset: tomcatweight: 75
[root@localhost test]# kubectl apply -f vsvc-test.yaml -n test
virtualservice.networking.istio.io/test-virtual-svc created
[root@localhost test]# kubectl get virtualservices.networking.istio.io -n test
NAME               GATEWAYS   HOSTS         AGE
test-virtual-svc              ["web-svc"]   2m14s

设置完成再来看看效果
随便进入一个被注入的容器,

curl web-svc:8080

这个时候就可以看到效果,大部分的返回都是tomcat的,而少部分是nginx,多试几次就可以算出差不多是三比一的概率。

istio学习(4)Vsvc+DR相关推荐

  1. [istio]istio学习笔记

    1.k8s部署,可以参考 k8s部署 2.下载istio curl -L https://istio.io/downloadIstio | sh - 将istio的bin加入到环境变量 [root@m ...

  2. Istio学习笔记:Istio及Kiali的安装与配置

    文章目录 前言 一.前置条件 二.安装步骤 1.准备安装 2.安装Istio 3.Istio IngressGateway代理配置 4.Kiali控制面板配置 三.测试验证 1.Bookinfo Ap ...

  3. istio学习笔记2:边车模式sidecar

    Sidecar 是什么 将本将属于应用程序的功能拆分成单独的进程,这个进程可以被理解为sidecar.在微服务体系内,将集成在应用内的微服务功能剥离到了sidecar内,sidecar提供了微服务发现 ...

  4. Istio:线上学习,不用搭建K8S集群

    Katacode上的Istio学习环境 推荐原因:使用简单,使用官方示例,免费,快速,无需注册,可直接通过互联网访问示例应用页面,支持最新版的Istio. Katacoda已支持Istio 1.0的学 ...

  5. 字节跳动端到端深度学习召回算法

    来源:DataFunTalk 本文约2600字,建议阅读5分钟 本文为你介绍字节跳动AML Team在大规模推荐中构建的可学习的索引结构. [ 导读 ] 传统的召回算法一般基于双塔结构并加以appro ...

  6. .NET Core on K8S 学习与实践系列文章索引 (更新至20191126)

    更新记录: -- 2019-11-26 增加Docker容器日志系列文章 近期在学习Kubernetes,基于之前做笔记的习惯,已经写了一部分文章,因此给自己立一个flag:完成这个<.NET ...

  7. 糖尿病视网膜病变的深度学习系统笔记

    糖尿病视网膜病变的深度学习系统笔记 论文地址:A deep learning system for detecting diabetic retinopathy across the disease ...

  8. Istio 实践手册 | 服务网格介绍

    <Istio 实践手册>,从服务网格概念出发,将逐步渗透到 Istio 具体细节中来,旨在帮助 Istio 学习者.使用者快速掌握相关知识点,可作为 Istio 学习.实践手册,建议收藏! ...

  9. sidecar 容器_kubernetes学习sidecar容器模式

    sidecar 容器 Kubernetes is an open-source container orchestration engine for automating deployment, sc ...

最新文章

  1. OFDM专题之子载波间干扰问题(二)
  2. c 函数多次声明_【C语言】- static和extern关键字 - 对函数的作用!
  3. c语言顺序查找算法,c语言实现排序和查找所有算法
  4. python数据序列题库_Python题库系列分享一(17道)
  5. python进程与线程_Python 进程和线程
  6. 卷积神经网络中的参数计算(转载)
  7. VS清理中间文件bat脚本
  8. 野火STM32F429学习笔记
  9. 重庆地区外卖店铺分析系统的设计与实现
  10. Netcfg.service failing.
  11. 安庆集团-冲刺日志(第八天)
  12. 专访阿里云游戏首席架构师李刚:如何解决云服务技术两大痛点?
  13. 软件测试人员的一般职业规划是如何的?
  14. 用Vue实现小Q聊天机器人(二)
  15. 入职B站一年,被裁员了,我思考了哪些?
  16. 【深度学习】数据扩充 (Data Augmentation)
  17. 冬天买什么绒的四件套好用
  18. 2016 多校4 1002 After a Sleepless Night 树上贪心
  19. 正版win10要不要装360_要不要装榻榻米?
  20. MySQL怎么运行的系列(八)14张图说明白MySQL事务原子性和undo日志原理

热门文章

  1. keep-alive使用场景
  2. 气质结果重复性比较和pdf结果文件的批处理
  3. SuperFetch
  4. 如何设计优秀的应用图标?苹果教你这六招
  5. java schtasks 不生效,at和schtasks的比较
  6. Qt使用.pri模块化工程
  7. SpringCloud之Resilience4J用法精讲
  8. DNS服务器未响应怎么办,如何解决?
  9. 四六级作文——说明文
  10. 【vue3 element-plus的循环图标】