PostgreSQL Container 구성

2024. 4. 10. 14:17Data/PostgreSQL

tcp 통신으로 proxy와 연동해야 함

# stream proxy 설정
stream {
    server {
        listen {외부 port};

        proxy_connect_timeout 60s;
        proxy_socket_keepalive on;
        proxy_pass {node IP}:{service port};
    }
}

Service에서 nodePort 사용: ingress 사용 안함

apiVersion: v1
kind: Service
metadata:
  name: {service}
  namespace: {namespace}
spec:
  type: NodePort
  selector:
    app: {pod}
  ports:
    - protocol: TCP
      # minikube에서는 30000에서부터 시작함
      nodePort: {node port}
      # 없으면 에러남
      port: {service port}
      targetPort: {pod port}

 

ConfigMap을 마운트 할수 있도록 권한을 설정해줘야 함

# uid와 gid를 host 서버와 일치시켜줘서 권한 문제를 해결함
    initContainers:
      - name: init
        image: busybox:latest
        command:
          - sh
          - "-c"
          - |
            addgroup -g {gid} postgres
            adduser -u {uid} postgres -G postgres -D
            mkdir -p /var/lib/postgresql/data
            chown -R postgres:postgres /var/lib/postgresql/data
            chmod -R 775 /var/lib/postgresql/data
        volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/data
      volumes:
        - name: data
          hostPath:
            path: /home/barisein/postgresql

환경설정을 통해서 Pod가 작동할 수 있는 IP 대역을 열어 줘야 함

apiVersion: v1
kind: ConfigMap
metadata:
  name: {configmap}
  namespace: {namespace}
data:
  pg_hba.conf: |
    # TYPE  DATABASE        USER            ADDRESS                 METHOD

    # "local" is for Unix domain socket connections only
    local   all             all                                     trust
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    # IPv6 local connections:
    host    all             all             ::1/128                 trust
    # Allow replication connections from localhost, by a user with the
    # replication privilege.
    local   replication     all                                     trust
    host    replication     all             127.0.0.1/32            trust
    host    replication     all             ::1/128                 trust

    # pod ip가 할당되는 대역으로 설정
    host all all  x.x.x.x/x scram-sha-256

TS

  • Database is uninitialized and superuser password is not specified.

# Pod 상태 확인
# CrashLoopBackOff
kubectl get pods -A

# 에러 확인
kubectl logs -f pod/{POD} -n {namespace}

# 조치: 환경변수에 비밀번호를 추가
    spec:
      containers:
      - name: {app}
        image: {postgres 이미지 pull 정보}
        env:
        - name: POSTGRES_PASSWORD
          value: {비밀번호}
        ports:
        - containerPort: {port}
      imagePullSecrets:
        - name: {app}

# 기존 pod 제거(필요한 경우만)
kubectl delete pod/{POD} -n {namespace}

# 실행
kubectl apply -f {yml파일}
  • initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted

hostPath로 mount한 경우, Pod의 postgresql이 작동하고 있는, uid와 mount되는 disk의 uid가 일치하지 않기 때문에 발생
alpine에서 uid, gid를 변경하는 방법을 모르기 때문에 host서버의 gid를 생성하고 거기에 postgres 계정을 추가하는 방법으로 권한 문제 해결

# uid와 gid를 host 서버와 일치시켜줘서 권한 문제를 해결함
    initContainers:
      - name: init
        image: busybox:latest
        command:
          - sh
          - "-c"
          - |
            addgroup -g {gid} postgres
            adduser -u {uid} postgres -G postgres -D
            mkdir -p /var/lib/postgresql/data
            chown -R postgres:postgres /var/lib/postgresql/data
            chmod -R 775 /var/lib/postgresql/data
        volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/data
      volumes:
        - name: data
          hostPath:
            path: /home/barisein/postgresql
  • An error occurred while setting up the SSL connection.

https://iamgideon.medium.com/configure-a-reverse-proxy-for-postgresql-with-nginx-63c18cefe09

 

Configure a Reverse Proxy for PostgreSQL with Nginx

The title says it all, in this article we will see how to configure a reverse proxy for PostgreSQL using Nginx server.

iamgideon.medium.com

중간 네트웍 설정이 잘못되어 pod까지 명령이 전달되지 못함: 문구 자체만 가지고 ssl 문제라고 생각하면 안됨
Nginx에서 stream proxy로 구성해야 하는데, http proxy로 구성해서 생긴 문제
Ingress 제거하고 Service를 NodePort로 설정해야 함

# stream proxy 설정
stream {
    server {
        listen {외부 port};

        proxy_connect_timeout 60s;
        proxy_socket_keepalive on;
        proxy_pass {node IP}:{service port};
    }
}
  • FATAL: no pg_hba.conf entry for host "10.244.0.1", user "xxxxx", database "xxxxxx", no encryption

pg_hba.conf에 접속할 수 있는 IP 대역을 열어 줘야 접속이 가능함

# pod의 IP 확인
kubectl describe pod/{pod} -n {namespace}

# configMap 설정
  pg_hba.conf: |
    # TYPE  DATABASE        USER            ADDRESS                 METHOD

    # "local" is for Unix domain socket connections only
    local   all             all                                     trust
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    # IPv6 local connections:
    host    all             all             ::1/128                 trust
    # Allow replication connections from localhost, by a user with the
    # replication privilege.
    local   replication     all                                     trust
    host    replication     all             127.0.0.1/32            trust
    host    replication     all             ::1/128                 trust

    # 허용 가능한 Pod IP 대역 추가
    host all all  {POD가 허용되는 IP 대역} scram-sha-256

'Data > PostgreSQL' 카테고리의 다른 글

PostgreSQL merge 구문  (0) 2024.12.21
PostgreSQL 시퀀스 만들기  (0) 2024.12.01
PostgreSQL 암호화 확장 모듈 추가  (0) 2024.08.13
PostgreSQL 명령  (0) 2024.05.04
pgAdmin 설정  (0) 2024.05.04