istio:在vs中實現ab測試和路徑切割

  • 此篇內容

主要目的是總結vs中的match的有關規則和在istio中如何實現路徑切割(當下版本1.8.2)nginx

實驗demo

main.gogit

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	//1.建立路由
	r := gin.Default()
	//2.綁定路由規則,執行的函數
	r.GET("/zisefeizhu", func(context *gin.Context) {
		context.String(http.StatusOK, "Hello Zisefeizhu V1!")
// v1版本爲context.String(http.StatusOK, "Hello Zisefeizhu V1!")
// v2版本爲context.String(http.StatusOK, "Hello Zisefeizhu V2!")
	})
	//3.監聽端口,默認8080
	r.Run(":8080")
}

Dockerfilegithub

FROM registry.cn-shenzhen.aliyuncs.com/realibox-baseimage/golang:1.15.2-alpine as builder

WORKDIR /app

RUN go env -w GO111MODULE=on \
    && go env -w GOPROXY=https://goproxy.cn,direct

COPY go.mod go.sum ./
RUN go mod download

COPY . .

RUN CGO_ENABLED=0 go build -ldflags "-s -w"  -o server main.go


FROM alpine:latest

WORKDIR /app
COPY --from=builder /app/server /app
CMD ["./server"]

deployment.yamlgolang

  • v1 v2版本的不一樣之處在於version
apiVersion: apps/v1
kind: Deployment
metadata:
  name: goproject
  namespace: zisefeizhu
  labels:
    app: goproject
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: goproject
      version: v1
  template:
    metadata:
      labels:
        app: goproject
        version: v1
    spec:
      containers:
      - image: registry.cn-shenzhen.aliyuncs.com/zisefeizhu/goproject:goproject-zisefeizhu-5425
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 5
          periodSeconds: 30
          successThreshold: 1
          tcpSocket:
            port: 8080
          timeoutSeconds: 2
        name: goproject
        ports:
        - containerPort: 8080
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          initialDelaySeconds: 10
          periodSeconds: 30
          successThreshold: 1
          tcpSocket:
            port: 8080
      imagePullSecrets:
      - name: business-secret

svc.yamlapi

  • svc中沒有version標籤
apiVersion: v1
kind: Service
metadata:
  labels:
    app: goproject
  name: goproject
  namespace: zisefeizhu
spec:
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: goproject
  type: ClusterIP

istio配置清單

gateway.yamlapp

  • istio-system 名稱空間下
  • 使用cert-manager 自動生成、續簽證書
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: www-zisefeizhu-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - www.zisefeizhu.com
    port:
      name: http
      number: 80
      protocol: HTTP
    tls:
      httpsRedirect: true  # 301跳轉https
  - hosts:
    - www.zisefeizhu.com
    port:
      name: https
      number: 443
      protocol: HTTPS
    tls:
      credentialName: www-zisefeizhu-com  # cert-manager生成的證書的certificate namespace
      mode: SIMPLE

dr.yamltcp

  • 定義子集
kind: DestinationRule
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: goproject
  namespace: zisefeizhu
spec:
  host: goproject
  subsets:
    - labels:
        version: v12.3
      name: v1
    - labels:
        version: v12.4
      name: v2

vr.yaml函數

  • 重點來了
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: goproject
  namespace: zisefeizhu
spec:
  hosts:
    - www.zisefeizhu.com
  gateways:
    - istio-system/www-zisefeizhu-gateway #跨namespace 
  http:
    - match:                          #ab test 條件匹配塊  這裏設置的測試條件爲user-agent字段,設置了兩個客戶地址
        - headers:                    #目前istio對於多條件的匹配須要寫多個headers
            user-agent:
              exact: Mozilla/5.0   
          uri:
            prefix: /api/            #訪問www.zisefeizhu.com/api/zisefeizhu 跳轉到www.zisefeizhu.com/zisefeizhu 
        - headers:                   #istio 沒有相似kong的 ``konghq.com/strip-path`` 註解
            user-agent:
              exact: Mozilla/6.0
          uri:
            prefix: /api/
      rewrite:                       #此處須要注意:https://github.com/istio/istio/issues/8076
        uri: /
      route:
        - destination:
            host: goproject
            subset: v2              #匹配到進入v2版本
    - match:                        #此匹配塊爲``切割``路由路徑匹配塊掩飾
        - uri:
            prefix: /api/
      rewrite:
        uri: /
      route:
        - destination:
            host: goproject
            subset: v1
    - route:                        #默認路由
        - destination:
            host: goproject
            subset: v1

驗證

  • 工具爲:postman
  • 訪問地址http:www.zisefeizhu.com/api/zisefeizhu
    user-agent: Mozilla/5.0

user-agent: Mozilla/6.0
工具

user-agent: Mozilla/7.0
post

👌!

總結

此篇須要注意點:
一、匹配塊 match

匹配要激活的規則要知足的條件。單個匹配塊內的全部條件都具備AND語義,而匹配塊列表具備OR語義。若是任何一個匹配塊成功,則匹配該規則。

二、標頭操做 headers

目前對多條件的匹配彷佛還不能寫在一個headers中須要分開寫

三、路由切割

istio目前對於路由切割彷佛沒有相似kong 和nginxde的方法

ps:kong nginx:底層同樣

使用rewrite重寫能夠作到

相關文章
相關標籤/搜索