簡単に VM を複製? KubeVirt の ReplicaSet を試してみた

f:id:komeiy:20190810181532p:plain:w400

前回に続いて KubeVirt について書きます。

ちなみに KubeVirt ってなに?って人はこちらの前半を読んでみてください。 簡単にいうと、KubernetesVM 動かしちゃおうぜっていうものです。

komeiy.hatenablog.com

VirtualMachineInstanceReplicaSet リソースを試してみたいです。なんて記載をしていたので今回試してみました。

はじめに

ReplicaSet 使えると何が嬉しいの?ってとこですが、 Pod を指定した数だけ作ってくれます もちろん指定した数(=レプリカ)を維持する動きをしますので、Node 障害により Pod が停止すれば、別の Node で Pod を起動してくれたりします。

正直なところ、 StatefulSet が使いたい ですね・・・。VM なので Persistent Volume を使うことになると思いますが、レプリカ増やしても PVC/PV を VM ごとに準備するのが難しいです。ReplicaSet だと全 Pod が 同一の PV をアタッチすることになるので、NFS のような複数環境からマウントして利用することが前提のものであれば良いのですが、今回のような VM を立ち上げる環境だと不向きかなと思います。

とはいえ、今後に期待というところで今回は ReplicaSet を見てみます。

ReplicaSet で Kubevirt を起動

以下のような yaml になります。 VirtualMachineInstanceReplicaSet リソースを利用して VM を立ち上げます。 CRD などはすでに入っている前提です。まだだよって人は 前回記事 を参照して VM を立ち上げるテストまで進めてください。

apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstanceReplicaSet
metadata:
  name: testreplicaset
spec:
  replicas: 2
  selector:
    matchLabels:
      myvmi: myvmi
  template:
    metadata:
      name: test
      labels:
        myvmi: myvmi
    spec:
      domain:
        devices:
          disks:
          - disk:
            name: containerdisk
        resources:
          requests:
            memory: 64M
      volumes:
      - name: containerdisk
        containerDisk:
          image: kubevirt/cirros-registry-disk-demo

apply して vm を見るのですが、以下のコマンドで ReplicaSet を確認します。

$ k get vmirs
NAME             DESIRED   CURRENT   READY   AGE
testreplicaset   2         2         2       3m

VM が二台立ち上がっていることがわかります。

$ k get vmi
NAME        AGE   PHASE     IP            NODENAME
test2mwd4   3m    Running   10.112.2.14   pde-yamamoto-yoshiaki-ake-default-s-nxuhsug
test2mzhj   3m    Running   10.112.2.13   pde-yamamoto-yoshiaki-ake-default-s-nxuhsug

replicas を 1 に変更すると以下のように VM が1台に変わります。 基本的な動作ですがしっかり動いているようです。

$ k get vmirs
NAME             DESIRED   CURRENT   READY   AGE
testreplicaset   1         1         1       8m
$ k get vmi
NAME        AGE   PHASE       IP            NODENAME
test2mwd4   8m    Succeeded   10.112.2.14   pde-yamamoto-yoshiaki-ake-default-s-nxuhsug
testtgqc6   1m    Running     10.112.2.15   pde-yamamoto-yoshiaki-ake-default-s-nxuhsug
$ k get vmi
NAME        AGE   PHASE     IP            NODENAME
testtgqc6   1m    Running   10.112.2.15   pde-yamamoto-yoshiaki-ake-default-s-nxuhsug

念のため、 replicas を 3 に変更した時の挙動も確認します。

$ k get vmi
NAME        AGE   PHASE        IP            NODENAME
test4cb9d   2s    Scheduling
test95s4w   2s    Scheduling
testtgqc6   2m    Running      10.112.2.15   pde-yamamoto-yoshiaki-ake-default-s-nxuhsug
$ k get vmirs
NAME             DESIRED   CURRENT   READY   AGE
testreplicaset   3         3         1       9m

HorizontalPodAutoscaler の VirtualMachineInstanceReplicaSet 対応を確認

せっかくなので HPA(HorizontalPodAutoscaler) も確認してみます。 これは Pod をスケールアウト/インするためのリソースです。CPU 50% を基準に Pod の数を調整してくれるよう設定しています。

autoscaling/v2beta1 でないとうまく動作せず、このようにしています。おそらくこちらの問題のせいかと思うので検証したら記事をアップデートしておきます。 Replicas は検証のため 1 に戻しています。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: myhpa
spec:
  scaleTargetRef:
    kind: VirtualMachineInstanceReplicaSet
    name: testreplicaset
    apiVersion: kubevirt.io/v1alpha3
  minReplicas: 3
  maxReplicas: 6
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 50

apply すると minReplicas が 3 なので3つの Pod が作られた状態になります。

$ k get vmi
NAME        AGE   PHASE     IP            NODENAME
testjs9dd   11m   Running   10.111.2.36   pde-yamamoto-yoshiaki-ake-default-s-nxuhsug
tests4nq5   11m   Running   10.111.2.37   pde-yamamoto-yoshiaki-ake-default-s-nxuhsug
testw6rfs   11m   Running   10.111.0.18   pde-yamamoto-yoshiaki-ake-default-s-nrvublx

$ k get vmirs
NAME             DESIRED   CURRENT   READY   AGE
testreplicaset   3         3         3       11m

$ k get pod
NAME                            READY   STATUS    RESTARTS   AGE
virt-launcher-testjs9dd-gl4kg   2/2     Running   0          11m
virt-launcher-tests4nq5-8lb5n   2/2     Running   0          11m
virt-launcher-testw6rfs-db5pm   2/2     Running   0          11m

負荷かけてみます。そうすると maxReplicas である 6 台の Pod が作成されます。

$ k apply -f hpa.yaml
horizontalpodautoscaler.autoscaling/myhpa configured
$ k get pod
NAME                            READY   STATUS              RESTARTS   AGE
virt-launcher-test64n6z-ch5cz   0/1     Running             0          8s
virt-launcher-test64nz9-twz89   1/1     Running             0          48s
virt-launcher-test69hfr-dnfg2   1/1     Running             0          48s
virt-launcher-testbpsp9-xlqdn   1/1     Running             0          116s
virt-launcher-testkxrvr-ckndd   0/1     Running             0          8s

まとめ

StatefulSet がやっぱり使いたいなと思いますね。これで満足できるケースってもうコンテナ化した方が早いような。

Kubernetes完全ガイド (impress top gear)

Kubernetes完全ガイド (impress top gear)

Kubernetes実践ガイド クラウドネイティブアプリケーションを支える技術 (impress top gear)

Kubernetes実践ガイド クラウドネイティブアプリケーションを支える技術 (impress top gear)


シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。