欢迎光临
我们一直在努力

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,服务器配置需满足以下条件(虚拟机、云服务器均可):

  • 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命令:

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

    Ubuntu命令:

    # 关闭防火墙
    ufw disable
    # 查看防火墙状态(确认已关闭)
    ufw status

    1.3.2 禁用Swap(K8s强制要求)

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

    1.3.3 配置主机名和hosts映射

  • 配置主机名(Master和Node节点分别执行对应命令):
  • # Master节点配置主机名
    hostnamectl set-hostname k8s-master
    # Node节点配置主机名(如果有多个Node,依次改为k8s-node2、k8s-node3…)
    hostnamectl set-hostname k8s-node1

  • 配置hosts映射(所有节点执行,将IP和主机名对应起来):
  • # 编辑hosts文件
    vi /etc/hosts
    # 在文件末尾添加以下内容(替换成自己的服务器IP和主机名)
    192.168.1.100 k8s-master
    192.168.1.101 k8s-node1

  • 测试hosts映射是否生效(所有节点执行):
  • ping k8s-master -c 3 # 能ping通说明配置成功
    ping k8s-node1 -c 3

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

    # 临时配置内核参数
    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命令:

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

    Ubuntu命令:

    # 安装时间同步工具
    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

    # 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

    # 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镜像源在国外,下载速度较慢,配置阿里云镜像加速,可大幅提升镜像下载速度(所有节点执行):

    # 创建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 安装

    # 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 安装

    # 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 验证安装(所有节点执行)

    # 查看kubeadm版本
    kubeadm version
    # 查看kubectl版本
    kubectl version –client

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

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

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

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

    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节点加入集群需要用到):

    # 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节点执行)

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

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

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

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

    # 下载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节点执行):

    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节点执行:

    kubeadm join 192.168.1.100:6443 –token xxxxxxxx.xxxxxxxxxxxx \\
    –discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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

    kubeadm token create –print-join-command

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

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

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

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

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

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

    # 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!

    赞(0)
    未经允许不得转载:171主机测评 » K8s系列第二篇:CentOS7/Ubuntu 一键搭建 K8s 集群(kubeadm 完整版)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址