使用Kubernetes部署PostgreSQL数据库

Ste*_*jic 1 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
Run Code Online (Sandbox Code Playgroud)

我不明白的是这个。如果我在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': '',
        }
}
Run Code Online (Sandbox Code Playgroud)

它是通过这种方式构造的,因为我仍在设计应用程序,并且我现在还不想将其部署到Kubernetes集群。但是,当我这样做时,我应该为:HOST和指定什么呢?PORT什么呢?而且,这是将PostgreSQL部署到Kubernetes Cluster的正确方法。

先感谢您!

***问题更新****

按照建议,我创建了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
Run Code Online (Sandbox Code Playgroud)

我已经更新了settings.py文件:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'agent_technologies_db',
        'USER': 'stefan_radonjic',
        'PASSWORD': 'cepajecar995',
        'HOST': 'postgres-service', 
        'PORT': 5432,
        }
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

在此处输入图片说明

ers*_*les 6

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

有两种创建服务的方法:

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
Run Code Online (Sandbox Code Playgroud)

.spec.selector字段定义的目标Service。此服务将定位带有标签app=postgres-container和的广告连播tier=backend。它暴露了容器的端口5432。在Django配置中,您可以将服务的名称设置为HOST:在这种情况下,名称仅为postgres。Kubernetes将服务名称解析为匹配的Pod IP,并将流量路由到Pod。该端口将是服务的端口:5432。

kubectl暴露

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

kubectl expose deployment/postgres
Run Code Online (Sandbox Code Playgroud)

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

更多信息:

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

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

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

StatefulSet对于需要以下一项或多项的应用程序非常有用。

  • 稳定的唯一网络标识符。
  • 稳定,持久的存储。
  • 有序,顺畅的部署和扩展。
  • 有序,优雅地删除和终止。
  • 有序的自动滚动更新。

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/