看完本文会得到什么
新建 local-storage.yaml
文件,内容如下:
yamlapiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer
shell$ ssh [email protected]
shell$ [email protected]: mkdir -p /data/volumes/postgres $ [email protected]: chmod 777 /data/volumes/postgres
yamlapiVersion: 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
yamlkind: 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
shell$ helm repo add bitnami https://charts.bitnami.com/bitnami $ helm pull bitnami/postgresql --untar
修改 values.yaml
里面的关键内容:
yamlprimary: service: type: LoadBalancer persistence: existingClaim: "postgres-pvc" storageClass: "local-storage"
执行安装
shell$ helm install postgres ./postgresql
接下来你会看到如下输出
shellNAME: 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
查看 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
配置链接
完成。