Podman DesktopからOpenShift LocalにPodをデプロイする

Podman Desktopを使うと、Podmanで開発したPodを簡単なGUI操作でOpenShift Localへデプロイできます。この記事では、Podman Desktop上でApache WebサーバのコンテナをOpenShift Localにデプロイするまでの手順を説明します。


はじめに

OpenShiftアプリケーションを開発するとき、ローカル環境でコンテナをテストしてからOpenShiftにデプロイするでしょう。

アプリケーション開発者は、OpenShiftにデプロイする前に、次のようなタスクをするはずです。

  • Containerfileの作成

  • イメージのビルド

  • コンテナの単体テスト

  • レジストリへのイメージプッシュ

  • デプロイ用のマニフェストの作成

  • OpenShiftへのデプロイ

このようなコンテナ開発からOpenShiftへのデプロイまでが、同じGUIツールの中で完結したらいいと思いませんか。

Podman Desktopを使うとコンテナ開発とOpenShiftへのデプロイをシームレスに連携させることができます。

Podman Desktopとは

PodmanはRed Hatが開発しているOSSのコンテナエンジンです。Red Hat Enterprise Linux、CentOS、Fedoraにおいてはコンテナ操作のための標準コマンドとして位置づけられています。

Podman DesktopはGUIによるローカル開発環境です。こちらもOSSで開発されており、無償で使えます。

Podman Desktopは、ルートレスであること、Kubernetesへのデプロイ機能が充実していることなどが特徴となっています。

Podman Desktopに対して拡張機能をインストールすることによって、minikube、kind、OpenShift LocalなどのKubernetesクラスタと連携させることができます。

インストール

OpenShift Local

OpenShift Localは開発者向けに無償で使うことができるOpenShiftです。この記事ではPodman Desktopで作成したPodをOpenShift Localにデプロイします。OpenShift Localのインストール方法はこの記事を参考にしてください。

Podman Desktop

Podman DesktopはWindows, MacOS, Linux上で動作します。インストール方法は以下のページを参考にしてください。WindowsやMacOSではインストーラが用意されています。Linuxでのインストール方法はドキュメントを参考にしてください。

OpenShift Local Extension

この記事のテーマはPodman DesktopとOpenShift Localの連携ですので、それ用の拡張機能であるOpenShift Local ExtensionをPodman Desktopにインストールする必要があります。このインストールはPodman Desktop上でのGUI操作になりますので後述します。

Podman Desktopの起動

この記事では、Podman v5.7.0とPodman Desktop v1.23.1をFedora 43上で動かして検証しています。FedoraというLinux上で実施しましたが、GUI画面についてはOSの違いはほとんど無いと思います。Podman Desktopの起動はアイコンをクリックするだけです。

Podman Desktopを起動すると次のようなダッシュボード画面が表示されます。左端のエリアで縦にContainers、Pods、Imagesのようにアイコンが並んでいて、それぞれの機能に応じた画面に切り替えることができます。

Podman Desktop ダッシュボード

画面のExplore FeaturesやLearning Centerは、この記事での操作の邪魔になるので、とりあえず非表示にしておきましょう。ダッシュボード画面右上の鉛筆マークのアイコンで次のようにProvidersのみが選択されている状態に設定します。

ダッシュボード画面の表示設定

これで以下のようなすっきりした画面になりました。

設定変更後のダッシュボード画面

OpenShift Local Extensionのインストール

では、さっそくOpenShift Localと連携させるための拡張機能をインストールしていきましょう。

Podman DesktopからOpenShift Localへの接続確認をするので、この拡張機能をインストールする前に、OpenShift Localを起動しておいてください。

Podman DesktopのExtensionsアイコンを選択し、Catalogタブを選択した状態で、検索窓でopenshiftと入力してください。すると、以下のように検索結果にRed Hat OpenShift Localが表示されている思います。ここで右端のインストールボタンを押すとこの拡張機能のインストールが行われます。

OpenShift拡張機能の検索

次に、再び、ダッシュボード画面を表示すると、OpenShift Localの表示が見えると思います。状態がRUNNINGになっていることを確認してください。

Podman Desktop

これだけで、Podman DesktopとOpenShift Localが連携できる状態になりました。とても簡単ですね。

Kubernetesダッシュボード

Kubernetesコンテキストの切り替え

次に、Podman Destopの左側でKubernetesアイコンを選択するとKubernetesダッシュボードが表示されます。画面右上にConnectedと表示されているようにOpenShift Localと接続済みです。

Kubernetesダッシュボード

このスナップショット画面は、以下のような設定でOpenShift Localに接続した状況で取得しました。

  • ログインユーザーはdeveloper

  • プロジェクトはproject01

  • project01にはアプリケーションがデプロイ済

Podman Destopを起動してから一度もOpenShift Localにログインしていないのに、なぜdeveloperユーザーでproject01にアクセスできているのでしょうか。それは、クラスタに接続した時点で、すでにクラスタに認証済みの状態になっていたからです。

クラスタとの接続情報は、Kubernetesダッシュボード画面の左下に小さく表示されています。下のイメージをよく見ると"project01/api-crc-te"という文字が表示されていますので、そこをクリックしてみてください。

クリックすると、画面上部にKubernetesのコンテキストのメニューが表示されます。コンテキストとは、クラスタへの接続情報です。このメニューでコンテキストを切り替えることができます。project01/api-crc-testing:6443/developerという行にCurrent Contextと印がついています。これがOpenShift Localの接続に使用された情報を示しています。

コンテキスト一覧

project01/api-crc-testing:6443/developerというコンテキストは、以下の組み合わせを示しています。

  • 現在のプロジェクトがproject01

  • クラスタのエンドポイントがapi-crc-testing:6443

  • ログインユーザーがdeveloper

コンテキストのメニューでコンテキストを切り替えることで、別のプロジェクトや別のユーザーでOpenShift Localにアクセスできます。

メニュー項目にkubeadminが見えない場合は、ターミナル上でkubeadminにログインしてからPodman Desktop上で再びコンテキストメニューをチェックしてみてください。以下のようにCurrent Contextがproject01/api-crc-testing:6443/kubeadminに変更されていることがわかります。

kubeadminのコンテキスト

TIP
Kubernetesではこのようにコンテキストでクラスタへのアクセスを管理します。Podman DesktopのKubernetesダッシュボードは、Kubernetesクラスタに接続する画面なのでKubernetesの流儀で作られています。
OpenShiftではoc loginやoc projectでコンテキストを切り替えていますので、一般的なOpenShiftユーザは意識していないと思いますが、その背後では接続情報はコンテキストという形で管理されています。
コンテキストには認証トークンも関連づけられているので、再ログインする必要はなく、コンテキストを切り替えるだけユーザやクラスタを切り替えられます。カレントコンテキストは、oc config viewで確認できます。

ここからは、開発者の視点で書いていくので、developerのコンテキストを使って説明をします。

Kubernetesダッシュボードでの操作例

Kubernetesダッシュボードの画面の中央に以下のようなアイコンが表示されています。これらはKubernetesのリソースの種別と件数を表しています。この記事ではOpenShift Localに接続しているので、ここで見えているリソースはOpenShift上のリソースです。Kubernetesダッシュボードで見えている情報は接続しているクラスタの情報と理解してください。

Kubernetesダッシュボードのメトリックス

Kubernetesダッシュボードでは、リソースの一覧表示、詳細表示、編集、削除が可能です。ここではDeploymentsを例にリソースの編集の様子を紹介します。

たとえば、以下のスクリーンショットではproject01プロジェクトにはDeploymentリソースが1つあることがわかります。つまり、project01にはすでにアプリケーションがデプロイされています。

Deploymentsをクリックすると次の画面に切り替わります。ここにはDeploymentのリストが表示されます。

Deploymentリソースのリスト

さらに、"devfile-sam…"をクリックすると詳細画面が表示されます。

Deploymentリソースの詳細

InspectタブをクリックするとリソースのJSON定義が見えます。

Deploymentリソース(JSON)

KubeタブではリソースのYAML定義を編集することができます。以下の画面ではreplicasの値を1から2に変更しようとしているところです。Apply changes to clusterボタンを押すとクラスタに反映されます。

Deploymentリソースの編集

Kubernetesダッシュボード上でPodの数が増えていることが確認できます。

同様に、ServiceやPod、Routeのような他の種類のリソースについてもリソースの詳細表示や編集、削除などの操作を実行できます。

コンテナの管理

ここからしばらくローカル上での開発の話です。最後に再びOpenShiftとの連携の話に戻ります。

ここでの操作対象として、Apache Webサーバのコンテナを扱います。Podman DesktopのGUIは直感的なのでコンテナを作成するまでは迷うことはないと思います。

イメージをプルする

Podman DesktopでImagesアイコンを選択するとコンテナイメージを操作できます。右上のPullボタンを押すとイメージをプルできます。

イメージの画面

次の画面で、イメージとしてregistry.access.redhat.com/ubi8/httpd-24を入力して、Pull Imageボタンを押します。

Pullが完了するとイメージのリストが表示されます。ここでイメージをクリックするとイメージ情報が詳細表示されますが、ここでは割愛します。

イメージのリスト

コンテナを実行する

次にプルしたhttpdのイメージからコンテナを作成していきます。Podman DesktopでContainersアイコンを選択し、右上のCreateボタンを押します。

コンテナ画面

次の画面でExisting Imageの方のボタンを選択します。イメージ選択画面では、さきほどプルしたhttpdのイメージを選択します。次の画面まで来たらRun Imageボタンを押してください。

コンテナ起動時のイメージ選択

次の画面はコンテナの起動パラメータの画面です(ここ重要です)。Container nameにコンテナ名を設定してください。あとは、ポート番号の変更が必要であれば(つまり、すでに実行中のPCでそのポート番号が使用されていれば)、8080以外の番号に変更してください。あとはデフォルトのままで大丈夫です。Start Containerボタンを押してください。

コンテナ作成画面

コンテナを管理する

Podman DesktopでContainersアイコンを選択してコンテナ一覧を表示します。さきほど作成したhttpdのコンテナが表示されているはずです。

コンテナのリスト

右端のボタンを選択するとメニューが表示されます。Open Browserを選択してApache Webサーバが表示されることを確認しましょう。

Open Browserメニュー項目

このリストからmyhttpdコンテナをクリックすると詳細画面に遷移します。Summaryタブを開くとポート番号などの詳細情報を調べることができます。

ローカルでのPodの管理

Podmanの特徴のひとつはローカル環境でPodの開発ができるということです。Podman Desktopを使ったPodの作成には2つ方法がありますが、

  •  マニフェストファイルから作成する (Podman Kube Play)

  • コンテナから作成する

この記事ではすぐに試せるコンテナからPodを作成する方法を紹介します。

コンテナからPodを作成する

Podman DesktopでContainersアイコンを選択し、さきほど作成したmyhttpdコンテナにチェックを入れると画面上部にCreate Podボタンが現れます。

Podを作成するためのコンテナ選択

次の画面では、Podの名前を設定し、公開するポート番号をチェックボックスで選択します。何も変更しないのであれば、そのままCreate Podボタンを押します。

Pod作成画面

ローカルでPodを実行する

作成したPodはPodman DesktopのPodsアイコンで表示できます。このPodはまだOpenShiftにデプロイされおらず、ローカルPCで実行していますので、注意してください(繰り返しになりますが、OpenShift上のリソースはKubernetesダッシュボード上で管理されます)。

実行中のローカルPod

my-podをクリックするとPodの詳細画面に飛びます。Logsタブで起動ログも確認できます。

ローカルPodのログ

ここでターミナルからPodを見てみましょう。podman pod listコマンドでローカルPC上のPodを確認できます。

$ podman pod list
POD ID        NAME        STATUS      CREATED        INFRA ID      # OF CONTAINERS
2856ca47bf0c  my-pod      Running     4 minutes ago  5fbdb3cda2c5  2

ローカルでPodを管理する

作成したPodはPodsアイコンの画面で、起動/停止/削除の操作が可能です。■ボタンを押すとPodが停止、▶ボタンで起動します。

停止中のローカルPod

ターミナルでもPodの状態を確認してみましょう。

$ podman pod list
POD ID        NAME        STATUS      CREATED        INFRA ID      # OF CONTAINERS
2856ca47bf0c  my-pod      Exited      7 minutes ago  5fbdb3cda2c5  2

CLIからもローカルPodの操作は可能です。podman pod -hでコマンドを確認してみてください。

$ podman pod -h
Manage pods

Description:
  Pods are a group of one or more containers sharing the same network, pid and ipc namespaces.

Usage:
  podman pod [command]

Available Commands:
  clone       Clone an existing pod
  create      Create a new empty pod
  exists      Check if a pod exists in local storage
  inspect     Display a pod configuration
  kill        Send the specified signal or SIGKILL to containers in pod
  logs        Fetch logs for pod with one or more containers
  pause       Pause one or more pods
  prune       Remove all stopped pods and their containers
  ps          List pods
  restart     Restart one or more pods
  rm          Remove one or more pods
  start       Start one or more pods
  stats       Display a live stream of resource usage statistics for the containers in one or more pods
  stop        Stop one or more pods
  top         Display the running processes of containers in a pod
  unpause     Unpause one or more pods

OpenShift LocalでのPodの管理

作成したmy-podをOpenShift Localにデプロイします。デプロイする前にカレントプロジェクトをproject02/api-crc-testing:6443/developerに切り替えておきます。このproject02にはまだPodが存在していないので、Podを識別しやすいからです。

コンテキストのリスト
project02のリソース

ここでターミナルからoc projectを実行するとカレントプロジェクトがproject02に変更されていることが確認できます。

$ oc project
Using project "project02" on server "https://api.crc.testing:6443".

TIP
Podman Desktop上のコンテキストの切り替え操作はターミナルのカレントコンテキストと連動します。なぜかというとKubernetesコンテキストは ~/.kube/configというファイルに管理されているので、Podman Desktopとocを同じユーザーが操作していればコンテキストも共有されるのです。

OpenShift LocalにPodをデプロイする

Podsの画面でmy-podにチェックを入れて、右端のボタンを押してメニューを表示し、Deploy to Kubernetesを選択します。

ローカルPodのリスト

これがOpenShiftにデプロイする前の設定画面です。Kubernetes Contextの入力箇所が、project02/api-crc-testing:6443/developerに設定されているのを確認したらDeployボタンを押してください。

Podのデプロイ設定

Deployの状態が画面の下の方に表示されます。Open Podボタンを押すと、KubernetesダッシュボードのPodsの画面に遷移します。

Podの状態表示

KubernetesダッシュボードでPodを操作する

Kubernetesダッシュボード上でPodの詳細表示、ログ表示、ターミナル操作などができます。

Podの詳細表示
Podのログ表示
Podのターミナル

KubernetesダッシュボードでRouteを操作する

Kubernetesダッシュボードを見ると、Podの数が0から1に増えていることがわかります。また、Podをデプロイしたときに一緒に、ServiceやRouteも作られているようです。

Kubernetesダッシュボードのメトリックス

KubernetesダッシュボードからIngresses & Routesを選択し、Routeの一覧を表示します。my-pod-8080のリンクをクリックしてみてください。

Routeリソースのリスト

ここで「この接続ではプライバシーが保護されません」という画面が表示されますが、これはOpenShift Localの証明書が公的CA局で発行されたものでないためです。無害ですので、詳細設定に進むとRed Hat Enterprise Linux Test Pageという画面が表示されます。

Apache Webサーバの画面

最後に、OpenShift Local側の状況を確認してみましょう。ターミナルからリソースの状態を表示してみると、Podman Desktopで作成したリソースが存在することがわかります。

$ oc get all
Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+
NAME         READY   STATUS    RESTARTS   AGE
pod/my-pod   1/1     Running   0          16m

NAME                  TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/my-pod-8080   ClusterIP   10.217.5.161   <none>        8080/TCP   16m
service/my-pod-8443   ClusterIP   10.217.5.35    <none>        8443/TCP   16m

NAME                                   HOST/PORT                                PATH   SERVICES      PORT   TERMINATION   WILDCARD
route.route.openshift.io/my-pod-8080   my-pod-8080-project02.apps-crc.testing          my-pod-8080   8080   edge          None
route.route.openshift.io/my-pod-8443   my-pod-8443-project02.apps-crc.testing          my-pod-8443   8443   edge          None

OpenShift Webコンソールでも同様にリソースを確認できます。

おわりに

この記事では、Podman Desktop上で単一コンテナからPodを作成して、OpenShift Localにデプロイするところまでの流れを説明しました。最後に、OpenShift CLIやWebコンソールがあるのに、なぜPodman Desktopを使うのか。これについて私の考えを少し書いておきたいと思います。

Podman Desktopはローカル環境でコンテナやPodを開発するためのOSSのツールです。

コンテナの開発時には、Containerfileのビルド、イメージ作成、コンテナ起動、デバッグなどの開発作業は一発でうまくいくことはなくて、これらのタスクをいったりきたりすることになります。OpenShiftのデプロイする前には、開発したイメージをレジストリにプッシュすることも必要ですね。

さらに、ローカルで開発したコンテナをOpenShiftにデプロイすると、なぜかOpenShiftで動かないということもあるでしょう。Podman Desktopを使えばコンテナ開発からOpenShiftへのデプロイ、OpenShift上のPodのログ確認まで同じPodman Desktopの中で実行することが可能になります。

Podman Desktopを使えば、マイクロサービス開発のように、複数のコンテナを選択して一つのPodにまとめて、ローカルPC上で実行するようなことがGUI操作でできてしまいます。つまり、OpenShiftにデプロイする前の段階で、動作確認やデバッグができるということです。

この複数のコンテナの連携はPodman Desktopを語る上ではとても重要なポイントなのですが、この記事では十分に紹介できていませんでしたので、また別の機会に書きたいと思います。


いいなと思ったら応援しよう!