首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Kubernetes部署PostgreSQL数据库

使用Kubernetes部署PostgreSQL数据库
EN

Stack Overflow用户
提问于 2018-05-06 03:05:30
回答 2查看 10.5K关注 0票数 4

当涉及到使用Kubernetes部署我的Django应用程序的PostgreSQL数据库时,我感到困惑。下面是我是如何构造部署定义.yml文件的:

代码语言:javascript
复制
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文件现在的样子:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'agent_technologies_db',
        'USER': 'stefan_radonjic',
        'PASSWORD': 'cepajecar995',
        'HOST': 'postgres-service', 
        'PORT': 5432,
        }
}

但是我得到了以下错误:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-06 07:25:38

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

创建服务有两种方式:

YAML

第一种方法是通过一个yaml文件,在您的示例中,该文件如下所示:

代码语言:javascript
复制
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的pods为目标。它暴露了容器的端口5432。在您的Django配置中,您可以将服务的名称作为HOST:在本例中,名称就是postgres。Kubernetes会将服务名称解析为匹配的实例IP,并将流量路由到实例。端口将是服务的端口: 5432。

kubectl暴露

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

代码语言:javascript
复制
kubectl expose deployment/postgres

此命令将缺省设置为ClusterIP类型的服务,并公开在部署YAML域中定义的端口。

更多信息:

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

此外,这是将PostgreSQL部署到Kubernetes集群的正确方式吗?

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

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

  • 稳定、唯一的网络标识符。稳定、持久的storage.
  • Ordered,优雅部署和扩展
  • 有序、优雅的删除和终止。
  • 已订购,自动滚动更新。

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/

票数 9
EN

Stack Overflow用户

发布于 2018-05-06 16:48:47

你有两个箱子。

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

您需要通过service引用postgres pod。

代码语言:javascript
复制
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写了一个例子。

代码语言:javascript
复制
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/

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50193071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档