Kubernetes 工作节点的安装脚本

适用于中国大陆环境下的 Ubuntu 22.04 系统:

 

 

#!/bin/bash

# Kubernetes 工作节点安装脚本 (适用于 Ubuntu 22.04,中国大陆环境)
# 作者:CodeBuddy
# 版本:1.0
# 使用方法:sudo bash install_k8s_worker.sh <加入集群的命令>
# 示例:sudo bash install_k8s_worker.sh "kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:1234..."

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

# 检查是否以 root 权限运行
if [ "$EUID" -ne 0 ]; then
  echo -e "${RED}请使用 root 权限运行此脚本 (sudo bash install_k8s_worker.sh)${NC}"
  exit 1
fi

# 检查参数
if [ $# -eq 0 ]; then
  echo -e "${RED}错误: 缺少加入集群的命令${NC}"
  echo -e "${YELLOW}用法: sudo bash install_k8s_worker.sh \"kubeadm join ...\""
  echo -e "请从主节点获取加入命令,通常在 kubeadm init 输出中${NC}"
  exit 1
fi

# 保存加入命令
JOIN_COMMAND="$1"

# 参数设置 - 可根据需要修改
K8S_VERSION="1.26.1"           # Kubernetes 版本,应与控制平面节点一致
CONTAINER_RUNTIME="containerd"  # 容器运行时 (containerd 或 docker)
NODE_NAME=$(hostname -s)       # 节点名称
NODE_IP=$(hostname -I | awk '{print $1}')  # 节点 IP

# 日志函数
log() {
  echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}"
}

warn() {
  echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] 警告: $1${NC}"
}

error() {
  echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] 错误: $1${NC}"
  exit 1
}

# 系统准备
prepare_system() {
  log "准备系统环境..."
  
  # 更新软件包列表
  apt update -y || error "无法更新软件包列表"
  
  # 安装必要的软件包
  apt install -y apt-transport-https ca-certificates curl gnupg lsb-release \
    ntp ntpdate ipvsadm ipset jq sysstat conntrack socat || error "安装基础软件包失败"
  
  # 禁用交换分区
  log "禁用交换分区..."
  swapoff -a
  sed -i '/swap/s/^/#/' /etc/fstab
  
  # 配置内核参数
  log "配置内核参数..."
  cat > /etc/modules-load.d/k8s.conf << EOF
overlay
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF

  # 加载内核模块
  modprobe overlay
  modprobe br_netfilter
  modprobe ip_vs
  modprobe ip_vs_rr
  modprobe ip_vs_wrr
  modprobe ip_vs_sh
  modprobe nf_conntrack
  
  # 设置系统参数
  cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
vm.swappiness                       = 0
vm.overcommit_memory                = 1
fs.inotify.max_user_watches         = 524288
fs.file-max                         = 6553600
fs.inotify.max_user_instances       = 8192
net.ipv4.tcp_tw_reuse               = 1
net.ipv4.tcp_fin_timeout            = 30
net.ipv4.ip_local_port_range        = 1024 65535
net.core.somaxconn                  = 32768
EOF
  
  sysctl --system || error "应用系统参数失败"
  
  # 设置时区
  timedatectl set-timezone Asia/Shanghai
  
  # 同步时间
  ntpdate ntp.aliyun.com || warn "NTP 时间同步失败,请手动检查系统时间"
  
  log "系统环境准备完成"
}

# 安装容器运行时
install_container_runtime() {
  log "安装 containerd 容器运行时..."
  
  # 添加阿里云 Docker 镜像源
  mkdir -p /etc/apt/keyrings
  curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  
  echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
    $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
  
  apt update -y
  apt install -y containerd.io || error "安装 containerd 失败"
  
  # 配置 containerd
  mkdir -p /etc/containerd
  containerd config default | sed 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/g' > /etc/containerd/config.toml
  
  # 修改 containerd 配置,使用 systemd cgroup 驱动
  sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
  
  # 配置镜像加速
  sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml
  
  # 添加阿里云镜像加速器
  mkdir -p /etc/containerd/certs.d/docker.io
  cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"

[host."https://registry-1.docker.io"]
  capabilities = ["pull", "resolve"]
  
[host."https://registry.aliyuncs.com"]
  capabilities = ["pull", "resolve"]
  skip_verify = true
EOF
  
  # 重启 containerd
  systemctl daemon-reload
  systemctl enable containerd
  systemctl restart containerd
  
  log "容器运行时安装完成"
}

# 安装 Kubernetes 组件
install_kubernetes() {
  log "安装 Kubernetes ${K8S_VERSION} 组件..."
  
  # 添加阿里云 Kubernetes 镜像源
  curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
  cat > /etc/apt/sources.list.d/kubernetes.list << EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
  
  apt update -y
  
  # 安装指定版本的 Kubernetes 组件
  apt install -y kubelet=${K8S_VERSION}-00 kubeadm=${K8S_VERSION}-00 kubectl=${K8S_VERSION}-00 || error "安装 Kubernetes 组件失败"
  
  # 锁定版本,防止意外升级
  apt-mark hold kubelet kubeadm kubectl
  
  # 配置 kubelet
  mkdir -p /etc/systemd/system/kubelet.service.d
  cat > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf << EOF
# 注意:此配置由 kubeadm 初始化后会被覆盖
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
Environment="KUBELET_EXTRA_ARGS=--node-ip=${NODE_IP}"
ExecStart=
ExecStart=/usr/bin/kubelet \$KUBELET_KUBECONFIG_ARGS \$KUBELET_CONFIG_ARGS \$KUBELET_SYSTEM_PODS_ARGS \$KUBELET_NETWORK_ARGS \$KUBELET_DNS_ARGS \$KUBELET_AUTHZ_ARGS \$KUBELET_EXTRA_ARGS
EOF
  
  systemctl daemon-reload
  systemctl enable kubelet
  
  log "Kubernetes 组件安装完成"
}

# 加入 Kubernetes 集群
join_kubernetes_cluster() {
  log "加入 Kubernetes 集群..."
  
  # 预先拉取镜像
  log "预先拉取 Kubernetes 镜像..."
  kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers || warn "拉取镜像失败,将在加入集群时自动重试"
  
  # 执行加入命令
  log "执行加入集群命令..."
  eval "$JOIN_COMMAND" || error "加入集群失败"
  
  log "节点已成功加入集群"
}

# 安装常用工具
install_tools() {
  log "安装常用工具..."
  
  # 安装 kubectl 自动补全
  apt install -y bash-completion
  kubectl completion bash > /etc/bash_completion.d/kubectl
  
  # 安装监控工具
  apt install -y htop iotop iftop
  
  log "工具安装完成"
}

# 显示节点信息
show_node_info() {
  log "Kubernetes 工作节点安装完成!"
  echo -e "${GREEN}============================================================${NC}"
  echo -e "${GREEN}Kubernetes 工作节点已成功加入集群!${NC}"
  echo -e "${GREEN}============================================================${NC}"
  echo -e "${YELLOW}节点信息:${NC}"
  echo -e "  节点名称: ${NODE_NAME}"
  echo -e "  节点 IP: ${NODE_IP}"
  echo -e "  Kubernetes 版本: ${K8S_VERSION}"
  echo -e "${GREEN}============================================================${NC}"
  echo -e "${YELLOW}验证节点状态:${NC}"
  echo -e "  在控制平面节点上运行: kubectl get nodes"
  echo -e "${GREEN}============================================================${NC}"
}

# 主函数
main() {
  log "开始安装 Kubernetes 工作节点..."
  
  prepare_system
  install_container_runtime
  install_kubernetes
  join_kubernetes_cluster
  install_tools
  
  # 显示节点信息
  show_node_info
}

# 执行主函数
main

 

工作节点脚本参数详细说明

  1. K8S_VERSION="1.26.1"

    • 指定要安装的 Kubernetes 版本
    • 必须与控制平面节点版本一致,否则可能导致兼容性问题
    • 可以根据控制平面节点的版本进行调整
  2. CONTAINER_RUNTIME="containerd"

    • 容器运行时,与控制平面节点保持一致
    • 目前 Kubernetes 推荐使用 containerd 作为容器运行时
  3. NODE_NAME=$(hostname -s)

    • 自动获取当前主机名作为节点名称
    • 可以手动设置为特定名称,但需确保集群内唯一
  4. NODE_IP=$(hostname -I | awk '{print $1}')

    • 自动获取节点 IP 地址
    • 如果服务器有多个 IP,可能需要手动指定正确的 IP
  5. JOIN_COMMAND

    • 从命令行参数获取的加入集群命令
    • 这个命令应该从控制平面节点的 kubeadm init 输出中获取

脚本功能说明

  1. 系统准备 (prepare_system)

    • 更新系统软件包
    • 安装必要的依赖包
    • 禁用交换分区(Kubernetes 要求)
    • 配置内核参数和模块
    • 设置系统时区和时间同步
  2. 安装容器运行时 (install_container_runtime)

    • 安装 containerd 作为容器运行时
    • 配置 containerd 使用阿里云镜像加速
    • 配置 systemd cgroup 驱动
  3. 安装 Kubernetes 组件 (install_kubernetes)

    • 添加阿里云 Kubernetes 镜像源
    • 安装 kubelet、kubeadm、kubectl 组件
    • 锁定版本防止意外升级
    • 配置 kubelet 服务
  4. 加入 Kubernetes 集群 (join_kubernetes_cluster)

    • 预先拉取所需镜像
    • 执行加入集群命令
  5. 安装常用工具 (install_tools)

    • 安装 kubectl 自动补全
    • 安装系统监控工具
  6. 显示节点信息 (show_node_info)

    • 显示节点配置信息
    • 提供验证节点状态的命令

使用方法

  1. 首先在控制平面节点上获取加入集群的命令:

    kubeadm token create --print-join-command
    
  2. 将脚本保存为 install_k8s_worker.sh

  3. 赋予执行权限:

    chmod +x install_k8s_worker.sh
    
  4. 以 root 权限执行,并传入加入命令:

    sudo bash install_k8s_worker.sh "kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:1234..."
    

注意事项

  1. 版本一致性:确保工作节点的 Kubernetes 版本与控制平面节点完全一致。

  2. 网络连通性:工作节点必须能够访问控制平面节点的 API 服务器(通常是 6443 端口)。

  3. 硬件要求:工作节点至少需要 2 CPU 核心和 2GB 内存。

  4. 操作系统要求:脚本针对 Ubuntu 22.04 设计,其他版本可能需要调整。

  5. 加入令牌有效期:默认情况下,kubeadm 生成的令牌有效期为 24 小时,如果过期需要重新生成。

  6. 节点标签:如果需要为节点添加特定标签,可以在加入集群后使用以下命令:

    kubectl label nodes <节点名> key=value
    

这个工作节点安装脚本与之前的控制平面节点脚本配合使用,可以帮助您在中国大陆环境下快速搭建 Kubernetes 集群。

 

posted @ 2025-09-20 16:23  若水如引  阅读(12)  评论(0)    收藏  举报