前言:在上一篇文章中,我们已经搞懂了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,服务器配置需满足以下条件(虚拟机、云服务器均可):
-
CPU:至少2核(单核会导致kubeadm初始化失败);
-
内存:至少2GB(推荐4GB,内存不足会导致容器启动异常);
-
硬盘:至少20GB(用于存储镜像、容器数据);
-
系统版本:CentOS7(7.5及以上)、Ubuntu(20.04 LTS,最稳定);
-
网络:所有节点(Master+Node)能互相ping通,且能访问外网(需要下载镜像);
-
禁用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映射
- 配置主机名(Master和Node节点分别执行对应命令):
bash
# Master节点配置主机名
hostnamectl set-hostname k8s-master
# Node节点配置主机名(如果有多个Node,依次改为k8s-node2、k8s-node3...)
hostnamectl set-hostname k8s-node1
- 配置hosts映射(所有节点执行,将IP和主机名对应起来):
bash
# 编辑hosts文件
vi /etc/hosts
# 在文件末尾添加以下内容(替换成自己的服务器IP和主机名)
192.168.1.100 k8s-master
192.168.1.101 k8s-node1
- 测试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:kubeadm初始化失败,提示"insufficient memory"原因:服务器内存不足(低于2GB);解决:升级服务器内存(至少2GB),或关闭不必要的进程释放内存。
-
问题2:初始化失败,提示"Swap is enabled"原因:Swap未禁用;解决:重新执行"1.3.2 禁用Swap"的命令,确保Swap已禁用,然后执行kubeadm reset重置,再重新初始化。
-
问题3:Node节点加入集群失败,提示"connection refused"原因:Master节点防火墙未关闭,或Master节点IP错误;解决:检查Master节点防火墙是否关闭,确认加入命令中的Master IP正确,且Node节点能ping通Master节点。
-
问题4:节点状态一直为NotReady原因:网络插件未安装,或Flannel容器未正常启动;解决:重新安装Flannel网络插件,或手动拉取Flannel镜像(参考5.1步骤)。
-
问题5:镜像下载失败(超时)原因:国外镜像源访问不畅;解决:配置Docker镜像加速(参考2.3步骤),或手动拉取镜像(替换成阿里云镜像仓库)。
九、总结
本文详细讲解了用kubeadm一键搭建K8s集群的完整流程,涵盖CentOS7和Ubuntu两个主流系统,从前置准备、容器运行时安装,到Master节点初始化、网络插件安装、Node节点加入,每一步都有详细命令和注释,小白也能轻松上手。
重点记住3点:
-
所有节点必须禁用Swap、关闭防火墙、配置hosts映射,这是搭建成功的前提;
-
kubeadm、kubelet、kubectl版本必须一致,否则会出现兼容性问题;
-
网络插件是集群正常运行的关键,Flannel是小白首选,安装后节点状态会变为Ready。
下一篇文章,我们将学习K8s的核心对象------《K8s 核心对象:Pod 从入门到实战(yaml 详解+常用命令)》,手把手教你操作Pod,敬请关注!
最后,如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注,后续会持续更新K8s系列实战文章,从入门到精通,带你轻松搞定K8s!