【问题标题】:Kubernetes deployment wipes out persistent volumeKubernetes 部署消除了持久卷
【发布时间】:2021-01-26 19:50:14
【问题描述】:

我正在尝试使用 kubernetes 设置容器化应用程序,但遇到了问题。当我更改应用程序的映像并重新部署时,持久卷似乎被清除了 - 例如,如果我使用 v1.0.0 进行部署,然后使用 v1.0.1 进行新部署。我尝试使用 Deployment 和 StatefuSet 设置应用程序,但结果相同,请检查以下代码。

我对 Kubernetes 还很陌生,如果能提供任何帮助,我们将不胜感激。

选项 1(StatefulSet):

kind: PersistentVolume
apiVersion: v1
metadata:
  name: test-admin-db-pv
spec:
  storageClassName: ''
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /var/lib/postgresql-test-admin-db/
---
apiVersion: v1
kind: Service
metadata:
  name: admin-node
  labels:
    app: admin-node
  annotations:
    beta.cloud.google.com/backend-config: '{"ports": {"80":"backendConfig-test"}}'
spec:
  type: NodePort
  selector:
    app: admin-node
  ports:
    - name: test-web-port
      port: 80
      targetPort: 4000
      protocol: TCP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: admin-node
spec:
  replicas: 1
  serviceName: admin-node
  selector:
    matchLabels:
      app: admin-node
  volumeClaimTemplates:
    - metadata:
        name: test-admin-db-claim
      spec:
        storageClassName: ''
        accessModes:
          - ReadWriteOnce
        volumeName: test-admin-db-pv
        resources:
          requests:
            storage: 1Gi
  template:
    metadata:
      labels:
        app: admin-node
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - image: 'postgres:10.4'
          name: admin-db
          env:
            - name: POSTGRES_DB
              value: db
            - name: POSTGRES_USER
              value: dbuser
            - name: POSTGRES_PASSWORD
              value: dbpassword
          ports:
            - containerPort: 5432
              name: admin-db
          volumeMounts:
            - name: test-admin-db-claim
              mountPath: /var/lib/postgresql
        - image: 'eu.gcr.io/my-project/my-image:v1.0.0'
          name: admin-node
          ports:
            - containerPort: 4000
              name: admin-node
          livenessProbe:
            httpGet:
              path: /api/health
              port: 4000
              scheme: HTTP
            initialDelaySeconds: 30
            timeoutSeconds: 10
          readinessProbe:
            httpGet:
              path: /api/health
              port: 4000
              scheme: HTTP
            initialDelaySeconds: 30
            timeoutSeconds: 10
          env:
            - name: NODE_ENV
              value: development
            - name: LOG_LEVEL
              value: info
            - name: NAMESPACE
              value: test
            - name: DB_DB
              value: db
            - name: DB_HOST
              value: 0.0.0.0
            - name: DB_PASS
              value: dbpassword
            - name: DB_USER
              value: dbuser
            - name: DB_PORT
              value: '5432'
      restartPolicy: Always

选项 2(部署):

kind: PersistentVolume
apiVersion: v1
metadata:
  name: test-admin-db-pv
spec:
  storageClassName: ''
  capacity:
    storage: 1Gi
  claimRef:
    name: test-admin-db-claim
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /var/lib/postgresql-test-admin-db/
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-admin-db-claim
spec:
  storageClassName: ''
  accessModes:
    - ReadWriteOnce
  volumeName: test-admin-db-pv
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: admin-node
  labels:
    app: admin-node
  annotations:
    beta.cloud.google.com/backend-config: '{"ports": {"80":"backendConfig-test"}}'
spec:
  type: NodePort
  selector:
    app: admin-node
  ports:
    - name: test-web-port
      port: 80
      targetPort: 4000
      protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: admin-node
spec:
  replicas: 1
  selector:
    matchLabels:
      app: admin-node
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  template:
    metadata:
      labels:
        app: admin-node
    spec:
      containers:
        - image: 'postgres:10.4'
          name: admin-db
          env:
            - name: POSTGRES_DB
              value: db
            - name: POSTGRES_USER
              value: dbuser
            - name: POSTGRES_PASSWORD
              value: dbpassword
          ports:
            - containerPort: 5432
              name: admin-db
          volumeMounts:
            - name: test-admin-db-persistent-storage
              mountPath: /var/lib/postgresql
        - image: 'eu.gcr.io/my-project/my-image:v1.0.0'
          name: admin-node
          ports:
            - containerPort: 4000
              name: admin-node
          livenessProbe:
            httpGet:
              path: /api/v1/health
              port: 4000
              scheme: HTTP
            initialDelaySeconds: 30
            timeoutSeconds: 10
          readinessProbe:
            httpGet:
              path: /api/v1/health
              port: 4000
              scheme: HTTP
            initialDelaySeconds: 30
            timeoutSeconds: 10
          env:
            - name: NODE_ENV
              value: development
            - name: LOG_LEVEL
              value: info
            - name: NAMESPACE
              value: test
            - name: DB_DB
              value: db
            - name: DB_HOST
              value: 0.0.0.0
            - name: DB_PASS
              value: dbpassword
            - name: DB_USER
              value: dbuser
            - name: DB_PORT
              value: '5432'
      volumes:
        - name: test-admin-db-persistent-storage
          persistentVolumeClaim:
            claimName: test-admin-db-claim
      restartPolicy: Always

编辑 既然提到了我正在共享持久卷信息(回收策略已设置为保留)

Name:            test-admin-db-pv
Labels:          <none>
Annotations:     pv.kubernetes.io/bound-by-controller: yes
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    
Status:          Bound
Claim:           wipetestdep/test-admin-db-claim-admin-node-0
Reclaim Policy:  Retain
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        10Gi
Node Affinity:   <none>
Message:         
Source:
    Type:          HostPath (bare host directory volume)
    Path:          /var/lib/postgresql-wipetestdep-admin-db/
    HostPathType:  
Events:            <none>

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    来自docs

    PersistentVolume 可以有各种回收策略,包括 “保留”、“回收”和“删除”。对于动态配置 PersistentVolumes,默认回收策略是“删除”。这表示 动态配置的卷会自动删除,当 用户删除相应的 PersistentVolumeClaim。这种自动 如果卷包含宝贵的数据,则行为可能不合适。 在这种情况下,使用“保留”策略更为合适。和 “保留”策略,如果用户删除 PersistentVolumeClaim,则 对应的 PersistentVolume 不会被删除。相反,它被移动 到 Released 阶段,其所有数据都可以手动进行 恢复了。

    将回收策略更改为Retain 使用

    kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    

    其中&lt;your-pv-name&gt; 是您选择的PersistentVolume 的名称

    【讨论】:

    • 持久卷已经具有保留回收策略名称:test-admin-db-pv 标签: 注释:pv.kubernetes.io/bound-by-controller:是终结者:[kubernetes .io/pv-protection] StorageClass:状态:绑定声明:test/test-admin-db-claim-admin-node-0 回收策略:保留访问模式:RWO VolumeMode:文件系统
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2020-05-28
    相关资源
    最近更新 更多