k8s部署

956 阅读4分钟

最近在学k8s,由于本人有三台超算服务器,并且每台计算需求不同,故作出以下分配

IP节点原因性能
192.168.124.5Worker Node因为负载最低,适合跑新Pod112核,187g运行内存
192.168.124.19Master Node负载中等,适合承担控制面任务104核,187g运行内存
192.168.124.18Worker Node性能最好,但负载高,不当Master,避免加重控制面压力96核,251g运行内存

✅ 这样设计的好处是:

  • Master节点负载稳定,保持控制面健康。
  • 工作节点资源最大化利用,不干扰API Server的管理任务。
  • 部署弹性好,后续可以加节点,扩Pod。

总部署思路

  1. 三台机器全部统一基础环境(关闭swap、同步时间、安装Containerd、kubeadm、kubelet、kubectl)
  2. 在192.168.124.19上初始化集群kubeadm init
  3. 192.168.124.5 和 192.168.124.18作为Worker节点join进来
  4. 装网络插件(比如Flannel)保证Pod通信

第一步:所有服务器进行环境准备

三台机器(Master + Worker + Worker)上,分别执行以下操作:

  • 1.关闭Swap分区

    • 查看当前Swap挂载情况:

      cat /proc/swaps
      
    • 编辑 /etc/fstab 文件,把与Swap相关的行注释掉(加#)。

    • 立即关闭Swap:

      swapoff -a
      
    • 目的:K8s要求禁用Swap,否则kubelet会报错。

  • 2.配置ulimit资源限制

    • 往 /etc/security/limits.conf,添加以下内容:

      cat <<EOF | sudo tee -a /etc/security/limits.conf
      * soft nofile 655360
      * hard nofile 131072
      * soft nproc 655350
      * hard nproc 655350
      * soft memlock unlimited
      * hard memlock unlimited
      EOF
      
    • 临时生效:

      ulimit -SHn 65535
      
  • 3.加载IPVS负载均衡内核模块

    • 写入模块配置文件 /etc/modules-load.d/ipvs.conf

      cat <<EOF | sudo tee -a /etc/modules-load.d/ipvs.conf
      ip_vs
      ip_vs_rr
      ip_vs_wrr
      ip_vs_sh
      nf_conntrack
      ip_tables
      ip_set
      xt_set
      ipt_set
      ipt_rpfilter
      ipt_REJECT
      ipip
      EOF
      
    • 重启模块加载服务:

      systemctl restart systemd-modules-load.service
      
    • 检查模块是否加载成功:

      lsmod | grep -e ip_vs -e nf_conntrack
      

      可以得到:

      模块名大小 (Bytes)被引用次数依赖模块
      ip_vs_sh122880-
      ip_vs_wrr122880-
      ip_vs_rr122880-
      ip_vs2375686ip_vs_rr, ip_vs_sh, ip_vs_wrr
      nf_conntrack_netlink655360-
      nf_conntrack2293767xt_conntrack, nf_nat, nft_ct, xt_nat, nf_conntrack_netlink, xt_MASQUERADE, ip_vs
      nf_defrag_ipv6245762nf_conntrack, ip_vs
      nf_defrag_ipv4122881nf_conntrack
      nfnetlink204806nft_compat, nf_conntrack_netlink, nf_tables, ip_set
      libcrc32c122885nf_conntrack, nf_nat, nf_tables, xfs, ip_vs
  • 4.配置内核参数(Sysctl)

    • 写入 /etc/sysctl.d/k8s.conf 文件,内容包含网络转发、TCP优化、文件句柄等设置
    cat <<EOF | sudo tee -a /etc/sysctl.d/k8s.conf
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward = 1
    fs.may_detach_mounts = 1
    vm.overcommit_memory=1
    vm.panic_on_oom=0
    fs.inotify.max_user_watches=89100
    fs.file-max=52706963
    fs.nr_open=52706963
    net.netfilter.nf_conntrack_max=2310720
    net.ipv4.tcp_keepalive_time = 600
    net.ipv4.tcp_keepalive_probes = 3
    net.ipv4.tcp_keepalive_intvl = 15
    net.ipv4.tcp_max_tw_buckets = 36000
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_max_orphans = 327680
    net.ipv4.tcp_orphan_retries = 3
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_max_syn_backlog = 16384
    net.ipv4.ip_conntrack_max = 65536
    net.ipv4.tcp_max_syn_backlog = 16384
    net.ipv4.tcp_timestamps = 0
    net.core.somaxconn = 16384
    net.ipv6.conf.all.disable_ipv6 = 0
    net.ipv6.conf.default.disable_ipv6 = 0
    net.ipv6.conf.lo.disable_ipv6 = 0
    net.ipv6.conf.all.forwarding = 1
    br_netfilter
    EOF
    
    • 应用生效:
    sudo sysctl --system
    

第二步:所有服务器安装基础软件

  1. 安装containerd容器运行时

    • 安装前提工具 sudo dnf install -y yum-utils device-mapper-persistent-data lvm2

    • 添加仓库 sudo yum-config-manager --add-repo download.docker.com/linux/cento…

    • 换源 sudo rm -f /etc/yum.repos.d/docker-ce.repo sudo tee /etc/yum.repos.d/docker-ce.repo <<-'EOF' [docker-ce-stable] name=Docker CE Stable - aliyun baseurl=mirrors.aliyun.com/docker-ce/l… enabled=1 gpgcheck=0 EOF

    • 安装containerd:

      sudo dnf install -y containerd.io
      
    • 配置containerd(生成默认配置):

      mkdir -p /etc/containerd
      sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
      
    • 启动并设置开机自启:

      systemctl restart containerd
      systemctl enable containerd
      
  2. 安装Kubernetes相关组件

    • 添加Kubernetes官方或阿里云yum源。 cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=mirrors.aliyun.com/kubernetes/… enabled=1 gpgcheck=0 EOF

    • 安装:

      dnf install -y kubelet kubeadm kubectl
      
    • 设置kubelet开机自启:

      systemctl enable kubelet
      

第三步:Master节点(192.168.124.19)初始化集群

  1. 在Master节点执行初始化

    • 指定广告IP和Pod网段(这里我们用Flannel的10.244.0.0/16):

      sudo kubeadm init --apiserver-advertise-address=192.168.124.19 --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers
      

      若失败,排查一下原因,再执行sudo kubeadm reset重置之后重新初始化。

  2. 保存输出的join命令

    • kubeadm init成功后,会输出一条kubeadm join命令,保存下来供Worker节点使用。
  3. 配置kubectl访问集群

    • 初始化用户kubeconfig:

      mkdir -p $HOME/.kube
      cp /etc/kubernetes/admin.conf $HOME/.kube/config
      chown $(id -u):$(id -g) $HOME/.kube/config
      

第四步:安装网络插件(CNI插件)

在Master节点执行:

  1. 部署Flannel网络插件

    • 应用官方Flannel部署文件:

      kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
      
    • 作用:建立Pod到Pod之间的网络通信。

      image.png


第五步:Worker节点加入集群

在Worker节点(192.168.124.5 和 192.168.124.18)分别执行:

  1. 执行join命令

    • 使用Master节点初始化时保存的命令,比如:

      kubeadm join 192.168.124.19:6443 --token xxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxx
      

第六步:验证集群状态

回到Master节点,执行:

kubectl get nodes

你应该能看到:

  • 1个Master节点(192.168.124.19)状态Ready
  • 2个Worker节点(192.168.124.5 和 192.168.124.18)状态Ready

至此,完整的Kubernetes三节点集群搭建完成!

你的整体部署架构(示意图)

               +----------------------+
               |    Master节点          |
               | 192.168.124.19         |
               |  CentOS 9              |
               +----------+------------+
                          |
     +--------------------+--------------------+
     |                                         |
+----v----+                             +------v----+
| Worker  |                             |  Worker   |
| 192.168.124.5                        | 192.168.124.18 |
| Rocky9  |                             | Rocky8.5 |
+---------+                             +-----------+

所有节点通过网络互联,Pod之间通过Flannel跨节点通信。