FSS

codelab·2024년 1월 25일
0

Dev

목록 보기
6/9

FSS

개발환경의 경우, 자원의 한계로 스탠드바이 서버 등을 따로 둘 수 없을 때가 많은데 오히려 개발 환경은 다양한 작업으로 인해 데이터 유실 가능성이 더 높을 수 있습니다. 비용 대비 효과 측면에서 각각 블록 볼륨을 사용하는 것보다 fss 시스템을 이용해 nfs로 활용하는 편이 나을 수 있습니다.


OCI FSS

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 로 주기적으로 백업해 주자는 결론이 나네요.

파일 시스템을 사용하는 거 말고는 처음과 같지만...
결론이 같아도 과정이 다르다면 의미가...
음....

profile
Think about a better architecture

0개의 댓글