postgresql - 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
…
解决方案
我没有看到您的值文件中设置了 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 删除后重新创建一个)
推荐阅读
- java - java openjdk版本“1.8.0_292”的SSL错误
- azure-devops - azure-spring-boot-starter-keyvault-secrets 在 PCF 中的应用程序启动期间未解析 vcap 服务变量
- sql - group by 根据标题返回总共三列
- oracle - oracle中某些列的选择
- ratpack - 兼容的 Groovy 版本
- sql - 计算出现次数和出现次数的百分比
- vue.js - 从 vue.js 3 中传递数据的方法渲染组件
- vega - Vega:使画布适合容器宽度
- java - 如何使用 Apache POI 取消合并特定行中的单元格?
- python - Django rest 框架:序列化程序在响应数据中不包含 id 字段