问题描述
当我尝试将Django应用程序部署到Kubernetes集群时遇到问题.更具体地说,当我尝试部署PostgreSQL时.
I am experiencing issues when I try to deploy my Django application to Kubernetes cluster. More specifically, when I try to deploy PostgreSQL.
.YML部署文件如下所示:
Here is what my .YML deployment file looks like:
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命令时得到的:
Here is what I get when I run kubectl get pods command :
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
这是当我尝试使用kubectl logs $pod_name
检查PostgreSQL部署的情况时得到的结果:
And here is what I get when I try to inspect what is going on with PostgreSQL deployment by using 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作为提供程序.
Note: I am using Google Cloud as a provider.
推荐答案
您不能在/var/lib/postgres/data/whatever
中拥有数据库.
You can't have your db in /var/lib/postgres/data/whatever
.
通过/var/lib/postgres/whatever
更改该路径,它将起作用.
Change that path by /var/lib/postgres/whatever
and it will work.
许多安装程序都在文件系统(卷)上创建其数据库集群,而不是计算机的根"目录.体积.如果选择执行此操作,建议不要尝试使用辅助卷的最顶层目录(装入点)作为数据目录.最佳实践是在PostgreSQL用户拥有的安装点目录中创建一个目录,然后在其中创建数据目录.这样可以避免权限问题,尤其是对于诸如pg_upgrade之类的操作,还可以确保在将辅助卷脱机后清除失败.
Many installations create their database clusters on file systems (volumes) other than the machine's "root" volume. If you choose to do this, it is not advisable to try to use the secondary volume's topmost directory (mount point) as the data directory. Best practice is to create a directory within the mount-point directory that is owned by the PostgreSQL user, and then create the data directory within that. This avoids permissions problems, particularly for operations such as pg_upgrade, and it also ensures clean failures if the secondary volume is taken offline.
而且,顺便说一下,我必须创建一个秘密,因为它不在帖子中:
And, by the way, I had to create a secret, as it is not in the post:
apiVersion: v1
kind: Secret
metadata:
name: postgres-credentials
type: Opaque
data:
user: cG9zdGdyZXM= #postgres
password: cGFzc3dvcmQ= #password
请注意,用户名必须为"postgres".我不知道你是否在报道...
Note that the username needs to be "postgres". I don't know if you are covering this...
这篇关于Kubernetes-封装DB的Pod崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!