大量更新
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
namespace=xafkapp
|
||||
namespace=命名空间
|
||||
|
||||
install_yq() {
|
||||
wget https://oss.demo.uavcmlc.com/cmlc-installation/downloadfile/amd/yq_linux_amd64 -O /usr/local/bin/yq
|
||||
|
||||
111
998-常用脚本/备份脚本/按APP切分备份命名空间.sh
Normal file
111
998-常用脚本/备份脚本/按APP切分备份命名空间.sh
Normal file
@@ -0,0 +1,111 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 定义命名空间
|
||||
namespace="命名空间"
|
||||
|
||||
# 创建一个带时间戳的备份目录,保持目录整洁
|
||||
backup_dir="backup_${namespace}_$(date +%Y%m%d%H%M%S)"
|
||||
mkdir -p "${backup_dir}"
|
||||
|
||||
# YQ 清理规则:去除指定的 metadata 字段以及整个 status 字段
|
||||
# 注意:加入了 .metadata.generation,这在 deployment/statefulset 中也很常见
|
||||
yq_filter='del(.metadata.managedFields, .metadata.annotations, .metadata.creationTimestamp, .metadata.uid, .metadata.resourceVersion, .metadata.selfLink, .metadata.generation, .status)'
|
||||
|
||||
install_yq() {
|
||||
echo "=> 检查并安装 yq 工具..."
|
||||
if ! command -v yq &> /dev/null; then
|
||||
wget https://oss.demo.uavcmlc.com/cmlc-installation/downloadfile/amd/yq_linux_amd64 -O /usr/local/bin/yq
|
||||
# wget https://oss.demo.uavcmlc.com/cmlc-installation/downloadfile/aarch/yq_linux_arm64 -O /usr/local/bin/yq
|
||||
chmod +x /usr/local/bin/yq
|
||||
echo "yq 安装完成!"
|
||||
else
|
||||
echo "yq 已安装,跳过。"
|
||||
fi
|
||||
echo ""
|
||||
}
|
||||
|
||||
# 备份单个应用的函数
|
||||
backup_single_app() {
|
||||
local app_name=$1
|
||||
local target_file="${backup_dir}/${app_name}.yaml"
|
||||
|
||||
echo "=> 正在备份应用: ${app_name}"
|
||||
|
||||
# 创建空文件或清空已有文件
|
||||
> "${target_file}"
|
||||
|
||||
# 1. 备份 Deployment
|
||||
if kubectl get deployment "${app_name}" -n "${namespace}" &>/dev/null; then
|
||||
echo "---" >> "${target_file}"
|
||||
kubectl get deployment "${app_name}" -n "${namespace}" -o yaml | yq eval "${yq_filter}" - >> "${target_file}"
|
||||
fi
|
||||
|
||||
# 2. 备份 StatefulSet
|
||||
if kubectl get statefulset "${app_name}" -n "${namespace}" &>/dev/null; then
|
||||
echo "---" >> "${target_file}"
|
||||
kubectl get statefulset "${app_name}" -n "${namespace}" -o yaml | yq eval "${yq_filter}" - >> "${target_file}"
|
||||
fi
|
||||
|
||||
# 3. 备份 Service (假设 Service 名称与应用名称一致)
|
||||
if kubectl get service "${app_name}" -n "${namespace}" &>/dev/null; then
|
||||
echo "---" >> "${target_file}"
|
||||
kubectl get service "${app_name}" -n "${namespace}" -o yaml | yq eval "${yq_filter}" - >> "${target_file}"
|
||||
fi
|
||||
|
||||
# 4. 备份 ConfigMap (假设主 ConfigMap 名称与应用名称一致)
|
||||
if kubectl get configmap "${app_name}" -n "${namespace}" &>/dev/null; then
|
||||
echo "---" >> "${target_file}"
|
||||
kubectl get configmap "${app_name}" -n "${namespace}" -o yaml | yq eval "${yq_filter}" - >> "${target_file}"
|
||||
fi
|
||||
}
|
||||
|
||||
backup_ingress() {
|
||||
echo "=> 正在单独备份所有 Ingress 资源..."
|
||||
local ingress_file="${backup_dir}/all-ingress-${namespace}.yaml"
|
||||
|
||||
# 检查是否存在 ingress 资源
|
||||
if [ "$(kubectl get ingress -n "${namespace}" --no-headers 2>/dev/null | wc -l)" -gt 0 ]; then
|
||||
# 因为 get ingress 拿到的是一个 List,所以需要加 .items[] 遍历处理
|
||||
kubectl get ingress -n "${namespace}" -o yaml | yq eval '.items[] | '"${yq_filter}" - > "${ingress_file}"
|
||||
# 在每个 apiVersion 前面加上 --- 分隔符
|
||||
sed -i '/^apiVersion:/i ---' "${ingress_file}"
|
||||
echo "Ingress 备份完成: ${ingress_file}"
|
||||
else
|
||||
echo "命名空间 ${namespace} 下未找到 Ingress 资源。"
|
||||
fi
|
||||
echo ""
|
||||
}
|
||||
|
||||
main() {
|
||||
install_yq
|
||||
|
||||
echo "================================================="
|
||||
echo "开始执行命名空间 ${namespace} 的多应用切分备份"
|
||||
echo "备份目录: ${backup_dir}"
|
||||
echo "================================================="
|
||||
|
||||
# 获取该命名空间下所有的 Deployment 和 StatefulSet 的名称,作为应用的基准列表
|
||||
# 使用 sort -u 去重,防止某些同名情况
|
||||
app_list=$(kubectl get deployments,statefulsets -n "${namespace}" -o custom-columns=NAME:.metadata.name --no-headers | sort -u)
|
||||
|
||||
if [ -z "${app_list}" ]; then
|
||||
echo "未在命名空间中找到任何 Deployment 或 StatefulSet。"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 遍历每个应用名称,执行合并备份
|
||||
for app in ${app_list}; do
|
||||
backup_single_app "${app}"
|
||||
done
|
||||
|
||||
echo ""
|
||||
# 单独备份 Ingress
|
||||
backup_ingress
|
||||
|
||||
echo "================================================="
|
||||
echo "所有资源备份完毕!文件已存放在 ${backup_dir}/ 目录下。"
|
||||
echo "================================================="
|
||||
}
|
||||
|
||||
# 执行主流程
|
||||
main
|
||||
11
998-常用脚本/备份脚本/按照独立应用备份.md
Normal file
11
998-常用脚本/备份脚本/按照独立应用备份.md
Normal file
@@ -0,0 +1,11 @@
|
||||
请实现yq工具,使用kubectl工具,针对特定的命名空间进行完整的备份
|
||||
1. 需要去除metadata中的managedFields、annotations、creationTimestamp、uid、resourceVersion、status、selfLink等字段
|
||||
2. 去除status字段
|
||||
|
||||
|
||||
需要按照应用名称(按照deployment的名称作为应用名称)进行切分备份,即为一个命名空间下有多个应用,每个应用包含deployment、service、configmap、statefulset等资源,每个应用的备份文件需要独立出来,
|
||||
例如一个命名空间下的应用名称为app1、app2、app3,那么备份文件需要为app1.yaml、app2.yaml、app3.yaml,每个文件中包含对应的资源。
|
||||
|
||||
需要单独备份ingress部分的资源
|
||||
|
||||
请你参考现在的备份命名空间,实现一个新的shell脚本,实现上述的功能
|
||||
85
998-常用脚本/备份脚本/部署业务-镜像-分支.sh
Normal file
85
998-常用脚本/备份脚本/部署业务-镜像-分支.sh
Normal file
@@ -0,0 +1,85 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# 脚本功能:收集指定命名空间下副本数 > 0 的 Deployment 信息
|
||||
# 包含:Deployment 名称、镜像名称、GIT 相关环境变量
|
||||
# ============================================================
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# ── 配置区 ──────────────────────────────────────────────────
|
||||
NAMESPACE="sd-wf-ga-fly-260327"
|
||||
OUTPUT_FILE="deployment_info_$(date +%Y%m%d_%H%M%S).txt"
|
||||
# ────────────────────────────────────────────────────────────
|
||||
|
||||
echo "=========================================="
|
||||
echo " 命名空间 : $NAMESPACE"
|
||||
echo " 输出文件 : $OUTPUT_FILE"
|
||||
echo "=========================================="
|
||||
|
||||
# 创建(清空)输出文件
|
||||
> "$OUTPUT_FILE"
|
||||
|
||||
# 获取所有 Deployment 名称(换行分隔)
|
||||
DEPLOYMENTS=$(kubectl get deployments -n "$NAMESPACE" \
|
||||
-o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' 2>/dev/null)
|
||||
|
||||
if [[ -z "$DEPLOYMENTS" ]]; then
|
||||
echo "[ERROR] 命名空间 '$NAMESPACE' 下未发现任何 Deployment,请检查命名空间是否正确。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PROCESSED=0
|
||||
SKIPPED=0
|
||||
|
||||
while IFS= read -r DEPLOY; do
|
||||
[[ -z "$DEPLOY" ]] && continue
|
||||
|
||||
# ── 1. 获取期望副本数 ──────────────────────────────────────
|
||||
REPLICAS=$(kubectl get deployment "$DEPLOY" -n "$NAMESPACE" \
|
||||
-o jsonpath='{.spec.replicas}' 2>/dev/null)
|
||||
REPLICAS="${REPLICAS:-0}"
|
||||
|
||||
if [[ "$REPLICAS" == 0 ]]; then
|
||||
echo "[SKIP] $DEPLOY (副本数=${REPLICAS},≤ 1,跳过)"
|
||||
(( SKIPPED++ )) || true
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "[INFO] 处理 Deployment: $DEPLOY (副本数=${REPLICAS})"
|
||||
|
||||
# ── 2. 获取第一个容器的镜像名称 ───────────────────────────
|
||||
IMAGE=$(kubectl get deployment "$DEPLOY" -n "$NAMESPACE" \
|
||||
-o jsonpath='{.spec.template.spec.containers[0].image}' 2>/dev/null)
|
||||
IMAGE="${IMAGE:-<未获取到镜像>}"
|
||||
|
||||
# ── 3. 在第一个副本 Pod 中执行 env | grep GIT ─────────────
|
||||
GIT_ENV=$(kubectl exec -n "$NAMESPACE" "deploy/$DEPLOY" \
|
||||
-- sh -c "env | grep GIT" 2>/dev/null || echo "")
|
||||
|
||||
# ── 4. 写入输出文件 ───────────────────────────────────────
|
||||
{
|
||||
echo "deployment名称:${DEPLOY}"
|
||||
echo "镜像名称:${IMAGE}"
|
||||
echo "环境变量:"
|
||||
if [[ -n "$GIT_ENV" ]]; then
|
||||
while IFS= read -r env_line; do
|
||||
echo " ${env_line}"
|
||||
done <<< "$GIT_ENV"
|
||||
else
|
||||
echo " (未发现 GIT 相关环境变量)"
|
||||
fi
|
||||
echo ""
|
||||
echo "------------------------------------------"
|
||||
echo ""
|
||||
} >> "$OUTPUT_FILE"
|
||||
|
||||
(( PROCESSED++ )) || true
|
||||
|
||||
done <<< "$DEPLOYMENTS"
|
||||
|
||||
# ── 汇总输出 ──────────────────────────────────────────────
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " 完成!已处理: ${PROCESSED} 个,已跳过: ${SKIPPED} 个"
|
||||
echo " 结果文件: $OUTPUT_FILE"
|
||||
echo "=========================================="
|
||||
11
998-常用脚本/备份脚本/重启CMII应用.sh
Normal file
11
998-常用脚本/备份脚本/重启CMII应用.sh
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
export namespace=cq-ws-260319
|
||||
|
||||
kubectl rollout restart deployment -n "${namespace}" -l cmii.type=frontend,octopus.control=frontend-app-wdd
|
||||
|
||||
kubectl rollout restart deployment -n "${namespace}" -l cmii.type=backend,octopus/control=backend-app-1.0.0
|
||||
|
||||
kubectl rollout restart daemonset/nginx-ingress-controller -n ingress-nginx
|
||||
|
||||
kubectl rollout status daemonset/nginx-ingress-controller -n ingress-nginx
|
||||
# 等待输出: daemon set "nginx-ingress-controller" successfully rolled out
|
||||
Reference in New Issue
Block a user