ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스 | 리소스 AWS S3 백업
    kubernetes 2021. 12. 18. 23:34

    쿠버네티스 클러스터를 운영하면서 운영 중인 리소스들을 백업하는 방법에 대해서 정리합니다.

    (현재 쿠버네티스 클러스터가 설치되었다는 가정하에 진행합니다. => 쿠버네티스 설치)

     

    Velero

    Velero는 Kubernetes 클러스터 리소스 및 영구 볼륨을 백업 및 복원하는 도구를 제공합니다

    https://velero.io/docs/v1.5/index.html

     

    velero cli를 이용하여 백업을 진행할 것이기 때문에 공식 홈페이지에서 설치 후 진행하도록 하겠습니다.

    Velero 설치 페이지

     

     

    로컬 환경에 설치가 되었다면 먼저 백업받을 저장소(AWS S3)를 생성합니다.

    버킷과 IAM 생성은 Terraform을 이용하여 생성합니다.

    https://github.com/bobjeong/no-easy-blog/tree/master/kubernetes/velero/iam-terraform
    더보기

    version.tf

    # version.tf
    terraform {
      required_providers {
        aws = {
          source  = "hashicorp/aws"
          version = "~> 3.0"
        }
      }
    
      required_version = "~> 1.0.0"
    }
    
    # Configure the AWS Provider
    provider "aws" {
      region = "ap-northeast-2"
    }

     

    iam.tf

    # iam.tf
    resource "aws_iam_user" "velero" {
      name = "velero"
    
      tags = {
        velero = "velero-backup-user"
      }
    }
    
    resource "aws_iam_access_key" "velero_access_key" {
      user = aws_iam_user.velero.name
    }
    
    resource "aws_iam_user_policy" "velero_policy" {
      name = "velero-backup-role"
      user = aws_iam_user.velero.name
    
      policy =  jsonencode({
        Version   = "2012-10-17",
        Statement = [
          {
            Effect = "Allow",
            Action = [
              "ec2:DescribeVolumes",
              "ec2:DescribeSnapshots",
              "ec2:CreateTags",
              "ec2:CreateVolume",
              "ec2:CreateSnapshot",
              "ec2:DeleteSnapshot"
            ],
            Resource = "*"
          },
          {
            Effect = "Allow",
            Action = [
              "s3:GetObject",
              "s3:DeleteObject",
              "s3:PutObject",
              "s3:AbortMultipartUpload",
              "s3:ListMultipartUploadParts"
            ],
            Resource = [
              "${module.s3_bucket.s3_bucket_arn}/*"
            ]
          },
          {
            Effect = "Allow",
            Action = [
              "s3:ListBucket"
            ],
            Resource: [
              module.s3_bucket.s3_bucket_arn
            ]
          }
        ]
      })
    }
    
    resource "local_file" "velero_credentials" {
      content              = "[default]\naws_access_key_id=${aws_iam_access_key.velero_access_key.id}\naws_secret_access_key=${aws_iam_access_key.velero_access_key.secret}"
      filename             = "${path.module}/velero-credentials"
      file_permission      = "0600"
      directory_permission = "0755"
    }

     

    s3.tf

    # s3.tf
    module "s3_bucket" {
      source = "terraform-aws-modules/s3-bucket/aws"
    
      bucket = var.bucket
      acl    = "private"
    
      versioning = {
        enabled = true
      }
    }

     

    variables.tf

    # variables.tf
    variable "region" {
      description = "Amazon Region"
      type = string
      default = "ap-northeast-2"
    }
    
    variable "bucket" {
      description = "(Optional, Forces new resource) The name of the bucket. If omitted, Terraform will assign a random, unique name."
      type        = string
      default     = null
    }

     

    output.tf

    # output.tf
    output "aws_iam_user_arn" {
      value = aws_iam_user.velero.arn
    }
    
    output "s3_bucket_id" {
      value = module.s3_bucket.s3_bucket_id
    }
    
    output "s3_bucket_region" {
      value = module.s3_bucket.s3_bucket_region
    }

     

    terraform.tfvars

    # terraform.tfvars
    region = "ap-northeast-2"
    bucket = "bob-velero-backup-bucket" // Your Change And Should be like velero install Bucket name

     

    terraform.tfvars 파일에서 bucket이름은 고유한 이름이어야 합니다.

     

     

    다음 명령어를 통해 S3, IAM을 생성합니다.

    terraform init
    
    terraform plan
    
    terraform apply

    생성된 IAM User에 대한 AWS Credentials는 현재 폴더에 생성됩니다.

     

     

    생성된 Credentail 파일은 형식은 다음과 같습니다.

    [default]
    aws_access_key_id=XXXXXXXXXXXXXXXXXXXX 
    aws_secret_access_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

     

     

    S3, IAM생성이 완료되었다 가장 먼저 설치한 velero cli를 이용하여 쿠버네티스에 velero를 설치하도록 하겠습니다.

    # Create Velero Kubernetes Resource
    velero install \
      --provider aws \
      --plugins velero/velero-plugin-for-aws:v1.3.0 \
      --bucket ${YOUR_BUCKET_NAME} \
      --backup-location-config region=${YOUR_BUCKET_REGION} \
      --snapshot-location-config region=${YOUR_BUCKET_REGION} \
      --secret-file ${YOUR_AWS_CREDENTIALS_PATH} \
      --velero-pod-cpu-limit 2 \
      --velero-pod-mem-limit 4G
    • YOUR_BUCKET_NAME    : terraform으로 생성한 AWS S3의 Bucket 이름을 입력합니다.
    • YOUR_BUCKET_REGION : terraform으로 생성한 AWS S3의 Bucket Region을 입력합니다.
    • YOUR_AWS_CREDENTIALS_PATH : terraform실행 후 생성된 Credential의 Path를 입력합니다.

     

    위의 명령어로 실행할 경우 velero namespace가 생성이 되고 velero의 리소스가 설치된 것을 확인할 수 있습니다.

    kubectl get -n velero all
    kubectl get -n velero secret
    kubectl get -n velero sa
    kubectl get -n velero configmap

     

     

     

    백업 테스트를 진행하기 위해서 test namespace와 pod를 생성합니다.

    kubectl create namespace test
    
    kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml -n test
    
    kubectl get -n test all

     

     

     

    이제 백업을 진행해보도록 하겠습니다.

    velero backup 명령을 이용하여 백업할 수 있습니다.

    velero backup create ${BACKUP_DIRECTORY_NAME} --include-namespaces ${BACKUP_NAMESPACE}

    BACKUP_DIRECTORY_NAME : 백업에 대한 디렉터리 명을 입력합니다. 

    BACKUP_NAMESPACE : 백업할 Namespace를 입력합니다.

     

     

    위에서 생성한 test Namespace를 백업하도록 합니다.

    명령을 실행하게 되면 다음과 같이 만들어진 Bucket의 backups/ 경로에 backup시 지정한 디렉터리가 생성된 것을 확인 할 수 있습니다.

     

     

    이제 복구를 진행하기 위해서 생성한 namespace를 지워보도록 하겠습니다.

    kubectl delete namespace test
    
    kubectl get -n test all
    # No resources found in test namespace.

     

     

    리소스들이 지워졌으니 복구를 진행하도록 하겠습니다.

    velero restore 명령을 이용하여 복구할 수 있습니다.

    velero restore create ${RESTORE_DIRECTORY_NAME} --from-backup ${BACKUP_DIRECTORY_NAME}

    RESTORE_DIRECTORY_NAME : 복구에 대한 디렉토리 명을 입력합니다.

    BACKUP_DIRECTORY_NAME : 백업 시 지정 한 디렉터리 명을 입력합니다.

     

     

    위에서 생성한 test Namespace와 생성되었던 리소스들을 복구하도록 합니다.

    명령을 실행하게 되면 다음과 같이 만들어진 Bucket의 restores/ 경로에 restore시 지정한 디렉터리가 생성된 것을 확인할 수 있습니다. 

     

     

    마지막으로 namespace와 리소스들을 확인해보도록 합니다.

    kubectl delete namespace test
    
    kubectl get -n test all

    위와 같이 기존 리소스들이 복구된 것을 확인할 수 있습니다.

     

     

     

    여기까지 쿠버네티스의 리소스들을 백업하고 복구하는 방법에 대해서 정리해 보았습니다.

    운영 중인 클러스터의 버전을 변경하게 되었을 경우 리소스를 백업해야 하거나, 클러스터에 존재하는 리소스들에 대한 형상을 백업해두기에 좋은 방법이라고 생각합니다.

    velero의 자세한 동작원리에 관해서는 링크를 참고하시면 좋을 것 같습니다.

     

    감사합니다.

     

     

    참고자료

Designed by Tistory.