簡體   English   中英

使用Kubernetes部署PostgreSQL數據庫

[英]Deploying PostgreSQL database with 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 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

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

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

但是我收到以下錯誤:

在此處輸入圖片說明

為了允許與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 pod。 它暴露了容器的端口5432。 在Django配置中,您將服務的名稱作為HOST :在這種情況下,名稱就是postgres Kubernetes將服務名稱解析為匹配的Pod IP,並將流量路由到Pod。 該端口將是服務的端口:5432。

kubectl暴露

創建服務的另一種方法是通過kubectl expose命令:

kubectl expose deployment/postgres

該命令將默認為ClusterIP類型服務,並公開Deployment yaml的.spec.containers.ports字段中定義的端口。

更多信息:

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/

你有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時編寫postgres。

2)您的應用程序在kubernetes集群之外運行。

在這種情況下,您必須提供一種從外部進入集群內部的方法。 或通過LoadBalancer或通過Ingress。 在這種情況下,您也必須創建一個服務(請參見第1點)。

在此處輸入圖片說明

我用入口寫一個例子。

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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM