VMware vSphere上のRancherにstorage classを割り当ててDynamicにPVを作ってもらう


前回記事で、Proxy下にあるVMware vSphere上にRancherを入れて、Harborを構築する検証をしました。
構築することはできたのですが、しばらくしてからアクセスするとProjectにimageのリストはあるのにPullできない状態になっていました。
Persisitent Volume(永続ボリューム?)なしで立ち上げたので、その後何度かPodが再作成され、image本体が失われてしまったのだとわかりました。

そこで、検証の一環としてRancherにstorage classを設定して、動的なPVC/PV払い出しを行いました。

Cluster への設定

vSphere上でRancherに動的PVを作成させるためには、Clusterへの設定が必要になります。
Cluster作成時に、Edit as YAML をクリックして rancher_kubernetes_engine_config: 下に下記のような設定を追記します。

cloud_provider:
  name: vsphere
  vsphereCloudProvider:
    global:
      insecure-flag: true       # 今回の検証環境ではオレオレ証明書を使用しているので有効に
    virtual_center:
      vc.example.com:           # vCenter URL
        user: provisioner       # vCenter へのアクセスユーザ
        password: secret        # パスワード
        port: 443
        datacenters: /eu-west-1 # 使用するdatacenterのパス
    workspace:
      server: vc.example.com                       # vCenter URL 上記と異なるパターンは試してません
      folder: /eu-west-1/folder/myvmfolder         # dummy vm が作成されるディレクトリ
      default-datastore: /eu-west-1/datastore/ds-1 # storage classで指定しなかった場合に使用されるdatastore
      datacenter: /eu-west-1                       # 使用するdatacenterのパス 上記と異なるパターンは試してません
      resourcepool-path: /eu-west-1/host/hn1/resources/myresourcepool # リソースプールを使用したい場合(今回は使用せず)

Clusterを作成し、Provisioningが完了するのを待ちます

各種設定については を参照ください。
vSphere Configuration Reference

Storage Classの作成

Cluster作成が完了したら、Rancher の Storage -> Storage Classes から作成します。
名前だけ設定して、他パラメータはデフォでOKでした。
上記で設定したdefault-datastoreを使用しないのであれば、ここのDatastoreで設定するものと思います(実施はしていません)。

アプリのデプロイ

アプリカタログからアプリをデプロイします。
この時、Rancherに登録されているカタログであればGUIから、自前で追加したのカタログであればYAMLをEditして、上記で作成したstorage classを選択してデプロイします。

デプロイしてPVが作成されると、Cluster作成時に指定したdefault-datastoreもしくは、Storage Classを作成した時のDatastoreで指定したストレージに、kubevolsというディレクトリが作成されます。
そして、そこにデータが格納されることがvSphere上から確認できます。

HarborのPV

というわけで、Harborのマニフェストを修正して

persistence:
  enabled: true
  persistentVolumeClaim: 
    registry: 
      storageClass: "vsphere-volume"
      size: "5Gi"
    jobservice: 
      storageClass: "vsphere-volume"
      size: "1Gi"
    database: 
      storageClass: "vsphere-volume"
      size: "5Gi"
    redis: 
      storageClass: "vsphere-volume"
      size: "5Gi"

無事にPV付きでデプロイされたのでした。

お し ま い