とにかく雑

とにかく雑に思い立ったことを書く。内容は私自身の見解であり、所属組織の立場・戦略・意見を代表するものではありません。

PgAdminにDB接続情報を環境設定的に構成する方法

あらかじめ接続情報を入れておきたいとか、構成管理したいとか、そういった状況。

設定方法はいくつかのサイトで解説が見られるが、バージョン依存で上手くいかないケースが散見される。
stackoverflow.com

最終的に上手くいったのは以下の方法となった。
stackoverflow.com

以下、Docker Compose を前提としたソースコード

docker-compose.yaml

version: "3.9"
services:
  postgres_db:
    image: postgres
    volumes:
      - ./postgres_db_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "15432:5432"
  pgadmin:
     image: dpage/pgadmin4:7.1
     restart: always
     environment:
       PGADMIN_DEFAULT_EMAIL: pgadmin@pgadmin.com
       PGADMIN_DEFAULT_PASSWORD: pgadmin
     ports:
       - "8080:80"
     volumes:
       - ./servers.json:/pgadmin4/servers.json
       - ./pgpass:/var/lib/pgadmin/pgpass
     depends_on:
       - "postgres_db"

ファイルマウントが重要なわけだが、pgpass については後述する相対パスで指定するのでたぶんどこに置いてもいける。


servers.json

{
    "Servers": {
        "1": {
            "Name": "docker_postgres",
            "Group": "docker_postgres_group",
            "Host": "postgres_db",
            "Port": 5432,
            "MaintenanceDB": "postgres",
            "Username": "postgres",
            "PassFile": "../../pgpass",
            "SSLMode": "prefer"
        },
        "2": {
            "Name": "docker_postgres_host",
            "Group": "docker_postgres_group",
            "Host": "host.docker.internal",
            "Port": 15432,
            "MaintenanceDB": "postgres",
            "Username": "postgres",
            "PassFile": "../../pgpass",
            "SSLMode": "prefer"
        }
    }
}

"PassFile": "../../pgpass" が最重要ポイント。相対パスになっているっぽい。


pgpass

postgres_db:5432:postgres:postgres:postgres
host.docker.internal:15432:postgres:postgres:postgres

パスワードは hostname:port:database:username:password の形式で書けば良い。
複数DBを1ファイルにも書ける。


微妙にハマるポイントが多く、予想に反して面倒であった。

Kubernetes リソースを Excel 表にするワンライナー

以下のようなワンライナーを実行する。

$ NAMESPACE=openshift-monitoring
$ echo -e "NAME\tKIND\tREPLICAS\tCONTAINER\tREQUEST MEMORY\tREQUEST CPU\tLIMIT MEMORY\tLIMIT CPU"; \
> oc get deployment,statefulset,daemonset -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.kind}{"\t"}{.spec.replicas}{"\t"}{range .spec.template.spec.containers[*]}{.name}{"\t"}{.resources.requests.memory}{"\t"}{.resources.requests.cpu}{"\t"}{.resources.limits.memory}{"\t"}{.resources.limits.cpu}{"\n\t\t\t"}{end}{"\n"}{end}' -n ${NAMESPACE} | sed '/^\t\t\t$/d'

 

実行結果。

$ NAMESPACE=openshift-monitoring
$ echo -e "NAME\tKIND\tREPLICAS\tCONTAINER\tREQUEST MEMORY\tREQUEST CPU\tLIMIT MEMORY\tLIMIT CPU"; \
> oc get deployment,statefulset,daemonset -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.kind}{"\t"}{.spec.replicas}{"\t"}{range .spec.template.spec.containers[*]}{.name}{"\t"}{.resources.requests.memory}{"\t"}{.resources.requests.cpu}{"\t"}{.resources.limits.memory}{"\t"}{.resources.limits.cpu}{"\n\t\t\t"}{end}{"\n"}{end}' -n ${NAMESPACE} | sed '/^\t\t\t$/d'
NAME	KIND	REPLICAS	CONTAINER	REQUEST MEMORY	REQUEST CPU	LIMIT MEMORY	LIMIT CPU
cluster-monitoring-operator	Deployment	1	kube-rbac-proxy	20Mi	1m
			cluster-monitoring-operator	75Mi	10m
grafana	Deployment	1	grafana	64Mi	4m
			grafana-proxy	20Mi	1m
kube-state-metrics	Deployment	1	kube-state-metrics	80Mi	2m
			kube-rbac-proxy-main	15Mi	1m
			kube-rbac-proxy-self	15Mi	1m
openshift-state-metrics	Deployment	1	kube-rbac-proxy-main	20Mi	1m
			kube-rbac-proxy-self	20Mi	1m
			openshift-state-metrics	32Mi	1m
prometheus-adapter	Deployment	2	prometheus-adapter	40Mi	1m
prometheus-operator	Deployment	1	prometheus-operator	150Mi	5m
			kube-rbac-proxy	15Mi	1m
telemeter-client	Deployment	1	telemeter-client	40Mi	1m
			reload	10Mi	1m
			kube-rbac-proxy	20Mi	1m
thanos-querier	Deployment	2	thanos-query	12Mi	10m
			oauth-proxy	20Mi	1m
			kube-rbac-proxy	15Mi	1m
			prom-label-proxy	15Mi	1m
			kube-rbac-proxy-rules	15Mi	1m
alertmanager-main	StatefulSet	3	alertmanager	40Mi	4m
			config-reloader	10Mi	1m
			alertmanager-proxy	20Mi	1m
			kube-rbac-proxy	15Mi	1m
			prom-label-proxy	20Mi	1m
prometheus-k8s	StatefulSet	2	prometheus	1Gi	70m
			config-reloader	10Mi	1m
			thanos-sidecar	25Mi	1m
			prometheus-proxy	20Mi	1m
			kube-rbac-proxy	15Mi	1m
			prom-label-proxy	15Mi	1m
			kube-rbac-proxy-thanos	10Mi	1m
node-exporter	DaemonSet		node-exporter	32Mi	8m
			kube-rbac-proxy	15Mi	1m

 

結果を Excel に貼り付ける。
罫線は自前で描かないといけない。
f:id:Santea:20220111172119p:plain

 

くだらないけど意外に使いどころがあるかもしれない。

OpenShift Cluster Monitoring の Prometheus のデータを Export/Import する

これが実現できると一番スマートそうだなと思った。
visibilityspots.org


だが、Cluster Monitoring の Prometheus では admin API が無効化されていた。まぁ想定はしていた。

$ oc exec -it -n openshift-monitoring prometheus-k8s-0 -- sh

sh-4.4$ curl -X POST http://localhost:9090/api/v1/admin/tsdb/snapshot
{"status":"error","errorType":"unavailable","error":"admin APIs disabled"}


仕方がないので Prometheus のデータを tar.gz で固めて持ってくることにした。固めるのにかなり時間が掛かる。

$ oc exec -it -n openshift-monitoring prometheus-k8s-0 -- sh

sh-4.4$ tar -zcvf /tmp/prometheus.tar.gz /prometheus
tar: Removing leading `/' from member names
/prometheus/
/prometheus/01FK3XJ471YNVXFRT1PV5VHPTP/
/prometheus/01FK3XJ471YNVXFRT1PV5VHPTP/chunks/
・・・
・・・
・・・

sh-4.4$ ls /tmp/
ks-script-rgpe088e  ks-script-zgupbl05	prometheus.tar.gz


Prometheus のバージョンも調べておく。

sh-4.4$ /bin/prometheus --version
prometheus, version 2.26.1 (branch: rhaos-4.8-rhel-8, revision: 5e146b2e4b9d96a952b9412dc20ce3fabfa2bd5e)
  build user:       root@d43b8d11b98a
  build date:       20210813-03:01:55
  go version:       go1.16.6
  platform:         linux/amd64


oc cp でローカルに tar.gz で固めたものを持ってくる。持ってくるのにかなり時間が掛かる。

$ oc cp prometheus-k8s-0:/tmp/prometheus.tar.gz /my/local/pc/prometheus.tar.gz
Defaulting container name to prometheus.
tar: Removing leading `/' from member names


ローカルで同一バージョンの Prometheus をデータをコピーした領域をマウントする形で起動する。

$ docker run -d --name prometheus -v /my/local/pc/prometheus:/prometheus -p 9090:9090 prom/prometheus:v2.26.1
002bc4b65116d370f9998455e38c55d88d28d2bb26b1ebddacba38abfbcb10b4


一応ちゃんとデータを見られる。そこそこ使い所ありそう。