Kubernetes 的学习曲线陡峭,很大程度是因为一上来就被几十个对象类型淹没。其实日常 80% 的工作只围绕三个对象:Pod 跑应用,Deployment 管 Pod,Service 暴露 Pod。理清这三者的关系,K8s 的大门就打开了。
先换脑子:声明式,不是命令式
传统运维是命令式的:「启动 3 个容器」「这台挂了,重启它」。K8s 是声明式的:你只提交期望状态(“这个应用要有 3 个副本”),K8s 的控制循环持续观察实际状态,发现偏差就自动纠正——副本少了就补,节点挂了就迁。
你提交的每一份 YAML 都是一张「愿望清单」,而不是操作手册。这个模型是理解一切 K8s 行为的前提。
Pod:最小调度单位
Pod 是一个或多个共享网络与存储的容器组,是 K8s 调度的最小单位。同一 Pod 内的容器共享 IP 和端口空间,通过 localhost 互访。
为什么不是直接调度容器?因为存在「主容器 + 紧密耦合的辅助容器」场景:比如应用容器写日志到共享目录,边车(sidecar)容器负责把日志转发出去——它们必须同生共死、共享存储,打包成一个 Pod 正合适。
实践中很少手写 Pod 定义,但要知道它的两个特性:IP 是临时的(Pod 重建就换)、Pod 是不可变的(想改配置?删掉重建)。
Deployment:让 Pod 保持「想要的样子」
直接创建 Pod 是自虐:它挂了就挂了,没人管。Deployment 在 Pod 之上加了副本管理和更新策略:
apiVersion: apps/v1kind: Deploymentmetadata: name: webspec: replicas: 3 # 期望 3 个副本 selector: matchLabels: app: web template: # Pod 模板 metadata: labels: app: web spec: containers: - name: web image: registry.example.com/myapp:1.4.2 ports: - containerPort: 8080 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 256Mikubectl apply -f deployment.yamlkubectl get pods # 看到 3 个 web-xxx 的 Pod滚动更新:改 image 版本后再 apply,Deployment 默认用 RollingUpdate 策略——先起一个新版本 Pod,健康了再灭一个旧的,如此滚动,全程服务不中断。
回滚:历史版本被自动记录,新版出问题时一键回到上一个:
kubectl rollout status deployment/web # 观察更新进度kubectl rollout undo deployment/web # 回滚自愈:手动 kubectl delete pod web-xxx 试试——Deployment 立刻补一个新 Pod 维持 replicas: 3。这就是声明式控制循环的直观体现。
Service:给会漂移的 Pod 一个稳定地址
Pod IP 会变、副本会扩缩,客户端该连哪个地址?Service 用标签选择器圈定一组 Pod,提供一个稳定的虚拟 IP 和 DNS 名,并把流量转发过去。
apiVersion: v1kind: Servicemetadata: name: webspec: selector: app: web # 选中所有带 app=web 标签的 Pod ports: - port: 80 # Service 自己的端口 targetPort: 8080 # 转发到 Pod 的端口集群内其他应用现在可以通过 http://web(同命名空间下)访问你的服务——不用关心后面是 3 个还是 30 个 Pod、IP 换了几次。
Service 的三种常用类型:
| 类型 | 作用 |
|---|---|
ClusterIP(默认) | 仅集群内访问,内部服务间调用的标准方式 |
NodePort | 在每个节点开一个端口(30000-32767),外部可经节点 IP 访问 |
LoadBalancer | 向云厂商申请一个外部负载均衡器,生产暴露服务的常用方式 |
对外提供 HTTP 服务时,更常见的组合是 Service + Ingress(统一域名、路径路由和 TLS 终结),Ingress 可以认为是「HTTP 层的 Service」。
三者关系一图流
管理副本与更新 Deployment ──────────────────► Pod × 3(标签 app=web) ▲ │ 标签选择器 Service ───────────────────────────┘ (稳定 IP/DNS,负载均衡转发)客户端访问 Service 的固定地址;Service 按标签把请求分发给当前存活的 Pod;Deployment 保证 Pod 的数量和版本符合期望。三层各司其职,任何一层都不需要知道其他层的实现细节。
动手前的建议
本地学习用 minikube 或 kind(Kubernetes in Docker)起单节点集群;云厂商的托管 K8s(ACK、TKE、EKS)省掉控制面运维,适合生产起步。学会 kubectl get/describe/logs/apply 四件套,就足以完成日常 80% 的操作——describe 尤其重要,任何对象「不正常」,先看它末尾的 Events。
延伸阅读
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
最后更新于 ,距今已过 5 天
部分内容可能已过时