首页 > 解决方案 > K8S使用volume来保存DB数据

问题描述

我已经创建并卷并将它(第一次)安装到我的应用程序。我有 postgres db,如果容器完成了一些重启/停止/杀死等操作,我想将数据保留在一个卷中

当我使用部署我的应用程序时,helm我看到以下内容

Name:          feature
Namespace:     un
StorageClass:  default
Status:        Bound
Volume:        pvc-7f0-25d2-4-90c1-541f5d262
Labels:        app=un
               chart=un-0.0.1
               heritage=Tiller
               release=elder-fox
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/aws-ebs
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      11Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Events:
  Type       Reason                 Age   From                         Message
  ----       ------                 ----  ----                         -------
  Normal     ProvisioningSucceeded  102m  persistentvolume-controller  Successfully provisioned volume  pvc-7f0-25d2-4-90c1-541f5d262
  using kubernetes.io/aws-ebs
Mounted By:  fe-postgres-9f8c7-49w26


我的问题是如何验证我输入到数据库的数据是否实际映射到一个卷并保存在那里,我看到该卷已绑定但不确定它是否真的保留了来自 postgress db 的数据?

这是我创建的对象

PersistentVolumeClaim

{{- if (and .Values.persistence.enabled (eq .Values.persistence.existingClaim "")) }}
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: {{ template "un.fullname" . }}
  namespace: {{ .Values.namespace }}
  labels:
    app: {{ template "un.name" . }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  accessModes:
    - {{ .Values.persistence.accessMode }}
  resources:
    requests:
      storage: {{ .Values.persistence.size }}
{{- if .Values.persistence.storageClass }}
{{- if (eq "-" .Values.persistence.storageClass) }}
  storageClassName: ''
{{- else }}
  storageClassName: {{ .Values.persistence.storageClass }}
{{- end }}
{{- end }}
{{- end }}

后退

{{- if .Values.config.postgres.internal }}
apiVersion: v1
kind: Service
metadata:
  name: {{ template "un.fullname" . }}-postgres
  namespace: {{ .Values.namespace }}
  labels:
    app: {{ template "un.name" . }}-postgres
    chart: {{ .Chart.Name }}-{{ .Chart.Version }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  type: ClusterIP
  ports:
    - name: postgres
      port: 5432
      targetPort: container
  selector:
    app: {{ template "un.name" . }}-postgres
    release: {{ .Release.Name }}
{{- end }}

这是部署

{{- if .Values.config.postgres.internal }}
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: {{ template "un.fullname" . }}-postgres
  namespace: {{ .Values.namespace }}
  labels:
    app: {{ template "un.name" . }}-postgres
    chart: {{ .Chart.Name }}-{{ .Chart.Version }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  template:
    metadata:
      labels:
        app: {{ template "un.name" . }}-postgres
        release: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ template "un.fullname" . }}-postgres
          image: {{ .Values.images.postgres.repository }}:{{ .Values.images.postgres.tag }}
          imagePullPolicy: {{ .Values.images.postgres.pullPolicy }}
          ports:
            - name: container
              containerPort: 5432
          volumeMounts:
            - name: data
              mountPath: /var/lib/postgresql/data
              subPath: postgres
          env:
            - name: POSTGRES_DB
              valueFrom:
                configMapKeyRef:
                  name: {{ template "un.fullname" . }}
                  key: postgres_database
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: {{ template "un.fullname" . }}
                  key: postgres_password
          livenessProbe:
            tcpSocket:
              port: container
{{ toYaml .Values.probes.liveness | indent 12 }}
          readinessProbe:
            tcpSocket:
              port: container
{{ toYaml .Values.probes.readiness | indent 12 }}
      volumes:
        - name: data
          {{- if .Values.persistence.enabled }}
          persistentVolumeClaim:
            claimName: {{ .Values.persistence.existingClaim | default (include "un.fullname" . ) }}
          {{- else }}
          emptyDir: {}
          {{- end }}
{{- end }}

这是 yaml 的值

images:
  postgres:
    repository: postgres
    tag: 10
    pullPolicy: IfNotPresent

config:
  postgres:
    database: un
    host: ''
    internal: true
    password: postgres
    port: 5432
    url: ''
    username: postgres
…

标签: postgresqlamazon-web-serviceskubernetesgoogle-cloud-platformkubernetes-helm

解决方案


我没有看到您的值文件中设置了 persistence.enabled,因此我假设您使用 emptyDir 作为卷(kubectl get deployment <your deployment name> -o yaml将为您提供部署的运行状态)。emptyDir 与 Pod 具有相同的生命周期,这意味着如果 Pod 由于任何原因从节点中删除,emptyDir 中的数据将被永久删除(请注意,容器崩溃不会从节点中删除 Pod,因此emptyDir 卷在 Container 崩溃时是安全的)。

如果你想在 Pod 被移除后保持数据持久化,你需要在你的值文件中将 persistence.enabled 设置为 true 并指定一个 storageclass(或者你定义了一个默认的 storageclass。运行kubectl get storageclasses来弄清楚)

可以通过删除 postgres Pod 来验证数据是否持久化(部署会在 Pod 删除后重新创建一个)


推荐阅读