はじめに
KubeCon North America 2022 で Podman コミュニティから発表された Podman Desktop を触ってみます。特に、コンテナからの Pod の作成と、Pod からの Kubernetes YAML の生成を試してみます。
環境
- Fedora Linux 37 (Fedora Workstation)
- Podman 4.3.1
- Podman Desktop 0.10.0
インストール
ドキュメントの Linux 環境向けインストールのページの手順に沿って行います。ドキュメントでは flatpak install
コマンドに --user
オプションをつけたユーザー単位でのインストール方法が案内されていますが、そのためには事前に --user
オプションつきで flathub 用のリポジトリ設定を行っておく必要がありました。
$ flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo --user
$ flatpak install --user flathub io.podman_desktop.PodmanDesktop
インストール完了後、以下のコマンドで Podman Desktop が起動します。
$ flatpak run io.podman_desktop.PodmanDesktop
コマンドを使わなくても GNOME の Overview 画面からも起動できます。
なお MacOS や Windows へのインストールにも対応しています。
コンテナから Pod を作り Kubernetes YAML を生成するまで
コンテナイメージの Pull
左側の Images タブをクリックし、右上の Pull Images をクリックします。
次に Image to Pull: のボックスに Pull したいイメージ名を入力し、Pull image ボタンをクリックします。今回は mysql
と入力します。
docker.io/library/mysql イメージが Pull されました。同じ要領で wordpress イメージも Pull します。
コンテナの実行
Pull したイメージを使ってコンテナを実行します。Images タブの各イメージの右側にある Run Image ボタン (再生ボタン) を押すと、コンテナ名やボリューム、環境変数その他の入力画面が表示されます。必要な項目を入力し Start Container をクリックするとコンテナが実行されます。
Containers タブからコンテナを選択するとコンテナログや podman inspect の実行結果も表示できます。
同じ要領で wordpress
コンテナも実行します。
Pod の作成
Container タブに実行中のコンテナ 2 つが表示されていますが、各コンテナのチェックボックスをクリックし、右上にある Pod のアイコン (マウスオーバーすると "Create Pod with 2 selected items" と表示される) をクリックします。
Pod の名前を入力し、"Create Pod using these containers" ボタンを押すと Pod が作成されます。
ブラウザで localhost:9000
にアクセスすると WordPress の設定画面が表示されます。
Pod の Kubernetes YAML を生成
Pods タブから今作成された Pod をクリックし、Kube タブ、もしくは右上にある Generate Kube ボタンをクリックします。するとこの Pod に対応する Kubernetes YAML が表示されます。
実際に生成された YAML は以下の通りです。
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-4.3.1
apiVersion: v1
kind: Pod
metadata:
annotations:
io.kubernetes.cri-o.ContainerType/mysql-container-podified: container
io.kubernetes.cri-o.ContainerType/wordpress-container-podified: container
io.kubernetes.cri-o.SandboxID/mysql-container-podified: c38189996702110cc0e6da403062d3d3c1dce5e46221057f8c6ddd4efc70677
io.kubernetes.cri-o.SandboxID/wordpress-container-podified: c38189996702110cc0e6da403062d3d3c1dce5e46221057f8c6ddd4efc70677
io.podman.annotations.autoremove/mysql-container-podified: "FALSE"
io.podman.annotations.autoremove/wordpress-container-podified: "FALSE"
io.podman.annotations.init/mysql-container-podified: "FALSE"
io.podman.annotations.init/wordpress-container-podified: "FALSE"
io.podman.annotations.privileged/mysql-container-podified: "FALSE"
io.podman.annotations.privileged/wordpress-container-podified: "FALSE"
io.podman.annotations.publish-all/mysql-container-podified: "FALSE"
io.podman.annotations.publish-all/wordpress-container-podified: "FALSE"
creationTimestamp: "2022-12-08T14:26:48Z"
labels:
app: mysql-wordpress-pod
name: mysql-wordpress-pod
spec:
automountServiceAccountToken: false
containers:
- args:
- mysqld
env:
- name: MYSQL_USER
value: exampleuser
- name: MYSQL_RANDOM_ROOT_PASSWORD
value: '''1'''
- name: HOME
value: /root
- name: HOSTNAME
value: 829c64a14561
- name: MYSQL_DATABASE
value: exampledb
- name: MYSQL_PASSWORD
value: examplepass
image: docker.io/library/mysql:latest
name: mysql-container-podified
ports:
- containerPort: 3306
hostPort: 3306
- containerPort: 80
hostPort: 9000
- containerPort: 33060
hostPort: 33060
resources: {}
securityContext:
capabilities:
drop:
- CAP_MKNOD
- CAP_NET_RAW
- CAP_AUDIT_WRITE
volumeMounts:
- mountPath: /var/lib/mysql
name: 3cf903440ea40d4516d1651d8af435d9fce7c86a0008ab7d2d5ae4750cd0b92c-pvc
- args:
- apache2-foreground
env:
- name: WORDPRESS_DB_NAME
value: exampledb
- name: WORDPRESS_DB_HOST
value: 127.0.0.1
- name: HOSTNAME
value: ff27ed15ba9b
- name: WORDPRESS_DB_USER
value: exampleuser
- name: WORDPRESS_DB_PASSWORD
value: examplepass
- name: PHP_CPPFLAGS
value: -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS
- name: PHP_CFLAGS
value: -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS
- name: HOME
value: /root
image: docker.io/library/wordpress:latest
name: wordpress-container-podified
resources: {}
securityContext:
capabilities:
drop:
- CAP_MKNOD
- CAP_NET_RAW
- CAP_AUDIT_WRITE
volumeMounts:
- mountPath: /var/www/html
name: 44ebd9696e9c7635c9e1c8992e9397b64ddbebaa46c277ab43013cf54f86e4e0-pvc
enableServiceLinks: false
hostname: mysql-wordpress-pod
restartPolicy: Never
volumes:
- name: 3cf903440ea40d4516d1651d8af435d9fce7c86a0008ab7d2d5ae4750cd0b92c-pvc
persistentVolumeClaim:
claimName: 3cf903440ea40d4516d1651d8af435d9fce7c86a0008ab7d2d5ae4750cd0b92c
- name: 44ebd9696e9c7635c9e1c8992e9397b64ddbebaa46c277ab43013cf54f86e4e0-pvc
persistentVolumeClaim:
claimName: 44ebd9696e9c7635c9e1c8992e9397b64ddbebaa46c277ab43013cf54f86e4e0
status: {}
また、今回は試せませんでしたが、Deploy to Kubernetes ボタン(ロケットアイコン) から Kubernetes へのデプロイを行うこともできるようです。
さいごに
Podman Desktop を使って、コンテナイメージの pull、コンテナの実行、コンテナからの Pod の作成、Kubernetes YAML の生成までの流れを見てきました。本当は OpenShift へのデプロイまでを試したかったのですがそこまで到達できず、結果的に OpenShift と全く関係のない記事になってしまいました。(いいのかそれ...?)
Podman Desktop は GitHub 上で開発が行われており、今後のプランやロードマップも公開されています。Issues からバグ報告や機能改善リクエストをあげることができ、Discussions で質問もできます。現時点でバージョンは 0.10.0 で伸びしろの大きいプロジェクトです。ローカルマシン上でコンテナや Pod を動かしたい人は試してみてはいかがでしょうか。