わからないなりに理解したい Podman ⑦ ~ Pod の可搬性

こんにちは。サイオステクノロジー OSS サポート担当 山本 です。

前回お話ししたコンテナの器のようなものである Pod ですが、この Pod もまた他の環境に移す方法、つまりは “可搬性” を有しています。
今回は、Pod を別環境に移す方法の一つを見ていきたいと思います。

■Podman を利用した Pod の移行

今回使う Podman での Pod の移行方法について、先に大まかにお話ししておきます。

移行したい Pod を作成したら、その環境で以下のコマンドを実行し、移行用の yaml 形式ファイルを作成します。

podman generate kube -f=(ファイル名) (Pod 名)

そうしたら、作成したファイルを移行先の環境へコピーし、以下のコマンドを実行すれば OK です。

podman play kube (ファイル名)

基本的にはこれだけなのですが、この手法で移行する場合、”podman generate kube” コマンドで作成される yaml ファイルの Pod 情報において、使用するコンテナイメージの情報は Pod 内にコンテナを作成する時に使用したコンテナイメージが記録されます。
たとえ後で Pod 内のコンテナを “podman commit” コマンドで別名をつけてコンテナイメージに保存したとしても、yaml ファイルには元々のコンテナイメージを使用するように記録されます。

一方、”podman play kube” コマンドでは yaml ファイルに記録された情報を基に Pod を作成します。
特に、Pod 内のコンテナについては、yaml ファイルに記録されているコンテナイメージをダウンロードして作成されます。

このため、Pod の中身のコンテナの状態まで正しく移行するためには移行元でのコンテナイメージの変更をレジストリに反映する必要があるので、ある程度自由に使用できるレジストリが必要になります。

レジストリについては以前の記事でも少しお話ししていますので、よければそちらも参考にしてください。

■移行元となる Pod の用意

今回も簡単に確認できるよう、前回と同じく実用性はない例ですが httpd を 2つ入れた Pod を移行して確認してみたいと思います。

■前準備:レジストリ

まずはレジストリを用意します。
今回はこちらの記事で紹介した、自前のレジストリを使います。

レジストリが用意できたら、「移行元」「移行先」それぞれの環境でレジストリ用の証明書を信頼するように設定してください。
レジストリの用意については以前の記事で案内しているとおりなので、詳細は省略します。

■Pod に入れるコンテナイメージを作る

今回は Pod を作成する前に、予め Pod に入れるコンテナイメージを作成します。
ベースとする quay.io の httpd コンテナイメージからコンテナを作成し必要な変更 (確認用コンテンツの作成) をした上で、”podman commit” で自前のレジストリにアップロードできる名前の、ローカルのコンテナイメージとして保存します。

[ ~]$ podman run -dt --name httpd-base1 quay.io/centos7/httpd-24-centos7
6dc31ba3ea740fb96fc4851d404c0925d94884fcfb69591fd365e792b225fca7
[ ~]$ podman exec -it httpd-base1 /bin/bash
bash-4.2$
bash-4.2$ echo -e "This is test page on container 8443." > /opt/rh/httpd24/root/var/www/html/test_content.html
bash-4.2$
bash-4.2$ exit
exit
[ ~]$ podman commit httpd-base1 (レジストリのホスト名):5000/pod-test/httpd8443
Getting image source signatures
 :
Writing manifest to image destination
Storing signatures
94bc17945840b159cba43fcf0dae6bcdc6464b68d9789a42250b239a5a477864
[ ~]$

同様の手順で、同じく quay.io の httpd をベースにもう一つローカルコンテナイメージを作成します。
こちらはコンテンツの作成の他に、Pod 内のポート重複を避けるために待ち受けポートの変更も合わせて行います。
Pod 内のポート重複については、前回記事を参照してください。

[ ~]$ podman run -dt --name httpd-base2 quay.io/centos7/httpd-24-centos7
01ee6a51ca4194c7da332ce2172aa91c3fa1b8619b881eab33fd1468cf202410
[ ~]$ podman exec -it httpd-base2 /bin/bash
bash-4.2$
bash-4.2$ echo -e "This is test page on container 9443." > /opt/rh/httpd24/root/var/www/html/test_content.html
bash-4.2$
bash-4.2$ sed -i s/8080/9191/g /etc/httpd/conf/httpd.conf
bash-4.2$
bash-4.2$ sed -i s/8443/9443/g /etc/httpd/conf.d/ssl.conf
bash-4.2$
bash-4.2$ exit
exit
[ ~]$ podman commit httpd-base2 (レジストリのホスト名):5000/pod-test/httpd9443
Getting image source signatures
 :
Writing manifest to image destination
Storing signatures
39dc53356c70563a2b958bbf2b1d5eb4210de41ebfdc0817523b157c0f37a31b
[ ~]$

コンテナイメージの作成ができたら、これらのコンテナは不要なので削除します。

[ ~]$ podman stop httpd-base1 httpd-base2
httpd-base2
httpd-base1
[ ~]$ podman rm httpd-base1 httpd-base2
01ee6a51ca4194c7da332ce2172aa91c3fa1b8619b881eab33fd1468cf202410
6dc31ba3ea740fb96fc4851d404c0925d94884fcfb69591fd365e792b225fca7
[ ~]$

■移行元の Pod 作成

先に作ったローカルのコンテナイメージを使って、Pod を作成してその中にコンテナを配置します。
今回は “8080” “9090” ポートからそれぞれのコンテナのコンテンツにアクセスできるよう、Pod のポートを設定しています。
Pod の作成などについては、前回記事を参照してください。

[ ~]$ podman pod create -p 8080:8443 -p 9090:9443 --name pod_test
e0b524ebf3735d22d3e9c2dfc2f58c873b3df4cdb5a627059ddf67f17d8026e0
[ ~]$ podman run -dt --name httpd-in-pod8443 --pod pod_test (レジストリのホスト名):5000/pod-test/httpd8443
f52b2ff8dc0f5f6f07d17664c7a94e559dcecd6f62f6042e752843c5ad1b161f
[ ~]$ podman run -dt --name httpd-in-pod9443 --pod pod_test (レジストリのホスト名):5000/pod-test/httpd9443
25b1f7376692266bbbc82a7f2a3fcf4469b9a2d570afc3a9111785a4d6557f61
[ ~]$

先の手順でコンテナ自体の変更は済んでいるため、これで移行元の Pod の準備は OK のはずです。
念のため意図したとおりコンテンツにアクセスできるか、確認しておきましょう。

[ ~]$ curl -k https://(移行元ホスト):8080/test_content.html
This is test page on container 8443.
[ ~]$ curl -k https://(移行元ホスト):9090/test_content.html
This is test page on container 9443.
[ ~]$

■必要なコンテナイメージのアップロード

続いて、移行する Pod で使用するコンテナイメージを push し、レジストリに保存します。
レジストリの操作については以前の記事を参照してください。

[ ~]$ podman login (レジストリのホスト名):5000
Username: (ユーザ名)
Password: (パスワード)
Login Succeeded!
[ ~]$
[ ~]$ podman push (レジストリのホスト名):5000/pod-test/httpd8443
Getting image source signatures
 :
Writing manifest to image destination
Storing signatures
[ ~]$
[ ~]$ podman push (レジストリのホスト名):5000/pod-test/httpd9443
Getting image source signatures
 :
Writing manifest to image destination
Storing signatures
[ ~]$

■”podman generate kube” で yaml ファイルを作成

最後に、”podman generate kube” で yaml ファイルを作成すれば、移行の準備は完了です。

[ ~]$ podman generate kube pod_test -f=pod_test.yml
[ ~]$

■Pod の移行

準備ができたら、移行先に環境で Pod を復元してみましょう。

まずは何らかの方法で、移行元の環境で作成した yaml ファイルを移行先にコピーしておいてください。

そうしたら、後はコンテナイメージが保存されているレジストリにログインした上で、”podman play kube” コマンドを実行するだけです。

[ ~]$ podman login (レジストリのホスト名):5000
Username: (ユーザ名)
Password: (パスワード)
Login Succeeded!
[ ~]$
[ ~]$ podman play kube pod_test.yml
Trying to pull (レジストリのホスト名):5000/pod-test/httpd8443:latest...
Getting image source signatures
 :
Writing manifest to image destination
Storing signatures
Trying to pull (レジストリのホスト名):5000/pod-test/httpd9443:latest...
Getting image source signatures
 :
Writing manifest to image destination
Storing signatures
Pod:
9cdd5b0a7e7253931fba9181b40b691d08e5edd295535e64dda33a4d8d4fbd25
Containers:
a7e9e456fb6ae49aad1a009e35c4eb88c6bdf02c9d2b0068a9ea71c3373fbe78
df028187127b96f1a0e16ed749e81a245fa1310904924814e596fe118b30f86c

[ ~]$

これで、移行先の環境に移行元の Pod を移行することができました。
最後に確認用コンテンツを使って、移行が成功したことを確認してみましょう。

[ ~]$ curl -k https://(移行先ホスト):8080/test_content.html
This is test page on container 8443.
[ ~]$ curl -k https://(移行先ホスト):9090/test_content.html
This is test page on container 9443.
[ ~]$

■最後に

今回は yaml ファイルを使った Pod の移行について見てきました。
注意すべきことはいくつかありましたが、Pod の移行もわずかなコマンドだけでできるんだなぁ、となんとなく感じてもらえたかと思います。

余談ですが、今回の手順で使用した yaml ファイルは、(形式が合っていれば) 手動で作成したり編集したりすることもできます。
勿論、適切に編集するためにはちゃんと yaml ファイルの中身を理解しておく必要があり、無理に手動でやる必要はありませんが、頭の片隅に置いておくと役に立つこともあるかもしれません。

(他の回)
わからないなりに理解したい Podman ① ~ 何をするもの?
わからないなりに理解したい Podman ② ~ コンテナを書き換える
わからないなりに理解したい Podman ③ ~ 可搬性とは?
わからないなりに理解したい Podman ④ ~ 可搬性とは?その2
わからないなりに理解したい Podman ⑤ ~ レジストリと TAG
わからないなりに理解したい Podman ⑥ ~ Pod って何だ?
(今回) わからないなりに理解したい Podman ⑦ ~ Pod の可搬性

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です