单机部署Kubernetes:从环境准备到集群验证的全流程指南
2025.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为例,安装命令如下:
# 安装Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER # 避免每次使用sudo
# 安装Kubernetes组件
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # 防止自动升级
二、单节点K8s部署流程
2.1 初始化集群
使用kubeadm init
命令启动单节点集群,需通过--pod-network-cidr
指定Pod网络范围(避免与主机网络冲突):
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:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.2 部署CNI插件
Kubernetes依赖容器网络接口(CNI)实现Pod间通信。推荐使用以下轻量级插件:
- Flannel:简单易用,支持VXLAN和Host-GW模式
- Calico:功能强大,支持网络策略(需更多资源)
以Flannel为例,部署命令如下:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
验证网络状态:
kubectl get pods -n kube-system | grep flannel
# 输出应包含flannel-daemonset的Running状态Pod
2.3 允许单机运行所有组件
默认情况下,Kubernetes会阻止单节点运行多个Master组件(如API Server、Controller Manager)。需通过以下命令标记节点为可调度:
kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl taint nodes --all node-role.kubernetes.io/control-plane- # v1.24+版本
三、验证与测试
3.1 集群状态检查
执行以下命令验证集群健康度:
kubectl get nodes
# 输出应显示Ready状态,且ROLE为<none>
kubectl get componentstatuses
# 输出应显示scheduler、controller-manager、etcd为Healthy
3.2 部署测试应用
以Nginx为例,创建Deployment并暴露Service:
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
应用配置并验证:
kubectl apply -f nginx-deployment.yaml
kubectl get pods -l app=nginx # 应显示2个Running状态的Pod
kubectl get svc nginx-service # 记录EXTERNAL-IP和NODE-PORT
通过浏览器访问http://<主机IP>:30080
,应看到Nginx默认页面。
四、常见问题与解决方案
4.1 Pod无法启动
现象:Pod状态为Pending
或CrashLoopBackOff
。
排查步骤:
- 检查事件日志:
kubectl describe pod <pod-name>
- 常见原因:
- 镜像拉取失败(检查网络或私有仓库权限)
- 资源不足(
kubectl top nodes
查看资源使用) - CNI插件未正确配置(
kubectl get pods -n kube-system
)
4.2 网络通信异常
现象:Pod间无法ping通,或Service无法访问。
解决方案:
- 验证CNI插件状态:
kubectl get pods -n kube-system | grep flannel
- 检查防火墙规则:确保主机未阻止以下端口:
- 6443(Kubernetes API)
- 10250(Kubelet)
- 30000-32767(NodePort范围)
4.3 持久化存储问题
场景:需要为Pod挂载本地目录。
解决方案:
- 创建HostPath类型的PersistentVolume:
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/k8s-pv
- 创建对应的PersistentVolumeClaim并挂载到Pod。
五、进阶优化建议
5.1 资源限制配置
为避免单个Pod占用过多资源,可通过LimitRange
和ResourceQuota
进行限制:
# limit-range.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mem-cpu-limit
spec:
limits:
- default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 128Mi
type: Container
5.2 备份与恢复
单节点K8s的etcd数据默认存储在/var/lib/etcd
,建议定期备份:
# 备份etcd数据
sudo ETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-snapshot.db \
--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
5.3 多节点扩展准备
若未来需扩展为多节点集群,需提前规划:
- 保留
kubeadm join
命令(初始化时生成) - 确保主机名唯一且可解析
- 配置SSH免密登录以便远程管理
六、总结与展望
单机部署Kubernetes通过精简集群组件,为开发者提供了一个高效、可控的本地测试环境。其核心优势在于:
- 资源占用低:单节点可模拟完整集群行为
- 配置灵活:支持自定义网络、存储和调度策略
- 开发效率高:无需依赖云服务或物理机
然而,单节点K8s也存在局限性,如高可用性缺失、性能瓶颈等。建议根据实际需求选择部署方案:
- 开发测试:单节点K8s + Minikube/Kind
- 生产环境:至少3节点高可用集群
- 边缘计算:K3s(轻量级Kubernetes发行版)
未来,随着容器技术的演进,单节点K8s有望进一步优化资源利用率,并集成更多Serverless特性,成为开发者不可或缺的本地开发工具链。
发表评论
登录后可评论,请前往 登录 或 注册