- 此篇内容
主要目的是总结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重写能够作到