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 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 配置中,通过 Listener 和 Route 将特定的流量重定向到你指定的端口。
  2. 应用层解析 :
    • 如果是 HTTP/TCP 流量,你可以从监听端口上读取请求数据包,然后进行解析和处理。
    • 例如:Envoy 配置 ServiceEntry 或 VirtualService,让请求流量转发到你的进程。
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 的入站和出站流量,并将其转发到你指定的端口。
  • 如果需要原始网络包,可以通过 eBPF 或 tcpdump 直接监听 Pod 的网络接口。
  • 结合 VirtualService 和 ServiceEntry,可以控制 Envoy 如何路由流量到你的进程。
  • Istio 的日志和指标输出也可以提供网络流量的详细信息,供你的进程分析。

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

相关推荐
是枚小菜鸡儿吖6 小时前
Home Assistant跨品牌智能家居教程:Docker部署、米家接入、vivo桥接与远程访问
docker·容器·智能家居
螺蛳粉 螺蛳粉9 小时前
第 02 篇:镜像分层与 containerd 2.x 实战:SystemdCgroup 与 pause 镜像配置踩坑(底座认知 02)
docker·云原生·容器·kubernetes·etcd·containerd·kube-apiserver
wefg19 小时前
【Docker】镜像相关指令
运维·docker·容器
java_logo10 小时前
Docker 部署 DPanel:轻松搭建轻量容器管理平台
运维·docker·容器·podman·容器管理·dpanel·轩辕镜像
n1121211 小时前
Docker 容器时区错 8 小时:3 个坑
运维·docker·容器·故障排查·服务器运维·容器时区
小白的码BUG之路12 小时前
K8s -- 搭建过程中经常遇到的问题
云原生·容器·kubernetes
慈云数据12 小时前
用 DSH 辅助部署一个网站监控平台:Uptime Kuma + Docker 实战
运维·docker·容器
螺蛳粉 螺蛳粉12 小时前
第 03 篇:为什么 K8s 的最小调度单元是 Pod 而不是容器:pause 容器与边车模式(底座认知 03)
docker·云原生·容器·kubernetes·etcd·运维排障·kube-apiserver
艾伦_耶格宇13 小时前
【kubernetes - 1.28版本】-9 K8S-dashbord可视化界面
云原生·容器·kubernetes
无人生还别怕1 天前
如何搭建k8s服务(containerd部署)
linux·云原生·容器·kubernetes·openanolisos