Podとは
Podとは、コンテナ型仮想化におけるコンテナの管理単位を表す用語です。Podは、複数の関連するコンテナをまとめて構成します。
コンテナ管理ツールとして最も有名なDockerには、残念ながらPodを扱う機能はありません。PodはKubernetsやPodmanなどに実装されています。
PodmanのPod機能
Podmanは、Red Hatが開発したDocker互換のコンテナ管理ツールです。ほとんどのサブコマンドがDocker互換になっていてDockerのエイリアスとして利用できるようになっています。
Podmanでは、Podを生成すると、管理用のコンテナであるinfraが自動的に作成されます。infraは、Pod内のリソースを管理する役割を担います。Podが公開するポート、Cgroupのリソース、カーネルの名前空間などは、このinfraコンテナを通して管理されます。このようなPodのリソースは、一旦設定されると後から変更することができません。変更には、Podを再生する必要があります。
ただ、PodmanにはPodを管理できる機能も追加されています。ここでは、CentOS 8上でpodmanコマンドを使ってWEB-DBのPodを作成する場合を例に取って、Pod機能について解説します。
Podの生成
PodmanのPod機能では、外部に公開するコンテナから起動する必要があります。podman runの引数で次の例のように--podオプションと new:<podname>のように指定して起動を行います。次は、webserverのコンテナを起動する例です。web-dbという名称のPodを指定します。
$ podman run -d --name web --pod new:web-db --expose 80 --publish 80:80 webserver ⏎ 2b880b30bf6d0eb8133355b91a9f44d99dcad1fb7d0f517b4f4a8e771cfa8905
このようにすると、自動的に「web-db」というPodが作成され、その中にwebという名称のコンテナが作成されます。
Podの確認
PodmanでPodを確認するには、podman pod psコマンドを使います。
$ podman pod ps ⏎ POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 203798b4ad41d web-db Running 12 seconds ago 2 1e727d09fc70
Podmanでコンテナを作成すると、Infra Containerと呼ばれる特殊なコンテナが作成されます。podman psコマンドに-aオプションの指定すると、その様子を確認することができます。
$ podman ps -a STATUS PORTS NAMES 2b880b30bf6d localhost/webserver:1.0 /bin/sh -c /usr/s... About a minute ago Up About a minute ago 0.0.0.0:80->80/tcp web 1e727d09fc70 k8s.gcr.io/pause:3.1 About a minute ago Up About a minute ago 0.0.0.0:80->80/tcp 203798b4ad41-infra
Podへのコンテナの追加
Podを追加する場合には、podman runに--podオプションを付けてPodを指定してコンテナを起動します。ここでは、データベースのコンテナを起動する場合の例を説明します。
$ podman run -d --name db --pod web-db mysql-server ⏎ c3814748a5ef2d266bb9accdf0be9d0f1a7544628bdb21a913ce969fd23fdc68
Pod内のコンテナの操作
コンテナの操作方法は、通常と変わりません。例えば、mysql-serverコンテナは初期パスワードをログに記録します。podman logコマンドを使ってログから、パスワードを取得することができます。
$ podman logs db | grep GENERATE ⏎ [Entrypoint] GENERATED ROOT PASSWORD: Bym+av8@dTOzvAwExIk-UqMAHq
podman execを使って、コンテナ内でコマンド実行も可能です。次は、mysqlのrootパスワードを変更する場合の例です。
$ podman exec -it db /bin/bash ⏎ bash-4.2# mysqladmin -u root password 'admin' -p ⏎ ← パスワードを「admin」に変更 Enter password: ******** ⏎ ← 初期パスワード mysqladmin: [Warning] Using a password on the command line interface can be insecure. Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety. bash-4.2# mysqladmin -u root -h localhost password 'admin' -p ⏎ Enter password: ******** ⏎ ← 直前に設定したパスワード mysqladmin: [Warning] Using a password on the command line interface can be insecure. Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety. bash-4.2# mysql -u root -p ⏎ Enter password: ******** ⏎ ← 直前に設定したパスワード Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 8.0.19 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> CREATE USER admin@127.0.0.1 IDENTIFIED BY 'admin'; ⏎ ← 12.0.0.1からアクセスできるユーザを作成 Query OK, 0 rows affected (0.02 sec) mysql> \q Bye bash-4.2# exit ⏎ exit
コンテナ間の通信
コンテナ間では、Listenしているポートが127.0.0.1のループバックアドレス上で共有されています。そのため、この例では、webコンテナからdbコンテナへの接続が可能です。次は、webコンテナでmsqlコマンドを実行して、dbコンテナ上のmysqlに接続する例です。
$ podman exec -it web mysql -h 127.0.0.1 -u admin -p ⏎ Enter password: ******** ⏎ ← dbコンテナで設定したパスワード Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 14 Server version: 8.0.19 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> \q ⏎ Bye
KubernetesのPod機能
コンテナ管理基盤としてよく使われているKubernetesでは、コンテナの最低管理単位はPodです。Kubernetsでは、Pod内で動作するコンテナの仕様をまとめてマニフェストに記載します。マニフェストは、次の例のようにYAML形式で記載されます。
Podのマニフェストの例(sample.yaml)
apiVersion: v1 kind: Pod metadata: name: web-db spec: containers: - name: webserver image: httpd:latest ports: - containerPort: 80 protocol: TCP volumeMounts: - mountPath: "/usr/local/apache2/htdocs" name: web-contents - name: database image: mariadb:latest ports: - containerPort: 3306 protocol: TCP volumes: - name: web-contents hostPath: path: "/home/admin/work/www.designet.co.jp"
このマニフェストの例では、1つのPodの中に、webserverとdatabaseという2つのコンテナを定義しています。また、web-contentsというボリュームも定義されています。このように連携するコンテナとコンテナで使うリソースを一括して定義して、利用できるようにするのがPodの役割です。
Podの定義には、利用するコンテナイメージ、Exposeするポート番号、ボリュームのマウント情報などを記載することができます。
Podの起動と確認
Kubernetesで、Podを起動するには、用意したマニフェストを使って次のようにkubectl applyコマンドを実行します。
$ kubectl apply -f sample.yaml ⏎
Podの状態は、kubectl get podコマンドで確認することができます。
$ kubectl get pod ⏎ NAME READY STATUS RESTARTS AGE web-db 0/2 ContainerCreating 0 13s
Podの管理用オブジェクト
Kubernetesでは、同じ仕様のPodを複数個起動して、冗長性を担保したり、負荷分散したりすることができます。これをReplicaSetと呼びます。また、さらにReplicaSetを管理するためにDeploymentというオブジェクトが用意されています。
また、一時的な処理を行うための特殊な用途としてJobを使うことができます。Jobは、内部的にはPodを使って動作しますが、処理が完了してもPodは削除されず、ログなどを後から参照できるようになっています。
【カテゴリ】:システム管理  仮想化  オープンソースソフトウェア  
【Webセミナー】Rocket.Chatだけじゃない!OSSビジネスチャットの最新情報
日程: | 12月19日(木)Webセミナー「BigBlueButton」を使用します。 |
内容: | Rocket.Chatの機能制限でお困りの方も必見!ライセンスフリーで利用できるOSSのビジネスチャットを紹介します。 |
ご興味のあるかたはぜひご参加ください。 |
関連用語
- Kubernetesとは
- Dockerとは
- podmanとは
- ReplicaSetとは
- Deploymentとは
- runcとは
- rktとは
- Kata Containerとは
- containerdとは
- gVisorとは
- CRI-Oとは
- Minikubeとは
- Microk8sとは
- Dockerfileとは