目 录CONTENT

文章目录

istio应用--sidecar注入实现金丝雀发布

JamKing
2026-01-04 / 0 评论 / 0 点赞 / 6 阅读 / 0 字 / 正在检测是否收录...

1、前言

1.2 Sidecar 代理

**Sidecar 是什么?**Sidecar(边车模式)是 Istio 数据平面 的核心。在 Istio 中,Sidecar 通常指一个高性能的代理程序——Envoy

当你部署一个应用到 Istio 网格中时,Istio 会在每个应用的 Pod 里注入一个 Envoy 代理容器。这个 Envoy 容器就和你的应用容器在同一个 Pod 里,像“边车”一样伴随它运行。

**为什么它是绝对必须的?**没有 Sidecar,就没有服务网格。Istio 的所有强大功能都依赖于这个 Sidecar 代理来实现。它的核心作用包括:

  1. 流量劫持与路由
    • Sidecar 会拦截进出 Pod 的所有网络流量
    • 它根据 Istio 控制平面 下发的规则(如 VirtualService, DestinationRule)来智能地路由这些流量。比如,把请求转发到服务的不同版本、执行超时、重试等。
  2. 服务发现与负载均衡
    • 你的应用代码不再需要知道其他服务的具体 IP 地址。它只需要访问服务名(如 http://reviews),流量会被 Sidecar 拦截。
    • Sidecar 会从控制平面获取服务列表,并执行健康检查和客户端负载均衡。
  3. 安全
    • 自动处理服务间的 mTLS 加密通信。你的应用代码完全无感知,但所有流量都是加密的。
    • 实施基于身份的访问控制策略。
  4. 可观测性
    • Sidecar 会自动收集所有流量的详细指标(Metrics)、分布式追踪和访问日志。
    • 这些数据被发送到后端监控系统(如 Prometheus、Jaeger、Grafana),让你能清晰地看到整个服务拓扑和调用情况。

2、sidecar注入

假如还没有命名空间,先创建一个示例test命名空间

kubectl create ns test

2.1 自动注入

2.1.1 标签

istio-injection=enabled,这个标签就是告诉 istio:“请自动为这个 Namespace 里所有新创建的 Pod 注入 Sidecar”

kubectl label namespace test istio-injection=enabled

image-ojqF.png

2.1.2 创建deployment

cat <<EOF |kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dev-demo-canary
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dev-demo-canary
  template:
    metadata:
      labels:
        app: dev-demo-canary
    spec:
      containers:
        - name: dev-demo-canary
          image: harbor.test.com/java-dev/demo:Canary
      restartPolicy: Always
      dnsPolicy: ClusterFirst
---
apiVersion: v1
kind: Service
metadata:
  name: dev-demo-canary
  namespace: test
spec:
  selector:
    app: dev-demo-canary
  ports:
    - name: dev-demo-canary-8080
      protocol: TCP
      port: 8080
      targetPort: 8080
EOF

如下图,sidecar已经成功注入到创建的容器里,也就是demo+istio

image-grYG.png

image-Hjox.png

2.2 手动注入

假如还没有命名空间,先创建一个示例test-noauto命名空间

kubectl create ns test-noauto

2.2.1 deployment

cat > demo-canary.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dev-demo-canary
  namespace: test-noauto
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dev-demo-canary
  template:
    metadata:
      labels:
        app: dev-demo-canary
    spec:
      containers:
        - name: dev-demo-canary
          image: harbor.test.com/java-dev/demo:Canary
      restartPolicy: Always
      dnsPolicy: ClusterFirst
---
apiVersion: v1
kind: Service
metadata:
  name: dev-demo-canary
  namespace: test-noauto
spec:
  selector:
    app: dev-demo-canary
  ports:
    - name: dev-demo-canary-8080
      protocol: TCP
      port: 8080
      targetPort: 8080
EOF

2.2.2 开启手动注入

istioctl kube-inject -f demo-canary.yaml | kubectl apply -f -

image-xBKF.png

image-zXCX.png

3、sidecar实现流量比例控制

主要依赖两个核心的 Istio API 资源:

  1. DestinationRule定义“目的地”。它为服务创建“子集”,通常是根据版本标签(如 version: v1, version: v2)来区分。
  2. VirtualService定义“路由规则”。它告诉 Envoy Sidecar,当收到一个请求时,应该根据什么规则,将流量按权重发送到 DestinationRule 定义的哪个子集。

假设有两个deployment,dev-demo-canary和dev-demo-prod,流量由1:9至3:7至5:5至7:3至9:1至10:0

3.1 canary和prod的部署配置

此处和第2章节的sidecar注入有区别,前面是单独的注入演示,以下是宽泛注入,配合sidecar轮询调度配置的。

3.1.1 canary

cat > dev-istio-canary.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dev-demo-canary
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dev-demo
      version: canary
  template:
    metadata:
      labels:
        app: dev-demo           #通用服务标签
        version: canary         #流量控制的关键版本标签
    spec:
      containers:
        - name: dev-demo-canary
          image: harbor.test.com/java-dev/demo:Canary
          volumeMounts: []
      volumes: []
      restartPolicy: Always
      dnsPolicy: ClusterFirst
EOF

3.1.2 prod

cat > dev-istio-prod.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dev-demo-prod
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dev-demo
      version: prod
  template:
    metadata:
      labels:
        app: dev-demo         #通用服务标签
        version: prod         #流量控制的关键版本标签
    spec:
      containers:
        - name: dev-demo-prod
          image: harbor.test.com/java-dev/demo:Prod
          volumeMounts: []
      volumes: []
      restartPolicy: Always
      dnsPolicy: ClusterFirst
EOF

3.1.3 公共service

cat istio-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: dev-demo-all
  namespace: test
spec:
  selector:
    app: dev-demo             #通用标签,不能加入相关version
  ports:
    - name: dev-demo-all-8080
      protocol: TCP
      port: 8080
      targetPort: 8080

由此可见,通过svc访问,已经可以简单实现负载均衡canary和prod,但是流量比例还需要继续配置

image-MZVF.png

3.2 DestinationRule目的地规则

cat > destination-rule.yaml << EOF
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: dev-demo
spec:
  host: dev-demo-all
  subsets:
  - name: canary
    labels:
      version: canary #从Service选中的Pod中,再筛选出version=canary的
  - name: prod
    labels:
      version: prod # 从Service选中的Pod中,再筛选出 version=prod的
EOF

3.3 Gateway

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: istio-gateway
spec:
  selector:
    istio: ingressgateway   #使用Istio默认的入口网关
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - istio.test.com        #Gateway监听的域名

3.4 VirtualService

cat > virtual-service.yaml << EOF
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: dev-demo
  namespace: test
spec:
  hosts:
  - istio.test.com       #指定这个路由规则适用于对服务的域名请求
  gateways:
  - istio-gateway        #绑定到上面的 Gateway
  http:
  - match:
    - uri:
        prefix: "/"      #匹配所有以/开头的请求(可选,这里为了演示)
    route:
    - destination:
        host: dev-demo-all
        subset: canary   #目标是DestinationRule中定义的canary子集
        port:
          number: 8080
      weight: 10         #权重为10%
    - destination:
        host: dev-demo-all
        subset: prod     #目标是DestinationRule中定义的prod子集
        port:
          number: 8080
      weight: 90         #权重为90%
 EOF

3.5 流控访问

canary:prod比例1:9

image-rZkL.png

4、金丝雀发布

原理和ingres的金丝雀的发布类似,通过流量控制进行稳定发布

参考ingress金丝雀发布:金丝雀发布

上面展示了canary:prod比例1:9,接着3:7

只需要同步调整以下配置:

- destination:
        host: dev-demo-all
        subset: canary
        port:
          number: 8080
      weight: 10         #权重为10-->30-->50-->70-->90-->100
    - destination:
        host: dev-demo-all
        subset: prod   
        port:
          number: 8080
      weight: 90         #权重为90-->70-->50-->30-->10-->0

image-xGTw.png

5:5

image-LGZJ.png

7:3

image-PgWZ.png

9:1

image-QAcr.png

100%

image-grWb.png

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区