EKS-实践二 K8S部署Postgres

4,429 阅读2分钟

本篇只设计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中。