Skip to content

06_practical_scripts

bash
#!/bin/bash
# ============================================================
#           Docker & Kubernetes 实战脚本集合
# ============================================================
# 本文件包含常用的 Docker 和 Kubernetes 操作脚本
# 可以直接使用或作为参考
#
# 使用前请确保:
# 1. 已安装 Docker 和 kubectl
# 2. 已配置好 Kubernetes 集群访问权限
# 3. 给脚本执行权限: chmod +x 06_practical_scripts.sh
# ============================================================


# ============================================================
#     第一部分:Docker 常用操作脚本
# ============================================================


# ------------------------------------------------------------
#              1.1 Docker 环境清理脚本
# ------------------------------------------------------------
# 清理未使用的 Docker 资源,释放磁盘空间

docker_cleanup() {
    echo "=========================================="
    echo "       Docker 环境清理脚本"
    echo "=========================================="

    # 显示清理前的磁盘使用情况
    echo ""
    echo "📊 清理前磁盘使用情况:"
    docker system df

    echo ""
    echo "🧹 开始清理..."

    # 1. 停止所有运行中的容器
    echo ""
    echo "➡️  停止所有运行中的容器..."
    running_containers=$(docker ps -q)
    if [ -n "$running_containers" ]; then
        docker stop $running_containers
        echo "   已停止 $(echo $running_containers | wc -w) 个容器"
    else
        echo "   没有运行中的容器"
    fi

    # 2. 删除所有已停止的容器
    echo ""
    echo "➡️  删除所有已停止的容器..."
    docker container prune -f

    # 3. 删除未使用的镜像
    echo ""
    echo "➡️  删除悬空镜像(dangling images)..."
    docker image prune -f

    # 4. 删除未使用的卷
    echo ""
    echo "➡️  删除未使用的卷..."
    docker volume prune -f

    # 5. 删除未使用的网络
    echo ""
    echo "➡️  删除未使用的网络..."
    docker network prune -f

    # 6. 综合清理(可选,会删除所有未使用资源)
    # docker system prune -a -f --volumes

    # 显示清理后的磁盘使用情况
    echo ""
    echo "📊 清理后磁盘使用情况:"
    docker system df

    echo ""
    echo "✅ 清理完成!"
}


# ------------------------------------------------------------
#              1.2 Docker 镜像构建脚本
# ------------------------------------------------------------
# 构建并推送 Docker 镜像

build_and_push_image() {
    # 参数检查
    if [ -z "$1" ] || [ -z "$2" ]; then
        echo "用法: build_and_push_image <镜像名称> <版本标签>"
        echo "示例: build_and_push_image myapp v1.0.0"
        return 1
    fi

    local IMAGE_NAME=$1
    local TAG=$2
    local REGISTRY=${3:-"docker.io"}  # 默认使用 Docker Hub

    local FULL_IMAGE="${REGISTRY}/${IMAGE_NAME}:${TAG}"

    echo "=========================================="
    echo "       Docker 镜像构建脚本"
    echo "=========================================="
    echo "镜像名称: ${FULL_IMAGE}"
    echo ""

    # 检查 Dockerfile 是否存在
    if [ ! -f "Dockerfile" ]; then
        echo "❌ 错误: 当前目录没有找到 Dockerfile"
        return 1
    fi

    # 构建镜像
    echo "🔨 开始构建镜像..."
    docker build \
        --tag "${FULL_IMAGE}" \
        --tag "${REGISTRY}/${IMAGE_NAME}:latest" \
        --build-arg BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
        --build-arg VERSION=${TAG} \
        --file Dockerfile \
        .

    # 检查构建结果
    if [ $? -ne 0 ]; then
        echo "❌ 镜像构建失败"
        return 1
    fi

    echo ""
    echo "✅ 镜像构建成功"

    # 显示镜像信息
    echo ""
    echo "📦 镜像信息:"
    docker images | grep ${IMAGE_NAME}

    # 询问是否推送
    echo ""
    read -p "是否推送镜像到仓库?(y/n): " push_confirm
    if [ "$push_confirm" = "y" ] || [ "$push_confirm" = "Y" ]; then
        echo ""
        echo "📤 推送镜像..."
        docker push "${FULL_IMAGE}"
        docker push "${REGISTRY}/${IMAGE_NAME}:latest"

        if [ $? -eq 0 ]; then
            echo "✅ 镜像推送成功"
        else
            echo "❌ 镜像推送失败,请检查登录状态"
        fi
    fi
}


# ------------------------------------------------------------
#              1.3 容器日志查看脚本
# ------------------------------------------------------------
# 查看和导出容器日志

view_container_logs() {
    echo "=========================================="
    echo "       容器日志查看工具"
    echo "=========================================="

    # 列出所有容器
    echo ""
    echo "📋 当前容器列表:"
    docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Image}}"

    echo ""
    read -p "请输入容器名称或ID: " container_name

    if [ -z "$container_name" ]; then
        echo "❌ 容器名称不能为空"
        return 1
    fi

    echo ""
    echo "选择操作:"
    echo "1. 查看最近 100 行日志"
    echo "2. 实时查看日志(Ctrl+C 退出)"
    echo "3. 导出全部日志到文件"
    echo "4. 查看指定时间范围的日志"
    read -p "请选择 (1-4): " choice

    case $choice in
        1)
            echo ""
            echo "📜 最近 100 行日志:"
            docker logs --tail 100 "$container_name"
            ;;
        2)
            echo ""
            echo "📜 实时日志(按 Ctrl+C 退出):"
            docker logs -f "$container_name"
            ;;
        3)
            local log_file="${container_name}_$(date +%Y%m%d_%H%M%S).log"
            docker logs "$container_name" > "$log_file" 2>&1
            echo ""
            echo "✅ 日志已导出到: $log_file"
            echo "   文件大小: $(ls -lh $log_file | awk '{print $5}')"
            ;;
        4)
            read -p "请输入开始时间 (如 2024-01-01T00:00:00): " since_time
            read -p "请输入结束时间 (如 2024-01-02T00:00:00): " until_time
            echo ""
            docker logs --since "$since_time" --until "$until_time" "$container_name"
            ;;
        *)
            echo "❌ 无效选择"
            ;;
    esac
}


# ------------------------------------------------------------
#              1.4 Docker Compose 项目管理
# ------------------------------------------------------------
# Docker Compose 项目的启动、停止、重启脚本

compose_manager() {
    local compose_file=${1:-"docker-compose.yaml"}

    # 检查 compose 文件
    if [ ! -f "$compose_file" ]; then
        echo "❌ 找不到 compose 文件: $compose_file"
        return 1
    fi

    echo "=========================================="
    echo "     Docker Compose 项目管理"
    echo "=========================================="
    echo "Compose 文件: $compose_file"
    echo ""
    echo "选择操作:"
    echo "1. 启动服务(后台运行)"
    echo "2. 停止服务"
    echo "3. 重启服务"
    echo "4. 查看服务状态"
    echo "5. 查看服务日志"
    echo "6. 重新构建并启动"
    echo "7. 停止并删除所有资源"
    echo "8. 扩缩容服务"
    read -p "请选择 (1-8): " choice

    case $choice in
        1)
            echo ""
            echo "🚀 启动服务..."
            docker compose -f "$compose_file" up -d
            echo ""
            echo "📊 服务状态:"
            docker compose -f "$compose_file" ps
            ;;
        2)
            echo ""
            echo "⏹️  停止服务..."
            docker compose -f "$compose_file" stop
            ;;
        3)
            echo ""
            echo "🔄 重启服务..."
            docker compose -f "$compose_file" restart
            ;;
        4)
            echo ""
            echo "📊 服务状态:"
            docker compose -f "$compose_file" ps
            ;;
        5)
            echo ""
            echo "📜 服务日志(按 Ctrl+C 退出):"
            docker compose -f "$compose_file" logs -f
            ;;
        6)
            echo ""
            echo "🔨 重新构建并启动..."
            docker compose -f "$compose_file" up -d --build
            ;;
        7)
            echo ""
            read -p "⚠️  确定要停止并删除所有资源吗?(y/n): " confirm
            if [ "$confirm" = "y" ]; then
                docker compose -f "$compose_file" down -v --rmi local
                echo "✅ 已停止并删除所有资源"
            fi
            ;;
        8)
            read -p "请输入服务名称: " service_name
            read -p "请输入副本数量: " replicas
            docker compose -f "$compose_file" up -d --scale ${service_name}=${replicas}
            ;;
        *)
            echo "❌ 无效选择"
            ;;
    esac
}


# ============================================================
#     第二部分:Kubernetes 常用操作脚本
# ============================================================


# ------------------------------------------------------------
#              2.1 K8s 资源查看脚本
# ------------------------------------------------------------
# 综合查看 Kubernetes 集群资源状态

k8s_status() {
    local namespace=${1:-"default"}

    echo "=========================================="
    echo "    Kubernetes 集群状态概览"
    echo "=========================================="
    echo "命名空间: $namespace"
    echo "时间: $(date)"
    echo ""

    # 节点状态
    echo "🖥️  节点状态:"
    echo "----------------------------------------"
    kubectl get nodes -o wide
    echo ""

    # Pod 状态
    echo "📦 Pod 状态:"
    echo "----------------------------------------"
    kubectl get pods -n "$namespace" -o wide
    echo ""

    # 服务状态
    echo "🌐 Service 状态:"
    echo "----------------------------------------"
    kubectl get svc -n "$namespace"
    echo ""

    # Deployment 状态
    echo "🚀 Deployment 状态:"
    echo "----------------------------------------"
    kubectl get deployments -n "$namespace"
    echo ""

    # 资源使用情况(需要 metrics-server)
    echo "📊 资源使用情况:"
    echo "----------------------------------------"
    kubectl top pods -n "$namespace" 2>/dev/null || echo "   (需要安装 metrics-server)"
    echo ""

    # 最近事件
    echo "📋 最近事件:"
    echo "----------------------------------------"
    kubectl get events -n "$namespace" --sort-by='.lastTimestamp' | tail -10
}


# ------------------------------------------------------------
#              2.2 K8s 应用部署脚本
# ------------------------------------------------------------
# 部署应用到 Kubernetes 集群

k8s_deploy() {
    local manifest_file=$1
    local namespace=${2:-"default"}

    if [ -z "$manifest_file" ]; then
        echo "用法: k8s_deploy <manifest文件> [命名空间]"
        echo "示例: k8s_deploy deployment.yaml production"
        return 1
    fi

    if [ ! -f "$manifest_file" ]; then
        echo "❌ 找不到文件: $manifest_file"
        return 1
    fi

    echo "=========================================="
    echo "    Kubernetes 应用部署"
    echo "=========================================="
    echo "配置文件: $manifest_file"
    echo "命名空间: $namespace"
    echo ""

    # 验证配置文件
    echo "🔍 验证配置文件..."
    kubectl apply --dry-run=client -f "$manifest_file" -n "$namespace"
    if [ $? -ne 0 ]; then
        echo "❌ 配置文件验证失败"
        return 1
    fi
    echo "✅ 配置文件验证通过"
    echo ""

    # 显示将要部署的资源
    echo "📋 将要部署的资源:"
    kubectl apply --dry-run=client -f "$manifest_file" -n "$namespace" -o name
    echo ""

    # 确认部署
    read -p "确认部署?(y/n): " confirm
    if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
        echo "取消部署"
        return 0
    fi

    # 执行部署
    echo ""
    echo "🚀 开始部署..."
    kubectl apply -f "$manifest_file" -n "$namespace"

    if [ $? -eq 0 ]; then
        echo ""
        echo "✅ 部署成功"
        echo ""
        echo "📊 部署状态:"
        kubectl get all -n "$namespace" | grep -E "NAME|$(basename $manifest_file .yaml)"
    else
        echo ""
        echo "❌ 部署失败"
        return 1
    fi
}


# ------------------------------------------------------------
#              2.3 K8s 滚动更新脚本
# ------------------------------------------------------------
# 执行 Deployment 的滚动更新

k8s_rolling_update() {
    local deployment=$1
    local image=$2
    local namespace=${3:-"default"}

    if [ -z "$deployment" ] || [ -z "$image" ]; then
        echo "用法: k8s_rolling_update <deployment名称> <新镜像> [命名空间]"
        echo "示例: k8s_rolling_update api-deployment myapp/api:v2 production"
        return 1
    fi

    echo "=========================================="
    echo "    Kubernetes 滚动更新"
    echo "=========================================="
    echo "Deployment: $deployment"
    echo "新镜像: $image"
    echo "命名空间: $namespace"
    echo ""

    # 检查 Deployment 是否存在
    if ! kubectl get deployment "$deployment" -n "$namespace" &>/dev/null; then
        echo "❌ Deployment 不存在: $deployment"
        return 1
    fi

    # 显示当前状态
    echo "📊 当前状态:"
    kubectl get deployment "$deployment" -n "$namespace" -o wide
    echo ""

    # 获取容器名称(假设第一个容器)
    local container=$(kubectl get deployment "$deployment" -n "$namespace" \
        -o jsonpath='{.spec.template.spec.containers[0].name}')

    echo "容器名称: $container"
    echo ""

    # 确认更新
    read -p "确认开始滚动更新?(y/n): " confirm
    if [ "$confirm" != "y" ]; then
        echo "取消更新"
        return 0
    fi

    # 执行更新
    echo ""
    echo "🔄 开始滚动更新..."
    kubectl set image deployment/"$deployment" "${container}=${image}" -n "$namespace"

    # 监控更新状态
    echo ""
    echo "📊 监控更新状态(按 Ctrl+C 退出监控,更新会继续)..."
    kubectl rollout status deployment/"$deployment" -n "$namespace"

    if [ $? -eq 0 ]; then
        echo ""
        echo "✅ 滚动更新完成"
        echo ""
        echo "📊 最新状态:"
        kubectl get deployment "$deployment" -n "$namespace" -o wide
    else
        echo ""
        echo "⚠️  更新可能未完成,检查状态..."
        kubectl get pods -n "$namespace" -l app="$deployment"

        read -p "是否回滚到上一版本?(y/n): " rollback
        if [ "$rollback" = "y" ]; then
            echo "🔙 执行回滚..."
            kubectl rollout undo deployment/"$deployment" -n "$namespace"
        fi
    fi
}


# ------------------------------------------------------------
#              2.4 K8s Pod 调试脚本
# ------------------------------------------------------------
# 调试 Kubernetes Pod

k8s_debug_pod() {
    local namespace=${1:-"default"}

    echo "=========================================="
    echo "    Kubernetes Pod 调试工具"
    echo "=========================================="
    echo "命名空间: $namespace"
    echo ""

    # 列出 Pod
    echo "📋 Pod 列表:"
    kubectl get pods -n "$namespace" --show-labels
    echo ""

    read -p "请输入要调试的 Pod 名称: " pod_name

    if [ -z "$pod_name" ]; then
        echo "❌ Pod 名称不能为空"
        return 1
    fi

    # 检查 Pod 是否存在
    if ! kubectl get pod "$pod_name" -n "$namespace" &>/dev/null; then
        echo "❌ Pod 不存在: $pod_name"
        return 1
    fi

    echo ""
    echo "选择调试操作:"
    echo "1. 查看 Pod 详细信息"
    echo "2. 查看 Pod 日志"
    echo "3. 进入 Pod 容器"
    echo "4. 查看 Pod 事件"
    echo "5. 查看 Pod 资源使用"
    echo "6. 端口转发"
    echo "7. 复制文件到/从 Pod"
    read -p "请选择 (1-7): " choice

    case $choice in
        1)
            echo ""
            echo "📝 Pod 详细信息:"
            kubectl describe pod "$pod_name" -n "$namespace"
            ;;
        2)
            # 获取容器列表
            containers=$(kubectl get pod "$pod_name" -n "$namespace" \
                -o jsonpath='{.spec.containers[*].name}')
            echo ""
            echo "可用容器: $containers"
            read -p "请输入容器名称(直接回车选择第一个): " container

            if [ -z "$container" ]; then
                container=$(echo $containers | awk '{print $1}')
            fi

            echo ""
            echo "📜 Pod 日志 (容器: $container):"
            kubectl logs "$pod_name" -c "$container" -n "$namespace" --tail=100
            ;;
        3)
            containers=$(kubectl get pod "$pod_name" -n "$namespace" \
                -o jsonpath='{.spec.containers[*].name}')
            echo ""
            echo "可用容器: $containers"
            read -p "请输入容器名称(直接回车选择第一个): " container

            if [ -z "$container" ]; then
                container=$(echo $containers | awk '{print $1}')
            fi

            echo ""
            echo "🔗 进入容器 (输入 exit 退出)..."
            kubectl exec -it "$pod_name" -c "$container" -n "$namespace" -- /bin/sh
            ;;
        4)
            echo ""
            echo "📋 Pod 相关事件:"
            kubectl get events -n "$namespace" --field-selector involvedObject.name="$pod_name"
            ;;
        5)
            echo ""
            echo "📊 Pod 资源使用:"
            kubectl top pod "$pod_name" -n "$namespace" --containers 2>/dev/null || \
                echo "   (需要安装 metrics-server)"
            ;;
        6)
            read -p "请输入本地端口: " local_port
            read -p "请输入 Pod 端口: " pod_port
            echo ""
            echo "🔗 端口转发 localhost:$local_port -> pod:$pod_port"
            echo "   按 Ctrl+C 停止"
            kubectl port-forward "$pod_name" "${local_port}:${pod_port}" -n "$namespace"
            ;;
        7)
            echo ""
            echo "选择复制方向:"
            echo "1. 从 Pod 复制到本地"
            echo "2. 从本地复制到 Pod"
            read -p "请选择 (1-2): " copy_dir

            if [ "$copy_dir" = "1" ]; then
                read -p "请输入 Pod 中的路径: " pod_path
                read -p "请输入本地保存路径: " local_path
                kubectl cp "${namespace}/${pod_name}:${pod_path}" "$local_path"
                echo "✅ 复制完成"
            else
                read -p "请输入本地文件路径: " local_path
                read -p "请输入 Pod 中的目标路径: " pod_path
                kubectl cp "$local_path" "${namespace}/${pod_name}:${pod_path}"
                echo "✅ 复制完成"
            fi
            ;;
        *)
            echo "❌ 无效选择"
            ;;
    esac
}


# ------------------------------------------------------------
#              2.5 K8s 资源清理脚本
# ------------------------------------------------------------
# 清理 Kubernetes 命名空间中的资源

k8s_cleanup() {
    local namespace=$1

    if [ -z "$namespace" ]; then
        echo "用法: k8s_cleanup <命名空间>"
        return 1
    fi

    echo "=========================================="
    echo "    Kubernetes 资源清理"
    echo "=========================================="
    echo "命名空间: $namespace"
    echo ""

    # 显示将要删除的资源
    echo "📋 将要删除的资源:"
    echo ""
    echo "Deployments:"
    kubectl get deployments -n "$namespace" -o name
    echo ""
    echo "Services:"
    kubectl get svc -n "$namespace" -o name
    echo ""
    echo "ConfigMaps:"
    kubectl get configmaps -n "$namespace" -o name
    echo ""
    echo "Secrets:"
    kubectl get secrets -n "$namespace" -o name
    echo ""
    echo "PVCs:"
    kubectl get pvc -n "$namespace" -o name
    echo ""

    # 确认删除
    echo "⚠️  警告: 此操作将删除命名空间 $namespace 中的所有资源!"
    read -p "确认删除?请输入命名空间名称以确认: " confirm

    if [ "$confirm" != "$namespace" ]; then
        echo "取消操作"
        return 0
    fi

    echo ""
    echo "🗑️  开始删除资源..."

    # 删除 Deployments
    kubectl delete deployments --all -n "$namespace"

    # 删除 Services
    kubectl delete svc --all -n "$namespace"

    # 删除 ConfigMaps(排除系统的)
    kubectl delete configmaps --all -n "$namespace"

    # 删除 Secrets(排除系统的)
    kubectl delete secrets --all -n "$namespace"

    # 删除 PVCs
    kubectl delete pvc --all -n "$namespace"

    # 删除 Jobs
    kubectl delete jobs --all -n "$namespace"

    echo ""
    echo "✅ 资源清理完成"
    echo ""
    echo "📊 剩余资源:"
    kubectl get all -n "$namespace"
}


# ------------------------------------------------------------
#              2.6 K8s 快速扩缩容脚本
# ------------------------------------------------------------
# 快速扩缩容 Deployment

k8s_scale() {
    local deployment=$1
    local replicas=$2
    local namespace=${3:-"default"}

    if [ -z "$deployment" ] || [ -z "$replicas" ]; then
        echo "用法: k8s_scale <deployment名称> <副本数> [命名空间]"
        echo "示例: k8s_scale api 5 production"
        return 1
    fi

    echo "=========================================="
    echo "    Kubernetes 扩缩容"
    echo "=========================================="
    echo "Deployment: $deployment"
    echo "目标副本数: $replicas"
    echo "命名空间: $namespace"
    echo ""

    # 显示当前状态
    echo "📊 当前状态:"
    kubectl get deployment "$deployment" -n "$namespace"
    echo ""

    # 执行扩缩容
    echo "🔄 执行扩缩容..."
    kubectl scale deployment "$deployment" --replicas="$replicas" -n "$namespace"

    # 等待完成
    echo ""
    echo "⏳ 等待扩缩容完成..."
    kubectl rollout status deployment/"$deployment" -n "$namespace" --timeout=120s

    echo ""
    echo "📊 最新状态:"
    kubectl get deployment "$deployment" -n "$namespace"
    echo ""
    kubectl get pods -n "$namespace" -l app="$deployment"
}


# ============================================================
#     第三部分:综合运维脚本
# ============================================================


# ------------------------------------------------------------
#              3.1 健康检查脚本
# ------------------------------------------------------------
# 检查整个应用栈的健康状态

health_check() {
    local namespace=${1:-"default"}

    echo "=========================================="
    echo "    应用健康检查"
    echo "=========================================="
    echo "命名空间: $namespace"
    echo "检查时间: $(date)"
    echo ""

    local has_error=0

    # 检查 Pod 状态
    echo "🔍 检查 Pod 状态..."
    not_running=$(kubectl get pods -n "$namespace" --no-headers | grep -v Running | grep -v Completed)
    if [ -n "$not_running" ]; then
        echo "❌ 发现异常 Pod:"
        echo "$not_running"
        has_error=1
    else
        echo "✅ 所有 Pod 运行正常"
    fi
    echo ""

    # 检查 Pod 重启次数
    echo "🔍 检查 Pod 重启情况..."
    high_restarts=$(kubectl get pods -n "$namespace" -o jsonpath='{range .items[*]}{.metadata.name}{" "}{.status.containerStatuses[0].restartCount}{"\n"}{end}' | awk '$2 > 5 {print}')
    if [ -n "$high_restarts" ]; then
        echo "⚠️  发现高重启次数的 Pod:"
        echo "$high_restarts"
        has_error=1
    else
        echo "✅ 没有频繁重启的 Pod"
    fi
    echo ""

    # 检查 Service 端点
    echo "🔍 检查 Service 端点..."
    for svc in $(kubectl get svc -n "$namespace" -o name); do
        endpoints=$(kubectl get endpoints -n "$namespace" $(echo $svc | cut -d'/' -f2) -o jsonpath='{.subsets[*].addresses[*].ip}')
        if [ -z "$endpoints" ]; then
            echo "⚠️  Service $svc 没有可用端点"
            has_error=1
        fi
    done
    if [ $has_error -eq 0 ]; then
        echo "✅ 所有 Service 端点正常"
    fi
    echo ""

    # 检查 PVC 状态
    echo "🔍 检查 PVC 状态..."
    pending_pvc=$(kubectl get pvc -n "$namespace" --no-headers | grep -v Bound)
    if [ -n "$pending_pvc" ]; then
        echo "⚠️  发现未绑定的 PVC:"
        echo "$pending_pvc"
        has_error=1
    else
        echo "✅ 所有 PVC 已绑定"
    fi
    echo ""

    # 检查最近错误事件
    echo "🔍 检查最近错误事件..."
    error_events=$(kubectl get events -n "$namespace" --field-selector type=Warning --sort-by='.lastTimestamp' | tail -5)
    if [ -n "$error_events" ]; then
        echo "⚠️  最近的警告事件:"
        echo "$error_events"
    else
        echo "✅ 没有警告事件"
    fi
    echo ""

    # 总结
    echo "=========================================="
    if [ $has_error -eq 0 ]; then
        echo "✅ 健康检查通过"
    else
        echo "⚠️  健康检查发现问题,请处理"
    fi
    echo "=========================================="

    return $has_error
}


# ------------------------------------------------------------
#              3.2 备份脚本
# ------------------------------------------------------------
# 备份 Kubernetes 配置和数据

k8s_backup() {
    local backup_dir=${1:-"./k8s-backup-$(date +%Y%m%d_%H%M%S)"}

    echo "=========================================="
    echo "    Kubernetes 配置备份"
    echo "=========================================="
    echo "备份目录: $backup_dir"
    echo ""

    mkdir -p "$backup_dir"

    # 备份所有命名空间的资源
    echo "📦 开始备份..."

    for ns in $(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}'); do
        # 跳过系统命名空间
        if [[ "$ns" == "kube-system" || "$ns" == "kube-public" || "$ns" == "kube-node-lease" ]]; then
            continue
        fi

        echo "  备份命名空间: $ns"
        mkdir -p "$backup_dir/$ns"

        # 备份各类资源
        for resource in deployments services configmaps secrets ingresses pvc; do
            kubectl get $resource -n "$ns" -o yaml > "$backup_dir/$ns/${resource}.yaml" 2>/dev/null
        done
    done

    # 备份集群级别资源
    echo "  备份集群级别资源..."
    mkdir -p "$backup_dir/cluster"
    kubectl get clusterroles -o yaml > "$backup_dir/cluster/clusterroles.yaml" 2>/dev/null
    kubectl get clusterrolebindings -o yaml > "$backup_dir/cluster/clusterrolebindings.yaml" 2>/dev/null
    kubectl get storageclasses -o yaml > "$backup_dir/cluster/storageclasses.yaml" 2>/dev/null

    # 压缩备份
    echo ""
    echo "📦 压缩备份文件..."
    tar -czf "${backup_dir}.tar.gz" "$backup_dir"
    rm -rf "$backup_dir"

    echo ""
    echo "✅ 备份完成: ${backup_dir}.tar.gz"
    echo "   文件大小: $(ls -lh ${backup_dir}.tar.gz | awk '{print $5}')"
}


# ============================================================
#     第四部分:使用说明
# ============================================================

show_help() {
    echo "=========================================="
    echo "    Docker & K8s 运维脚本帮助"
    echo "=========================================="
    echo ""
    echo "Docker 相关函数:"
    echo "  docker_cleanup              - 清理 Docker 环境"
    echo "  build_and_push_image        - 构建并推送镜像"
    echo "  view_container_logs         - 查看容器日志"
    echo "  compose_manager             - Docker Compose 管理"
    echo ""
    echo "Kubernetes 相关函数:"
    echo "  k8s_status [namespace]      - 查看集群状态"
    echo "  k8s_deploy <file> [ns]      - 部署应用"
    echo "  k8s_rolling_update          - 滚动更新"
    echo "  k8s_debug_pod [namespace]   - 调试 Pod"
    echo "  k8s_cleanup <namespace>     - 清理资源"
    echo "  k8s_scale <deploy> <n> [ns] - 扩缩容"
    echo ""
    echo "综合运维函数:"
    echo "  health_check [namespace]    - 健康检查"
    echo "  k8s_backup [backup_dir]     - 备份配置"
    echo ""
    echo "使用方法:"
    echo "  1. source 06_practical_scripts.sh"
    echo "  2. 调用上述函数,如: k8s_status default"
    echo ""
}

# 如果直接运行脚本,显示帮助
if [ "$0" = "$BASH_SOURCE" ]; then
    show_help
fi

💬 讨论

使用 GitHub 账号登录后即可参与讨论

基于 MIT 许可发布