第2章:服务器规划与基础环境配置

本章目标:创建 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。

  1. 打开 VMware Workstation

  2. 点击「文件」→「新建虚拟机」

  3. 选择「典型」→「下一步」

  4. 选择「稍后安装操作系统」→「下一步」

  5. 客户机操作系统:Linux,版本:CentOS 7 64位

  6. 虚拟机名称:master01

  7. 磁盘大小:50GB,选择「将虚拟磁盘拆分成多个文件」

  8. 点击「自定义硬件」→ 内存:4096 MB,CPU:2

  9. 网络适配器:NAT 模式(或桥接模式,确保与宿主机互通)

  10. 新 CD/DVD:选择「使用 ISO 镜像文件」,浏览选择 D:\ISO\CentOS-7-x86_64-DVD-2009.iso

  11. 点击「关闭」→「完成」

2.2.3 安装操作系统

  1. 启动虚拟机

  2. 选择语言:中文 → 简体中文

  3. 点击「继续」

  4. 安装位置:自动分区 → 点击「完成」

  5. 网络和主机名:点击「配置」→ 勾选「自动连接」

  6. 软件选择:最小安装(不要选带GUI的,节省资源)

  7. 根密码:设置密码(如 123456,实验环境可用,生产环境请用强密码)

  8. 点击「开始安装」,等待完成后重启

2.2.4 克隆剩余 6 台虚拟机

⚠️ 重要:克隆前需要先关闭虚拟机。

【执行位置】 :在 master01 虚拟机内执行。

复制代码
# 在 master01 中执行关机
shutdown -h now

【执行位置】 :在您的 个人电脑 上,操作 VMware Workstation。

克隆步骤

  1. 右键点击 master01 →「管理」→「克隆」

  2. 选择「虚拟机中的当前状态」→「下一步」

  3. 选择「创建完整克隆」→「下一步」

  4. 名称: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。

📖 点击订阅 K8s + DevOps + 微服务部署与发版 专栏,系统学习完整37章内容。

相关推荐
shizhan_cloud1 小时前
华为云核心服务运维知识点与高频实操问题总结
运维·华为云
l1t1 小时前
DeepSeek总结的Quack:DuckDB 客户端-服务器协议(二)
运维·服务器·duckdb
xugyw1 小时前
window获取安全码SHA1、SHA256和jks文件
运维·服务器·安全
Raink老师1 小时前
【AI面试临阵磨枪-56】大模型服务部署:Docker、K8s、GPU 调度、推理加速
人工智能·面试·kubernetes·ai 面试
杨浦老苏1 小时前
开源服务器监控工具Checkmate
运维·docker·群晖·网站监控
ℳ₯㎕ddzོꦿ࿐1 小时前
实战指南:使用 Docker Compose 优雅部署 MongoDB 并自动初始化用户
mongodb·docker·容器
yyyyy_abc2 小时前
docker学习笔记
运维·docker·容器
2301_780789662 小时前
多层级 CC 防护体系:前端验证与后端限流的协同配置实践
运维·服务器·前端·网络安全·智能路由器·状态模式
秋92 小时前
Windows 环境下 Redis 部署详解:从选型、安装到生产级配置与运维
运维·windows·redis