kubeadm方式部署单节点k8s

推荐工具:kubeadm

它是 Kubernetes 官方发布的部署工具,社区支持最好,文档最全,流程清晰可控。适合单节点 CentOS 7​ 的环境。

部署前提(环境)

  • 一台 CentOS 7.x​ 服务器

  • 已安装 Docker

  • root​ 权限操作

单节点 Kubernetes 集群部署文档(基于 kubeadm)

如果有残留!

第 1 步:彻底清理旧环境

避免与之前 kubeasz 的残留冲突。

复制代码
# 1. 重置任何已有的 kubeadm 安装
kubeadm reset -f

# 2. 清理相关文件
rm -rf $HOME/.kube
rm -rf /etc/cni/net.d

# 3. 清理 iptables 规则
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

# 4. 重启 Docker(确保干净的网络环境)
systemctl restart docker

第 2 步:安装必备组件

复制代码
# 1. 配置 Kubernetes 的 yum 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

# 2. 安装 kubeadm、kubelet、kubectl(指定与您需求匹配的版本 >1.24)
# 这里安装 1.28.x 稳定版(1.24之后的版本,且社区支持成熟)
yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0 --disableexcludes=kubernetes

# 3. 设置 kubelet 开机自启(先不启动,等 kubeadm init 后再启动)
systemctl enable kubelet

第 3 步:配置容器运行时

Kubernetes 1.24+ 已移除对 Docker 的直接支持,需要安装 cri-dockerd ​ 或使用 containerd 。这里选择更稳定的 containerd

复制代码
# 1. 安装 containerd
yum install -y containerd.io

# 2. 生成默认配置
containerd config default > /etc/containerd/config.toml

# 3. 将配置中的 sandbox 镜像替换为国内可访问的地址
sed -i 's|registry.k8s.io/pause|registry.aliyuncs.com/google_containers/pause|g' /etc/containerd/config.toml

# 4. 将 cri 插件中的 systemd_cgroup 设置为 true(对于使用 systemd 的系统很重要)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# 5. 启动并设置开机自启
systemctl restart containerd
systemctl enable containerd

这里我遇到了问题:

CentOS 7 的默认仓库中没有 containerd.io。这需要从 Docker 官方仓库安装。

使用阿里云镜像的 Docker 仓库,然后再配置。

复制代码
# 1. 卸载旧版本 Docker(如果已安装且不需要保留)
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# 2. 安装依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2

# 3. 添加阿里云 Docker CE 仓库(国内镜像,速度快)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 4. 安装 containerd
yum install -y containerd.io

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

# 6. 替换 sandbox 镜像为国内源
sed -i 's|registry.k8s.io/pause|registry.aliyuncs.com/google_containers/pause|g' /etc/containerd/config.toml

# 7. 启用 systemd cgroup 驱动
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# 8. 启动并设置开机自启
systemctl start containerd
systemctl enable containerd

安装后验证

复制代码
# 检查 containerd 版本
containerd --version

# 检查服务状态
systemctl status containerd

# 检查 containerd 运行时是否正常
ctr version

第 4 步:初始化前系统检查

确保环境干净并符合要求

复制代码
# 1. 关闭并禁用防火墙(避免端口冲突)
systemctl stop firewalld && systemctl disable firewalld

# 2. 关闭 SELinux(简化权限问题)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 3. 关闭 swap(Kubernetes 要求)
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

# 4. 配置网络转发和桥接流量
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

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

第 5 步:初始化单节点控制平面

安装好 containerd 后,使用以下命令将当前节点初始化为 Kubernetes 控制平面(Master)

复制代码
# 获取本机内网 IP(用于 API Server 通告地址)
NODE_IP=$(hostname -I | awk '{print $1}')

# 初始化命令(重要:所有参数请勿随意更改)
kubeadm init \
  --apiserver-advertise-address=$NODE_IP \
  --pod-network-cidr=10.244.0.0/16 \
  --image-repository=registry.aliyuncs.com/google_containers \
  --kubernetes-version=v1.28.0 \
  --cri-socket=unix:///run/containerd/containerd.sock \
  --ignore-preflight-errors=all  # 忽略所有预检错误(在已知环境干净时使用)

初始化过程需要 1-3 分钟 。成功后,终端尾部会显示:

第 6 步:配置 kubectl 命令行工具

如果您是以普通用户(非root)登录的,执行以下三条命令:

复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果您是以 root 用户登录的,执行这一条命令即可:

复制代码
export KUBECONFIG=/etc/kubernetes/admin.conf
# 建议也将配置永久写入文件
echo export KUBECONFIG=/etc/kubernetes/admin.conf >> ~/.bashrc
source ~/.bashrc

验证配置 :执行 kubectl get nodes,您应该会看到当前节点,状态为 NotReady(因为网络插件还没装)。

第 7 步:安装 Pod 网络插件

这是必须的一步。没有网络插件,集群内的 Pod 无法相互通信。

请任选以下一种网络插件安装:

  • 推荐:Flannel​ (最简单稳定)

    复制代码
    kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
  • 备选:Calico​ (功能更强大)

    复制代码
    kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

允许在 Master 节点上调度 Pod(单节点集群必需)

默认情况下,Master 节点不允许运行普通的工作负载 Pod。由于我们是单节点集群,必须解除这个限制,否则您部署的应用将无法运行。

复制代码
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

执行此命令后,Master 节点就可以像 Worker 节点一样运行 Pod 了。

最终验证

完成以上所有步骤后,运行以下命令进行最终健康检查:

复制代码
echo "=== 1. 节点状态(应为 Ready)==="
kubectl get nodes

echo -e "\n=== 2. 核心系统 Pod 状态(所有应为 Running)==="
kubectl get pods -n kube-system

echo -e "\n=== 3. 集群信息 ==="
kubectl cluster-info
相关推荐
十月南城2 小时前
Kubernetes入门地图——核心对象、网络与存储的抽象关系与心智模型
网络·容器·kubernetes
Java程序员威哥2 小时前
Java应用容器化最佳实践:Docker镜像构建+K8s滚动更新(生产级完整模板+避坑指南)
java·开发语言·后端·python·docker·kubernetes·c#
追光的孩子3 小时前
window雷池WAF安装运行文档
云原生·eureka
不做码农好多年,该何去何从。3 小时前
云原生k8s(一)
云原生·容器·kubernetes
Y.O.U..4 小时前
Kubernetes-PV(PersistentVolume)和PVC(PersistentVolumeClaim)
云原生·容器·kubernetes
Curvatureflight4 小时前
Kubernetes完全指南:从集群搭建到生产部署
云原生·容器·kubernetes
努力也学不会java4 小时前
【Spring Cloud】环境和工程基本搭建
java·人工智能·后端·spring·spring cloud·容器
博思云为4 小时前
企业级智能PPT生成:Amazon云+AI驱动,全流程自动化提效
人工智能·语言模型·云原生·数据挖掘·云计算·语音识别·aws
laozhoy15 小时前
K8s基础命令
云原生·容器·kubernetes