NaverCloud NKS와 Object Storage 연동하기
Object Storage는 File Storage나 Block Storage가 아니기 때문에 일반적인 방식으로 Kubernetes Service에 사용할 수 없다. 그렇지만 부득이한 사정때문에...사용해야 할 경우를 대비하여 미리 정리한다.
1. Object Storage란?
NaverCloud에서 제공하는 스토리지 상품 중 한 가지이다.
2. 연동 방법
(1) Object Storage -> s3fs 혹은 goofys를 통해 워커 노드에 file system으로 마운트 -> hostpath로 사용
(2) Object Storage -> 파드 마운트 시 s3fs 혹은 goofys 이미지를 통해 파드 내에 file system으로 마운트
두 가지 정도가 존재할 듯 하다. (1)의 경우 사용이 편리하다는 장점이 있지만 사용하려는 노드마다 마운트를 해주어야 하고, 해당 노드에만 스케줄링이 가능하다. (2)의 경우 마운트 이슈에서는 조금 자유롭지만 s3fs, goofys의 이미지를 구해야하고 사이드카 컨테이너를 넣어줘야해서 쿠버 상에서 조금 더 복잡한 작업을 해주어야 한다.
나는 Object Storage도 이에 따른 툴들도 제대로 사용해 본적이 없으므로 둘 다 진행해보려고 한다.
3. 연동
(1) 노드에 마운트하여 사용
- 사용 할 오브젝트 스토리지 등록
pod-mount라는 오브젝트 스토리지를 하나 생성해주었다.
- 원하는 노드에 goofys 설치
$ apt-get install -y fuse #goofys 사용하기 위해 필요한 패키지
$ wget https://github.com/kahing/goofys/releases/latest/download/goofys
$ chmod 755 goofys
$ my goofys /usr/bin/
$ goofys
Error: goofys takes exactly two arguments.
NAME:
goofys - Mount an S3 bucket locally
USAGE:
goofys [global options] bucket[:prefix] mountpoint
VERSION:
0.24.0-45b8d78375af1b24604439d2e60c567654bcdf88
남덜은,, 어케하는지 모르겠고 나는 그냥 git(https://github.com/kahing/goofys)에서 리눅스꺼 찾아서 대충 했따,,^^
- goofys를 통해 object storage 마운트
일단 credentials 파일을 만든다.
$ mkdir /root/.aws
$ vi /root/.aws/credentials
[default]
aws_access_key_id = access_key
aws_secret_access_key = secret_key
해당 키는 네이버클라우드 포탈 (콘솔 아님) > 마이페이지 > 계정 관리 > 인증 관리에서 확인 가능하당.
$ goofys --endpoint https://kr.object.ncloudstorage.com/ pod-mount /pod-mount
(네이버클라우드 objectstorage 주소, 버킷 이름, 마운트 위치)
성공 실패는 로그를 통해 확인할 수 있따.
$ tail -f /var/log/syslog
Nov 19 17:21:20 [node-name] /usr/bin/goofys[129478]: main.INFO File system has been successfully mounted.
연동 여부도 확인.
$ cd /pod-mount
$ /pod-mount# ls
$ /pod-mount# mkdir node-1
$ /pod-mount# ls
node-1
짜잔~
현재는 임시 마운트이기 때문에 /etc/fstab 아래에도 등록해준다.
$ vi /etc/fstab
goofys#pod-mount /pod-mount fuse _netdev,allow_other,--file-mode=0666,--dir-mode=0777 0 0
- 파드 마운트
마운트 해준 위치를 호스트패스로 사용하는 파드를 하나 생성해본다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
spec:
replicas: 1
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: nginxdemos/hello:plain-text
ports:
- containerPort: 80
volumeMounts:
- name: log
mountPath: /var/log/nginx
volumes:
- name: log
hostPath:
path: /pod-mount/nginx-log
type: Directory
콘솔내에서 확인해본다.
문제점은... 느리다 ㅋㅋ.. 이걸 스토리지로 봐도 되는건가? 싶을정도로 양방향 동작이 느리다.
(2) 파드에 마운트하여 사용