本章目标:创建 7 台 CentOS 7.9 虚拟机,完成基础环境配置。
【本章说明】
本章是实战的"打地基"环节。您将亲手创建出7台服务器,并让它们拥有统一的基础环境:固定的IP、关闭的防火墙、同步的时间、加载的内核模块。这些操作虽然基础,但任何一项出错,都会导致后续K8s集群部署失败。本章将确保这7台机器站在同一起跑线上。
本章时长 :约 90 分钟
本章命令数量 :约 40 条
本章难度 :★☆☆☆☆
部署节点:所有 7 台服务器
2.1 本章要做什么?
在开始搭建 K8s 集群之前,需要让 7 台服务器都满足以下条件:
| 配置项 | 要求 | 为什么需要 |
|---|---|---|
| 主机名 | 每台不同 | 节点之间通过主机名识别 |
| hosts 文件 | 包含所有节点 | 主机名解析成 IP |
| 静态 IP | 每台固定 IP | 重启后 IP 不变 |
| 关闭防火墙 | 永久关闭 | K8s 组件需要互相通信 |
| 关闭 SELinux | 永久关闭 | 避免权限问题 |
| 关闭 swap | 永久关闭 | K8s 强制要求 |
| 时间同步 | 所有节点一致 | 证书验证需要 |
| 内核模块 | 加载必要模块 | 网络插件需要 |
2.2 安装操作系统(VMware)
2.2.1 下载 CentOS 7.9 ISO
访问 https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ 下载 CentOS-7-x86_64-DVD-2009.iso。
【存放位置】 :下载到本地电脑的
D:\ISO\目录,方便后续挂载。
2.2.2 创建第一台虚拟机(master01)
【执行位置】 :在您的 个人电脑(Windows/Mac) 上,操作 VMware Workstation。
-
打开 VMware Workstation
-
点击「文件」→「新建虚拟机」
-
选择「典型」→「下一步」
-
选择「稍后安装操作系统」→「下一步」
-
客户机操作系统:Linux,版本:CentOS 7 64位
-
虚拟机名称:
master01 -
磁盘大小:
50GB,选择「将虚拟磁盘拆分成多个文件」 -
点击「自定义硬件」→ 内存:
4096 MB,CPU:2核 -
网络适配器:NAT 模式(或桥接模式,确保与宿主机互通)
-
新 CD/DVD:选择「使用 ISO 镜像文件」,浏览选择
D:\ISO\CentOS-7-x86_64-DVD-2009.iso -
点击「关闭」→「完成」
2.2.3 安装操作系统
-
启动虚拟机
-
选择语言:中文 → 简体中文
-
点击「继续」
-
安装位置:自动分区 → 点击「完成」
-
网络和主机名:点击「配置」→ 勾选「自动连接」
-
软件选择:最小安装(不要选带GUI的,节省资源)
-
根密码:设置密码(如
123456,实验环境可用,生产环境请用强密码) -
点击「开始安装」,等待完成后重启
2.2.4 克隆剩余 6 台虚拟机
⚠️ 重要:克隆前需要先关闭虚拟机。
【执行位置】 :在 master01 虚拟机内执行。
# 在 master01 中执行关机
shutdown -h now
【执行位置】 :在您的 个人电脑 上,操作 VMware Workstation。
克隆步骤:
-
右键点击
master01→「管理」→「克隆」 -
选择「虚拟机中的当前状态」→「下一步」
-
选择「创建完整克隆」→「下一步」
-
名称:
master02,点击「完成」
重复上述步骤,克隆出:
| 序号 | 虚拟机名称 |
|---|---|
| 1 | master01(原始) |
| 2 | master02(克隆) |
| 3 | master03(克隆) |
| 4 | worker01(克隆) |
| 5 | worker02(克隆) |
| 6 | jenkins(克隆) |
| 7 | harbor(克隆) |
2.2.5 调整每台虚拟机配置
| 虚拟机 | CPU | 内存 | 硬盘 |
|---|---|---|---|
| master01 | 2核 | 4GB | 50GB |
| master02 | 2核 | 4GB | 50GB |
| master03 | 2核 | 4GB | 50GB |
| worker01 | 2核 | 8GB | 100GB |
| worker02 | 2核 | 8GB | 100GB |
| jenkins | 2核 | 4GB | 50GB |
| harbor | 2核 | 4GB | 100GB |
2.3 配置静态 IP 地址
【本章约定】:所有服务器的基础配置(2.3-2.10节)都需要逐台执行。我们将为每台服务器分配固定IP,即使重启也不会改变。
【文件作用说明】网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-ens160
此文件定义了服务器网卡的IP获取方式、IP地址、子网掩码、网关和DNS。将其设为 static 模式,可以确保服务器每次启动都使用同一个IP,这是集群稳定的基础。
【执行位置】 :依次登录 每台服务器(master01, master02, ..., harbor),分别执行以下命令。
bash
# 步骤1:查看网卡名称(绝大多数是 ens160,如果不是请记下来)
ip addr
# 注释:ip addr 命令用于查看所有网络接口的信息,输出中 "2: ens160:" 表示网卡名为 ens160
# 步骤2:编辑网卡配置文件
vi /etc/sysconfig/network-scripts/ifcfg-ens160
配置文件内容:
bash
TYPE=Ethernet
BOOTPROTO=static # 注释:static 表示静态IP,改为dhcp则是自动获取
NAME=ens160 # 注释:网卡名称,必须与 ip addr 看到的一致
DEVICE=ens160
ONBOOT=yes # 注释:开机自动激活此网卡
IPADDR=192.168.3.60 # 注释:根据下表修改,这是要给这台服务器分配的固定IP
NETMASK=255.255.255.0 # 注释:子网掩码,通常为 255.255.255.0
GATEWAY=192.168.3.1 # 注释:网关地址,通常是路由器的IP
DNS1=114.114.114.114 # 注释:主DNS,114.114.114.114是国内的公共DNS
DNS2=223.5.5.5 # 注释:备用DNS,223.5.5.5是阿里云的DNS
各服务器 IP 地址对照表:
| 服务器 | IP 地址 |
|---|---|
| master01 | 192.168.3.60 |
| master02 | 192.168.3.61 |
| master03 | 192.168.3.62 |
| worker01 | 192.168.3.70 |
| worker02 | 192.168.3.71 |
| jenkins | 192.168.3.80 |
| harbor | 192.168.3.81 |
bash
# 步骤3:重启网络服务,使新配置生效
systemctl restart network
# 注释:systemctl restart network 命令会重启整个网络服务,应用新的IP配置
# 步骤4:验证 IP 配置是否生效
ip addr | grep inet
# 注释:grep inet 会过滤出包含 inet 的行,正常应显示刚才配置的 IP 地址
预期输出:
bash
inet 192.168.3.60/24 brd 192.168.3.255 scope global eth0
2.4 配置主机名
【执行位置】 :分别登录 每台服务器,执行对应自己的命令。
【文件作用说明】主机名配置 /etc/hostname
主机名是服务器在网络中的"名字"。K8s集群内部节点通过主机名相互识别和通信,因此每台服务器必须有一个唯一且易于辨识的主机名。
bash
# === 以下命令请根据当前操作的服务器选择执行 ===
# 如果您正在操作 master01 虚拟机,执行:
hostnamectl set-hostname master01
# 注释:hostnamectl set-hostname 命令用于永久修改系统主机名,无需重启
# 如果您正在操作 master02 虚拟机,执行:
hostnamectl set-hostname master02
# master03 执行:
hostnamectl set-hostname master03
# worker01 执行:
hostnamectl set-hostname worker01
# worker02 执行:
hostnamectl set-hostname worker02
# jenkins 执行:
hostnamectl set-hostname jenkins
# harbor 执行:
hostnamectl set-hostname harbor
# 验证主机名是否修改成功
hostname
# 注释:hostname 命令用于显示当前系统的主机名
预期输出:
bash
master01 # 或其他相应的主机名
2.5 配置 hosts 文件
【执行位置】 :所有 7 台服务器 都需要执行此操作。
【文件作用说明】hosts 文件 /etc/hosts
此文件用于将主机名映射到IP地址。配置后,当节点访问 master01 时,系统会自动将其解析为 192.168.3.60,避免了依赖DNS服务器带来的单点故障。
bash
# 注意:以下命令会向 /etc/hosts 文件追加内容,每台服务器都要执行
cat >> /etc/hosts <<EOF
192.168.3.60 master01
192.168.3.61 master02
192.168.3.62 master03
192.168.3.70 worker01
192.168.3.71 worker02
192.168.3.80 jenkins
192.168.3.81 harbor
192.168.3.59 k8s-vip
EOF
# 注释:cat >> /etc/hosts <<EOF 是一个"此处文档"的写法,表示将 EOF 之间的内容追加到文件中
验证配置是否正确:
bash
# 测试与 master01 的连通性,-c 2 表示只发送2个 ping 包
ping -c 2 master01
# 测试与其他节点的连通性
ping -c 2 master02
ping -c 2 worker01
ping -c 2 jenkins
ping -c 2 harbor
# 注释:如果能 ping 通,说明 hosts 解析生效且网络互通
预期输出
bash
PING master01 (192.168.3.60) 56(84) bytes of data.
64 bytes from master01 (192.168.3.60): icmp_seq=1 ttl=64 time=0.5ms
2.6 关闭防火墙、SELinux、swap
【执行位置】 :所有 7 台服务器 都需要执行此操作。
【配置作用说明】
-
关闭防火墙:K8s组件需要大量端口互相通信,关闭防火墙可以避免端口不通的问题。
-
关闭SELinux:SELinux的安全策略会干扰K8s容器对文件的访问,导致Pod无法正常启动。
-
关闭swap:K8s要求关闭swap,因为swap会严重影响kubelet对Pod内存使用的判断和驱逐决策。
bash
# 关闭防火墙并禁止开机启动
systemctl stop firewalld # 立即停止防火墙服务
systemctl disable firewalld # 禁止防火墙开机自启
# 注释:stop 是立即生效,disable 是下次开机不启动
# 关闭 SELinux(Security-Enhanced Linux)
setenforce 0 # 临时关闭,立即生效
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 注释:sed 命令用于替换文件内容,这里把 enforcing 改成 disabled,永久关闭
# 关闭 swap 分区
swapoff -a # 立即关闭所有 swap 分区
sed -i '/swap/s/^/#/' /etc/fstab # 永久禁用 swap,重启后生效
# 注释:sed -i '/swap/s/^/#/' 表示找到包含 swap 的行,在行首加上 # 注释掉
# 验证防火墙状态
systemctl status firewalld | grep Active
# 验证 SELinux 状态
getenforce
# 验证 swap 是否关闭
free -h | grep Swap
预期输出:
bash
Active: inactive (dead)
Disabled
Swap: 0B 0B 0B
2.7 加载内核模块
【执行位置】 :所有 7 台服务器 都需要执行此操作。
【配置作用说明】内核模块
-
overlay:一种联合文件系统,Docker/containerd 用它来构建容器镜像层。
-
br_netfilter:允许桥接网络流量经过 iptables 规则,是实现 Calico 网络策略和 Service 负载均衡的关键。
bash
# 手动加载内核模块(立即生效)
modprobe overlay
modprobe br_netfilter
# 注释:modprobe 是动态加载内核模块的命令,不需要重启
# 配置开机自动加载(创建配置文件)
cat > /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
# 验证模块是否加载成功
lsmod | grep -E "overlay|br_netfilter"
# 注释:lsmod 列出已加载的内核模块,grep -E 支持正则匹配
预期输出:
bash
overlay 147456 0
br_netfilter 32768 0
2.8 配置内核参数
【执行位置】 :所有 7 台服务器 都需要执行此操作。
【配置作用说明】内核参数 /etc/sysctl.d/k8s.conf
-
bridge-nf-call-iptables:让桥接的流量经过 iptables 处理,这是 Service 和网络策略的基础。 -
net.ipv4.ip_forward:启用 IP 转发,使 K8s 节点能作为路由器转发 Pod 之间的跨节点流量。
bash
# 创建内核参数配置文件
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1 # 桥接流量经过 iptables
net.bridge.bridge-nf-call-ip6tables = 1 # IPv6 版本
net.ipv4.ip_forward = 1 # 启用 IP 转发
EOF
# 加载所有 sysctl 配置,使其立即生效
sysctl --system
# 注释:sysctl --system 会加载所有 /etc/sysctl.d/*.conf 文件中的配置
验证:
bash
# 检查参数是否生效
sysctl net.bridge.bridge-nf-call-iptables
sysctl net.ipv4.ip_forward
# 注释:sysctl 命令用于查看或修改内核参数
预期输出:
bash
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
2.9 配置时间同步
【执行位置】 :所有 7 台服务器 都需要执行此操作。
【配置作用说明】时间同步
K8s 集群使用证书进行安全认证,证书的有效期依赖于准确的时间。如果节点间时间差超过5分钟,API Server 会拒绝该节点的请求。我们使用 chrony 服务来确保所有节点时间一致。
bash
# 安装 chrony 时间同步服务
yum install -y chrony
# 注释:-y 表示自动确认安装,不需要手动输入 y
# 配置时间服务器(使用国内稳定的 NTP 服务器)
cat > /etc/chrony.conf <<EOF
server ntp.aliyun.com iburst # 阿里云时间服务器
server ntp.tencent.com iburst # 腾讯云时间服务器
driftfile /var/lib/chrony/drift
makestep 1.0 3 # 如果时间差超过1秒,立即调整
rtcsync # 同步硬件时钟
EOF
# 启动 chronyd 服务并设置开机自启
systemctl enable --now chronyd
# 注释:enable 设置开机启动,--now 表示立即启动,相当于 start
# 查看时间同步源
chronyc sources
# 注释:chronyc sources 显示当前使用的时间源服务器列表
预期输出:
bash
^* ntp.aliyun.com 2 6 377 45 +0.123ms
2.10 安装基础工具
【执行位置】 :所有 7 台服务器 都需要执行此操作。
bash
# 安装常用的运维工具
yum install -y wget curl vim net-tools telnet lsof
# 注释:
# - wget: 下载文件
# - curl: 测试 HTTP/HTTPS 接口
# - vim: 文本编辑器
# - net-tools: 提供 ifconfig, netstat 等网络工具
# - telnet: 测试端口连通性
# - lsof: 查看文件打开情况,排查端口占用
验证:
bash
# 检查各工具是否安装成功
wget --version | head -1
curl --version | head -1
vim --version | head -1
2.11 一键验证所有节点配置
【执行位置】 :在 master01 节点上执行。
当7台服务器都完成以上配置后,我们使用一个 for 循环来批量检查所有节点的核心配置是否达标。
bash
# 循环遍历所有节点,检查关键配置
for node in master01 master02 master03 worker01 worker02 jenkins harbor; do
echo "========== 正在检查节点: $node =========="
ssh $node "hostname && getenforce && systemctl is-active firewalld && free -h | grep Swap"
# 注释:ssh $node "..." 表示在远程节点上执行一组命令
# hostname: 显示主机名
# getenforce: 显示 SELinux 状态
# systemctl is-active firewalld: 显示防火墙是否 active
# free -h | grep Swap: 显示 swap 分区使用情况
done
预期输出:
bash
========== 正在检查节点: master01 ==========
master01
Disabled
inactive
Swap: 0B 0B 0B
========== 正在检查节点: master02 ==========
master02
Disabled
inactive
Swap: 0B 0B 0B
...(后续节点类似)
如果所有节点输出都符合预期,恭喜您,基础环境配置完美完成!
2.12 本章小结
完成本章后检查清单:
| 检查项 | 验证命令 | 预期结果 |
|---|---|---|
| 主机名 | hostname |
master01 等 |
| IP 地址 | ip addr |
配置的 IP |
| hosts 解析 | ping -c 2 master01 |
成功 |
| 防火墙 | systemctl status firewalld |
inactive |
| SELinux | getenforce |
Disabled |
| swap | free -h | grep Swap |
0B |
| 内核模块 | lsmod | grep br_netfilter |
有输出 |
| IP 转发 | sysctl net.ipv4.ip_forward |
1 |
| 时间同步 | chronyc sources |
有时间源 |
常见问题:
Q:ping 不通其他节点怎么办? A:1)检查IP地址是否配置正确;2)检查VMware网络模式是否为NAT或桥接模式;3)检查Windows防火墙是否拦截了VMware的通信。
Q:时间不同步怎么办? A:执行 chronyc -a makestep 强制同步,或重启 systemctl restart chronyd。
Q:修改了配置需要重启吗? A:除了IP地址需要 systemctl restart network,其他配置执行命令后立即生效。
下一章预告:安装容器运行时 containerd。