Kubernetes에서 NFS를 이용하여 컨테이너 간 파일 공유가 가능하도록 합니다. 이름이 mynfs인 PersistentVolume과 PersistentVolumeClaim을 각각 생성하고 동일한 볼륨을 사용하는 두 개의 컨테이너 mypodmypod-2nd를 생성합니다. mypod에서 볼륨 디렉토리에 test_file이라는 파일을 만든 다음 mypod-2nd에서 해당 파일이 동일하게 생성되었는지 확인 합니다. CMD-client에서도 NFS를 마운트 하여 test_file을 확인합니다.

NFS서버 설치

AWS에서 제공하는 NFS 서버인 EFS를 설치하여 사용합니다.

보안 그룹 추가

NFS를 위한 보안 그룹을 만들고 아래 목록에 해당하는 보안 그룹에 속한 EC2 인스턴스에서 접근 가능하도록 인바운드 규칙을 추가합니다.

  • CMD-client 보안 그룹
  • Kubernetes 마스터 노드 보안 그룹 (masters.dev.example.com)
  • Kubernetes 나머지 노드 보안 그룹 (nodes.dev.example.com)

유형을 NFS로 하고 소스를 각 보안 그룹으로 설정하면 됩니다.

NFS 보안 그룹 추가

EFS 설치

AWS 콘솔의 서비스 -> EFS -> Create file system으로 들어갑니다.

Security Groups에 위에서 만들어둔 NFS 보안 그룹을 추가합니다. 이를 통해 CMD-client와 Kubernetes 노드에서 NFS 서버에 접속 가능합니다.

EFS

Kubernetes 볼륨 및 컨테이너 생성

NFS서버의 /디렉토리를 PV에 등록한 뒤 각 Pod에서 /mymnt디렉토리에 볼륨을 마운트하여 mypodmypod-2nd가 같은 디렉토리를 공유합니다.

PersistentVolume mynfs 생성

$ cat pv-volume-nfs.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mynfs
spec:
  capacity:
    storage: 1Gi
  storageClassName: ""
  accessModes:
    - ReadWriteMany
  nfs:
    server: fs-xxxxxxxx.efs.us-east-x.amazonaws.com
    path: "/"
$ kubectl create -f pv-volume-nfs.yaml
persistentvolume "mynfs" created

PersistentVolumeClaim mynfs 생성

$ cat pvc-volume-nfs.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mynfs
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi
  storageClassName: ""
$ kubectl create -f pvc-volume-nfs.yaml
persistentvolumeclaim "mynfs" created

mypod 생성

$ cat pv-pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: mypod
spec:
  volumes:
    - name: myvol
      persistentVolumeClaim:
       claimName: mynfs
  containers:
    - name: my-container
      image: python
      command: [ "/bin/bash", "-c", "--" ]
      args: [ "while true; do sleep 30; done;" ]
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/mymnt"
          name: myvol
$ kubectl create -f pv-pod.yaml
pod "mypod" created

mypod-2nd 생성

설정 파일 내용은 name을 제외한 모든 내용이 mypod과 동일합니다.

$ cat pv-pod-2nd.yaml
kind: Pod
apiVersion: v1
metadata:
  name: mypod-2nd
spec:
  volumes:
    ...
    ...
$ kubectl create -f pv-pod-2nd.yaml
pod "mypod-2nd" created

파일 공유 테스트

mypod에서 생성한 파일이 mypod-2ndCMD-client에 공유 되는지 확인 합니다.

mypod에서 test_file파일 생성

$ kubectl exec -it mypod -- /bin/bash

root@mypod:/# cd /mymnt
root@mypod:/mymnt# touch test_file

mypod-2nd에서 test_file파일 확인

$ kubectl exec -it mypod-2nd -- /bin/bash

root@mypod-2nd:/# ls /mymnt/
test_file

CMD-client에서 test_file파일 확인

$ sudo mkdir efs
$ sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-xxxxxxxx.efs.us-west-x.amazonaws.com:/ efs

$ ls ./efs/
test_file

마치며

지난번 포스트를 통해 AWS에서 Kubernetes를 설치하는 방법을 알아보았고 이번에는 컨테이너(Pod)와 볼륨(PV,PVC)이 제대로 생성되고 NFS를 통해 컨테이너 간 파일 공유가 정상적으로 이루어지는지 확인하였습니다. AWS 및 Kubernetes 사용에 참고 바랍니다.