Kubernetes基于StatefulSet部署Postgres

1 说明

1.1 环境说明

2 部署Postgres单节点服务

2.1 创建部署文件

  • 部署文件:在K8S集群的Master节点中创建一个名称为postgres.yaml的部署文件,该文件的内容如下所示。

    # postgres配置
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: postgres-config-map
    data:
      POSTGRES_PASSWORD: '123456'
    
    ---
    # 数据存储卷
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: nfs-pv-data-postgres
    spec:
      capacity:
        storage: 1Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      storageClassName: slow
      nfs:
        server: nfs.k8s.com
        path: /mnt/nfs/data/postgres
    
    ---
    # postgres容器
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: postgres
    spec:
      replicas: 1
      serviceName: postgres-service
      selector:
        matchLabels:
          app: postgres
      template:
        metadata:
          labels:
            app: postgres
        spec:
          containers:
          - name: postgres
            image: registry.k8s.com/k8s/postgres:11.10
            imagePullPolicy: IfNotPresent
            ports:
            - name: postgres
              containerPort: 5432
              protocol: TCP
            envFrom:
            - configMapRef:
                name: postgres-config-map
            resources:
              requests:
                cpu: 1
                memory: 512Mi
              limits:
                cpu: 1
                memory: 512Mi
            volumeMounts:
            - name: postgres-data
              mountPath: /var/lib/postgresql/data
          imagePullSecrets:
            - name: k8s-auth
      volumeClaimTemplates:
      - metadata:
          name: postgres-data
        spec:
          accessModes: ["ReadWriteOnce"]
          volumeMode: Filesystem
          resources:
            requests:
              storage: 1Gi
          storageClassName: slow
    
    ---
    # 内部访问的无头服务
    apiVersion: v1
    kind: Service
    metadata:
      name: postgres-service
    spec:
      selector:
        app: postgres
      ports:
      - name: postgres
        port: 5432
      clusterIP: None
    
    ---
    # 外部访问的服务
    apiVersion: v1
    kind: Service
    metadata:
      name: postgres-external-service
    spec:
      selector:
        app: postgres
      ports:
      - name: postgres
        protocol: TCP
        port: 5432
        targetPort: 5432
        nodePort: 30002
      type: NodePort
    

2.2 部署文件说明

  • 配置:创建的名称为postgres-config-map的ConfigMap中仅仅指定了Postgres的登录密码为123456,Postgres的登录名称默认为postgres。
  • 存储卷:创建的名称为nfs-pv-data-postgres的PersistentVolume中申明了一个容量为1G,且访问权限为ReadWriteOnce的存储卷,该存储卷对应的目录是域名为nfs.k8s.com这个NFS服务器中的/mnt/nfs/data/postgres目录。
  • 容器:Postgres服务是有状态的,所以需要创建StatefulSet类型的Postgres服务,创建的名称为postgres的容器,把名称为postgres-config-map的配置中的所有配置项都作为环境变量,并把名称为nfs-pv-data-postgres存储卷挂载到容器内部的/var/lib/postgres目录。
  • 服务:创建的名称为postgres-service的Service是一个无头服务,K8S集群内部的其它容器需要通过无头服务才能访问到Postgres服务;创建的名称为postgres-external-service的Service是一个普通服务,该服务把节点的30002端口映射到容器的5432端口,在K8S集群外部访问节点的30002端口即可访问Postgres服务,如果不需要从K8S集群外部访问Postgres服务,则不需要创建该服务。

2.3 执行部署文件

  • 执行部署:在K8S集群的Master节点中,执行以下命令即可使用上述部署文件部署Postgres单节点服务并查看部署的结果,执行结果如下图所示,从部署结果可看,创建的Postgres服务是在K8S集群中的k8s-worker-2节点上。

    # 执行部署
    kubectl apply -f postgres.yaml
    
    # 查看结果
    kubectl get pods -o wide
    

    在这里插入图片描述

2.4 访问Postgres服务

  • 访问服务:由于部署的Postgres服务是在K8S集群中的k8s-worker-2节点上,而该节点的IP地址为192.168.14.105,所以可以在集群外部使用MySQL客户端工具通过IP地址192.168.14.105、端口号30002,用户名postgres,密码123456来访问,本文中使用的是浏览版的Postgres客户端工具pgAdmin来访问,结果如下图所示,可知部署的Postgres服务是正常可访问的。
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值