如何在Kubernetes中運(yùn)行數(shù)據(jù)庫(kù)?
譯文譯者 | 布加迪
審校 | 重樓
關(guān)于Kubernetes中數(shù)據(jù)庫(kù)應(yīng)該在哪里運(yùn)行的爭(zhēng)論一直是技術(shù)界的熱門話題。流行的觀點(diǎn)是“構(gòu)建無(wú)狀態(tài)應(yīng)用程序”,這表明數(shù)據(jù)庫(kù)最適合使用云提供商的托管服務(wù)。然而,在Kubernetes中成功地運(yùn)行數(shù)據(jù)庫(kù)有一些實(shí)用的設(shè)計(jì)模式。
在大多數(shù)云提供商中,卷被限制在單個(gè)可用區(qū),這意味著數(shù)據(jù)庫(kù)在設(shè)計(jì)上也被限制在這個(gè)可用區(qū)。大多數(shù)生產(chǎn)集群可能是區(qū)域性或多可用區(qū),對(duì)于無(wú)狀態(tài)應(yīng)用程序而言更是如此。使用節(jié)點(diǎn)選擇器確保數(shù)據(jù)庫(kù)pod位于可用區(qū)(它們的卷可以掛載)很重要。
例子:
nodeSelector:
topology.kubernetes.io/zone: europe-west6-b
該配置指定數(shù)據(jù)庫(kù)pod應(yīng)該在' europe-west6-b ' 可用區(qū)中運(yùn)行。
規(guī)劃資源使用情況
由于我們的數(shù)據(jù)庫(kù)被限制在一個(gè)可用區(qū)中,我們必須仔細(xì)規(guī)劃節(jié)點(diǎn)到可用區(qū)的設(shè)計(jì),以避免調(diào)度錯(cuò)誤和不可用問(wèn)題。一種有效的策略是針對(duì)數(shù)據(jù)庫(kù)工作負(fù)載運(yùn)行單獨(dú)的節(jié)點(diǎn)組或節(jié)點(diǎn)池。這可以確保所需的可用區(qū)始終有足夠的資源可用。
例子:
- 為數(shù)據(jù)庫(kù)工作負(fù)載創(chuàng)建專用節(jié)點(diǎn)池。
- 使用污點(diǎn)和容差來(lái)確保在這些節(jié)點(diǎn)上只調(diào)度數(shù)據(jù)庫(kù)pod。
# Taint nodes to be dedicated to databases
spec:
taints:
- key: "dedicated"
value: "database"
effect: "NoSchedule"
# Toleration in the DB pod spec
spec:
tolerations:
- key: "dedicated"
operator: "Equal"
value: "database"
effect: "NoSchedule"
高可用性
托管數(shù)據(jù)庫(kù)服務(wù)通常提供內(nèi)置的高可用性和故障切換功能。為了在Kubernetes中實(shí)現(xiàn)類似的彈性,對(duì)恢復(fù)和可用性策略進(jìn)行細(xì)致的規(guī)劃必不可少。這里有兩種方法:
1.使用Kubernetes操作符
Zalando Postgres Operator這樣的Kubernetes操作符提供了高級(jí)功能,比如讀取副本和自動(dòng)故障切換,類似托管數(shù)據(jù)庫(kù)服務(wù)。這些操作符可以顯著簡(jiǎn)化數(shù)據(jù)庫(kù)高可用性的設(shè)置和管理。
Zalando Postgres Operator允許你指定讀取副本的數(shù)量,并自動(dòng)管理故障切換。該操作符提供了一個(gè)UI,你可以在其中配置這些設(shè)置,使其成為Kubernetes中管理數(shù)據(jù)庫(kù)高可用性的一種直觀而強(qiáng)大的工具。下面列出了其他一些操作符,其中一些由各自的社區(qū)管理:https://operatorhub.io/?category=Database。
2.自助服務(wù)方法
對(duì)于那些喜歡動(dòng)手操作的人而言,特別是針對(duì)NoSQL數(shù)據(jù)庫(kù),這里有一個(gè)循序漸進(jìn)的方法:
- 兩個(gè)pod上掛載數(shù)據(jù)卷:確保數(shù)據(jù)卷被主pod和從pod都可以訪問(wèn)。
- pod親緣性:使用pod親緣性規(guī)則來(lái)確保主pod和從pod放在一起,同時(shí)尊重卷約束。
- Init容器:在啟動(dòng)時(shí),使用從pod中的Init容器從主pod拷貝所有數(shù)據(jù)。
- 卷掛載約束:將從pod上的卷掛載設(shè)置為只讀,以防止數(shù)據(jù)損壞。
- 使用計(jì)劃任務(wù)(cronjob)進(jìn)行重啟:創(chuàng)建一個(gè)簡(jiǎn)單的計(jì)劃任務(wù),每六個(gè)小時(shí)刪除舊的pod,允許init容器運(yùn)行并拷貝新數(shù)據(jù)。
示例配置
下面的例子展示了如何使用pod親緣性關(guān)聯(lián)設(shè)置Neo4j讀取副本、用于數(shù)據(jù)拷貝的init容器以及掛載存在只讀約束的卷以確保數(shù)據(jù)完整性。
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- primary-db
topologyKey: "kubernetes.io/hostname"
initContainers:
- name: copy-data
image: busybox
command: ["sh", "-c", "cp -r /data/* /backup/"]
volumeMounts:
- name: data-volume
mountPath: /data
- name: backup-volume
mountPath: /backup
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: primary-db-pvc
- name: backup-volume
persistentVolumeClaim:
claimName: secondary-db-pvc
containers:
- name: secondary-db
image: neo4j:latest
volumeMounts:
- name: backup-volume
mountPath: /data
readOnly: true
備份和恢復(fù)
許多服務(wù)提供商提供了在基于磁盤的卷上調(diào)度重復(fù)快照的方法。這通常是首選的方法,因?yàn)樗菀自O(shè)置,并且恢復(fù)過(guò)程更快。在這種情況下,我們可以定期備份托管數(shù)據(jù)庫(kù)數(shù)據(jù)的卷。
另一種方法是結(jié)合數(shù)據(jù)庫(kù)的專有工具,比如PostgreSQL的pg_dump。
下面是一個(gè)使用Kubernetes計(jì)劃任務(wù)將PostgreSQL配置備份到s3的示例:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: postgres-backup
spec:
schedule: "0 0 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: postgres
command: ["sh", "-c", "pg_dumpall -c -U $PGUSER | gzip > /backup/db_backup.gz && aws s3 cp /backup/db_backup.gz s3://your-bucket/db-backup-$(date +\%F).gz"]
volumeMounts:
- name: backup-volume
mountPath: /backup
restartPolicy: OnFailure
volumes:
- name: backup-volume
emptyDir: {}
結(jié)語(yǔ)
盡管初始設(shè)置或?qū)W習(xí)曲線可能很陡峭,但在Kubernetes中運(yùn)行數(shù)據(jù)庫(kù)具有很多優(yōu)勢(shì)。一個(gè)不太被提及的好處是成本。在RDS中運(yùn)行db.m4.2xlarge(4vCPU和32GB內(nèi)存)實(shí)例的成本大約是1200美元/月,而運(yùn)行一個(gè)類似大小的EC2實(shí)例的成本大約是150美元/月。Kubernetes中的節(jié)點(diǎn)還可能運(yùn)行多個(gè)pod,從而進(jìn)一步優(yōu)化資源使用。
與廠商無(wú)關(guān)是促使許多人在Kubernetes中運(yùn)行數(shù)據(jù)庫(kù)的另一個(gè)主要動(dòng)機(jī)。以最小的調(diào)整在任何平臺(tái)上移動(dòng)工作負(fù)載極具吸引力。
總之,在決定在何處運(yùn)行生產(chǎn)數(shù)據(jù)庫(kù)之前,請(qǐng)考慮利弊。許多人成功地在Kubernetes中運(yùn)行數(shù)據(jù)庫(kù),這類部署的數(shù)量在與日俱增。
原文標(biāo)題:How To Run Databases in Kubernetes,作者:Kolawole Olowoporoku