본문 바로가기
NCloud(NCP)

[Naver Cloud Platform] (공공기관용) 관리형 Kubernetes Service에서 Velero를 이용한 PV 백업 및 복구

by 간식주인 2023. 8. 30.

요건

 - Naver Cloud Platform 공공 플랫폼의 Kubernetes Service에서 Velero를 이용한 PV 백업 및 복구

 

환경

  • Kubernetes Service Cluster(최소 1개 노드 이상)
  • Kubernetes에 접속하기 위한 NCloud Server 1대(운영체제 무관)

목차

  1. Naver Cloud Platform 공공 플랫폼 Kubernetes Service 생성
  2. kubectl 설치 및 Kubernetes Service 접속 설정
  3. Velero 플러그인을 이용한 PV 백업 및 복구

주의 사항

 - 사전에 VPC, Subnet, LB Private 서브넷이 생성되어 있어야 합니다.

 - Naver Cloud Platform 공공기관용 계정의 경우 일반 기업 및 사용자는 생성할 수 없으며 별도의 공공기관 증빙이 필요합니다.


0. Naver Cloud Platform의 Kubernetes Service란?

사용자가 서버를 직접 배포하여 직접 클러스터를 구축하지 않아도 Naver Cloud Platform에서 제공하는 관리형 쿠버네티스 서비스를 통해 손쉽게 쿠버네티스 클러스터를 사용할 수 있습니다.

 

서비스 특징

  • 작업자 노드와 관리형 제어 영역 간에 안전한 통신을 제공하고, 작업자 노드를 빠르게 프로비저닝하여 애플리케이션 확장이 가능합니다. 온디맨드(On-demand) 업그레이드 및 패치를 제공합니다.
  • 표준 Kubernetes 준수 서비스이므로, 네이버 클라우드 플랫폼에서 관리하는 애플리케이션은 표준 Kubernetes 환경에서 관리하는 애플리케이션과 호환됩니다.
  • Ingress와 CSI(NAS)등 Naver Cloud Platform에서 제공하는 다른 서비스들과 다양한 연계가 가능합니다.

 

1. Naver Cloud Platform 공공 플랫폼 Kubernetes Service 생성

먼저 Naver Cloud Platform(공공기관용)에서 관리형 쿠버네티스 클러스터 생성을 위해 서비스 생성을 진행합니다.

Services > Kubernetes Service > "생성하기"

 

미리 생성해둔 VPC, Subnet, LB Private 정보를 바탕으로 쿠버네티스 클러스터 생성을 위한 정보를 기입합니다.

*VPC, Subnet, LB Private를 미리 생성하지 않았다면 당황하지 않고 옆에 생성 버튼을 눌러 생성합니다.

*생성한 워커노드에 직접 접속해야되므로 public Subnet으로 생성합니다.

 

클러스터 설정에 이어서 노드풀 설정을 진행합니다. (노드 수의 경우 이번에는 1대만 사용할 예정입니다.)

이전에는 Kubernetes Label, Taint 기능이 없었던 것 같은데 기능이 향상되는게 체감이 되는 것 같습니다. 👍

 

생성될 워커노드에 접속할 인증키를 설정합니다.

 

최종확인 및 생성하기를 눌러 쿠버네티스 클러스터를 생성합니다. (생성에는 다소 시간이 소요될 수 있습니다.)

 

 

2. kubectl 설치 및 Kubernetes Service 접속 설정

쿠버네티스 클러스터 접속을 위해 생성한 서버에 kubectl 명령어를 설치합니다.

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl

 

생성한 쿠버네티스 클러스터에 접속하기위해 서버에서 설정을 진행합니다.

 - 일반적인 방법으로는 접속이 불가하고 별도의 kubeconfig 파일을 통해 접속이 가능합니다.

 

 

IAM 인증을 위한 ncp-iam-authenticator 설치

  • ncp-iam-authenticator 바이너리 다운로드 및 실행 권한 추가

curl -o ncp-iam-authenticator -L https://github.com/NaverCloudPlatform/ncp-iam-authenticator/releases/latest/download/ncp-iam-authenticator_linux_amd64
chmod +x ./ncp-iam-authenticator

 

  • ncp-iam-authenticator 바이너리 파일 실행을 위한 PATH 추가 및 전역 변수에 등록

*ncloud, root 계정에 상관없이 실행될 수 있도록 /etc/profile에 등록합니다.

*root 계정 기준

mkdir -p $HOME/bin && cp ./ncp-iam-authenticator $HOME/bin/ncp-iam-authenticator && export PATH=$PATH:$HOME/bin
mkdir -p /home1/ncloud/bin && cp ./ncp-iam-authenticator /home1/ncloud/bin/ncp-iam-authenticator
echo 'export PATH=$PATH:$HOME/bin' >> /etc/bash.bashrc

 

  • ncp-iam-authenticator 바이너리 동작 확인(계정 ncloud, root)

 

ncp-iam-authenticator를 통해 IAM 인증이 적용된 kubeconfig 생성

  • ~/.nlcoud 디렉터리 생성

mkdir -p ~/.ncloud
mkdir -p /home1/ncloud/.ncloud
cd ~/.ncloud

 

  • ~/.ncloud/configure 파일 생성

ncloud_access_key_id = 해당 계정의 Access Key
ncloud_secret_access_key = 해당 계정의 Secret Key

vi ~/.ncloud/configure


[DEFAULT]
ncloud_access_key_id = 계정에서 확인한 Access Key
ncloud_secret_access_key = 계정에서 확인한 Secret Key
ncloud_api_url = https://ncloud.apigw.gov-ntruss.com

[project]
ncloud_access_key_id = 계정에서 확인한 Access Key
ncloud_secret_access_key = 계정에서 확인한 Secret Key
ncloud_api_url = https://ncloud.apigw.gov-ntruss.com
cp ~/.ncloud/configure /home1/ncloud/.ncloud/configure

* access key와 secret key는 홈페이지의 마이페이지 > 인증키 관리 에서 확인할 수 있습니다.

  • ncp-iam-authenticator create-kubeconfig 명령어를 사용하여 kubeconfig 파일 생성

ncp-iam-authenticator create-kubeconfig --region KR --clusterUuid "확인한 cluster UUID" --output kubeconfig.yaml

*클러스터 UUID는 생성한 쿠버네티스 클러스터에서 확인할 수 있습니다.

 

  • kubeconfig alias 설정 및 사용(이후 명령어는 해당 alias 설정으로 진행)

echo "alias k='kubectl --kubeconfig=/kubeconfig.yaml'" >> /etc/bash.bashrc 
echo "KUBE_CONFIG='/kubeconfig.yaml'" >> /etc/bash.bashrc 
source /etc/bash.bashrc
k get node

이것으로 Naver Cloud Platform의 쿠버네티스 클러스터를 사용하기 위한 설정은 완료가 되었습니다.

 

3. Velero 플러그인을 이용한 PV 백업 및 복구

Velero는 Kubernetes 클러스터 내에서 애플리케이션과 데이터를 백업하고 복원하기 위한 오픈 소스 도구입니다. 이를 위해 Velero는 클러스터 내의 리소스와 볼륨 데이터를 캡처하고 백업 파일로 저장하며, 이러한 백업을 사용하여 애플리케이션과 데이터를 원래 상태로 복원할 수 있습니다.

 

Velero 동작 방식

  • Velero 클라이언트는 Kubernetes API 서버를 호출하여 백업 개체를 생성합니다.
  • BackupController는 새 Backupobject를 확인하고 유효성 검사를 수행합니다.
  • BackupController가 백업 프로세스를 시작합니다. API 서버에 리소스를 쿼리하여 백업할 데이터를 수집합니다.
  • BackupController는 객체 스토리지 서비스(예: NCloud Object Storage)를 호출하여 백업 파일을 업로드합니다.

 

 

Velero 플러그인 설치

  • Velero 플러그인 다운로드 및 바이너리 파일 실행을 위한 /usr/local/bin 등록

cd /tmp
wget https://github.com/vmware-tanzu/velero/releases/download/v1.10.3/velero-v1.10.3-linux-amd64.tar.gz
tar -xvzf velero-v1.10.3-linux-amd64.tar.gz
sudo mv velero-v1.10.3-linux-amd64/velero /usr/local/bin/velero

 

  • Velero 명령어 사용시 필요한 Secret 등록
vi /cloud-credential

# 수도권 기준 cloud-credential
[default]
aws_access_key_id=계정에서 확인한 Access Key
aws_secret_access_key=계정에서 확인한 Secret Key
region=GOV

 

  • 백업 파일 저장을 위한 Object Storage 생성

Services > Object Storage 

 

  • 명령어를 통한 Velero 서버 설치

*kubeconfig path 변수 값 등록(설정 되어있으면 생략)

KUBE_CONFIG=생성한 kubeconfig.yaml 위치
ex) KUBE_CONFIG=/kubeconfig.yaml

*수도권 기준(bucket 명의 경우 위에서 생성한 이름으로 사용)

velero install \
--kubeconfig $KUBE_CONFIG \
--provider aws \
--bucket gov-velero-backup \
--plugins velero/velero-plugin-for-aws:v1.6.2,nks.private-ncr.gov-ntruss.com/velero-plugin-for-ncloud:v0.0.7 \
--backup-location-config region=kr,s3ForcePathStyle="true",s3Url=https://kr.object.private.gov-ncloudstorage.com \
--use-volume-snapshots=false \
--secret-file=/cloud-credential

 

  • velero를 기본 스냅샷 프로바이더로 지정

velero --kubeconfig $KUBE_CONFIG snapshot-location create default --provider ncloud/volume-snapshotter-plugin

 

 

사용자 애플리케이션 배포 및 접속 확인

  • Velero 플러그인을 사용한 백업 및 복구를 테스트하기 위해 사용자 애플리케이션을 생성합니다.

# nginx-example.yaml
---
apiVersion: v1
kind: Namespace
metadata:
  name: nginx-example
  labels:
    app: nginx
---

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-log-pvc
  namespace: nginx-example
  labels:
    app: nginx
spec:
  storageClassName: nks-block-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: nginx-example
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
        - name: nginx-logs
          persistentVolumeClaim:
           claimName: nginx-log-pvc
      containers:
      - image: io.kr.ncr.ntruss.com/nks/nginx:1.9
        name: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/var/log/nginx"
          name: nginx-logs
          readOnly: false
k apply -f nginx-example.yaml

 

  • 생성한 nginx pod에 접속할 수 있도록 NodePort 타입의 서비스를 생성합니다.
# nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: nginx-example
  labels:
    app: nginx
spec:
  type: NodePort
  selector:
      app: nginx
  ports:
   - port: 80
     targetPort: 80
     nodePort: 30200

 

  • nginx에 접속하기 위해 자동으로 생성된 쿠버네티스 클러스터 ACG에 본인 아이피와 노드포트(30200)를 인바운드에 허용합니다.

 

  • [워커노드아이피]:30200를 통해 nginx에 접속되는지 확인합니다.

 

Velero 플러그인을 이용한 백업 및 복구

  • 배포된 pod를 통해 내부의 웹 로그를 확인합니다.

# pod명 확인
k get po -n nginx-example

 

k exec 확인한pod명 -n nginx-example -- cat /var/log/nginx/access.log

ex) k exec nginx-deploy-777fbd6cdf-gdczt -n nginx-example -- cat /var/log/nginx/access.log

 

  • velero 명령어를 사용하여 현재 클러스터 상태의 백업 생성

velero --kubeconfig $KUBE_CONFIG backup create nginx-backup --selector app=nginx

 

  • 복원을 위한 nginx-example 네임스페이스 삭제

k delete namespace nginx-example

nginx-example 네임스페이스의 모든 오브젝트가 삭제된 것을 확인합니다.

 

  • Velero를 통한 복원

velero --kubeconfig $KUBE_CONFIG restore create --from-backup nginx-backup
velero --kubeconfig $KUBE_CONFIG restore describe [복구요청ID]

 

복구요청 이후 nginx-example 네임스페이스의 오브젝트들이 복구된 것을 확인합니다.

k get all -n nginx-example
k get pvc -n nginx-example
k get pv

 

PV에 대한 복구가 잘 이루어졌는지 확인하기 위해 배포된 pod의 웹로그가 복구를 수행하기전의 내용과 같은지 확인합니다.

k exec 확인한pod명 -n nginx-example -- cat /var/log/nginx/access.log

ex) k exec nginx-deploy-777fbd6cdf-gdczt -n nginx-example -- cat /var/log/nginx/access.log

확인 결과 동일한 것을 알 수 있습니다.

 

  • Naver Cloud Platform Object Storage 확인

velero를 통해 백업/복구 요청한 파일들은 velero 서버 설치 시 설정한 bucket에 업로드 되어있습니다.

backup 폴더에는 백업 로그 및 클러스터 리소스와 PV 관련 json 파일들이 저장되어 있고,

restores 폴더에는 복구 로그와 결과가 저장되어 있습니다.

 

참고) Velero와 ETCD백업 차이점

특징 Velero ETCD 백업
대상 데이터 애플리케이션 및 리소스 데이터 Kubernetes 클러스터의 중요한 상태와 설정 데이터
백업 유형 애플리케이션의 구성, 상태, 리소스 데이터 백업 Kubernetes 클러스터의 설정 정보, 상태 데이터 백업
데이터 범위 애플리케이션 및 볼륨 데이터 클러스터 설정, 상태 정보, 컨피그맵, 시크릿 등
데이터 저장소 클러스터 외부 저장소에 백업 데이터 저장 etcd 데이터베이스 내에 저장
목적 애플리케이션 백업과 복원 클러스터 운영 및 복원 보완
중요성 애플리케이션 상태와 설정의 중요성 강조 클러스터의 중요한 상태와 설정 데이터 중요성 강조
사용 사례 애플리케이션 전체적인 백업과 복원 클러스터 복원, 운영 관리

Velero는 Kubernetes 클러스터 내의 애플리케이션 및 리소스 데이터를 중심으로 백업과 복원을 지원하는 도구이며, etcd 백업은 Kubernetes 클러스터의 중요한 상태와 설정 데이터를 백업하여 클러스터 운영과 복원을 보다 안정적으로 관리하는 데 사용되는 도구입니다.

 

 

 

 

[여담]

쿠버네티스와 관련된 다양한 플러그인 중에 Velero에 대해 알아보았는데요, 간편하게 클러스터 리소스와 PV에 대한 데이터를 백업할 수 있어서 좋았던 것 같습니다.

다음에는 더 다양한 쿠버네티스 플러그인으로 찾아뵙겠습니다 😊

 

 

 

참고

https://velero.io/docs/main/how-velero-works/