最近在学k8s,由于本人有三台超算服务器,并且每台计算需求不同,故作出以下分配
| IP | 节点 | 原因 | 性能 |
|---|---|---|---|
| 192.168.124.5 | Worker Node | 因为负载最低,适合跑新Pod | 112核,187g运行内存 |
| 192.168.124.19 | Master Node | 负载中等,适合承担控制面任务 | 104核,187g运行内存 |
| 192.168.124.18 | Worker Node | 性能最好,但负载高,不当Master,避免加重控制面压力 | 96核,251g运行内存 |
✅ 这样设计的好处是:
- Master节点负载稳定,保持控制面健康。
- 工作节点资源最大化利用,不干扰API Server的管理任务。
- 部署弹性好,后续可以加节点,扩Pod。
总部署思路
- 三台机器全部统一基础环境(关闭swap、同步时间、安装Containerd、kubeadm、kubelet、kubectl)
- 在192.168.124.19上初始化集群(
kubeadm init) - 192.168.124.5 和 192.168.124.18作为Worker节点join进来
- 装网络插件(比如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_sh 12288 0 - ip_vs_wrr 12288 0 - ip_vs_rr 12288 0 - ip_vs 237568 6 ip_vs_rr, ip_vs_sh, ip_vs_wrr nf_conntrack_netlink 65536 0 - nf_conntrack 229376 7 xt_conntrack, nf_nat, nft_ct, xt_nat, nf_conntrack_netlink, xt_MASQUERADE, ip_vs nf_defrag_ipv6 24576 2 nf_conntrack, ip_vs nf_defrag_ipv4 12288 1 nf_conntrack nfnetlink 20480 6 nft_compat, nf_conntrack_netlink, nf_tables, ip_set libcrc32c 12288 5 nf_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 - 写入
第二步:所有服务器安装基础软件
-
安装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
-
-
安装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)初始化集群
-
在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重置之后重新初始化。
-
-
保存输出的join命令
- kubeadm init成功后,会输出一条
kubeadm join命令,保存下来供Worker节点使用。
- kubeadm init成功后,会输出一条
-
配置kubectl访问集群
-
初始化用户kubeconfig:
mkdir -p $HOME/.kube cp /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
-
第四步:安装网络插件(CNI插件)
在Master节点执行:
-
部署Flannel网络插件
-
应用官方Flannel部署文件:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml -
作用:建立Pod到Pod之间的网络通信。
-
第五步:Worker节点加入集群
在Worker节点(192.168.124.5 和 192.168.124.18)分别执行:
-
执行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跨节点通信。