将Django应用与PostgreSQL部署至GKE集群时遇问题
持久化存储声明
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi # 根据你的需求调整大小
Postgres的内部服务,让Django能访问它
apiVersion: v1
kind: Service
metadata:
name: postgres-service
spec:
selector:
app: postgres
ports:
- protocol: TCP
port: 5432
targetPort: 5432
clusterIP: None # 无头服务,适合数据库这种有状态的应用
#### 第三步:部署Django应用 注意要把数据库地址换成K8s内部的Service名称,还要用环境变量读取Secret里的信息: ```yaml # django-web-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: django-web-deployment spec: replicas: 2 # 多副本提高可用性 selector: matchLabels: app: django-web template: metadata: labels: app: django-web spec: containers: - name: django-web image: gcr.io/[你的GCP项目ID]/agent-tech-web:v1 # 替换成你刚才推送的镜像地址 env: - name: DB_HOST value: postgres-service # K8s内部可以直接通过Service名访问 - name: DB_NAME valueFrom: secretKeyRef: name: postgres-secrets key: postgres-db - name: DB_USER valueFrom: secretKeyRef: name: postgres-secrets key: postgres-user - name: DB_PASSWORD valueFrom: secretKeyRef: name: postgres-secrets key: postgres-password ports: - containerPort: 8000 command: ["python", "manage.py", "runserver", "0.0.0.0:8000"] --- # Django的外部服务,让你能从公网访问 apiVersion: v1 kind: Service metadata: name: django-web-service spec: type: LoadBalancer # GKE会自动分配一个外部IP selector: app: django-web ports: - protocol: TCP port: 80 targetPort: 8000
3. 把配置部署到GKE集群
先确保你已经切换到GKE的集群上下文:
gcloud container clusters get-credentials [你的集群名称] --zone [你的集群所在区域]
然后依次部署:
- 创建Secret:
kubectl apply -f postgres-secrets.yaml - 部署Postgres:
kubectl apply -f postgres-deployment.yaml - 部署Django:
kubectl apply -f django-web-deployment.yaml
4. 检查部署状态
- 看Pod是否正常运行:
kubectl get pods - 看Service的外部IP:
kubectl get services django-web-service
等外部IP出来后,直接访问这个IP就能看到你的Django应用了!
几个关键注意事项
- 你的Django
settings.py必须用环境变量配置数据库:import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.getenv('DB_NAME'), 'USER': os.getenv('DB_USER'), 'PASSWORD': os.getenv('DB_PASSWORD'), 'HOST': os.getenv('DB_HOST'), 'PORT': 5432, } } - 生产环境绝对不能用
runserver,要换成Gunicorn或者uWSGI,搭配Nginx反向代理,不过先搞定基础部署再优化也没问题。 - 记得给Django做迁移!可以用
kubectl exec进入Pod执行:kubectl exec -it [django-pod-name] -- python manage.py migrate
内容的提问来源于stack exchange,提问作者Stefan Radonjic
相关产品推荐
相关产品推荐

