最近在自学 Kubernetes,刷了不少官方文档和实验,把网络、服务、存储、调度这些核心部分啃了好几遍。说实话,刚开始看 Service 和 Volume 的时候有点懵,概念太多,各种类型和模式容易混。但多敲了几次 yaml、多跑了几次 minikube 实验后,慢慢就理清楚了。这些东西在实际部署微服务、数据库、Web 应用时特别实用,基本决定了你的集群能不能稳、能不能扩、能不能安全。

这篇笔记把这些知识点系统整理了一下,重点讲清楚“是什么”“为什么这样设计”“实际场景怎么用”,顺带分享一些我踩过的坑和心得。代码片段都直接贴了,可以复制到集群里试(我用 minikube + kind 测试过)。适合想系统复习或者刚入门的同学慢慢看,边看边练效果最好。


目录

  1. Pod 之间的网络通信机制

  2. Service 的代理模式:iptables vs IPVS

  3. Service 类型详解与实际运用

  4. LoadBalancer 在裸金属集群的实现:MetalLB

  5. Ingress:七层流量入口的原理与功能

  6. Pod 健康检测:Liveness、Readiness 与 Startup Probe

  7. Pod 优雅关闭机制

  8. Volume 基础:emptyDir 与 hostPath

  9. 持久化存储:PV、PVC 与访问模式

  10. Pod 调度控制:节点选择、亲和性与污点

  11. 写在最后:学习心得与建议


1. Pod 之间的网络通信机制

Kubernetes 最牛的地方之一就是默认实现了“扁平网络”:每个 Pod 都有唯一的集群内 IP,Pod 之间可以直接通过 IP 通信,不需要 NAT 转换。

背后靠的是 CNI(Container Network Interface) 插件。常见的有 Flannel、Calico、Cilium 等。集群初始化时(kubeadm init)会指定 --pod-network-cidr,CNI 插件根据这个网段为每个 Pod 分配 IP。

实际运用
开发微服务时,根本不用关心网络拓扑,直接用 Pod IP 或 Service 名访问就行。生产环境建议用 Calico(支持网络策略)或 Cilium(eBPF 高性能)。

小贴士:minikube 默认用 kindnet,kind 用 kindnet,生产别用默认的,换个成熟插件。


2. Service 的代理模式:iptables vs IPVS

Service 是把一组 Pod 暴露为统一入口的核心抽象。后端流量转发靠 kube-proxy 实现,有两种模式:

  • iptables(默认):用 Linux iptables 规则做 NAT 转发。每个 Service 和每个 Endpoint 都会生成规则。简单可靠,但 Service 数量多(上千)时规则爆炸,性能下降明显。

  • IPVS(推荐大集群):用 Linux Virtual Server(LVS)实现,内核级负载均衡,支持更多算法(rr、lc、sh 等)。规则数量少,性能高很多。

切换方式:

kubectl edit cm kube-proxy -n kube-system
# 修改 mode: "ipvs"
kubectl rollout restart ds kube-proxy -n kube-system

运用心得:小集群用 iptables 够了,节点超 100、Service 超 500 就切 IPVS。我实验时切了 IPVS 后,压力测试延迟明显低。


3. Service 类型详解与实际运用

Service 有几种常见类型,各有场景:

  • ClusterIP(默认):分配集群内虚拟 IP,只允许集群内部访问。适合后端服务(如数据库、缓存)。

apiVersion: v1
kind: Service
metadata:
  name: mysql-svc
spec:
  selector:
    app: mysql
  ports:
    - port: 3306
      targetPort: 3306
  • NodePort:在每个节点开一个静态端口(30000-32767),外部通过节点IP:NodePort 访问。适合临时暴露或没有负载均衡器时。

spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30001
  • Headless(clusterIP: None):不分配虚拟 IP,直接返回后端 Pod IP 列表。适合 StatefulSet(如 MySQL 集群、主从复制)需要直接访问具体 Pod。

spec:
  clusterIP: None
  selector:
    app: nginx

运用总结:内部服务用 ClusterIP,开发测试用 NodePort,状态ful 应用用 Headless。


4. LoadBalancer 在裸金属集群的实现:MetalLB

云上 LoadBalancer 类型 Service 会自动分配公网 IP,但裸金属集群没有云负载均衡器,这时用 MetalLB

原理:

  • 配置 IP 地址池

  • Layer 2 模式(默认):选举 leader 节点,用 ARP 响应 VIP

  • BGP 模式:与路由器建立 BGP 会话,发布路由

安装(bare metal):

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml

配置地址池(Layer 2 示例):

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: my-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.240-192.168.1.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: empty
  namespace: metallb-system

运用:公司内网集群暴露服务必备。BGP 模式更适合大集群。


5. Ingress:七层流量入口的原理与功能

Ingress 是七层(HTTP/HTTPS)流量管理资源,本身不转发流量,靠 Ingress Controller(常见 Nginx、Traefik、Istio)实现。

核心功能:

  • 基于域名/路径路由

  • SSL 终止

  • 重写、限流、认证等扩展

典型 Nginx Ingress 示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-svc
            port:
              number: 80

运用:统一入口管理多个服务,比多个 LoadBalancer 省 IP。生产必配 TLS。


6. Pod 健康检测:Liveness、Readiness 与 Startup Probe

kubelet 通过探针检测容器状态:

  • Liveness:容器活着吗?失败 → 重启容器。适合死锁、自愈场景。

  • Readiness:准备好接收流量吗?失败 → 从 Service 摘除。适合启动预热、滚动升级。

  • Startup:启动阶段专用,成功前暂停 liveness 判断。适合慢启动应用(JVM 大应用)。

示例:

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
startupProbe:
  httpGet:
    path: /startup
    port: 8080
  failureThreshold: 30
  periodSeconds: 10

心得:数据库类用 startup + liveness,Web 类用 readiness + liveness。


7. Pod 优雅关闭机制

Pod 删除时,K8s 会:

  1. 发送 SIGTERM

  2. 等待 terminationGracePeriodSeconds(默认 30s)

  3. 超时后 SIGKILL

配置 preStop 钩子做收尾:

lifecycle:
  preStop:
    exec:
      command: ["/bin/sh", "-c", "sleep 10 && nginx -s quit"]

运用:数据库、消息队列必须优雅关闭,避免数据丢失。


8. Volume 基础:emptyDir 与 hostPath

  • emptyDir:Pod 生命周期内临时共享目录,重启保留,Pod 删除清空。可用内存(medium: Memory)。

  • hostPath:挂载节点本地路径。适合采集节点日志,但有安全风险。

运用:sidecar 模式用 emptyDir 共享文件,DaemonSet 采集日志用 hostPath。


9. 持久化存储:PV、PVC 与访问模式

  • PV:集群级存储资源(NFS、Ceph、云盘)

  • PVC:Pod 对存储的申请,绑定 PV

访问模式:

  • ReadWriteOnce(RWO):单节点读写

  • ReadOnlyMany(ROX):多节点只读

  • ReadWriteMany(RWX):多节点读写

  • ReadWriteOncePod:单 Pod 读写(最严格)

回收策略:Retain(手动)、Delete(自动删)、Recycle(已废弃)

运用:StatefulSet 用 PVC 持久化,RWX 用 NFS 共享。


10. Pod 调度控制:节点选择、亲和性与污点

  • nodeName:直接指定节点(绕过调度器)

  • nodeSelector:简单标签匹配

  • nodeAffinity:复杂匹配(requiredDuringSchedulingIgnoredDuringExecution 硬,preferred 软)

  • Taints/Tolerations:节点打污点(NoSchedule、PreferNoSchedule、NoExecute),Pod 加容忍才能调度上去

运用:GPU 节点打污点,只让 AI Pod 调度;亲和性把前后端 Pod 拉到同一可用区降低延迟。


11. 写在最后:学习心得与建议

这些知识点串起来就是 Kubernetes 的核心能力:网络连通、服务稳定暴露、存储可靠持久、调度灵活可控。学的时候最深的体会是“多实践”,光看文档容易忘,动手写 yaml、故意制造问题(比如关探针看重启、删 PVC 看回收)才能真正理解。

建议:

  • 用 minikube 或 kind 搭本地集群,多试各种 Service 类型

  • 看官方文档的 Tasks 部分,跟着敲

  • 遇到问题先 kubectl describe/get -o yaml 看状态

学 Kubernetes 虽然陡,但用起来真的香。坚持敲命令、看日志,慢慢就上手了!有问题欢迎评论区交流,一起进步。

(完)

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐