记一次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命令拿到新节点上去执行就可以。

相关推荐
Linux-18748 小时前
分布式链路追踪系统之skywalking java agent 的使用、skywalking web界面简介
云原生·skywalking·分布式链路追踪系统·应用程序性能监控·halo博客系统·skywalking java agent·skywalking web 简介
952369 小时前
Docker - 基础
运维·后端·docker·容器
Code_Ignis10 小时前
docker国内可用源(持续维护)
运维·docker·容器
heimeiyingwang16 小时前
【架构实战】云原生架构:容器化与Kubernetes落地之路
云原生·架构·kubernetes
道影子18 小时前
阴阳引力多维基元:超越二进制的计算革命
人工智能·深度学习·微服务·云原生·架构
运维大师18 小时前
【K8S 运维实战】15-链路追踪Jaeger与OTel
运维·容器·kubernetes
zerwave19 小时前
深入理解 Docker 的“层”(Layer)
docker·容器
霁月的小屋19 小时前
Docker 工程化实践(二):理解镜像分层与容器文件系统
运维·docker·容器
潘正翔20 小时前
k8s集群命令使用
linux·运维·docker·云原生·容器·kubernetes
码上上班1 天前
docker课程
java·docker·容器