minio/sidekicksidekick 是一款高性能边车(sidecar)负载均衡器。通过将轻量级负载均衡器作为边车附加到每个客户端应用进程,可消除集中式负载均衡器瓶颈和DNS故障转移管理。sidekick 通过就绪API和HTTP错误返回检查服务器健康状态,自动避免将流量发送到故障服务器。
!architecture
演示 !sidekick-demo
/minio/health/ready)和HTTP错误返回识别故障服务器拉取最新版本镜像:
bashdocker pull minio/sidekick
USAGE: sidekick [FLAGS] SITE1 [SITE2..] FLAGS: --address value, -a value 监听地址 (默认: ":8080") --health-path value, -p value 健康检查路径 --health-duration value, -d value 健康检查间隔(秒) (默认: 5) --insecure, -i 禁用TLS证书验证 --log , -l 启用日志 --trace, -t 启用HTTP追踪 --quiet 禁用控制台消息 --json 以JSON格式输出日志和追踪 --debug 输出详细追踪日志 --help, -h 显示帮助信息 --version, -v 打印版本信息 SITE: 每个SITE是用逗号分隔的同一站点的服务器组,例如:[***]{2...5},[***]{6...9} 当SITE1中所有服务器均故障时,流量将路由到下一个站点(如SITE2)。多个站点之间用空格分隔。
bashsidekick --health-path=/ready [***]
bashsidekick --health-path=/minio/health/ready --address :8000 [***]{1...4}:9000
bashsidekick --health-path=/minio/health/ready [***]{1...4}:9000 [***]{1...4}:9000
在Kubernetes环境中,将sidekick作为Spark Driver和Executor的边车容器,为MinIO分布式集群提供本地负载均衡。
bash# 创建命名空间(可选) kubectl create ns spark-operator # 添加Helm仓库并安装Spark Operator helm repo add incubator [***] helm install spark-operator incubator/sparkoperator --namespace spark-operator --set sparkJobNamespace=spark-operator --set enableWebhook=true
bashhelm install minio-distributed stable/minio --namespace spark-operator \ --set accessKey=minio,secretKey=minio123 \ --set persistence.enabled=false,mode=distributed
注意:测试环境中禁用了持久化,生产环境需使用PV启用持久化存储。详细配置参见MinIO Helm文档。
创建Spark作业配置文件spark-job.yaml:
yamlapiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-minio-app namespace: spark-operator spec: sparkConf: spark.kubernetes.allocation.batch.size: "50" hadoopConf: "fs.s3a.endpoint": "[***]" "fs.s3a.access.key": "minio" "fs.s3a.secret.key": "minio123" "fs.s3a.path.style.access": "true" "fs.s3a.impl": "org.apache.hadoop.fs.s3a.S3AFileSystem" type: Scala sparkVersion: 2.4.5 mode: cluster image: minio/spark:v2.4.5-hadoop-3.1 imagePullPolicy: Always restartPolicy: type: OnFailure onFailureRetries: 3 onFailureRetryInterval: 10 onSubmissionFailureRetries: 5 onSubmissionFailureRetryInterval: 20 mainClass: org.apache.spark.examples.JavaWordCount mainApplicationFile: "local:///opt/spark/examples/target/original-spark-examples_2.11-2.4.6-SNAPSHOT.jar" arguments: - "s3a://mytestbucket/mydata" driver: cores: 1 coreLimit: "1000m" memory: "512m" labels: version: 2.4.5 sidecars: - name: minio-lb image: "minio/sidekick:v0.5.8" imagePullPolicy: Always args: ["--health-path", "/minio/health/ready", "--address", ":9000", "[***]{0...3}.minio-distributed-svc.spark-operator.svc.cluster.local:9000"] ports: - containerPort: 9000 executor: cores: 1 instances: 4 memory: "512m" labels: version: 2.4.5 sidecars: - name: minio-lb image: "minio/sidekick:v0.5.8" imagePullPolicy: Always args: ["--health-path", "/minio/health/ready", "--address", ":9000", "[***]{0...3}.minio-distributed-svc.spark-operator.svc.cluster.local:9000"] ports: - containerPort: 9000
提交作业并查看日志:
bashkubectl create -f spark-job.yaml kubectl logs -f --namespace spark-operator spark-minio-app-driver spark-kubernetes-driver
sidekick支持配置S3兼容对象存储作为共享缓存,提升热点数据访问性能。缓存通过环境变量配置,适用于需要共享缓存的分布式应用场景。
| 环境变量 | 描述 | 示例值 |
|---|---|---|
| SIDEKICK_CACHE_ENDPOINT | S3兼容对象存储端点 | [] 或 [] |
| SIDEKICK_CACHE_ACCESS_KEY | 访问密钥 | minio |
| SIDEKICK_CACHE_SECRET_KEY | 密钥 | minio123 |
| SIDEKICK_CACHE_BUCKET | 缓存存储桶名称 | cache01 |
| SIDEKICK_CACHE_MIN_SIZE | 缓存最小对象大小 | 32MiB(支持单位:B, KiB, MiB, GiB等) |
| SIDEKICK_CACHE_HEALTH_DURATION | 缓存健康检查间隔(秒) | 20 |
yaml# 部分配置(完整配置参考上文Spark作业示例,仅展示sidecar部分差异) sidecars: - name: minio-lb image: "minio/sidekick:v0.5.8" imagePullPolicy: Always args: ["--health-path", "/minio/health/ready", "--address", ":9000", "[***]{0...3}.minio-distributed-svc.spark-operator.svc.cluster.local:9000"] env: - name: SIDEKICK_CACHE_ENDPOINT value: "[***]" - name: SIDEKICK_CACHE_ACCESS_KEY value: "minio" - name: SIDEKICK_CACHE_SECRET_KEY value: "minio123" - name: SIDEKICK_CACHE_BUCKET value: "cache01" - name: SIDEKICK_CACHE_MIN_SIZE value: "32MiB" - name: SIDEKICK_CACHE_HEALTH_DURATION value: "20" ports: - containerPort: 9000
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务