本篇只设计Postgres的部署操作,不涉及概念知识。
特别说明:Postgres相对于普通的程序引用比较而言,属于有状态的服务,因为它存储的数据是需要持久保存的,这点决定了我们选择K8S-StatefulSet的部署而非K8S-Deployment。
提前准备
- K8S集群,本文使用的是AWS EKS集群服务
- 一台可以连接K8S集群的服务器,已经安装kubectl和docker等基础应用
K8S资源文件
postgres-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: postgres
postgres-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
namespace: postgres
labels:
app: postgres
data:
POSTGRES_DB: master
POSTGRES_USER: dba
POSTGRES_PASSWORD: pg_pass
这里的数据库密码涉及到信息敏感,更建议使用Secret资源而非ConfigMap,这里就偷懒了。
postgres-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
namespace: postgres
spec:
serviceName: "postgres"
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:9.5
envFrom:
- configMapRef:
name: postgres-config
ports:
- containerPort: 5432
name: postgredb
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
subPath: postgres
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: gp2
resources:
requests:
storage: 4Gi
在这个yaml中,可以看到我们使用了之前创建的configmap
并且在文件的底部,我们使用了gp2的storage class帮助我们自动创建存储卷。
statefulset的一个好处是,它将为每个pod创建一个卷,如果其中任何一个pod被删除,那么这个卷将保持不变。
postgres-service.yaml
apiVersion: v1
kind: Service
metadata:
name: postgres
namespace: postgres
labels:
app: postgres
spec:
ports:
- port: 5432
name: postgres
type: LoadBalancer
selector:
app: postgres
创建Postgres
先创建postgres命令空间
kubectl apply -f postgres-namespace.yaml
再创建其他资源即可
kubectl apply -f postgres-config.yaml
kubectl apply -f postgres-statefulset.yaml
kubectl apply -f postgres-service.yaml
因为我们是在AWS的EKS集群中创建资源,所以在以上命令执行完成后,我们可以在AWS的Volume中找到我们创建的存储卷。
查看该卷信息,发现它其实已经挂载在集群的一个节点上去了。
验证Postgres
我们使用以下命令查看我们创建的postgres-service
kubectl get pod -n postgres
kubectl get svc -n postgres
输出如下,说明我们的postgres已经部署成功
推荐使用DBeaver数据库可视化工具测试连接postgres,使用的host正是输出的EXTERNAL-IP列的信息,而其他连接信息在我们的ConfigMap中。