Post

Kubernetes - pgadmin4 배포해 보기

Kubernetes에서 Postgres DB를 GUI로 관리할 수 있는 pgadmin4를 배포해 보았다.

Kubernetes - pgadmin4 배포해 보기

Kubernetes v1.24.7 / pgadmin4 v6 / Ubuntu 22.04 LTS

Kubernetes

CLI

개요


  • postgres를 통합 관리 하려고 진행하게 되었다.
  • postgresql-ha 구축 후 pgadmin4에서 연결하는 것을 해보았다.
  • Kubernetes를 공부하기 위하여 docker의 image를 kompose 없이 manifest 형식으로 변환 해 보았다.
    실제로 해보면서 yaml파일 작성에 크게 도움이 되었다.
  • GUI라는 것은 데이터의 중요성보다 보기만 하면 되는 것이다 보니 단일 replicas로 진행하였다.
  • 또한, 관리의 편리성을 위해 namespace는 default로 고정하였다.

Prepare


큰 부류로 많이 사용 되는 deployment, service, pvc, secrets으로 나눠봤다. (configMap을 넣기는 애매하다 보니 아쉬움…)
나열되어있는 순서대로 deployment, service, pvc, secrets으로 작성 하였다.

1. pgadmin-deployment.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
dor1@is-master ~ ❯ mkdir pgadmin
mkdir: created directory 'default'
dor1@is-master ~ ❯ cd pgadmin

# pgadmin-deployment.yaml
dor1@is-master ~/pgadmin ❯ vi pgadmin-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pgadmin
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: pgadmin
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app.kubernetes.io/name: pgadmin
    spec:
      containers:
        - env:
            - name: PGADMIN_DEFAULT_EMAIL
              valueFrom:
                secretKeyRef:
                  key: PGADMIN_DEFAULT_EMAIL
                  name: pgadmin-secret
            - name: PGADMIN_DEFAULT_PASSWORD
              valueFrom:
                secretKeyRef:
                  key: PGADMIN_DEFAULT_PASSWORD
                  name: pgadmin-secret
            - name: PGADMIN_PORT
              value: "80"
            - name: TZ
              value: "Asia/Seoul"
          image: dpage/pgadmin4:6
          imagePullPolicy: IfNotPresent
          name: pgadmin
          ports:
          - containerPort: 80
          resources:
            limits:
              memory: 4096Mi
          volumeMounts:
            - mountPath: /var/lib/pgadmin
              name: pgadmin-data
      restartPolicy: Always
      volumes:
        - name: pgadmin-data
          persistentVolumeClaim:
            claimName: pgadmin-data
      securityContext:
        runAsUser: 0

2. pgadmin-service.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# pgadmin-service.yaml
dor1@is-master ~/pgadmin ❯ vi pgadmin-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: pgadmin
  namespace: default
spec:
  ports:
  - name: http
    # nodePort 설정
    nodePort: 30001
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app.kubernetes.io/name: pgadmin
  type: NodePort

3. pgadmin-pvc.yaml

rook-ceph을 사용하기에 storageClass은 변경해준다.
pgadmin4특성 상 설정 값만 들어가기에 size는 최대한 적게 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# pgadmin-pvc.yaml
dor1@is-master ~/pgadmin ❯ vi pgadmin-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pgadmin-data
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  storageClassName: rook-cephfs

4. pgadmin-secrets.yaml

1
2
3
4
5
6
7
8
9
10
# pgadmin-secret.yaml
dor1@is-master ~/pgadmin ❯ pgadmin-secret.yaml
apiVersion: v1
data:
  PGADMIN_DEFAULT_EMAIL: ZGVlcGFkbWluQGRlZXBub2lkLmNvbQ==
  PGADMIN_DEFAULT_PASSWORD: YW9vbmkzNjUhQA==
kind: Secret
metadata:
  name: pgadmin-secret
  namespace: default

Deploy


간단히 적용해본다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
dor1@is-master ~/pgadmin ❯ kubectl apply -f .
deployment.apps/pgadmin created
persistentvolumeclaim/pgadmin-data created
secret/pgadmin-secret created
service/pgadmin created

# 확인
kubectl get po,svc,pvc,secret
NAME                           READY   STATUS    RESTARTS   AGE
pod/pgadmin-587c79bdcb-klnx8   1/1     Running   0          46s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.233.0.1     <none>        443/TCP        42d
service/pgadmin      NodePort    10.233.21.83   <none>        80:30001/TCP   47s

NAME                                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/pgadmin-data   Bound    pvc-7daa67d5-e7e2-4a44-8115-3704267a993c   5Gi        RWO            rook-cephfs    47s

NAME                    TYPE     DATA   AGE
secret/pgadmin-secret   Opaque   2      47s

이후 접속 해본다.

pgadmin4 pgadmin4

DB Connection


서로 다른 namespace에 있는 postgres를 연결 할 때는 CoreDNS사용하면 간단하게 된다.
CoreDNS는 vanila k8s에서 calico(L3)로 설치하게 되면 대부분 포함 되어있다.
CoreDNS의 DNS 형식은 보통 다음과 같다.

<svc>.<namespace>.cluster.local

cluster.local은 k8s를 설치할 때 보통 parameter로 설정된다.
우선 RegisterServer를 통하여 등록 창을 띄워준다.

Register → Server Register → Server

적절히 Name에 입력하고 다음 Connection탭으로 넘긴다.

Name 입력 후 → Connection Name 입력 후 → Connection

Host name/address에 DNS를 넣어주면 된다.

Host name/address 입력 Host name/address 입력

알맞게 입력되었다면 정상적으로 확인할 수 있다.

Dashboard 확인 Dashboard 확인

This post is licensed under CC BY 4.0 by the author.