本文最后更新于 2025-07-13,文章内容可能已经过时。

修改为静态 ip

vim /etc/sysconfig/network-scripts/ifcfg-ens33

ens33​这个根据你的具体情况选择

原本的网卡配置文件为

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=eui64
NAME=ens33
UUID=3c75f66a-12f6-4a8d-8bde-d7ae15f36585
DEVICE=ens33
ONBOOT=yes

我们需要将 BOOTPROTO​的值改为 static​,即静态 ip,然后添加下面内容即可。其中 IPADDR​和 GATEWAY​跟你具体环境配置。

IPADDR=192.168.254.10
NETMASK=255.255.255.0
GATEWAY=192.168.254.2
DNS1=8.8.8.8
DNS2=114.114.114.114

配置完成后保存,然后使用 nmcli 重新加载网络配置,使其生效。

# 重新加载网络配置
nmcli connection reload

# 断开并重新连接网卡
nmcli connection down ens33
nmcli connection up ens33

配置主机名

hostnamectl set-hostname master1-1

配置主机 host 文件

实现主机名之间互相访问,编辑 /etc/hosts​文件,将下面的内容添加到 hosts 文件中

192.168.254.10 master1-1
192.168.254.11 master1-2
192.168.254.20 node1-1

master1-1​中分别 ping master1-2​和 node1-1​,能 ping 通则说明配置没有问题

配置主机之间无密码访问

master1-1​上使用 ssh-keygen​生成公钥和私钥,一直回车即可,运行完成后会生成 2 个文件:/root/.ssh/id_ed25519​为私钥、/root/.ssh/id_ed25519.pub​为公钥。

[root@master1-1 ~]# ssh-keygen
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_ed25519
Your public key has been saved in /root/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:QFkkTaDHqknvzzAuEDdAZNRSgPDe/3bYVCLaVW8YEV4 root@master1-1
The key's randomart image is:
+--[ED25519 256]--+
|B*+.  +B+   ooE  |
|+o . +...  .o.   |
| .o . +    ..+   |
|..o. o .. o o o  |
| oo.o  oSo o .   |
|.. + .. . .      |
| .o + .  +       |
|  .o + .o o      |
|   .o.o...       |
+----[SHA256]-----+

将公钥拷贝到其他节点上

ssh-copy-id master1-2

然后输入 yes 和密码即拷贝完成。

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'master1-2'"
and check to make sure that only the key(s) you wanted were added.

我们可以使用 ssh master1-2​命令连接 master1-2​,并且不需要输入密码。

关闭 swap 分区

临时关闭:

swapoff -a

然后使用 free -m​ 查看,如果 swap 一栏全是零,则关闭成功。

[root@master1-1 ~]# free -m
               total        used        free      shared  buff/cache   available
Mem:            3372         565        2497          12         552        2807
Swap:              0           0           0

永久关闭:

编辑 /etc/fstab​文件,注释掉 swap 一行即可

#/dev/mapper/openeuler-swap none                    swap    defaults        0 0

修改内核参数,开启 ip 转发

导入 br_netfilter​模块

modprobe br_netfilter

创建一个 /etc/sysctl.d/k8s.conf​文件,并写入如下内容

net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1

重新加载配置的内核参数

sysctl -p /etc/sysctl.d/k8s.conf

设置开机自启

echo br_netfilter > /etc/modules-load.d/k8s.conf

参数被覆盖问题

如果开机后 ipv4.ip_forward 仍然为 0,则有可能是参数被覆盖了,可以使用下面命令查找

grep -rn net.ipv4.ip_forward /etc/sysctl.d /usr/lib/sysctl.d /etc/sysctl.conf

检查结果例如:

/etc/sysctl.d/k8s.conf:3:net.ipv4.ip_forward = 1
/etc/sysctl.conf:12:net.ipv4.ip_forward=0

  • 由于 99-sysctl.conf​ 文件名中的数字 99​ 大于 k8s.conf​(无数字前缀),系统会优先加载 k8s.conf​,然后被 99-sysctl.conf覆盖,最终 net.ipv4.ip_forward=0​。

因为 sysctl.conf 优先级比 sysctl.d/k8s.conf 低,所以他是最后加载的,它的配置会覆盖到前面的配置

文件夹

优先级

描述

sysctl.conf

传统配置文件

sysctl.d

高优先级配置文件

解决办法

注释掉 sysctl.conf 里有关 net.ipv4.ip_forward=0​的配置

验证:

sysctl net.ipv4.ip_forward

输出结果:

net.ipv4.ip_forward = 1

关闭防火墙(可选)

如果不关闭防火墙,那么 k8s 初始化时需要开放 k8s 所需端口,否则可能导致集群初始化失败、节点无法加入、CoreDNS 不可解析、Pod 网络不通等问题。

控制平面节点(Master)需要开放的端口:

端口号

协议

用途说明

6443

TCP

kube-apiserver,所有组件与 API Server 通信

2379-2380

TCP

etcd 服务和客户端通信

10250

TCP

kubelet 远程管理

10259

TCP

kube-scheduler(v1.23+ 用于健康检查)

10257

TCP

kube-controller-manager(v1.23+ 用于健康检查)

所有节点(包括 Master 和 Worker)都需要开放的端口

端口号

协议

用途说明

10250

TCP

kubelet 远程管理

30000-32767

TCP

NodePort 类型服务

6783(或自定义)

UDP

Pod 网络插件使用的端口(如 Weave Net)

根据网络插件不同

-

不同插件还可能需要额外端口(见下方)

网络插件附加端口示例:

插件

需要开放的端口说明

Flannel

UDP 8285(VxLAN),UDP 8472(默认)

Calico

TCP 179(BGP),IPIP 协议 4(若启用 IP-in-IP)

Cilium

默认不需要额外端口,但支持 BPF 模式可选配置

systemctl stop firewalld && systemctl disable firewalld

验证

systemctl status firewalld

关闭 SELinux

vim /etc/selinux/config

将 SELINUX=enforcing 设置为 disabled

SELINUX=disabled

然后关机重启,重启后可以使用 getenforce​命令查看是否正确关闭

配置 kubernetes​的 yum 源

创建文件 /etc/yum.repos.d/kubernetes.repo​,然后填写如下内容

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0

构建缓存

dnf clean all
dnf makecache

配置时间同步

dnf -y install ntpdate

安装完成后使用如下命令同步时间,cn.pool.ntp.org​为开源 NTP 服务器

ntpdate cn.pool.ntp.org

计划任务定时同步时间

crontab -e
0 * * * * /usr/sbin/ntpdate cn.pool.ntp.org

开启 ipvs

IPVS​ 全称是 IP Virtual Server,是 Linux 内核层的一个负载均衡框架,是 LVS(Linux Virtual Server) 的核心部分。

ipvs​ 是 kube-proxy 的一种高性能网络模式

kube-proxy 支持 iptables 和 ipvs,这两个都是基于 netfilter 模块实现的,ipvs 使用哈希表,效率高,iptables 逐条查询,当规则较多时,效率较低

ipvs 支持比 iptables 更复杂的负载均衡算法(最小负载、加权、最少连接等),同时支持服务器健康检查和连接重试功能。

模块名

作用说明

ip_vs

IPVS 核心模块

ip_vs_rr

轮询(Round Robin)调度算法

ip_vs_wrr

加权轮询(Weighted Round Robin)

ip_vs_lc

最少连接(Least Connection)

ip_vs_wlc

加权最少连接

ip_vs_sh

基于源地址哈希(Source Hashing)

ip_vs_dh

基于目标地址哈希(Destination Hashing)

ip_vs_lblc

本地缓存一致性调度(Locality-Based Least Connection)

ip_vs_lblcr

LBLCR(带复制的 LBL)

ip_vs_nq

最短队列(Never Queue)

ip_vs_sed

最短期望延迟(Shortest Expected Delay)

ip_vs_ftp

支持 FTP 协议转发

nf_conntrack

Netfilter 的连接跟踪模块

新建 /etc/modules-load.d/ipvs.conf​文件,然后写入下面的内容,确保开机时自动加载这些模块

ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_nq
ip_vs_sed
ip_vs_ftp
nf_conntrack

立即加载模块

for module in $(cat /etc/modules-load.d/ipvs.conf) ; do
	modprobe $module
done

验证

lsmod | grep ip_vs
lsmod | grep nf_conntrack

安装基础软件包

dnf install -y dnf-utils device-mapper-persistent-data lvm2 \
wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake \
libxml2-devel openssl-devel curl curl-devel unzip sudo \
ntp libaio-devel vim ncurses-devel autoconf automake \
zlib-devel python3-devel openssh-server \
socat ipvsadm conntrack ntpdate telnet

安装 Containerd

dnf -y install containerd

备份并生成一份全新的默认配置

cp /etc/containerd/config.toml /etc/containerd/config.toml.bak
containerd config default > /etc/containerd/config.toml.new

用 vim 打开 /etc/containerd/config.toml​文件,按 /​搜索 runtimes.runc.options​这个关键字,将下面的 SystemdCgroup​改为 true​即可