|

主要目的是總結(jié)vs中的match的有關(guān)規(guī)則和在istio中如何實(shí)現(xiàn)路徑切割(當(dāng)下版本1.8.2)
實(shí)驗(yàn)demo
main.go
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
//1.創(chuàng)建路由
r := gin.Default()
//2.綁定路由規(guī)則,執(zhí)行的函數(shù)
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.監(jiān)聽端口,默認(rèn)8080
r.Run(":8080")
}
Dockerfile
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://,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.yaml
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.yaml
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.yaml
- istio-system 名稱空間下
- 使用cert-manager 自動(dòng)生成、續(xù)簽證書
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跳轉(zhuǎn)https
- hosts:
- www.zisefeizhu.com
port:
name: https
number: 443
protocol: HTTPS
tls:
credentialName: www-zisefeizhu-com # cert-manager生成的證書的certificate namespace
mode: SIMPLE
dr.yaml
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 條件匹配塊 這里設(shè)置的測(cè)試條件為user-agent字段,設(shè)置了兩個(gè)客戶地址
- headers: #目前istio對(duì)于多條件的匹配需要寫多個(gè)headers
user-agent:
exact: Mozilla/5.0
uri:
prefix: /api/ #訪問www.zisefeizhu.com/api/zisefeizhu 跳轉(zhuǎn)到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 #匹配到進(jìn)入v2版本
- match: #此匹配塊為``切割``路由路徑匹配塊掩飾
- uri:
prefix: /api/
rewrite:
uri: /
route:
- destination:
host: goproject
subset: v1
- route: #默認(rèn)路由
- destination:
host: goproject
subset: v1
驗(yàn)證
- 工具為:postman
- 訪問地址http:www.zisefeizhu.com/api/zisefeizhu
user-agent: Mozilla/5.0

user-agent: Mozilla/6.0

user-agent: Mozilla/7.0

|