一、PV 与 PVC(持久化存储)
1️⃣ PV(PersistentVolume)
-
集群级别的存储资源,由管理员提前创建(或动态供给)
-
生命周期 独立于 Pod
-
关键属性:
capacity、accessModes、storageClassName、persistentVolumeReclaimPolicy(Retain/Delete/Recycle)
yaml
yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-storage
nfs:
server: 192.168.1.100
path: /data/nfs
2️⃣ PVC(PersistentVolumeClaim)
-
用户对存储的请求(大小 + 访问模式 + StorageClass)
-
K8s 自动绑定满足条件的 PV
yaml
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: nfs-storage
3️⃣ Pod 中使用 PVC
yaml
yaml
volumes:
- name: data
persistentVolumeClaim:
claimName: pvc-nfs
📌 AccessModes
-
ReadWriteOnce (RWO):单节点读写 -
ReadOnlyMany (ROX):多节点只读 -
ReadWriteMany (RWX):多节点读写(需后端支持,如 NFS / CephFS)
📌 StorageClass + Provisioner:支持动态创建 PV(最常用)
二、探针(Probe)
用于判断容器健康状态,配在 container 下
| 探针 | 作用 |
|---|---|
livenessProbe |
存活探针 → 失败则 重启容器 |
readinessProbe |
就绪探针 → 失败则 从 Service Endpoints 摘除(不重启) |
startupProbe |
启动探针(慢启动应用)→ 在成功前禁用 liveness |
探测方式
-
httpGet -
tcpSocket -
exec
示例
yaml
yaml
containers:
- name: app
image: nginx
startupProbe:
httpGet:
path: /
port: 80
failureThreshold: 30
periodSeconds: 5
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 5
periodSeconds: 5
三、Pod镜像拉取和重启策略(restartPolicy)
镜像拉取策略(imagePullPolicy)
这个字段配在 container 级别 ,控制 kubelet 在创建容器时是否去远程仓库拉取镜像。
三种取值
| 策略 | 行为 | 典型场景 |
|---|---|---|
Always |
每次创建容器都去仓库检查并拉取(tag 变了会更新) | 生产环境、latest tag、需要保证镜像最新 |
IfNotPresent |
本地有就用本地的,没有才去拉 | 开发/测试、离线环境、内网部署 |
Never |
只用本地镜像,绝不远程拉取 | 纯离线环境、镜像已提前 docker load 到节点 |
只能在 Pod / 单个容器层配置,Deployment 等控制器默认固定为 Always
| 策略 | 说明 |
|---|---|
Always(默认) |
容器退出就重启(适用于常驻服务) |
OnFailure |
非零退出码才重启(适合 Job) |
Never |
不重启(适合一次性任务) |
yaml
yaml
spec:
restartPolicy: Always
⚠️ Deployment / StatefulSet **只允许 Always**
Job / CronJob 通常用 OnFailure/ Never
四、Pod YAML 基本参数结构
yaml
yaml
apiVersion: v1 # apps/v1(Deployment) / batch/v1(Job)
kind: Pod
metadata:
name: my-pod
namespace: default
labels:
app: myapp
spec:
containers:
- name: app
image: nginx:1.25
imagePullPolicy: IfNotPresent # Always / Never
ports:
- containerPort: 80
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
env:
- name: ENV_VAR
value: "prod"
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumes:
- name: data
persistentVolumeClaim:
claimName: pvc-nfs
restartPolicy: Always
nodeSelector: {}
tolerations: []
五、K8s 常用命令(kubectl)
bash
bash
# 资源查看
kubectl get pods [-n ns] [-o wide]
kubectl describe pod <pod> [-n ns]
kubectl logs <pod> [-c container] [-f]
# 进入容器 / 端口转发
kubectl exec -it <pod> -- sh
kubectl port-forward pod <pod> 8080:80
# 创建 / 删除 / 应用
kubectl apply -f xxx.yaml
kubectl delete -f xxx.yaml
kubectl edit deploy <name>
# 扩缩容 / 重启
kubectl scale deploy <name> --replicas=3
kubectl rollout restart deploy <name>
kubectl rollout status deploy <name>
kubectl rollout undo deploy <name>
# 查看事件 / 拓扑
kubectl get events --sort-by=.metadata.creationTimestamp
kubectl get nodes,pv,pvc,svc
六、K8s 高可用(HA)体现
K8s 高可用是 多层 HA 的组合:
① 控制平面 HA
-
多 Master(≥3 奇数节点)
-
kube-apiserver:前置 LB(haproxy / keepalived /云LB) -
etcd:集群模式(Raft),容忍(n-1)/2节点故障 -
kube-controller-manager/kube-scheduler:Leader Election,只一节点活跃
-
-
⇒ 任意 Master 宕机,集群仍可管理
② 工作负载 HA
-
**多副本(Deployment / StatefulSet)** ⇒ Pod 打散在不同 Node
-
podAntiAffinity 避免同应用全在同一节点
-
HPA 自动扩缩应对负载
③ 节点级 HA
-
DaemonSet + 多 Worker Node
-
节点故障 ⇒ 该节点 Pod 被驱逐,调度到其他健康节点重新拉起
④ 存储 / 网络 HA
-
PV 后端(Ceph/NFS/云盘)本身具备冗余
-
CNI + kube-proxy 保证 Service 流量自动切换