1. 为什么每个K8s新手都应该从Pod开始
第一次接触Kubernetes时,面对Deployment、Service、Ingress等概念,很多初学者会感到无从下手。但根据我多年容器化落地的经验,Pod才是理解K8s的最佳切入点。就像学习编程要从"Hello World"开始一样,Pod就是K8s世界的"Hello World"。
Pod作为K8s的最小调度单元,实际上是一个或多个容器的组合。这些容器共享存储、网络和命名空间。举个例子,如果把K8s集群比作一个物流中心,那么Pod就是最小的可运输包裹。这个包裹里可以只装一件商品(单容器Pod),也可以装多件需要捆绑销售的商品(多容器Pod)。
关键认知:Pod不是容器,而是容器的"运行环境"。这个区别对理解K8s的调度机制至关重要。
我见过太多人一开始就钻研复杂的控制器(如Deployment),结果连最基本的yaml字段都看不懂。相反,从Pod入手有三大优势:
- 配置简单,核心字段不超过10个
- 调试方便,可以直接查看日志
- 失败成本低,删除重建只需几秒
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三个案例带你玩转Pod基础操作
2.1 案例一:你的第一个Pod
先来看最简单的Pod定义(pod-demo.yaml):
yaml复制apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx:1.21
ports:
- containerPort: 80
创建并验证:
bash复制kubectl apply -f pod-demo.yaml
kubectl get pods -w # 观察状态变化
kubectl logs nginx-pod # 查看日志
kubectl describe pod nginx-pod # 查看详情
这个案例中有几个关键点需要注意:
containerPort只是声明性配置,实际不会影响网络- Pod状态从Pending到Running的过程包含了镜像拉取、容器创建等步骤
- 直接创建的Pod没有自愈能力,删除后就真的没了
2.2 案例二:多容器Pod实战
生产环境中经常需要多个容器协同工作。比如这个日志收集场景(multi-pod.yaml):
yaml复制apiVersion: v1
kind: Pod
metadata:
name: web-logger
spec:
containers:
- name: web-app
image: nginx:1.21
volumeMounts:
- name: log-dir
mountPath: /var/log/nginx
- name: log-agent
image: fluent/fluentd:v1.14
volumeMounts:
- name: log-dir
mountPath: /data/logs
volumes:
- name: log-dir
emptyDir: {}
这个配置实现了:
- Nginx容器将日志写入/var/log/nginx
- 通过emptyDir卷共享给Fluentd容器
- Fluentd从/data/logs读取日志并处理
避坑提示:多容器Pod中,所有容器的readinessProbe都通过,Pod才会变为Ready状态。
2.3 案例三:Pod生命周期管理
理解Pod的生命周期对故障排查至关重要。我们通过这个案例来观察(lifecycle-demo.yaml):
yaml复制apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: demo-container
image: busybox:1.28
command: ["/bin/sh", "-c", "sleep 3600"]
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo 'Container started' > /tmp/start.log"]
preStop:
exec:
command: ["/bin/sh", "-c", "echo 'Container stopping' > /tmp/stop.log"]
操作验证:
bash复制kubectl apply -f lifecycle-demo.yaml
kubectl exec lifecycle-demo -- cat /tmp/start.log
kubectl delete pod lifecycle-demo
kubectl exec lifecycle-demo -- cat /tmp/stop.log # 需要在删除前快速执行
生命周期钩子的典型应用场景:
- postStart:配置文件动态生成、服务注册
- preStop:优雅停止、服务注销
3. 服务暴露:从ClusterIP到Ingress
3.1 为什么需要Service
Pod是脆弱的——它们可能随时被重建,IP地址也会变化。Service解决了三个核心问题:
- 服务发现:通过标签选择器动态发现后端Pod
- 负载均衡:将请求分发到多个Pod实例
- 稳定访问:提供固定VIP(虚拟IP)
最基本的ClusterIP类型Service配置(svc-demo.yaml):
yaml复制apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx # 必须匹配Pod的标签
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
3.2 NodePort实战
要让集群外访问服务,最直接的方式是NodePort(nodeport-demo.yaml):
yaml复制apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
创建后可以通过任一Node的IP和随机分配的端口(30000-32767)访问服务。但生产环境更推荐使用LoadBalancer或Ingress。
3.3 Ingress:七层流量管理
Ingress是管理外部访问的终极方案(需要Ingress Controller)。示例配置(ingress-demo.yaml):
yaml复制apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
rules:
- host: demo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
典型Ingress Controller包括:
- Nginx Ingress Controller
- Traefik
- HAProxy Ingress
4. 生产环境避坑指南
4.1 资源限制与调度
没有资源限制的Pod就像定时炸弹。务必配置requests和limits:
yaml复制resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
血泪教训:曾经因为一个Pod内存泄漏且未设limit,导致整个节点被拖垮。
4.2 健康检查配置
完善的健康检查能大幅提升系统稳定性:
yaml复制livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
4.3 常见故障排查
-
Pod一直Pending:
bash复制kubectl describe pod <pod-name> # 查看事件 kubectl get nodes # 检查节点资源 -
Pod不断重启:
bash复制kubectl logs <pod-name> --previous # 查看前一个容器的日志 kubectl describe pod <pod-name> | grep -A 10 Events # 查看事件记录 -
Service无法访问:
bash复制kubectl get endpoints <service-name> # 检查是否有正常Endpoint kubectl get svc <service-name> -o yaml # 检查selector配置
5. 从入门到精进的路径
掌握基础操作后,建议按这个路线深入学习:
- 控制器:Deployment/StatefulSet/DaemonSet
- 配置管理:ConfigMap/Secret
- 存储:PV/PVC/StorageClass
- 安全:RBAC/NetworkPolicy
- 运维:HPA/VPA/ClusterAutoScaler
对于开发人员,推荐从Minikube开始实验;运维人员则应该尝试用kubeadm搭建多节点集群。我个人的学习心得是:每个概念都要动手实践,遇到问题先看官方文档,再查GitHub Issue,最后求助社区。
