vSphere with Tanzu stateful application backup/restore using Velero vSphere Operator

지난주에 VMware VCF(Cloud Foundation) 4.2에서 사용할 수 있는 기능인 vSAN DPㅔ(Data Persistence Platform)에 대해 게시했습니다. 이 기사에서는 vSpher with Tanzu와 함께 Minio Operator를 설정한 후 S3 Object Store를 사용하여 Minio Tenant를 만들었습니다. 다시 말해, 몇 번의 클릭만으로 Tanzu 네임스페이스가 있는 vSphere에 사내 S3 Object Store를 할당할 수 있었는데, 이는 매우 멋진 일이었습니다.

VCF 4.2에서 사용할 수 있는 다른 Supervisor 서비스 중 하나가 Velero vSphere Operator입니다. Velero는 Kubernetes에서 매우 유명한 백업 및 마이그레이션 툴이기 때문에 많은 분들이 이미 Velero에 대해 잘 알고 계실 것입니다. 이 Velero vSphere Operator의 목적은 vSphere의 Kubernetes 개체를 Supervisor Cluster와 Guest Cluster 모두에서 Tanzu로 백업 및 복원하는 기능을 제공하는 것입니다. 물론 이러한 백업은 어딘가에 저장해야 하므로, 새로운 DP Minio Operator에서 새로 생성한 온프레미스 S3 Object Store에 저장하는 것은 어떨까요? 계획처럼 들리네요!

이 설정에는 여러 단계가 포함됩니다. 자세한 내용을 알기 전에 먼저 여기서 간략하게 설명합시다.

  1. S3 개체 저장소에 대한 새 네임스페이스 및 Minio Tenant를 생성합니다. Minio 연산자의 활성화는 이전 게시물에 설명된 단계와 동일하므로 표시되지 않습니다. 한 가지 중요한 점은 이 배포에서 TLS를 사용하지 않도록 설정하므로 테넌트를 생성할 때 고급 구성 설정을 사용해야 한다는 것입니다.
  2. Velero vSphere Operator를 배포합니다. 이렇게 하면 자체 네임스페이스가 자동으로 생성됩니다.
  3. velero-vsphere 설치 관리자를 다운로드합니다. 이는 외관상 표준 Velero 설치 프로그램과 유사하지만 vSphere with Tanzu와 함께 작동하도록 특별히 작성되었습니다.
  4. Velero 클라이언트를 바탕 화면으로 다운로드하여 백업 작업을 시작할 수 있습니다. 이것은 표준 Velero 바이너리입니다.
  5. S3 URL 및 S3 로그인 자격 증명과 같은 항목을 정의하는 Velero 설치 관리자 스크립트를 생성합니다. 이것은 정말 긴 명령줄 구문을 피하기 위한 것입니다.
  6. Velero 설치 관리자 스크립트를 실행합니다. 이 단계에서는 Velero 서버 및 백업 드라이버를 배포하고 vSphere with Tanzu에서 개체를 백업/복원하는 기능을 제공합니다.
  7. Velero 클라이언트를 사용하여 백업 및 복원을 테스트합니다.

이제 구체적인 단계에 대해 자세히 알아보겠습니다. S3 개체 저장소를 백업 저장소로 사용할 수 있는 네임스페이스에 사용할 수 있다고 가정하여 1단계를 생략하겠습니다. 기억해야 할 두 가지가 있습니다. 첫 번째는 Velero vSphere Operator가 이 초기 버전의 인증서를 지원하지 않으므로 TLS를 사용하지 않도록 설정해야 합니다. 이렇게 하려면 테넌트 생성 중에 고급 모드로 들어가야 합니다. 고급 모드 옵션이 있는 위치를 보여주는 샘플 구성입니다.

TLS 및 인증서에 대한 의존성을 해제하려면 보안 섹션으로 이동할 때 TLS 사용 확인란을 선택 취소합니다. 향후 Velero vSphere Operator에 인증서 지원을 포함하기 위해 노력하고 있습니다.

사용자 지정 레지스트리 또는 에어 갭 레지스트리에서 이러한 이미지를 배포할 때 주의해야 할 또 다른 항목은 테넌트 설정에서 이 정보를 다시 제공해야 한다는 것입니다. 이전에 에어 갭 레지스트리에서 Minio Operator를 배포한 경우 레지스트리 설정이 테넌트에 자동으로 적용되지 않습니다. 대신 고급 모드를 통해 사용자 지정 이미지와 사용자 지정 이미지 레지스트리 세부 정보도 제공해야 합니다. 이 단계는 선택 사항이며 채워지지 않으면 기본적으로 이미지가 외부 도커 허브에서 자동으로 당겨집니다. 이 화면의 모양은 다음과 같습니다.

마지막으로 테넌트를 설정한 후에는 테넌트가 생성될 때 액세스 키와 키 ID 자격 증명도 기록해야 합니다. 이 예에서는 S3 Minio 개체 저장소(Tenant)가 velero-ns라는 네임스페이스를 배포했습니다. Minio 테넌트가 성공적으로 배포되었으면 다음과 같이 해당 개체가 velero-ns 네임스페이스에 표시됩니다.

$ kubectl config get-contexts
CURRENT   NAME                       CLUSTER    AUTHINFO                                   NAMESPACE
*         20.0.0.1                   20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local
          cormac-ns                  20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local   cormac-ns
          minio-domain-c8            20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local   minio-domain-c8
          velero-ns                  20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local   velero-ns


$ kubectl config use-context velero-ns
Switched to context "velero-ns".


$ kubectl get all
NAME                                  READY   STATUS    RESTARTS   AGE
pod/velero-console-779694f649-d66hc   1/1     Running   0          13h
pod/velero-zone-0-0                   1/1     Running   0          13h
pod/velero-zone-0-1                   1/1     Running   0          13h
pod/velero-zone-0-2                   1/1     Running   0          13h
pod/velero-zone-0-3                   1/1     Running   0          13h

NAME                     TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)                         AGE
service/minio            LoadBalancer   10.96.1.113   20.0.0.7      443:30942/TCP                   13h
service/velero-console   LoadBalancer   10.96.3.46    20.0.0.5      9090:31166/TCP,9443:30217/TCP   13h
service/velero-hl        ClusterIP      None          <none>        9000/TCP                        13h

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/velero-console   1/1     1            1           13h

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/velero-console-779694f649   1         1         1       13h

NAME                             READY   AGE
statefulset.apps/velero-zone-0   4/4     13h

Velero vSphere Operator 사용

이제 S3 개체 저장소를 백업 저장소로 사용할 수 있게 되었으므로 Velero vSphere Operator에 관심을 돌릴 수 있습니다. Velero vSphere Operator를 사용하도록 설정하려면 Cluster > Supervisor Services > Services로 이동하십시오. Velero는 현재 사용할 수 있는 새로운 슈퍼바이저 서비스 중 하나입니다. 이 옵션을 선택하고 ENABLE 링크를 클릭합니다.

다시 한 번 채워야 할 첫 번째 정보는 Velero 이미지가 저장되는 리포지토리입니다. 이 작업은 비워둘 수 있으며 익명 자격 증명(MiniO Operator와 동일)을 사용하여 도커 허브에서 이미지를 가져옵니다. 그러나 도커에서 최근에 구현한 속도 제한으로 인해 사용자 자신의 자격 증명을 사용하여 도커 허브에 로그인하고 이미지를 수동으로 끌어와 로컬 리포지토리에 저장할 수 있습니다. 네가 얼마나 자주 이 일을 하느냐에 달려 있다. Docket 허브에서 이미지를 끌어와 로컬 Harbor 저장소로 올렸기 때문에 Velero vSphere Operator 활성화 단계에서 이 정보를 제공했습니다.

다음으로, EULA의 조건에 동의합니다.

이 작업은 velero-vsphere-domain-c8의 경우 새 네임스페이스 생성으로 진행됩니다. 이 시점에서 흥미로운 점은 4개의 Pod가 vSphere with Tanzu Supervisor 클러스터에서 인스턴스화되었음에도 불구하고 vSphere UI에서 생성된 Pod VM이 없다는 것입니다. 그 이유는 Velero vSphere Operator Pods가 제어면 노드 선택기와 함께 배포되어 작업자 노드가 아닌 제어면에서 실행되기 때문입니다. 예를 들어, 다음은 내 vSphere with Tanzu 환경의 모든 노드(제어 평면 및 작업자) 목록입니다. Velero vSphere Operator용 Pods를 표시할 때 모두 제어부 노드에서 실행되고 있습니다. 따라서 vSphere UI에 포드 VM으로 표시되지 않습니다. 이것은 내가 이 연산자를 배치하기 전까지 내가 알지 못했던 행동이었다. 왜 그런지 물어보는 게 좋을 거야. 즉, 제어부 노드가 vSphere 관리 네트워크에 액세스할 수 있고 vCenter 서버와 통신할 수 있습니다. 제어면 노드에 배포된 포드도 이 네트워크에 액세스할 수 있는 반면, 작업자 노드에 배포된 일반 포드 VM은 자신이 상주하는 네임스페이스 생성의 일부로 할당된 네트워크에만 액세스할 수 있습니다.

$ kubectl get nodes
NAME                               STATUS   ROLES    AGE   VERSION
42163b88513505fa695d51fa2e2aa1f0   Ready    master   10d   v1.18.2-6+38ac483e736488
421642a81662a903edcbeef9e388b75e   Ready    master   10d   v1.18.2-6+38ac483e736488
42165fe73f7731599e9a8f75e27aefc3   Ready    master   10d   v1.18.2-6+38ac483e736488
esxi-dell-m.rainpole.com           Ready    agent    10d   v1.18.2-sph-83e7e60
esxi-dell-n.rainpole.com           Ready    agent    10d   v1.18.2-sph-83e7e60
esxi-dell-o.rainpole.com           Ready    agent    10d   v1.18.2-sph-83e7e60
esxi-dell-p.rainpole.com           Ready    agent    10d   v1.18.2-sph-83e7e60

$ kubectl config use-context velero-vsphere-domain-c8
Switched to context "velero-vsphere-domain-c8".

$ kubectl get pods -o wide
NAME                                               READY   STATUS    RESTARTS   AGE   IP           NODE                               NOMINATED NODE   READINESS GATES
velero-vsphere-operator-5fd45db6b6-4ncv7           1/1     Running   0          30h   10.244.1.5   42165fe73f7731599e9a8f75e27aefc3   <none>           <none>
velero-vsphere-operator-webhook-79ffbdcd69-dcsqf   1/1     Running   0          30h   10.244.1.5   42165fe73f7731599e9a8f75e27aefc3   <none>           <none>
velero-vsphere-operator-webhook-79ffbdcd69-h5v2q   1/1     Running   0          30h   10.244.1.4   42163b88513505fa695d51fa2e2aa1f0   <none>           <none>
velero-vsphere-operator-webhook-79ffbdcd69-xz86q   1/1     Running   0          30h   10.244.1.2   421642a81662a903edcbeef9e388b75e   <none>           <none>

Velero Client 및 vSphere Operator CLI 다운로드

여기에서 Velero Client(작성 당시 버전 1.5.3)를 사용할 수 있습니다. 여기에서 Velero vSphere Operator(작성 시 버전 1.1.0)를 사용할 수 있습니다. 둘 다 다운로드하여 압축을 푼 다음 선택적으로 $PATH에 추가합니다. 한 가지 추가 단계는 클라이언트가 작업할 컨텍스트를 구성하는 것입니다(기본적으로 네임스페이스 벨레로를 예상함). 내 네임스페이스는 velero-ns이므로 클라이언트에게 해당 컨텍스트를 사용하도록 해야 합니다.

$ velero client config set namespace=velero-ns

$ velero client config get
namespace: velero-ns

Velero Operator CLI 설치 관리자 스크립트 생성

명령줄에 설치 관리자 옵션을 하나의 명령으로 입력할 수 있지만 추가할 매개 변수가 많기 때문에 스크립트에 넣는 것이 훨씬 더 쉬울 수 있습니다. 다음은 설치를 위해 만든 스크립트입니다.

#!/bin/sh

NAMESPACE="velero-ns"
BUCKET="backup-bucket"
REGION=minio
S3URL="http://20.0.0.5/"
PublicURL="http://20.0.0.5/"
VELERO_IMAGE=20.0.0.2/cormac-ns/velero:v1.5.1
VSPHERE_PLUGIN=20.0.0.2/cormac-ns/velero-plugin-for-vsphere:1.1.0
AWS_PLUGIN=20.0.0.2/cormac-ns/velero-plugin-for-aws:v1.1.0

./velero-vsphere install \
    --namespace $NAMESPACE \
    --image $VELERO_IMAGE \
    --use-private-registry \
    --provider aws \
    --plugins $AWS_PLUGIN,$VSPHERE_PLUGIN \
    --bucket $BUCKET \
    --secret-file ./velero-minio-credentials \
    --snapshot-location-config region=$REGION \
    --backup-location-config region=$REGION,s3ForcePathStyle="true",s3Url=$S3URL,publicUrl=$PublicURL

먼저 몇 가지 변수를 살펴보겠습니다.

  • NAMESPACE – Velero 서버 구성 요소를 설치할 네임스페이스입니다. S3 오브젝트 저장소와 동일한 네임스페이스에 배치하여 모든 응용프로그램 네임스페이스에서 벗어나 보다 쉽게 작업을 수행할 수 있도록 합니다.
  • BUCKET – 백업을 위해 S3 개체 저장소에 생성한 버킷입니다. 이 설정은 Minio S3 브라우저 클라이언트 또는 Minio S3 콘솔에서 생성할 수 있습니다.
  • 지역 – 확실하지 않지만 S3 개체 저장소의 버킷 경로와 관련하여 가능합니다. 기본값은 미니오입니다. 나는 그것이 다른 것으로 설정된 것을 본 적이 없다.
  • S3 URL – Velero 백업/복원 작업이 S3 개체 저장소에 액세스하는 방법. 저는 여기 오브젝트 스토어의 외부 주소를 사용하고 있습니다.
  • Public URL – Velero 클라이언트가 S3 개체 저장소에 액세스하는 방법(예: 로그 보기) 다시 말씀드리지만, 저는 여기 오브젝트 스토어의 외부 주소를 사용하고 있습니다.
  • VELERO_IMAGE – Velero 서버 이미지. 외부 도커 허브에서 이미지를 가져오는 것이 아니라 사내 하버 저장소에서 이미지를 가져오므로 이 옵션을 설정하십시오. 이미 이 이미지를 로컬 레지스트리에 끌어다 놓았습니다. 기본 도커 레지스트리에서 이미지를 가져오는 경우에는 이 설정이 필요하지 않습니다.
  • Vsphere_PLUGIN – VADP를 사용하여 영구 볼륨의 스냅샷을 사용하도록 설정하는 플러그인입니다. 이미 미리 설정된 레지스트리에 푸시되어 있습니다. 기본 도커 레지스트리에서 이미지를 가져오는 경우에는 이 설정이 필요하지 않습니다.
  • AWS_PLUGIN – S3 Object Store 대상을 활용하는 방법을 알고 있는 플러그인입니다. 이미 미리 설정된 레지스트리에 푸시되어 있습니다. 기본 도커 레지스트리에서 이미지를 가져오는 경우에는 이 설정이 필요하지 않습니다.

이제 설치 명령을 살펴보겠습니다. 일반 벨레로 설치와 다를 수 있는 아이템은 2개밖에 없는 것 같아요.

  • –use-private-registry – 이미 개인(Harbor) 레지스트리의 이미지를 사용하여 Velero vSphere Operator를 구축했기 때문에 여기에서 이미 리포지토리 자격 증명을 제공해야 했습니다. velero-vsphere 바이너리를 통해 저장소에 자격 증명을 제공할 수 있는 방법이 없으므로 설치 관리자가 동일한 레지스트리에서 이미지를 꺼내기 때문에 자격 증명을 한 번 더 추가하지 않고도 동일한 저장소를 사용할 수 있음을 알리는 플래그입니다.
  • -secret-file – 에는 Minio S3 Object Store에 대한 자격 증명이 포함되어 있습니다. 예를 들어, 이전에 Minio S3 테넌트를 구축했을 때 이러한 사항을 기록해 두었습니다.
$ cat velero-minio-credentials
[default]
aws_access_key_id = XWQ1TB0UJ3ZE4FMD
aws_secret_access_key = JQZ0L5O4ZEKBFYZAZ25M4LA5ZIU2UKFW

자세한 내용 및 기타 구성 설정은 여기의 공식 문서에서 확인할 수 있습니다. 그러나 스크립트를 설치한 상태에서 이 스크립트를 실행하고 선택한 네임스페이스(이 경우 velero-ns)에서 Pods(파란색으로 표시됨)가 대기 상태인지 확인할 수 있습니다. 이 설치는 한 번만 수행하면 됩니다. 그런 다음 Velero 클라이언트를 사용하여 vSphere with Tanzu 환경의 이름 공간에 있는 애플리케이션을 백업할 수 있습니다.

$ ./install-on-velero-ns-from-harbor.sh
Send the request to the operator about installing Velero in namespace velero-ns


$ kubectl config get-contexts
CURRENT   NAME                       CLUSTER    AUTHINFO                                   NAMESPACE
          20.0.0.1                   20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local
          cormac-ns                  20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local   cormac-ns
          minio-domain-c8            20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local   minio-domain-c8
*         velero-ns                  20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local   velero-ns
          velero-vsphere-domain-c8   20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local   velero-vsphere-domain-c8


$ kubectl get all
NAME                                  READY   STATUS    RESTARTS   AGE
pod/backup-driver-6765cf5cb7-7dv8l    1/1     Running   0          2m3s
pod/velero-7bd5bcf869-c6mk9           1/1     Running   0          2m9s
pod/velero-console-779694f649-d66hc   1/1     Running   0          13h
pod/velero-zone-0-0                   1/1     Running   0          13h
pod/velero-zone-0-1                   1/1     Running   0          13h
pod/velero-zone-0-2                   1/1     Running   0          13h
pod/velero-zone-0-3                   1/1     Running   0          13h

NAME                     TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)                         AGE
service/minio            LoadBalancer   10.96.1.113   20.0.0.7      443:30942/TCP                   13h
service/velero-console   LoadBalancer   10.96.3.46    20.0.0.5      9090:31166/TCP,9443:30217/TCP   13h
service/velero-hl        ClusterIP      None          <none>        9000/TCP                        13h

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/backup-driver    1/1     1            1           2m3s
deployment.apps/velero           1/1     1            1           2m9s
deployment.apps/velero-console   1/1     1            1           13h

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/backup-driver-6765cf5cb7    1         1         1       2m3s
replicaset.apps/velero-7bd5bcf869           1         1         1       2m9s
replicaset.apps/velero-console-779694f649   1         1         1       13h

NAME                             READY   AGE
statefulset.apps/velero-zone-0   4/4     13h

좋아 보인다. 여기에 표시된 kubectl 출력과 vSphere UI에 표시되는 내용에 차이가 있다는 점에 유의하십시오. 위에 2개의 포드(벨러 및 백업 드라이버)가 표시되지만 vSphere UI에는 1개만 표시됩니다. backup-driver Pod가 제어부 노드에 배포되어 UI에 표시되지 않습니다. velero 포드는 작업자 노드에서 실행되므로 UI에서 포드 VM으로 표시됩니다.

이 단계가 완료되면 클라이언트 및 서버/운영자의 상태도 확인할 수 있습니다.

$ velero version
Client:
        Version: v1.5.3
        Git commit: 123109a3bcac11dbb6783d2758207bac0d0817cb
Server:
        Version: v1.5.1

서비스 상태를 확인하는 것도 이 시점에서 확인하는 것이 좋습니다.

$ kubectl -n velero-ns get veleroservice default -o json | jq '.status'
{
  "enabled": true,
  "installphase": "Completed",
  "version": "v1.5.1"
}

Velero 클라이언트를 사용하여 간단한 백업 수행

마지막 단계는 백업을 수행하는 것입니다. 다음에 하자. 먼저 Velero 클라이언트의 컨텍스트를 다시 한 번 확인하고 Velero가 설치된 네임스페이스에서 실행되고 있는지 확인합니다.

$ velero client config get 
namespace: velero-ns

다음으로 cormac-ns라는 애플리케이션 네임스페이스로 컨텍스트를 변경합니다. 여기에는 Cassandra NoSQL DB 상태 저장 세트와 웹 서버를 실행하는 Nginx 배포(백업되는 데이터 없음)가 있습니다. 이 애플리케이션은 내 vSphere with Tanzu Supervisor 클러스터에서 실행되는 포드 VM에 배포된 애플리케이션입니다.

$ kubectl config get-contexts
CURRENT   NAME                       CLUSTER    AUTHINFO                                   NAMESPACE
          20.0.0.1                   20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local
          cormac-ns                  20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local   cormac-ns
          minio-domain-c8            20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local   minio-domain-c8
*         velero-ns                  20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local   velero-ns
          velero-vsphere-domain-c8   20.0.0.1   wcp:20.0.0.1:administrator@vsphere.local   velero-vsphere-domain-c8


$ kubectl config use-context cormac-ns
Switched to context "cormac-ns".


$ kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
cassandra-0                        1/1     Running   0          10d
cassandra-1                        1/1     Running   0          10d
cassandra-2                        1/1     Running   0          10d
nginx-deployment-b4d6b7cf8-cfftz   1/1     Running   0          10d
nginx-deployment-b4d6b7cf8-q29lr   1/1     Running   0          10d
nginx-deployment-b4d6b7cf8-zmfhd   1/1     Running   0          10d

이제 Nginx 배포의 백업을 수행하겠습니다. 그 전에 S3 오브젝트 스토어를 살펴보도록 하겠습니다. 지금까지는 비어 있습니다. 여기에 백업 정보를 저장할 수 있는지 확인해 보겠습니다.

Velero가 백업할 항목을 선택하는 방법으로 Pod 레이블을 사용할 것입니다. 먼저, 포드에 레이블을 나열합니다. Nginx Pods에는 app=nginx 라벨이 있으므로, 나는 그것을 사용할 것이다.

$ kubectl get pods --show-labels
NAME                               READY   STATUS    RESTARTS   AGE   LABELS
cassandra-0                        1/1     Running   0          10d   app=cassandra,controller-revision-hash=cassandra-54d8d8874f,statefulset.kubernetes.io/pod-name=cassandra-0
cassandra-1                        1/1     Running   0          10d   app=cassandra,controller-revision-hash=cassandra-54d8d8874f,statefulset.kubernetes.io/pod-name=cassandra-1
cassandra-2                        1/1     Running   0          10d   app=cassandra,controller-revision-hash=cassandra-54d8d8874f,statefulset.kubernetes.io/pod-name=cassandra-2
nginx-deployment-b4d6b7cf8-cfftz   1/1     Running   0          10d   app=nginx,pod-template-hash=b4d6b7cf8
nginx-deployment-b4d6b7cf8-q29lr   1/1     Running   0          10d   app=nginx,pod-template-hash=b4d6b7cf8
nginx-deployment-b4d6b7cf8-zmfhd   1/1     Running   0          10d   app=nginx,pod-template-hash=b4d6b7cf8

이제 지원을 받을 준비가 되었습니다.

$ velero backup get


$ velero backup create nginx-backup --selector app=nginx
Backup request "nginx-backup" submitted successfully.
Run `velero backup describe nginx-backup` or `velero backup logs nginx-backup` for more details.


$ velero backup get
NAME           STATUS       ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
nginx-backup   InProgress   0        0          2021-02-23 17:53:31 +0000 GMT   30d       default            app=nginx


$ velero backup describe nginx-backup
Name:         nginx-backup
Namespace:    velero-ns
Labels:       velero.io/storage-location=default
Annotations:  velero.io/source-cluster-k8s-gitversion=v1.18.2-6+38ac483e736488
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=18+

Phase:  InProgress

Errors:    0
Warnings:  0

Namespaces:
  Included:  *
  Excluded:  <none>

Resources:
  Included:        *
  Excluded:        <none>
  Cluster-scoped:  auto

Label selector:  app=nginx

Storage Location:  default

Velero-Native Snapshot PVs:  auto

TTL:  720h0m0s

Hooks:  <none>

Backup Format Version:  1.1.0

Started:    2021-02-23 17:53:31 +0000 GMT
Completed:  <n/a>

Expiration:  2021-03-25 17:53:31 +0000 GMT

Velero-Native Snapshots: <none included>

그리고 이 백업에는 전송할 데이터가 많지 않기 때문에 한두 시간이 지나면 작업이 완료되는 것을 볼 수 있을 것입니다.

$ velero backup get
NAME           STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
nginx-backup   Completed   0        0          2021-02-23 17:53:31 +0000 GMT   30d       default            app=nginx

velero backup logs nginx-backup 명령을 사용해서 백업 로그를 사용하여 표시할 수 있지만 S3 Object Store로 전송된 항목이 있는지 확인하는 것이 더 좋습니다.

내가 보기엔 좋아. 백업에 대한 자세한 내용을 보려면 다음 명령을 실행하면 백업에 캡처된 리소스가 표시됩니다.

$ velero backup describe nginx-backup --details
Name:         nginx-backup
Namespace:    velero-ns
Labels:       velero.io/storage-location=default
Annotations:  velero.io/source-cluster-k8s-gitversion=v1.18.2-6+38ac483e736488
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=18+

Phase:  Completed

Errors:    0
Warnings:  0

Namespaces:
  Included:  *
  Excluded:  <none>

Resources:
  Included:        *
  Excluded:        <none>
  Cluster-scoped:  auto

Label selector:  app=nginx

Storage Location:  default

Velero-Native Snapshot PVs:  auto

TTL:  720h0m0s

Hooks:  <none>

Backup Format Version:  1.1.0

Started:    2021-02-23 17:53:31 +0000 GMT
Completed:  2021-02-23 17:53:46 +0000 GMT

Expiration:  2021-03-25 17:53:31 +0000 GMT

Total items to be backed up:  7
Items backed up:              7

Resource List:
  apps/v1/Deployment:
    - cormac-ns/nginx-deployment
  apps/v1/ReplicaSet:
    - cormac-ns/nginx-deployment-b4d6b7cf8
  v1/Endpoints:
    - cormac-ns/nginx-svc
  v1/Pod:
    - cormac-ns/nginx-deployment-b4d6b7cf8-cfftz
    - cormac-ns/nginx-deployment-b4d6b7cf8-q29lr
    - cormac-ns/nginx-deployment-b4d6b7cf8-zmfhd
  v1/Service:
    - cormac-ns/nginx-svc

Velero-Native Snapshots: <none included>

복원

복원할 수 없다면 백업을 해두어도 별 의미가 없습니다. 이제 cormac-ns 네임스페이스에서 Nginx 배포 및 서비스를 제거하고 Velero를 사용하여 복원하겠습니다.

$ kubectl config use-context cormac-ns
Switched to context "cormac-ns".


$ kubectl get all
NAME                                   READY   STATUS    RESTARTS   AGE
pod/cassandra-0                        1/1     Running   0          10d
pod/cassandra-1                        1/1     Running   0          10d
pod/cassandra-2                        1/1     Running   0          10d
pod/nginx-deployment-b4d6b7cf8-cfftz   1/1     Running   0          10d
pod/nginx-deployment-b4d6b7cf8-q29lr   1/1     Running   0          10d
pod/nginx-deployment-b4d6b7cf8-zmfhd   1/1     Running   0          10d


NAME                                                    TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
service/cassandra                                       ClusterIP      10.96.3.50    <none>        9042/TCP                     27d
service/nginx-svc                                       LoadBalancer   10.96.1.252   20.0.0.4      443:32662/TCP,80:31832/TCP   27d
service/tkg-cluster-vcf-w-tanzu-control-plane-service   LoadBalancer   10.96.0.31    20.0.0.3      6443:31677/TCP               71d


NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           27d


NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-b4d6b7cf8   3         3         3       27d


NAME                         READY   AGE
statefulset.apps/cassandra   3/3     27d


$ kubectl delete deployment.apps/nginx-deployment
deployment.apps "nginx-deployment" deleted


$ kubectl delete service/nginx-svc
service "nginx-svc" deleted


$ kubectl get all
NAME              READY   STATUS    RESTARTS   AGE
pod/cassandra-0   1/1     Running   0          10d
pod/cassandra-1   1/1     Running   0          10d
pod/cassandra-2   1/1     Running   0          10d

NAME                                                    TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
service/cassandra                                       ClusterIP      10.96.3.50   <none>        9042/TCP         27d
service/tkg-cluster-vcf-w-tanzu-control-plane-service   LoadBalancer   10.96.0.31   20.0.0.3      6443:31677/TCP   71d

NAME                         READY   AGE
statefulset.apps/cassandra   3/3     27d


$ velero backup get
NAME                    STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
nginx-backup            Completed   0        0          2021-02-23 17:53:31 +0000 GMT   29d       default            app=nginx


$ velero restore create restore-nginx --from-backup nginx-backup
Restore request "restore-nginx" submitted successfully.
Run `velero restore describe restore-nginx` or `velero restore logs restore-nginx` for more details.


$ velero restore describe restore-nginx
Name:         restore-nginx
Namespace:    velero-ns
Labels:       <none>
Annotations:  <none>

Phase:  Completed

Started:    2021-02-24 09:25:59 +0000 GMT
Completed:  2021-02-24 09:25:59 +0000 GMT

Backup:  nginx-backup

Namespaces:
  Included:  all namespaces found in the backup
  Excluded:  <none>

Resources:
  Included:        *
  Excluded:        nodes, events, events.events.k8s.io, backups.velero.io, restores.velero.io, resticrepositories.velero.io
  Cluster-scoped:  auto

Namespace mappings:  <none>

Label selector:  <none>

Restore PVs:  auto


$ kubectl get all
NAME                                   READY   STATUS    RESTARTS   AGE
pod/cassandra-0                        1/1     Running   0          10d
pod/cassandra-1                        1/1     Running   0          10d
pod/cassandra-2                        1/1     Running   0          10d
pod/nginx-deployment-b4d6b7cf8-cfftz   1/1     Running   0          10s
pod/nginx-deployment-b4d6b7cf8-q29lr   1/1     Running   0          10s
pod/nginx-deployment-b4d6b7cf8-zmfhd   1/1     Running   0          10s

NAME                                                    TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)                      AGE
service/cassandra                                       ClusterIP      10.96.3.50   <none>        9042/TCP                     27d
service/nginx-svc                                       LoadBalancer   10.96.3.65   20.0.0.7      443:32575/TCP,80:30197/TCP   10s
service/tkg-cluster-vcf-w-tanzu-control-plane-service   LoadBalancer   10.96.0.31   20.0.0.3      6443:31677/TCP               71d

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           10s

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-b4d6b7cf8   3         3         3       10s

NAME                         READY   AGE
statefulset.apps/cassandra   3/3     27d

복원에 성공한 것 같습니다. nginx 서비스가 새 로드 밸런서 IP 주소(위의 파란색으로 표시됨)에서 다시 시작되었지만 배포, 복제본 세트, 서비스 및 포드가 모두 복원되었습니다. 이 예에서는 nginx 이미지가 백업되거나 복원되지 않았습니다. 이미지가 백업 및 복원된 매니페스트에 따라 동일한 레지스트리에서 꺼냈습니다.

따라서 기능 확인을 위해 매우 간단한 백업 및 복원 작업을 수행할 수 있습니다. 이 설정에 좀 더 많은 시간을 할애하고 다른 네임스페이스로 복원, 영구 볼륨(Persistent Volumes)을 사용하는 애플리케이션 백업 및 복원, TKG “게스트” 클러스터와 같은 추가 단계를 수행해야 합니다. 하지만 지금은 그것으로 충분하다.

마치면서

음, 그거 꽤 보기 좋은데요. Velero vSphere Operator를 통해 가져온 Supervisor 클러스터 개체의 백업을 저장하는 데 사용할 수 있는 대상을 제공하는 Minios S3 Object Store(vSAN Data Persistence 플랫폼 – DPP에서 프로비저닝)가 있습니다. 이러한 서비스는 vSphere with Tanzu(VCF)에서 나란히 실행 중입니다. 일이 잘 풀리기 시작하고 있다

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like