K8s 中Istio 的使用示例

要将你自己的进程接入 Istio 并从 Istio 中获取网络包,主要依赖于 Istio 的Sidecar 注入Envoy Proxy 实现的流量代理机制。以下是详细的流程和实现思路:


1. Istio Sidecar 注入原理

  • Istio 通过将 Envoy 作为一个 Sidecar 容器 注入到你的 Pod 中,使所有网络流量都经过 Envoy 代理。
  • Envoy 负责拦截和转发来自 Pod 内部的 入站流量出站流量
  • 你自己的进程并不直接与 Istio 本身交互,而是通过与 Envoy 交互来间接实现网络控制和流量管理。

2. Sidecar 注入方式

你需要让 Istio 将 Envoy 代理注入到你的 Pod 中,有两种方式:

  • 自动注入 :确保你的命名空间中启用了 istio-injection

    kubectl label namespace <your-namespace> istio-injection=enabled

  • 在此命名空间中部署的 Pod 会自动注入 Sidecar。

  • 手动注入 :使用 istioctl kube-inject 工具在你的 Pod 配置文件中注入 Envoy 代理。

    istioctl kube-inject -f your-deployment.yaml | kubectl apply -f -


3. 如何接收网络包?

Istio 会将网络流量定向到 Envoy Proxy,而你的进程如何获取网络包取决于你的具体需求:

A. 与 Envoy 通信:实现代理层的请求解析
  1. 监听流量
    • 你的进程可以监听一个端口(例如 localhost:PORT),Envoy 会将经过代理的流量转发到你的进程。
    • 在 Envoy 配置中,通过 ListenerRoute 将特定的流量重定向到你指定的端口。
  2. 应用层解析
    • 如果是 HTTP/TCP 流量,你可以从监听端口上读取请求数据包,然后进行解析和处理。
    • 例如:Envoy 配置 ServiceEntryVirtualService,让请求流量转发到你的进程。
B. 直接监听 Pod 网卡流量(高级用法)

如果你需要获取 原始网络包,可以使用更底层的方法:

  • 使用工具如 eBPF (Extended Berkeley Packet Filter) 或 tcpdump 监听 Pod 的网络接口。
  • eBPF 可以附加到 Pod 内的网络接口,用于捕获经过 Pod 的网络包,适合对网络流量进行深度分析。
  • 注意:这种方式较为底层,并不依赖 Envoy,而是直接抓取 Pod 网络层的数据。

示例:在 Pod 内部运行 tcpdump

复制代码
tcpdump -i eth0 -nn
C. 通过 Envoy 统计和访问日志

Envoy 还支持输出丰富的 网络统计信息访问日志

  • 访问日志:通过配置 Envoy 的日志,可以将网络流量的请求信息输出到文件或标准输出。
  • Metrics 指标 :Envoy 集成了 Prometheus,可以获取流量的实时统计数据。
  • 你的进程可以读取这些日志或指标,从而间接获取网络流量的相关信息。

4. 实际部署示例

假设你有一个自定义服务 my-proxy,部署在 Kubernetes 中,你的进程监听 127.0.0.1:8000

步骤:

  1. 启用 Istio 自动注入

    kubectl label namespace default istio-injection=enabled

  2. 创建服务和 Deployment

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: my-proxy
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: my-proxy
    template:
    metadata:
    labels:
    app: my-proxy
    spec:
    containers:
    - name: my-proxy
    image: my-proxy-image:latest
    ports:
    - containerPort: 8000

    apiVersion: v1
    kind: Service
    metadata:
    name: my-proxy
    spec:
    selector:
    app: my-proxy
    ports:
    - port: 80
    targetPort: 8000

配置 Istio 流量转发

  • 使用 VirtualService 将外部流量导向你的服务 my-proxy

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
    name: my-proxy
    spec:
    hosts:
    - "my-proxy.local"
    http:
    - route:
    - destination:
    host: my-proxy
    port:
    number: 80

  1. 读取流量

    • Envoy 将流量转发到你的服务监听的端口(例如 8000),你的进程可以直接处理请求数据包。

5. 注意事项

  • 流量捕获机制 :Istio 使用 iptables 规则劫持流量并转发到 Envoy Proxy,所以你需要与 Envoy 交互而不是直接监听原始网络包。
  • 性能开销:Sidecar 容器会引入一定的网络延迟,如果你的进程对性能要求极高,可以考虑轻量级的代理实现。
  • 安全性:确保你的进程能够正确处理 Istio 注入的流量,同时兼容 TLS 加密流量。

总结

  • 你的进程主要通过 Envoy Proxy 接收流量。Envoy 拦截 Pod 的入站和出站流量,并将其转发到你指定的端口。
  • 如果需要原始网络包,可以通过 eBPFtcpdump 直接监听 Pod 的网络接口。
  • 结合 VirtualServiceServiceEntry,可以控制 Envoy 如何路由流量到你的进程。
  • Istio 的日志和指标输出也可以提供网络流量的详细信息,供你的进程分析。

根据需求选择合适的接入方式,可以有效实现网络包的获取与处理。

相关推荐
MickeyCV3 小时前
使用Docker部署MySQL&Redis容器与常见命令
redis·mysql·docker·容器·wsl·镜像
藥瓿亭4 小时前
K8S认证|CKS题库+答案| 6. 创建 Secret
运维·ubuntu·docker·云原生·容器·kubernetes·cks
2302_809798325 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
嵌入式大圣5 小时前
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
运维·docker·容器
孔令飞5 小时前
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
ai·云原生·容器·golang·kubernetes
极简网络科技7 小时前
Docker、Wsl 打包迁移环境
运维·docker·容器
江湖有缘7 小时前
【Docker管理工具】部署Docker可视化管理面板Dpanel
运维·docker·容器
猫咪老师19958 小时前
多系统一键打包docker compose下所有镜像并且使用
java·docker·容器
Nazi69 小时前
docker数据管理
运维·docker·容器
孔令飞11 小时前
Go 为何天生适合云原生?
ai·云原生·容器·golang·kubernetes