1. 程式人生 > 其它 >k8s部署單節點postgresSQL例項

k8s部署單節點postgresSQL例項

k8s部署單節點postgresSQL例項

參考網站:https://lihaoquan.me/posts/pg-in-k8s/

建立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