Kubernetes Namespace 또는 Pod 의 리소스 및 볼륨 백업하기 (Velero)

리눅스/DaaS|2024. 7. 22. 15:18
반응형

쿠버네티스 환경에서는 백업 및 복원을 위해 다양한 도구를 사용할 수 있습니다. 대표적인 도구로는 Velero, Kopia 가 있습니다. 이것은 쿠버네티스 클러스터의 백업, 복원, 마이그레이션을 위한 오픈 소스 도구입니다.

백업 파일을 저장하기 위해서는 S3 호환 스토리지 (예: AWS S3, MinIO 등) 가 필요한데, 여기서는 MinIO 를 예로 들어 설명합니다.

 

 

1. Velero 클라이언트 설치

 

Velero 클라이언트를 설치하려면 Velero GitHub 릴리즈 페이지에서 최신 버전을 다운로드하고 설치합니다.

 

1) 최신 버전 확인 및 다운로드

# export VELERO_VERSION=$(curl -s https://api.github.com/repos/vmware-tanzu/velero/releases/latest | jq -r .tag_name)

 

2) Velero 다운로드

# wget https://github.com/vmware-tanzu/velero/releases/download/${VELERO_VERSION}/velero-${VELERO_VERSION}-linux-amd64.tar.gz

 

3) 압축 해제 및 이동

# tar -xvf velero-${VELERO_VERSION}-linux-amd64.tar.gz

# mv velero-${VELERO_VERSION}-linux-amd64/velero /usr/local/bin/

 

4) 설치 확인

# velero version

Client:
Version: v1.14.0
Git commit: 2fc6300f2239f250b40b0488c35feae59520f2d3
<error getting server version: no matches for kind "ServerStatusRequest" in version "velero.io/v1">

 

아래에서 서버 컴포넌트를 설치할 예정이므로, 출력된 에러는 무시해도 됩니다.

 

 

2. Velero 서버 컴포넌트 설치

 

Velero 는 Kubernetes 리소스 설정 및 볼륨 데이터 백업이 가능하지만, 볼륨에 포함되지 않은 컨테이너 내에 추가 생성된 파일은 백업이 되지 않습니다.

Velero 서버 컴포넌트 사용시 S3 호환 스토리지 (예: AWS S3, MinIO 등) 가 필요한데, 여기서는 MinIO 를 예로 들어 설명합니다.

MinIO 설치 방법은 별도 포스팅을 참고해 주세요.

(https://sysdocu.tistory.com/1942)

 

1) MinIO 자격 증명 파일 생성

Velero 가 MinIO 에 접근할 수 있도록 자격 증명 파일을 생성합니다. credentials-velero 라는 파일을 다음과 같이 작성합니다.

설정에 aws 라는 문구가 있어도 무시해도 됩니다. S3 를 기준으로 만들어졌으나 MinIO 스토리지도 호환됩니다.

# vi credentials-velero.ini

[default]
aws_access_key_id = minioadmin
aws_secret_access_key = minioadmin

 

(어디에서든)

MinIO 버킷을 생성 합니다.

# wget https://dl.min.io/client/mc/release/linux-amd64/mc

# chmod +x mc

# mv mc /usr/local/bin/

# mc alias set sysdocu http://115.68.249.52:9000 minioadmin minioadmin

# mc mb sysdocu/mybucket

 

2) Velero 서버 설치

(마스터 노드에서)

MinIO 버킷과 서버 IP, Port 를 이용하여 Velero 서버를 설치합니다.

# velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.10.0 \
    --bucket mybucket \
    --secret-file ./credentials-velero.ini \
    --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://115.68.249.52:9000 \
    --snapshot-location-config region=minio \
    --use-node-agent \
    --privileged-node-agent \
    --uploader-type=kopia

 

provider 가 aws 인 이유는 MinIO 는 S3 호환 스토리지이기 때문입니다.

맨 아래 세개 옵션은 Kopia 형식으로 백업이 가능하다고 하고 옵션은 존재하지만, 실제로 해보니 컨테이너 내 임시파일까지는 백업이 되지 않습니다.

추후 방법 확인시 업데이트 하겠습니다.

 

3) 설치 확인

# kubectl get pods -n velero
NAME                      READY   STATUS    RESTARTS   AGE
velero-6d798fd6f9-7drfh   1/1     Running   0          29s

 

서버 버전도 잘 표시 됩니다.

# velero version
Client:
Version: v1.14.0
Git commit: 2fc6300f2239f250b40b0488c35feae59520f2d3
Server:
Version: v1.14.0

 

 

3. Velero 백업 및 복원

 

Velero 를 설치한 후에는 백업 및 복원 작업을 수행할 수 있습니다.


1) 백업 생성

형식) velero backup create <backup-name> --include-namespaces <namespace-name>

# velero backup create sysdocu-full-backup --include-namespaces sysdocu

 

위 명령어는 지정된 네임스페이스 내의 모든 리소스를 백업합니다.

이 명령어를 실행하면 해당 네임스페이스에 있는 모든 Pod, Service, Secret, ConfigMap, PersistentVolumeClaim 등의 Kubernetes 리소스가 백업됩니다.

 

특정 Pod 하나에 관련된 리소스만 백업하려면 --selector 옵션만 추가하여 다음과 같이 명령을 실행합니다.

형식) velero backup create <backup-name> --include-namespaces <namespace-name> --selector <selector-value>

# velero backup create nginx-backup --include-namespaces sysdocu --selector app=nginx

 

참고로, selector 가 없는 경우 아래와 같이 Pod 에 selector 를 추가할 수 있습니다.

# kubectl label pod nginx-deployment-7c79c4bf97-7wj9r -n sysdocu app=nginx

 

velero 는 볼륨 데이터도 백업이 가능하지만, 볼륨에 포함되지 않은 컨테이너 내에 추가 생성된 파일은 백업이 되지 않습니다.

 

2) 백업 목록 조회

# velero backup get

 

3) 백업 복원

# velero restore create --from-backup <backup-name>

 

백업본을 다른 이름의 네임스페이스로 복원할 수 있습니다. (컨테이너 이전에 사용하면 좋을듯)
# velero restore create --from-backup <backup_name> --namespace-mappings <old-namespace>:<new-namespace>

 

4) 백업 삭제

잘못된 백업 파일이나 오래된 백업 파일의 경우 다음과 같이 삭제 할 수 있습니다.

# velero backup delete <backup-name>

 

※ 참고 : Velero 제거

Velero 설치를 취소하려면 Velero 관련 리소스를 삭제하기만 하면 됩니다.

# kubectl delete namespace velero

 

 

 

 

 

 

 

 

 

========== 아래는 미검증 작성 자료 ==========

 

 

4. Kopia 백업 툴 설치 (임시 파일도 백업 가능)

 

이번에는 Pod 파일시스템 영역의 변경된 파일 백업 기능을 지원하며, 다량의 파일 백업시 진가 (속도) 를 발휘하는 Kopia 백업 툴을 설치해 보도록 하겠습니다.

 

1) Kopia 설치하기

# curl -s https://kopia.io/signing-key | gpg --dearmor > kopia.gpg

# install -o root -g root -m 644 kopia.gpg /usr/share/keyrings/

# echo "deb [signed-by=/usr/share/keyrings/kopia.gpg] https://packages.kopia.io/apt/ stable main" | sudo tee /etc/apt/sources.list.d/kopia.list > /dev/null

# apt -y update

# apt -y install kopia

# apt -y install kopia-ui    # 어디에 사용하는지 확인 필요

 

설치 버전을 확인합니다.

# kopia --version
0.17.0 build: 89c8eb47af2e1d5c1d14fe299a0cf7eaac095abf from: kopia/kopia

 

2) Kopia 저장소 초기화

# kopia repository create s3 \
    --bucket=mybucket \
    --endpoint=http://115.68.249.52:9000 \
    --access-key=minioadmin \
    --secret-access-key=minioadmin \
    --region=minio \
    --config-file=/root/kopia-repo.config

 

3) 

 

 

5. Kanister 백업 툴 (임시 파일도 백업 가능)

 

Helm 으로 쉽게 설치하고 사용할 수 있습니다.

 

1) Helm 설치

# wget https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz

# tar xvzf helm-v3.12.0-linux-amd64.tar.gz

# mv linux-amd64/helm /usr/local/bin/

 

2) Kanister 설치

# helm repo add kanister https://charts.kanister.io

# helm repo update

# helm install my-kanister --namespace kanister --create-namespace kanister/kanister-operator

 

3) Kanister 프로필 생성

백업 데이터를 저장할 스토리지 위치를 정의하는 Profile 을 생성합니다.

여기에서는 MinIO 로 구성한 서버의 Profile 을 생성하겠습니다.

# vi minio-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: minio-secret
  namespace: kanister
type: Opaque
stringData:
  aws_access_key_id: minioadmin
  aws_secret_access_key: minioadmin

 

# kubectl apply -f minio-secret.yaml

# vi minio-profile.yaml

apiVersion: cr.kanister.io/v1alpha1
kind: Profile
metadata:
  name: minio-profile
  namespace: kanister
spec:
  location:
    type: s3Compliant
    bucket: mybucket
    endpoint: 115.68.249.52:9000
    prefix: sysdocu/mybucket
  secret:
    name: minio-secret
    namespace: kanister

 

# kubectl apply -f minio-profile.yaml

 

 

반응형

댓글()