kuberentes证书续签脚本

kuberentes证书续签脚本

#!/bin/bash

# ==============================================================================
# 脚本名称: kubeadm_cert_renew.sh
# 描述: 自动续期 kubeadm 部署的 Kubernetes 控制平面证书
# 注意: 在多 Master 节点的高可用集群中,必须在每台 Master 节点上分别执行此脚本
# ==============================================================================

# 设置严格错误模式:任何命令失败立即退出
set -eo pipefail

# 颜色配置
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # 无颜色

log_info() { echo -e "${GREEN}[INFO] $(date '+%Y-%m-%d %H:%M:%S') $1${NC}"; }
log_warn() { echo -e "${YELLOW}[WARN] $(date '+%Y-%m-%d %H:%M:%S') $1${NC}"; }
log_err()  { echo -e "${RED}[ERROR] $(date '+%Y-%m-%d %H:%M:%S') $1${NC}"; }

# 1. 基础环境前置检查
if [ "$EUID" -ne 0 ]; then
    log_err "请使用 root 用户或 sudo 执行此脚本!"
    exit 1
fi

if ! command -v kubeadm &>/dev/null || ! command -v kubectl &>/dev/null; then
    log_err "未检测到 kubeadm 或 kubectl 命令,请确认当前节点为 Master 节点。"
    exit 1
fi

BACKUP_DIR="/etc/kubernetes/backup-manual/$(date +%Y%m%d_%H%M%S)"
TMP_MANIFESTS_DIR="/tmp/k8s-manifests-temp"

# ==============================================================================
# 第一步:确认证书状态
# ==============================================================================
log_info "--------------------------------------------------"
log_info "第一步:当前证书过期状态检查:"
log_info "--------------------------------------------------"
kubeadm certs check-expiration || log_warn "部分证书可能已过期,继续尝试执行续期流程..."

# ==============================================================================
# 第二步:备份关键配置
# ==============================================================================
log_info "第二步:正在备份当前关键配置至 ${BACKUP_DIR} ..."
mkdir -p "${BACKUP_DIR}"
cp -rp /etc/kubernetes/pki "${BACKUP_DIR}/"
cp -rp /etc/kubernetes/manifests "${BACKUP_DIR}/"
log_info "备份完成。"

# ==============================================================================
# 第三步:手动续期所有证书
# ==============================================================================
log_info "第三步:正在执行 kubeadm certs renew all 续期所有证书..."
kubeadm certs renew all
log_info "证书文件续期成功。"

# ==============================================================================
# 第四步:更新管理配置文件 (.conf)
# ==============================================================================
log_info "第四步:正在重新生成 /etc/kubernetes/ 下的管理配置文件..."
kubeadm init phase kubeconfig all

# 刷新当前执行用户的 .kube/config (支持 root 或通过 sudo 执行的普通用户)
TARGET_HOME="${HOME}"
TARGET_UID=$(id -u)
TARGET_GID=$(id -g)

# 如果是通过 sudo 执行的,刷入原用户的配置目录
if [ -n "${SUDO_USER}" ]; then
    TARGET_HOME=$(eval echo "~${SUDO_USER}")
    TARGET_UID=$(id -u "${SUDO_USER}")
    TARGET_GID=$(id -g "${SUDO_USER}")
fi

log_info "正在更新 ${TARGET_HOME}/.kube/config 文件..."
mkdir -p "${TARGET_HOME}/.kube"
cp /etc/kubernetes/admin.conf "${TARGET_HOME}/.kube/config"
chown "${TARGET_UID}:${TARGET_GID}" "${TARGET_HOME}/.kube/config"

# ==============================================================================
# 第五步:重启控制平面组件(安全优化版)
# ==============================================================================
log_info "第五步:正在通过挪移静态 Pod 清单强制触发组件重启..."
mkdir -p "${TMP_MANIFESTS_DIR}"

# 严格限定只移动这 4 个核心组件,防止误杀或错移 tmp 下的其他 yaml
for component in kube-apiserver kube-controller-manager kube-scheduler etcd; do
    if [ -f "/etc/kubernetes/manifests/${component}.yaml" ]; then
        mv "/etc/kubernetes/manifests/${component}.yaml" "${TMP_MANIFESTS_DIR}/"
    fi
done

log_warn "核心组件清单已移出,等待 10 秒供 kubelet 彻底销毁容器..."
sleep 10

log_info "正在将清单移回 /etc/kubernetes/manifests/ 以触发重建..."
mv "${TMP_MANIFESTS_DIR}"/*.yaml /etc/kubernetes/manifests/
rm -rf "${TMP_MANIFESTS_DIR}"

# 配合重启本地 kubelet,确保物理层面的 token 缓存完全刷新
log_info "正在重启本地 kubelet 服务..."
systemctl daemon-reload && systemctl restart kubelet

# ==============================================================================
# 第六步:验证修复结果
# ==============================================================================
log_info "第六步:进入验证阶段..."
log_warn "等待 30 秒留给 API Server 启动和响应..."
sleep 30

log_info "1. 检查 kube-system 命名空间下的 Pod 状态:"
kubectl get pods -n kube-system || log_warn "当前 API Server 响应可能较慢,请稍后手动执行 kubectl get pods -n kube-system 确认"

log_info "2. 再次检查证书有效期(请核对 RESIDUAL TIME 是否恢复为 364d):"
kubeadm certs check-expiration

log_info "=================================================="
log_info " 脚本执行完毕!"
log_info " 提示:历史备份目录存于: ${BACKUP_DIR}"
log_info "=================================================="

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容