k8s部署單節點postgresSQL例項
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