2022-11-15Kubernetes0
请注意,本文编写于 194 天前,最后修改于 192 天前,其中某些信息可能已经过时。

目录

选择用 postgress 作为实例,因为它需要一个持久化存储来运行
1.创建 local storage class
2.在某一个 worker node 上创建一个文件夹
3.创建一个 PersistentVolume 关联刚才的 worker node 和对应的文件夹
4.创建一个 PersistentVolumeClaim 关联刚才的 PersistentVolume
使用 helm 拉取 postgress 到本地
修改配置文件
安装 postgres
校验 postgres 成功运行
使用客户端链接到数据库

看完本文会得到什么

  1. 为集群创建第一个 local storage class
  2. 创建一对 PersistentVolumeClaim 和 PersistentVolume 进行关联
  3. 搭配 PersistentVolumeClaim 使用 helm 安装 postgres

选择用 postgress 作为实例,因为它需要一个持久化存储来运行

1.创建 local storage class

新建 local-storage.yaml 文件,内容如下:

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

2.在某一个 worker node 上创建一个文件夹

shell
$ [email protected]: mkdir -p /data/volumes/postgres
$ [email protected]: chmod 777 /data/volumes/postgres

3.创建一个 PersistentVolume 关联刚才的 worker node 和对应的文件夹

yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres-local-pv
spec:
  capacity:
    storage: 8Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /data/volumes/postgres
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - kube-worker-1

4.创建一个 PersistentVolumeClaim 关联刚才的 PersistentVolume

yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgres-pvc
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 8Gi

以上 4 个步骤执行完毕之后,需要查看 postgres-local-pv 是否处于 Available 状态

shell
$ kubectl get persistentvolumes
NAME                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS    REASON   AGE
postgres-local-pv   8Gi        RWO            Retain           Available           local-storage            4m3s

另外 postgres-pvc 应该是处于 pending 状态,因为它并没有被任意一个 pod 去使用

shell
$ kubectl get persistentvolumeclaims
NAME           STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS    AGE
postgres-pvc   Pending                                      local-storage   5m44s

接下来,我们需要启动一个 postgres 实例,让他去使用我们刚才创建的 postgres-pvc

使用 helm 拉取 postgress 到本地

shell
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm pull bitnami/postgresql --untar

修改配置文件

修改 values.yaml 里面的关键内容:

yaml
primary:
  service:
    type: LoadBalancer
  persistence:
    existingClaim: "postgres-pvc"
    storageClass: "local-storage"

安装 postgres

执行安装

shell
$ helm install postgres ./postgresql

接下来你会看到如下输出

shell
NAME: postgres
LAST DEPLOYED: Thu Nov 17 05:49:43 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: postgresql
CHART VERSION: 12.1.2
APP VERSION: 15.1.0

** Please be patient while the chart is being deployed **

PostgreSQL can be accessed via port 5432 on the following DNS names from within your cluster:

    postgres-postgresql.default.svc.cluster.local - Read/Write connection

To get the password for "postgres" run:

    export POSTGRES_PASSWORD=$(kubectl get secret --namespace default postgres-postgresql -o jsonpath="{.data.postgres-password}" | base64 -d)

To connect to your database run the following command:

    kubectl run postgres-postgresql-client --rm --tty -i --restart='Never' --namespace default --image docker.io/bitnami/postgresql:15.1.0-debian-11-r0 --env="PGPASSWORD=$POSTGRES_PASSWORD" \
      --command -- psql --host postgres-postgresql -U postgres -d postgres -p 5432

    > NOTE: If you access the container using bash, make sure that you execute "/opt/bitnami/scripts/postgresql/entrypoint.sh /bin/bash" in order to avoid the error "psql: local user with ID 1001} does not exist"

To connect to your database from outside the cluster execute the following commands:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace default -w postgres-postgresql'

    export SERVICE_IP=$(kubectl get svc --namespace default postgres-postgresql --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")
    PGPASSWORD="$POSTGRES_PASSWORD" psql --host $SERVICE_IP --port 5432 -U postgres -d postgres

校验 postgres 成功运行

查看 pod 是否成功启动:

shell
$ kubectl get pod postgres-postgresql-0 
NAME                    READY   STATUS    RESTARTS   AGE
postgres-postgresql-0   1/1     Running   0          2m52s

重新查看

shell
$ kubectl get persistentvolumeclaims
NAME           STATUS   VOLUME              CAPACITY   ACCESS MODES   STORAGECLASS    AGE
postgres-pvc   Bound    postgres-local-pv   8Gi        RWO            local-storage   12m

此时它已经处于 Bound 状态,就说明它已经成功挂在到 pod 上了。

使用客户端链接到数据库

首先下载并且安装 DBeaver -> https://dbeaver.io/

然后执行如下命令获取 LoadBalancer 给 postgres 分配的 IP

shell
$ kubectl get svc postgres-postgresql
NAME                  TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)          AGE
postgres-postgresql   LoadBalancer   10.100.241.128   192.168.137.121   5432:30356/TCP   34m

通过命令行获取安装 postgres 时系统随机生成的链接字符串密码

shell
$ kubectl get secret --namespace default postgres-postgresql -o jsonpath="{.data.postgres-password}" | base64 -d
$ 2rPcHK0DOE

配置链接

image.png

完成。