当涉及到使用Kubernetes部署我的Django应用程序的PostgreSQL数据库时,我感到困惑。下面是我是如何构造部署定义.yml文件的:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres-container
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
volumes:
- name: postgres-volume-mount
persistentVolumeClaim:
claimName: postgres-pvc
- name: postgres-credentials
secret:
secretName: postgres-credentials我不明白的是这个。如果我在Kubernetes部署对象的规范中指定(就像我做过的那样)现有的PostgreSQL镜像,我如何实际运行我的应用程序?我需要在settings.py文件中指定什么作为主机?
下面是我的settings.py文件现在的样子:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'agent_technologies_db',
'USER': 'stefan_radonjic',
'PASSWORD': 'cepajecar995',
'HOST': 'localhost',
'PORT': '',
}
}它是以这种方式构建的,因为我还在设计应用程序,我还不想把它部署到Kubernetes集群。但是当我这样做的时候,我应该为HOST和PORT指定什么呢?另外,这是将PostgreSQL部署到Kubernetes集群的正确方式吗?
提前谢谢你!
*问题更新*
按照建议,我已经创建了service.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我已经更新了我的settings.py文件:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'agent_technologies_db',
'USER': 'stefan_radonjic',
'PASSWORD': 'cepajecar995',
'HOST': 'postgres-service',
'PORT': 5432,
}
}但是我得到了以下错误:

发布于 2018-05-06 07:25:38
为了允许与Kubernetes中的PostreSQL部署进行通信,您需要设置一个Service对象。如果您的Django应用程序将与您的PostgreSQL部署位于同一集群中,那么您将需要ClusterIP类型的服务;否则,如果您的Django应用程序位于您的集群之外,您将需要LoadBalancer或NodePort类型的服务。
创建服务有两种方式:
YAML
第一种方法是通过一个yaml文件,在您的示例中,该文件如下所示:
kind: Service
apiVersion: v1
metadata:
name: postgres
spec:
selector:
app: postgres-container
tier: backend
ports:
- name: postgres
protocol: TCP
port: 5432
targetPort: 5432.spec.selector字段定义Service的目标。此服务将以标签为app=postgres-container和tier=backend的pods为目标。它暴露了容器的端口5432。在您的Django配置中,您可以将服务的名称作为HOST:在本例中,名称就是postgres。Kubernetes会将服务名称解析为匹配的实例IP,并将流量路由到实例。端口将是服务的端口: 5432。
kubectl暴露
创建服务的另一种方法是通过kubectl expose命令:
kubectl expose deployment/postgres此命令将缺省设置为ClusterIP类型的服务,并公开在部署YAML域中定义的端口。
更多信息:
https://kubernetes.io/docs/concepts/services-networking/service/
此外,这是将PostgreSQL部署到Kubernetes集群的正确方式吗?
这取决于一些变量。您是否计划部署Postgres集群?如果是这样的话,您可能需要考虑使用StatefulSet:
StatefulSets对于需要以下一项或多项要求的应用程序非常有用。
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#using-statefulsets
你有没有一个精通Postgres的人来配置和维护它?如果没有,我还建议您考虑在集群(例如RDS)之外部署托管Postgres服务器。您仍然可以在集群中部署Django应用程序,并通过ExternalName服务连接到数据库。
我建议这样做的原因是,在Kubernetes集群中管理有状态应用程序可能具有挑战性。我不熟悉Postgres,但这里有一个在Kubernetes上运行Postgres的警示故事:https://gravitational.com/blog/running-postgresql-on-kubernetes/
除此之外,以下是我遇到的一些经验,它们影响了我从集群中删除有状态工作负载的决定:
卡住的卷
如果您使用的是AWS EBS卷,则如果您的DB pod被重新安排到新节点,则卷可能会在节点上“卡住”,并且无法分离并重新连接到新节点。
迁移到新集群
如果您需要将工作负载移至新集群,您将不得不应对额外的挑战,即将状态移至新集群,而不会丢失任何数据。如果你将你的有状态应用移出集群,那么你可以把整个集群当作牛,然后拆卸它并迁移到一个新的集群就会变得容易得多。
更多信息:
关于使用StatefulSets部署Postgres的K8s博客文章:https://kubernetes.io/blog/2017/02/postgresql-clusters-kubernetes-statefulsets/
发布于 2018-05-06 16:48:47
你有两个箱子。
kubernetes 1)您的应用程序在集群内运行。
您需要通过service引用postgres pod。
apiVersion: v1
kind: Service
metadata:
labels:
app: postgres-container
tier: backend
name: postgres
spec:
ports:
- port: 5432
protocol: TCP
selector:
app: postgres
sessionAffinity: None
type: ClusterIP然后在需要指定postgres_host时编写postgres。
kubernetes 2)您的应用程序在集群之外运行。
在这种情况下,您必须提供一种从外部进入集群内部的方法。或者通过LoadBalancer,或者通过入口。在这种情况下,您也必须创建一个Service (参见第1点)。

我用ingress写了一个例子。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tutorial
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: my_kube.info
http:
paths:
- path: /
backend:
serviceName: postgres-container
servicePort: 5432主机(或您选择的任何名称)必须是可解析的(DNS或在/ my_kube.info /my_kube.info中写一行)。
如果你需要一个HA postgres管理器,你可以看看:http://stolon.io/
https://stackoverflow.com/questions/50193071
复制相似问题