k8s-02-环境准备及优化
02 K8S 环境准备及基础优化
2.1 环境准备
| 主机名 | IP 地址 | 操作系统 | 硬件配置 |
|---|---|---|---|
| master34 | 192.168.0.34 | Ubuntu 22.04 LTS | 2C+,4G+,50G+ |
| worker35 | 192.168.0.35 | Ubuntu 22.04 LTS | 2C+,4G+,50G+ |
| worker36 | 192.168.0.36 | Ubuntu 22.04 LTS | 2C+,4G+,50G+ |
💡 部署 K8S 集群建议使用 root 用户操作。
2.2 Linux 基础优化
1)关闭 swap 分区
# 临时关闭,服务器重启后配置失效
swapoff -a && sysctl -w vm.swappiness=0
# 基于配置文件关闭,重启后依旧有效
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab2)确保各个节点 MAC 地址或 product_uuid 唯一
apt install net-tools
# 查看 MAC 地址(三节点必须互不相同)
root@master34:~# ifconfig ens33 | grep ether | awk '{print $2}'
00:0c:29:75:d7:32
root@worker35:~# ifconfig ens33 | grep ether | awk '{print $2}'
00:0c:29:4f:55:b8
root@worker36:~# ifconfig ens33 | grep ether | awk '{print $2}'
00:0c:29:ad:6c:49
# 查看 product_uuid(同样必须唯一)
root@master34:~# cat /sys/class/dmi/id/product_uuid
0c9a4d56-ca43-c602-d605-08769975d732
root@worker35:~# cat /sys/class/dmi/id/product_uuid
93d54d56-9cba-7fda-1a34-1fdc894f55b8
root@worker36:~# cat /sys/class/dmi/id/product_uuid
b1b24d56-9a26-b448-33f8-b1dc15ad6c49📚 温馨提示:一般来讲,硬件设备会拥有唯一的地址,但有些虚拟机的地址可能会重复。Kubernetes 使用这些值来唯一确定集群中的节点,如果这些值在每个节点上不唯一,可能会导致安装失败。
3)检查网络节点是否互通
简而言之,就是检查 K8S 集群各节点是否互通,可以使用 ping 命令来测试:
ping baidu.com -c 104)允许 iptables 检查桥接流量
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system5)检查端口是否被占用
参考链接:K8S 官方文档 - 端口与协议
对照官方端口表,检查 master 节点和 worker 节点的各组件端口是否被占用。
6)Linux 内核优化
cat > /etc/sysctl.d/k8s.conf <<'EOF'
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv6.conf.all.disable_ipv6 = 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
EOF
# 加载所有系统级的内核参数配置文件,并立即生效
sysctl --system2.3 安装 ipvsadm 以实现 kube-proxy 的负载均衡
1)安装 ipvsadm 等相关工具
apt -y install ipvsadm ipset sysstat conntrack2)所有节点创建开机自动加载的模块配置文件
cat > /etc/modules-load.d/ipvs.conf << 'EOF'
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_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF2.4 安装 docker 环境
1)安装 docker
wget http://192.168.14.253/Resources/Docker/scripts/lsyedu-autoinstall-docker-docker-compose.tar.gz
tar xf lsyedu-autoinstall-docker-docker-compose.tar.gz
./install-docker.sh i2)检查 cgroup 驱动是否是 systemd
root@master231:~# docker info | grep "Cgroup Driver:"
Cgroup Driver: systemd
root@worker232:~# docker info | grep "Cgroup Driver:"
Cgroup Driver: systemd
root@worker233:~# docker info | grep "Cgroup Driver:"
Cgroup Driver: systemd2.5 所有节点安装 kubeadm、kubelet、kubectl
1)软件包说明
| 软件包 | 形象比喻 | 作用 |
|---|---|---|
| kubeadm | 盖房子(一次性) | 用来初始化 K8S 集群的工具 |
| kubelet | 看房子(长期运行) | 底层用到了静态 Pod 技术启动 master 组件及 Pod 生命周期管理 |
| kubectl | 管房子(发号施令) | 用来与 K8S 集群通信的命令行工具 |
⚠️ kubeadm 不能帮你安装或者管理 kubelet 或 kubectl,所以你需要确保它们与通过 kubeadm 安装的控制平面(master)的版本相匹配,否则存在版本偏差风险,可能导致预料之外的错误。控制平面与 kubelet 相差一个次要版本是支持的,但 kubelet 的版本不可以超过 API SERVER 的版本(例如 1.7.0 的 kubelet 可以兼容 1.8.0 的 API SERVER,反之则不可以)。
2)K8S 所有节点配置软件源
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update3)查看当前环境支持的 K8S 版本
root@master231:~# apt-cache madison kubeadm
kubeadm | 1.28.2-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
kubeadm | 1.28.1-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
kubeadm | 1.28.0-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
...
kubeadm | 1.23.17-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
kubeadm | 1.23.16-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
...4)所有节点安装 kubelet、kubeadm、kubectl
apt-get -y install kubelet=1.23.17-00 kubeadm=1.23.17-00 kubectl=1.23.17-00📦 离线安装方式:软件包已打包好放在 nginx 站点目录,可跳过上面 2~4 步:
wget http://192.168.14.253/Resources/Kubernetes/K8S%20Cluster/kubeadm/softwares/lsyedu-kubeadm-kubectl-kubelet-1.23.17.tar.gz
tar xf lsyedu-kubeadm-kubectl-kubelet-1.23.17.tar.gz
dpkg -i *.deb✅ 彩蛋:Ubuntu 打包软件
root@worker35:~# cd /var/cache/apt/archives root@worker35:/var/cache/apt/archives# ls -1 *.deb | xargs tar zcf lsyedu-kubeadm-kubectl-kubelet-1.23.17.tar.gz root@worker35:/var/cache/apt/archives# tar tf lsyedu-kubeadm-kubectl-kubelet-1.23.17.tar.gz apt-transport-https_2.4.14_all.deb conntrack_1%3a1.4.6-2build2_amd64.deb cri-tools_1.26.0-00_amd64.deb ebtables_2.0.11-4build2_amd64.deb kubeadm_1.23.17-00_amd64.deb kubectl_1.23.17-00_amd64.deb kubelet_1.23.17-00_amd64.deb kubernetes-cni_1.2.0-00_amd64.deb socat_1.7.4.1-3ubuntu4_amd64.deb
5)检查各组件版本
参考链接:安装 kubectl
root@master34:~# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.17", GitCommit:"953be8927218ec8067e1af2641e540238ffd7576", GitTreeState:"clean", BuildDate:"2023-02-22T13:33:14Z", GoVersion:"go1.19.6", Compiler:"gc", Platform:"linux/amd64"}
root@master34:~# kubectl version
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.17", GitCommit:"953be8927218ec8067e1af2641e540238ffd7576", GitTreeState:"clean", BuildDate:"2023-02-22T13:34:27Z", GoVersion:"go1.19.6", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
root@master34:~# kubelet --version
Kubernetes v1.23.17💡 此时kubectl version报localhost:8080 refused是正常现象:集群尚未初始化,kubectl 还没有可连接的 API Server,完成后续集群初始化后即恢复。worker232、worker233 验证输出与上面一致(均为 v1.23.17)。
2.6 时区优化及快照
1)检查时区
ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ll /etc/localtime
# 以 RFC 2822 格式显示当前时间和时区
date -R
Tue, 06 Jan 2026 10:40:14 +08002)验证 CPU 核心数
root@master34:~# lscpu | grep ^CPU\(s\)
CPU(s): 2
root@worker34:~# lscpu | grep ^CPU\(s\)
CPU(s): 2
root@worker34:~# lscpu | grep ^CPU\(s\)
CPU(s): 23)重启操作系统
reboot4)验证加载的模块
lsmod | grep --color=auto -e ip_vs -e nf_conntrack
free -h以 master34 为例(worker35、worker36 输出一致):
nf_conntrack_netlink 49152 0
nfnetlink 20480 5 nft_compat,nf_conntrack_netlink,nf_tables,ip_set
ip_vs_ftp 16384 0
nf_nat 49152 3 nft_chain_nat,xt_MASQUERADE,ip_vs_ftp
ip_vs_sed 16384 0
ip_vs_nq 16384 0
ip_vs_fo 16384 0
ip_vs_sh 16384 0
ip_vs_dh 16384 0
ip_vs_lblcr 16384 0
ip_vs_lblc 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs_wlc 16384 0
ip_vs_lc 16384 0
ip_vs 176128 24 ip_vs_wlc,ip_vs_rr,ip_vs_dh,ip_vs_lblcr,ip_vs_sh,ip_vs_fo,ip_vs_nq,ip_vs_lblc,ip_vs_wrr,ip_vs_lc,ip_vs_sed,ip_vs_ftp
nf_conntrack 172032 5 xt_conntrack,nf_nat,nf_conntrack_netlink,xt_MASQUERADE,ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
nf_defrag_ipv4 16384 1 nf_conntrack
libcrc32c 16384 6 nf_conntrack,nf_nat,btrfs,nf_tables,raid456,ip_vs
root@master34:~# free -h
total used free shared buff/cache available
Mem: 3.8Gi 336Mi 3.0Gi 1.0Mi 420Mi 3.2Gi
Swap: 0B 0B 0B📚 温馨提示:Linux kernel 4.19+ 版本已经将之前的nf_conntrack_ipv4模块更名为nf_conntrack模块哟~
5)关机拍快照
关机并拍摄快照,建议快照名称:k8s基础优化环境准备就绪