前言

上一篇文章我们解析了 Kubernetes 的核心原理与架构,本文将聚焦实战,详细讲解基于 CentOS 7.6 搭建 K8s 一主多从集群的全过程,并完成 Nginx 应用的部署,帮助读者快速上手 K8s 集群搭建与应用管理。

一、集群规划与环境准备

1. 集群架构选择

K8s 集群分为 “一主多从” 和 “多主多从” 两种模式:

  • 一主多从:1 个 Master 节点 + 多个 Node 节点,搭建简单,适合测试 / 学习环境;
  • 多主多从:多个 Master 节点 + 多个 Node 节点,高可用但配置复杂,适合生产环境。

本文采用 “一主两从” 架构,节点规划如下:

IP 地址 节点类型 操作系统 硬件配置
192.168.200.129 Master CentOS 7.6 2 核 CPU、2G 内存、20G 硬盘
192.168.200.130 Node1 CentOS 7.6 2 核 CPU、2G 内存、20G 硬盘
192.168.200.131 Node2 CentOS 7.6 2 核 CPU、2G 内存、20G 硬盘

2. 全节点初始化配置

所有节点(Master+Node)需完成以下初始化操作,确保集群环境统一:

(1)检查操作系统版本

K8s 要求 CentOS 版本≥7.5,执行以下命令验证:

cat /etc/redhat-release
(2)主机名解析

配置 /etc/hosts 文件,实现节点间通过主机名互通:

# 切换至root权限
su root
# 编辑hosts文件
vi /etc/hosts
# 添加以下内容
192.168.200.129  master
192.168.200.130  node1
192.168.200.131  node2

配置完成后,验证节点间连通性:

ping master -c 3
ping node1 -c 3
ping node2 -c 3
(3)时间同步

K8s 要求集群节点时间精确一致,通过 chronyd 服务同步时间:

yum install -y chrony
systemctl start chronyd
systemctl enable chronyd
(4)关闭防火墙与 SELinux

避免防火墙 / SELinux 干扰 K8s 网络和容器运行:

# 关闭firewalld
systemctl stop firewalld
systemctl disable firewalld

# 关闭SELinux(需重启生效)
vi /etc/selinux/config
# 修改SELINUX=disabled
SELINUX=disabled
(5)禁用 Swap 分区

Swap 分区会影响 K8s 资源调度,需禁用:

# 注释/etc/fstab中的Swap分区
vi /etc/fstab
# 重启后验证
swapoff -a
(6)修改 Linux 内核参数

开启网桥过滤和地址转发,适配 K8s 网络:

# 创建内核配置文件
vi /etc/sysctl.d/kubernetes.conf
# 添加以下内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

# 加载配置
sysctl -p
# 加载网桥模块
modprobe br_netfilter
# 验证模块加载
lsmod | grep br_netfilter
(7)配置 IPVS 功能

IPVS 是 K8s Service 的高性能代理模式,需手动加载模块:

# 安装ipset和ipvsadm
yum install ipset ipvsadm -y

# 编写模块加载脚本
cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

# 执行脚本并验证
chmod +x /etc/sysconfig/modules/ipvs.modules
sh +x /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
(8)重启系统

使所有配置生效:

reboot

二、安装核心组件

1. 安装 Docker(容器运行时)

# 配置Docker镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

# 安装指定版本Docker
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

# 配置Docker加速与Cgroup驱动
mkdir /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [ "https://66mzqrih.mirror.aliyuncs.com"]
}
EOF

# 启动Docker并设置开机自启
systemctl start docker
systemctl enable docker

# 验证安装
docker --version

2. 安装 K8s 组件(kubeadm/kubelet/kubectl)

# 配置K8s阿里云镜像源
vi /etc/yum.repos.d/kubernetes.repo
# 添加以下内容
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
      http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

# 安装指定版本K8s组件
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

# 配置kubelet的Cgroup驱动
vi /etc/sysconfig/kubelet
# 添加以下内容
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

# 设置kubelet开机自启
systemctl enable kubelet

3. 准备 K8s 集群镜像

K8s 官方镜像位于海外,需从阿里云镜像仓库拉取并重命名:

# 定义需要的镜像列表
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0 
coredns:1.6.5
)

# 拉取并重命名镜像
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

# 验证镜像
docker images

三、集群初始化与节点加入

1. Master 节点初始化

仅在 Master 节点执行,初始化集群控制平面:

kubeadm init \
--kubernetes-version=v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.200.129

# 配置kubectl访问集群
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 节点加入集群

初始化完成后,Master 节点会输出节点加入命令,在 Node1 和 Node2 执行:

kubeadm join 192.168.200.129:6443 --token xxxxx.xxxxxx \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

3. 验证节点状态

在 Master 节点执行以下命令,查看节点是否加入:

kubectl get nodes

此时节点状态为NotReady,需安装网络插件后变为Ready

四、安装网络插件(Flannel)

1. 配置 Flannel 配置文件

修改 kube-flannel.yml 中的镜像仓库为国内源(quay-mirror.qiniu.com),然后执行:

# 应用Flannel配置
kubectl apply -f kube-flannel.yml

# 修正kubelet配置(删除--network-plugin=cni)
vi /var/lib/kubelet/kubeadm-flags.env
# 重启kubelet
systemctl daemon-reload
systemctl restart kubelet

2. 验证网络插件

# 查看Pod状态
kubectl get pods -n kube-system
# 再次查看节点状态(应为Ready)
kubectl get nodes

五、部署 Nginx 应用验证集群

1. 创建 Nginx Deployment

# 在Master节点创建Deployment,管理Nginx Pod
kubectl create deployment nginx --image=nginx:1.14-alpine

2. 暴露 Nginx Service

# 暴露NodePort类型服务,对外提供访问
kubectl expose deployment nginx --port=80 --type=NodePort

3. 验证访问

# 查看Service信息,获取NodePort端口
kubectl get svc nginx
# 访问任意Node节点IP:NodePort,验证Nginx是否正常运行
curl http://192.168.200.130:31347

总结

本文详细讲解了 K8s 一主多从集群的搭建流程,从环境初始化、组件安装到集群初始化、网络配置,最终完成 Nginx 应用部署。通过实战操作,读者可快速掌握 K8s 集群搭建的核心步骤,为后续深入学习 K8s 应用管理、扩缩容、故障排查等打下基础。K8s 的学习是一个循序渐进的过程,掌握集群搭建只是第一步,后续还需深入理解控制器、服务网格、持久化存储等核心功能。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐