在本文中,我们将讨论PV和PVC一直Terminating的状态。
在以下情况下,资源将处于Terminating状态。
Terminating State意味着 PVC 和/或 PV 的删除将被推迟,直到它们不再被 pod 使用或绑定到 PVC。
我们将创建一个 PVC 和一个简单的应用程序,以便我们可以验证 Finalizers 并模拟 Terminating state以及如何修复它。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-claim
spec:
storageClassName: longhorn
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deploy
#namespace: example
labels:
app: example-app
annotations:
spec:
selector:
matchLabels:
app: example-app
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: example-app
spec:
containers:
- name: example-app
image: nginx
imagePullPolicy: Always
ports:
- containerPort: 5000
volumes:
- name: data
persistentVolumeClaim:
claimName: example-claim
验证一下一切是否已启动并正在运行:
kubectl get pvc --field-selector metadata.name=example-claim
kubectl get pv | grep -w "default/example-claim"
# claims associated with pod
kubectl get pods -o custom-columns=POD:.metadata.name,PVC:.spec.volumes[*].persistentVolumeClaim.claimName
PV PVC pod 的关系如下图:
在我们模拟Terminating state之前,让我们验证 PVC 和 PV 是否具有我们之前提到的注释 Finalizer。
#Looking for finalizer pv-protection
kubectl get pv pvc-b05c6e74-89b4-4669-8e00-5036f109a487 -o json | jq .metadata.finalizers
#Looking for finalizer pv-protection
kubectl get pvc example-claim -o json | jq .metadata.finalizers
让我们模拟Terminating state:
正如我们之前提到的,如果在 PV 绑定到 PVC ,直接删除PV 将会使PV处于Terminating state。
kubectl delete pv pvc-b05c6e74-89b4-4669-8e00-5036f109a487
同时删除 PVC:
kubectl delete pvc example-claim
因为仍然有使用 PVC 的pod,所以 PVC 也不会被删除,而是一直处于Terminating state。
删除pod:
kubectl delete pod example-deploy-75bcc94c6d-fftq2
or
kubectl delete deployment example-deploy
注意事项:
如果删除终止 pv 的Finalizers,pvc 将失去 Bound,保持在 Lost 状态,并且可能会丢失数据。
kubectl patch pvc pvc_name -p '{"metadata":{"finalizers":null}}'
or
kubectl patch pv pv_name -p '{"metadata":{"finalizers":null}}'