1. K8s入门避坑指南:从核心概念到Nginx实战
刚接触Kubernetes时,面对铺天盖地的专业术语确实容易让人望而却步。但根据我多年容器编排的经验,掌握几个核心概念就能快速上手。让我们用最直接的方式,先理解Pod、Deployment、Service这三个关键概念,然后通过部署Nginx来验证学习成果。
1.1 核心概念快速解析
Pod是K8s的最小调度单元,可以理解为"集装箱"。但要注意:
- 一个Pod可以包含多个容器(比如主容器+日志收集sidecar)
- 每个Pod有独立IP,内部容器通过localhost互相访问
- 典型生命周期只有几个小时,设计时要考虑无常性
Deployment是Pod的"管理员",负责:
- 声明Pod的副本数和更新策略(滚动更新/重新创建)
- 维护版本历史,支持快速回滚
- 通过ReplicaSet实现副本控制(不要直接操作ReplicaSet)
Service是Pod的"接待处",主要解决:
- Pod动态IP导致的服务发现难题
- 负载均衡和流量分发
- 对外暴露服务的统一入口
经验之谈:刚开始可以简单记作"Pod干活、Deployment管Pod、Service接客"
2. 实战Nginx部署
2.1 准备部署清单
我们先创建nginx-deployment.yaml文件:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-demo spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.23-alpine ports: - containerPort: 80 resources: limits: memory: "128Mi" cpu: "500m"关键参数说明:
replicas: 2表示要运行2个Pod副本image: nginx:1.23-alpine使用Alpine版减小镜像体积resources设置资源限制避免单个Pod占用过多资源
2.2 应用部署配置
执行部署命令:
kubectl apply -f nginx-deployment.yaml验证部署状态:
kubectl get deployments -w看到AVAILABLE列显示2/2表示部署成功
查看Pod运行情况:
kubectl get pods -o wide正常应该看到两个状态为Running的Pod
2.3 暴露Service服务
创建service.yaml:
apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: NodePort应用配置:
kubectl apply -f service.yaml获取访问地址:
kubectl get svc nginx-service输出的NodePort端口(30000-32767范围)即可通过集群任意节点IP访问
3. 常见问题排查指南
3.1 Pod启动失败
现象:kubectl get pods显示CrashLoopBackOff
排查步骤:
- 查看日志:
kubectl logs <pod-name> - 检查事件:
kubectl describe pod <pod-name> - 常见原因:
- 镜像拉取失败(检查镜像名和权限)
- 端口冲突(检查containerPort配置)
- 资源不足(调整requests/limits)
3.2 服务无法访问
现象:NodePort访问超时
排查流程:
- 确认Pod运行正常
- 检查Service端点:
kubectl get endpoints nginx-service - 验证网络策略:
kubectl describe networkpolicy - 测试集群内访问:
kubectl exec -it <pod> -- curl http://nginx-service
3.3 滚动更新卡住
现象:kubectl rollout status长时间阻塞
解决方案:
- 查看滚动更新参数:
kubectl get deploy nginx-demo -o yaml | grep -A 2 strategy - 调整更新策略(适当增大maxUnavailable)
- 手动回滚:
kubectl rollout undo deployment/nginx-demo
4. 生产环境优化建议
经过这个简单示例后,当需要投入生产时还需要考虑:
健康检查:添加readiness和liveness探针
livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 3 periodSeconds: 3HPA自动扩缩:
kubectl autoscale deployment nginx-demo --cpu-percent=50 --min=2 --max=5Ingress配置(替代NodePort):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress spec: rules: - host: nginx.example.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80资源监控:安装Prometheus-Operator监控资源使用情况
日志收集:部署Fluentd+Elasticsearch日志系统
记住,K8s学习应该先建立核心概念认知,再通过具体应用加深理解。这个Nginx示例虽然简单,但已经包含了最核心的部署模式。当熟悉这些基础后,再逐步学习ConfigMap、Volume、StatefulSet等进阶概念会更轻松。