1. 项目概述
最近在帮客户部署生产级Kubernetes集群时,发现很多技术文档要么过于简单要么太过复杂。今天我就来分享一个经过实战验证的单Master节点K8S集群搭建方案,这个配置已经在多个中小型生产环境稳定运行超过2年。
为什么选择单Master架构?对于日均访问量在5万以下的中小型应用,单Master完全能够满足需求。相比多Master集群,它的部署和维护成本要低得多。我们团队实测单Master节点可以轻松支撑50个Node和300+Pod的稳定运行。
2. 环境准备与系统配置
2.1 硬件配置建议
生产环境的最低配置要求:
- Master节点:4核CPU/8GB内存/100GB SSD
- Worker节点:根据业务需求调整
- 网络:千兆内网,建议使用独立网卡
重要提示:千万不要在Master节点上混部业务Pod!这个节点应该专用于集群控制平面。
2.2 操作系统优化
以CentOS 7.9为例,必须进行的系统配置:
# 关闭Swap swapoff -a sed -i '/swap/s/^/#/' /etc/fstab # 关闭SELinux setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /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.cgroupdriver=systemd"], "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] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://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-address=192.168.1.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.22.6 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.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-app=calico-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_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 /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改为IfNotPresent- CrashLoopBackOff:
# 查看容器日志 kubectl logs <pod-name> --previous7. 性能优化建议
7.1 API Server调优
# 修改/etc/kubernetes/manifests/kube-apiserver.yaml - --max-requests-inflight=1500 - --max-mutating-requests-inflight=5007.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 \ --clusterrole=cluster-admin \ --serviceaccount=kube-system:admin-user8.2 网络策略示例
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-all spec: podSelector: {} policyTypes: - Ingress - Egress在实际部署中,我们还需要考虑监控方案(如Prometheus+Granfa)、日志收集(EFK栈)和备份策略等。这些内容我会在后续文章中详细展开。