Podman Desktop でコンテナからの Pod の作成、Kubernetes YAML の生成を試す

# はじめに #
KubeCon North America 2022 で Podman コミュニティから[発表](https://developers.redhat.com/articles/2022/10/24/podman-expands-desktop#)された [Podman Desktop](https://podman-desktop.io/) を触ってみます。特に、コンテナからの Pod の作成と、Pod からの Kubernetes YAML の生成を試してみます。

# 環境 #
- Fedora Linux 37 (Fedora Workstation)
- Podman 4.3.1
- Podman Desktop [0.10.0](https://github.com/containers/podman-desktop/discussions/946)

# インストール #
ドキュメントの [Linux 環境向けインストールのページ](https://podman-desktop.io/docs/Installation/linux-install)の手順に沿って行います。ドキュメントでは `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 画面からも起動できます。

![Screenshot from 2022-12-08 21-46-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/e60baa74-6da5-836f-3ed8-ff7ec6780a8f.png)

起動直後の画面はこちら。
![Screenshot from 2022-12-08 22-41-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/81f019bc-9b6c-21e1-54e9-6bf54a6313b8.png)

なお [MacOS](https://podman-desktop.io/docs/installation/macos-install) や [Windows](https://podman-desktop.io/docs/installation/windows-install) へのインストールにも対応しています。

# コンテナから Pod を作り Kubernetes YAML を生成するまで #
## コンテナイメージの Pull ##
左側の Images タブをクリックし、右上の Pull Images をクリックします。
![Screenshot from 2022-12-08 22-44-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/98f1c5bd-11a4-4c0b-4337-7ee1af15f7a8.png)

次に Image to Pull: のボックスに Pull したいイメージ名を入力し、Pull image ボタンをクリックします。今回は `mysql` と入力します。
![Screenshot from 2022-12-08 22-48-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/288958b5-f67a-3e4b-082a-a625d28fbcff.png)
![Screenshot from 2022-12-08 22-49-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/348ad71f-3287-5cfd-ef2d-5b2188e80216.png)

docker.io/library/mysql イメージが Pull されました。同じ要領で wordpress イメージも Pull します。
![Screenshot from 2022-12-08 22-52-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/9b0a378b-3837-14a6-c254-9b0bb9af663c.png)

## コンテナの実行 ##
Pull したイメージを使ってコンテナを実行します。Images タブの各イメージの右側にある Run Image ボタン (再生ボタン) を押すと、コンテナ名やボリューム、環境変数その他の入力画面が表示されます。必要な項目を入力し Start Container をクリックするとコンテナが実行されます。
![Screenshot from 2022-12-08 23-00-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/5b218052-798e-0993-d3de-01ac9ba3c599.png)

![Screenshot from 2022-12-08 23-05-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/557f433b-6866-b0ce-0ffa-2df0ef7c9d25.png)

Containers タブからコンテナを選択するとコンテナログや podman inspect の実行結果も表示できます。
![Screenshot from 2022-12-08 23-08-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/eb368823-2b56-6d07-bc92-732165de5a93.png)
![Screenshot from 2022-12-08 23-08-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/b0549351-b0df-f66e-f89e-deb5f9ac2b1a.png)

同じ要領で `wordpress` コンテナも実行します。

## Pod の作成 ##
Container タブに実行中のコンテナ 2 つが表示されていますが、各コンテナのチェックボックスをクリックし、右上にある Pod のアイコン (マウスオーバーすると "Create Pod with 2 selected items" と表示される) をクリックします。
![Screenshot from 2022-12-08 23-12-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/b7f9d39d-aa02-7151-4ef5-b274cddad9c4.png)

Pod の名前を入力し、"Create Pod using these containers" ボタンを押すと Pod が作成されます。
![Screenshot from 2022-12-08 23-15-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/665ff1a9-f607-f4c0-e76d-861efe7a465b.png)
![Screenshot from 2022-12-08 23-16-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/1a7fc473-3431-e3ed-4d6a-a71fa2f36605.png)

ブラウザで `localhost:9000` にアクセスすると WordPress の設定画面が表示されます。

![Screenshot from 2022-12-08 23-22-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/2bbb32c4-1e0b-b6ab-285c-5ec2e2b2364c.png)


## Pod の Kubernetes YAML を生成 ##
Pods タブから今作成された Pod をクリックし、Kube タブ、もしくは右上にある Generate Kube ボタンをクリックします。するとこの Pod に対応する Kubernetes YAML が表示されます。
![Screenshot from 2022-12-08 23-42-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959556/62a90347-4f5f-703b-9fcd-615676a060aa.png)


実際に生成された 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](https://github.com/containers/podman-desktop) 上で開発が行われており、今後の[プラン](https://github.com/orgs/containers/projects/4/views/1)や[ロードマップ](https://github.com/orgs/containers/projects/2/views/1)も公開されています。[Issues](https://github.com/containers/podman-desktop/issues/new/choose) からバグ報告や機能改善リクエストをあげることができ、[Discussions](https://github.com/containers/podman-desktop/discussions/) で質問もできます。現時点でバージョンは 0.10.0 で伸びしろの大きいプロジェクトです。ローカルマシン上でコンテナや Pod を動かしたい人は試してみてはいかがでしょうか。