10.1 容器云部署准备(一) - 实践


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/24192.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。
  • 永久加载IPVS相关模块

    # 模块加载持久化
    [root@master ~]$ cat <<EOF >> /etc/modules-load.d/ipvs.conf
      overlay
      ip_vs
      ip_vs_rr
      ip_vs_wrr
      ip_vs_sh
      nf_conntrack
      EOF
      # 手动加载模块,立即生效
      [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'

posted on 2025-10-04 20:16  ljbguanli  阅读(21)  评论(0)    收藏  举报