
yaml
# PostgreSQL StatefulSet 配置(开发/测试环境单副本)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres-deployment
labels:
app.kubernetes.io/name: postgres
app.kubernetes.io/instance: postgres-instance
spec:
# StatefulSet 必需:关联无头服务提供固定网络标识
serviceName: postgres-headless
# 单副本部署(生产环境建议≥2副本+主从复制)
replicas: 1
# 标签选择器:匹配Pod模板标签
selector:
matchLabels:
app.kubernetes.io/name: postgres
app.kubernetes.io/instance: postgres-instance
template:
metadata:
labels:
app.kubernetes.io/name: postgres
app.kubernetes.io/instance: postgres-instance
spec:
containers:
- name: postgres
# 指定PostgreSQL 14.12镜像(建议使用官方镜像或可信镜像源)
image: docker.1ms.run/postgres:14.12
imagePullPolicy: IfNotPresent
# 暴露PostgreSQL默认端口
ports:
- containerPort: 5432
name: postgres
protocol: TCP
# 环境变量配置(生产环境需迁移至Secret存储敏感信息)
env:
- name: POSTGRES_PASSWORD
value: "lb781023"
# 数据库初始化参数:UTF-8编码,简化排序规则
- name: POSTGRES_INITDB_ARGS
value: "--encoding=UTF8 --lc-collate=C --lc-ctype=C"
# 时区配置:亚洲/上海(统一集群时区)
- name: TZ
value: "Asia/Shanghai"
# 数据目录挂载配置
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
# 子路径:避免存储目录权限冲突,隔离数据文件
subPath: postgres
# 资源配额:基于工作负载需求合理配置(避免资源过度分配或饥饿)
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1000m
memory: 2Gi
# PVC模板:为每个Pod自动创建专属持久化存储(StatefulSet核心特性)
volumeClaimTemplates:
- metadata:
name: postgres-data
labels:
app.kubernetes.io/name: postgres
app.kubernetes.io/instance: postgres-instance
spec:
# 访问模式:单节点读写(数据库存储标准配置)
accessModes: [ "ReadWriteOnce" ]
# 存储类:使用longhorn分布式存储(确保数据持久化可靠性)
storageClassName: "longhorn"
# 存储资源请求:根据数据量预估配置
resources:
requests:
storage: 10Gi
---
# PostgreSQL 外部访问服务(NodePort类型)
apiVersion: v1
kind: Service
metadata:
name: postgres-service
labels:
app.kubernetes.io/name: postgres
app.kubernetes.io/instance: postgres-instance
spec:
# 关联PostgreSQL Pod标签
selector:
app.kubernetes.io/name: postgres
app.kubernetes.io/instance: postgres-instance
# 服务类型:NodePort(开发/测试环境外部访问常用方式)
type: NodePort
ports:
- name: postgres
# Service集群内部端口(与目标端口一致,简化配置)
port: 5432
# 目标端口:映射至Pod暴露端口
targetPort: 5432
# 节点暴露端口:30000-32767范围内,需确保集群内端口唯一
nodePort: 5432
protocol: TCP
---
# PostgreSQL 无头服务(StatefulSet必需)
apiVersion: v1
kind: Service
metadata:
name: postgres-headless
labels:
app.kubernetes.io/name: postgres
app.kubernetes.io/instance: postgres-instance
spec:
# 无头服务标识:clusterIP=None
clusterIP: None
selector:
app.kubernetes.io/name: postgres
app.kubernetes.io/instance: postgres-instance
ports:
- name: postgres
port: 5432
targetPort: 5432
protocol: TCP