灵活控制流量免于经过Sidecar代理
所有文档
menu

服务网格 CSM

灵活控制流量免于经过Sidecar代理

产品详情

功能介绍

Sidecar 代理主要用于管理服务间流量、网络安全性、可观测性。默认情况下,Sidecar 代理会全部拦截进出 Pod 的流量。然而,在一些特定场景下,有需求灵活设置 Pod 中某些端口进出流量是否经过 Sidecar 代理。

本文将以配置所有端口的入站流量不经过 Sidecar 代理(sidecar-include-inbound-ports=""),而 80 端口的出站流量经过 Sidecar 代理(sidecar-include-outbound-ports="80")为例,展示如何实现特定的入站流量免于经过 Sidecar 代理,特定的出站流量经过 Sidecar 代理。

流程图-202409261415.png

注解说明

下述注解作用在命名空间级别,注解说明如下:

  • sidecar-exclude-inbound-ports:在命名空间级别上配置端口 使配置的端口入口流量不经过 Sidecar 代理,其他端口入口流量将继续通过 Sidecar 代理处理。若为多个端口,可以设置为一个以逗号分隔的端口列表,如:sidecar-exclude-inbound-ports: "9999"
  • sidecar-include-outbound-ports:在命名空间级别上配置端口使 配置的特定出口流量经过 Sidecar 代理,其他出口流量不经过 Sidecar 代理。若为多个端口,可以设置为一个以逗号分隔的端口列表,如:sidecar-include-outbound-ports: "80,8099"
  • sidecar-include-inbound-ports:在命名空间级别上配置端口使 配置的特定入口流量经过 Sidecar 代理,其他出口流量不经过 Sidecar 代理。若为多个端口,可以设置为一个以逗号分隔的端口列表,如:sidecar-include-inbound-ports: "80,8099"

    • 如果想让所有的端口入口流量都不经过 Sidecar,可以设置为 sidecar-include-inbound-ports="",这样所有的流量都会绕过 Sidecar 代理。

注意:因为上述配置为命名空间级别,请谨慎配置。

如果流量链路上涉及的上下游应用开启了 Sidecar 注入,不能配置 Client 某端口出口流量经过 Sidecar 代理,而 Server 端入口流量不经过 Sidecar 代理,该场景会出现 TLS 报错。 举个例子:如设置 Client 端 sidecar-include-outbound-ports="80" ,设置了 Server 端 sidecar-include-inbound-ports="",请求会报错查看日志显示 TLS error: 268435703:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER

前提条件

  • 已创建CSM网格实例。具体操作,请参见CSM实例管理
  • 已添加CCE集群到CSM实例。
  • 已开启目标命名空间 sidecar 自动注入。

操作步骤

添加命名空间级别注解

为目标命名空间添加以下注解,以配置所有端口的入站流量不经过 Sidecar 代理,同时确保 80 端口的出站流量经过 Sidecar 代理:

kubectl annotate ns default sidecar-include-inbound-ports=""
kubectl annotate ns default sidecar-include-outbound-ports="80"

注意⚠️ 如果命名空间下已有 Pod,需要重启这些 Pod 以使配置生效。此配置在命名空间级别全局生效,配置错误将导致该命名空间下所有 Pod 在新建或重启时出现异常。

部署应用

  1. 通过 CSM > 集群管理 跳转到 CCE 集群,进行应用部署。

image1.png

  1. 点击 “工作负载 > 无状态部署 > 使用YAML部署”,部署测试应用。

测试Yaml文件如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-a
  labels:
    app: pod-a
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pod-a
  template:
    metadata:
      labels:
        app: pod-a
      annotations:
        sidecar.istio.io/inject: "false"
    spec:
      containers:
      - name: pod-a
        image: registry.baidubce.com/csm-offline/helloworld:v1
        resources:
          requests:
            cpu: "100m"
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 5000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-b
  labels:
    app: pod-b
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pod-b
  template:
    metadata:
      labels:
        app: pod-b
    spec:
      restartPolicy: Always
      containers:
        - name: pod-b
          image: registry.baidubce.com/csm-offline/bms-orignal-consumer:dev
          imagePullPolicy: Always
          ports:
            - containerPort: 9999
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-c
  labels:
    app: pod-c
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pod-c
  template:
    metadata:
      labels:
        app: pod-c
      annotations:
        sidecar.istio.io/inject: "false"
    spec:
      restartPolicy: Always
      containers:
        - name: pod-c
          image: registry.baidubce.com/csm-offline/bms-orignal-provider:dev
          imagePullPolicy: Always
          ports:
            - containerPort: 10001

工作负载如下所示:

image2.png

  1. 点击 “流量接入 > 服务 > 使用YAML部署”,部署测试应用的服务。

测试Yaml文件如下所示:

apiVersion: v1
kind: Service
metadata:
  name: service-a
  labels:
    app: pod-a
spec:
  ports:
  - port: 5000
    name: http
  selector:
    app: pod-a
---
apiVersion: v1
kind: Service
metadata:
  name: service-b
  annotations:
    prometheus.io/scrape: "true"
spec:
  selector:
    app: pod-b
  type: ClusterIP
  sessionAffinity: None
  ports:
  - protocol: TCP
    port: 9999
    targetPort: 9999
    name: http-port
---
apiVersion: v1
kind: Service
metadata:
  name: provider-demo
  annotations:
    prometheus.io/scrape: "true"
spec:
  selector:
    app: pod-c
  type: ClusterIP
  sessionAffinity: None
  ports:
  - protocol: TCP
    port: 80
    targetPort: 10001
    name: http-port

服务 service 如下所示:

image3.png

流量验证

进入 pod-b pod 中 istio-proxy 容器,执行下述命令开启 pod-b 容器的 Sidecar debug 日志:

curl -s -X POST 127.1:15000/logging\?level\=debug

进入 pod-a 容器中执行以下命令,并查看 pod-b 的 Sidecar debug 日志。

curl http://<pod-b-podIP>:9999/echo-rest/hello && echo

预期输出

流量应正常通过,且 Sidecar 日志中仅记录 80 端口的出站流量,而没有入站端口的流量。

image4.png image.png

请注意,当 Pod 单独设置了注解 traffic.sidecar.istio.io/excludeInboundPorts、traffic.sidecar.istio.io/includeInboundPorts 或 traffic.sidecar.istio.io/includeOutboundPorts,且这些注解值与命名空间的注解值不一致时,Pod 的注解将优先于命名空间的注解。

上一篇
可观测管理
下一篇
使用 Wasm Filter 扩展数据面