Istio 流量治理 (重定向、流量分割、Http请求头、故障注入、重试、流量镜像、集群负载均衡、连接池、异常值检测)【六】

 

一、URL重定向

#正常数据流向:

Client =》 Proxy =》 demoapp

Demoapp VS

#1.访问/canary 重写为 / 转给后端demoapp v11

Client => /canary => / (demoapp v11)

#2.访问demoapp/backend 重定向到 backend/服务

Client =》 demoapp/backend => backend:8082/

#3.默认访问demoapp-v10

Proxy VS

#1.访问Proxy/backend服务时 再次转给Client 由Client再转到backend/

Client =》 Proxy/backend  => Client => backend/

#3.默认访问proxy

 

[root@xksmaster1 05-url-redirect-and-rewrite]# cat deploy-backend.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: backend
    version: v3.6
  name: backendv36
spec:
  progressDeadlineSeconds: 600
  replicas: 2
  selector:
    matchLabels:
      app: backend
      version: v3.6
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: backend
        version: v3.6
    spec:
      containers:
      - image: ikubernetes/gowebserver:v0.1.0
        imagePullPolicy: IfNotPresent
        name: gowebserver
        env:
        - name: "SERVICE_NAME"
          value: "backend"
        - name: "SERVICE_PORT"
          value: "8082"
        - name: "SERVICE_VERSION"
          value: "v3.6"
        ports:
        - containerPort: 8082
          name: web
          protocol: TCP
        resources:
          limits:
            cpu: 50m
---
apiVersion: v1
kind: Service
metadata:
  name: backend
spec:
  ports:
    - name: http-web
      port: 8082
      protocol: TCP
      targetPort: 8082
  selector:
    app: backend
    version: v3.6
---

[root@xksmaster1 05-url-redirect-and-rewrite]# cat virtualservice-demoapp.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: demoapp
spec:
  hosts:
  - demoapp
  http:
  - name: rewrite
    match:
    - uri:
        prefix: /canary
    rewrite:
      uri: /
    route:
    - destination:
        host: demoapp
        subset: v11
  - name: redirect
    match:
    - uri:
        prefix: "/backend"
    redirect:
      uri: /
      authority: backend
      port: 8082
  - name: default
    route:
    - destination:
        host: demoapp
        subset: v10

[root@xksmaster1 05-url-redirect-and-rewrite]# cat virtualservice-proxy.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: proxy
spec:
  hosts:
  - proxy
  http:
  - name: redirect
    match:
    - uri:
        prefix: "/backend"
    redirect:
      uri: /
      authority: backend
      port: 8082
  - name: default
    route:
    - destination:
        host: proxy


[root@xksmaster1 05-url-redirect-and-rewrite]# kubectl apply -f ./

[root@xksmaster1 05-url-redirect-and-rewrite]# kubectl get pods
NAME                                READY   STATUS             RESTARTS          AGE
backendv36-697647965b-mdprv         2/2     Running            0                 76s
backendv36-697647965b-zsxph         2/2     Running            0                 76s
demoappv10-54757f48d6-lvtn9         2/2     Running            2 (4h56m ago)     23h
demoappv10-54757f48d6-sbkpb         2/2     Running            2 (4h56m ago)     23h
demoappv10-54757f48d6-vwr4k         2/2     Running            2 (4h56m ago)     23h
demoappv11-6b479f5664-9frlg         2/2     Running            2 (4h56m ago)     23h
demoappv11-6b479f5664-vll6r         2/2     Running            2 (4h56m ago)     23h
proxy-645cd54b84-xsrx8              2/2     Running            2 (4h56m ago)     23h
sleep-bc9998558-bl49z               2/2     Running            2 (4h56m ago)     2d

[root@xksmaster1 05-url-redirect-and-rewrite]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
backend      ClusterIP   10.103.174.1     <none>        8082/TCP   89s
demoapp      ClusterIP   10.111.52.87     <none>        8080/TCP   23h
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP    93d
proxy        ClusterIP   10.99.105.132    <none>        80/TCP     23h
sleep        ClusterIP   10.109.135.158   <none>        80/TCP     2d

#通过客户端进行测试
[root@xksmaster1 05-url-redirect-and-rewrite]# kubectl exec -it sleep-bc9998558-bl49z /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
#访问proxy 默认到v10
/ $ curl proxy
Proxying value: iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
 - Took 56 milliseconds.
/ $ curl proxy
Proxying value: iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
 - Took 5 milliseconds.
/ $ curl proxy
Proxying value: iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
 - Took 6 milliseconds.
/ $ curl proxy
Proxying value: iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
 - Took 5 milliseconds.

#访问proxy/backend 会重定向到 /backend:8082/
/ $ curl proxy/backend
/ $ curl -I proxy/backend
HTTP/1.1 301 Moved Permanently
location: http://backend:8082/
date: Fri, 02 Jun 2023 06:25:01 GMT
server: envoy
transfer-encoding: chunked

#访问backend本身 8082 服务
/ $ curl backend:8082
Hello from backend, reqest: /, Client: 127.0.0.6:44246, === Version: v3.6 ===
/ $ curl backend:8082
Hello from backend, reqest: /, Client: 127.0.0.6:44246, === Version: v3.6 ===

#访问demoapp 8080默认是v10
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!

#访问demoapp:8080/canary 重写到/ v11版本
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!

#访问demoapp:8080/backend 重定向 
/ $ curl demoapp:8080/backend
/ $ curl -I demoapp:8080/backend
HTTP/1.1 301 Moved Permanently
location: http://backend:8082/
date: Fri, 02 Jun 2023 06:27:03 GMT
server: envoy
transfer-encoding: chunked

二、流量分割-weight 权重 

[root@xksmaster1 06-weight-based-routing]# cat virtualservice-demoapp.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: demoapp
spec:
  hosts:
  - demoapp
  http:
  - name: weight-based-routing
    route:
    - destination:
        host: demoapp
        subset: v10
      weight: 90
    - destination:
        host: demoapp
        subset: v11
      weight: 10

[root@xksmaster1 06-weight-based-routing]# kubectl apply -f virtualservice-demoapp.yaml
virtualservice.networking.istio.io/demoapp configured
You have new mail in /var/spool/mail/root
[root@xksmaster1 06-weight-based-routing]# kubectl describe vs demoapp

#通过客户端访问 - 90/10分割流量
[root@xksmaster1 ~]# kubectl exec -it sleep-bc9998558-bl49z /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ $ while true; do curl demoapp:8080; sleep 0.$RANDOM; done
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!

#可以动态 配置流量比例 实时生效 10/90比例

   route:
    - destination:
        host: demoapp
        subset: v10
      weight: 10
    - destination:
        host: demoapp
        subset: v11
      weight: 90
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!

#可以动态 配置流量比例 实时生效 0 100比例 做到流量全部切换至新版本
 
   route:
    - destination:
        host: demoapp
        subset: v10
      weight: 0
    - destination:
        host: demoapp
        subset: v11
      weight: 100

iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!

三、 headers-operation

#1.默认 流量到v10、响应报文头添加:X-Envoy:test

#2.请求报文标头有 x-canary:true 路由到 v11版本 并且路由请求报文上设置为User-Agent:Chrome 并且响应报文添加x-canary:true

[root@xksmaster1 07-headers-operation]# cat virtualservice-demoapp.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: demoapp
spec:
  hosts:
  - demoapp
  http:
  - name: canary
    match:
    - headers:
        x-canary:
          exact: "true"
    route:
    - destination:
        host: demoapp
        subset: v11
      headers:
        request:
          set:
            User-Agent: Chrome
        response:
          add:
            x-canary: "true"
  - name: default
    headers:
      response:
        add:
          X-Envoy: test
    route:
    - destination:
        host: demoapp
        subset: v10

[root@xksmaster1 07-headers-operation]# kubectl apply -f virtualservice-demoapp.yaml

#1.默认 流量到v10、响应报文头添加:X-Envoy:test
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
/ $ curl -I demoapp:8080
HTTP/1.1 200 OK
content-type: text/html; charset=utf-8
content-length: 116
server: envoy
date: Fri, 02 Jun 2023 07:32:54 GMT
x-envoy-upstream-service-time: 3
x-envoy: test

#2.请求报文标头有 x-canary:true 路由到 v11版本 并且路由请求报文上设置为User-Agent:Chrome 并且响应报文添加x-canary:true
/ $ curl -H "X-Canary: true" demoapp:8080
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
/ $ curl -H "X-Canary: true" demoapp:8080
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
/ $ curl -I -H "X-Canary: true" demoapp:8080
HTTP/1.1 200 OK
content-type: text/html; charset=utf-8
content-length: 116
server: envoy
date: Fri, 02 Jun 2023 07:33:48 GMT
x-envoy-upstream-service-time: 3
x-canary: true

[root@xksmaster1 07-headers-operation]# kubectl logs demoappv11-6b479f5664-9frlg -c istio-proxy
[2023-06-02T07:33:48.709Z] "HEAD / HTTP/1.1" 200 - via_upstream - "-" 0 0 2 1 "-" "Chrome" "558aadfe-8ea7-9718-8ee5-3270970edb66" "demoapp:8080" "10.244.207.107:8080" inbound|8080|| 127.0.0.6:51619 10.244.207.107:8080 10.244.182.50:59240 outbound_.8080_.v11_.demoapp.default.svc.cluster.local default

 四、故障注入

#1./canary 重写为 / 默认到v11 故障注入中断故障20%比例中断响应555

#2.默认v10 故障注入延迟 20%比例 延迟3秒

[root@xksmaster1 08-fault-injection]# cat virtualservice-demoapp.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: demoapp
spec:
  hosts:
  - demoapp
  http:
  - name: canary
    match:
    - uri:
        prefix: /canary
    rewrite:
      uri: /
    route:
    - destination:
        host: demoapp
        subset: v11
    fault:
      abort:
        percentage:
          value: 20
        httpStatus: 555
  - name: default
    route:
    - destination:
        host: demoapp
        subset: v10
    fault:
      delay:
        percentage:
          value: 20
        fixedDelay: 3s
[root@xksmaster1 08-fault-injection]# kubectl apply -f virtualservice-demoapp.yaml
virtualservice.networking.istio.io/demoapp configured

#1./canary 重写为 / 默认到v11 故障注入中断故障20%比例中断响应555
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-9frlg, ServerIP: 10.244.207.107!
/ $ curl demoapp:8080/canary #故障注入中断故障20%比例中断响应555
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!
/ $ curl demoapp:8080/canary
iKubernetes demoapp v1.1 !! ClientIP: 127.0.0.6, ServerName: demoappv11-6b479f5664-vll6r, ServerIP: 10.244.182.48!


#2.默认v10 故障注入延迟 20%比例 延迟3秒
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
/ $ curl demoapp:8080 #此时 故障注入3s
^C
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!

五、重试 

#1.demoapp /canary 重写为 / 路由到v11 并且故障注入中断50%比例 555 、默认路由v10 故障注入延迟 50% 3s

#2.proxy 在网格和网关上同时 重试机制 超过1s 5XX、conect-failure、refused-stream 进行重试5次 每次重试超时1s

[root@xksmaster1 09-http-retry]# cat virtualservice-demoapp.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: demoapp
spec:
  hosts:
  - demoapp
  http:
  - name: canary
    match:
    - uri:
        prefix: /canary
    rewrite:
      uri: /
    route:
    - destination:
        host: demoapp
        subset: v11
    fault:
      abort:
        percentage:
          value: 50
        httpStatus: 555
  - name: default
    route:
    - destination:
        host: demoapp
        subset: v10
    fault:
      delay:
        percentage:
          value: 50
        fixedDelay: 3s
[root@xksmaster1 09-http-retry]# cat virtualservice-proxy.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: proxy
spec:
  hosts:
  - "fe.magedu.com"                     # 对应于gateways/proxy-gateway
  - "proxy"
  - "proxy.default.svc"
  gateways:
  - istio-system/proxy-gateway       # 相关定义仅应用于Ingress Gateway上
  - mesh
  http:
  - name: default
    route:
    - destination:
        host: proxy
    timeout: 1s
    retries:
      attempts: 5
      perTryTimeout: 1s
      retryOn: 5xx,connect-failure,refused-stream
      

#1.demoapp /canary 重写为 / 路由到v11 并且故障注入中断50%比例 555 、默认路由v10 故障注入延迟 50% 3s

#2.proxy 在网格和网关上同时 重试机制 超过1s 5XX、conect-failure、refused-stream 进行重试5次 每次重试超时1s
/ $ curl proxy
Proxying value: iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
 - Took 26 milliseconds.
/ $ curl proxy
upstream request timeout/ $

六、流量镜像 

 # 当客户端请求访问 v10 流量 也分发到v11上 但是用户无感 

[root@xksmaster1 10-traffic-mirror]# cat virtualservice-demoapp.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: demoapp
spec:
  hosts:
  - demoapp
  http:
  - name: traffic-mirror
    route:
    - destination:
        host: demoapp
        subset: v10
    mirror:
      host: demoapp
      subset: v11

[root@xksmaster1 10-traffic-mirror]# kubectl apply -f virtualservice-demoapp.yaml
virtualservice.networking.istio.io/demoapp configured


/ $ curl proxy
Proxying value: iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
 - Took 11 milliseconds.
/ $ curl proxy
Proxying value: iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
 - Took 11 milliseconds.
/ $ curl proxy
Proxying value: iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
 - Took 7 milliseconds.
/ $ curl proxy
Proxying value: iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
 - Took 4 milliseconds.
/ $ curl proxy
Proxying value: iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
 - Took 5 milliseconds.

#此时有影子流量
[root@xksmaster1 10-traffic-mirror]# kubectl logs demoappv11-6b479f5664-9frlg -c istio-proxy  
2023-06-02T07:55:43.172143Z     info    xdsproxy        connected to upstream XDS server: istiod.istio-system.svc:15012
2023-06-02T08:28:17.861703Z     info    xdsproxy        connected to upstream XDS server: istiod.istio-system.svc:15012
[2023-06-02T08:37:45.608Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 116 3 2 "10.244.207.100" "-" "48d8d8eb-681f-9a41-b803-ecfafd3b2659" "demoapp-shadow:8080" "10.244.207.107:8080" inbound|8080|| 127.0.0.6:56748 10.244.207.107:8080 10.244.207.100:0 outbound_.8080_.v11_.demoapp.default.svc.cluster.local default
[2023-06-02T08:37:46.120Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 116 1 1 "10.244.207.100" "-" "5fd43a6a-2404-9ad5-b7f6-9b5797b16c77" "demoapp-shadow:8080" "10.244.207.107:8080" inbound|8080|| 127.0.0.6:50377 10.244.207.107:8080 10.244.207.100:0 outbound_.8080_.v11_.demoapp.default.svc.cluster.local default
[2023-06-02T08:37:47.238Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 116 1 1 "10.244.207.100" "-" "dbfd9fd4-91b5-94ef-aba0-ef70af5231a6" "demoapp-shadow:8080" "10.244.207.107:8080" inbound|8080|| 127.0.0.6:52575 10.244.207.107:8080 10.244.207.100:0 outbound_.8080_.v11_.demoapp.default.svc.cluster.local default

七、cluter-loadbalance -适用于集群

 # 默认全局流量策略为 LEAST_CONN 、子集v10 流量策略为 X-User 同一个名称 进行固定绑定端点 

[root@xksmaster1 11-cluster-loadbalancing]# cat destinationrule-demoapp.yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: demoapp
spec:
  host: demoapp
  trafficPolicy:
    loadBalancer:
      simple: LEAST_CONN
  subsets:
  - name: v10
    labels:
      version: v1.0
    trafficPolicy:
      loadBalancer:
        consistentHash:
          httpHeaderName: X-User
  - name: v11
    labels:
      version: v1.1
      
#正常访问 v10
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
/ $ curl demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!

#同一个"X-User: xks" 绑定到 同一个端点
/ $ curl -H "X-User: xks" demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
/ $ curl -H "X-User: xks" demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
/ $ curl -H "X-User: xks" demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
/ $ curl -H "X-User: xks" demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
/ $ curl -H "X-User: xks" demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
/ $ curl -H "X-User: xks" demoapp:8080
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!

 九、连接池

[root@xksmaster1 12-connection-pool]# cat destinationrule-demoapp.yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: demoapp
spec:
  host: demoapp
  trafficPolicy:
    loadBalancer:
      simple: LEAST_CONN
    connectionPool: #
      tcp: #
        maxConnections: 100 
        connectTimeout: 30ms
        tcpKeepalive:
          time: 7200s
          interval: 75s
      http: #
        http2MaxRequests: 1000
        maxRequestsPerConnection: 10
  subsets:
  - name: v10
    labels:
      version: v1.0
    trafficPolicy:
      loadBalancer:
        consistentHash:
          httpHeaderName: X-User
  - name: v11
    labels:
      version: v1.1
[root@xksmaster1 12-connection-pool]# cat virutalservice-demoapp.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: demoapp
spec:
  hosts:
  - demoapp
  http:
  - name: canary
    match:
    - uri:
        prefix: /canary
    rewrite:
      uri: /
    route:
    - destination:
        host: demoapp
        subset: v11
  - name: default
    route:
    - destination:
        host: demoapp
        subset: v10

 十、outlier-detection

#每隔10s 进行检查 连续检查5次 进行弹出1分钟 最大弹出比例 50% 最小健康比例 40%

[root@xksmaster1 13-outlier-detection]# cat destinationrule-demoapp.yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: demoapp
spec:
  host: demoapp
  trafficPolicy:
    loadBalancer:
      simple: RANDOM
    connectionPool:
      tcp:
        maxConnections: 100
        connectTimeout: 30ms
        tcpKeepalive:
          time: 7200s
          interval: 75s
      http:
        http2MaxRequests: 1000
        maxRequestsPerConnection: 10
    outlierDetection:
      maxEjectionPercent: 50
      consecutive5xxErrors: 5
      interval: 10s
      baseEjectionTime: 1m
      minHealthPercent: 40
  subsets:
  - name: v10
    labels:
      version: v1.0
  - name: v11
    labels:
      version: v1.1
      
[root@xksmaster1 13-outlier-detection]# kubectl apply -f destinationrule-demoapp.yaml
destinationrule.networking.istio.io/demoapp configured

#正常发给 v10 
/ $ while true;do curl demoapp:8080; sleep 0.2; done
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-lvtn9, ServerIP: 10.244.182.47!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!


/ $ while true;do curl demoapp:8080/livez; sleep 0.2; done
OKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOK

#人为改为 FAIL状态 随便找一个端点 livez设置为FAIL
[root@xksmaster1 13-outlier-detection]# kubectl get pods -o wide
NAME                                READY   STATUS      RESTARTS          AGE    IP               NODE       NOMINATED NODE   READINESS GATES
backendv36-697647965b-mdprv         2/2     Running     0                 162m   10.244.182.58    xksnode1   <none>           <none>
backendv36-697647965b-zsxph         2/2     Running     0                 162m   10.244.207.114   xksnode2   <none>           <none>
demo-pod                            2/2     Running     65 (36m ago)      78d    10.244.207.104   xksnode2   <none>           <none>
demo-pod-1                          1/1     Running     1 (7h37m ago)     78d    10.244.207.108   xksnode2   <none>           <none>
demoappv10-54757f48d6-lvtn9         2/2     Running     2 (7h37m ago)     26h    10.244.182.47    xksnode1   <none>           <none>
demoappv10-54757f48d6-sbkpb         2/2     Running     2 (7h37m ago)     26h    10.244.207.102   xksnode2   <none>           <none>
demoappv10-54757f48d6-vwr4k         2/2     Running     2 (7h37m ago)     26h    10.244.207.110   xksnode2   <none>           <none>
demoappv11-6b479f5664-9frlg         2/2     Running     2 (7h37m ago)     26h    10.244.207.107   xksnode2   <none>           <none>
demoappv11-6b479f5664-vll6r         2/2     Running     2 (7h37m ago)     26h    10.244.182.48    xksnode1   <none>           <none>
proxy-645cd54b84-xsrx8              2/2     Running     2 (7h37m ago)     26h    10.244.207.100   xksnode2   <none>           <none>
sleep-bc9998558-bl49z               2/2     Running     2 (7h37m ago)     2d3h   10.244.182.50    xksnode1   <none>           <none>
[root@xksmaster1 13-outlier-detection]# curl -X POST -d 'livez=FAIL' 10.244.182.47:8080/livez
[root@xksmaster1 13-outlier-detection]# curl 10.244.182.47:8080/livez
FAIL[root@xksmaster1 13-outlier-detection]#

$ while true;do curl demoapp:8080/livez; sleep 0.2; done
KOKOKOKOKOKOKOKOKOKOKFAILFAILOKOKFAILOKFAILFAILOKOKOKOKFAILFAILFAILFAIL

#由于端点已经挂了 所以端点被去掉了 没有了10.244.182.47 
/ $ while true;do curl demoapp:8080; sleep 0.2; done
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-sbkpb, ServerIP: 10.244.207.102!
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.6, ServerName: demoappv10-54757f48d6-vwr4k, ServerIP: 10.244.207.110!

 

posted @ 2023-06-02 15:19  しみずよしだ  阅读(103)  评论(0)    收藏  举报