从零入门Kubernetes(三节学习笔记):核心对象、持久化存储与网络基础
本文作者:yanghuajun336
更新时间:2025-12-31
本篇笔记适合Kubernetes入门和有一定实战经验的提升者,内容涵盖核心K8s资源对象(Deployment、StatefulSet等)、持久化卷存储机制、以及Service/Pod/Ingress的网络通信和基础安全要点。
第一章:K8s核心对象进阶——Deployment、StatefulSet、DaemonSet
1. Pod
1.1 概念
- Pod是Kubernetes中最小的可调度单元
- 通常包含一个(或极少数几个)高度耦合的容器
1.2 作用与使用场景
- 跑临时、一次性任务
- 需要多个协作容器(如主应用+sidecar)
- 演示实验性容器运行
1.3 示例 YAML
1 2 3 4 5 6 7 8 9 10
| apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80
|
1.4 总结
手动管理Pod很少见,通常用更高级的控制器来管理“Pod副本”的生命周期。
2. Deployment
2.1 概念
- Deployment 是最常见的无状态应用控制器
- 管理Pod的副本数、滚动升级、自动重建失败实例
2.2 作用与使用场景
- 部署Web服务/微服务等无状态应用
- 轻松水平扩展与升级
2.3 示例 YAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: app image: nginx:1.25 ports: - containerPort: 80
|
2.4 升级/Rollback/扩缩容
1 2 3 4
| kubectl scale deployment myapp --replicas=5 kubectl rollout restart deployment myapp kubectl rollout history deployment myapp kubectl rollout undo deployment myapp
|
2.5 总结
日常部署无状态服务,几乎都建议用Deployment。
3. StatefulSet
3.1 概念
- 管理有状态应用(如数据库、Zookeeper)
- Pod有固定名字、有序启动、唯一存储挂载
3.2 作用与使用场景
- 需要稳定身份和顺序启动的服务
- 每个Pod需要独立持久化数据(如MySQL主从、ES分片)
3.3 示例 YAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: mysql-headless replicas: 3 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8 ports: - containerPort: 3306 volumeMounts: - name: data mountPath: /var/lib/mysql volumeClaimTemplates: - metadata: name: data spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi
|
3.4 特点
- Pod名字如:mysql-0、mysql-1、mysql-2
- 每个Pod和PVC是一一对应的
4. DaemonSet
4.1 概念
- 每个(或每类)节点上各运行一个Pod
- 适合运行守护进程(如日志收集、监控Agent、CNI组件)
4.2 作用与使用场景
- 节点级Agent(如Prometheus Node Exporter、filebeat、fluentd、calico、CNI)
- 系统级任务,每加节点自动补1个Pod
4.3 示例 YAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: apps/v1 kind: DaemonSet metadata: name: node-exporter spec: selector: matchLabels: app: node-exporter template: metadata: labels: app: node-exporter spec: containers: - name: exporter image: prom/node-exporter ports: - containerPort: 9100
|
5. Job 与 CronJob
5.1 Job
- 用于一次性任务,Pod跑完即销毁(如批处理、迁移脚本)
1 2 3 4 5 6 7 8 9 10 11 12
| apiVersion: batch/v1 kind: Job metadata: name: hello-job spec: template: spec: containers: - name: busybox image: busybox command: ["echo", "hello"] restartPolicy: Never
|
5.2 CronJob
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: batch/v1 kind: CronJob metadata: name: hello spec: schedule: "*/5 * * * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster restartPolicy: OnFailure
|
总结对比表
| 控制器 |
适用场景 |
最大特色 |
| Pod |
演示/调试/一次性 |
最原始,少用,手动管理生命周期 |
| Deployment |
无状态服务 |
滚动升级,扩缩容自动化 |
| StatefulSet |
有状态服务 |
固定Pod身份,专用持久存储 |
| DaemonSet |
节点级全局服务 |
每节点1份,自动补齐 |
| Job |
一次性批处理任务 |
完成即销毁,支持重复 |
| CronJob |
定时批处理任务 |
定时执行,有历史Job管理 |
第二章:Kubernetes 存储与数据持久化
目录
- 存储核心概念总览
- PV/PVC 基本用法与场景
- StorageClass 动态/静态供应机制
- 常见存储方案实践(NFS/HostPath/云盘等)
- 存储实战排障和最佳实践
1. 核心概念总览
Kubernetes 不是传统的“单机→挂盘→自动用”模式,而是通过分离“存储声明”(PV)与“应用请求”(PVC),让存储能灵活复用、调度和迁移。
PV (PersistentVolume)
集群管理员预先创建好的“磁盘”(存储资源),声明可以被Pod使用。
PVC (PersistentVolumeClaim)
开发者/用户提交的“我要一个多大、多快、多类型盘”的请求,由 K8s 自动绑定可用 PV。
StorageClass
描述存储类型、性能、供应策略等,配合动态供应器让 K8s 实时创建/删除物理存储。
2. PV/PVC 基本用法举例
场景:一个有状态 App —— MySQL 需要持久保存数据
步骤一:集群管理员创建 PV(静态供应方式)
1 2 3 4 5 6 7 8 9 10 11 12
| apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain hostPath: path: /mnt/data/mysql
|
步骤二:业务方声明 PVC(开发者无需关心物理盘)
1 2 3 4 5 6 7 8 9 10
| apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi
|
步骤三:在应用里挂载 PVC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: replicas: 1 template: spec: containers: - name: mysql image: mysql:8.0 volumeMounts: - name: data mountPath: /var/lib/mysql volumes: - name: data persistentVolumeClaim: claimName: mysql-pvc
|
关系链:“我的容器要 data → data 挂载了 PVC → PVC 匹配到了 PV”
3. StorageClass 与动态供应
大部分生产环境(尤其云原生和大集群)不会一个个写 PV,而是“先创建好 StorageClass”,开发者声明 PVC 时自动帮你分配并创建后端存储盘,Pod 销毁,盘可以自动/按需回收。
StorageClass 示例(NFS客户端)
1 2 3 4 5 6 7 8
| apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-client provisioner: nfs-client parameters: archiveOnDelete: "false" reclaimPolicy: Retain
|
使用方式
1 2 3 4 5 6 7 8 9 10 11
| apiVersion: v1 kind: PersistentVolumeClaim metadata: name: myapp-pvc spec: storageClassName: nfs-client accessModes: - ReadWriteMany resources: requests: storage: 20Gi
|
这个 PVC 被创建后,NFS provisioner(或云厂商供应器)帮你自动生成 PV 并绑定。
4. 常见存储方案实践
HostPath(本地盘,测试用)
1 2
| hostPath: path: /mnt/data/mydemo
|
- 特点:节点死了,数据也丢了;只适合测试开发。
- 不建议生产环境用!
NFS(网络文件系统)
- 自建 NFS Server 或企业 NAS,适合小中型环境共享数据、多Pod挂载。
- 需要部署 NFS provisioner 当 StorageClass 动态供应器。
云存储(推荐生产)
- 如阿里云/腾讯云/华为云/Google/AWS 的云盘存储类产品(csi/cinder/ebs)。
- 配合云厂商 CSI 插件,创建 StorageClass 自动供应高可用存储盘。
Ceph / GlusterFS / MooseFS
5. 存储排障与最佳实践
常见问题
- PVC Pending(大概率是 StorageClass 未配置或存储驱动问题)
- 容器重建丢数据(通常未正确挂载PVC)
- 数据漂移、不一致(尝试用本地盘做多节点挂载)
最佳实践
- 生产环境强烈推荐使用 StorageClass 自动供应(避免手动PV易出错)
- 给每个有状态App单独分配PVC,且带独立 StorageClass/性能(如SSD/HDD)
- PV 的回收策略优先用 Retain,手工清理(防止误删持久盘)
总结
- 无状态部署用 emptyDir 即可,有状态服务要坚持用 PVC→PV→StorageClass 组合
- 能用动态存储,就坚决不要用静态 PV
- 数据宝贵?选云盘/高可用分布式存储/NFS供给
非常棒!我们现在进入第三章:《Kubernetes 网络与安全基础》。
第三章:Kubernetes 网络与安全基础
目录
- K8s 网络模型与 Service 详解
- Pod IP、Service IP、DNS 机制
- CNI 插件(如 Flannel/Calico)简介
- Ingress 网关与公网暴露
- 基础安全:ServiceAccount、Secret、NetworkPolicy
1. Kubernetes 网络模型与 Service 详解
1.1 Pod 网络
- 每个 Pod 都拥有全局唯一的 IP(Pod IP)
- 不同 Node 的 Pod 之间可以直接用 IP 通信(理论同一扁平网段)
- 由“CNI 插件”实现(比如 Flannel、Calico)
- 节点和 Pod 也能互相访问
1.2 Service:虚拟集群访问入口
为什么要有Service?
- Pod 的 IP 会随着重建而变化
- 需要一种抽象,帮我们生成“稳定访问入口+负载均衡”
常见 Service 类型
- ClusterIP: 默认,仅集群内可访问,内部负载均衡(如后端DB访问)
- NodePort: 每个节点开放端口,可通过NodeIP:Port访问(测试、小规模实验室适用)
- LoadBalancer: 云厂商环境常用,自动分配公网负载均衡器IP(如阿里云SLB、AWS ELB)
- Headless Service: 不分配 ClusterIP,Pod间直连(常用于 StatefulSet 服务发现)
YAML 示例
1 2 3 4 5 6 7 8 9 10 11 12
| apiVersion: v1 kind: Service metadata: name: myapp-svc spec: type: ClusterIP selector: app: myapp ports: - port: 80 targetPort: 8080
|
2. Pod IP、Service IP、DNS 机制
- K8s 集群会为 Service 自动分配“Service ClusterIP”(比如 10.96.0.1),所有请求由 kube-proxy/nftables 透明转发到某个后端Pod。
- 所有Pod自动带有 nameserver(kubedns/coredns),支持 Service 地址名直连:
myapp-svc.default.svc.cluster.local
- 业务端代码里建议用域名访问 Service,而不是 Pod IP,更耐升级换代。
- Headless Service(
clusterIP: None)+ StatefulSet 场景能让每个 Pod 用“独立DNS名”被其它Pod精确寻址(如:mysql-1.mysql-headless.default.svc.cluster.local)
3. CNI 插件简介
- K8s 默认不提供网络实现,必须依赖 CNI 插件(Container Network Interface)。
- 常见插件:
- Flannel:小型集群、实现简单、兼容性好
- Calico:支持网络策略(NetworkPolicy)、可公网/私网直连
- Cilium:高性能、支持BPF、易运维和安全
- 插件决定哪些网段分配给Pod,节点间如何转发等
4. Ingress 网关和公网暴露
- Ingress 作用:集群出口流量入口控制器,统一http/https流量,基于域名/路径/证书做路由、证书管理、认证等。
- 常见 Controller
- nginx-ingress-controller(最主流)、traefik、Istio IngressGateway
- 例子场景:多个服务统一暴露 80/443,集群内部通过 Service 按需“反向代理”。
Ingress YAML 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-app spec: rules: - host: myblog.example.com http: paths: - path: / pathType: Prefix backend: service: name: blog port: number: 80
|
5. 安全基础:ServiceAccount、Secret、NetworkPolicy
5.1 ServiceAccount
- Pod 运行的“身份”,用于K8s API鉴权授权,详见前述RBAC章节。
5.2 Secret
- K8s原生的敏感数据管理方案,支持base64加密(但不是强加密)。
1 2 3 4 5 6 7
| apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: db_pass: YmFzZTY0cGFzc3dvcmQ=
|
5.3 NetworkPolicy
- 可限制Pod之间/Namespace之间/指定端口/协议的数据访问,默认所有Pod相互可达
- 配合Calico/Cilium等网络插件生效
1 2 3 4 5 6 7 8
| apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress
|
总结重点
| 模块 |
作用 |
常见实践 |
| Service |
对Pod的访问入口/负载均衡 |
内网互通/暴露端口 |
| DNS |
域名发现与服务解耦 |
固定写Service名 |
| CNI |
实现Pod通信与网络隔离/策略 |
Flannel/Calico/Cilium |
| Ingress |
统一出口与协议层路由/证书/认证 |
80/443 反代 |
| Secret |
敏感数据安全存储 |
挂载/env/envFrom |
| NetworkPolicy |
粒度级数据包/协议访问限制 |
开启默认拒绝,再白名单 |