gpt4 book ai didi

django - 使用PostgreSQL将Django应用程序部署到Kubernetes Google Cloud集群

转载 作者:行者123 更新时间:2023-11-29 12:35:17 25 4
gpt4 key购买 nike

我在尝试将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

除了上面已经问过的问题之外,我还想问一下我在做对吗?如果没有,我该怎么做才能解决此问题。

最佳答案

Inside container list of dictionaries, I know that my container name should be web, but I am not sure where the image of that container is located so I do not know what should i specify as container image.


  • 容器的名称在容器中是本地的(您可以有多个容器共享同一容器)。容器名称(在您的情况下为Web)是针对在部署下给出的文件的:
    # setting name of first container within pod to web
    spec:
    containers:
    - name: web
  • 容器的镜像必须位于某些可用的Docker容器注册表中。托管自己的Docker注册表可以使用多种选项,以使用公开可用的选项。无论如何,您都必须能够将构建阶段推送到该Docker容器注册表(亚马逊ECR,Docker,Gitlab,自托管...),并从kubernetes中从该注册表中提取信息(安全设置,提取 secret )等等...)。在docker-compose文件中,使用两个容器。对于db,您使用公共(public)postgres镜像,对于Web,您使用构建命令,并且镜像仅存储到该主机上的本地docker注册表中(您必须将其推送到公共(public)存储库中,以便k8s能够在部署期间从中取出)。

  • I do not understand what volumeMounts and volumes are for, and if i even specified them correctly.


  • 简而言之,卷用于将卷附加到容器。根据您的用例和确定的体系结构,有几种方法可以实现卷,但总而言之,它们可以归结为短暂的,持续的和持久的。临时性将在容器终止或重新启动时丢失,常量(例如来自configMaps的常量)用于将配置文件传递到容器,而持久性对于有状态应用程序(数据库等)最为有趣。您可以通过几种方式指定卷,所有卷都必须具有名称(由volumeMount引用)以及直接卷规范或卷声明规范(建议使用持久卷,因为您可以从这种自动配置中受益)。
  • VolumeMounts用于定义预定义卷应在容器文件系统上的何处挂载。它们按名称引用要挂载的卷,通过mountPath在容器文件系统上提供挂载点,并且在某些情况下可以具有特定文件的子路径。
  • 在您的示例中,您将获得的持久卷声明所获得的卷绑定(bind)到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与节点选择器(或更好的是具有亲和力)选择器绑定(bind)在一起。出于性能考虑,建议运行本地文件系统的数据库卷,但是软管 pods 失去了易于重新安排的功能。另一种方法是拥有一些真正持久的卷,可以独立于节点安装(例如Amazon EBS),并且它们需要使用不同的PVC(或使用预配器)。

  • Besides the questions I have already asked above, I also want to ask am I doing this right? If not, what can I do to fix this.


  • 如上所述,定义存储类,或者将db pod锁定到特定节点,或者应用某种动态预配置,以便卷将遵循pod在nod上的位置。
  • 优先选择:不要将所有内容都放在默认 namespace 中,请使用单独的 namespace 来处理k8s list ,稍后移动所有内容将更加困难,并且更难以意外删除错误的东西。
  • 也是个人喜好:数据库是有状态的应用程序,因此建议使用Statefulset而不是部署。
  • 当您从docker-compose文件开始并想要转换为kubernetes list 时,有一些工具可以帮助您,值得检查。
  • kubernetes上的文档有些过时了,但是还不错,在那里您可以对volume和volumeClaims进行一些很好的阅读,还有活跃的松弛通道。
  • 哦,在此处发布文件时模拟用户/密码,我们现在知道关于cepa ...
  • 最后,您做得很棒!
  • 关于django - 使用PostgreSQL将Django应用程序部署到Kubernetes Google Cloud集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50145109/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com