sidcar 的使用

sidcar 的使用

Sidecar(边车模式) 是 Kubernetes Pod 内的一个辅助容器,通常用于 日志收集、代理、监控、数据同步等。它和主应用容器共享 Pod 的网络、存储和生命周期,但可以运行不同的进程,从而增强主应用的功能。


1. Sidecar 典型应用场景

场景 用途
日志收集 使用 Sidecar 读取主容器的日志,并发送到 ELK、Loki、Fluentd 等日志管理系统
服务代理 作为 Service Mesh(如 Istio、Envoy)代理流量,实现负载均衡、安全认证等
缓存预热 预取数据,避免主应用因数据请求延迟而卡顿
数据同步 监控主应用的数据变化,并同步到远程存储或数据库
安全认证 在主容器前增加认证流程(如 OAuth 认证)

2. Sidecar 基本示例

假设你有一个 主应用 nginx,需要 一个 Sidecar 容器 来不断向日志文件写入信息。

Pod 配置示例

apiVersion: v1
kind: Pod
metadata:
  name: nginx-with-sidecar
  labels:
    app: nginx
spec:
  containers:
  # 主应用容器(Nginx)
  - name: nginx
    image: nginx
    volumeMounts:
    - name: log-volume
      mountPath: /var/log

  # Sidecar 容器(日志写入模拟)
  - name: log-writer
    image: busybox
    command: ["/bin/sh", "-c"]
    args:
      - while true; do echo "$(date) - Sidecar logging" >> /var/log/app.log; sleep 5; done
    volumeMounts:
    - name: log-volume
      mountPath: /var/log

  volumes:
  - name: log-volume
    emptyDir: {}

解释

  1. nginx 作为主容器,负责处理 HTTP 请求。
  2. log-writer 作为 Sidecar 容器,持续向 /var/log/app.log 写入日志。
  3. 两个容器 共享 emptyDir,因此 nginx 可以访问日志。

3. Sidecar 作为代理

如果你的应用 不能直接访问外部服务,可以使用 Sidecar 作为代理。

示例:Nginx 代理 Sidecar

apiVersion: v1
kind: Pod
metadata:
  name: app-with-proxy
spec:
  containers:
  # 主应用容器(访问 localhost:8080)
  - name: app
    image: busybox
    command: ["/bin/sh", "-c", "while true; do wget -qO- http://localhost:8080; sleep 5; done"]

  # Sidecar 容器(Nginx 作为代理)
  - name: nginx-proxy
    image: nginx
    volumeMounts:
    - name: nginx-config
      mountPath: /etc/nginx/nginx.conf
      subPath: nginx.conf
    ports:
    - containerPort: 8080

  volumes:
  - name: nginx-config
    configMap:
      name: nginx-config

ConfigMap 作为 Nginx 配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    events {}
    http {
      server {
        listen 8080;
        location / {
          proxy_pass http://example.com;
        }
      }
    }

解释

  • app 容器只能访问 localhost:8080,而 nginx-proxy 代理了 http://example.com
  • ConfigMap 提供了 nginx.conf 配置。

4. Sidecar 作为数据同步

如果你希望 自动把日志文件同步到远程存储,可以用 Sidecar。

示例:Fluentd 收集日志并发送到 Elasticsearch

apiVersion: v1
kind: Pod
metadata:
  name: app-with-logging
spec:
  containers:
  # 主应用容器
  - name: app
    image: busybox
    command: ["/bin/sh", "-c", "while true; do echo $(date) >> /var/log/app.log; sleep 5; done"]
    volumeMounts:
    - name: log-volume
      mountPath: /var/log

  # Sidecar 容器(Fluentd 收集日志)
  - name: fluentd
    image: fluent/fluentd
    volumeMounts:
    - name: log-volume
      mountPath: /var/log
  volumes:
  - name: log-volume
    emptyDir: {}

解释

  1. app 容器 每 5 秒生成一条日志
  2. fluentd 作为 Sidecar 实时收集 /var/log/app.log 并发送到 Elasticsearch

5. Sidecar vs. Init Container

对比项 Sidecar 容器 Init 容器
运行时机 与主容器同时运行 在主容器前执行
生命周期 持续运行 运行完即退出
作用 代理、日志收集、数据同步 初始化配置、数据迁移
例子 日志代理、服务发现、负载均衡 数据下载、环境变量配置

示例:使用 Init 容器初始化数据

apiVersion: v1
kind: Pod
metadata:
  name: app-with-init
spec:
  initContainers:
  - name: init-db
    image: busybox
    command: ["sh", "-c", "echo Initializing database > /data/db.txt"]
    volumeMounts:
    - name: data-volume
      mountPath: /data

  containers:
  - name: app
    image: busybox
    command: ["sh", "-c", "cat /data/db.txt && sleep 3600"]
    volumeMounts:
    - name: data-volume
      mountPath: /data

  volumes:
  - name: data-volume
    emptyDir: {}

执行流程

  1. Init 容器 写入 /data/db.txt
  2. Init 容器完成后,主容器启动 并读取 /data/db.txt

6. Sidecar 运行失败的常见原因

问题 解决方案
Sidecar 容器崩溃 查看 kubectl logs <pod> -c <sidecar-container>
Sidecar 没有日志 检查 volumeMounts 是否正确挂载
主容器访问不到 Sidecar 确保 Sidecar 在 localhost 监听端口
Sidecar 没有网络访问 使用 kubectl exec -it <pod> -c <sidecar> -- sh 测试连接
Sidecar 退出后 Pod 仍然运行 确保 restartPolicy: Always

总结

  1. Sidecar 适用于日志收集、代理、数据同步等辅助功能,主容器和 Sidecar 容器 共享存储、网络
  2. 多个 Sidecar 组合 可以增强应用能力,例如 Fluentd + Nginx + Redis 预缓存。
  3. 与 Init 容器不同,Sidecar 需要与主容器持续运行
  4. 常见问题包括日志未挂载、端口未监听、容器崩溃等

Sidecar 使用sky的agent

在 Kubernetes 中使用 Sidecar 运行 SkyWalking Agent 主要用于 自动收集应用的链路追踪数据,并发送到 Apache SkyWalking OAP(Observability Analysis Platform) 进行分析和可视化。


1. SkyWalking Sidecar 作用

SkyWalking 通过 Sidecar 方式运行 探针代理(Agent),可以:

  • 无侵入方式 监控 Java、Go、Node.js、Python 等应用。
  • 拦截 HTTP/gRPC 请求,自动生成链路追踪数据。
  • 发送数据到 SkyWalking OAP 服务器 进行存储和分析。

2. 方案

方式 1(推荐):使用 Init 容器下载 SkyWalking Agent 并挂载

  • 避免修改应用镜像
  • 支持 Java、Node.js、Python 等多种语言

方式 2:直接在 Sidecar 运行 SkyWalking Agent

  • 适用于非 Java 应用(如 Go、Node.js)
  • 需要手动配置 SkyWalking 代理环境变量

3. 方式 1:使用 Init 容器下载 SkyWalking Agent

这种方式适用于 Java 应用,因为 Java Agent 只需要设置 JAVA_TOOL_OPTIONS 即可加载。

Pod 配置

apiVersion: v1
kind: Pod
metadata:
  name: app-with-skywalking
  labels:
    app: my-app
spec:
  initContainers:
  - name: init-skywalking-agent
    image: busybox
    command: ["/bin/sh", "-c"]
    args:
      - wget -qO /skywalking/agent.tar.gz https://archive.apache.org/dist/skywalking/9.2.0/apache-skywalking-java-agent-9.2.0.tgz &&
        tar -zxvf /skywalking/agent.tar.gz -C /skywalking/ &&
        rm /skywalking/agent.tar.gz
    volumeMounts:
    - name: sky-agent
      mountPath: /skywalking

  containers:
  - name: my-app
    image: my-app:latest
    env:
    - name: JAVA_TOOL_OPTIONS
      value: "-javaagent:/skywalking/apache-skywalking-java-agent-9.2.0/skywalking-agent.jar"
    - name: SW_AGENT_NAME
      value: "my-app"
    - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
      value: "skywalking-oap:11800"
    volumeMounts:
    - name: sky-agent
      mountPath: /skywalking

  volumes:
  - name: sky-agent
    emptyDir: {}

解释

  1. Init 容器 (init-skywalking-agent)
    • 通过 wget 下载 SkyWalking Java Agent 并解压到 /skywalking/
    • 使用 emptyDir 共享 sky-agent 目录,供主应用容器使用。
  2. 主应用容器 (my-app)
    • 挂载 /skywalking 目录,加载 SkyWalking Java Agent。
    • 设置 JAVA_TOOL_OPTIONS 启用 SkyWalking 追踪
    • SW_AGENT_COLLECTOR_BACKEND_SERVICES 指向 SkyWalking OAP 服务器

4. 方式 2:直接在 Sidecar 容器运行 SkyWalking Agent

这种方式适用于 非 Java 应用(如 Go、Node.js、Python),需要 在 Sidecar 容器运行 SkyWalking 代理

Pod 配置

apiVersion: v1
kind: Pod
metadata:
  name: app-with-skywalking-sidecar
  labels:
    app: my-app
spec:
  containers:
  - name: my-app
    image: my-app:latest
    ports:
    - containerPort: 8080
    env:
    - name: SW_AGENT_NAME
      value: "my-app"
    - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
      value: "skywalking-oap:11800"

  - name: skywalking-sidecar
    image: apache/skywalking-agent
    env:
    - name: SW_AGENT_NAME
      value: "my-app"
    - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
      value: "skywalking-oap:11800"
    - name: SW_AGENT_INSTANCE_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    ports:
    - containerPort: 11800

解释

  1. 主应用容器
    • 运行 my-app,并配置 SkyWalking 代理环境变量。
  2. Sidecar 容器
    • 运行 apache/skywalking-agent 代理,监听 11800 端口并向 OAP 发送数据。

5. 配置 SkyWalking OAP 和 UI

SkyWalking 需要 OAP(后端)和 UI(前端) 进行数据存储和可视化分析。

部署 SkyWalking OAP + UI

apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalking
  template:
    metadata:
      labels:
        app: skywalking
    spec:
      containers:
      - name: skywalking-oap
        image: apache/skywalking-oap-server:9.2.0
        env:
        - name: SW_STORAGE
          value: "elasticsearch"
        - name: SW_STORAGE_ES_CLUSTER_NODES
          value: "elasticsearch:9200"
        ports:
        - containerPort: 11800
        - containerPort: 12800

      - name: skywalking-ui
        image: apache/skywalking-ui:9.2.0
        ports:
        - containerPort: 8080

暴露 SkyWalking UI

apiVersion: v1
kind: Service
metadata:
  name: skywalking-ui
spec:
  type: NodePort
  selector:
    app: skywalking
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30080

访问 SkyWalking

如果集群使用 NodePort,你可以通过:

http://<NodeIP>:30080

访问 SkyWalking UI。


6. 适用语言

语言 SkyWalking 代理模式
Java -javaagent:/skywalking/skywalking-agent.jar
Go skywalking-sidecarsw-go-agent
Node.js skywalking-node-agent
Python skywalking-python-agent

7. 排错指南

问题 解决方案
没有追踪数据 确保 SW_AGENT_COLLECTOR_BACKEND_SERVICES 指向 OAP
OAP 端口拒绝连接 确保 OAP 正常运行,监听 11800 端口
Java 应用未加载 Agent 检查 JAVA_TOOL_OPTIONS 是否正确
SkyWalking UI 访问失败 检查 kubectl get svc skywalking-ui 确保 UI 暴露

总结

  1. Java 应用推荐使用 Init 容器方式,下载 skywalking-agent.jar 并挂载。
  2. Go、Node.js、Python 应用推荐使用 Sidecar 运行 SkyWalking 代理
  3. OAP 服务器需要正确配置存储(如 Elasticsearch),并开放 11800 端口接收数据。
  4. SkyWalking UI 需要暴露服务,通常用 NodePortIngress
posted @ 2025-03-10 20:22  蒲公英PGY  阅读(169)  评论(0)    收藏  举报