PostgreSQL: 쿠버네티스용 PostgreSQL 오퍼레이터 및 Prometheus 모니터링



그래서 Druid를 출시했습니다. Apache Druid: Overview, Running in Kubernetes, and Monitoring with Prometheus을 참조하십시오. 지금까지 로컬Apache Derby 데이터베이스가 기본값storage for metadata으로 사용되었습니다.

다음으로 Druid를 PostgreSQL로 전환하고 나중에 클러스터 설정에서 ZooKeeper를 제거합니다.

먼저 Kubernetes에서 PostgreSQL 클러스터를 시작하고 Prometheus용 PostgreSQL Exporter을 추가하고 메트릭 수집을 구성합니다.

Minikube에서 다시 시작하고 PostgreSQL의 경우 Zalando Operator을 사용하고 PostgreSQL Exportersidecar container으로 추가합니다.

매우 흥미롭지 만 아직 Operator에 대해 깊이 파고 들지는 않을 것이므로 어떻게 든 플레이 할 것입니다. 지금은 모니터링만 하면 됩니다.

설명서 — Administrator Guide .

PostgreSQL 연산자 시작



네임스페이스를 만듭니다.

$ kubectl create ns postgres-operator
namespace/postgres-operator created


Helm 리포지토리를 추가합니다.

$ helm repo add postgres-operator-charts [https://opensource.zalando.com/postgres-operator/charts/postgres-operator](https://opensource.zalando.com/postgres-operator/charts/postgres-operator)


운영자 자체를 설치하십시오.

$ helm -n postgres-operator install postgres-operator postgres-operator-charts/postgres-operator


필요한 경우 운영자를 위한 WebUI를 추가합니다.

$ helm repo add postgres-operator-ui-charts [https://opensource.zalando.com/postgres-operator/charts/postgres-operator-ui](https://opensource.zalando.com/postgres-operator/charts/postgres-operator-ui)

$ helm -n postgres-operator install postgres-operator-ui postgres-operator-ui-charts/postgres-operator-ui


포드 확인:

$ kubectl -n postgres-operator get pods
NAME READY STATUS RESTARTS AGE
postgres-operator-649799f4bd-dz5bl 1/1 Running 0 82s
postgres-operator-ui-5cfff55c65-v4bjj 1/1 Running 0 22s


운영자의 웹 인터페이스 서비스에 대한 액세스를 제공하십시오.

$ kubectl port-forward svc/postgres-operator-ui 8081:80
Forwarding from 127.0.0.1:8081 -> 8081
Forwarding from [::1]:8081 -> 8081


확인해 봐:



여기서는 아무 작업도 수행하지 않고 미리 만들어진 클러스터 구성 예제를 살펴보겠습니다.

PostgreSQL 클러스터 시작



Operator 저장소 복제:

$ git clone [https://github.com/zalando/postgres-operator.git](https://github.com/zalando/postgres-operator.git)
cd postgres-operator/

manifests 카탈로그에는 몇 가지 예가 있습니다. manifests/minimal-master-replica-svcmonitor.yaml 파일을 살펴보겠습니다. 이 파일은 네임스페이스, 클러스터, 사용자, 데이터베이스, 2개의 서비스 및 Prometheus 내보내기가 포함된 2개의 ServiceMonitor + 사이드카를 설명합니다.

그것을 적용하십시오:

$ kubectl apply -f manifests/minimal-master-replica-svcmonitor.yaml
namespace/test-pg created
postgresql.acid.zalan.do/acid-minimal-cluster created
service/acid-minimal-cluster-svc-metrics-master created
service/acid-minimal-cluster-svc-metrics-replica created
servicemonitor.monitoring.coreos.com/acid-minimal-cluster-svcm-master created
servicemonitor.monitoring.coreos.com/acid-minimal-cluster-svcm-replica created


클러스터를 확인합니다.

$ kubectl -n test-pg get postgresql
NAME TEAM VERSION PODS VOLUME CPU-REQUEST MEMORY-REQUEST AGE STATUS
acid-minimal-cluster acid 13 2 1Gi 2m21s Running


포드:

$ kubectl -n test-pg get po
NAME READY STATUS RESTARTS AGE
acid-minimal-cluster-0 2/2 Running 0 37s
acid-minimal-cluster-1 1/2 Running 0 24s


각 역할에는 spilo-role=master 또는 spilo-role=replica 레이블에 설정된 고유한 역할이 있습니다.

PostgreSQL 사용자



문서 here>>>here>>>을 참조하십시오.

사용자는 — surprise — users 블록에 설명되어 있습니다.

$ kubectl -n test-pg get postgresql -o yaml
…
users:
foo_user: []
zalando:
- superuser
- createdb
…


그리고 Operator는 각각에 대한 전용 Kubernetes 시크릿을 생성합니다.

$ kubectl -n test-pg get secret
NAME TYPE DATA AGE
foo-user.acid-minimal-cluster.credentials.postgresql.acid.zalan.do Opaque 2 38m
postgres.acid-minimal-cluster.credentials.postgresql.acid.zalan.do Opaque 2 38m
standby.acid-minimal-cluster.credentials.postgresql.acid.zalan.do Opaque 2 38m
zalando.acid-minimal-cluster.credentials.postgresql.acid.zalan.do Opaque 2 38m


그런 다음 변수를 통해 포드에 매핑됩니다.

$ kubectl -n test-pg get statefulsets acid-minimal-cluster -o yaml
…
- env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: POSTGRES_USER
value: postgres
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: postgres.acid-minimal-cluster.credentials.postgresql.acid.zalan.do
…


글쎄, 확인하자.

비밀번호를 알아봅시다:

$ kubectl -n test-pg get secret postgres.acid-minimal-cluster.credentials.postgresql.acid.zalan.do -o ‘jsonpath={.data.password}’ | base64 -d
CcWdAaqvPA8acxwIpVyM8UHkds2QG3opC3KD7rO1TxITQ1q31cwYLTswzfBeTVsN


포트를 열어 로컬로 액세스합니다.

$ kubectl -n test-pg port-forward acid-minimal-cluster-0 6432:5432


로그인하고 데이터베이스를 확인하십시오.

$ psql -U postgres -h localhost -p 6432
Password for user postgres:
psql (14.5, server 13.7 (Ubuntu 13.7–1.pgdg18.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type “help” for help.
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
 — — — — — -+ — — — — — -+ — — — — — + — — — — — — -+ — — — — — — -+ — — — — — — — — — — — -
bar | bar_owner | UTF8 | en_US.utf-8 | en_US.utf-8 |
foo | zalando | UTF8 | en_US.utf-8 | en_US.utf-8 |
postgres | postgres | UTF8 | en_US.utf-8 | en_US.utf-8 |
template0 | postgres | UTF8 | en_US.utf-8 | en_US.utf-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf-8 | en_US.utf-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
postgres=#


PostgreSQL 프로메테우스 익스포터



Sidecar definitions을 참조하십시오.

우리는 이미 사이드카를 가지고 있습니다. 매니페스트에서 추가되었고 각 포드에는 현재 두 개의 컨테이너가 있습니다. 바로 PostgreSQL 자체와 내보내기입니다.

$ kubectl -n test-pg get po acid-minimal-cluster-0 -o jsonpath=’{.spec.containers[*].name}’
postgres exporter


메트릭이 있는지 봅시다. — 포트를 엽니다.

$ kubectl -n test-pg port-forward svc/acid-minimal-cluster-svc-metrics-master 9187:9187
Forwarding from 127.0.0.1:9187 -> 9187
Forwarding from [::1]:9187 -> 9187


아무것도 보이지 않고 클러스터가 일종의 "죽음"- pg_up == 0:

$ curl -s localhost:9187/metrics | grep pg_ | grep -v ‘#’
pg_exporter_last_scrape_duration_seconds 1.00031302
pg_exporter_last_scrape_error 1
pg_exporter_scrapes_total 9
pg_up 0


왜 — 수출자가 로그인 비밀번호와 같은 액세스 데이터를 가지고 있어야 하기 때문입니다.

사이드카 구성에서 새 변수를 추가합니다. Environment Variables을 참조하십시오.

...
      env:
      - name: "DATA_SOURCE_URI"
        value: "$(POD_NAME)/postgres?sslmode=require"
      - name: "DATA_SOURCE_USER"
        value: "$(POSTGRES_USER)"
      - name: "DATA_SOURCE_PASS"
        value: "$(POSTGRES_PASSWORD)"
      - name: "PG_EXPORTER_AUTO_DISCOVER_DATABASES"
        value: "true"
...




즉, 오퍼레이터는 POSTGRES_USERPOSTGRES_PASSWORD 변수를 설정하는 StatefulSet를 생성하며 사이드카가 자체 변수를 설정하는 데 사용합니다.

업데이트 저장 및 적용:

$ kubectl apply -f manifests/minimal-master-replica-svcmonitor.yaml


팟(Pod) 자체에서 변수를 확인하십시오.

$ kubectl -n test-pg get po acid-minimal-cluster-0 -o yaml
…
- env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: POSTGRES_USER
value: postgres
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: postgres.acid-minimal-cluster.credentials.postgresql.acid.zalan.do
- name: DATA_SOURCE_URI
value: $(POD_NAME)/postgres?sslmode=require
- name: DATA_SOURCE_USER
value: $(POSTGRES_USER)
- name: DATA_SOURCE_PASS
value: $(POSTGRES_PASSWORD)
- name: PG_EXPORTER_AUTO_DISCOVER_DATABASES
value: “true”
…


그리고 내보내기에서 측정항목을 다시 확인합니다.

$ curl -s localhost:9187/metrics | grep pg_ | grep -v ‘#’ | tail -5
pg_stat_replication_pg_current_wal_lsn_bytes{application_name=”acid-minimal-cluster-0",client_addr=”172.17.0.17",server=”acid-minimal-cluster-1:5432",slot_name=”182",state=”streaming”} 1.52655344e+08
pg_stat_replication_pg_wal_lsn_diff{application_name=”acid-minimal-cluster-0",client_addr=”172.17.0.17",server=”acid-minimal-cluster-1:5432",slot_name=”182",state=”streaming”} 0
pg_stat_replication_reply_time{application_name=”acid-minimal-cluster-0",client_addr=”172.17.0.17",server=”acid-minimal-cluster-1:5432",slot_name=”182",state=”streaming”} 1.663625745e+09
pg_static{server=”acid-minimal-cluster-1:5432",short_version=”13.7.0",version=”PostgreSQL 13.7 (Ubuntu 13.7–1.pgdg18.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0–3ubuntu1~18.04) 7.5.0, 64-bit”} 1
pg_up 1

pg_up == 1 - 야호! 효과가있다!

Prometheus 서비스 모니터



포트를 열어 Prometheus 자체에 액세스합니다.

$ kubectl -n monitoring port-forward svc/kube-prometheus-stack-prometheus 9090:9090
Forwarding from 127.0.0.1:9090 -> 9090
Forwarding from [::1]:9090 -> 9090


상태 확인 > 서비스 검색 — 여기에는 PostgreSQL이 표시되지 않습니다.



ServiceMonitor는 매니페스트에서 이미 생성되었습니다.

$ kubectl -n test-pg get servicemonitor
NAME AGE
acid-minimal-cluster-svcm-master 65m
acid-minimal-cluster-svcm-replica 65m


"더러운 해킹"을 반복하면서did for Druid — 레이블을 추가하고"release": "kube-prometheus-stack" 1~2분 정도 기다린 후 다시 확인합니다.



그리고 Prometheus 그래프에서 PostgreSQL의 클러스터 메트릭을 얻었습니다.



완료.

RTFM: Linux, DevOps, and system administration에 원래 게시되었습니다.

좋은 웹페이지 즐겨찾기