先日の記事でKubernetes + KubeVirtの環境が作れました。
作っただけではちょっともったいない気がしたので、まずKubeVirt VM上でアプリケーションを導入したあと、そのアプリケーションをKubernetes Serviceを使って公開することを試してみます。公式ドキュメント「Virtual machines » Service objects」を参考にしました。
なお、KubernetesとKubeVirtの環境構築までの流れは前回の記事にまとめています。
VMの作成
Containerized Data Importerツールを使って、PVにOSイメージを書き込むところまでできているのが前提です。
以下のようなYAMLを作成してVMを作成します。前回も触れましたが、ssh_authorized_keys
にアクセス用のSSH公開鍵を指定します。
[centos@ml110gen9 ~]$ cat testvm1_pvc.yml apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachine metadata: creationTimestamp: 2018-07-04T15:03:08Z generation: 1 labels: kubevirt.io/os: linux name: vm1 spec: running: true template: metadata: creationTimestamp: null labels: kubevirt.io/domain: vm1 spec: domain: cpu: cores: 2 devices: disks: - disk: bus: virtio name: disk0 - cdrom: bus: sata readonly: true name: cloudinitdisk machine: type: q35 resources: requests: memory: 1024M volumes: - name: disk0 persistentVolumeClaim: claimName: fedora - cloudInitNoCloud: userData: | #cloud-config hostname: vm1 ssh_pwauth: True disable_root: false ssh_authorized_keys: - ssh-rsa your-ssh-pubkey name: cloudinitdisk
claimName: fedora
というところでPVを指定しています。fedoraというPVにFedora OSのイメージが書き込まれており、そのイメージを仮想マシンで使うイメージです。
YAMLを使って、VMを作成します。
[centos@ml110gen9 ~]$ kubectl create -f testvm1_pvc.yml
しばらく待つと、KubeVirtによりVMが作成されます。Runningになって、IPアドレスが付与されたことを確認します。
[centos@ml110gen9 ~]$ kubectl get vmi NAME AGE PHASE IP NODENAME vm1 22m Running 10.244.224.100 ml110gen9.maas
VMへのSSHアクセス
SSHでアクセスします。Fedoraイメージのデフォルトユーザーはfedora
です。
[centos@ml110gen9 ~]$ ssh fedora@10.244.224.100 Last login: Wed Apr 14 08:12:22 2021 from 172.17.28.125
fedoraというユーザーにパスワードを設定すれば、virtctl console fedora
でコンソール接続も可能ですが、デフォルト状態ではできないので、SSH接続します。
VMでアプリを導入して公開してみる
VMの中でアプリケーションを用意してみましょう。今回はApache2をインストールしてみます。
[fedora@vm1 ~]$ sudo yum install httpd -y [fedora@vm1 ~]$ sudo systemctl enable --now httpd
サービスがLISTENしていることを確認します。
[fedora@vm1 ~]$ ss -atu|grep http tcp LISTEN 0 511 *:http *:*
デフォルトページだと識別しづらいので、サンプルページを作ってみます。
[fedora@vm1 ~]$ cat <<EOF | sudo tee /var/www/html/index.html hello world on vm1 EOF
まずはVMの中でWebサーバーのコンテンツにアクセスしてみます。
[fedora@vm1 ~]$ curl http://localhost hello world on vm1
終わったらVMからログアウトします。
[fedora@vm1 ~]$ exit
Kubernetes ServiceでVM上の Webサーバーを公開してみる
Kubernetes ServiceをYAML形式で記述します。今回はNodePortを使ってみます。
[centos@ml110gen9 ~]$ cat testvm1_svc.yml apiVersion: v1 kind: Service metadata: name: vm-service spec: externalTrafficPolicy: Cluster ports: - port: 27013 protocol: TCP targetPort: 80 name: http selector: kubevirt.io/domain: vm1 type: NodePort
selectorでVM作成時と同じドメイン名を指定しています。今回はWebサーバーを公開するため、80ポートを公開して27013ポートからアクセスできるようにしています。その27013ポートに対してNodePortが割り当てられます。
サービスをKubernetesに登録します。
[centos@ml110gen9 ~]$ kubectl apply -f testvm1_svc.yml service/vm-service created
サービスを確認します。
[centos@ml110gen9 ~]$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 163m vm-service NodePort 10.105.17.248 <none> 27013:32664/TCP 4m33s
NodePortを使ってVM上のWebサーバーコンテンツにアクセスしてみます。
[centos@ml110gen9 ~]$ curl http://172.17.28.125:32664 hello world on vm1
うまくいきました。対象がVMでもKubernetesのコンテナの運用と同様、KubernetesのServiceを使って公開できることがわかりました。