Shell脚本如何配置容器追踪存储

wen 实用脚本 1

本文目录导读:

Shell脚本如何配置容器追踪存储

  1. 基础环境准备脚本
  2. 使用示例
  3. 清理脚本
  4. 高级配置选项
  5. 监控和告警脚本

配置容器追踪存储(Container Tracing Storage)的 Shell 脚本通常涉及以下几个关键方面,具体取决于你使用的容器运行时(如 Docker、Podman)和追踪后端(如 Jaeger、OpenTelemetry Collector、Zipkin)。

以下是一个通用的 Shell 脚本配置示例,涵盖 Docker 和 Podman 环境下的容器追踪存储配置。

基础环境准备脚本

#!/bin/bash
# 容器追踪存储配置脚本
# 适用于 Docker 和 Podman 环境
set -euo pipefail
# 配置变量
TRACE_BACKEND="${TRACE_BACKEND:-jaeger}"  # jaeger, zipkin, otel
STORAGE_TYPE="${STORAGE_TYPE:-elasticsearch}"  # elasticsearch, cassandra, kafka
DATA_DIR="${DATA_DIR:-/data/tracing}"
NETWORK_NAME="${NETWORK_NAME:-tracing-net}"
echo "=== 容器追踪存储配置开始 ==="
# 创建数据目录
setup_directories() {
    echo "创建数据目录..."
    mkdir -p "${DATA_DIR}"/{storage,logs,config}
    chmod 755 "${DATA_DIR}"
}
# 创建 Docker 网络
create_network() {
    echo "创建容器网络..."
    if ! docker network ls | grep -q "${NETWORK_NAME}"; then
        docker network create "${NETWORK_NAME}"
        echo "网络 ${NETWORK_NAME} 创建成功"
    else
        echo "网络 ${NETWORK_NAME} 已存在"
    fi
}
# 配置 Jaeger 追踪存储
setup_jaeger_storage() {
    echo "配置 Jaeger 追踪存储..."
    case "${STORAGE_TYPE}" in
        elasticsearch)
            echo "启动 Elasticsearch..."
            docker run -d --name elasticsearch \
                --network "${NETWORK_NAME}" \
                -e "discovery.type=single-node" \
                -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
                -v "${DATA_DIR}/storage:/usr/share/elasticsearch/data" \
                -p 9200:9200 \
                elasticsearch:7.17.0
            echo "启动 Jaeger 收集器 (Elasticsearch 后端)..."
            docker run -d --name jaeger-collector \
                --network "${NETWORK_NAME}" \
                -e "SPAN_STORAGE_TYPE=elasticsearch" \
                -e "ES_SERVER_URLS=http://elasticsearch:9200" \
                -p 14250:14250 \
                -p 14268:14268 \
                -p 14269:14269 \
                jaegertracing/jaeger-collector:1.39
            echo "启动 Jaeger 查询服务..."
            docker run -d --name jaeger-query \
                --network "${NETWORK_NAME}" \
                -e "SPAN_STORAGE_TYPE=elasticsearch" \
                -e "ES_SERVER_URLS=http://elasticsearch:9200" \
                -p 16686:16686 \
                -p 16687:16687 \
                jaegertracing/jaeger-query:1.39
            echo "启动 Jaeger Agent..."
            docker run -d --name jaeger-agent \
                --network "${NETWORK_NAME}" \
                -e "REPORTER_GRPC_HOST_PORT=jaeger-collector:14250" \
                -p 6831:6831/udp \
                -p 6832:6832/udp \
                -p 5778:5778 \
                jaegertracing/jaeger-agent:1.39
            ;;
        cassandra)
            echo "启动 Cassandra..."
            docker run -d --name cassandra \
                --network "${NETWORK_NAME}" \
                -v "${DATA_DIR}/storage:/var/lib/cassandra" \
                -p 9042:9042 \
                cassandra:4.0
            echo "启动 Jaeger 收集器 (Cassandra 后端)..."
            docker run -d --name jaeger-collector \
                --network "${NETWORK_NAME}" \
                -e "SPAN_STORAGE_TYPE=cassandra" \
                -e "CASSANDRA_SERVERS=cassandra:9042" \
                -p 14250:14250 \
                -p 14268:14268 \
                jaegertracing/jaeger-collector:1.39
            ;;
        kafka)
            echo "启动 Kafka + Zookeeper..."
            docker run -d --name zookeeper \
                --network "${NETWORK_NAME}" \
                -e "ZOOKEEPER_CLIENT_PORT=2181" \
                confluentinc/cp-zookeeper:7.0.0
            docker run -d --name kafka \
                --network "${NETWORK_NAME}" \
                -e "KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181" \
                -e "KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092" \
                -p 9092:9092 \
                confluentinc/cp-kafka:7.0.0
            echo "启动 Jaeger 收集器 (Kafka 后端)..."
            docker run -d --name jaeger-collector \
                --network "${NETWORK_NAME}" \
                -e "SPAN_STORAGE_TYPE=kafka" \
                -e "KAFKA_BROKERS=kafka:9092" \
                -p 14250:14250 \
                -p 14268:14268 \
                jaegertracing/jaeger-collector:1.39
            ;;
    esac
}
# 配置 Zipkin 存储
setup_zipkin_storage() {
    echo "配置 Zipkin 追踪存储..."
    docker run -d --name zipkin \
        --network "${NETWORK_NAME}" \
        -e "STORAGE_TYPE=elasticsearch" \
        -e "ES_HOSTS=http://elasticsearch:9200" \
        -v "${DATA_DIR}/storage:/data" \
        -p 9411:9411 \
        openzipkin/zipkin:2.23
}
# 配置 OpenTelemetry Collector
setup_otel_collector() {
    echo "配置 OpenTelemetry Collector..."
    cat > "${DATA_DIR}/config/otel-collector-config.yaml" <<EOF
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
exporters:
  jaeger:
    endpoint: jaeger-collector:14250
    tls:
      insecure: true
  logging:
    loglevel: debug
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [jaeger, logging]
EOF
    docker run -d --name otel-collector \
        --network "${NETWORK_NAME}" \
        -v "${DATA_DIR}/config/otel-collector-config.yaml:/etc/otel-collector-config.yaml" \
        -p 4317:4317 \
        -p 4318:4318 \
        otel/opentelemetry-collector:0.55.0
}
# 检查容器健康状态
check_health() {
    echo "检查服务健康状态..."
    sleep 10  # 等待服务启动
    local services=("elasticsearch" "jaeger-collector" "jaeger-query" "zipkin")
    for service in "${services[@]}"; do
        if docker ps --format '{{.Names}}' | grep -q "^${service}$"; then
            echo "${service}: 运行中"
        else
            echo "${service}: 未运行 (警告)"
        fi
    done
}
# 主执行流程
main() {
    echo "开始配置容器追踪存储..."
    echo "追踪后端: ${TRACE_BACKEND}"
    echo "存储类型: ${STORAGE_TYPE}"
    echo "数据目录: ${DATA_DIR}"
    setup_directories
    create_network
    case "${TRACE_BACKEND}" in
        jaeger)
            setup_jaeger_storage
            ;;
        zipkin)
            setup_zipkin_storage
            ;;
        otel)
            setup_jaeger_storage  # 需要 Jaeger 作为后端
            setup_otel_collector
            ;;
        *)
            echo "不支持的追踪后端: ${TRACE_BACKEND}"
            exit 1
            ;;
    esac
    check_health
    echo ""
    echo "=== 配置完成 ==="
    echo "Jaeger UI: http://localhost:16686"
    echo "Zipkin UI: http://localhost:9411"
    echo "Elasticsearch: http://localhost:9200"
}
# 执行主函数
main

使用示例

# 1. 使用 Elasticsearch 作为 Jaeger 存储后端
chmod +x setup-tracing-storage.sh
./setup-tracing-storage.sh
# 2. 使用自定义环境变量
TRACE_BACKEND=zipkin STORAGE_TYPE=elasticsearch DATA_DIR=/custom/path ./setup-tracing-storage.sh
# 3. 使用 OpenTelemetry Collector
TRACE_BACKEND=otel ./setup-tracing-storage.sh

清理脚本

#!/bin/bash
# cleanup-tracing.sh - 清理追踪存储容器
set -euo pipefail
echo "清理追踪存储容器..."
# 停止并移除相关容器
containers=(
    "jaeger-collector"
    "jaeger-query"
    "jaeger-agent"
    "elasticsearch"
    "zipkin"
    "otel-collector"
    "cassandra"
    "zookeeper"
    "kafka"
)
for container in "${containers[@]}"; do
    if docker ps -a --format '{{.Names}}' | grep -q "^${container}$"; then
        echo "停止并移除 ${container}..."
        docker stop "${container}" 2>/dev/null || true
        docker rm "${container}" 2>/dev/null || true
    fi
done
# 移除网络
if docker network ls | grep -q "tracing-net"; then
    echo "移除 tracing-net 网络..."
    docker network rm tracing-net 2>/dev/null || true
fi
echo "清理完成"

高级配置选项

1 持久化配置

# 配置文件存储
CONFIG_DIR="${DATA_DIR}/config"
mkdir -p "${CONFIG_DIR}"
# 生成 Jaeger 配置文件
cat > "${CONFIG_DIR}/jaeger-config.yaml" <<EOF
collector:
  zipkin:
    http-port: 9411
  otlp:
    grpc-port: 4317
    http-port: 4318
storage:
  type: elasticsearch
  options:
    es:
      server-urls: http://elasticsearch:9200
      index-prefix: jaeger
EOF

2 资源限制配置

# 添加资源限制
docker run -d --name elasticsearch \
    --memory="2g" \
    --cpus="1.0" \
    --ulimit nofile=65535:65535 \
    --ulimit memlock=-1 \
    ...其余参数...

监控和告警脚本

#!/bin/bash
# monitor-tracing.sh - 监控追踪存储状态
check_endpoint() {
    local url=$1
    local name=$2
    if curl -s -o /dev/null -w "%{http_code}" "${url}" | grep -q "200"; then
        echo "${name}: 健康"
    else
        echo "${name}: 异常 (警告)"
    fi
}
while true; do
    echo "=== $(date) ==="
    check_endpoint "http://localhost:16686/api/services" "Jaeger"
    check_endpoint "http://localhost:9411/api/v2/services" "Zipkin"
    check_endpoint "http://localhost:9200/_cluster/health" "Elasticsearch"
    sleep 300
done

这个配置提供了一套完整的容器追踪存储方案,支持多种存储后端和追踪系统。

上一篇Shell脚本如何配置容器追踪采样

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!