暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

EKS-实践二 K8S部署Postgres

软件学徒 2020-03-17
167

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


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

                评论