웹 서비스를 배포하게 되면, 필수로 사용하게되는 것이 데이터 베이스이다.
여러 데이터 베이스들이 있지만, 회사에서 주로 사용했던 데이터베이스가 오라클이기도 하고
고성능 트랜잭션 처리를 지원해서 비용이 높다고는 하지만
서버성능에도 딱히 문제가 없을 것같아 오라클 데이터베이스를 설치해보고자 한다.
1. 오라클 데이터베이스 도커 이미지 생성
일반적인 도커 허브에서 오라클 데이터베이스 이미지가 존재하긴 하지만, 대체로 11 버전이다.
아무래도 11 버전은 출시한지 거의 17년이 넘었기도 하고 최신 버전을 지원하는데 굳이 옛날 버전을 사용할 이유가 없을 것 같아서 21버전을 설치해보려고 한다.
하지만, 도커 허브에서는 21 버전의 오라클 데이터베이스 이미지를 찾을 수 없었다.
그렇게 찾다보니 오라클 깃허브에서 도커이미지를 생성할 수 있도록 지원해주는 것을 찾을 수 있었다.
(https://github.com/oracle/docker-images/tree/main/OracleDatabase)
해당 깃 레퍼지토리에 들어가서 OracleDatabase>SingleInstance 에 들어가면 Readme 파일이 있는데 해당 Readme 파일을 읽어보면서 도커이미지를 생성해보도록 하자.
먼저, 해당 깃 레퍼지토리를 clone 한다.
git clone https://github.com/oracle/docker-images.git
그리고 dockerfiles 폴더까지 이동한다.
cd OracleDatabase/SingleInstance/dockerfiles
그리고 buildContainerImage 쉘 스크립트를 실행시켜 원하는 버전의 오라클 데이터베이스를 도커이미지로 생성한다.
./buildContainerImage.sh -v 21.3.0 -e
실행하면 아래와 같이 도커이미지 빌드를 하는 것을 확인할 수 있다.
완료되면 아래와 같이 도커이미지가 생성된 것을 확인할 수 있다.
이제, 클러스터에서 도커이미지를 가져와 쓸수있도록 도커 허브에 올려보도록 하자.
먼저 도커 허브에 올리기위해 이미지의 태그를 변경해야 한다. 내 도커 허브 계정은 maewakka 이기 떄문에 아래와 같이 변경한다.
docker tag oracle/database:21.3.0-ee maewakka/oracle-database:21.3.0-ee
그 다음, 도커 허브에 이미지를 push 한다.
docker push maewakka/oracle-database:21.3.0-ee
2. 쿠버네티스 설정 파일 생성
namespace 생성
먼저, database라는 네임스페이스를 생성한다.
kubectl create namespace database
pvc 생성
그다음, 볼륨을 위한 pvc를 생성한다. (pvc.yaml)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: oracle-21-pvc
namespace: database
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-client
resources:
requests:
storage: 100Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: oracle-21-pvc-dbs
namespace: database
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-client
resources:
requests:
storage: 100Gi
2개의 pvc를 생성한 이유는, 테이블스페이스를 생성할 때 기본 경로가 /opt/oracle/oradata가 아닌 /opt/oracle/homes/OraDBHome21cXE/dbs 로 잡혀있어 재시작시 DB가 날아가는 현상을 발견하여 2개로 같이 잡아두었다.
/opt/oracle로 볼륨을 잡든, 아니면 테이블스페이스를 명확히 지정하든 여러 방법이 있지만 기존 설정을 건드리기 싫어서 나는 2개의 pvc를 생성하였다.
pvc를 자세히보면 이전애 helm으로 설치하였던 nfs-provisoner 에서 제공하는 nfs-client 스토리지 클래스를 지정하는 것만으로도 간단하게 pv 설정없이 pvc를 생성할 수 있는 것을 알 수 있다.
statefulset 생성
pvc를 생성했으면 이제 statefulset 파일을 생성한다. (statefulset.yaml)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: oracle-21-xe
namespace: database
spec:
replicas: 1
serviceName: oracle-21-xe
selector:
matchLabels:
app: oracle-21-xe
template:
metadata:
labels:
app: oracle-21-xe
spec:
containers:
- name: oracle-21-xe
image: {Docker Hub에 올린 오라클 데이터베이스 이미지}
ports:
- containerPort: 1521
volumeMounts:
- name: oracle-21-xe
mountPath: /opt/oracle/oradata
- name: oracle-21-xe-dbs
mountPath: /opt/oracle/homes/OraDBHome21cXE/dbs
env:
- name: ORACLE_SID
value: {사용할 SID 이름}
- name: ORACLE_PWD
value: {사용할 PASSWORD}
volumes:
- name: oracle-21-xe
persistentVolumeClaim:
claimName: oracle-21-pvc
- name: oracle-21-xe-dbs
persistentVolumeClaim:
claimName: oracle-21-pvc-dbs
image 에는 아까 도커 허브에 올렸던 데이터베이스 이미지를,
볼륨에는 아까 설정해두었던 pvc를 각각의 경로에 매핑 시켜주고,
env에 사용할 SID 와 PWD를 설정해준다.
service 생성
apiVersion: v1
kind: Service
metadata:
name: oracle-21-xe
namespace: database
spec:
selector:
app: oracle-21-xe
ports:
- protocol: TCP
port: 1521
targetPort: 1521
type: NodePort
그 다음 해당 파드를 외부로 노출시킬 서비스를 생성한다.
type은 ClusterIP, NodePort, Loadbalancer 등이 있지만
Ingress 를 설정하기는 딱히 귀찮고, 로드밸런서도 없어서 간단하게 NodePort로 배포하였다.
클러스터에 등록
이제 생성한 파일들을 클러스터에 등록한다.
kubectl apply -f statefulset.yaml -f pvc.yaml -f service.yaml
아래와 같이 성공적으로 running 상태로 들어가면 잘 설정 한 것이다.
'DevOps > 쿠버네티스' 카테고리의 다른 글
03. 쿠버네티스 설정 (0) | 2024.08.05 |
---|---|
02. 쿠버네티스 클러스터 생성 (0) | 2024.08.02 |
01. 쿠버네티스란 무엇인가? (0) | 2024.08.02 |