使用Kubernetes部署PostgreSQL数据库

时间:2018-05-05 19:05:30

标签: django postgresql kubernetes

在使用Kubernetes部署我的Django应用程序的PostgreSQL数据库时,我很困惑。以下是我构建deployment-definition.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 Deployment对象的规范中指定(像我一样)现有的PostgreSQL映像,我该如何实际运行我的应用程序?在settings.py文件中我需要指定什么HOST?

以下是我的settings.py文件现在的样子:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'agent_technologies_db',
        'USER': 'stefan_radonjic',
        'PASSWORD': 'cepajecar995',
        'HOST': 'localhost', 
        'PORT': '',
        }
}

它是以这种方式构建的,因为我仍在设计应用程序,我还不想将它部署到Kubernetes集群。但是当我这样做时,我想要指定的是:HOSTPORT?而且,这是将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,
        }
}

但是我收到以下错误:

enter image description here

2 个答案:

答案 0 :(得分:5)

为了允许与Kubernetes中的PostreSQL部署进行通信,您需要设置Service对象。如果您的Django应用程序与PostgreSQL部署位于同一群集中,那么您将需要ClusterIP类型的服务;否则,如果您的Django应用程序位于群集之外,则需要LoadBalancerNodePort类型的服务。

创建服务有两种方法:

<强> 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-containertier=backend的广告连播。它暴露容器的端口5432。在Django配置中,您可以将服务名称设为HOST:在这种情况下,名称只是postgres。 Kubernetes会将服务名称解析为匹配的pod IP并将流量路由到pod。该端口将是该服务的端口:5432。

kubectl公开

创建服务的另一种方法是通过kubectl expose命令:

kubectl expose deployment/postgres

此命令将默认为ClusterIP类型服务,并公开部署yaml中.spec.containers.ports字段中定义的端口。

更多信息:

https://kubernetes.io/docs/concepts/services-networking/service/

  

而且,这是将PostgreSQL部署到Kubernetes Cluster的正确方法。

这取决于一些变量。您是否计划部署Postgres集群?如果是这样,您可能需要考虑使用StatefulSet

  

StatefulSets对于需要一个或多个的应用程序很有价值   以下。

     
      
  • 稳定,独特的网络标识符。
  •   
  • 稳定,持久的存储。
  •   
  • 有序,优雅的部署和扩展。
  •   
  • 有序,优雅的删除和终止。
  •   
  • 订购,自动滚动更新。
  •   

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#using-statefulsets

你是否有人知道Postgres会配置和维护它?如果没有,我还建议您考虑在群集外部署托管的Postgres服务器(例如RDS)。您仍然可以在群集中部署Django应用程序,并通过ExternalName服务连接到您的数据库。

我建议这样做的原因是管理Kubernetes集群中的有状态应用程序可能具有挑战性。我对Postgres并不熟悉,但这里是关于在Kubernetes上运行Postgres的警示故事:https://gravitational.com/blog/running-postgresql-on-kubernetes/

除此之外,我遇到的一些经验影响了我从群集中删除有状态工作负载的决定:

卡住了

如果您正在使用AWS EBS卷,则卷可能会卡住&#34;如果您的数据库窗格被重新安排到新节点,则在节点上无法分离并重新连接到新节点。

迁移到新群集

如果您需要将工作负载转移到新群集,则必须处理将状态迁移到新群集的额外挑战,同时不会丢失任何数据。如果您将有状态应用程序移到群集之外,那么您可以将整个群集视为牛群,然后将其拆除并迁移到新群集变得更加容易。

更多信息:

关于使用StatefulSets部署Postgres的K8s博文:https://kubernetes.io/blog/2017/02/postgresql-clusters-kubernetes-statefulsets/

答案 1 :(得分:1)

你有2个案例。

1)您的应用程序在kubernetes集群内运行。

您需要通过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

2)您的应用程序在kubernetes集群之外运行。

在这种情况下,您必须提供从外部进入群集内部的方法。或者通过LoadBalancer,或通过Ingress。 在这种情况下,您也必须创建一个服务(参见第1点)。

enter image description here

我用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

my_kube.info(或您选择的任何名称)必须是可解析的(DNS或在/ etc / hosts中写一行)。

如果您需要HA postgres经理,您可以查看:http://stolon.io/