VMware+CentOS7实战:手把手教你用kubeadm搭建3节点k8s集群(避坑指南)
VMware+CentOS7实战:3节点k8s集群搭建全流程与深度避坑指南
在本地开发环境中搭建Kubernetes集群已成为云原生技术学习者的必修课。不同于公有云平台的一键部署,本地虚拟机环境更能锻炼系统配置和故障排查能力。本文将基于VMware Workstation 16 Pro和CentOS 7.9,详细演示如何构建一个包含1个master节点和2个worker节点的生产级k8s集群,重点解析20个关键配置陷阱及其解决方案。
1. 环境准备:虚拟机配置的艺术
1.1 VMware虚拟机参数优化
创建虚拟机时,典型配置往往无法满足k8s集群需求。推荐以下硬件配置方案:
| 组件 | Master节点规格 | Worker节点规格 | 必要性说明 |
|---|---|---|---|
| vCPU | 2核 | 2核 | 调度器需要计算资源 |
| 内存 | 4GB | 3GB | etcd对内存敏感 |
| 磁盘 | 40GB | 30GB | 系统+容器镜像存储 |
| 网络适配器 | NAT+Host-only | NAT+Host-only | 双网卡保障通信可靠性 |
注意:VMware默认的NAT模式可能导致节点间通信异常,建议为每台虚拟机添加Host-only网卡作为第二网络接口
1.2 CentOS 7系统定制化安装
选择Minimal Install版本后,需手动添加必要工具包:
# 基础工具集安装
yum install -y vim wget net-tools epel-release
# 开发工具链(后续编译依赖)
yum groupinstall -y "Development Tools"
关键系统参数调整:
# 关闭透明大页面(THP)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 优化文件描述符限制
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
2. 集群基础配置:超越官方文档的实践
2.1 网络架构设计实战
推荐的双网卡配置方案:
- ens33(NAT):用于外网访问
- ens34(Host-only):节点间通信
静态IP配置模板(以master节点为例):
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.152.130"
GATEWAY="192.168.152.2"
DNS1="8.8.8.8"
DNS2="114.114.114.114"
2.2 系统内核参数调优
创建/etc/sysctl.d/k8s.conf文件,添加以下内容:
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 524288
fs.file-max = 52706963
执行生效命令:
sysctl --system
modprobe br_netfilter
3. 组件安装:版本兼容性矩阵
3.1 Docker CE定制化安装
使用阿里云镜像源安装特定版本:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-20.10.17 docker-ce-cli-20.10.17 containerd.io
关键配置项(/etc/docker/daemon.json):
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"registry-mirrors": [
"https://registry.cn-hangzhou.aliyuncs.com"
]
}
3.2 Kubeadm全家桶部署
版本匹配关系参考:
| Kubernetes版本 | Docker版本范围 | 兼容性说明 |
|---|---|---|
| 1.24+ | 20.10.17+ | 需containerd运行时 |
| 1.20-1.23 | 19.03.13+ | 支持docker-shim |
| 1.18-1.19 | 18.09.7+ | 需关闭cgroup v2 |
安装命令示例(v1.24.3版本):
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF
yum install -y kubelet-1.24.3 kubeadm-1.24.3 kubectl-1.24.3
systemctl enable --now kubelet
4. 集群初始化:生产级配置指南
4.1 Master节点初始化
使用预拉取镜像方案加速部署:
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
初始化命令(带注释说明):
kubeadm init \
--apiserver-advertise-address=192.168.152.130 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.24.3 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--upload-certs \
--control-plane-endpoint=cluster-endpoint:6443 \
--ignore-preflight-errors=Swap
4.2 Worker节点加入集群
生成永不过期的join token:
kubeadm token create --ttl 0 --print-join-command
节点加入后常见问题处理:
- 证书过期错误:在master节点执行
kubeadm certs renew all - NodeNotReady状态:检查kubelet日志
journalctl -u kubelet -f - CNI未就绪:确保网络插件已正确安装
4.3 网络插件选型对比
主流CNI插件性能指标:
| 插件名称 | 网络模式 | 性能损耗 | 配置复杂度 | 适用场景 |
|---|---|---|---|---|
| Flannel | Overlay | 15-20% | 简单 | 开发测试环境 |
| Calico | BGP路由 | 5-8% | 中等 | 生产环境 |
| Cilium | eBPF | 3-5% | 复杂 | 高性能场景 |
| Weave Net | Overlay | 18-22% | 简单 | 小规模集群 |
Flannel安装示例:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
5. 验证与排错:从理论到实践
5.1 集群健康检查
综合验证命令集:
# 检查节点状态
kubectl get nodes -o wide
# 查看核心组件状态
kubectl get pods -n kube-system
# 测试DNS解析
kubectl run -it --rm --image=busybox:1.28 test-dns -- nslookup kubernetes.default
# 网络连通性测试
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
curl $(kubectl get svc nginx -o jsonpath='{.spec.clusterIP}')
5.2 典型问题解决方案
问题1:cgroup驱动不匹配
# 检查docker使用的cgroup驱动
docker info | grep -i cgroup
# 修改kubelet配置
sed -i 's/cgroupDriver: systemd/cgroupDriver: cgroupfs/' /var/lib/kubelet/config.yaml
systemctl restart kubelet
问题2:镜像拉取失败
# 手动拉取镜像并重新tag
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6
问题3:端口冲突
# 检查端口占用情况
ss -tulnp | grep 6443
# 修改apiserver端口
vim /etc/kubernetes/manifests/kube-apiserver.yaml
6. 生产环境增强配置
6.1 持久化存储方案
本地存储配置示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /mnt/disks/vol1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
6.2 监控与日志方案
最小化监控栈部署:
# 安装Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 部署Prometheus Operator
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack
日志收集配置:
# 安装Fluentd daemonset
kubectl apply -f https://raw.githubusercontent.com/fluent/fluentd-kubernetes-daemonset/master/fluentd-daemonset.yaml
在完成所有配置后,建议运行kubectl-conformance测试套件验证集群符合性。实际使用中发现,CentOS 7的内核参数需要特别调优才能获得最佳性能,特别是在大量Pod创建场景下,需要调整vm.max_map_count等参数。
更多推荐
所有评论(0)