Rancher Harvesterでk8sから仮想マシンを管理する
本記事は、Japan Digital Design Advent Calendar 2020 19日目の記事です。
(Rancher LabsのHarvesterの発表に伴い12/19以前に急遽公開していました)
2021/2/15 ログイン時に初期ID/パスワードを使ってログインする方法について追記しました。
Rancher Harvesterって何?
Rancher HarvesterはRancher Labsが開発中?(※1)のハイパーコンバージドインフラストラクチャ(HCI)ソリューションです。Kubernetes(とKubeVirt、minio、Longhorn)をベースとして仮想マシンを管理します。
※1 ... Rancher Labsのブログなど、どこにも出ておらず、Rancher LabsのGitHubのOrganization配下で作られているだけなので製品として出てくるかは不明です。と思いましたが、リリース(Announcing Harvester: Open Source Hyperconverged Infrastructure (HCI) Software)出ちゃいましたね。
前提条件
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でアクセスします。
このように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ブラウザを使ってアクセスします。
上でメモしたアクセスキーと、シークレットキーを使ってログインします。ログインしたら右下の+ボタンからオブジェクトバケットを作成します。
バケットの名前はvm-imagesとしてください。
ここまで完了したら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でアクセスできることがわかりました。早速アクセスしてみましょう。
ログイン画面に遷移します。
kubeconfigタブを選択してk3s.yamlをアップロードします。
または、Username/Passwordに初期ID/PASSとなるadmin/passwordを入力してログインします。(2021/2/15追記)
SIGN INボタンをクリックするとダッシュボード画面に遷移します。
まだ開発中とは思えないダッシュボードの見た目をしてますね。
仮想マシンイメージを設定します。Imagesをクリックした後Createボタンをクリックします。
今回はUbuntu 18.04の最も新しいリリースを利用したいのでURL欄にhttp://cloud-images.ubuntu.com/bionic/20201211.1/bionic-server-cloudimg-amd64.imgを入力してCreateボタンをクリックします。
minioのvm-imageバケットに仮想マシンイメージのダウンロードが行われます。(下図は別のイメージをダウンロードしたときの様子です)リアルタイムで進捗状況が確認できます。
ダウンロードが完了したら仮想マシンを作成します。Virtual Machinesを選択してCreateボタンをクリックします。
仮想マシンの名前と割り当てるCPUコア数、メモリ容量、利用する仮想マシンイメージを指定します。
また、ログインに必要となるSSH公開鍵を指定します。上図のCreate SSH Keyボタンをクリックします。
SSH公開鍵を入力し、Saveボタンをクリックすれば設定完了です。仮想マシンの作成画面に戻るので、Createボタンをクリックすれば仮想マシンの作成は完了です。
作成が完了すると、仮想マシン一覧画面でStateがRunningになるので、IPアドレスを確認してログインします。初期ユーザはubuntuで、公開鍵には先程設定したSSH鍵を利用します。
ログイン後にパスワードを設定しれあげればWebブラウザからコンソールまたはVNCを使ったログインが出来ます。
デスクトップ版のUbuntuを利用すればVNCを利用してGUIへのアクセスができると思います。
まとめ
・あまり動くことは期待していなかったけれども動いた
・GUIを使ってkubernetes上で動作する仮想マシンの管理が実現できた
今回はRancher Labsが開発中のHCIソリューションのHarvesterを紹介しました。Rancher Labsの製品らしく比較的容易に動作する環境を準備することが出来ました。KubeVirtのフロントエンドとしては他には知らないこともあり、k8sで仮想マシンを管理するためのツールとして今後話題になるかもしれません。
この記事が気に入ったらサポートをしてみませんか?