何気に長い間、できなくて困っていた事象。1000本ノックではなく1万本ノックくらいしていた気分。。。こういうことって無いだろうか?ある日突然、神降臨的に判明する。さすが今日、初詣に行った甲斐があるような。
閑話休題
LonghornでCSIストレージスナップショットを利用する場合、バックアップターゲットの設定が必要となる。サポートされているバックアップターゲットは、S3/S3互換のオブジェクトストレージとNFS v4サーバ。ただし、あくまでもローカルスナップショットなので、クラウド上のストレージは使いたくない。ここでは、minioを利用することにした。
実際の設定はhelmでインストールすればかなり簡単で、Longhornのドキュメントによると以下のコマンドで設定ができる。
まず、helmでのLonghornのインストール
helm install longhorn longhorn/longhorn --namespace longhorn-system --set defaultSettings.backupTarget="s3://backupbucket@us-east-1/" --set defaultSettings.backupTargetCredentialSecret="minio-secret"
次にLonghornのスナップショット格納用のminioの展開
kubectl create -f https://raw.githubusercontent.com/longhorn/longhorn/v1.4.0/deploy/backupstores/minio-backupstore.yaml
たったこれだけ。ただし、このminioはあくまでもテスト用なので、本番では使いたくない。それにもし、minioを他で設置していたとしたら、このminioではなく、設置済みのminioを使いたいところ。自分がもっていたminioは、自己証明書で動作するminio、つまりhttpsでアクセスできるminioだった。(この発想が長いクエストへ導くものとなった。。。)
実際の設定
実は順番が重要だったりする。
自己証明書で動作するminioの注意点
自己証明書は、CAから作った証明書であること。Veleroを使うときもCA.pemは必要なので、やっておいて損はない。具体的には、
- /root/.minio/certs/public.crt
- /root/.minio/certs/CAs/rootCA.pem
が存在している必要がある。
Minioのバケットを作成する
mc mb local/<バケット名>
Longhornのダッシュボードでの設定
Longhornのダッシュボードは、port-forwardさせてもいいし、Loadbalancer経由で露出しても構わない。認証なしでアクセスできるはず。 Longhornのダッシュボードを開きSettings->Backup TargetとBackup Target Credential Secretを入力して保存をする。
secretファイルの作成
secretの変数は、base64エンコードにしなければならない。ちょっと面倒なので、以下のように実行する。
MCLOGINUSER=ユーザ名
MCLOGINPASSWORD=パスワード
MINIO_ENDPOINT="https://<MINIOのホスト名あるいは、IPアドレス>:9000"
MINIOCERTDIR=/root/.minio/certs
AWS_ENDPOINTS=`echo -n ${MINIO_ENDPOINT} | base64`
AWS_ACCESS_KEY_ID=`echo -n ${MCLOGINUSER} | base64`
AWS_SECRET_ACCESS_KEY=`echo -n ${MCLOGINPASSWORD} | base64`
AWS_CERT=`cat ${MINIOCERTDIR}/CAs/rootCA.pem | base64 | tr -d "\n"`
cat <<EOF > longhorn-minio.yaml
apiVersion: v1
kind: Secret
metadata:
name: minio-secret-local
namespace: longhorn-system
type: Opaque
data:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_ENDPOINTS: ${AWS_ENDPOINTS}
AWS_CERT: ${AWS_CERT}
EOF
cat longhorn-minio.yaml
結果。以下のようなファイルが作成されるはず。
apiVersion: v1
kind: Secret
metadata:
name: minio-secret-local
namespace: longhorn-system
type: Opaque
data:
AWS_ACCESS_KEY_ID: <base64で記載されたユーザ名>
AWS_SECRET_ACCESS_KEY: <base64で記載されたパスワード>
AWS_ENDPOINTS: <base64で記載されたhttps://XXXXX:9000>
AWS_CERT: <すごーく長いbase64>
このファイルを適用する。
kubectl create -f longhorn-minio.yaml
これで一応終わりのはず。
ボリュームのバックアップやCSIスナップショットを作成すると
Longhornのダッシュボードでは、
Minio上では、
となっているはずである。
何に苦労したのか?
- 先にSecretを登録してからダッシュボードで設定すると、AWS_CERTに改行か空白があると言われて正しく動かず。
- Backup Targetの記載が間違っていた。s3://<バケット名>@us-east-1/ とする必要があった。
これでLonghornのために余計なminioを展開する必要がなくなった。