2026/10/29 7:43:40

单Master节点Kubernetes生产集群实战部署指南

单Master节点Kubernetes生产集群实战部署指南 1. 项目概述最近在帮客户部署生产级Kubernetes集群时发现很多技术文档要么过于简单要么太过复杂。今天我就来分享一个经过实战验证的单Master节点K8S集群搭建方案这个配置已经在多个中小型生产环境稳定运行超过2年。为什么选择单Master架构对于日均访问量在5万以下的中小型应用单Master完全能够满足需求。相比多Master集群它的部署和维护成本要低得多。我们团队实测单Master节点可以轻松支撑50个Node和300Pod的稳定运行。2. 环境准备与系统配置2.1 硬件配置建议生产环境的最低配置要求Master节点4核CPU/8GB内存/100GB SSDWorker节点根据业务需求调整网络千兆内网建议使用独立网卡重要提示千万不要在Master节点上混部业务Pod这个节点应该专用于集群控制平面。2.2 操作系统优化以CentOS 7.9为例必须进行的系统配置# 关闭Swap swapoff -a sed -i /swap/s/^/#/ /etc/fstab # 关闭SELinux setenforce 0 sed -i s/^SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config # 配置内核参数 cat EOF /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 --system3. 核心组件安装与配置3.1 容器运行时选择虽然Docker已经不再是K8S官方推荐的运行时但在生产环境中它仍然是最稳定的选择。我们使用以下版本组合# 安装Docker CE yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce-20.10.12 docker-ce-cli-20.10.12 containerd.io-1.4.12 systemctl enable docker systemctl start docker # 配置Docker镜像加速和cgroup驱动 mkdir -p /etc/docker cat /etc/docker/daemon.json EOF { exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m }, registry-mirrors: [https://registry.docker-cn.com] } EOF systemctl restart docker3.2 kubeadm工具安装cat EOF /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled1 gpgcheck1 repo_gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF # 安装指定版本这里选择1.22.6长期支持版 yum install -y kubelet-1.22.6 kubeadm-1.22.6 kubectl-1.22.6 systemctl enable kubelet4. 集群初始化实战4.1 初始化Master节点这是最关键的步骤我们使用自定义配置kubeadm init \ --apiserver-advertise-address192.168.1.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.22.6 \ --service-cidr10.96.0.0/12 \ --pod-network-cidr10.244.0.0/16 \ --upload-certs初始化完成后务必保存最后的join命令输出这个token默认24小时有效。4.2 网络插件部署我们选择Calico作为网络插件它提供了更好的网络策略支持kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml验证网络插件状态kubectl get pods -n kube-system -l k8s-appcalico-node5. 生产环境关键配置5.1 证书自动续期单Master集群最大的风险是证书过期。配置自动续期# 修改kubelet配置 sed -i s/rotateCertificates: false/rotateCertificates: true/ /var/lib/kubelet/config.yaml systemctl restart kubelet # 设置自动批准 kubectl apply -f - EOF apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: auto-approve-csrs-for-group subjects: - kind: Group name: system:bootstrappers apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: system:certificates.k8s.io:certificatesigningrequests:nodeclient apiGroup: rbac.authorization.k8s.io EOF5.2 关键组件高可用虽然我们是单Master但仍可以做一些高可用配置etcd定期备份# 创建备份脚本 cat /usr/local/bin/etcd-backup.sh EOF #!/bin/bash DATE$(date %Y%m%d) ETCDCTL_API3 etcdctl \ --endpointshttps://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 /data/etcd-snapshot-${DATE}.db EOF chmod x /usr/local/bin/etcd-backup.sh # 添加定时任务 (crontab -l 2/dev/null; echo 0 3 * * * /usr/local/bin/etcd-backup.sh) | crontab -6. 常见问题排查6.1 节点NotReady问题这是最常见的问题排查步骤检查kubelet状态journalctl -u kubelet -n 50 --no-pager检查网络插件日志kubectl logs -n kube-system calico-pod-name检查网络连通性ping 其他节点IP curl -I https://master-ip:64436.2 Pod创建失败典型错误及解决方案ImagePullBackOff# 检查镜像名称是否正确 kubectl describe pod pod-name # 临时解决方案不推荐生产环境 kubectl edit deployment deployment-name # 将imagePullPolicy改为IfNotPresentCrashLoopBackOff# 查看容器日志 kubectl logs pod-name --previous7. 性能优化建议7.1 API Server调优# 修改/etc/kubernetes/manifests/kube-apiserver.yaml - --max-requests-inflight1500 - --max-mutating-requests-inflight5007.2 kubelet配置优化# 修改/var/lib/kubelet/config.yaml evictionHard: memory.available: 500Mi nodefs.available: 10% nodefs.inodesFree: 5% imagefs.available: 15%8. 安全加固措施8.1 RBAC基础配置# 创建管理员用户 kubectl create serviceaccount admin-user -n kube-system kubectl create clusterrolebinding admin-user-binding \ --clusterrolecluster-admin \ --serviceaccountkube-system:admin-user8.2 网络策略示例apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-all spec: podSelector: {} policyTypes: - Ingress - Egress在实际部署中我们还需要考虑监控方案如PrometheusGranfa、日志收集EFK栈和备份策略等。这些内容我会在后续文章中详细展开。