postgres webgui를 사용하고 싶습니다.

왜 할까?



현재 상태,
db는 k8s를 타고 있습니다. 안전을 위해 (maybe) 외부에 공개하지 않은 -> loadbalancer를 사용하지 않고 ClusterIP를 구성합니다.
단지 개발자는 DB의 내용을보고 싶을 때가있을 것입니다.
그래서 웹을 통해 볼 수있는 GUI를 설정하고 싶습니다.

어떻게 할까?



pgweb을 k8s를 타고 이것에 Ingress를 붙임으로써 문제를 해결합니다.
  • pgweb이란?
  • pgweb을 docker로 이동
  • k8s 타기

  • pgweb이란?



    golang으로 작성된 관리 인터페이스 (그렇다고 생각)
    쿼리 결과를 CSV, JSON, XML로 토출 할 수 있으며 쿼리 기록을 저장합니다.
    이미지처럼 매우 간단한 UI (한눈에 반한)
    간단한 UI입니다

    pgweb을 docker로 이동



    「pgweb docker hub」로 조사한 느낌 별로 좋은 image가 안되어서 스스로 작성한다
    
    FROM alpine:latest as build
    ADD https://github.com/sosedoff/pgweb/releases/download/v0.9.12/pgweb_linux_amd64.zip  ./
    RUN apk add unzip && unzip pgweb_linux_amd64.zip
    
    FROM alpine:latest
    COPY --from=build ./ ./app
    EXPOSE 8080
    CMD [ "./app/pgweb_linux_amd64", "--sessions" ,"--bind=0.0.0.0", "--listen=8080" ]
    

    조금 해설하면
    ADD로 pgweb zip을 다운로드하고 unzip으로 압축을 풉니 다.
    이 상태에서는 unzip이 방해이므로 COPY --from = build를 사용하여 이미지 크기를 줄입니다.
    이제 내 환경에서 16MB로 줄일 수있었습니다.

    k8s 타기


    
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: pgweb
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: pgweb
        spec:
          containers:
            - name: pgweb
              image: pgweb:latest
              imagePullPolicy: Always
              ports:
                - containerPort: 8080
    

    image의 곳은 자신이 작성한 image의 이름을 설정해 주면 움직일 것이다
    또한 우리가 사용할 때 .gitlab 레지스트리에 docker image를 갖기 때문에
    마지막 줄에
    imagePullSecrets:
            - name: gitlab
    
    

    그리고 image는 gitlab registry에 설정된 image의 이름을 필요로합니다.

    다음으로 서비스를 정의합니다.
    apiVersion: v1
    kind: Service
    metadata:
      name: pgweb-svc
    spec:
      type: NodePort
      ports:
      - port: 8080
        protocol: TCP
        targetPort: 8080
      selector:
        app: pgweb
    

    selector를 사용하여 이전에 배포를 설정합니다.
    그런 다음 ingress를 설정하십시오.
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: postgres-web-ing
    
    spec:
      backend:
        serviceName: pgweb-svc
        servicePort: 8080
    
    

    필요한 최소한으로 움직일 것이라고 생각합니다.
    실제로는 이것에 namespace라든지, ingres라면 도메인과 tls의 설정등을 하는 것이 좋다고 생각한다.....
    이것이 성공하면 globalIP가 설정됩니다.

    액세스해 보면 ↓


    요약



    pgweb UI는 간단하고 멋지다.
    개발자는 DB 내용을보고 싶을 때 pgweb을 통해 볼 수 있습니다.
    그건 그렇고, k8s를 타고있는 DB에 액세스하고 싶을 때
    HOST
    [サービス名].[ネームスペース名].svc.cluster.local
    

    로 설정하면 연결되어야합니다.
    이것에는 문제가 하나 있고, 지금의 상태라면 DB가 외부에 노출되지 않기 때문에
    마이그레이션 할 수 없다는 것입니다. 해결책으로 두 가지 생각했습니다.
  • DB를 외부에 노출
  • GCP 포트 포워드 기능 사용

  • 첫 번째는 외부에 노출되는 것이 조금 무섭다.
    두 번째는 GCP 만 할 수 있다는 문제가 있습니다.

    또 해결안을 생각한다고 한다

    감사합니다.

    참고


  • pgweb
  • 좋은 웹페이지 즐겨찾기