10.1 容器云部署准备(一) - 实践
文章目录
- 1. 操作系统安装
- ISO镜像获取
- 系统配置
- 2. 主机初始化设置
- 设置主机名
- 配置主机hosts文件
- 检查DNS解析
- 3. 安全配置
- 关闭防火墙
- 关闭SElinux
- 关闭swap分区
- 4. 时间同步
- 安装chrony客户端
- 配置chrony
- 启动chrony
- 手动对时
- 验证chrony配置
- 5. 内核模块加载
- 内核模块的概念
- 永久加载br_netfilter模块
- 修改内核参数
- 验证内核模块加载及参数修改
- 6. IPVS功能
- 安装ipset和ipvsadm包
- 永久加载IPVS相关模块
- 验证
1. 操作系统安装
ISO镜像获取
通过麒麟软件官网申请试用麒麟操作系统ISO镜像:Kylin-Server-V10-SP3-2403-Release-20240426-X86_64.iso
https://www.kylinos.cn/support/trial/download/
通过virtualbox运行麒麟虚拟机,需要注意virtualbox只支持x86的ISO镜像,不支持ARM的ISO镜像。
系统配置
节点数量:2台虚拟机
硬件配置:2核CPU,4G内存,35G硬盘空间
网络配置:多个节点之间网络互通,每个节点可以访问外网
通过virtualbox创建两台虚拟机,分别为master01和node01,分配2核CPU,4G内存,35G硬盘空间。网络配置双网卡,一张为NAT网卡用于连接互联网,一张为host-only网卡用于同宿主机及虚拟机进行通信,IP地址分别配置为
192.168.100.100/24
和192.168.100.101/24
。
2. 主机初始化设置
设置主机名
[root@node01 ~]$ hostnamectl set-hostname master01 [root@node01 ~]$ hostnamectl set-hostname node01
配置主机hosts文件
这段命令的作用是将以下两行内容追加到 /etc/hosts 文件中:
>>
是重定向操作符,表示将输出追加到指定文件的末尾,而不是覆盖文件内容。<<EOF ... EOF
这是一个所谓的“Here Document”语法,表示多行输入。<<EOF
表示开始一个 Here Document,直到遇到EOF
结束标记(可以是其他标记符,但EOF
是最常用的)。
cat >> /etc/hosts <<EOF 192.168.100.100 master01 192.168.100.101 node01 EOF
检查DNS解析
确保DNS配置正常,可以正常访问外网。
[root@node01 ~]$ cat /etc/resolv.conf # Generated by NetworkManager search lan nameserver 192.168.110.1
备注:DNS 配置可以是宿主机的本地网络 DNS服务器,由路由器或本地网络配置自动分配的。也可以是公共DNS服务器的地址,例如,Google 的 8.8.8.8 和 8.8.4.4。
3. 安全配置
关闭防火墙
Kubernetes 依赖于多个组件之间的网络通信,包括节点之间、POD 之间以及与控制平面组件的通信。firewalld 是 Linux 上一个动态管理防火墙的工具,它可能会默认阻止某些必要的端口或协议,导致 Kubernetes 组件无法正常通信。
[root@node01 ~]$ systemctl stop firewalld [root@node01 ~]$ systemctl disable firewalld [root@node01 ~]$ systemctl status firewalld
关闭SElinux
SELinux (Security-Enhanced Linux) 是一个 Linux 内核模块,用于提供访问控制安全策略。它通过强制访问控制(MAC)来限制系统中的进程和用户,防止未经授权的访问和操作。关闭 firewalld 和 SELinux 可以简化 Kubernetes 部署过程中的网络和权限管理问题。
# 编辑 /etc/selinux/config 文件 vim /etc/selinux/config # 将 SELINUX=enforcing 改为 SELINUX=disabled SELINUX=disabled #SELINUX=enforcing # 保存并退出文件,然后重启系统 reboot # 检查selinux状态 [root@node01 ~]$ sestatus SELinux status: disabled [root@node01 ~]$ getenforce Disabled
上述修改操作也可以通过sed命令来实现
sed -r -i '/^(SELINUX)=(.*)/c\SELINUX=disabled' /etc/selinux/config # 这条 sed 命令的完整含义是: # 在文件 /etc/selinux/config 中,找到以 SELINUX= 开头的行,将整行替换为 SELINUX=disabled。 # -r # 这个选项启用 sed 的扩展正则表达式模式。扩展正则表达式比基本正则表达式更强大,支持更多的元字符。 # -i # 这个选项表示 sed 将直接在文件中进行修改,而不是将结果输出到标准输出(即命令行中显示结果)。 # 带有 -i 的 sed 会直接修改文件内容。 /:正则表达式的分隔符。 ^:匹配行首。 (SELINUX):匹配 "SELINUX" 并将其放入捕获组。 =:匹配等号。 (.*):匹配等号后面的任意字符,并将其放入捕获组。 /:正则表达式的结束分隔符。 c\:sed 的替换命令,表示将匹配的整行替换为后面的内容。 SELINUX=disabled:替换内容。
关闭swap分区
swap交换空间是一种将内存中的数据临时存储到磁盘上的机制,它在内存不足时辅助系统运行。但在 Kubernetes 集群中,启用 Swap 可能会干扰节点的稳定性和性能,因此通常建议在 Kubernetes 节点上禁用 Swap。
# 这条命令的作用是立即关闭系统上所有的交换分区和交换文件,使系统停止使用 Swap。这是一个即时生效的操作。 [root@master ~]$ swapoff -a # -i :表示直接修改文件 # /swap/:匹配包含 swap 的行。 # s/^/#/:表示将匹配行的行首添加 #,即注释掉该行。 [root@master ~]$ sed -i '/swap/s/^/#/' /etc/fstab
4. 时间同步
chrony
是一个用于同步系统时间的网络时间协议 (NTP) 客户端和服务器软件。
安装chrony客户端
yum install chrony
配置chrony
chrony
的主配置文件是/etc/chrony.conf
。安装chrony
后,可以根据需要编辑此文件进行配置。服务器配置:指定 NTP 服务器。可以在
chrony.conf
文件中添加或修改server
行,例如:# Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/j oin.html). #pool pool.ntp.org iburst server ntp.ntsc.ac.cn iburst server ntp1.aliyun.com iburst #server cn.pool.ntp.org iburst # Record the rate at which the system clock gains/losses time . driftfile /var/lib/chrony/drift # Allow the system clock to be stepped in the first three upd ates # if its offset is larger than 1 second. makestep 1.0 3 # Enable kernel synchronization of the real-time clock (RTC). rtcsync # Enable hardware timestamping on all interfaces that support it. #hwtimestamp * # Increase the minimum number of selectable sources required to adjust # the system clock. #minsources 2 # Allow NTP client access from local network. #allow 192.168.0.0/16 # Serve time even if not synchronized to a time source. #local stratum 10 # Specify file containing keys for NTP authentication. #keyfile /etc/chrony.keys # Get TAI-UTC offset and leap seconds from the system tz data base. #leapsectz right/UTC # Specify directory for log files. logdir /var/log/chrony # Select which information is logged. #log measurements statistics tracking
启动chrony
重启
chrony
服务systemctl restart chronyd
启用
chrony
开机自启动systemctl enable chronyd
检查
chrony
服务状态systemctl status chronyd
手动对时
在 chrony 刚刚启动时,可能需要一些时间来逐步调整系统时间,尤其是当时间偏移较大时。你可以手动触发时间同步进行快速调整。
chronyc makestep
这个命令会立即调整系统时间,而不是逐步调整。
备注:理论上在配置文件中配置了
makestep 1.0 3
,代表如果系统时间与 NTP 服务器的时间差大于1秒(1.0
),chrony
将在前3次 (3
)校正期间立即调整系统时间,而不是逐步调整。但是chrony服务仅会在启动时进行检测,由于使用了虚拟机,如果采用休眠的方式,会导致服务器时钟停滞,但是chrony服务未停止的情况,此时最好重启chrony服务。验证chrony配置
你可以使用
chronyc tracking
命令来检查 chrony 的状态和同步情况,这个命令会显示诸如当前偏移量、频率偏移、根延迟等信息。使用
chronyc sources -v
命令查看 chrony 的源状态,这个命令会列出所有配置的时间源及其状态。
5. 内核模块加载
内核模块的概念
内核模块是Linux内核的扩展组件,以动态加载方式提供特定功能(如驱动、网络协议栈等),无需重新编译内核。模块通过.ko文件(内核对象)存储,通常位于/lib/modules/$(uname -r)/kernel/目录。
依赖处理:
modprobe
会自动解析模块依赖关系,按需加载关联模块(如br_netfilter
依赖bridge
模块)。动态性:模块可运行时加载或卸载,避免内核冗余功能占用资源。
永久加载br_netfilter模块
# 加载br_netfilter模块,立即生效,重启后失效 [root@master ~]$ modprobe br_netfilter # 模块加载持久化 [root@master ~]$ echo br\_netfilter >> /etc/modules-load.d/k8s.conf
br_netfilter模块允许iptables规则在Linux网桥设备上生效,解决同一节点内Pod通过Service通信时的流量转发问题。若未加载此模块,同节点内Pod间通过Service的通信会因流量直接通过网桥二层转发(绕过iptables规则)而失败。多数CNI会创建二层网桥(如cni0、docker0),而kube-proxy网络策略依赖iptables规则来做DNAT/SNAT/过滤。
修改内核参数
备注:管理服务使用
systemctl
,调整内核行为使用sysctl
。# 修改内核参数 # 该参数配置允许Linux内核转发IPv4数据包,是容器跨节点通信的基础 [root@master ~]$ echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/99-sysctl.conf # 当数据包经过网桥时,需要将 IPv4 数据包传递给iptables 进行处理 [root@master ~]$ echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.d/99-sysctl.conf # 当数据包经过网桥时,需要将 IPv6 数据包传递给iptables 进行处理 [root@master ~]$ echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.d/99-sysctl.conf # 加载配置 [root@master ~]$ sysctl -p
启用IP转发(net.ipv4.ip_forward = 1)
该参数配置允许Linux内核转发IPv4数据包,是容器跨节点通信的基础。Kubernetes要求Pod能够跨节点互通,而IP转发功能使得节点能够作为路由器转发Pod间的流量,确保集群网络模型的连通性。
桥接流量调用iptables(net.bridge.bridge-nf-call-iptables = 1)
此参数强制桥接设备在二层转发时调用三层iptables规则(包括NAT和conntrack)。Kubernetes依赖iptables实现Service的负载均衡和网络策略,若未启用此参数,Service的IPVS或iptables规则可能无法正确处理同一节点内Pod间的流量,导致连接异常。
验证内核模块加载及参数修改
[root@master ~]$ lsmod | grep br_netfilter # 验证参数 [root@master ~]$ sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1 [root@master ~]$ sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-iptables = 1
6. IPVS功能
在Kubernetes集群部署中,安装ipset和ipvsadm的主要目的是支持IPVS模式的负载均衡功能,这是kube-proxy组件实现服务发现和流量转发的关键依赖。若计划使用kube-proxy的IPVS模式(非默认的iptables模式),则必须加载ip_vs系列模块并安装ipvsadm。
备注:IPVS模式在大规模集群中性能更优,支持会话保持等高级特性。
安装ipset和ipvsadm包
yum install ipset ipvsadm –y
- ipset作用:
ipset
是iptables的扩展工具,用于高效管理IP地址集合。在IPVS模式下,kube-proxy会利用ipset存储Service的VIP(虚拟IP)和后端Pod IP的映射关系,通过哈希表实现快速匹配,避免iptables线性匹配的性能瓶颈。 - ipvsadm作用:
ipvsadm
是用户空间的管理工具,用于操作内核中的IPVS模块。kube-proxy通过它创建虚拟服务(VIP)并定义负载均衡算法(如轮询、最小连接等),将流量分发到后端Pod。
- ipset作用:
永久加载IPVS相关模块
# 模块加载持久化 [root@master ~]$ cat <<EOF >> /etc/modules-load.d/ipvs.confoverlayip_vsip_vs_rrip_vs_wrrip_vs_shnf_conntrackEOF# 手动加载模块,立即生效[root@master ~]$ modprobe overlay[root@master ~]$ modprobe ip_vs && modprobe ip_vs_rr && modprobe ip_vs_wrr && modprobe ip_vs_sh && modprobe nf_conntrack
- overlay模块(必要) :OverlayFS 文件系统模块。容器运行时(containerd、Docker、CRI-O)通常使用 overlay2 存储驱动,需要该模块。没有它可能退回到其他存储驱动,性能和兼容性都不如 overlay2。
- ip_vs模块:内核四层负载均衡(IPVS)核心模块。(传输层)
- ip_vs_rr & ip_vs_wrr & ip_vs_sh模块:IPVS 的三种调度算法模块(轮询、加权轮询、源地址哈希)。kube-proxy 以 IPVS 模式工作时会用到它们。
- nf_conntrack模块(必要) :连接跟踪模块,NAT、Stateful 防火墙、NodePort/Service 等都依赖连接跟踪。通常系统会自动加载,但显式写入可避免环境差异。
验证
lsmod | egrep 'ip_vs|nf_conntrack|overlay'