记一次K8S增加新节点

由于K8S的节点资源不够用了,需要增加一个新节点,这里记下过程,分享给大家。

1、系统设置并更新

先设置好机器名,再更新系统

bash 复制代码
echo "tmp-k8s-nd3" > /etc/hostname
hostname tmp-k8s-nd3
apt update
apt upgrade
reboot

当然,还要整个集群里hosts文件里加上新机器的域名解析

2、设置免登录

bash 复制代码
ssh-copy-id tmp-k8s-nd3

3、 安装时间同步

并且设置内部一台机器做时间服务器

bash 复制代码
 apt install chronyd

4、安装Kubelet和containerd

就一个自动化安装脚本:

bash 复制代码
root@tmp-k8s-nd3:~# cat install-k8s-aliyun.sh
#!/bin/bash
# =============================================================================
# Kubernetes 节点初始化脚本 (v1.35.1)
# 功能: 在所有节点(Master/Worker)上执行,用于安装 containerd 和 kubeadm/kubelet
# 支持: Ubuntu 22.04+, Debian 12+, CentOS Stream 9+
# 注意: 请使用 root 用户或具有 sudo 权限的用户执行此脚本
# =============================================================================

set -e

K8S_VERSION="1.35.1"
KUBE_VERSION="1.35.1-*"
CRIO_VERSION="1.35"

# 国际化配置
export DEBIAN_FRONTEND=noninteractive

echo "=== [1/7] 系统环境初始化 ==="

# 1. 加载内核模块 (overlay & br_netfilter)
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter

# 2. 配置内核参数 (启用IP转发与桥接过滤)
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
sysctl --system

# 3. 禁用Swap (Kubernetes强制要求)
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

echo "=== [2/7] 安装 containerd 运行时 ==="
# 1. 安装依赖
apt-get update -y
apt-get install -y ca-certificates curl gnupg lsb-release

# 2. 添加Docker官方GPG密钥和APT源 (用于安装containerd)
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

# 注: 此处基于Ubuntu 22.04 (Jammy)为例;对于Debian等系统,需根据实际情况调整 $(lsb_release -cs)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

apt-get update -y
apt-get install -y containerd.io

# 3. 配置 containerd
containerd config default > /etc/containerd/config.toml

#   - 使用 systemd cgroup 驱动 (与宿主机一致)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
#   - 修改 sandbox (pause) 镜像地址为国内可访问
sed -i 's#registry.k8s.io/pause#registry.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml

# 4. 启动 containerd
systemctl daemon-reload
systemctl enable --now containerd

echo "=== [3/7] 安装 Kubernetes 组件 (kubeadm/kubelet/kubectl) ==="
# 1. 添加 Kubernetes APT 仓库 (新版使用 pkgs.k8s.io)
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
chmod 644 /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update

# 2. 安装并锁定版本
apt-get install -y kubeadm=${KUBE_VERSION} kubelet=${KUBE_VERSION} kubectl=${KUBE_VERSION}
apt-mark hold kubeadm kubelet kubectl

echo "=== [4/7] 配置 kubelet 与 crictl ==="

# 1. 生成 crictl 配置 (使 crictl 可以直接调用 containerd)
cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

# 2. 启动 kubelet (此时未初始化集群,会处于 CrashLoopBackOff,属于正常现象)
systemctl enable --now kubelet

# 可选组件:安装nerdctl (提供类似Docker的命令行体验,便于调试)
echo "=== [5/7] 可选: 安装nerdctl (类似docker) ==="
if command -v nerdctl &> /dev/null; then
    echo "nerdctl 已存在,跳过安装。"
else
    NERDCTL_VERSION="2.2.0"
    wget -q "https://github.com/containerd/nerdctl/releases/download/v${NERDCTL_VERSION}/nerdctl-${NERDCTL_VERSION}-linux-amd64.tar.gz" -O /tmp/nerdctl.tar.gz
    tar -C /usr/local/bin -xzf /tmp/nerdctl.tar.gz
    chmod +x /usr/local/bin/nerdctl
fi

echo "=== [6/7] 验证安装 ==="

echo "---- Containerd 状态: ----"
systemctl is-active containerd && echo "containerd 正在运行"
echo "---- Kubernetes 组件版本: ----"
kubeadm version
kubelet --version

echo "---- 镜像拉取测试 (nerdctl pull hello-world) ----"
nerdctl pull hello-world >/dev/null 2>&1 && echo "镜像拉取成功,containerd工作正常。"

echo "=== [7/7] 后续操作提示 ==="
echo "----------------------------------------------------------------"
echo "节点基础环境已准备就绪!"
echo "1. 若此节点是 **Master**,请执行:"
echo "   sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository=registry.aliyuncs.com/google_containers"
echo ""
echo "2. 若此节点是 **Worker**,请使用 Master 初始化后输出的 'kubeadm join' 命令加入集群。"
echo ""
echo "3. 初始化后,Master 需要配置 kubectl:"
echo "   mkdir -p \$HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf \$HOME/.kube/config && sudo chown \$(id -u):\$(id -g) \$HOME/.kube/config"
echo ""
echo "4. 为防止版本偏差,已将 kubeadm/kubelet/kubectl 设置为 apt-hold 状态。"
echo "----------------------------------------------------------------"

5、新节点加入到集群

到master上执行:

bash 复制代码
kubeadm token create --print-join-command

把得到的join命令拿到新节点上去执行就可以。

相关推荐
r-t-H12 小时前
KVM虚拟化与Docker基础实践-第三章
linux·运维·nginx·docker·容器
仙柒41521 小时前
控制平面组件和节点组件
运维·容器·kubernetes
Niliuershangba1 天前
Docker Desktop 部署 ChestnutCMS 全流程:从零搭建企业级 CMS 开发环境
运维·docker·容器
wb1891 天前
Kubernetes服务优化
云原生·容器·kubernetes
码点滴1 天前
Workload 自动化进化论:从手动运维到 AI 驱动的 Kubernetes 智能管控
运维·人工智能·kubernetes·自动化·workload
darkdragonking1 天前
Docker(五)OpenEuler22.03 安装docker ce、排坑
运维·docker·容器
Waay1 天前
图文详解|K8s Pod内部结构
docker·云原生·kubernetes
码点滴1 天前
CRI-O选型与容器运行时标准
开发语言·人工智能·架构·kubernetes·cri-o
openFuyao1 天前
以开源之力,突破多样化算力困局——openFuyao开源一周年背后的故事
人工智能·云原生·开源·openfuyao·多样化算力·集群软件