![](/img/trans.png)
[英]Deploying Django Application with PostgreSQL to Kubernetes Google Cloud cluster
[英]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集群。 但是,當我這樣做時,我應該指定什么: HOST
和PORT
? 而且,這是將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應用位於群集之外,則需要LoadBalancer
或NodePort
類型的服務。
有兩種創建服務的方法:
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-container
和tier=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.