【保姆级实战】从零搭建 Kubernetes 集群
Kubernetes(简称 K8s)是当下容器编排的事实标准。本文以 CentOS 7 为基础环境,从前置环境配置到部署第一个 Nginx 应用,搭建出可用的 K8s 集群。
一、K8s 集群前置环境配置(所有节点必须执行)
搭建 K8s 集群前,需要对操作系统进行标准化配置,关闭影响集群运行的系统组件、配置网络参数。
1.1 关闭防火墙
K8s 集群节点间需要通过大量端口通信,防火墙会拦截通信请求,因此必须关闭。
# 临时关闭防火墙
systemctl stop firewalld
# 永久关闭防火墙(开机不自启)
systemctl disable firewalld
1.2 关闭 SELinux
SELinux 是 Linux 的安全子系统,会限制容器的权限与访问,K8s 要求必须关闭,否则会出现权限异常。
# 临时关闭
setenforce 0
# 永久关闭(修改配置文件)
sed -i 's/enforcing/disabled/' /etc/selinux/config
1.3 关闭 Swap 交换分区
这是 K8s 强制要求,Swap 会降低容器性能,导致集群调度异常,kubeadm 初始化时会强制检查。
# 临时关闭
swapoff -a
# 永久关闭(注释 fstab 中的 Swap 配置)
sed -ri 's/.*swap.*/#&/' /etc/fstab
1.4 设置主机名
集群内节点通过主机名识别,每个节点主机名必须唯一,方便区分 Master 与 Node 节点。
# Master 节点执行
hostnamectl set-hostname k8smaster
# Node1 节点执行
hostnamectl set-hostname k8snode1
# Node2 节点执行
hostnamectl set-hostname k8snode2
1.5 配置 hosts 域名映射
让节点之间通过主机名互通,无需依赖 DNS 服务。
cat >> /etc/hosts << EOF
192.168.177.130 k8smaster
192.168.177.131 k8snode1
192.168.177.132 k8snode2
EOF
注意:IP 地址替换为自己节点的真实内网 IP。
1.6 配置桥接 IPv4 流量
K8s 的容器网络依赖 Linux 桥接功能,需要开启内核参数,让桥接流量转发到 iptables。
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效内核参数
sysctl --system
1.7 时间同步
集群内所有节点时间必须一致,否则证书验证、日志记录、组件通信会出现异常。
# 安装时间同步工具
yum install ntpdate -y
# 同步阿里云时间服务器
ntpdate ntp.aliyun.com
二、安装 Docker /kubeadm/kubelet(所有节点执行)
K8s 本身不运行容器,需要容器运行时,同时需要安装集群管理工具。
2.1 安装 Docker(容器运行时)
Docker 是 K8s 最常用的容器运行时,负责创建、启动、管理容器。
2.1.1 配置 Docker 阿里云 YUM 源
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.1.2 安装 Docker 社区版
yum install -y docker-ce docker-ce-cli containerd.io
2.1.3 配置 Docker 镜像加速与 cgroup 驱动
K8s 默认使用 systemd 作为 cgroup 驱动,Docker 默认是 cgroupfs,两者必须统一,否则集群异常。
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://mirrors.aliyun.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
2.1.4 启动 Docker 并设置开机自启
systemctl daemon-reload
systemctl enable docker && systemctl start docker
2.2 安装 kubeadm /kubelet/kubectl
核心术语解释
- kubelet:运行在所有节点,负责与容器运行时交互,管理 Pod 生命周期
- kubeadm:集群初始化、节点加入的工具,简化集群搭建
- kubectl:K8s 命令行客户端,用于操作集群
2.2.1 配置 K8s 阿里云源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF
2.2.2 安装核心组件
yum install -y kubelet kubeadm kubectl
# 设置 kubelet 开机自启(初始化前不手动启动)
systemctl enable kubelet
三、kubeadm init 初始化 Master 节点
Master 节点是集群的控制平面,负责集群调度、管理、监控,仅在 Master 节点执行。
3.1 初始化命令(带国内镜像适配)
kubeadm init \
--apiserver-advertise-address=192.168.177.130 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.30.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
参数解释
--apiserver-advertise-address:Master 节点 API 服务监听地址--image-repository:阿里云镜像仓库,解决国外镜像拉取失败--service-cidr:集群内部 Service 网段--pod-network-cidr:Pod 网络网段(Flannel 插件专用)--ignore-preflight-errors:忽略非关键预检错误
3.2 初始化成功后配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.3 保存节点加入命令
初始化成功后会输出 kubeadm join 命令,这是 Node 节点加入集群的唯一凭证,务必保存。
四、Node 节点加入集群
所有 Node 节点完成前置配置与工具安装后,执行 Master 节点输出的加入命令。
4.1 执行加入命令
kubeadm join 192.168.177.130:6443 --token xxx \
--discovery-token-ca-cert-hash sha256:xxx
4.2 忘记加入命令的解决方法
在 Master 节点执行:
kubeadm token create --print-join-command
4.3 查看节点状态
kubectl get nodes
此时节点状态为 NotReady,因为未部署 CNI 网络插件。
五、部署 CNI 网络插件(Flannel)
CNI(容器网络接口)是 K8s 容器网络的标准接口,没有 CNI 插件,Pod 无法通信,节点永远为 NotReady。
5.1 部署 Flannel 插件
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
5.2 查看 Flannel 组件状态
kubectl get pods -n kube-system
5.3 验证集群节点状态
kubectl get nodes
所有节点状态变为 Ready,代表集群网络正常,集群搭建完成。
六、实战:部署第一个 Nginx 应用并访问
集群搭建完成后,部署 Nginx 应用,验证集群的应用调度与访问能力。
6.1 创建 Nginx Deployment
Deployment 是 K8s 用于管理无状态应用的资源,负责 Pod 的创建、更新、扩缩容
kubectl create deployment nginx --image=nginx
6.2 查看 Deployment 与 Pod 状态
# 查看 Deployment
kubectl get deployments
# 查看 Pod
kubectl get pods -o wide
6.3 创建 Service 暴露应用
Service 是 K8s 的服务发现与负载均衡资源,通过 NodePort 类型暴露端口,让外部访问应用。
kubectl expose deployment nginx --port=80 --type=NodePort
6.4 查看 Service 端口
kubectl get svc
输出结果中 PORT(S) 列会显示 80:3xxxx/TCP,3xxxx 是外部访问端口。
6.5 浏览器访问应用
打开浏览器,输入:
http://节点IP:3xxxx
看到 Nginx 欢迎页,代表应用部署成功,集群可正常对外提供服务。
结语
本文完整覆盖了 K8s 集群搭建的全流程:前置环境配置 → 核心工具安装 → Master 初始化 → Node 加入 → CNI 网络部署 → 应用实战,完成本教程后,已经拥有了一套可用的 K8s 集群,可继续学习 Deployment 扩缩容、ConfigMap、Ingress 等进阶功能。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)