このトピックでは、Velero を restic と統合して、自己構築 Kubernetes クラスターから Container Service for Kubernetes cluster にアプリケーションと PV (persistent volume) を移行する方法について説明します。 同じ方法を使用して、別のクラウドベンダーが管理する Kubernetes クラスターからアプリケーションと PV を Kubernetes クラスターの Container Service に移行することもできます。

このタスクについて

この例では、WordPress アプリケーションを自己構築 Kubernetes クラスターから Container Service for Kubernetes cluster に移行します。 WordPress アプリケーションは、WordPress および mysql コンポーネントで構成されています。 各コンポーネントは、個別のネットワークファイルシステム (NFS) PV を使用してアプリケーションデータを保存します。 WordPress アプリケーションは NodePort サービスを通じて公開されます。

手順

  1. 手順 1: Container Registry へのコンテナイメージの移行
  2. 手順 2: Container Service for Kubernetes cluster への MinIO のデプロイ
  3. 手順 3: 自己構築 Kubernetes クラスターへの WordPress アプリケーションと Velero のデプロイ
  4. 手順 4: Kubernetes クラスターの Container Service への Velero のデプロイ、WordPress アプリケーションの復元
  5. 手順 5: WordPress アプリケーションの実行ステータスの確認

手順 1: Container Registry へのコンテナイメージの移行

通常、自己構築 Kubernetes クラスターはローカル IDC に存在し、コンテナイメージは自己構築イメージリポジトリに保存されます。 アプリケーションを移行する前に、コンテナイメージを Container Registry に移行する必要があります。 詳細については、「コンテナイメージの移行」をご参照ください。

WordPress アプリケーションは、次のコンテナイメージを使用します。
registry.api.paas.com:5000/admin/wordpress:latest
registry.api.paas.com:5000/admin/mysql:8
移行後、Container Registry の対応するイメージは次のとおりです。
registry.cn-hangzhou.aliyuncs.com/ack-migration/wordpress:latest
registry.cn-hangzhou.aliyuncs.com/ack-migration/mysql:8

手順 2: Container Service for Kubernetes cluster への MinIO のデプロイ

MinIO はオブジェクトストレージサービスです。 WordPress アプリケーションを移行するときに、MinIO を使用して、WordPress アプリケーションで使用される PV のデータを一時的に保存することができます。

  1. MinIO の名前空間を作成します。
    kubectl create ns minio
  2. MinIO にログインするためのユーザー名とパスワードを設定します。 minio.yaml ファイルの MINIO_ACCESS_KEY_VALUEおよび MINIO_SECRET_KEY_VALUE をそれぞれユーザー名とパスワードに置き換えます。 MinIO を Kubernetes クラスターの Container Service にデプロイします。
    export MINIO_ACCESS_KEY=admin
    export MINIO_SECRET_KEY=admin12345
    export BUCKET_NAME=velero
    sed -i "s/MINIO_ACCESS_KEY_VALUE/$MINIO_ACCESS_KEY/g" minio.yaml
    sed -i "s/MINIO_SECRET_KEY_VALUE/$MINIO_SECRET_KEY/g" minio.yaml
    sed -i "s/BUCKET/$BUCKET_NAME/g" minio.yaml
    kubectl apply -f minio.yaml
    PV のデータを保存するために、20 GB の標準ソリッドステートドライブ (SSD) ディスクが MinIO アプリケーションに接続されています。 MinIO アプリケーションは、LoadBalancer サービスを介して公開されます。 velero という名前のバケットが MinIO に作成されます。
    minio.yaml ファイルのサンプルコードは次のとおりです。
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: storage-pvc
      namespace: minio-test
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: alicloud-disk-ssd
      resources:
        requests:
          storage: 20Gi
    
    ---
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      namespace: minio-test
      name: minio
      labels:
        component: minio
    spec:
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            component: minio
        spec:
          volumes:
          - name: storage
            persistentVolumeClaim:
              claimName: storage-pvc
          - name: config
            emptyDir: {}
          containers:
          - name: minio
            image: minio/minio:latest
            imagePullPolicy: IfNotPresent
            args:
            - server
            - /storage
            - --config-dir=/config
            env:
            - name: MINIO_ACCESS_KEY
              value: MINIO_ACCESS_KEY_VALUE
            - name: MINIO_SECRET_KEY
              value: MINIO_SECRET_KEY_VALUE
            ports:
            - containerPort: 9000
            volumeMounts:
            - name: storage
              mountPath: "/storage"
            - name: config
              mountPath: "/config"
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      namespace: minio-test
      name: minio
      labels:
        component: minio
    spec:
      # ClusterIP は本番環境に推奨されます。
      # ドキュメントごとに必要に応じて NodePort に変更します。
      # ただし、Minikube などのテスト/試用環境で MinIO を実行する場合のみです。
      type: LoadBalancer
      ports:
        - port: 9000
          targetPort: 9000
          protocol: TCP
      selector:
        component: minio
    
     ---
     apiVersion: batch/v1
    kind: Job
    metadata:
      namespace: minio-test
      name: minio-setup
      labels:
        component: minio
    spec:
      template:
        metadata:
          name: minio-setup
        spec:
          restartPolicy: OnFailure
          volumes:
          - name: config
            emptyDir: {}
          containers:
          - name: mc
            image: minio/mc:latest
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - "mc --config-dir=/config config host add BUCKET http://minio:9000 MINIO_ACCESS_KEY_VALUE MINIO_SECRET_KEY_VALUE && mc --config-dir=/config mb -p BUCKET/BUCKET"
            volumeMounts:
            - name: config
              mountPath: "/config"
  3. Container Service コンソールに移動します。 左側のナビゲーションウィンドウで、[ディスカバリとロードバランシング] > [サービス] をクリックします。 サービスページで、対象のクラスタと名前空間を選択します。
    サービスリストに、デプロイされた MinIO サービスが表示されます。
  4. MinIO サービスのパブリックエンドポイントをクリックして、IP アドレスとポート番号を使用して MinIO ブラウザーにアクセスします。

手順 3: 自己構築 Kubernetes クラスターへの WordPress アプリケーションと Velero のデプロイ

  1. 自己構築 Kubernetes クラスターに WordPress アプリケーションをデプロイします。
    この例では、自己構築 Kubernetes クラスターに WordPress アプリケーションを作成し、Kubernetes クラスターの Container Service にアプリケーションを移行します。 既存のアプリケーションを移行する場合は、この手順をスキップしてください。
    WordPress アプリケーションは、WordPress および mysql コンポーネントで構成されています。 各コンポーネントは、個別の NFS PV を使用してアプリケーションデータを保存します。 WordPress アプリケーションは NodePort サービスを通じて公開されます。 WordPress アプリケーションをデプロイするための YAML ファイルのサンプルコードは次のとおりです。
    # 1. NFS StorageClass を作成します。
    $ cat nfs-sc.yaml
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: nfs
    provisioner: helm.default/nfs
    reclaimPolicy: Delete
    $ kubectl apply -f nfs-sc.yaml
    
    # 2. mysql コンポーネントのパスワードを保存するシークレットを作成します。 パスワードが mysql であると仮定します。 echo -n "mysql" |base64 コマンドを実行して、パスワードの Base64 エンコード文字列を取得することができます。
    $ cat secret.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysql
    type: Opaque
    data:
      password: bXlzcWw=
    $ kubectl apply -f secret.yaml
    
    # 3. mysql コンポーネントのサービス、PVC (persistent volume claim)、およびデプロイメントを作成します。
    $ cat mysql.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
      labels:
        app: mysql
    spec:
      type: ClusterIP
      ports:
        - port: 3306
      selector:
        app: mysql
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mysql-volumeclaim
      annotations:
        volume.beta.kubernetes.io/storage-class: "nfs"
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mysql
      labels:
        app: mysql
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          securityContext:
            runAsUser: 999
            runAsGroup: 999
            fsGroup: 999
          containers:
            - image: registry.api.paas.com:5000/admin/mysql:8
              name: mysql
              args:
                - "--default-authentication-plugin=mysql_native_password"
              env:
                - name: MYSQL_ROOT_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: mysql
                      key: password
              ports:
                - containerPort: 3306
                  name: mysql
              volumeMounts:
                - name: mysql-persistent-storage
                  mountPath: /var/lib/mysql
          volumes:
            - name: mysql-persistent-storage
              persistentVolumeClaim:
                claimName: mysql-volumeclaim
     $ kubectl apply -f mysql.yaml
    
     # 4. wordpress コンポーネント用の PVC、デプロイメント、およびサービスを作成します。
     $ cat wordpress.yaml
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: wordpress
      name: wordpress
    spec:
      ports:
        - port: 80
          targetPort: 80
          protocol: TCP
          nodePort: 31570
      selector:
        app: wordpress
      type: NodePort
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: wordpress-volumeclaim
      annotations:
        volume.beta.kubernetes.io/storage-class: "nfs"
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: wordpress
      labels:
        app: wordpress
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: wordpress
      template:
        metadata:
          labels:
            app: wordpress
        spec:
          containers:
            - image: registry.api.paas.com:5000/admin/wordpress
              name: wordpress
              env:
              - name: WORDPRESS_DB_HOST
                value: mysql:3306
              - name: WORDPRESS_DB_PASSWORD
                valueFrom:
                  secretKeyRef:
                    name: mysql
                    key: password
              ports:
                - containerPort: 80
                  name: wordpress
              volumeMounts:
                - name: wordpress-persistent-storage
                  mountPath: /var/www/html
          volumes:
            - name: wordpress-persistent-storage
              persistentVolumeClaim:
                claimName: wordpress-volumeclaim
     $ kubectl apply -f wordpress.yaml
    テスト環境で、WordPress アプリケーションのドメイン名を、お使いのオペレーティングシステムのホストファイルでアプリケーションがデプロイされているノードの IP アドレスにバインドします。 http://wordpress.myk8s.paas.com:31570/ から WordPress アプリケーションにアクセスします。 WordPress アプリケーションにアクセスできることをご確認ください。
  2. Velero を自己構築 Kubernetes クラスターにデプロイします。
    1. Velero をダウンロードしてインストールし、Velero のバージョンを確認してインストールを確認します。
      この例で使用されるインストールパッケージは velero-v1.2.0-linux-amd64.tar.gz です。
      $ tar xvf velero-v1.2.0-linux-amd64.tar.gz
      $ mv velero-v1.2.0-linux-amd64/velero /usr/bin/velero
      $ velero version
      Client:
        Version: v1.2.0
        Git commit: 5d008491bbf681658d3e372da1a9d3a21ca4c03c
      Server:
        Version:
    2. MinIO のアクセス情報を credentials-velero ファイルに追加します。
      [default]
      aws_access_key_id=<YourAccessKeyId>
      aws_secret_access_key=<YourAccessKeySecret>
      上記のコードでは、 YourAccessKeyIdYourAccessKeySecret を MinIO にログインするためのユーザー名とパスワードに置き換えます。
    3. 次のコマンドで MINIO_SERVER_ADDRESSを MinIO サーバーの実際のアドレスに置き換え、コマンドを実行して Velero をデプロイします。
      velero install --provider aws --image registry.cn-hangzhou.aliyuncs.com/acs/velero:v1.2.0 --bucket velero --secret-file ./credentials-velero --use-volume-snapshots=false --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://MINIO_SERVER_ADDRESS:9000 --use-restic --plugins registry.cn-hangzhou.aliyuncs.com/acs/velero-plugin-for-aws:v1.0.0 --wait
    4. ポッドの実行ステータスを確認します。
      kubectl -n velero get po
      NAME                      READY   STATUS    RESTARTS   AGE
      restic-fqwsc              1/1     Running   0          41s
      restic-kfzqt              1/1     Running   0          41s
      restic-klxhc              1/1     Running   0          41s
      restic-ql2kr              1/1     Running   0          41s
      restic-qrsrn              1/1     Running   0          41s
      restic-srjmm              1/1     Running   0          41s
      velero-67b975f5cb-68nj4   1/1     Running   0          41s
  3. WordPress アプリケーションをバックアップします。
    • PV なしで WordPress アプリケーションのみをバックアップする場合は、次のコマンドを実行します。
      $ velero backup create wordpress-backup-without-pv --include-namespaces wordpress
      Backup request "wordpress-backup-without-pv" submitted successfully.
      Run `velero backup describe wordpress-backup-without-pv` or `velero backup logs wordpress-backup-without-pv` for more details.
      
      $ velero backup get
      NAME                          STATUS      CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
      wordpress-backup-without-pv   Completed   2019-12-12 14:08:24 +0800 CST   29d       default            <none>
    • PV を使用して WordPress アプリケーションをバックアップする場合は、次のコマンドを実行します。
      # PV が接続されているポッドに注釈を付けます。 WordPress アプリケーションは、wordpress-7cf5849f47-mbvx4 と mysql-74dddbdcc8-h2tls の 2 つのポッドで実行されると仮定します。
      # wordpress-7cf5849f47-mbvx4 ポッドに接続されている PV は mysql-persistent-storage です。 mysql-74dddbdcc8-h2tls ポッドにアタッチされる PV は pod is wordpress-persistent-storage です。 ポッドに注釈を付けるためのコマンドは次のとおりです。
      $ kubectl -n wordpress annotate pod/wordpress-7cf5849f47-mbvx4 backup.velero.io/backup-volumes=wordpress-persistent-storage
      pod/wordpress-7cf5849f47-mbvx4 annotated
      $ kubectl -n wordpress annotate pod/mysql-74dddbdcc8-h2tls backup.velero.io/backup-volumes=mysql-persistent-storage
      pod/mysql-74dddbdcc8-h2tls annotated
      
      # WordPress アプリケーションをバックアップします。
      $ velero backup create wordpress-backup-with-pv --include-namespaces wordpress
      Backup request "wordpress-backup-with-pv" submitted successfully.
      Run `velero backup describe wordpress-backup-with-pv` or `velero backup logs wordpress-backup-with-pv` for more details.
      $ velero backup get
      NAME                          STATUS      CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
      wordpress-backup-with-pv      Completed   2019-12-12 14:23:40 +0800 CST   29d       default            <none>
      wordpress-backup-without-pv   Completed   2019-12-12 14:08:24 +0800 CST   29d       default            <none>
    バックアップファイルは MinIO サーバーにあります。

手順 4: Kubernetes クラスターの Container Service への Velero のデプロイ、WordPress アプリケーションの復元

  1. Kubernetes クラスターの Container Service に Velero をデプロイします。
    Kubernetes クラスターの Container Service に Velero をデプロイする方法は、自己構築 Kubernetes クラスターの方法と似ています。 詳細については、 「 Velero への自己構築 Kubernetes クラスターのデプロイ (Deploy Velero in the self-built Kubernetes cluster)」をご参照ください。
    Kubernetes クラスターの Container Service に Velero をデプロイした後、次のコマンドを実行してバックアップのステータスを確認します。
    $ velero backup get
    NAME                          STATUS      CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
    wordpress-backup-with-pv      Completed   2019-12-12 14:23:40 +0800 CST   29d       default            <none>
    wordpress-backup-without-pv   Completed   2019-12-12 14:08:24 +0800 CST   29d       default            <none>
  2. WordPress アプリケーションを Kubernetes クラスターの Container Service に復元します。
    自己構築 Kubernetes クラスターでは、WordPress アプリケーションは NFS PV を使用します。 したがって、Kubernetes クラスターの Container Service で WordPress アプリケーションの Apsara File Storage NAS ボリュームを設定することができます。 この例では、WordPress アプリケーション用の NFS StorageClass を作成しますが、Alibaba Cloud SSD ディスクをバックエンドストレージとして使用します。

    この例では、Container Service for Kubernetes クラスターは Container Storage Interface (CSI) プラグインを使用します。 詳細については、「動的ディスクボリュームの使用」をご参照ください。

    1. StorageClass の作成
      PV なしで WordPress アプリケーションを復元する場合は、この手順をスキップしてください。
      $ cat nfs.yaml
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
         name: nfs
      provisioner: diskplugin.csi.alibabacloud.com
      parameters:
          type: cloud_ssd
      reclaimPolicy: Retain
      
      $ kubectl apply -f nfs.yaml
      storageclass.storage.k8s.io/nfs created
    2. WordPress アプリケーションを復元します。
      $ velero restore create --from-backup wordpress-backup-with-pv
      $ velero restore get
      NAME                                      BACKUP                     STATUS       WARNINGS   ERRORS   CREATED                         SELECTOR
      wordpress-backup-with-pv-20191212152745   wordpress-backup-with-pv   InProgress   0          0        2019-12-12 15:27:45 +0800 CST   <none>
      $ velero restore get
      ここで WordPress アプリケーションの実行ステータスを確認すると、コンテナイメージをプルできないことを示すエラーが返されます。
      $ kubectl -n wordpress get po
      NAME                         READY   STATUS         RESTARTS   AGE
      mysql-669b4666cd-trsnz       0/1     ErrImagePull   0          19m
      mysql-74dddbdcc8-h2tls       0/1     Init:0/1       0          19m
      wordpress-7cf5849f47-mbvx4   0/1     Init:0/1       0          19m
      wordpress-bb5d74d95-xcjxw    0/1     ErrImagePull   0          19m
    3. wordpress および myswl デプロイメントのイメージフィールドを、コンテナレジストリに移行されたコンテナイメージの URL に設定します。 詳細については、「手順 1: Container Registry へのコンテナイメージの移行」をご参照ください。
      # ディプロイメント内のイメージ URL を変更します。
      $ kubectl -n wordpress edit deployment mysql
      $ kubectl -n wordpress edit deployment wordpress

手順 5: WordPress アプリケーションの実行ステータスの確認

以下のコマンドを実行して、WordPress アプリケーションの実行ステータスを確認します。
$ kubectl -n wordpress get po
NAME                         READY   STATUS    RESTARTS   AGE
mysql-678b5d8499-vckfd       1/1     Running   0          100s
wordpress-8566f5f7d8-7shk6   1/1     Running   0          3m18s

テスト環境で、WordPress アプリケーションのドメイン名を、お使いのオペレーティングシステムのホストファイルでアプリケーションがデプロイされているノードの IP アドレスにバインドします。 http://wordpress.myk8s.paas.com:31570/ から WordPress アプリケーションにアクセスします。 WordPress アプリケーションにアクセスできることをご確認ください。