OKEにVeleroを設定してバックアップ処理を行うまで

# はじめに

Kubernetesのバックアップツールは色々ありますが、そのうちの一つの**Velero**というものを設定する機会がありました。 
これをOCI OKEに設定しまして、基本的には[Velero公式](https://velero.io/docs/main/contributions/oracle-config/)と[OCIの記事](https://blogs.oracle.com/otnjp/post/backing-up-your-oke-environment-with-velero-ja)に従って設定すれば大丈夫です。  
しかし、どちらも微妙に漏れや基本形以外の設定があり、少し苦戦したので忘備録代わりに記事を残します。  
また、謎のエラーに苦戦してしまったので、それについても書いておきます(解決はしていませんが・・・)。

# Veleroの設定

## Veleroの設定手順

### veleroコマンドのインストール
以下のコマンドで、ローカル端末にvelero CLIをインストールします。　
なお、今回はLinuxでの設定を前提に説明します。他の環境を使いたい方は、先ほど挙げたVelero公式を参考にして調整してください。  
また、`vX.X.X`の部分はインストールしたいバージョンを選択してください。  
```
$ wget https://github.com/vmware-tanzu/velero/releases/download/v1.15.2/velero-v1.15.2-linux-amd64.tar.gz
$ tar -xvf velero-v1.15.2-linux-amd64.tar.gz
$ sudo mv velero-v1.15.2-linux-amd64 /usr/bin/
$ export PATH=/usr/local/bin/velero:$PATH
```

`velero`を端末で実行し、以下のように出力されることを確認してください。
```
$ velero
Velero is a tool for managing disaster recovery, specifically for Kubernetes
cluster resources. It provides a simple, configurable, and operationally robust
way to back up your application state and associated data.

If you're familiar with kubectl, Velero supports a similar model, allowing you to
execute commands such as 'velero get backup' and 'velero create schedule'. The same
operations can also be performed as 'velero backup get' and 'velero schedule create'.
```
### 顧客秘密キーの作成
OCIコンソール右上の四角形のプロファイル欄を選択し、そこから"ユーザー設定"を選択してください。
![プロファイルの場所.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4001956/79386bc5-555c-4144-bb0a-a11914ec3c49.png)
次に、遷移画面下の"リソース"欄にある"顧客秘密キー"を選択し、画面中央の"秘密キーの生成"より顧客秘密キーを作成してください。  
このとき、シークレットキーは作成したときしか保存できないことに注意してください。  

### バックアップ保管用バケットの作成
バックアップデータを保管するためのバケットを作成します。OCIコンソールの"オブジェクト・ストレージとアーカイブ・ストレージ > バケット"に移動し、"バケットの作成"よりバケットを作成してください。

### Velero本体のインストール
バックアップツールのVeleroをインストールします。以下のコマンドをローカル端末で実行してください。
```
velero install \
    --provider aws \
    --bucket [先ほど作成したバケット名] \
    --prefix [テナンシ名] \
    --use-volume-snapshots=false \
    --secret-file [先ほど作成した顧客秘密キーまでのパス] \
    --backup-location-config region=[バケットがあるリージョン],s3ForcePathStyle="true",s3Url=[https://{テナンシのオブジェクト・ストレージ・ネームスペース}.compat.objectstorage.{バケットがあるリージョン}.oraclecloud.com] \
    --plugins velero/velero-plugin-for-aws:v1.1.0
```

最後に以下の表示があれば成功です。
```
Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.
```

また、`velero`のNamespaceで動いているVelero Podがあることを確認してください。
```
$ kubectl get pod -n velero
NAME                      READY   STATUS    RESTARTS   AGE
velero-754b99dd5d-gcjj7   1/1     Running   0          5d3h
```

## Veleroのバックアップ確認

Veleroでバックアップが取れることを確認します。  
以下のマニフェストを使いテスト用のPodを作成します。
なお、このテスト用PodにはPersistentvolumesとPersistentvolumeclaimsが設定してありますので、このマニフェストをそのまま使う方は注意してください。
```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  labels:
    app: nginx
  annotations:
    backup.velero.io/backup-volumes: kato-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        backup.velero.io/backup-volumes: "kato-test"
    spec:
      terminationGracePeriodSeconds: 30
      containers:
      - name: nginx
        ports:
        - containerPort: 80
        volumeMounts:
         - mountPath: "/usr/share/nginx/html"
           name: kato-test
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", " echo 'Hello'"]
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 10"]
      volumes:
       - name: kato-test
         persistentVolumeClaim:
           claimName: kato-test
```

このPodに入り、`/usr/share/nginx/html`に`test.html`を作成し、そこに`test`と書き込みます。
```
$ kubectl exec nginx-test-7dfd44748c-nkvzq -it -- /bin/bash
root@nginx-test-7dfd44748c-nkvzq:/# cd /usr/share/nginx/html
root@nginx-test-7dfd44748c-nkvzq:/usr/share/nginx/html# touch test.html
root@nginx-test-7dfd44748c-nkvzq:/usr/share/nginx/html# vi test.html
root@nginx-test-7dfd44748c-nkvzq:/usr/share/nginx/html# cat test.html 
test
root@nginx-test-7dfd44748c-nkvzq:/usr/share/nginx/html# exit
```

Podに`curl`コマンドを打ち、`test`と表示されることを確認します。

```
$ curl http://151.145~~/test.html
test
```

`velero backup describe {バックアップ名}`コマンドでバックアップを作成します。

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

バックアップ保管先として指定したバケットに、バックアップが保管されていることを確認します。
![バックアップバケット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4001956/ab26470f-c9dc-4a52-a09e-bf62f72b223c.png)

なお、`velero backup describe {バックアップ名}`でも確認ができます。
```
$ velero backup describe nginx-backup
Name:         nginx-backup
Namespace:    velero
Labels:       velero.io/storage-location=default
Annotations:  velero.io/resource-timeout=10m0s
              velero.io/source-cluster-k8s-gitversion=v1.31.1
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=31

Phase:  Completed
```

Deployment・Persistentvolumeclaimsリソースを削除します。
```
$ kubectl delete deployment nginx-test
deployment.apps "nginx-test" deleted
$ kubectl delete persistentvolumeclaims kato-test
persistentvolumeclaim "kato-test" deleted
```

Podに`curl`コマンドを打ち、接続できないことを確認します。

```
$ curl http://151.145~~/test.html
<html>
<head><title>502 Bad Gateway</title></head>
<body>
<center><h1>502 Bad Gateway</h1></center>
<hr><center></center>
</body>
</html>
```

`velero restore create --from-backup {バックアップ名}`で復元します。
```
$ velero restore create --from-backup nginx-backup
Restore request "nginx-backup-20250318114509" submitted successfully.
Run `velero restore describe nginx-backup-20250318114509` or `velero restore logs nginx-backup-20250318114509` for more details.
```

再度`curl`コマンドを打ち、`test`と表示されることを確認します。
```
$ curl http://151.145~~/test.html
test
```

# 謎のエラー

`velero backup describe nginx-backup`を実行した際に、以下のように表示された。

```
$ velero backup describe nginx-backup
Name:         nginx-backup
Namespace:    velero
Labels:       velero.io/storage-location=default
Annotations:  velero.io/resource-timeout=10m0s
              velero.io/source-cluster-k8s-gitversion=v1.31.1
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=31

Phase:  PartiallyFailed (run `velero backup logs nginx-backup` for more information)


Warnings:
  Velero:     <none>
  Cluster:    <none>
  Namespaces:
    default:   resource: /pods name: /nginx-test-5c8b7dc6f6-fl82f message: /Skip pod volume kato-test-velero error: /daemonset pod not found in running state in node xxx.xxx.xxx.xxx
               resource: /pods name: /nginx-test-5c8b7dc6f6-tf9pl message: /Skip pod volume kato-test-velero error: /daemonset pod not found in running state in node xxx.xxx.xxx.xxx

Errors:
  Velero:    name: /nginx-test-5c8b7dc6f6-fl82f message: /Error backing up item error: /daemonset pod not found in running state in node xxx.xxx.xxx.xxx
             name: /nginx-test-5c8b7dc6f6-tf9pl message: /Error backing up item error: /daemonset pod not found in running state in node xxx.xxx.xxx.xxx
  Cluster:    <none>
  Namespaces: <none>
```

読んでみると「nginx-test-~を動かしているdaemonsetが見つからない」と言っているように見えます。  
しかし、nginx-testはDaemonsetではなくDeploymentで動いてます。
```
$ kubectl get daemonset -A
NAMESPACE     NAME                       DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                 AGE
kube-system   csi-oci-node               2         2         2       2            2           <none>                                        96d
kube-system   kube-proxy                 2         2         2       2            2           beta.kubernetes.io/os=linux                   96d
kube-system   node-termination-handler   0         0         0       0            0           oci.oraclecloud.com/oke-is-preemptible=true   96d
kube-system   proxymux-client            2         2         2       2            2           node.info.ds_proxymux_client=true             96d
kube-system   vcn-native-ip-cni          2         2         2       2            2           <none>                                        96d

$ kubectl get deployment -A
NAMESPACE                          NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
cert-manager                       cert-manager                    1/1     1            1           76d
cert-manager                       cert-manager-cainjector         1/1     1            1           76d
cert-manager                       cert-manager-webhook            1/1     1            1           76d
default                            nginx-test                      2/2     2            2           18m
kube-system                        coredns                         2/2     2            2           96d
kube-system                        kube-dns-autoscaler             1/1     1            1           96d
native-ingress-controller-system   oci-native-ingress-controller   1/1     1            1           76d
velero                             velero                          1/1     1            1           71m
```

なんだこのエラーは？と思いずっとエラーを探してみましたが、見つかりませんでした。  

ただ、バックアップの作成とリストアは問題なく行えていることは上記の通り確かです。

もしかしたらdeploymentとdaemonsetの両方を見に行っているのかも？

分かる方がいらっしゃいましたら、教えてください・・・。