일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- terraform
- 후기
- MIG
- Clean Code
- Uptime Check
- pub/sub
- docker
- cicd
- AWS
- 자격증
- cloud armor
- kubernetes
- 우테캠
- Terraform Cloud
- github
- IAM
- direnv
- Java
- gcp
- CentOS
- cloud function
- Python
- devops
- vpc peering
- Google Cloud Platform
- vm
- 보안 규칙
- cloud
- VAGRANT
- interconnect
- Today
- Total
EMD Blog
GCP Filestore 본문
GCP Filestore 사용 전 알고 있으면 좋을 내용들을 정리해 보았음.
NFS(Network File System)는 공유된 원격 호스트의 파일을 로컬에서 사용할 수 있도록 만든 파일 시스템이다. 리눅스 머신에서 이더넷 기반으로 동작하는 가장 기본적인 공유 파일 시스템 중의 하나로 서버/클라이언트 모델로 동작하며, 스토리지 프로토콜을 사용한다. 각 클라이언트들이 NFS의 공유 폴더(Export Path)를 마운트하게 되면 자신의 로컬 파일 시스템을 사용하는 것처럼 여러 클라이언트와 파일을 공유하여 사용할 수 있다.
GCP에서는 NetApp 또는 filestore를 사용할 수 있다 .
Filestore
GCP에서 제공하는 완전관리형 NFS.
액세스 제어
Filestore는 액세스 보안을 위해 Kerberos를 사용하지 않고 IAM을 사용한다. 하지만 IAM은 Filestore 리소스 자체에 대한 액세스 권한을 관리하는 것이여서 파일 공유와 관련된 작업은 POSIX 파일 권한을 사용해야 한다. Filestore에서 파일을 공유 할때는 /etc/exports 설정이 할당되며, /etc/exports 파일에는 NFS 클라이언트가 액세스할 수 있는 NFS 서버의 로컬 물리적 파일 시스템 테이블이 포함(NFS에서 공유하는 디렉토리 정보)되어 있다.
/etc/exports 옵션 중에는 no_root_squash, root_squash 옵션도 존재하는데, 기본적으로 NFS를 Mount하는 것은 클라이언트 VM에서 Filestore 인스턴스 볼륨에 접근하는 것과 같다. 하지만 Filestore 인스턴스 볼륨에 접근할 때는 Filestore 인스턴스의 계정으로 접근하는 것이 아닌 클라이언트 VM계정으로 접근(클라이언트 VM내에 존재하는 Filestore의 디렉터리로 접근)한다. 이때 클라이언트 VM 계정을 Filestore 인스턴스에서는 어떻게 취급할 것이냐를 설정하는 것이 no_root_squash, root_squash 옵션이다. no_root_squash로 설정하면 클라이언트 VM의 root는 Filestore 인스턴스에서 똑같은 root가 되고, root_squash로 설정하면 Filestore 인스턴스에서 nobody와 같은 사용자로 매핑된다.
참고로 Filestore 인스턴스 공유 디렉터리의 기본 권한은 rwxr-xr-x라서 root_squash로 설정할 경우 파일을 쓸 수 없다.
Firestore 인스턴스는 동일한 VPC 네트워크 내 연결을 허용하며, VM에 루트 수준의 읽기 및 쓰기 액세스 권한을 부여한다. 하지만 IP주소 기반으로 액세스 규칙을 생성해 부여하게 되면 VPC 내 전체 액세스(읽기 및 쓰기)가 취소되고 규칙에 적용된 IP만 액세스 가능하게 된다.
기본 사용법
Firestore Instance를 생성하기 전에 instance 생성 명령어의 --file-share 옵션을 정의 해놓은 yaml 파일을 생성한다.
gcloud topic flags-file | Google Cloud CLI Documentation
# file-share.yaml
--file-share:
capacity: 1TB
name: pdf
nfs-export-options:
- access-mode: READ_WRITE
ip-ranges:
- 172.19.1.0/24
squash-mode: NO_ROOT_SQUASH
- -file-share 옵션은 그냥 instance 생성 명령어에 바로 입력해서 사용할 수도 있지만 --file-share 옵션 내에 있는 nfs-export-options 옵션에서 액세스 제어를 배열로 받기 때문에 nfs-export-options 옵션을 사용하려면 yaml 파일을 생성해 flags-file로 지정해줘야 한다. 만약에 nfs-export-options를 사용하지 않을 것이라면 yaml파일을 생성할 필요 없이 instance 생성 명령어에 옵션을 직접 기입하면 된다.
위 yaml 파일에 설정되어 있는 옵션들은 볼륨을 PDF 이름으로 1TB를 생성하며, 172.19.1.0/24 대역폭에서 관리자 권한으로 액세스 할 수 있도록 허용한다는 뜻이다. IP 기반 액세스 제어 구성 문서
api 활성화를 한다.
gcloud services enable file.googleapis.com
이렇게 yaml 파일을 생성했으면 아래 명령어로 Instance를 생성한다.
gcloud filestore instances create | Google Cloud CLI Documentation
gcloud filestore instances create <NAME> \\
--project=<PROJECT_ID> \\
--zone=asia-northeast3-a \\
--region=asia-northeast3 \\
--tier=basic-hdd \\
--network=name="projects/<PROJECT_ID>/global/networks/<VPC>",connect-mode=PRIVATE_SERVICE_ACCESS \\
--flags-file=file-share.yaml
- -flag-file 옵션으로 위에서 만든 file-share.yaml 파일을 지정해 주었다. 경로가 다르다면 해당 경로를 지정해주면 된다. 볼륨 타입은 개발 환경이므로 Basic HDD를 사용한다. 운영환경이라면 요구사항에 맞춰 볼륨타입을 설정한다.
티어 종류 - Service tiers | Filestore | Google Cloud
- -flag-file 옵션은 모든 gcloud 명령어에서 사용할 수 있다. 이 명령어는 모든 옵션들을 yaml이나 json으로 정의해서 사용할 수 있게 해주는 명령어이다. 위의 경우 인스턴스를 생성하기 위해 project, zone, region, tier, network 등의 옵션을 지정했는데 이 옵션들도 yaml파일로 전부 집어넣을 수 있다. 이 옵션을 사용하면 명령어의 복잡한 옵션 구조를 yaml이나 json구조로 표현할 수 있기 때문에 명령어의 내용을 쉽게 파악할 수 있게 된다는 장점이 생긴다. 또한 nfs-export-options 옵션과 같이 gcloud 명령어로 표현할 수 없는 부분들도 표현 가능하게 해준다.
이제 클라이언트 VM에 mount 해야한다. mount의 경우 최적의 성능을 내기 위해서는 n1-standard-8(vCPU 8, MEM 30) 이상의 유형을 사용하는 것이 좋다.
mount 방법에는 mount 명령어를 사용, /etc/fstab 설정, autofs 사용, 이렇게 3가지가 존재한다. mount 명령어의 경우 재부팅하면 마운트가 해제되기 때문에 /etc/fstab 또는 autofs를 사용하는 것이 좋다.
Linux 클라이언트 VM에 /etc/fstab 설정
먼저 NFS를 설치한다.
sudo apt-get -y update &&
sudo apt-get install nfs-common
그 다음 마운트 시킬 폴더를 생성한다.
sudo mkdir -p /mnt/pdf
/etc/fstab에 아래와 같이 설정을 추가한다.
...
10.20.1.10:/pdf /mnt/pdf nfs defaults,_netdev 0 0
<IP_ADDRESS>:/<FILE_SHARE> <MOUNT_POINT_DIRECTORY> nfs <OPTION>,_netdev 0 0 형식으로 적어주면 된다.
<IP_ADDRESS> : Firestore 인스턴스의 IP 주소
<FILE_SHARE> : file-share 이름 (--file-share 옵션 확인)
<MOUNT_POINT_DIRECTORY> : 위에서 생성한 폴더
<OPTION> : 마운트 옵션으로 아래의 경우를 제외하고는 기본 옵션을 유지
- 자동 마운트의 경우 마운트 및 마운트 해제 시 지연 시간 감소시켜야 할 경우 -o tcp 옵션을 사용
- Linux 커널 버전 5.3 이상을 실행하는 클라이언트 VM(NFS를 마운트할 VM)에 대규모 SSD 등급 인스턴스를 마운트할 경우 NFS 성능을 높이기 위해 nconnect 옵션을 사용
이제 /etc/fstab에 설정대로 마운트
sudo mount -a
만약에 VM 인스턴스 Metadata를 사용해 자동으로 Mount하고 싶다하면 아래처럼 Script를 작성한 후 인스턴스 생성 시 옵션으로 지정해주면 된다. Script는 Metadata에 바로 작성해도 되고 파일로 만들어 경로를 지정해도 된다.
#! /bin/bash
sudo apt-get -y update &&
sudo apt-get install nfs-common
sudo mkdir -p /mnt/pdf
sudo mount gw-pdf-nfs-dev.dev.private.gcp.seah.co.kr:/pdf /mnt/pdf
인스턴스 생성 옵션 중 metadata에 위 Script 파일 지정
--metadata=startup-script-url=https://storage.cloud.google.com/vntg-gw-tm-operation-dev/script/script.sh
Windows 클라이언트 VM에 설정
먼저 윈도우 서버로 접속 한다.
GCP - Cloud IAP 통한 접속 | Linux,-Mac에서-IAP를-사용해-Windows-Server-RDP-접속
그 다음 Powershell을 사용해 NFS 클라이언트를 설치한다. (관리자 권한을 실행)
Install-WindowsFeature -Name NFS-Client
설치가 완료됐으면 인스턴스를 재시작한다.
NFS에 클라이언트에 사용되는 사용자 ID를 구성하기 위해 AnonymousUid와 AnonymousGid를 생성한다. (Powershell)
New-ItemProperty -Path "HKLM:\\SOFTWARE\\Microsoft\\ClientForNFS\\CurrentVersion\\Default" `
-Name "AnonymousUid" -Value "0" -PropertyType DWORD
New-ItemProperty -Path "HKLM:\\SOFTWARE\\Microsoft\\ClientForNFS\\CurrentVersion\\Default" `
-Name "AnonymousGid" -Value "0" -PropertyType DWORD
사용자 ID를 생성했으면 NFS 서비스를 재시작한다.
nfsadmin client stop
nfsadmin client start
마지막으로 볼륨을 마운트 한다. Command prompt 창을 열어 아래 명령어를 입력한다.
mount 10.20.1.10:/pdf z:
형식은 mount <IP_ADDRESS>:/<FILE_SHARE> <DRIVE_LETTER>: 이다.
<IP_ADDRESS> : Firestore 인스턴스의 IP 주소
<FILE_SHARE> : file-share 이름 (--file-share 옵션 확인)
<DRIVE_LETTER> : 드라이브 알파벳 명으로, 위처럼 z로 지정하면 마운트된 드라이브는 z드라이브가 됨.
위 처럼 진행한 후 Windows Server를 재부팅 해보면 Mount가 해제되어 있다. 위와 똑같은 방법으로 진행했는데도 자동으로 마운트 된다는 사람도 몇몇 있던데 다른 설정이 있는지 더 확인해봐야 할 듯. 일단 Mount 명령어에 자동으로 마운트 해주는 옵션이 있는지 확인해 봤지만 옵션으로는 제공하지 않는 것으로 확인된다.
하지만 GCP 사용하고 있다면 위 내용을 metadata의 시작 스크립트로 등록해 재시작 시 자동으로 마운트 되도록 설정할 수 있다. Using startup scripts on Windows VMs | Compute Engine Documentation | Google Cloud
startup script의 경우 LocalSystem 계정으로 실행시키기 떄문에 대부분의 권한을 포함하고 있어 위 스크립트를 문제없이 실행 시킬 수 있다. 먼저 위 스크립트를 Powershell 과 cmd 기준으로 분리한 후 직접 Metadata에 삽입하거나 파일로 만들어 경로를 지정해주면 된다. 파일로 만들때는 Powershell의 경우 .ps1, cmd의 경우 .cmd를 꼭 붙여주어야 인식한다.
script.ps1
Install-WindowsFeature -Name NFS-Client
New-ItemProperty -Path "HKLM:\\SOFTWARE\\Microsoft\\ClientForNFS\\CurrentVersion\\Default" `
-Name "AnonymousUid" -Value "0" -PropertyType DWORD
New-ItemProperty -Path "HKLM:\\SOFTWARE\\Microsoft\\ClientForNFS\\CurrentVersion\\Default" `
-Name "AnonymousGid" -Value "0" -PropertyType DWORD
nfsadmin client stop
nfsadmin client start
script.cmd
mount gw-pdf-nfs-dev.dev.private.gcp.seah.co.kr:/pdf z:
Powershell 실행 후 CMD 명령어를 실행해야하기 때문에 인스턴스 생성시 아래와 같이 옵션을 지정해주면 된다.
--metadata=sysprep-specialize-script-url=https://storage.cloud.google.com/vntg-gw-tm-operation-dev/script/script.ps1,windows-startup-script-url=https://storage.cloud.google.com/vntg-gw-tm-operation-dev/script/script.cmd
sysprep-specialize-script-url는 windows-startup-script-url 보다 먼저 실행된다.
Using startup scripts on Windows VMs | Compute Engine Documentation | Google Cloud
만약 script를 사용하지 않는다면 GUI로 로그인 시 자동으로 마운트 하게 설정할 수 있다.
내 PC 우클릭 → 네트워크 드라이브 연결
폴더에 ₩₩<IP_ADDRESS>₩<FILE_SHARE> 형식으로 입력 → 로그인할 때 다시 연결 체크 → 마침
이렇게 하면 아래 처럼 연결되는 것을 확인할 수 있다.
이제 재부팅하고 다시 확인해보면 똑같이 그대로 연결되어 있는 것을 확인할 수 있다.
테스트
현재 같은 드라이브를 리눅스 서버와 윈도우 서버에 마운트 해두었다. 윈도우에서 파일을 업로드하면 리눅스 서버에서 표시가 될 것이다.
테스트용 텍스트 파일을 업로드한다. 그 다음 리눅스 서버에서 마운트한 디렉토리를 확인한다.
$ ls -l /mnt/pdf
total 20
drwx------ 2 root root 16384 Dec 30 14:03 lost+found
-rwxr-xr-x 1 root root 5 Dec 30 16:47 test.txt
정상적으로 연결된 것을 볼 수 있다.
신뢰성
Architecture | Filestore | Google Cloud
기본 및 대규모 인스턴스 : 영역별 리소스
엔터프라이즈 인스턴스 : 리전별 리소스
'Public Cloud > GCP' 카테고리의 다른 글
GCP Cloud Functions (0) | 2022.09.03 |
---|---|
GCP Pub/Sub (0) | 2022.09.03 |
[GCP] Compute Engine에 대해 알아보자(5) - 스테이트풀 MIG/메타데이터 및 IP (0) | 2022.03.01 |
[GCP] Compute Engine에 대해 알아보자(4) - 스테이트풀 MIG/리소스 정리 (0) | 2022.02.05 |
[GCP] Compute Engine에 대해 알아보자(3) - 스테이트풀 MIG/디스크 구성 (0) | 2022.01.27 |