
教程从最基础的环境准备讲起:硬件/软件要求、操作系统配置避坑指南,帮你快速扫清部署前的障碍;对比kubeadm、minikube等主流部署工具的优缺点,用图文结合的方式演示“3步完成单节点/多节点集群部署”;用生活化比喻拆解核心组件(Pod像“快递盒”、Service是“小区门牌号”),让抽象概念秒懂;更包含日常管理必备技能:如何用kubectl高效操作集群、监控工具Prometheus+Grafana的简易配置、日志收集与常见故障排查(如Pod启动失败、网络不通)的实用技巧。
跟着操作,你将快速掌握集群部署的标准化流程,学会用YAML文件管理应用生命周期,甚至能独立解决“节点NotReady”“资源不足”等高频问题。无论你是开发人员、运维新手还是想转型云原生的技术人,这篇教程都能帮你轻松跨过K8s入门门槛,从理论到实践一步到位,真正做到“学完就能上手搭建和管理自己的K8s集群”。
你是不是也遇到过这种情况:想学Kubernetes(大家常叫它K8s),打开教程就看到“容器编排”“Pod生命周期”“服务网格”这些词,越看越懵,最后只能关掉页面叹气?我太懂这种感受了——前年帮一个创业公司的技术团队搭K8s集群,他们CTO之前自己试过用minikube搭环境,结果部署多节点时卡在网络插件配置,折腾了三天还是“节点NotReady”,最后不得不找我帮忙。其实K8s没那么难,只是很多教程要么太理论化,要么上来就甩一堆命令,忽略了初学者最需要的“为什么这么做”。今天这篇文章,我会把自己带过50+新手入门K8s的经验浓缩成“实战手册”,你跟着做,就算是纯小白,也能在3小时内搭好能用的集群,1周内上手日常管理。
从0到1搭集群:避开90%初学者踩过的坑
准备环境:别让“配置不够”成为第一个拦路虎
很多人刚开始学K8s,第一步就栽在环境准备上。去年带一个大学生做毕业设计,他用自己的老笔记本(4GB内存、机械硬盘)装K8s,结果minikube启动就报错“内存不足”,折腾两天才发现是硬件配置没达标。其实K8s对环境的要求没那么夸张,但“该有的得有”,我整理了一个新手友好的配置清单,你可以对照看看:
环境类型 | CPU(核心) | 内存(GB) | 硬盘(类型) | 系统要求 |
---|---|---|---|---|
本地测试(单节点) | 2核及以上 | 4GB及以上 | SSD(推荐) | Ubuntu 20.04+/CentOS 7+ |
生产练习(多节点) | 每个节点2核+ | 每个节点8GB+ | SSD(至少20GB可用) | 禁用Swap,开启iptables |
为啥硬盘推荐SSD?因为K8s的etcd组件(相当于集群的“数据库”)需要频繁读写数据,机械硬盘的IO速度慢,很容易导致etcd响应超时,集群就会变卡。系统方面,别用太旧的版本,比如CentOS 6早就不维护了,Ubuntu 18.04虽然能用,但有些新特性不支持, 直接上20.04或22.04。还有个新手必踩的坑:千万别开Swap——K8s默认要求禁用Swap,不然kubelet启动会报错,你可以用swapoff -a
临时关闭,再修改/etc/fstab
永久禁用(具体步骤后面会说)。
选对工具:3种部署方式,哪种适合现在的你?
环境准备好了,接下来得选部署工具。市面上工具不少,minikube、kind、kubeadm、kops……去年带那个创业团队时,他们一开始纠结“选最牛的还是最简单的”,其实答案很简单:看你的需求场景。我把最常用的3种工具掰扯清楚,你对着选就行:
先说minikube,这是我推荐纯小白入门的“第一选择”。它本质是在本地启动一个虚拟机,把K8s的所有组件(apiserver、controller-manager等)都塞进去,单节点运行,命令也简单:minikube start
就能启动,资源占用小(2核4GB内存足够),适合快速体验。但缺点也明显:不能模拟多节点集群,网络配置简化了,和生产环境差异大。如果你只是想看看K8s长啥样,试试kubectl get pods
,用它准没错。
然后是kind(Kubernetes IN Docker),比minikube稍微进阶一点。它不用虚拟机,直接用Docker容器模拟K8s节点,支持多节点集群(比如1个控制平面+2个工作节点),启动命令kind create cluster config=config.yaml
,通过配置文件就能定义节点数量。去年帮一个做CI/CD的朋友搭测试环境,他就用kind,因为能快速创建、销毁集群,适合开发测试。不过它依赖Docker,而且容器模拟的节点性能有限,别用它跑太复杂的应用。
最后是kubeadm,这是“从练习走向生产”的核心工具。它是K8s官方推出的部署工具,支持多节点高可用集群,配置灵活,接近生产环境。缺点是步骤比前两个多,需要手动安装容器运行时(比如containerd)、配置网络插件(比如calico)。但学会它,你就能理解K8s集群的真实架构,以后跳槽面试被问“怎么搭生产集群”,答kubeadm绝对加分。
如果你现在是纯小白,我 先用minikube跑通流程,再用kubeadm搭多节点集群。我带新手时都是这个路径:先用minikube体验“部署一个Nginx”的快乐,建立信心;再用kubeadm理解“控制平面”“工作节点”的区别,知道每个组件是干嘛的。
手把手部署:3步搭单节点,5步搭多节点
光说不练假把式,现在咱们实操部署。先从最简单的minikube开始,你跟着敲命令,保证3分钟就能看到集群状态。
单节点(minikube)部署步骤
:
sudo apt install docker.io
,CentOS用户sudo yum install docker
,装完记得sudo systemctl start docker && sudo systemctl enable docker
,并把当前用户加入docker组(sudo usermod -aG docker $USER
,需要注销重登生效)。 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube
。 minikube start
,第一次启动会下载镜像,可能慢点,耐心等。启动成功后,用minikube status
查看状态,显示“host: Running”“kubelet: Running”就OK了;再敲kubectl get nodes
,会看到一个叫“minikube”的节点,状态是Ready。 是不是很简单?接下来试试进阶的多节点(kubeadm)部署,需要至少2台机器(1个控制平面+1个工作节点,虚拟机或云服务器都行)。这里我以Ubuntu 20.04为例,分5步走:
多节点(kubeadm)部署步骤
:
sudo swapoff -a
,然后编辑/etc/fstab
,注释掉Swap那行(用#
开头)。 sudo modprobe overlay && sudo modprobe br_netfilter
,然后创建/etc/modules-load.d/k8s.conf
,写入overlay
和br_netfilter
,让重启后也生效。 sudo sysctl -w net.bridge.bridge-nf-call-iptables=1 && sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=1
,并保存到/etc/sysctl.d/k8s.conf
。 sudo apt update && sudo apt install -y containerd.io
;然后配置containerd:sudo mkdir -p /etc/containerd && containerd config default | sudo tee /etc/containerd/config.toml
,编辑这个文件,找到SystemdCgroup
,把false
改成true
(K8s推荐用systemd作为cgroup驱动);最后重启containerd:sudo systemctl restart containerd && sudo systemctl enable containerd
。 sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl
sudo apt install -y kubelet=1.26.0-00 kubeadm=1.26.0-00 kubectl=1.26.0-00curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
然后安装指定版本(别用latest,避免版本太新出问题,我常用1.26.0):
,并锁定版本(
sudo apt-mark hold kubelet kubeadm kubectl),防止意外升级。
sudo kubeadm init pod-network-cidr=10.244.0.0/16初始化控制平面(只在控制平面节点执行):执行 ,
pod-network-cidr指定Pod的IP段,后面装网络插件会用到。初始化成功后,会输出一段“kubeadm join”命令,把它复制保存下来(工作节点要靠这个命令加入集群)。然后按照提示,配置kubectl:
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
:
kubectl apply -f https://docs.projectcalico.org/v3.23/manifests/calico.yaml
安装网络插件+添加工作节点:控制平面初始化后,节点状态是NotReady(因为没网络插件),需要装Calico(最常用的网络插件之一): (注意版本对应,Calico 3.23支持K8s 1.26)。等几分钟,用
kubectl get nodes查看,控制平面节点会变成Ready。然后在工作节点执行之前保存的“kubeadm join”命令(记得加sudo),等几分钟,再在控制平面节点执行
kubectl get nodes,就能看到两个节点都Ready了!
kubectl get到这里,你的多节点集群就搭好了。如果中途报错,别慌,最常见的问题无非“containerd没启动”“网络插件没装好”“防火墙挡了端口”,后面的“故障排查”部分会教你怎么解决。
管好你的K8s集群:日常运维必备技能包
核心组件秒懂:用“小区快递”比喻拆透K8s黑盒
搭好集群只是第一步,你还得知道“这堆组件到底在干嘛”。很多教程上来就甩“控制平面由apiserver、controller-manager、scheduler、etcd组成”,听得人头晕。其实用生活化的比喻一想就通,我把K8s集群比作一个“小区”,每个组件都有明确分工:
控制平面(小区管理处):负责决策和调度,相当于小区的“物业办公室”。apiserver:小区的“前台”,所有操作(比如部署应用、查看Pod状态)都得经过它,它再把请求转发给其他组件。你用kubectl敲的每个命令,最终都是调用apiserver的API。 etcd:小区的“档案库”,存着集群的所有配置数据(比如有多少节点、每个Pod的IP是多少),是K8s的“大脑记忆”,丢了etcd数据,集群基本就废了,所以生产环境一定要备份。 scheduler:小区的“快递调度员”,当你要部署应用(相当于寄快递),scheduler会根据“快递大小”(Pod资源需求)、“小区住户情况”(节点资源使用率),决定把快递放到哪个“快递柜”(节点)。 controller-manager:小区的“维修队”,负责监控集群状态,确保实际状态和你期望的一致。比如你说“我要3个Nginx Pod”,如果某个Pod挂了,controller-manager会自动新建一个,保证始终有3个在运行。 工作节点(小区住户楼):负责运行应用,相当于小区里的“居民楼”。kubelet:每栋楼的“楼长”,负责管理本楼的“快递柜”(Pod),确保Pod按照配置文件(yaml)的要求运行,还会定期向apiserver汇报“本楼情况”(节点状态)。 kube-proxy:小区的“快递中转站”,负责Pod之间的网络通信。比如你访问应用的Service IP,就是kube-proxy把请求转发到具体的Pod上。 容器运行时(containerd/CRI-O):楼里的“快递柜”,负责拉取镜像、运行容器,没有它,Pod就是个空壳子。 核心资源对象(小区里的具体事物):Pod:最小的部署单元,相当于“快递盒”,里面可以装一个或多个容器(比如一个Nginx容器+一个日志收集容器),容器共享网络和存储。Pod是临时的,挂了会重建,IP也会变,所以不能直接用Pod IP访问应用。 Service:Pod的“门牌号”,给一组Pod分配一个固定的虚拟IP(ClusterIP),不管Pod怎么重建,Service IP不变,这样应用就能稳定访问了。如果想从集群外访问,还可以用NodePort或LoadBalancer类型的Service。 Deployment:管理Pod的“经理”,你不用手动创建Pod,而是通过Deployment定义“要几个Pod”“用什么镜像”,它会自动帮你创建和维护Pod,还支持滚动更新、回滚等高级功能。 这样是不是好理解多了?记住这个“小区比喻”,以后看到任何组件,先想想它在“小区”里扮演什么角色,就不容易混淆了。
每天都会用到的kubectl:30分钟从“命令小白”到“操作高手”
kubectl是管理K8s集群的“瑞士军刀”,所有操作几乎都靠它。很多新手觉得命令太多记不住,其实常用的就那十几个,我 了“日常操作三板斧”,你先把这几个练熟,应付80%的场景足够了。
第一板斧:查看资源(get/describe)最常用的是
,后面跟资源类型(pod、service、deployment、node等)。比如:
kubectl get pods:看所有Pod的状态(Running/Pending/Error)、IP、重启次数。
kubectl get pods -n kube-system:查看kube-system命名空间(系统组件所在的命名空间)的Pod。
kubectl get nodes:看节点状态和资源使用率(CPU/内存)。
kubectl describe如果想知道某个资源的详细信息,用
,比如
kubectl describe pod nginx-xxx(xxx是Pod的具体名称),能看到Pod的创建时间、事件(比如“拉取镜像成功”“启动容器失败”)、挂载的存储等,排障时必备。 第二板斧:部署应用(create/apply)
kubectl run部署应用别用
(太简单,不好维护),学会用yaml文件,这是K8s的“配置即代码”思想。比如部署一个Nginx,创建
nginx-deploy.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 2 # 要2个Pod
selector
说实话,刚开始用kubectl的时候,谁没对着一长串命令发过呆?“kubectl get”“kubectl create”“kubectl apply”……光这些基础命令就够记一阵子,更别说后面还有“kubectl logs”“kubectl exec”这些。但你真不用焦虑——我带过的很多新手,包括去年那个刚毕业的实习生,一开始也总问“命令太多记不住怎么办”,其实根本不用追求“全记住”,先把“核心四件套”练熟,80%的日常操作就够用了。
这“四件套”就是“查、看、建、删”:第一个是“kubectl get [资源类型]”,比如“kubectl get pods”看所有Pod状态,加个“-o wide”还能看到Pod的IP和跑在哪个节点上;“kubectl get services”看服务的ClusterIP,方便调试网络通不通。第二个是“kubectl describe [资源类型] [名称]”,这是排障神器——去年实习生部署的Nginx Pod一直启动失败,我让他敲“kubectl describe pod nginx-6f8b79b9c5-2xqzv”,结果Events里明明白白写着“failed to pull image: repository does not exist”,原来他把镜像名写成了“nginx:latestt”(多了个t),改完立马就好了。第三个是“kubectl apply -f [yaml文件]”,别用“kubectl run”这种临时命令,写个yaml文件既规范又能复用,比如部署一个应用,下次想改副本数,直接改yaml里的“replicas”字段,再“apply”一下就行,比命令行敲一堆参数清爽多了。第四个是“kubectl delete [资源类型] [名称]”,比如“kubectl delete pod nginx-xxx”,如果Pod卡住删不掉,加个“force grace-period=0”强制删除(不过这招别常用,容易留“垃圾数据”)。
记不住参数也别慌,我自己到现在敲命令还经常卡壳呢。你随时可以敲“kubectl [命令] help”,比如“kubectl get pods help”,里面会列出所有可选参数,像“-n”指定命名空间、“sort-by=’.metadata.creationTimestamp’”按创建时间排序,一目了然。更省事的是设置别名,我电脑里就配了“alias k=kubectl”(少敲6个字母!)、“alias kgp=’kubectl get pods’”、“alias kgs=’kubectl get services’”,实习生学了这招,敲命令速度立马快了一倍。对了,Kubernetes官网有个kubectl速查表,我 你打印出来贴在显示器旁边,上面列了最常用的命令和参数,刚开始每天看两眼,用一周基本就能形成肌肉记忆,到时候你会发现,原来“记不住命令”根本不是学K8s的拦路虎。
Kubernetes单节点集群和多节点集群有什么区别?该选哪种入门?
单节点集群(比如用minikube或kind搭建)是“all-in-one”模式,所有组件(控制平面、工作节点)都跑在一台机器上,资源占用少(2核4GB内存足够),部署快,适合新手熟悉基本操作(比如部署Pod、用Service暴露应用)。多节点集群(用kubeadm搭建)则分开控制平面节点和工作节点,更接近生产环境,能模拟负载均衡、节点故障转移等场景,但需要至少2台机器(每台 2核8GB以上),配置步骤稍复杂。
我带新手时通常 “先单节点练手,再多节点进阶”:先用单节点跑通“部署应用→访问服务→删除资源”的流程,记住核心概念;等熟悉后,再用虚拟机或云服务器搭多节点,体验节点间通信、资源调度等生产级特性。
部署Kubernetes时硬件配置不够怎么办?可以用云服务器吗?
如果本地机器配置不足(比如内存小于4GB、只有机械硬盘),别硬撑!去年有个读者用老旧笔记本(2GB内存)装minikube,结果频繁卡顿,反而打击学习信心。其实有两个低成本方案:
一是用云服务器,现在很多云厂商有“学生机”或“轻量应用服务器”,2核4GB内存的配置每月不到50元,足够跑单节点集群;二是优化本地配置,比如关闭不必要的后台程序(像杀毒软件、虚拟机),用轻量级容器运行时(比如containerd比Docker资源占用低),或选择“微型集群”工具(比如k3s,专为边缘设备设计,内存占用仅需512MB)。
注意:无论本地还是云服务器,硬盘 用SSD,机械硬盘IO太慢容易导致etcd响应超时,集群会频繁“卡壳”。
Pod启动后一直处于Pending或Error状态,怎么快速排查原因?
这是新手最常遇到的问题,记住“三步排查法”:
第一步,用kubectl describe pod [Pod名称]
看“Events”部分(最关键!),里面会明确写故障原因,比如“0/1 nodes are available: 1 Insufficient cpu”(CPU资源不足)、“failed to pull image: rpc error: code = Unknown desc = failed to pull and unpack image”(镜像拉取失败)。
第二步,针对性解决:资源不足就降低Pod的CPU/内存请求(在yaml里改resources.requests
);镜像拉取失败检查镜像名称是否正确(比如有没有写对仓库地址,是不是私有镜像没配密钥);如果提示“node(s) had taint {node-role.kubernetes.io/control-plane: }, that the pod didn’t tolerate”,说明Pod被调度到控制平面节点了,加个容忍污点配置就行(新手可以先在部署时指定nodeName
到工作节点)。
第三步,还解决不了就看节点状态(kubectl get nodes
),如果节点NotReady,先检查网络插件是否正常(比如calico的Pod是否Running)。
kubectl命令太多记不住,有没有快速上手的技巧?
新手不用追求“记住所有命令”,先掌握“核心四件套”就能应付日常操作:
kubectl get [资源类型]
:查看状态(pod/service/node/deployment),加-o wide
看详细信息,-n [命名空间]
指定命名空间;kubectl describe [资源类型] [名称]
:排查故障,重点看Events和Conditions;3.
kubectl apply -f [yaml文件]
:创建/更新资源(推荐用yaml文件,比命令行更规范);4.
kubectl delete [资源类型] [名称]
:删除资源(加force
强制删除卡住的Pod)。记不住参数时,随时用
kubectl [命令] help
(比如kubectl get pods help
),或设置别名(比如alias k=kubectl
,alias kgp='kubectl get pods'
)。 Kubernetes官网有kubectl速查表,打印出来贴显示器旁,用一周基本就熟了。教程里提到的Prometheus+Grafana监控,对新手来说配置复杂吗?
其实不复杂!很多新手觉得难,是因为直接看官方文档的“全量配置”,被几百行yaml吓到了。对入门来说,用“简化版配置”就行:
如果用kubeadm部署的集群,可以直接用Helm(Kubernetes的包管理工具)一键部署:先装Helm,然后执行helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
,再helm install prometheus prometheus-community/kube-prometheus-stack namespace monitoring create-namespace
,10分钟就能跑起来。
配置文件不用自己写,Helm会帮你生成基础监控规则(节点CPU/内存使用率、Pod状态、容器健康度),Grafana自带Kubernetes监控仪表盘(输入编号7249
就能加载)。刚开始不用纠结“高级告警规则”,先能看到“节点是否Down机”“Pod有没有OOM”这些关键指标就行,后续再慢慢调优。我带团队时,新人都是先跑通基础监控,再用2-3天熟悉仪表盘,足够应付日常运维了。