logo

单机部署Kubernetes:从环境准备到集群验证的全流程指南

作者:JC2025.09.17 10:41浏览量:17

简介:本文详细阐述单机部署Kubernetes的完整流程,涵盖环境配置、组件安装、网络配置等关键环节,并提供可复用的脚本与故障排查建议,助力开发者快速构建本地测试环境。

单机部署Kubernetes:从环境准备到集群验证的全流程指南

在容器化技术普及的今天,Kubernetes已成为企业级应用编排的标准。然而,对于开发者而言,搭建一个完整的Kubernetes集群往往需要多台物理机或虚拟机支持,这在本地开发或测试场景中显得过于笨重。单机部署Kubernetes(以下简称”单节点K8s”)通过模拟集群环境,为开发者提供了一个轻量级、可复用的本地测试平台,尤其适合以下场景:

  • 开发阶段的功能验证与调试
  • CI/CD流水线的本地模拟
  • 容器化应用的快速迭代测试
  • 教学演示与实验环境搭建

一、环境准备:硬件与软件要求

1.1 硬件配置建议

单节点K8s对硬件的要求相对灵活,但需满足以下最低标准:

  • CPU:4核及以上(推荐8核,以支持多Pod并发)
  • 内存:8GB及以上(推荐16GB,避免OOM风险)
  • 磁盘:100GB以上可用空间(推荐SSD,提升容器启动速度)
  • 网络:千兆网卡(支持多节点扩展时的网络通信)

实际测试表明,在4核8GB的虚拟机环境中,单节点K8s可稳定运行10-15个轻量级Pod(如Nginx、Redis),但需注意监控系统资源使用情况。

1.2 操作系统选择

Kubernetes官方支持多种Linux发行版,推荐使用以下系统以减少兼容性问题:

  • Ubuntu 20.04/22.04 LTS:社区支持完善,包管理便捷
  • CentOS 7/8:企业级稳定性,但需注意CentOS 8已停止维护
  • Rocky Linux/AlmaLinux:CentOS替代方案,兼容RHEL生态

避坑指南:避免使用Windows或macOS作为主机系统,因Kubernetes原生依赖Linux内核特性(如cgroups、namespaces)。若必须在非Linux环境开发,可考虑通过WSL2(Windows)或Docker Desktop(macOS)的Kubernetes集成功能,但功能可能受限。

1.3 依赖工具安装

单节点K8s依赖以下核心组件:

  • Docker:容器运行时(需19.03+版本,支持CRI接口)
  • kubeadm:集群初始化工具(v1.24+推荐)
  • kubelet:节点代理服务
  • kubectl:集群管理命令行工具

以Ubuntu为例,安装命令如下:

  1. # 安装Docker
  2. curl -fsSL https://get.docker.com | sh
  3. sudo usermod -aG docker $USER # 避免每次使用sudo
  4. # 安装Kubernetes组件
  5. curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
  6. echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
  7. sudo apt update
  8. sudo apt install -y kubelet kubeadm kubectl
  9. sudo apt-mark hold kubelet kubeadm kubectl # 防止自动升级

二、单节点K8s部署流程

2.1 初始化集群

使用kubeadm init命令启动单节点集群,需通过--pod-network-cidr指定Pod网络范围(避免与主机网络冲突):

  1. sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU,Mem

参数说明

  • --ignore-preflight-errors:跳过CPU和内存检查(单机环境可能不满足推荐值)
  • --apiserver-advertise-address:若主机有多个IP,需指定监听地址

初始化完成后,需执行以下命令配置kubectl:

  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config

2.2 部署CNI插件

Kubernetes依赖容器网络接口(CNI)实现Pod间通信。推荐使用以下轻量级插件:

  • Flannel:简单易用,支持VXLAN和Host-GW模式
  • Calico:功能强大,支持网络策略(需更多资源)

以Flannel为例,部署命令如下:

  1. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

验证网络状态:

  1. kubectl get pods -n kube-system | grep flannel
  2. # 输出应包含flannel-daemonset的Running状态Pod

2.3 允许单机运行所有组件

默认情况下,Kubernetes会阻止单节点运行多个Master组件(如API Server、Controller Manager)。需通过以下命令标记节点为可调度:

  1. kubectl taint nodes --all node-role.kubernetes.io/master-
  2. kubectl taint nodes --all node-role.kubernetes.io/control-plane- # v1.24+版本

三、验证与测试

3.1 集群状态检查

执行以下命令验证集群健康度:

  1. kubectl get nodes
  2. # 输出应显示Ready状态,且ROLE为<none>
  3. kubectl get componentstatuses
  4. # 输出应显示scheduler、controller-manager、etcd为Healthy

3.2 部署测试应用

以Nginx为例,创建Deployment并暴露Service:

  1. # nginx-deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: nginx-deployment
  6. spec:
  7. replicas: 2
  8. selector:
  9. matchLabels:
  10. app: nginx
  11. template:
  12. metadata:
  13. labels:
  14. app: nginx
  15. spec:
  16. containers:
  17. - name: nginx
  18. image: nginx:latest
  19. ports:
  20. - containerPort: 80
  21. ---
  22. apiVersion: v1
  23. kind: Service
  24. metadata:
  25. name: nginx-service
  26. spec:
  27. type: NodePort
  28. selector:
  29. app: nginx
  30. ports:
  31. - protocol: TCP
  32. port: 80
  33. targetPort: 80
  34. nodePort: 30080

应用配置并验证:

  1. kubectl apply -f nginx-deployment.yaml
  2. kubectl get pods -l app=nginx # 应显示2个Running状态的Pod
  3. kubectl get svc nginx-service # 记录EXTERNAL-IP和NODE-PORT

通过浏览器访问http://<主机IP>:30080,应看到Nginx默认页面。

四、常见问题与解决方案

4.1 Pod无法启动

现象:Pod状态为PendingCrashLoopBackOff
排查步骤

  1. 检查事件日志kubectl describe pod <pod-name>
  2. 常见原因:
    • 镜像拉取失败(检查网络或私有仓库权限)
    • 资源不足(kubectl top nodes查看资源使用)
    • CNI插件未正确配置(kubectl get pods -n kube-system

4.2 网络通信异常

现象:Pod间无法ping通,或Service无法访问。
解决方案

  1. 验证CNI插件状态:kubectl get pods -n kube-system | grep flannel
  2. 检查防火墙规则:确保主机未阻止以下端口:
    • 6443(Kubernetes API)
    • 10250(Kubelet)
    • 30000-32767(NodePort范围)

4.3 持久化存储问题

场景:需要为Pod挂载本地目录。
解决方案

  1. 创建HostPath类型的PersistentVolume:
    1. apiVersion: v1
    2. kind: PersistentVolume
    3. metadata:
    4. name: local-pv
    5. spec:
    6. capacity:
    7. storage: 10Gi
    8. accessModes:
    9. - ReadWriteOnce
    10. hostPath:
    11. path: /data/k8s-pv
  2. 创建对应的PersistentVolumeClaim并挂载到Pod。

五、进阶优化建议

5.1 资源限制配置

为避免单个Pod占用过多资源,可通过LimitRangeResourceQuota进行限制:

  1. # limit-range.yaml
  2. apiVersion: v1
  3. kind: LimitRange
  4. metadata:
  5. name: mem-cpu-limit
  6. spec:
  7. limits:
  8. - default:
  9. cpu: 500m
  10. memory: 512Mi
  11. defaultRequest:
  12. cpu: 100m
  13. memory: 128Mi
  14. type: Container

5.2 备份与恢复

单节点K8s的etcd数据默认存储在/var/lib/etcd,建议定期备份:

  1. # 备份etcd数据
  2. sudo ETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-snapshot.db \
  3. --endpoints=https://127.0.0.1:2379 \
  4. --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  5. --cert=/etc/kubernetes/pki/etcd/server.crt \
  6. --key=/etc/kubernetes/pki/etcd/server.key

5.3 多节点扩展准备

若未来需扩展为多节点集群,需提前规划:

  1. 保留kubeadm join命令(初始化时生成)
  2. 确保主机名唯一且可解析
  3. 配置SSH免密登录以便远程管理

六、总结与展望

单机部署Kubernetes通过精简集群组件,为开发者提供了一个高效、可控的本地测试环境。其核心优势在于:

  • 资源占用低:单节点可模拟完整集群行为
  • 配置灵活:支持自定义网络、存储和调度策略
  • 开发效率高:无需依赖云服务或物理机

然而,单节点K8s也存在局限性,如高可用性缺失、性能瓶颈等。建议根据实际需求选择部署方案:

  • 开发测试:单节点K8s + Minikube/Kind
  • 生产环境:至少3节点高可用集群
  • 边缘计算:K3s(轻量级Kubernetes发行版)

未来,随着容器技术的演进,单节点K8s有望进一步优化资源利用率,并集成更多Serverless特性,成为开发者不可或缺的本地开发工具链。

相关文章推荐

发表评论