• istio学习(3)请求路由


    在使用 Istio 控制 Bookinfo 版本路由之前运行以下命令为 Bookinfo 服务创建默认目标规则:

    kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
    
    • 1

    下来来看下yaml文件内容:
    bookinfo.yaml

    
    ##以Productpage为例,剩下的Reviews、Ratings、Details都同理
    ##################################################################################################
    # Productpage services
    ##################################################################################################
    apiVersion: v1  ##api版本
    kind: Service   
    metadata:
      name: productpage  ##svc的名字
      labels:
        app: productpage   ##svc的标签,两种标签
        service: productpage
    spec:
      ports:
      - port: 9080      ##svc暴露的端口
        name: http      ##端口形式
      selector:
        app: productpage  ##将svc绑定到具有app=productpage标签的deploy上
    ---
    apiVersion: v1
    kind: ServiceAccount  ##准入控制
    metadata:
      name: bookinfo-productpage
      labels:
        account: productpage
    ---
    apiVersion: apps/v1
    kind: Deployment    ##创建deploy
    metadata:
      name: productpage-v1   ##deploy的名字
      labels:
        app: productpage    ##deploy的标签
        version: v1
    spec:
      replicas: 1      ##副本数
      selector:        ##容器需要绑定到相应的标签上
        matchLabels:     
          app: productpage   ##标签选择了两个就说明这个容器选择了名为productpage-v1的deploy
          version: v1
      template:
        metadata:
          labels:
            app: productpage
            version: v1
        spec:
          serviceAccountName: bookinfo-productpage    ##选择准入控制器
          containers:
          - name: productpage
            image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080     ##容器内部暴露端口
            volumeMounts:             ##挂载项
            - name: tmp 
              mountPath: /tmp
            securityContext:
              runAsUser: 1000
          volumes:
          - name: tmp
            emptyDir: {}           ##临时挂载
    ---
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    创建完服务后再创建入口gateway
    bookinfo.yaml

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway               ##创建gateway的类型
    metadata:
      name: bookinfo-gateway      ##创建gateway的名字
    spec:
      selector:
        istio: ingressgateway # use istio default controller  ##选择的是istio的默认控制器
      servers:
      - port:
          number: 80          ##选择端口
          name: http
          protocol: HTTP     ##服务形式
        hosts:
        - "*"              ##这个host可以允许任何域名访问80端口
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService       ##创建vsvc
    metadata:
      name: bookinfo          ##vsvc名字
    spec:
      hosts:                  ##现在这个host也不进行选择,允许任何域名
      - "*"
      gateways:
      - bookinfo-gateway     ##选择相应的gateway
      http:
      - match:              ##匹配规则
        - uri:
            exact: /productpage   ##exact精确匹配
        - uri:
            prefix: /static      ##prefix前置匹配
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
        route:
        - destination:
            host: productpage    ##这里选择的是svc也可以写全部的路径productpage.default.svc.cluster.local
            port:
              number: 9080
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    目的地路由创建
    destination-rule-all.yaml

    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule   ##类型是DestinationRule
    metadata:
      name: productpage      ##DestinationRule的名称
    spec:
      host: productpage     ##这个和vsvc的host字段相同
      subsets:
      - name: v1           
        labels:
          version: v1      ##标签v1
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: reviews
    spec:
      host: reviews
      subsets:
      - name: v1
        labels:
          version: v1
      - name: v2
        labels:
          version: v2
      - name: v3
        labels:
          version: v3
    ---
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    下来进入今天的正题,因为一开始reviews有v1、v2、v3三个版本,使用svc进行调用的时候会进行负载均衡,但是如果我只想将流量打到固定的地方该如何进行更改呢?
    在DR后再创建svc
    virtual-service-all-v1.yaml

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: productpage
    spec:
      hosts:
      - productpage
      http:
      - route:
        - destination:
            host: productpage
            subset: v1
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: reviews
    spec:
      hosts:
      - reviews
      http:
      - route:
        - destination:
            host: reviews
            subset: v1    ##现在限制reviews是只走DR的v1路线
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    基于用户身份修改路由
    virtual-service-reviews-test-v2.yaml

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    ...
    spec:
      hosts:
      - reviews
      http:
      - match:                ##vsvc的规则
        - headers:            ##头信息
            end-user:
              exact: jason    ##精准匹配jason用户
        route:
        - destination:        ##如果匹配到了就走v2版本
            host: reviews
            subset: v2
      - route:
        - destination:        ##没有匹配到就走v1版本
            host: reviews
            subset: v1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    设置完成后刷新页面并登录
    在这里插入图片描述

    登录完成出现黑色星星表示v2版本生效了
    在这里插入图片描述

  • 相关阅读:
    Linux高性能服务器编程——ch5笔记
    Web APIs:事件高级--注册事件(绑定事件)
    wxWidgets从空项目开始Hello World
    Dart基础知识
    arduino离线安装esp32开发板支持包
    uni-app 之 picker选择器
    菜鸟学Kubernetes(K8s)系列——(番外)安装Ingress-Nginx(工作原理)
    21天学习挑战赛——Python操作MySQL和SqlServer
    连接池快速入门
    前端比较简单,不需要架构?
  • 原文地址:https://blog.csdn.net/passnetY/article/details/126381667