1、前言
1.2 Sidecar 代理
**Sidecar 是什么?**Sidecar(边车模式)是 Istio 数据平面 的核心。在 Istio 中,Sidecar 通常指一个高性能的代理程序——Envoy。
当你部署一个应用到 Istio 网格中时,Istio 会在每个应用的 Pod 里注入一个 Envoy 代理容器。这个 Envoy 容器就和你的应用容器在同一个 Pod 里,像“边车”一样伴随它运行。
**为什么它是绝对必须的?**没有 Sidecar,就没有服务网格。Istio 的所有强大功能都依赖于这个 Sidecar 代理来实现。它的核心作用包括:
- 流量劫持与路由:
- Sidecar 会拦截进出 Pod 的所有网络流量。
- 它根据 Istio 控制平面 下发的规则(如
VirtualService,DestinationRule)来智能地路由这些流量。比如,把请求转发到服务的不同版本、执行超时、重试等。- 服务发现与负载均衡:
- 你的应用代码不再需要知道其他服务的具体 IP 地址。它只需要访问服务名(如
http://reviews),流量会被 Sidecar 拦截。- Sidecar 会从控制平面获取服务列表,并执行健康检查和客户端负载均衡。
- 安全:
- 自动处理服务间的 mTLS 加密通信。你的应用代码完全无感知,但所有流量都是加密的。
- 实施基于身份的访问控制策略。
- 可观测性:
- 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

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


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 -


3、sidecar实现流量比例控制
主要依赖两个核心的 Istio API 资源:
DestinationRule:定义“目的地”。它为服务创建“子集”,通常是根据版本标签(如version: v1,version: v2)来区分。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,但是流量比例还需要继续配置

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

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

5:5

7:3

9:1

100%

评论区