Upgrade to Pro — share decks privately, control downloads, hide ads and more …

学生プライベートクラウドはKubeVirt の夢を見るか?

学生プライベートクラウドはKubeVirt の夢を見るか?

CloudNative Days Summer 2025
ネットワークコンテンツ研究会が開発・運用する学生マルチリージョンプライベートクラウド Nekko Cloud。
その次世代基盤として、KubeVirt を活用したプライベートクラウド構築の取り組みを紹介しています。
Kubernetes 上で仮想マシンを扱う技術 KubeVirt の導入背景、環境構築手順、VM 作成と操作の検証内容を紹介し、次世代クラウド基盤への展望を語っています。

Avatar for cyokozai

cyokozai

May 23, 2025
Tweet

More Decks by cyokozai

Other Decks in Technology

Transcript

  1. 目次 • Nekko Cloud Gen.1 について • KubeVirt への期待 •

    KubeVirt 入門 • Nekko Cloud Gen.2 に向けて • おまけ ◦ KubeVirt セットアップ ◦ その他の検証
  2. 井上 裕介 a.k.a cyokozai 千葉工業大学大学院 情報科学研究科 情報工学専攻 修士1年 ❏ ネットワークコンテンツ研究会

    Nekko Cloud Team ❏ 株式会社スリーシェイク sreake事業部 学生インターン 最近DJ頑張ってます sakanactionはいいゾ^~ みんなも「怪獣」聞こう!
  3. 我々のプライベートクラウドの要件 dev 環境: メンバーが自由に開発・検証に使える開発環境 prod 環境: サークル内外で利用するサービスを動かす IaaS と PaaS

    の立場を逆転させる • Kubernetes の管理下で VM を動かす! ◦ KubeVirt: VM を Pod のように扱うことができる CRD • ベアメタル Kubernetes を中心に *aaS の構築が可能 ◦ k8s on PVE から VM on k8s へ https://kubevirt.io/ https://kubevirt.io/user-guide/architecture/
  4. ベアメタル (VM on PVE) Kubernetes の構成 PVE: PC-02,VM-01,02,03を作成 ↓ PC-02:

    Kubesprayを実行 ↓kubeconfigを取得 PC-01: context を選択 ↓ PC-01: KubeVirtインストール
  5. ソフトウェア バージョン 概要 Proxmox VE 8.3.3 Nekko Cloud IaaS 基盤

    Ubuntu 22.04 PC-02, VM-01, 02, 03 on PVE Kubespray 2.27.0 PC-02 で実行 kubectl CLI 1.33.0 ローカル (PC-01) で実行 KubeVirt CRD 1.5.1 ローカル (PC-01) で実行 ハードウェア バージョン 概要 Mac Book Air M3 macOS Sequoia 15.4.1 arm64 kubectl 実行端末 PC-02, VM-01, 02, 03 Ubuntu 22.04 検証環境
  6. 検証項目 • VM の作成 ◦ ContainerDisk から VM を作成 ◦

    CPU, Memory, Disk, DiskIO の設定 • VM の基本操作 ◦ VM の起動・シャットダウン ◦ VM へのアクセス
  7. ContainerDisk • VM の起動ディスクにコンテナイメージを直接利用 • OCI 互換のコンテナイメージ ⇨ ルートファイルシステム apiVersion:

    kubevirt.io/v1 kind: VirtualMachine spec: ~~~ volumes: - name: containerdisk containerDisk: image: quay.io/containerdisks/ubuntu:22.04 ~~~ https://quay.io/ URL で指定 自動でイメージをプル
  8. write_files: - path: /etc/cloudinit/nc-vendor.sh permissions: '0755' content: | #!/usr/bin/bash if

    [ -f /etc/cloudinit/status.complete ]; then echo "File exists." exit 0 fi touch /etc/cloudinit/status.excuting cp /etc/issue /etc/issue.default echo "" >> /etc/issue echo "Setup in progress, please wait" >> /etc/issue echo "" >> /etc/issue systemctl restart getty@tty1 apt update apt upgrade -y apt install -y qemu-guest-agent systemctl enable qemu-guest-agent ufw allow 22/tcp ufw enable cat /etc/issue.default > /etc/issue echo "nc-template/ubuntu v0.1.0" >> /etc/issue echo "" >> /etc/issue echo " ▓▓▓▓ " >> /etc/issue echo " ▒▒▒▒▒▒▒▒ " >> /etc/issue echo " ▒▒▒▒▒▒▒▒▒▒▒▒ " >> /etc/issue echo " ▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒ " >> /etc/issue echo " ▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒" >> /etc/issue echo " ▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒" >> /etc/issue echo " █▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒" >> /etc/issue echo " ████▓▓▓▓▓▓▓▓▒▒▒▒" >> /etc/issue echo " ██████▓▓▓▓▓▓▓▓ " >> /etc/issue echo "" >> /etc/issue rm -rf /etc/cloudinit/status.excuting touch /etc/cloudinit/status.complete reboot runcmd: - sh /etc/cloudinit/nc-vendor.sh status: {} apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: ubuntu2204 namespace: default spec: runStrategy: Always template: metadata: spec: domain: devices: disks: - disk: bus: virtio name: containerdisk - disk: bus: virtio name: cloudinitdisk rng: {} interfaces: - name: default masquerade: {} resources: requests: cpu: 2 memory: 1024M storage: 8Gi limits: cpu: 2 memory: 2048M terminationGracePeriodSeconds: 180 networks: - name: default pod: {} volumes: - name: containerdisk containerDisk: image: quay.io/containerdisks/ubuntu:22.04 - name: cloudinitdisk cloudInitNoCloud: userData: | #cloud-config hostname: ubuntu ssh_pwauth: True disable_root: false users: - name: admin lock_passwd: false shell: /bin/bash sudo: ALL=(ALL) NOPASSWD:ALL uid: 1000 ssh-authorized-keys: - ssh-ed25519 xxxxxxxxxxxxxxxxxxxxxxxx~ ubuntu2204.yaml cloud-configの設定項目 ❯ kubectl apply -f ubuntu2204.yaml virtualmachine.kubevirt.io/ubuntu2204 created ❯ kubectl delete -f ubuntu2204.yaml virtualmachine.kubevirt.io "ubuntu2204" deleted apply/deleteでVMを作成
  9. ❯ kubectl get vms NAME AGE STATUS READY ubuntu2204 3h41m

    Stopped False ❯ kubectl virt stop ubuntu2204 VM ubuntu2204 was scheduled to stop VM の起動・シャットダウン ❯ kubectl get vms NAME AGE STATUS READY ubuntu2204 3h30m Starting False • VM の起動 ❯ kubectl virt start ubuntu2204 VM ubuntu2204 was scheduled to start • VM の停止 ❯ kubectl get vms NAME AGE STATUS READY ubuntu2204 3h34m Running True ❯ kubectl get vmi NAME AGE PHASE IP NODENAME READY ubuntu2204 6h46m Running 10.xxx.xxx.xxx node2 True 起動完了後は Running VM: Deployment 相当の CR VM の実体 VMI: Pod 相当の CR VM のパラメータを管理
  10. コンソール接続 • kubectl CLI から VM に接続 • Cloud-init のおかげで

    NC の アイコンが表示される • PVE と全く同じ環境の VM を作成出来る ❯ kubectl virt console ubuntu2204 Successfully connected to ubuntu2204 console. The escape sequence is ^] Ubuntu 22.04.5 LTS ubuntu ttyS0 nc-template/ubuntu v0.1.0 ▓▓▓▓ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒ ▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒ ▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒ ▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒ █▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒ ████▓▓▓▓▓▓▓▓▒▒▒▒ ██████▓▓▓▓▓▓▓▓ ubuntu login: ubuntu login: admin Password: password Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-139-generic x86_64) ~~~ ncadmin@ubuntu:~$
  11. SSH 接続 • VM に SSH を用いて接続 ❯ ssh [email protected]

    -p 33333 Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-140-generic x86_64) ~~~ ncadmin@ubuntu:~$ apiVersion: v1 kind: Service metadata: name: ubuntu2204-svc spec: ports: - port: 22 targetPort: 22 protocol: TCP selector: kubevirt.io/domain: ubuntu2204 type: NodePort • Service の作成 • Node の IP と port を指定 • passwd/Key ログイン可能
  12. KubeVirt に入門したまとめ • クラスタの操作感は k8s とほとんど変わらない ◦ Virtctl プラグインのおかげで kubectl

    CLI で操作可能 • kubectl 実行 → Cloud-init → VM 使用可能 の手軽さ ◦ PVE も十分便利だがここまでの手軽さはない ◦ IaC ツールとの相性もかなり良さそう • もっと話したいことあるし、もっと検証したかった 😭 ◦ むしろここまでは突貫で出来てしまった (約2週間) ◦ 詳しい話はこの後声かけて下さい 🙌 (質問、提案、ツッコミ、なんでも) https://github.com/kubevirt/kubectl-virt-plugin
  13. KubeVirt 今後の検証内容 • 任意の VM の作成が可能 ◦ 開発・検証などの目的で色々な OS を使用

    • マルチリージョン間の Live Migration ◦ 地理的に離れた拠点間で VM を停止せずに移動可能か • VM のシステムディスクを永続化できる ◦ VM でもPod 同様に Ceph を利用した PV の運用 • CPU, Memory, Disk, DiskIO の使用量を dev/prod 環境で干渉しないよう制限 ◦ prod 環境に影響が出るのは本末転倒 • Pod と VM の棲み分け (NW, RBAC) • dev/prod 環境の NWの分離 • VM on VM ◦ ”二重の仮想化”に関する性能評価 • クラスタの OS を Ubuntu から Flatcar Container Linux へ移行 ◦ Cluster API との連携で最強のプロビジョニングを目指す • Host の NVMe と同程度の IO を VM でも出せるか
  14. • Kubespray: 汎用的なOS や k8s クラスターの構成管理タスクのための Ansible プレイブック, インベントリー, プロビジョニング

    ツール, ドメインナレッジをまとめたもの ベアメタル Kubernetes の構築 Kubespray Kubernetes クラスタ 実行 KubeVirt インストール 1 2 ansible playbook kubectl https://kubernetes.io/ja/docs/setup/production-environment/tools/kubespray/ https://qiita.com/irumaru/items/76c6a083e04a4ed6a119
  15. PC-02: Kubespray の設定 - INI ファイル [all] node1 ansible_host=10.xxx.ooo.xxx ansible_user=admin

    ip=10.xxx.ooo.xxx etcd_member_name=etcd1 node2 ansible_host=10.yyy.ooo.yyy ansible_user=admin ip=10.yyy.ooo.yyy etcd_member_name=etcd2 node3 ansible_host=10.zzz.ooo.zzz ansible_user=admin ip=10.zzz.ooo.zzz etcd_member_name=etcd3 [kube_control_plane] node1 node2 node3 [etcd]ip addr | grep 10.xxx.ooo.xxx node1 node2 node3 [kube_node] node1 node2 node3 [calico_rr] [k8s_cluster:children] kube_control_plane kube_node calico_rr https://kubernetes.io/ja/docs/setup/production-environment/tools/kubespray/ https://qiita.com/irumaru/items/76c6a083e04a4ed6a119
  16. PC-02: Kubespray の設定 - config.yaml # Make a copy of

    kubeconfig on the host that runs Ansible in {{ inventory_dir }}/artifacts kubeconfig_localhost: true # Use ansible_host as external api ip when copying over kubeconfig. kubeconfig_localhost_ansible_host: true # Download kubectl onto the host that runs Ansible in {{ bin_dir }} kubectl_localhost: true $ ansible-playbook -i inventory/test-cluster/inventory.ini \ --private-key inventory/test-cluster/k8s-test \ --become \ --become-user=root cluster.yml PC-02: Ansible Playbook https://kubernetes.io/ja/docs/setup/production-environment/tools/kubespray/ https://qiita.com/irumaru/items/76c6a083e04a4ed6a119 PC-01: kubeconfig の登録 ❯ kubectl config use-context [email protected]
  17. PC-01: KubeVirt のインストール ❯ export VERSION=$(curl -s https://storage.googleapis.com/kubevirt-prow/release/kubevirt/kubevirt/stable.txt) ❯ kubectl

    create -f "https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-operator.yaml" ❯ kubectl create -f "https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-cr.yaml" https://kubevirt.io/quickstart_cloud/#deploy-kubevirt https://kubevirt.io/user-guide/user_workloads/virtctl_client_tool/#install-virtctl-with-krew PC-01: 確認 ❯ kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath="{.status.phase}" Deployed% ❯ kubectl virt help kubectl virt controls virtual machine related operations on your kubernetes cluster. PC-01: Virtctl を Krew からインストール ❯ kubectl krew install virt ❯ export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
  18. CPU, Memory, Disk の設定 • disks: VM システムディスクの設定 ContainerDisk と

    Cloud-init を指定 • resources: リソースのパラメータ CPU, Memory, Storage size を設定可能 上限の指定も可能 (省略可) • Volumes: CSI で管理されるボリューム PVCにも対応 ~~~ template: spec: domain: devices: disks: - name: containerdisk disk: bus: virtio - name: cloudinitdisk disk: bus: virtio interfaces: - name: default masquerade: {} resources: requests: cpu: 1 memory: 1024M storage: 8G limits: cpu: 1 memory: 2048M ~~~ https://kubevirt.io/user-guide/compute/dedicated_cpu_resources/ https://kubevirt.io/user-guide/storage/disks_and_volumes/
  19. Network の設定 • interfaces: VM 側の NW 設定 ifconfig で表示されるリソース

    • networks: k8s 側の NW 設定 Pod と紐づけることで外部との通信が可能 ここでは “default” という名前で設定 ~~~ template: spec: domain: devices: interfaces: - name: default masquerade: {} networks: - name: default pod: {} ~~~ https://kubevirt.io/user-guide/network/interfaces_and_networks/
  20. Cloud-init による VM の自動初期設定 https://kubevirt.io/user-guide/user_workloads/startup_scripts/#cloud-init https://cloudinit.readthedocs.io/en/latest/index.html • cloud-config: YAML形式の OS

    設定ファイル • 今回は PVE 基盤ですでに使っている cloud-config をそのまま使用 • Ubuntu 以外の LinuxOS にも一部対応している