
本篇只设计Postgres的部署操作,不涉及概念知识。
特别说明:Postgres相对于普通的程序引用比较而言,属于有状态的服务,因为它存储的数据是需要持久保存的,这点决定了我们选择K8S-StatefulSet的部署而非K8S-Deployment。
提前准备
K8S集群,本文使用的是AWS EKS集群服务
一台可以连接K8S集群的服务器,已经安装kubectl和docker等基础应用
K8S资源文件
postgres-namespace.yaml
apiVersion: v1kind: Namespacemetadata:name: postgres
postgres-config.yaml
apiVersion: v1kind: ConfigMapmetadata:name: postgres-confignamespace: postgreslabels:app: postgresdata:POSTGRES_DB: masterPOSTGRES_USER: dbaPOSTGRES_PASSWORD: pg_pass
这里的数据库密码涉及到信息敏感,更建议使用Secret资源而非ConfigMap,这里就偷懒了。
postgres-statefulset.yaml
apiVersion: apps/v1kind: StatefulSetmetadata:name: postgresnamespace: postgresspec:serviceName: "postgres"replicas: 1selector:matchLabels:app: postgrestemplate:metadata:labels:app: postgresspec:containers:- name: postgresimage: postgres:9.5envFrom:- configMapRef:name: postgres-configports:- containerPort: 5432name: postgredbvolumeMounts:- name: postgres-datamountPath: /var/lib/postgresql/datasubPath: postgresvolumeClaimTemplates:- metadata:name: postgres-dataspec:accessModes: ["ReadWriteOnce"]storageClassName: gp2resources:requests:storage: 4Gi
在这个yaml中,可以看到我们使用了之前创建的configmap
并且在文件的底部,我们使用了gp2的storage class帮助我们自动创建存储卷。
statefulset的一个好处是,它将为每个pod创建一个卷,如果其中任何一个pod被删除,那么这个卷将保持不变。
postgres-service.yaml
apiVersion: v1kind: Servicemetadata:name: postgresnamespace: postgreslabels:app: postgresspec:ports:- port: 5432name: postgrestype: LoadBalancerselector:app: postgres
创建Postgres
先创建postgres命令空间
kubectl apply -f postgres-namespace.yaml
再创建其他资源即可
kubectl apply -f postgres-config.yamlkubectl apply -f postgres-statefulset.yamlkubectl apply -f postgres-service.yaml
因为我们是在AWS的EKS集群中创建资源,所以在以上命令执行完成后,我们可以在AWS的Volume中找到我们创建的存储卷。

查看该卷信息,发现它其实已经挂载在集群的一个节点上去了。
验证Postgres
我们使用以下命令查看我们创建的postgres-service
kubectl get pod -n postgreskubectl get svc -n postgres
输出如下,说明我们的postgres已经部署成功

推荐使用DBeaver数据库可视化工具测试连接postgres,使用的host正是输出的EXTERNAL-IP列的信息,而其他连接信息在我们的ConfigMap中。

文章转载自软件学徒,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




