IT·테크/인프라

쿠버네티스에 Oracle Database 설치하기 — 이미지 빌드부터 Helm 차트까지

레루루 2026. 8. 1. 17:18
반응형

이 글은 2022년 11월 기준 기록입니다.

준비물은 다섯 가지다

시작하기 전에 다음이 갖춰져 있어야 합니다.

  • Kubernetes Cluster
  • kubectl
  • Helm
  • Docker
  • Git

이미지는 오라클이 제공하는 Dockerfile로 직접 빌드한다

오라클은 공식 GitHub 저장소 oracle/docker-images에 Dockerfile을 제공합니다. 먼저 이 저장소를 받아 옵니다.

$ mkdir oracle
$ cd oracle
$ git clone https://github.com/oracle/docker-images.git

빌드에 필요한 설치 파일은 저장소에 들어 있지 않습니다. 이미지를 만들고자 하는 Dockerfile 위치에 들어가서, 각 버전에 맞는 설치 파일(.zip)을 Oracle Database Software Downloads에서 내려받아 그 자리에 둡니다.

 

그다음 해당 위치에서 이미지 빌드를 실행합니다. 방법은 두 가지입니다.

# 직접 docker 명령으로 이미지를 빌드하는 경우
$ cd OracleDatabase/SingleInstance/dockerfiles/21.3.0
$ docker build -t oracle/database:21.3.0-ee .

# 오라클에서 제공하는 buildContainerImage.sh를 이용하는 경우
$ cd OracleDatabase/SingleInstance/dockerfiles
$ ./buildContainerImage.sh -v 21.3.0 -e

Helm 차트는 템플릿 하나에 세 오브젝트를 담는다

차트 디렉터리 oracle-db-21ctemplates 폴더 아래에 oradb.yaml 하나를 두고, 그 옆에 Chart.yamlvalues.yaml을 둔 구성입니다.

 

oradb.yaml에는 StatefulSet·Service·ConfigMap 세 오브젝트가 함께 들어갑니다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
    name: {{ .Values.name }}
spec:
    serviceName: {{ .Values.name }}
    replicas: 1
    selector:
        matchLabels:
            app: {{ .Values.name }}
    template:
        metadata:
            labels:
                app: {{ .Values.name }}
        spec:
            containers:
            - name: {{ .Values.name }}
              image: oracle/database:21.3.0-ee
              env:
              - name: ORACLE_SID
                value: "ORCL"
              - name: ORACLE_EDITION
                value: "enterprise"
              resources:
                requests:
                    memory: "2Gi"
                limits:
                    memory: "2Gi"
              ports:
              - containerPort: 1521
              - containerPort: 5500
              volumeMounts:
              - name: oradb
                mountPath: /opt/oracle/oradata
              - name: {{ .Values.name }}-init
                mountPath: /opt/oracle/scripts/startup
            volumes:
            - name: {{ .Values.name }}-init
              configMap:
                name: {{ .Values.name }}-init-config
    volumeClaimTemplates:
    - metadata:
        name: oradb
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
            requests:
                storage: 15Gi
---
apiVersion: v1
kind: Service
metadata:
    name: {{ .Values.name }}
    labels:
        app: {{ .Values.name }}
spec:
    selector:
        app: {{ .Values.name }}
    type: NodePort
    ports:
    - name: ora-listener
      port: 1521
      protocol: TCP
      nodePort: 31521
    - name: ora-xmldb
      port: 5500
      protocol: TCP
---
apiVersion: v1
kind: ConfigMap
metadata:
    name: {{ .Values.name }}-init-config
data:
    init.sql: |
        alter session set "_ORACLE_SCRIPT"=true;
        CREATE USER 'username' IDENTIFIED BY 'password';
        GRANT CONNECT, RESOURCE, DBA TO 'username';

 

ConfigMap으로 넣은 init.sql은 StatefulSet에서 /opt/oracle/scripts/startup에 마운트되어 기동 시점에 실행됩니다.

_ORACLE_SCRIPT를 켜야 C##이 붙지 않은 계정을 만들 수 있다

init.sql 첫 줄이 있는 이유가 있습니다. Oracle DB 최근 버전부터는 사용자명에 C##을 붙여야만 계정 생성이 가능합니다(예: C##testuser). _ORACLE_SCRIPT = true 설정을 하면 C##으로 시작하지 않는 계정도 생성할 수 있습니다.

Chart.yaml과 values.yaml이 나머지를 채운다

apiVersion: v1
appVersion: "1.0"
description: Oracle 21c EE DB Test Helm Chart
name: oracle-db-21c-ee
version: 0.1.0

 

values.yaml에는 템플릿 곳곳에서 {{ .Values.name }}으로 참조하던 값 하나만 있으면 됩니다.

name: "oracle-db"

배포는 한 줄이다

$ helm install oracle-db oracle-db-21c/ 
반응형