見出し画像

Rancher Harvesterでk8sから仮想マシンを管理する

本記事は、Japan Digital Design Advent Calendar 2020 19日目の記事です。
(Rancher LabsのHarvesterの発表に伴い12/19以前に急遽公開していました)

2021/2/15 ログイン時に初期ID/パスワードを使ってログインする方法について追記しました。

Rancher Harvesterって何?

Rancher HarvesterRancher Labsが開発中?(※1)のハイパーコンバージドインフラストラクチャ(HCI)ソリューションです。Kubernetes(とKubeVirt、minio、Longhorn)をベースとして仮想マシンを管理します。

※1 ... Rancher Labsのブログなど、どこにも出ておらず、Rancher LabsのGitHubのOrganization配下で作られているだけなので製品として出てくるかは不明です。と思いましたが、リリース(Announcing Harvester: Open Source Hyperconverged Infrastructure (HCI) Software)出ちゃいましたね。

画像16

前提条件

Rancher Harvesterでは以下の2つが前提として必要です。

Longhornの導入
Minioの導入(※2)
・仮想化支援機能がハードウェアとして備わっていること(※3)

LonghornはRancher Labsが主導して開発しているKuberenetesで利用することを前提とした分散ブロックストレージです。CNCFのSandboxプロジェクトとしてCNCFの支援を受けつつ開発を進めています。

、、MinioはMinIO社が開発しているS3互換のオブジェクトストレージです。
※2 ... Harvesterに付属しているMinioがうまく動作しなかったため、別途導入しています。

仮想化支援機能については、詳細については調べていませんが、Intel VT-xなどがCPUで有効であれば問題ないはずです。

またKubernetes環境にはk3sを利用しています。k3sもLonghornと同様にRancher Labsが主導して開発しているKubernetesのディストリビューションです。

Harvester自体は特定のKubernetesディストリビューションで動作するものなので、特に縛りは無いはずです。

導入手順

k3sの導入と起動

https://github.com/k3s-io/k3s/releases に移動して、k3sの最新版リリース版をダウンロードします。

$ wget https://github.com/k3s-io/k3s/releases/download/v1.19.4%2Bk3s1/k3s
$ chmod +x k3s
$ sudo mv k3s /usr/local/bin

k3s --versionコマンドで確認してみます。

$ k3s --version
k3s version v1.19.4+k3s1 (2532c10f)


​正常に導入できています。
早速起動させていきましょう。

$ sudo k3s server --write-kubeconfig-mode 644 --write-kubeconfig `pwd`/k3s.yaml

これでカレントディレクトリにkubeconfigファイルを生成しつつ、k8sのシングルノードクラスタが起動します。

$ export KUBECONFIG=`pwd`/k3s.yaml

k3s.yamlが生成されたらkubectlでサーバが正常動作しているかを確認します。

$ k3s kubectl get nodes
NAME                           STATUS   ROLES    AGE     VERSION
fujiwara-hp-z440-workstation   Ready    master   6m34s   v1.19.4+k3s1

これが終わったらLonghornの導入を行います。

Longhornの導入

Longhornの前提条件としてopen-iscsiの導入が必要なので、導入していきます。

$ sudo apt-get update
$ sudo apt-get -y install open-iscsi

パッケージの導入が完了したら、Longhornの導入条件をクリアしているかを確認するスクリプトを実行します。

$ curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/master/scripts/environment_check.sh | bash
daemonset.apps/longhorn-environment-check created
waiting for pods to become ready (0/1)
waiting for pods to become ready (0/1)
all pods ready (1/1)

 MountPropagation is enabled!

cleaning up...
daemonset.apps "longhorn-environment-check" deleted
clean up complete

特に何もエラー表示が出なければ問題ありません。

LonghornのデプロイにはHelmを使ったデプロイや、Rancherのカタログ機能を使ったデプロイもありますが、今回はシンプルにkubectlを使ってデプロイします。

longhorn.yamlファイルをlonghorn/longhornリポジトリから取得します。

$ wget https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yam

longhorn.yamlファイルを開いてL.495あたりを修正します。

          # Manually set root directory for csi
         - name: KUBELET_ROOT_DIR
           value: /var/lib/kubelet

修正が終わったらkubectlコマンドでapplyします。

$ kubectl apply -f longhorn.yaml

しばらくデプロイまで時間がかかるのでkubectl get pods --watchしながら待ちます。

$ kubectl get pods -n longhorn-system --watch
NAME                                        READY   STATUS    RESTARTS   AGE
longhorn-ui-68b99bd456-p4972                1/1     Running   0          139m
instance-manager-r-ef94bf5d                 1/1     Running   0          138m
instance-manager-e-c1cb3ad1                 1/1     Running   0          138m
engine-image-ei-ee18f965-gl9wm              1/1     Running   0          138m
longhorn-manager-dkpbp                      1/1     Running   0          139m
longhorn-driver-deployer-5b8f57cfcb-9tp62   1/1     Running   0          139m
csi-provisioner-67846b4b55-4qz9m            1/1     Running   0          137m
csi-provisioner-67846b4b55-sqfqs            1/1     Running   0          137m
csi-attacher-7cb499df6-f87tr                1/1     Running   0          137m
csi-attacher-7cb499df6-rhnqd                1/1     Running   0          137m
csi-provisioner-67846b4b55-42cch            1/1     Running   0          137m
csi-attacher-7cb499df6-nbr9n                1/1     Running   0          137m
csi-resizer-5cb8df7db9-srfsj                1/1     Running   0          137m
longhorn-csi-plugin-45nlq                   2/2     Running   0          137m
csi-resizer-5cb8df7db9-qfh4h                1/1     Running   0          137m
csi-resizer-5cb8df7db9-kllwt                1/1     Running   0          137m

podがあらかた立ち上がったらkubectl get svcでアクセスに使うIPアドレスを確認します。

$ kubectl get svc -n longhorn-system
NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
longhorn-backend    ClusterIP   10.43.97.33    <none>        9500/TCP    140m
longhorn-frontend   ClusterIP   10.43.59.88    <none>        80/TCP      140m
csi-attacher        ClusterIP   10.43.189.34   <none>        12345/TCP   138m
csi-provisioner     ClusterIP   10.43.161.15   <none>        12345/TCP   138m
csi-resizer         ClusterIP   10.43.1.209    <none>        12345/TCP   138m

longhorn-frontendのCLUSTER-IPでアクセスしますポートは80/TCPとなっているので、この場合はhttp://10.43.59.88でアクセスします。

画像1

このようにLonghornのブラウザUIが表示されれば成功です。

Minioの導入

次は仮想マシンイメージを保持するためにminioを導入します。

まずは、後々minioの認証情報をHarvesterに引き渡すのでHarvesterをデプロイするNamespaceを作成します。

$ kubectl create namespace harvester-system

ーーーーhelmの導入手順を追加するーーーー

minioのHelmリポジトリを有効化します。

$ helm repo add minio https://helm.min.io

minioをharvester-system名前空間に導入します。

$ helm install --namespace harvester-system minio minio/minio
NAME: minio
LAST DEPLOYED: Sun Dec 13 15:22:17 2020
NAMESPACE: harvester-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Minio can be accessed via port 9000 on the following DNS name from within your cluster:
minio.harvester-system.svc.cluster.local

To access Minio from localhost, run the below commands:

 1. export POD_NAME=$(kubectl get pods --namespace harvester-system -l "release=minio" -o jsonpath="{.items[0].metadata.name}")

 2. kubectl port-forward $POD_NAME 9000 --namespace harvester-system

Read more about port forwarding here: http://kubernetes.io/docs/user-guide/kubectl/kubectl_port-forward/

You can now access Minio server on http://localhost:9000. Follow the below steps to connect to Minio server with mc client:

 1. Download the Minio mc client - https://docs.minio.io/docs/minio-client-quickstart-guide

 2. Get the ACCESS_KEY=$(kubectl get secret minio -o jsonpath="{.data.accesskey}" | base64 --decode) and the SECRET_KEY=$(kubectl get secret minio -o jsonpath="{.data.secretkey}" | base64 --decode)

 3. mc alias set minio-local http://localhost:9000 "$ACCESS_KEY" "$SECRET_KEY" --api s3v4

 4. mc ls minio-local

Alternately, you can use your browser or the Minio SDK to access the server - https://docs.minio.io/categories/17

minioにアクセスするには
1. minioにアクセスするためのIPアドレス, ポート情報
2. minioのアクセスキー
3. minioのシークレットキー
の3つが必要です。2, 3についてはhelm install実行時に取得方法が表示されています。

では、minioのIPアドレスとポート情報を取得しましょう。

$ kubectl get svc minio -n harvester-system
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
minio   ClusterIP   10.43.215.62   <none>        9000/TCP   142m

minioのCLUSTER-IPが10.43.215.62、ポート番号が9000なので、http://10.43.215.62:9000でブラウザからminioにアクセスできます。また、これは後ほど、minioのエンドポイントとしても利用するのでメモしておきましょう。

次にminioのアクセスキーを取得します。

$ kubectl get secret minio -o jsonpath="{.data.accesskey}" --namespace harvester-system | base64 --decode
vdWKspIiy7AlrpWRjU8C

最後にminioのシークレットキーを取得します。

$ kubectl get secret minio -o jsonpath="{.data.secretkey}" --namespace harvester-system | base64 --decode
c5R12AIgZ9HAAzzgzlRN5wq9G9LdZfV24jaNamE9

アクセスキーとシークレットキーをメモした上でminioの画面にWebブラウザを使ってアクセスします。

画像2

上でメモしたアクセスキーと、シークレットキーを使ってログインします。ログインしたら右下の+ボタンからオブジェクトバケットを作成します。
バケットの名前はvm-imagesとしてください。

画像3

ここまで完了したらminioの準備は完了です。

また、次のHarvesterではここで生成されているシークレットリソースを利用します。minioをデプロイするとharvester-system名前空間にminioシークレットリソースが生成されているのでこれを利用します。

$ kubectl get secrets minio -n harvester-system
NAME    TYPE     DATA   AGE
minio   Opaque   2      150m

Harvesterのインストール

さて、本編のHarvesterのインストールです。rancher/harvesterリポジトリをクローンしてその内部で以降の作業は進めます。

$ git clone git@github.com:rancher/harvester.git
$ cd harvester/deploy/charts

HarvesterのHelmようのテンプレートがこのリポジトリには含まれているので、これを利用します。

$ helm install harvester harvester --namespace harvester-system \
   --set minio.enabled=false \
   --set containers.apiserver.vmImageStorageGateway.secretName=minio \
   --set containers.apiserver.vmImageStorageGateway.endpoint=http://10.43.215.62:9000

containers.apiserver.vmImageStorageGateway.secretNameにminio、containers.apiserver.vmImageStorageGateway.endpointにminioにアクセスするためのURLとしてhttp://10.43.215.62:9000を指定します。

kubectl get pods -n harvester-system --watchで以下のようなPodが立ち上がるまで待機します

$ kubectl get pods -n harvester-system --watch
NAME                                 READY   STATUS    RESTARTS   AGE
minio-6897d47fc5-4jmts               1/1     Running   0          152m
harvester-network-controller-2q7rb   1/1     Running   0          146m
harvester-679ff44557-nlnmk           1/1     Running   0          146m
cdi-operator-6c7bd7b867-mkkgm        1/1     Running   0          146m
virt-operator-7b99b7bbdb-5dj2p       1/1     Running   0          146m
cdi-apiserver-5d7db448bf-4gnlp       1/1     Running   0          145m
cdi-uploadproxy-5864bf9794-bnrq7     1/1     Running   0          145m
cdi-deployment-78985784-dxcnr        1/1     Running   0          145m
virt-api-59bf84667c-qdfr9            1/1     Running   0          145m
virt-api-59bf84667c-9n8vx            1/1     Running   0          145m
virt-controller-7bfcdc8bb9-sbxs9     1/1     Running   0          145m
virt-controller-7bfcdc8bb9-788xf     1/1     Running   0          145m
virt-handler-bm22w                   1/1     Running   0          145m

HarvesterのUIにアクセスするためのIPアドレス、ポートを確認します。

$ kubectl get svc harvester -n harvester-system 
NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
harvester   ClusterIP   10.43.47.182   <none>        8443/TCP   147m

上記内容から、今回はhttps://10.43.47.182:8443でアクセスできることがわかりました。早速アクセスしてみましょう。

画像4

ログイン画面に遷移します。
kubeconfigタブを選択してk3s.yamlをアップロードします。
または、Username/Passwordに初期ID/PASSとなるadmin/passwordを入力してログインします。(2021/2/15追記)

画像5

SIGN INボタンをクリックするとダッシュボード画面に遷移します。
まだ開発中とは思えないダッシュボードの見た目をしてますね。

画像6

仮想マシンイメージを設定します。Imagesをクリックした後Createボタンをクリックします。

画像7

今回はUbuntu 18.04の最も新しいリリースを利用したいのでURL欄にhttp://cloud-images.ubuntu.com/bionic/20201211.1/bionic-server-cloudimg-amd64.imgを入力してCreateボタンをクリックします。

画像8

minioのvm-imageバケットに仮想マシンイメージのダウンロードが行われます。(下図は別のイメージをダウンロードしたときの様子です)リアルタイムで進捗状況が確認できます。

画像9

ダウンロードが完了したら仮想マシンを作成します。Virtual Machinesを選択してCreateボタンをクリックします。

画像10

仮想マシンの名前と割り当てるCPUコア数、メモリ容量、利用する仮想マシンイメージを指定します。

画像11

また、ログインに必要となるSSH公開鍵を指定します。上図のCreate SSH Keyボタンをクリックします。

画像12

SSH公開鍵を入力し、Saveボタンをクリックすれば設定完了です。仮想マシンの作成画面に戻るので、Createボタンをクリックすれば仮想マシンの作成は完了です。

画像13

作成が完了すると、仮想マシン一覧画面でStateがRunningになるので、IPアドレスを確認してログインします。初期ユーザはubuntuで、公開鍵には先程設定したSSH鍵を利用します。

画像14

ログイン後にパスワードを設定しれあげればWebブラウザからコンソールまたはVNCを使ったログインが出来ます。

画像15

デスクトップ版のUbuntuを利用すればVNCを利用してGUIへのアクセスができると思います。

まとめ

・あまり動くことは期待していなかったけれども動いた
・GUIを使ってkubernetes上で動作する仮想マシンの管理が実現できた

今回はRancher Labsが開発中のHCIソリューションのHarvesterを紹介しました。Rancher Labsの製品らしく比較的容易に動作する環境を準備することが出来ました。KubeVirtのフロントエンドとしては他には知らないこともあり、k8sで仮想マシンを管理するためのツールとして今後話題になるかもしれません。

この記事が気に入ったらサポートをしてみませんか?