簡體   English   中英

使用PostgreSQL將Django應用程序部署到Kubernetes Google Cloud集群

[英]Deploying Django Application with PostgreSQL to Kubernetes Google Cloud cluster

我在嘗試將Django應用程序和PostgreSQL數據庫部署到已經配置的Kubernetes Google Cloud集群時遇到麻煩。

我已經為Django應用程序和PostgreSQL數據庫成功創建了Docker容器。 這是我的docker-compose.yml文件的樣子:

version: '3'

services:
  db:
    image: postgres
    environment:
      - POSTGRES_USER=stefan_radonjic
      - POSTGRES_PASSWORD=cepajecar995
      - POSTGRES_DB=agent_technologies_db
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000 --settings=agents.config.docker-settings
    volumes: 
      - .:/agent-technologies
    ports: 
      - "8000:8000"
    links:
      - db
    depends_on:
      - db

我已經構建了映像,並嘗試了sudo docker-compose up命令,該應用程序運行正常。

在成功地對Django Application和PostgreSQL進行docker化之后,我嘗試配置Kubernetes所需的Deployment / Service YML文件,但是這樣做很麻煩。 例如:

deployment-definition.yml-用於部署Django應用程序的文件:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: agent-technologies-deployment
      labels:
        app: agent-technologies
        tier: backend
    spec:
      template:
        metadata:
          name: agent-technologies-pod
          labels:
            app: agent-technologies
            tier: backend
        spec:
          containers:
            - name: 
              image:
              ports:
                - containerPort: 8000
        replicas:
        selector:
          matchLabels:
            tier: backend

在字典的容器列表中,我知道我的容器名稱應該是web ,但是我不確定該容器的圖像位於何處,所以我不知道我應該指定什么作為容器圖像。

另一個問題在於postgres / deployment-definition.yml:

apiVersion: apps/v1
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

我不明白什么是volumeMountsvolumes ,以及是否正確指定了它們。

這是我的secret-definition.yml文件:

apiVersion: v1
kind: Secret
metadata:
  name: postgres-credentials
type: Opaque
data:
  user: stefan_radonjic
  passowrd: cepajecar995

我的postgres / service-definition.yml文件:

apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  selector:
    app: postgres-container
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432

我的postgres / volume-definition.yml文件:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres-pv
  labels:
    type: local
spec:
  capacity:
    storage: 2Gi
  storageClassName: standard
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /data/postgres-pv

還有我的postgres / volume-claim-definitono.yml文件:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres-pv
  labels:
    type: local
spec:
  capacity:
    storage: 2Gi
  storageClassName: standard
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /data/postgres-pv

最后但並非最不重要的一點是,我的service-definition.yml文件-適用於Django應用程序

apiVersion: v1
kind: Service
metadata:
  name: agent-technologies-service
spec:
  selector:
    app: agent-technologies
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000
  type: NodePort

除了上面已經問過的問題之外,我還想問一下我在做這個對嗎? 如果沒有,我該怎么做才能解決此問題。

在字典的容器列表中,我知道我的容器名稱應該是web,但是我不確定該容器的圖像位於何處,所以我不知道我應該指定什么作為容器圖像。

  • 容器的名稱是容器的本地名稱(您可以有多個容器共享同一容器)。 容器名稱(在您的情況下為Web)是針對在部署下給出的文件的:

     # setting name of first container within pod to web spec: containers: - name: web 
  • 容器的映像必須位於某些可用的Docker容器注冊表中。 托管自己的Docker注冊表可以使用多個選項,以使用公開可用的選項。 無論如何,您都必須能夠將構建階段推送到該Docker容器注冊表(亞馬遜ECR,Docker,Gitlab,自托管...)並從kubernetes中從該注冊表中提取信息(安全設置,提取秘密)等等...)。 在docker-compose文件中,您使用兩個容器。 對於db,您使用公共postgres映像;對於Web,您使用構建命令,並且映像僅存儲到該主機上的本地docker注冊表中(您必須將其推送到公共存儲庫中,以便k8s能夠在部署期間從中取出)。

我不明白什么是volumeMount和卷,以及是否正確指定了它們。

  • 簡而言之,卷用於將卷附加到容器。 根據您的用例和確定的體系結構,有幾種卷處理方法,但是總而言之,它們可以歸結為短暫的,持續的和持久的。 臨時性將在容器終止或重新啟動時丟失,常量(例如來自configMaps的常量)用於將配置文件傳遞到容器,而持久性對於有狀態應用程序(數據庫等)最為有趣。 您可以通過幾種方式指定卷,所有卷都必須具有名稱(由volumeMount引用)以及直接卷規范或卷聲明規范(建議使用持久卷,因為您可以從這種自動配置中受益)。
  • VolumeMounts用於定義預定義卷應在容器文件系統上的何處安裝。 它們按名稱引用要掛載的卷,通過mountPath在容器文件系統上提供掛載點,並且在某些情況下可以具有特定文件的子路徑。
  • 在您的示例中,您將獲得的永久卷聲明綁定到postgres的數據路徑(/ var / lib / postgresql / data)。 盡管您使用未指定的存儲類,但有趣的是,您的Persistent卷被定義為主機上的localpath。 這意味着,在啟動了該數據庫容器的每個節點上,最終將指向該容器的db容器的/ var / lib / postgresql / data到該特定節點上的/ data / postgres-pv。 這使您面臨以下問題:假設您有3個節點(A,B和C),並且數據庫Pod在A上啟動,使用A的/ data / postgres-pv文件夾作為自己的/ var / lib / postrgresql / data。 然后重新啟動它,它終止並重新安排到節點B。突然,它使用了B的/ data / postgres-pv本地文件夾(空),最后得到的是空數據庫。 如果將主機的本地文件系統用於持久性,則需要將此類Pod與節點選擇器(或更好的是具有親和力)選擇器綁定在一起。 出於性能考慮,建議運行本地文件系統的數據庫卷,但是軟管吊艙失去了易於重新安排的功能。 另一種方法是擁有一些真正持久的卷,這些卷可以獨立於節點(例如Amazon EBS)安裝,並且它們需要不同的PVC(或使用預配器)。

除了上面已經問過的問題之外,我還想問一下我在做這個對嗎? 如果沒有,我該怎么做才能解決此問題。

  • 如上所述,定義存儲類,或者將db pod鎖定到特定節點,或者應用某種動態配置,以便卷將遵循pod在nod上的放置。
  • 優先選擇:不要將所有內容放置在默認名稱空間中,使用單獨的名稱空間來處理k8s清單,稍后移動所有內容將更加困難,並且意外刪除錯誤的東西也將更加困難...
  • 還有個人喜好:數據庫是有狀態的應用程序,因此建議使用statefulset而不是部署。
  • 當您從docker-compose文件開始並且想要轉換為kubernetes清單時,有一些工具可以幫助您,值得檢查。
  • kubernetes的文檔有些過時了,但是還不錯,您可以在其中閱讀有關volume和volumeClaims的內容,還有一個活躍的松弛通道。
  • 哦,在此處發布文件時模擬用戶/密碼,我們現在知道關於cepa ...
  • 最后,您做得很好!

暫無
暫無

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

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