Kubernetes基于StatefulSet部署Postgres
1 说明
1.1 环境说明
- 集群说明:本文所使用的k8s集群使用Harbor私有镜像仓库,并使用NFS持久化数据,Harbor镜像仓库的搭建过程请参考Kubernetes使用Harbor私有镜像仓库,NFS服务搭建的过程请参考Kubernetes基于Volume存储数据。
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服务是正常可访问的。