[NCP] InitScript와 ncloud CLI를 활용한 NAS 볼륨 ACL에 노드 자동 등록 기능 구현하기

NewNewDaddy·2024년 2월 20일
0

Ncloud

목록 보기
8/8
post-thumbnail

0. INTRO

  • 쿠버네티스 클러스터를 운영하다보면 EFS나 NAS와 같은 네트워크 스토리지를 볼륨으로 마운트하게된다. 이때, 볼륨이 정상적으로 마운트 되려면 서비스가 작동되는 서버(정확히 말하면 노드)들이 해당 네트워크 스토리지에 대해 접근 권한이 있어야 한다. 그래야 해당 노드에 특정 서비스 Pod가 떴을 때 NAS 볼륨이 정상적으로 마운트 될 수 있기 때문이다. 그렇지 않다면 접근 권한이 없다는 에러가 뜨면서 Pod의 상태가 계속 ContainerCreating 상태로 머물러 있게 된다.
  • Naver Cloud Platform에서 NKS 클러스터를 운영하면서 불편했던 점 중 하나가 노드가 추가될 때 NAS 접근 정책(ACL)에 자동으로 해당 노드가 추가가 되지 않는다는 점이었다. 그래서 클러스터의 노드가 늘어날 때마다 UI에서 수동으로 해당 서버를 ACL에 추가해주어야하는 번거로움이 있었다.
  • 이번 글은 Kubernetes Init Script와 Ncloud CLI를 활용해 이 과정을 자동화한 내용을 다뤄볼 것이다.

1. Init Script

  • NKS에서는 Init Script 기능을 지원해주는데 이는 사용자가 작성한 특정 shell script가 Daemonset 리소스를 통해 모든 노드들에 적용될 수 있도록 해주는 기능이다. 따라서 shell script가 동작하는 노드 서버가 NAS의 ACL에 등록될 수 있도록 script만 잘 짜면 내가 구현하고자 했던 기능을 구현할 수 있을 것이라 생각했다.
  • 우선은 Init Script 관련 리소스를 생성해준다.(민간존, 공공존 모두 설치 과정은 동일하므로 현재 운영중인 NKS가 위치한 공공존을 기준으로 하겠습니다.)
## init script DaemonSet 생성
> kubectl apply -f https://raw.githubusercontent.com/NaverCloudPlatform/nks-examples/main/examples/initscript/gov/kr.yml

## 생성 확인
> kubectl get daemonset init-script -n kube-system

    NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    init-script   5         5         5       5            5           <none>          23h

## 생성 후 동작 확인
> kubectl logs -l name=init-script -n kube-system

    kubernetes service
    !!! startup-script succeeded!
    kubernetes service
    !!! startup-script succeeded!
    kubernetes service
    !!! startup-script succeeded!
    kubernetes service
    !!! startup-script succeeded!
    kubernetes service
    !!! startup-script succeeded!

2. Ncloud CLI

  • Ncloud CLI는 AWS의 awscli와 같이 ncloud ~~로 시작하는 CLI 명령어를 통해 NCP의 리소스들을 조작할 수 있도록 도와주는 명령이다.
  • NCLOUD CLI DOCS 에서 설치 및 configure 설정 등 내용을 확인 할 수 있으며 유념해야 할 것은 관련 내용이 들어있는 zip파일의 경우 wget으로 받아도 압축 해제가 안되므로 로컬에 수동으로 받아 압축을 풀어 관련 파일을 작업하는 서버로 import 해와야하는 번거로움이 있다.
  • ncloud cli 설치 후 작업에 필요한 명령어는 NAS 볼륨 ACL에 서버를 추가해주는 아래 명령어이다.
./ncloud vnas addNasVolumeAccessControl \
--regionCode KR \
--nasVolumeInstanceNo [NAS 볼륨 번호] \
--serverInstanceNoList [Server 인스턴트 번호]
  • NAS 볼륨 번호는 아래와 같이 확인할 수 있다.

3. Server Metadata API

  • 서버들에 대한 Metadata를 모아두어 현재 서버의 정보들을 API로 조회할 수 있는 경로가 있다.(Metadata-Docs)
  • 아래 명령을 통하여 현재 서버의 인스턴스 번호를 확인할 수 있다.
curl http://169.254.169.254/latest/meta-data/serverInstanceNo

4. Shell Script 작성

  • 위에서 알아본 명령어들을 조합하여 새롭게 추가된 노드에서 작동할 shell script(nas-autoadd.sh)를 만들어 볼 것이다.
  • Init Script는 특정 shell script를 Daemonset InitScript의 환경변수에 등록하여 실행되도록 하는 구조이기 때문에 추가되는 노드의 server instance가 생성될 때, NAS 볼륨 ACL에 자동 등록되도록 하는 Ncloud CLI 스크립트를 위에서 알아본 명령어들을 조합하여 만들 수 있을 것이다.
  • 작동 순서
    1. 변수 선언
    2. ncloud cli 설치를 위한 파일들 git clone
    3. ncloud config 파일 생성 및 configure 내용 등록
    4. ncloud 명령 파일 위치로 이동 후 명령어 실행
    5. 실행 결과 출력
    6. ncloud cli 관련 설치 파일 삭제

< nas-autoadd.sh >

#!/bin/bash

# ncloud cli configure 기본 경로
CONFIG_FILE="$HOME/.ncloud/configure"
# NCP server instance 번호
INSTANCE_NO="$(curl http://169.254.169.254/latest/meta-data/serverInstanceNo)"
# NAS volume instance 번호 (등록하려는 NAS에 맞게 수정)
NAS_NO="2400790"

# ncloud cli file clone & 권한 설정
cd $HOME
git clone https://github.com/Hyunsoo-Ryan-Lee/ncloud-cli.git
cd $HOME/ncloud-cli/cli_linux
chmod +x $HOME/ncloud-cli/cli_linux/ncloud
chmod +x $HOME/ncloud-cli/cli_linux/jre8/bin/java

# ncloud cli config 파일 유무 확인 후 생성
if [ ! -f "$CONFIG_FILE" ]; then
    mkdir -p "$(dirname "$CONFIG_FILE")"
    touch "$CONFIG_FILE"
fi

# ncloud configuration 내용 등록
cat <<EOT >> "$CONFIG_FILE"
[DEFAULT]
ncloud_access_key_id = 
ncloud_secret_access_key = 
ncloud_api_url = https://ncloud.apigw.gov-ntruss.com
EOT

# ncloud 명령어 위치로 이동
cd $HOME/ncloud-cli/cli_linux

# Server instance를 NAS ACL에 등록하는 명령어 실행
./ncloud vnas addNasVolumeAccessControl \
--regionCode KR \
--nasVolumeInstanceNo $NAS_NO \
--serverInstanceNoList $INSTANCE_NO

# 실행 결과 출력
echo "INSTANCE($INSTANCE_NO) HAS BEEN ADDED TO NAS($NAS_NO)"

# 불필요한 파일들 삭제
rm -rf $HOME/ncloud-cli CONFIG_FILE

5. Init Script에 적용

  • 아래 명령을 통해 Daemonset InitScript의 환경변수에 위에서 작성한 shell script를 등록해주면 새로운 node가 추가될 때마다 추가된 server에서 shell script가 자동으로 작동되어 NAS ACL에 추가된 서버가 등록된다.
> kubectl set env daemonset/init-script -n kube-system STARTUP_SCRIPT=$(base64 [nas-autoadd.sh 파일 경로] -w 0)

## 예시
> kubectl set env daemonset/init-script -n kube-system STARTUP_SCRIPT=$(base64 [/workspace/nks/nas-autoadd.sh] -w 0)

    daemonset.apps/init-script env updated

6. 참고 자료

profile
데이터 엔지니어의 작업공간 / #PYTHON #SPARK #AWS #NCLOUD

1개의 댓글

안녕하세요, 네이버 클라우드 플랫폼입니다.
네이버클라우드의 기술 콘텐츠 리워드 프로그램 '이달의 Nclouder(2월)' 도전자로 초대합니다 :)

네이버 클라우드 플랫폼 서비스와 관련된 모든 주제로 3/7(목) 23시까지 신청 가능합니다. (*2월 작성 콘텐츠 한정 신청 가능)

Ncloud 크레딧을 포함한 다양한 리워드가 준비되어 있으니 많은 관심 부탁드립니다!

답글 달기