1. 项目概述
在容器编排领域,Kubernetes(简称K8S)已成为事实上的行业标准。对于中小型企业或刚接触K8S的团队来说,从单master节点架构入手是最稳妥的选择。kubeadm作为官方推荐的集群部署工具,能够以最精简的步骤搭建符合生产要求的K8S环境。
我曾在多个实际生产项目中采用这种架构,它的优势在于:
- 部署复杂度远低于多master高可用方案
- 资源消耗更可控(通常2核4G配置即可运行)
- 维护成本低且能满足中小规模业务需求
- 后续可平滑扩展为多master集群
重要提示:单master架构适合测试环境和中小规模生产环境,对于核心业务系统建议至少部署3个master节点实现高可用。
2. 环境准备与系统配置
2.1 硬件资源规划
生产环境的最低配置建议:
- Master节点:2核CPU/4GB内存/40GB磁盘
- Worker节点:根据业务负载调整(建议至少2核/4GB)
- 操作系统:Ubuntu 20.04 LTS或CentOS 7.9+
实际项目中我曾遇到内存不足导致apiserver频繁崩溃的情况,因此特别强调:
- /var分区至少预留20GB(存放etcd数据)
- swap必须彻底禁用(否则kubelet无法正常运行)
2.2 系统基础配置
在所有节点执行以下操作:
# 关闭防火墙(生产环境应配置安全组规则替代) systemctl stop firewalld && systemctl disable firewalld # 禁用SELinux setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 关闭swap swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 加载内核模块 cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack EOF # 配置sysctl cat <<EOF | sudo tee /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. 容器运行时与kubeadm安装
3.1 Docker安装与配置
虽然containerd已成为默认运行时,但在实际生产中发现Docker的日志管理和调试更方便:
# 安装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 docker-ce-cli containerd.io # 配置cgroup驱动为systemd mkdir -p /etc/docker cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF systemctl enable --now 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 # 安装指定版本(建议选择较新的稳定版) yum install -y kubelet-1.23.8 kubeadm-1.23.8 kubectl-1.23.8 systemctl enable kubelet4. 集群初始化实战
4.1 Master节点初始化
关键参数说明:
--pod-network-cidr:必须与后续安装的网络插件匹配--apiserver-advertise-address:建议显式指定内网IP--image-repository:使用国内镜像源加速
kubeadm init \ --apiserver-advertise-address=192.168.1.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.23.8 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 # 初始化成功后配置kubectl mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config4.2 网络插件安装
推荐使用flannel(配置简单且资源占用低):
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml验证网络状态:
kubectl get pods -n kube-system -l app=flannel kubectl get nodes -o wide5. Worker节点加入集群
在Master节点上获取join命令:
kubeadm token create --print-join-command在Worker节点执行输出的join命令(类似如下):
kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6. 生产环境关键配置
6.1 证书自动续期配置
修改kubeadm配置实现证书自动续期:
# 查看当前证书有效期 kubeadm certs check-expiration # 配置自动续期 cat > /etc/kubernetes/kubeadm-config.yaml <<EOF apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration controllerManager: extraArgs: experimental-cluster-signing-duration: "87600h" feature-gates: RotateKubeletServerCertificate=true scheduler: extraArgs: feature-gates: RotateKubeletServerCertificate=true EOF kubeadm init phase upload-config kubeadm --config /etc/kubernetes/kubeadm-config.yaml6.2 关键组件监控配置
部署metrics-server监控资源使用:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml # 验证监控数据 kubectl top nodes7. 常见问题排查指南
7.1 节点NotReady问题排查流程
- 检查kubelet状态:
journalctl -u kubelet -n 50 - 验证网络插件:
kubectl logs -n kube-system <flannel-pod> - 检查CNI配置:
ls /etc/cni/net.d/ - 测试Pod间通信:
kubectl run test --image=busybox -- sleep 3600
7.2 证书过期处理方案
# 手动更新证书 kubeadm certs renew all systemctl restart kubelet # 更新kubeconfig mv $HOME/.kube/config $HOME/.kube/config.bak cp -i /etc/kubernetes/admin.conf $HOME/.kube/config8. 生产环境优化建议
8.1 关键参数调优
# 调整kubelet最大Pod数量 cat > /etc/default/kubelet <<EOF KUBELET_EXTRA_ARGS="--max-pods=150 --image-gc-high-threshold=85 --image-gc-low-threshold=80" EOF systemctl daemon-reload systemctl restart kubelet8.2 备份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 /opt/etcd-backup-$(date +%Y%m%d).db # 配置定时任务(每天凌晨2点备份) 0 2 * * * root /usr/local/bin/etcd-backup.sh经过多个生产环境项目的验证,这套方案能稳定支撑200+Pod的运行。对于刚开始使用K8S的团队,建议先熟悉单master架构的运行机制,等业务规模扩大后再考虑升级为多master高可用架构。实际运维中发现,90%的异常问题都与网络配置或证书过期相关,因此务必做好这两方面的监控和维护。