개발환경의 경우, 자원의 한계로 스탠드바이 서버 등을 따로 둘 수 없을 때가 많은데 오히려 개발 환경은 다양한 작업으로 인해 데이터 유실 가능성이 더 높을 수 있습니다. 비용 대비 효과 측면에서 각각 블록 볼륨을 사용하는 것보다 fss 시스템을 이용해 nfs로 활용하는 편이 나을 수 있습니다.
Vault secret 한도가 초과되어서 오라클 테라폼 코드 중 관련 코드를 제외하였습니다.
# git clone
git clone https://github.com/codelab-kr/dev-infra.git && cd dev-infra/fss
# 환경변수 익스포트
env-vars 작성 후 테미널에 붙여넣기
# 테라폼 적용
terraform init
terraform plan
terraform apply
새로 생성된 인스턴스로 접속하여 제대로 마운트 되었는지 확인합니다.
> df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.2G 1.4M 1.2G 1% /run
/dev/sda1 45G 1.9G 44G 5% /
tmpfs 5.9G 0 5.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda15 98M 6.3M 92M 7% /boot/efi
10.0.1.151:/devfsspaths/fs1/path1 23G 0 23G 0% /mnt/devfsspaths/fs1/path1
tmpfs 1.2G 4.0K 1.2G 1% /run/user/1001
잘 되어 있네요.
근데 가끔 재부팅되면 nfs 연결이 끊기는 경우도 있으니(제대로 연결 안 된 거임) 재부팅 한번 해줍시다.
이런, 진짜 없어졌네요.
> df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.2G 1.4M 1.2G 1% /run
/dev/sda1 45G 1.9G 44G 5% /
tmpfs 5.9G 0 5.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda15 98M 6.3M 92M 7% /boot/efi
tmpfs 1.2G 4.0K 1.2G 1% /run/user/1001
인스턴스 테라폼 파일에서 마운트를 해주기는 하는데(위 오라클 안내와 동일)
# instance.tf
inline = [
"sudo apt -y install nfs-utils > nfs-utils-install.log",
"sudo mkdir -p /mnt/devfsspaths/fs1/path1",
"sudo mount ${local.mount_target_1_ip_address}:${var.export_path_fs1_mt1} /mnt${var.export_path_fs1_mt1}"
재부팅하면 마운트가 사라져서 fstab에 추가해줘야 합니다.
단단히 묶어줍시다.
sudo vi /etc/fstab
# 아래 내용 추가
# 마운트 명령이 sudo mount 10.0.1.64:/devfsspaths/fs1/path2 /mnt/devfsspaths/fs1/path2 이면
10.0.1.64:/devfsspaths/fs1/path2 /mnt/devfsspaths/fs1/path2 nfs defaults 0 0
해당 작업은 가급적이면 파일 백업 후 신중히 진행합니다.
잘못하면 시스템 부팅이 안 됩니다.
재부팅 후 반영 확인합니다.
잘 붙어있네요!
폴더 권한도 확인해 봅니다.
루트 소유인데 그룹과 다른 유저는 쓰기 권한이 없어서 다용도로 사용하기 힘들어 같네요.
> ls -ld /mnt/devfsspaths/fs1/path1
drwxr-xr-x 2 root root 0 Jan 26 10:37 /mnt/devfsspaths/fs1/path1
그룹과 유저에게도 쓰기권한을 줍시다.
> sudo chmod 777 /mnt/devfsspaths/fs1/path1
그런데 여기까지 하고 보니!
만들어보면 어떨까 생각이 들었습니다.
일단 nfs로 볼륨을 연결하면 데이터 유실 걱정을 덜 해도 되고 어차피 리눅스 운영체제는 pod로 띄우고 계속 살려두면 되니까...?
물론 무겁기 때문에 굳이 이럴 필요가 있나 싶긴 했습니다만,
일전에 회사에서 클라우드를 개발자들에게 개발용 스테이션으로 제공했던 기억에 시도해 보았습니다.
apiVersion: v1
kind: Namespace
metadata:
name: test
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: dev-ffs-pv-0
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: oci-ffs
nfs:
server: 10.0.0.4
path: "/FileSystem1"
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: dev-ffs-pv-1
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: oci-ffs
nfs:
server: 10.0.0.4
path: "/FileSystem1"
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: test
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- name: http
containerPort: 80
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumes:
- name: data
persistentVolumeClaim:
claimName: my-ffs-claim
정성스럽게 우분투 서버를 만들어봅니다.
➜ k get all -n dev
NAME READY STATUS RESTARTS AGE
pod/ubuntu-0 1/1 Running 0 26m
pod/ubuntu-1 1/1 Running 0 26m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ubuntu ClusterIP 172.23.248.71 <none> 80/TCP 26m
NAME READY AGE
statefulset.apps/ubuntu 2/2 26m
일단 잘 뜨네요!
➜ k get pv,pvc -n dev
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/dev-ffs-pv-0 10Gi RWX Retain Bound dev/storage-ubuntu-0 oci-ffs 28m
persistentvolume/dev-ffs-pv-1 10Gi RWX Retain Bound dev/storage-ubuntu-1 oci-ffs 28m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/storage-ubuntu-0 Bound dev-ffs-pv-0 10Gi RWX oci-ffs 28m
persistentvolumeclaim/storage-ubuntu-1 Bound dev-ffs-pv-1 10Gi RWX oci-ffs 28m
볼륨 마운트도 이상 없습니다.
apt 업데이트도 되고 도커 설치도 잘 되고
생각보다 쓸만한가 싶었는데
root@ubuntu-0:/home# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
root@ubuntu-0:/home# systemctl status docker
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
root@ubuntu-0:/home# systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
root@ubuntu-0:/home# docker info
Client: Docker Engine - Community
Version: 25.0.1
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.12.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.24.2
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
errors pretty printing info
이런, 도커 데몬이 실행되지 않네요.
System has not been booted with systemd as init system (PID 1). Can't operate.
여러 프로세스를 실행시키는 systemd로 부트하지 않아서 데몬도 실행되지 않았던 건데요.
systemd로 부트를 해볼까 하다가 단일 프로세스 컨테이너를 기본으로하는 쿠버네티스의 사상과는 맞지 않아서 여기서 접었습니다.
기왕 ~~칼을 든 ~~설치해 본 김에
네트워크 파일 시스템은 어떤 식으로 작동되는지 잠시 확인해 보았습니다.
아까 리플리카스를 2로 설정하여 pv를 2개 생성해서 포드마다 마운트해줬는데 이게 혹시라도 따로 따로 저장되는 게 아닌가 의심이 됩니다.
ubuntu-0이 dev-ffs-pv-0 에 연결되었는데 여기에 테스트 파일을 작성합니다. 인코딩 관련은 따로 설정해 주지 않았는데 vim에서는 한글이 깨지는 듯하다가 cat으로 보니 한글이 보이네요.
root@ubuntu-0:/home# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 36G 26G 9.6G 74% /
tmpfs 64M 0 64M 0% /dev
tmpfs 2.8G 0 2.8G 0% /sys/fs/cgroup
10.0.0.4:/FileSystem0 8.0E 0 8.0E 0% /var/data
/dev/mapper/ocivolume-root 36G 26G 9.6G 74% /etc/hosts
shm 64M 0 64M 0% /dev/shm
tmpfs 5.5G 12K 5.5G 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 2.8G 0 2.8G 0% /proc/acpi
tmpfs 2.8G 0 2.8G 0% /proc/scsi
tmpfs 2.8G 0 2.8G 0% /sys/firmware
root@ubuntu-0:/home# cd /var/data
root@ubuntu-0:/var/data# ls
root@ubuntu-0:/var/data# vi test
root@ubuntu-0:/var/data# cat test
fsdfddfdsf한글 은 지원이 안 된다
다른 컨테이너인 ubuntu-1 은 dev-ffs-pv-1 과 연결했는데 같은 파일시스템을 공유해서 ubuntu-1에서도 test 파일을 그대로 볼 수 있습니다.
➜ k exec -it ubuntu-1 -n dev -- bash
root@ubuntu-1:/# cd /var/data
root@ubuntu-1:/var/data# ls
test
root@ubuntu-1:/var/data# cat test
fsdfddfdsf한글 은 지원이 안 된다
root@ubuntu-1:/var/data#
결국에는 개발환경은 리눅스 서버에 도커로 각 서비스를 돌리고 nfs 로 주기적으로 백업해 주자는 결론이 나네요.
파일 시스템을 사용하는 거 말고는 처음과 같지만...
결론이 같아도 과정이 다르다면 의미가...
음....