Summary

CloudBeaverk3s 환경으로 설치하는 과정을 기록했습니다.

PostgreSQL을 편하게 관리하기위해 CloudBeaver를 호스팅합니다.

yaml

ConfigMap

CloudBeaver의 환경 변수를 저장하는 객체입니다.

cloudbeaver.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cloudbeaver-config
  namespace: core-infra
data:
  TZ: "Asia/Seoul"

Tip

내용이 별로 없어서 Deployment에 직접 넣어도 상관 없습니다.

PVC

CloudBeaver의 데이터를 영구 저장할 수 있는 저장 공간을 요청합니다.

cloudbeaver.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cloudbeaver-pvc
  namespace: core-infra
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path
  resources:
    requests:
      storage: 5Gi

Service

CloudBeaver의 내부 네트워크 관련 객체입니다.

cloudbeaver.yaml
apiVersion: v1
kind: Service
metadata:
  name: cloudbeaver-svc
  namespace: core-infra
spec:
  type: ClusterIP
  selector:
    app: cloudbeaver
  ports:
    - name: http
      port: 80
      targetPort: 8978

Deployment

CloudBeaver 컨테이너를 생성하고 배포하는 객체입니다.

cloudbeaver.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cloudbeaver
  namespace: core-infra
  labels:
    app: cloudbeaver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cloudbeaver
  template:
    metadata:
      labels:
        app: cloudbeaver
    spec:
      containers:
        - name: cloudbeaver
          image: dbeaver/cloudbeaver:latest
          ports:
            - containerPort: 8978
          envFrom:
            - configMapRef:
                name: cloudbeaver-config
          
          # ==========================================
          # 헬스체크 (Docker Compose의 curl 방식을 K8s native httpGet으로 변환)
          # ==========================================
          livenessProbe:
            httpGet:
              path: /status
              port: 8978
            initialDelaySeconds: 10
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3
          readinessProbe:
            httpGet:
              path: /status
              port: 8978
            initialDelaySeconds: 5
            periodSeconds: 10
            
          # ==========================================
          # 리소스 제한 (기존 설정 100% 반영)
          # ==========================================
          resources:
            requests:
              cpu: "100m"
              memory: "400Mi"
            limits:
              cpu: "1.0"
              memory: "1Gi"
              
          volumeMounts:
            - name: cloudbeaver-data
              mountPath: /opt/cloudbeaver/workspace
              
      volumes:
        - name: cloudbeaver-data
          persistentVolumeClaim:
            claimName: cloudbeaver-pvc

Ingress

CloudBeaver의 통신 규칙을 담당합니다. Traefik을 이용해 SSL 인증서를 자동 발급해줍니다.

cloudbeaver.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cloudbeaver-ingress
  namespace: core-infra
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-cloudflare"
    traefik.ingress.kubernetes.io/router.middlewares: "core-infra-internal-only@kubernetescrd"
spec:
  ingressClassName: traefik
  tls:
    - hosts:
        - beaver.junbeom.work    # 사용할 서브도메인 (필요시 cloudbeaver.junbeom.work 등으로 수정)
      secretName: cloudbeaver-tls-secret
  rules:
    - host: beaver.junbeom.work
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: cloudbeaver-svc
                port:
                  number: 80

Tip

모든 객체는 cloudbeaver.yaml에 포함됩니다.

Installation

kubectl apply -f cloudbeaver.yaml

Success