K8s系列第二篇:CentOS7/Ubuntu 一键搭建 K8s 集群(kubeadm 完整版)

前言:在上一篇文章中,我们已经搞懂了K8s的核心概念和架构,知道了Master节点是"大脑"、Node节点是"手脚",也了解了Pod、Deployment等基础对象。这一篇,我们正式进入实战环节------用kubeadm一键搭建K8s集群。

很多小白入门K8s时,最头疼的就是"环境搭建",网上很多教程要么步骤残缺、要么版本不兼容,导致折腾半天还是搭建失败。本文专门针对小白,整理了CentOS7和Ubuntu两个主流系统的完整搭建流程,全程命令可复制,每一步都有详细注释,还包含常见问题排错,确保你能一次搭建成功。

适合人群:刚入门K8s、想亲手搭建集群的小白,运维/开发人员(用于测试环境快速部署)。搭建完成后,你将拥有一个可正常使用的K8s集群,为后续学习Pod、Deployment等实战内容打下基础。

前置说明:本文搭建的是"单Master节点+1个Node节点"的集群(入门足够用),如果需要多Node节点,只需重复Node节点的部署步骤即可;所有命令均需以root用户执行(或加sudo)。

一、搭建前准备(必做)

1.1 服务器配置要求(最低标准)

无论是CentOS7还是Ubuntu,服务器配置需满足以下条件(虚拟机、云服务器均可):

  1. CPU:至少2核(单核会导致kubeadm初始化失败);

  2. 内存:至少2GB(推荐4GB,内存不足会导致容器启动异常);

  3. 硬盘:至少20GB(用于存储镜像、容器数据);

  4. 系统版本:CentOS7(7.5及以上)、Ubuntu(20.04 LTS,最稳定);

  5. 网络:所有节点(Master+Node)能互相ping通,且能访问外网(需要下载镜像);

  6. 禁用Swap:K8s要求必须禁用Swap,否则会影响集群稳定性。

1.2 服务器规划(示例)

本文以2台服务器为例,规划如下(可根据自己的服务器调整IP):

节点类型 IP地址 主机名 系统
Master节点 192.168.1.100 k8s-master CentOS7/Ubuntu20.04
Node节点 192.168.1.101 k8s-node1 CentOS7/Ubuntu20.04

1.3 通用前置操作(所有节点都要执行)

以下操作无论CentOS7还是Ubuntu,所有节点(Master+Node)都必须执行,一步都不能少!

1.3.1 关闭防火墙(避免端口被拦截)

CentOS7命令:

bash 复制代码
# 关闭防火墙
systemctl stop firewalld
# 禁止防火墙开机自启
systemctl disable firewalld
# 查看防火墙状态(确认已关闭)
systemctl status firewalld

Ubuntu命令:

bash 复制代码
# 关闭防火墙
ufw disable
# 查看防火墙状态(确认已关闭)
ufw status

1.3.2 禁用Swap(K8s强制要求)

bash 复制代码
# 临时禁用Swap(重启后失效)
swapoff -a
# 永久禁用Swap(修改配置文件)
sed -i '/swap/s/^/#/' /etc/fstab
# 查看Swap状态(确认已禁用,Swap一行显示0)
free -h

1.3.3 配置主机名和hosts映射

  1. 配置主机名(Master和Node节点分别执行对应命令):
bash 复制代码
# Master节点配置主机名
hostnamectl set-hostname k8s-master
# Node节点配置主机名(如果有多个Node,依次改为k8s-node2、k8s-node3...)
hostnamectl set-hostname k8s-node1
  1. 配置hosts映射(所有节点执行,将IP和主机名对应起来):
bash 复制代码
# 编辑hosts文件
vi /etc/hosts
# 在文件末尾添加以下内容(替换成自己的服务器IP和主机名)
192.168.1.100 k8s-master
192.168.1.101 k8s-node1
  1. 测试hosts映射是否生效(所有节点执行):
bash 复制代码
ping k8s-master -c 3  # 能ping通说明配置成功
ping k8s-node1 -c 3

1.3.4 配置内核参数(开启IP转发,K8s网络需要)

bash 复制代码
# 临时配置内核参数
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# 生效内核参数
sysctl -p

1.3.5 配置时间同步(避免节点时间不一致导致集群异常)

CentOS7命令:

bash 复制代码
# 安装时间同步工具
yum install -y ntpdate
# 同步阿里云时间服务器
ntpdate ntp.aliyun.com
# 设置定时同步(每小时同步一次)
echo "0 */1 * * * ntpdate ntp.aliyun.com" >> /var/spool/cron/root

Ubuntu命令:

bash 复制代码
# 安装时间同步工具
apt update && apt install -y ntpdate
# 同步阿里云时间服务器
ntpdate ntp.aliyun.com
# 设置定时同步(每小时同步一次)
echo "0 */1 * * * ntpdate ntp.aliyun.com" >> /var/spool/cron/crontabs/root

二、安装容器运行时(所有节点执行)

K8s需要容器运行时来运行容器,本文选择最常用的Docker(后续系列会讲containerd,小白先从Docker入手),所有节点(Master+Node)都要安装。

2.1 CentOS7 安装Docker

bash 复制代码
# 1. 安装Docker依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 2. 设置Docker镜像源(阿里云,下载更快)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3. 安装Docker CE(社区版,免费)
yum install -y docker-ce docker-ce-cli containerd.io
# 4. 启动Docker并设置开机自启
systemctl start docker
systemctl enable docker
# 5. 查看Docker版本(确认安装成功)
docker --version

2.2 Ubuntu 安装Docker

bash 复制代码
# 1. 更新apt源
apt update
# 2. 安装Docker依赖
apt install -y apt-transport-https ca-certificates curl software-properties-common
# 3. 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
# 4. 设置Docker镜像源(阿里云)
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 5. 再次更新apt源
apt update
# 6. 安装Docker CE
apt install -y docker-ce docker-ce-cli containerd.io
# 7. 启动Docker并设置开机自启
systemctl start docker
systemctl enable docker
# 8. 查看Docker版本(确认安装成功)
docker --version

2.3 配置Docker镜像加速(可选,推荐)

默认Docker镜像源在国外,下载速度较慢,配置阿里云镜像加速,可大幅提升镜像下载速度(所有节点执行):

bash 复制代码
# 创建Docker配置目录
mkdir -p /etc/docker
# 配置镜像加速(阿里云,直接复制执行)
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://docker.mirrors.aliyun.com"]
}
EOF
# 重启Docker,使配置生效
systemctl daemon-reload
systemctl restart docker

三、安装kubeadm、kubelet、kubectl(所有节点执行)

kubeadm:用于快速初始化K8s集群;

kubelet:运行在每个Node节点上,负责管理容器;

kubectl:K8s的命令行工具,用于操作集群。

三者版本必须一致,本文选择稳定版v1.27.0(兼容性好,适合小白)。

3.1 CentOS7 安装

bash 复制代码
# 1. 添加K8s阿里云源
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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
# 2. 安装kubeadm、kubelet、kubectl(指定版本v1.27.0)
yum install -y kubelet-1.27.0 kubeadm-1.27.0 kubectl-1.27.0 --disableexcludes=kubernetes
# 3. 启动kubelet并设置开机自启
systemctl start kubelet
systemctl enable kubelet

3.2 Ubuntu 安装

bash 复制代码
# 1. 添加K8s阿里云源
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
# 2. 更新apt源
apt update
# 3. 安装kubeadm、kubelet、kubectl(指定版本v1.27.0)
apt install -y kubelet=1.27.0-00 kubeadm=1.27.0-00 kubectl=1.27.0-00
# 4. 启动kubelet并设置开机自启
systemctl start kubelet
systemctl enable kubelet

3.3 验证安装(所有节点执行)

bash 复制代码
# 查看kubeadm版本
kubeadm version
# 查看kubectl版本
kubectl version --client

如果能正常显示版本号(v1.27.0),说明安装成功。

四、初始化Master节点(仅Master节点执行)

这一步是搭建集群的核心,仅在Master节点执行,主要作用是初始化控制平面(Master组件),生成Node节点加入集群的令牌。

4.1 初始化命令(直接复制执行)

bash 复制代码
kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \  # 阿里云镜像仓库(避免国外镜像下载失败)
--kubernetes-version v1.27.0 \  # K8s版本,和前面安装的一致
--pod-network-cidr=10.244.0.0/16 \  # Pod网络网段(固定,后续网络插件需要用到)
--service-cidr=10.96.0.0/12 \  # Service网络网段(固定)
--apiserver-advertise-address=192.168.1.100  # Master节点的IP(替换成自己的Master IP)

4.2 初始化成功提示(关键信息保存好)

初始化成功后,会出现如下提示(关键命令和令牌一定要保存,Node节点加入集群需要用到):

bash 复制代码
# 1. 配置kubectl(Master节点执行,用于操作集群)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 2. Node节点加入集群的命令(关键!复制保存,后续Node节点执行)
kubeadm join 192.168.1.100:6443 --token xxxxxxxx.xxxxxxxxxxxx \
  --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# 3. 如果忘记令牌,可在Master节点执行以下命令重新生成
kubeadm token create --print-join-command

注意:如果初始化失败,执行kubeadm reset重置后,重新执行初始化命令即可。

4.3 验证Master节点状态(Master节点执行)

bash 复制代码
# 查看集群节点(此时只有Master节点,状态为NotReady,因为还没安装网络插件)
kubectl get nodes
# 查看Master组件状态(所有组件状态为Running,说明Master节点正常)
kubectl get pods -n kube-system

此时Master节点状态为NotReady,是正常现象,因为还没有安装网络插件,下一步安装网络插件后就会变成Ready。

五、安装网络插件(仅Master节点执行)

网络插件是K8s集群的核心,负责Pod之间、Pod与外部的网络通信,本文选择最常用、最稳定的Flannel(小白首选),也可以选择Calico(后续会补充)。

bash 复制代码
# 下载Flannel配置文件(阿里云源,避免国外源下载失败)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
# 查看Flannel容器状态(状态为Running,说明安装成功)
kubectl get pods -n kube-system | grep flannel
# 再次查看Master节点状态(此时状态变为Ready)
kubectl get nodes

如果Flannel容器一直处于Pending状态,大概率是镜像下载失败,可手动拉取镜像(Master节点执行):

bash 复制代码
docker pull registry.aliyuncs.com/google_containers/flannel:v0.22.0
# 重新应用Flannel配置
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml

六、Node节点加入集群(仅Node节点执行)

这一步仅在Node节点执行,使用Master节点初始化成功后生成的"加入命令",将Node节点加入集群。

6.1 执行加入命令

复制Master节点初始化成功后生成的加入命令(每个人的令牌不同,以自己的为准),在Node节点执行:

bash 复制代码
kubeadm join 192.168.1.100:6443 --token xxxxxxxx.xxxxxxxxxxxx \
  --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

如果忘记令牌,在Master节点执行以下命令重新生成:

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

6.2 验证Node节点加入结果(Master节点执行)

bash 复制代码
# 查看集群所有节点(两个节点状态都为Ready,说明集群搭建成功)
kubectl get nodes

输出结果如下(状态为Ready即成功):

bash 复制代码
NAME         STATUS   ROLES           AGE     VERSION
k8s-master   Ready    control-plane   10m     v1.27.0
k8s-node1    Ready    <none>          5m      v1.27.0

七、集群测试(验证集群是否可用)

搭建完成后,我们部署一个简单的Nginx Pod,测试集群是否能正常运行容器。

bash 复制代码
# 1. 部署Nginx Pod(Master节点执行)
kubectl create deployment nginx-test --image=nginx:1.24
# 2. 查看Pod状态(状态为Running,说明容器正常运行)
kubectl get pods
# 3. 查看Pod详情(可选)
kubectl describe pod nginx-test-xxxxxxx
# 4. 删除测试Pod(测试完成后可删除)
kubectl delete deployment nginx-test

如果Pod能正常启动(状态为Running),说明K8s集群搭建成功,可以正常使用了!

八、常见问题排错(小白必看)

  1. 问题1:kubeadm初始化失败,提示"insufficient memory"原因:服务器内存不足(低于2GB);解决:升级服务器内存(至少2GB),或关闭不必要的进程释放内存。

  2. 问题2:初始化失败,提示"Swap is enabled"原因:Swap未禁用;解决:重新执行"1.3.2 禁用Swap"的命令,确保Swap已禁用,然后执行kubeadm reset重置,再重新初始化。

  3. 问题3:Node节点加入集群失败,提示"connection refused"原因:Master节点防火墙未关闭,或Master节点IP错误;解决:检查Master节点防火墙是否关闭,确认加入命令中的Master IP正确,且Node节点能ping通Master节点。

  4. 问题4:节点状态一直为NotReady原因:网络插件未安装,或Flannel容器未正常启动;解决:重新安装Flannel网络插件,或手动拉取Flannel镜像(参考5.1步骤)。

  5. 问题5:镜像下载失败(超时)原因:国外镜像源访问不畅;解决:配置Docker镜像加速(参考2.3步骤),或手动拉取镜像(替换成阿里云镜像仓库)。

九、总结

本文详细讲解了用kubeadm一键搭建K8s集群的完整流程,涵盖CentOS7和Ubuntu两个主流系统,从前置准备、容器运行时安装,到Master节点初始化、网络插件安装、Node节点加入,每一步都有详细命令和注释,小白也能轻松上手。

重点记住3点:

  1. 所有节点必须禁用Swap、关闭防火墙、配置hosts映射,这是搭建成功的前提;

  2. kubeadm、kubelet、kubectl版本必须一致,否则会出现兼容性问题;

  3. 网络插件是集群正常运行的关键,Flannel是小白首选,安装后节点状态会变为Ready。

下一篇文章,我们将学习K8s的核心对象------《K8s 核心对象:Pod 从入门到实战(yaml 详解+常用命令)》,手把手教你操作Pod,敬请关注!

最后,如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注,后续会持续更新K8s系列实战文章,从入门到精通,带你轻松搞定K8s!

相关推荐
运维开发故事1 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson3 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生3 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭4 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美5 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵5 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
武子康8 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
2601_9618752411 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj11 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes