k8s部署单节点postgresSQL实例
创建PV
这个步骤里我们编写第一份配置声明:pg-pv.yaml
下面是主要例子,这里我们创建一个名字为 postgresql-pv的持久化卷,并使用hostpath
作为pv的持久化类型,你也可以根据需要配置为gce或nfs等。作为测试的例子,我们先配置一个10G的大小。
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgresql-pv
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data/svr/pgdb"
然后通过kubectl执行创建命令
kubectl create -f pg-pv.yaml
创建PVC
接下来,我们再创建pvc配置– pg-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgresql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
执行创建命令
kubectl create -f pg-pvc.yaml
到了这里,我们可以从环境中检查刚刚创建的资源情况:
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
postgresql-pv 10Gi RWO Retain Bound default/postgresql-pv-claim manual 55s
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
postgresql-pv-claim Bound postgresql-pv 10Gi RWO manual 54s
从上面的环境信息输出可以看到,postgresql-pv 的状态已经处于 Bound,这表明我们的pv已经我pvc绑定成功。
创建 Deployment
我们可以通过 Kubernetes Deployment 的方式来创建一个有状态服务,然后使用PVC(PersistentVolumeClaim)来连接已经存在的PV。
下面我们通过编写Deployment 的YAML文件描述了一个运行PostgreSQL并使用PVC的Deployment。文件定义了一个mount到/var/lib/postgresql/data的卷(因为官方Pg容器initdb的时候数据会创建在此)
注意:密码定义在YAML配置文件中,这是不安全的,建议使用ConfigMap的方式,这里只是方便测试,所以就直接定义在配置文件中。
pg-deployment.yaml 配置如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgresql-deployment
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: postgresql
template:
metadata:
labels:
app: postgresql
spec:
containers:
- image: postgres:12.1
name: postgresql
env:
- name: POSTGRES_PASSWORD
value: pgsql@123
ports:
- containerPort: 5432
name: postgresql
volumeMounts:
- name: postgresql-persistent-storage
mountPath: /var/lib/postgresql/data
volumes:
- name: postgresql-persistent-storage
persistentVolumeClaim:
claimName: postgresql-pv-claim
通过kubectl创建Deployment
$ kubectl create -f pg-deployment.yaml
$ kubectl get service -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d8h <none>
postgresql-client-service NodePort 10.96.236.217 <none> 5432:30432/TCP 95s app=postgresql
此时,我们目标的pod也会被创建
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
postgresql-deployment-ddd9bd967-7f52q 1/1 Running 0 59m
创建Service
为了能正常访问deployment或者容器,我们还需要暴露一个Servive。
Kubernetes提供了不同的Service访问类型,如:ClusterIP、NodePort、LoadBlancer、NodePort。
本例子,我们利用NodePort暴露一个服务端口,用于外部服务能正常访问我们的数据库。
pg-service.yaml定义如下,我们定义nodePort为30432,这样集群里外的服务都能使用这个端口进行访问
apiVersion: v1
kind: Service
metadata:
name: postgresql-client-service
labels:
app: postgresql
spec:
type: NodePort
ports:
- port: 5432
targetPort: 5432
nodePort: 30432
protocol: TCP
selector:
app: postgresql
接下来,就可以创建Service了:
$ kubectl apply -f pg-service.yaml
$ kubectl get service -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d9h <none>
postgresql-client-service NodePort 10.96.236.217 <none> 5432:30432/TCP 58m app=postgresql
连接数据库
这里我们使用psql客户端进行测试连接
集群内
$ psql -U postgres -h 10.96.236.217 -p 5432
# 或
$ psql -U postgres -h localhost -p 30432
本文作者:海中明月
本文链接:https://www.cnblogs.com/Clera-tea/p/16259264.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步