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: {}
解释
nginx
作为主容器,负责处理 HTTP 请求。log-writer
作为 Sidecar 容器,持续向/var/log/app.log
写入日志。- 两个容器 共享
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: {}
解释
app
容器 每 5 秒生成一条日志。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: {}
执行流程
- Init 容器 写入
/data/db.txt
。 - 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 |
总结
- Sidecar 适用于日志收集、代理、数据同步等辅助功能,主容器和 Sidecar 容器 共享存储、网络。
- 多个 Sidecar 组合 可以增强应用能力,例如
Fluentd
+Nginx
+Redis
预缓存。 - 与 Init 容器不同,Sidecar 需要与主容器持续运行。
- 常见问题包括日志未挂载、端口未监听、容器崩溃等。
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: {}
解释
- Init 容器 (
init-skywalking-agent
)- 通过
wget
下载 SkyWalking Java Agent 并解压到/skywalking/
。 - 使用
emptyDir
共享sky-agent
目录,供主应用容器使用。
- 通过
- 主应用容器 (
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
解释
- 主应用容器
- 运行
my-app
,并配置 SkyWalking 代理环境变量。
- 运行
- 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-sidecar 或 sw-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 暴露 |
总结
- Java 应用推荐使用 Init 容器方式,下载
skywalking-agent.jar
并挂载。 - Go、Node.js、Python 应用推荐使用 Sidecar 运行 SkyWalking 代理。
- OAP 服务器需要正确配置存储(如 Elasticsearch),并开放
11800
端口接收数据。 - SkyWalking UI 需要暴露服务,通常用
NodePort
或Ingress
。