深入解析KubeKey配置文件:从零搭建K8s与KubeSphere集群
1. KubeKey配置文件基础解析
第一次接触KubeKey的config-sample.yaml文件时,我盯着那密密麻麻的YAML结构看了足足十分钟。这个看似复杂的配置文件,其实就像乐高说明书——只要掌握关键模块的组装逻辑,就能搭建出稳定的K8s和KubeSphere集群。
配置文件的核心结构分为两大部分:Cluster配置和ClusterConfiguration配置。前者定义Kubernetes集群的基础架构,后者控制KubeSphere组件的安装选项。我习惯用树状结构来理解:
config-sample.yaml
├── Cluster (K8s集群骨架)
│ ├── hosts (节点信息)
│ ├── roleGroups (角色分组)
│ ├── kubernetes (K8s版本参数)
│ └── addons (扩展插件)
└── ClusterConfiguration (KubeSphere血肉)
├── etcd (监控配置)
└── devops (可选组件)
生产环境中最常见的配置失误往往发生在hosts段。比如有次我给某企业部署时,internalAddress误填了公网IP,导致节点间通信始终走公网带宽。正确的配置应该像这样:
hosts:
- name: master
address: 203.0.113.10 # 公网SSH地址
internalAddress: 10.0.0.10 # 内网通信地址
user: root
password: "SecurePass123!"
2. etcd集群配置实战技巧
etcd作为Kubernetes的大脑,配置不当会导致整个集群不稳定。经过多次生产环境验证,我总结出三个黄金法则:
-
奇数节点原则:生产环境至少部署3个etcd节点,且必须为奇数。我曾测试过2节点集群,当网络分区时直接导致脑裂。
-
隔离部署策略:不要将etcd与worker节点混部。最佳实践是单独配置etcd节点组:
roleGroups:
etcd:
- etcd01
- etcd02
- etcd03
worker:
- worker01
- worker02
- 性能调优参数:高负载环境下需要调整这些关键参数:
etcd:
type: kubekey
heartbeatInterval: 250 # 心跳间隔(ms)
electionTimeout: 5000 # 选举超时(ms)
dataDir: "/data/etcd" # 建议单独挂盘
去年有个客户集群频繁出现leader选举,就是因为默认的electionTimeout(1000ms)在跨机房部署时网络延迟导致。调整为5000ms后立即稳定。
3. Worker节点高级配置
worker配置看似简单,但隐藏着不少玄机。最常见的误区是资源分配:
kubernetes:
maxPods: 250 # 单节点Pod数量上限
podPidsLimit: 4096 # Pod的PID数量限制
nodeCidrMaskSize: 24 # 节点CIDR掩码
关键经验:
- 物理机建议maxPods设置100-250
- 虚拟机建议50-100
- 超过限制会导致Pod创建失败
对于混合工作负载场景,可以通过标签实现精细化调度:
hosts:
- name: gpu-worker01
address: 10.0.0.20
labels:
accelerator: nvidia-t4
storage: ssd
然后在K8s部署时使用nodeSelector匹配:
spec:
nodeSelector:
accelerator: nvidia-t4
4. Addons插件配置详解
addons模块是KubeKey最强大的功能之一。以部署NFS客户端为例:
addons:
- name: nfs-client
namespace: kube-system
sources:
chart:
name: nfs-client-provisioner
repo: https://charts.kubesphere.io/main
values: |
nfs.server: 10.0.0.100
nfs.path: /data/nfs
storageClass.defaultClass: true
避坑指南:
- 先确保NFS服务端已就绪再部署集群
- values内容必须用
|保持多行格式 - 国内环境建议替换repo为阿里云镜像
我曾遇到一个经典案例:客户在集群部署完才搭建NFS,导致PV无法自动创建。解决方法是在KubeKey配置中预先定义addons,或者后续手动执行:
helm install nfs-client --set nfs.server=10.0.0.100 \
--set nfs.path=/data/nfs \
-n kube-system
5. 网络插件选型与配置
Calico是KubeKey的默认网络插件,生产环境推荐以下配置:
network:
plugin: calico
kubePodsCIDR: 10.233.64.0/18 # Pod网段
kubeServiceCIDR: 10.233.0.0/18 # Service网段
multusCNI:
enabled: true # 启用多网卡支持
性能优化参数:
# 在主机上执行
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.rp_filter = 0" >> /etc/sysctl.conf
sysctl -p
遇到网络问题时,可以检查Calico日志:
kubectl logs -n kube-system $(kubectl get pod -n kube-system -l k8s-app=calico-node -o name) -c calico-node
6. 存储方案配置实践
生产环境存储配置需要特别注意:
storage:
openebs:
basePath: /data/openebs # 本地存储路径
ceph:
monitors:
- 10.0.0.101:6789
- 10.0.0.102:6789
pool: kube
adminID: admin
adminSecret: "AQD...=="
经验之谈:
- 开发环境可用OpenEBS LocalPV
- 生产环境推荐Ceph RBD或商业存储
- 提前规划StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
clusterID: ceph-cluster
pool: kube
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: ceph-secret
7. 高可用控制平面配置
对于生产级集群,控制平面高可用必不可少:
controlPlaneEndpoint:
internalLoadbalancer: haproxy # 内置负载均衡
domain: cluster.example.com
address: ""
port: 6443
部署建议:
- 至少3个master节点
- 使用独立负载均衡器时,address填写VIP
- 测试环境可以用nginx替代haproxy
检查apiserver健康状况:
curl -k https://localhost:6443/healthz
8. 镜像仓库配置技巧
国内用户必须配置镜像加速:
registry:
registryMirrors:
- https://registry.cn-hangzhou.aliyuncs.com
insecureRegistries:
- 10.0.0.100:5000 # 私有仓库
离线环境需要预先导入镜像:
./kk artifact export -m manifest.yaml -o kubesphere.tar.gz
./kk artifact import -o kubesphere.tar.gz
9. 集群部署与验证
执行部署命令前建议先做预检查:
./kk create cluster -f config-sample.yaml --skip-install
正式部署:
export KKZONE=cn # 国内环境必须设置
./kk create cluster -f config-sample.yaml
部署完成后验证:
kubectl get nodes -o wide
kubectl get pod -A
10. 生产环境调优建议
根据负载特性调整kubelet参数:
kubernetes:
kubeletArgs:
- --max-pods=150
- --kube-reserved=cpu=500m,memory=1Gi
- --system-reserved=cpu=1000m,memory=2Gi
关键监控指标:
- etcd存储大小(超过2GB需告警)
- apiserver请求延迟
- 节点内存/磁盘压力
记得定期备份etcd:
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save snapshot.db
配置KubeKey的过程就像在精心调校一台精密仪器,每个参数都可能影响最终性能。建议首次部署时保持最小配置,稳定后再逐步添加功能组件。遇到问题多查看/var/log/messages和journalctl -u kubelet日志,往往能找到线索。
更多推荐
所有评论(0)