よくある質問・用語集

  • もっと調べる
  • どうやって使う?

Podとは

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-arch

ただ、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のビジネスチャットを紹介します。
ご興味のあるかたはぜひご参加ください。

セミナー申込

関連用語

Podに関連するページ(事例など)

Podとは先頭へ