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/TCP3xxxx 是外部访问端口。

6.5 浏览器访问应用

打开浏览器,输入:

http://节点IP:3xxxx

看到 Nginx 欢迎页,代表应用部署成功,集群可正常对外提供服务。


结语

本文完整覆盖了 K8s 集群搭建的全流程:前置环境配置 → 核心工具安装 → Master 初始化 → Node 加入 → CNI 网络部署 → 应用实战,完成本教程后,已经拥有了一套可用的 K8s 集群,可继续学习 Deployment 扩缩容、ConfigMap、Ingress 等进阶功能。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐