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

目录

选择用 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
$ ssh root@192.168.137.101
shell
$ root@kube-worker-1: mkdir -p /data/volumes/postgres $ root@kube-worker-1: 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

完成。