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

节点加入后常见问题处理:

  1. 证书过期错误:在master节点执行kubeadm certs renew all
  2. NodeNotReady状态:检查kubelet日志journalctl -u kubelet -f
  3. 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等参数。

更多推荐