- 此篇內容
主要目的是總結vs中的match的有關規則和在istio中如何實現路徑切割(當下版本1.8.2)nginx
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
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重寫能夠作到