1. Kubernetes节点准备概述
在生产环境中部署Kubernetes集群前,节点准备工作是确保集群稳定运行的关键基础。不同于简单的测试环境,生产级Kubernetes节点需要经过系统化的配置和优化,这包括操作系统参数调整、容器运行时安装、内核模块加载等多个环节。kubeasz作为一款开源的Kubernetes部署工具,提供了一套完整的节点准备方案,能够自动化完成这些繁琐的配置工作。
提示:节点准备阶段的质量直接影响后续集群的稳定性和性能表现,建议在生产部署前充分验证各项配置。
2. 节点准备的核心组件
2.1 操作系统要求与优化
Kubernetes对Linux操作系统有特定的版本要求,通常推荐使用CentOS 7+/Ubuntu 16.04+等主流发行版。kubeasz在节点准备阶段会自动检查以下关键配置:
系统内核参数调整:
- 修改
vm.swappiness为0以减少swap使用 - 调整
vm.overcommit_memory和vm.panic_on_oom优化内存管理 - 设置
net.ipv4.ip_forward=1启用IP转发
- 修改
关键目录挂载配置:
# 确保/var/lib/docker使用单独的分区或磁盘 /dev/sdb1 /var/lib/docker xfs defaults 0 0系统服务管理:
- 禁用不必要的服务(如firewalld/NetworkManager)
- 配置chronyd时间同步服务
2.2 容器运行时安装
kubeasz支持多种容器运行时,默认使用containerd作为推荐方案。安装过程包括:
安装containerd及其依赖:
yum install -y containerd.io runc配置containerd服务:
[plugins."io.containerd.grpc.v1.cri"] sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"验证运行时状态:
ctr version
2.3 Kubernetes组件安装
节点需要预装的核心组件包括:
- kubelet:节点代理服务
- kube-proxy:网络代理组件
- cni-plugins:网络插件
kubeasz会通过以下步骤完成安装:
# 下载并安装二进制文件 wget https://storage.googleapis.com/kubernetes-release/release/v1.23.5/bin/linux/amd64/kubelet install -o root -g root -m 0755 kubelet /usr/local/bin/3. kubeasz节点准备流程详解
3.1 环境预检阶段
kubeasz首先执行precheck.yml剧本进行系统检查:
- 验证CPU架构和指令集支持
- 检查内存和磁盘空间
- 测试网络连通性
- 确认SELinux状态
典型问题处理:
# 如果SELinux开启但未正确配置 setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config3.2 系统初始化配置
kubeasz通过system-init.yml剧本完成:
创建必要的系统用户和组
groupadd -g 2000 docker useradd -u 2000 -g docker docker配置内核模块加载
cat > /etc/modules-load.d/k8s.conf <<EOF br_netfilter ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack_ipv4 EOF优化系统limits.conf
echo "* soft nofile 655360" >> /etc/security/limits.conf echo "* hard nofile 655360" >> /etc/security/limits.conf
3.3 容器运行时部署
containerd部署流程包括:
生成默认配置文件:
containerd config default > /etc/containerd/config.toml配置镜像加速器:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://registry-1.docker.io"]启动并验证服务:
systemctl enable --now containerd ctr images pull docker.io/library/nginx:alpine
4. 常见问题与解决方案
4.1 内核参数不兼容
现象:kubelet启动时报failed to create kubelet错误
排查步骤:
检查内核版本:
uname -r验证内核模块:
lsmod | grep br_netfilter
解决方案:
# 手动加载缺失模块 modprobe br_netfilter echo 'br_netfilter' >> /etc/modules-load.d/k8s.conf4.2 容器镜像拉取失败
现象:Pod状态显示ImagePullBackOff
诊断方法:
检查containerd日志:
journalctl -u containerd -f测试基础镜像拉取:
ctr images pull docker.io/library/busybox:latest
处理方案:
# 配置代理或镜像仓库 mkdir -p /etc/systemd/system/containerd.service.d cat > /etc/systemd/system/containerd.service.d/http-proxy.conf <<EOF [Service] Environment="HTTP_PROXY=http://proxy.example.com:8080/" EOF systemctl daemon-reload systemctl restart containerd4.3 kubelet服务异常
现象:systemctl status kubelet显示不断重启
关键排查点:
检查证书配置:
ls -l /etc/kubernetes/ssl/查看kubelet日志:
journalctl -xeu kubelet --no-pager
典型修复命令:
# 重新生成kubelet配置 kubeadm init phase kubelet-start --config /etc/kubernetes/kubeadm-config.yaml systemctl daemon-reload systemctl restart kubelet5. 生产环境优化建议
5.1 内核参数深度调优
对于高负载集群,建议额外调整:
# 增加连接跟踪表大小 echo "net.netfilter.nf_conntrack_max=1048576" >> /etc/sysctl.d/k8s.conf sysctl -p /etc/sysctl.d/k8s.conf # 优化TCP协议栈 cat >> /etc/sysctl.d/k8s.conf <<EOF net.ipv4.tcp_max_syn_backlog=8192 net.core.somaxconn=32768 net.ipv4.tcp_tw_reuse=1 EOF5.2 容器运行时高级配置
限制容器日志大小:
[plugins."io.containerd.grpc.v1.cri".containers] max_container_log_line_size = 16K配置私有镜像仓库认证:
ctr i pull --user <username>:<password> private.registry/app:latest
5.3 节点资源隔离
配置kubelet资源预留:
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration systemReserved: cpu: "500m" memory: "1Gi" kubeReserved: cpu: "500m" memory: "1Gi"启用Pod QoS:
# 在kubelet启动参数中添加 --qos-reserved=memory=100Mi
6. 验证与测试
6.1 基础功能验证
创建测试Pod:
kubectl run -it --rm --image=busybox:1.28 test -- sh检查网络连通性:
ping kubernetes.default nslookup kubernetes.default
6.2 性能基准测试
节点压力测试:
kubectl apply -f https://k8s.io/examples/application/nginx/nginx-deployment.yaml kubectl scale deployment nginx-deployment --replicas=50监控关键指标:
kubectl top node kubectl get --raw /metrics | grep kubelet_running_pod_count
6.3 高可用测试
模拟节点故障:
systemctl stop kubelet # 观察Pod迁移情况 kubectl get pods -o wide -w恢复验证:
systemctl start kubelet kubectl get nodes
在实际生产部署中,我通常会先在小规模测试环境完整演练所有节点准备步骤,特别是内核参数调整和资源限制配置,这些设置一旦出现问题可能导致节点不可用。kubeasz提供的自动化方案虽然方便,但每个生产环境都有其特殊性,建议根据实际负载特点对参数进行针对性优化。