kubernetes - Kubernetes - 封装 DB 的 Pod 崩溃
问题描述
当我尝试将 Django 应用程序部署到 Kubernetes 集群时遇到问题。更具体地说,当我尝试部署 PostgreSQL 时。
这是我的 .YML 部署文件的样子:
apiVersion: v1
kind: Service
metadata:
name: postgres-service
spec:
selector:
app: postgres-container
tier: backend
ports:
- protocol: TCP
port: 5432
targetPort: 5432
type: ClusterIP
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv
labels:
type: local
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 2Gi
hostPath:
path: /tmp/data/persistent-volume-1 #U okviru cvora n
persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pv-claim
labels:
type: local
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres-container
tier: backend
template:
metadata:
labels:
app: postgres-container
tier: backend
spec:
containers:
- name: postgres-container
image: postgres:9.6.6
env:
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: postgres-credentials
key: user
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-credentials
key: password
- name: POSTGRES_DB
value: agent_technologies_db
ports:
- containerPort: 5432
volumeMounts:
- name: postgres-volume-mount
mountPath: /var/lib/postgresql/data/db-files
volumes:
- name: postgres-volume-mount
persistentVolumeClaim:
claimName: postgres-pv-claim
- name: postgres-credentials
secret:
secretName: postgres-credentials
这是我运行 kubectl get pods 命令时得到的结果:
NAME READY STATUS RESTARTS AGE
agent-technologies-deployment-7c7c6676ff-8p49r 1/1 Running 0 2m
agent-technologies-deployment-7c7c6676ff-dht5h 1/1 Running 0 2m
agent-technologies-deployment-7c7c6676ff-gn8lp 1/1 Running 0 2m
agent-technologies-deployment-7c7c6676ff-n9qql 1/1 Running 0 2m
postgres-8676b745bf-8f7jv 0/1 CrashLoopBackOff 4 3m
这是我尝试使用以下命令检查 PostgreSQL 部署的情况时得到的结果kubectl logs $pod_name
:
initdb: directory "/var/lib/postgresql/data" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/var/lib/postgresql/data" or run initdb
with an argument other than "/var/lib/postgresql/data".
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
注意:我使用 Google Cloud 作为提供商。
解决方案
你不能让你的数据库在/var/lib/postgres/data/whatever
.
通过更改该路径,/var/lib/postgres/whatever
它将起作用。
17.2.1. 使用辅助文件系统
许多安装在机器的“根”卷之外的文件系统(卷)上创建它们的数据库集群。如果您选择这样做,建议不要尝试使用辅助卷的最顶层目录(安装点)作为数据目录。最佳实践是在 PostgreSQL 用户拥有的挂载点目录中创建一个目录,然后在其中创建数据目录。这可以避免权限问题,特别是对于 pg_upgrade 等操作,并且如果辅助卷脱机,它还可以确保完全失败。
而且,顺便说一句,我必须创建一个秘密,因为它不在帖子中:
apiVersion: v1
kind: Secret
metadata:
name: postgres-credentials
type: Opaque
data:
user: cG9zdGdyZXM= #postgres
password: cGFzc3dvcmQ= #password
请注意,用户名必须是“postgres”。不知道你有没有覆盖这个...
推荐阅读
- jquery - 保存最后点击的元素并在页面重定向后保持它的 css 样式
- python - 如何在使用 python scrapy 抓取网站时摆脱重复链接?
- xml - XSLT 1.0:具有以下兄弟条件的环绕标记
- ionic-framework - 可以用 Ionic 构建 Telegram 客户端吗?
- laravel - 在哪里放置我曾经使用过的额外 Laravel 路线,但我想保留它们仅供参考
- unity3d - 游戏开始时分数不是从0开始的
- r - 如何沿同一数据框中的列分配 R 中数据框的行和
- android - 导航表单选项菜单项时导航到嵌套图时如何返回用户离开的位置?
- r - r plotly中的白色标签垫
- ios - iOS 13 状态栏样式