从零开始学K8s:概念解析到第一个应用部署实战
K8s 功能强大,但官方文档密密麻麻全是英文。Pod、Node、Deployment、Service……每个词都认识,连在一起却完全看不懂在说什么。
很多人就这样默默关掉标签页,告诉自己“以后再学”。
这篇文章就是为你写的。不讲虚的,不堆砌概念,从“K8s 是什么”到“跑起来第一个应用”,一步一步带你走完。
一、先搞清楚:K8s 到底是干什么的?
K8s 全称 Kubernetes,是 Google 开源的容器编排系统。
你可以把它理解成一个“容器管理员”——你告诉它“我要跑 3 个 Nginx 实例,挂了自动重启,流量均匀分配”,它就能帮你全部搞定。
没有 K8s 之前是什么样的?
你有 10 台服务器,手动 SSH 上去,一台一台执行 docker run。某台机器挂了,你得自己发现、自己重启、自己迁移。
有了 K8s 之后:
你只管声明“我要什么状态”,K8s 负责让集群保持那个状态。机器挂了?自动调度到其他节点。流量暴增?自动扩容。
这就是它的核心价值:声明式管理 + 自动化运维。
二、几个必须先懂的核心概念
不用死记,看完有印象就行,后面用到了自然就记住了。
Node(节点)
就是一台服务器(物理机或虚拟机)。K8s 集群由多个 Node 组成,分 Master(控制节点)和 Worker(工作节点)两种角色。
Pod(最小部署单元)
K8s 不直接管容器,而是管 Pod。一个 Pod 里可以跑一个或多个容器,它们共享网络和存储。你可以把 Pod 理解成“一组紧密协作的容器的集合”。
Deployment(部署控制器)
告诉 K8s“我要跑几个 Pod 副本,用什么镜像”。Deployment 负责保证副本数量,Pod 挂了它会自动重建。
Service(服务发现 + 负载均衡)
Pod 的 IP 是动态的,重启就会变。Service 给一组 Pod 提供一个固定的访问入口,并自动做负载均衡。
Namespace(命名空间)
用来隔离资源,比如把开发环境和生产环境放在不同的 Namespace 里,互不干扰。
三、本地快速上手:用 Minikube 搭一个单机集群
正式生产环境需要多台机器,但学习阶段用 Minikube 就够了——它能在你的电脑上模拟一个完整的 K8s 集群。
第一步:安装 Minikube
macOS:
brew install minikubeWindows(用 PowerShell 管理员模式):
winget install Kubernetes.minikubeLinux:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube第二步:启动集群
minikube start第一次会拉取镜像,耐心等几分钟。看到 Done! kubectl is now configured to use "minikube" 就成功了。
第三步:安装 kubectl(命令行工具)
kubectl 是和 K8s 集群交互的命令行工具,Minikube 通常会自带,也可以单独安装:
# macOS
brew install kubectl
# 验证安装
kubectl version --client第四步:验证集群状态
kubectl get nodes看到一个 minikube 节点,状态是 Ready,说明集群跑起来了。
四、跑起来你的第一个应用
我们用官方的 Nginx 镜像做演示,走完“部署 → 暴露服务 → 访问”的完整流程。
第一步:创建 Deployment
kubectl create deployment nginx-demo --image=nginx:latest这条命令告诉 K8s:用 nginx:latest 镜像创建一个叫 nginx-demo 的 Deployment。
第二步:查看 Pod 状态
kubectl get pods看到 Pod 状态变成 Running 就说明容器跑起来了。
第三步:暴露服务
kubectl expose deployment nginx-demo --port=80 --type=NodePort这会创建一个 Service,把 Deployment 的 80 端口暴露出来。
第四步:访问服务
minikube service nginx-demoMinikube 会自动打开浏览器,你就能看到 Nginx 的欢迎页面了。
五、用 YAML 文件管理资源(更专业的方式)
上面用命令行创建资源很方便,但生产环境更推荐用 YAML 文件。原因很简单:可以版本控制、可以复用、可以进行 Code Review。
下面是一个完整的 Deployment + Service 配置示例:
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: NodePort应用这个配置:
kubectl apply -f nginx-deployment.yaml查看所有资源:
kubectl get all想删除?
kubectl delete -f nginx-deployment.yaml六、几个最常用的 kubectl 命令
收藏这张表,日常运维够用了:
| 命令 | 说明 |
|---|---|
| kubectl get pods | 查看所有 Pod |
| kubectl get nodes | 查看所有节点 |
| kubectl describe pod <pod名> | 查看 Pod 详情(排查问题必用) |
| kubectl logs <pod名> | 查看 Pod 日志 |
| kubectl exec -it <pod名> -- bash | 进入 Pod 内部 |
| kubectl apply -f xxx.yaml | 应用配置文件 |
| kubectl delete pod <pod名> | 删除 Pod(会自动重建) |
| kubectl scale deployment <名> --replicas=5 | 扩缩容 |
| kubectl rollout undo deployment <名> | 回滚到上一个版本 |
七、新手常见的几个坑
坑1:Pod 一直 Pending
通常是资源不够(CPU/内存)。用 kubectl describe pod <pod名> 查看 Events 部分,会有明确提示。
坑2:镜像拉取失败(ImagePullBackOff)
国内环境拉 Docker Hub 镜像经常超时。建议配置国内镜像加速,或者提前 docker pull 好再用。
坑3:Service 访问不到
检查 selector 标签是否和 Pod 的 labels 完全匹配,大小写都要一致。
坑4:改了 YAML 没生效
kubectl apply 是增量更新。如果改了 selector 等不可变字段,需要先 delete 再 apply。
八、学完这篇,下一步去哪里?
入门之后,建议按这个路径继续深入:
存储:PersistentVolume(PV)和 PersistentVolumeClaim(PVC),解决容器数据持久化问题
配置管理:ConfigMap 和 Secret,把配置和代码分离
Ingress:统一管理 HTTP 路由,比 NodePort 更优雅
Helm:K8s 的包管理器,一键部署复杂应用
监控:Prometheus + Grafana,让集群状态一目了然
最后说一句:
K8s 的学习曲线确实陡,但陡的是概念体系,不是操作本身。
把这篇文章里的命令都跑一遍,你就已经比 80%“听说过 K8s”的人走得更远了。动手,是学 K8s 唯一的捷径。
本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!