CRI-O ランタイム
CRI-O ランタイムガイド
概要
第1章 CRI-O コンテナーエンジンの使用 リンクのコピーリンクがクリップボードにコピーされました!
CRI-O は、オープンソースのコミュニティー主導型のコンテナーエンジンです。その主な目的は、OpenShift Container Platform などの Kubernetes 実装のコンテナーエンジンとして Docker サービスを置き換えることにあります。
CRI-O の使用者向けに、本書では OpenShift Container Platform のインストール時に CRI-O をインストールする方法と、CRI-O ノードを既存の OpenShift Container Platform クラスターに追加する方法について説明します。本書では、CRI-O エンジンの設定方法およびトラブルシューティングの方法についての情報も提供します。
1.1. CRI-O について リンクのコピーリンクがクリップボードにコピーされました!
CRI-O コンテナーエンジンは、Open Container Initiative (OCI) と互換性のあるランタイムを実行するための、安定性があり、より安全で高性能のプラットフォームを提供します。CRI-O コンテナーエンジンを使用して、runc、デフォルトの OCI ランタイム、または Kata Containers などの OCI 準拠のランタイムを使用することにより、コンテナーおよび Pod を起動できます。CRI-O の目的は、Docker サービスに代わって、OpenShift Container Platform および Kubernetes 用の Kubernetes Container Runtime Interface(CRI) を実装するコンテナーエンジンになることです。
CRI-O は効率的なコンテナーエンジンを提供しますが、他のコンテナー機能は、革新的で独立したコマンドの個別のセットとして実装されます。このアプローチにより、Kubernetes ベースのインストール用のコンテナーエンジンであるという CRI-O の主な目標を妨げることなく、コンテナー管理機能を独自のペースで開発することができます。
CRI-O の安定性は、Kubernetes のメジャーリリースとマイナーリリースと並行して開発、テスト、リリースされ、OCI 標準に準拠しているという事実に基づいています。たとえば、CRI-O 1.11 は Kubernetes 1.11 と連携します。CRI-O の範囲は Container Runtime Interface (CRI) に関連付けられています。CRI は、コンテナーエンジンから Kubernetes サービス (kubelet) が必要とするものを正確に抽出し、標準化しました。CRI チームは、複数のコンテナーエンジンが開発され始めたときに、Kubernetes コンテナーエンジンの要件を安定させるためにこれを行いました。
CRI-O とコマンドラインで直接アクセスする必要はほとんどありません。ただし、テストおよびモニターリングのために CRI-O へのフルアクセスを提供し、CRI-O が提供しないものの Docker で提供されることが予想される機能を提供するために、一連のコンテナー関連のコマンドラインツールを利用できます。これらのツールは、docker
コマンドおよびサービスで利用可能なものを置き換え、拡張します。ツールには以下が含まれます。
-
crictl
: トラブルシューティングを行い、CRI-O コンテナーエンジンと直接連動させるために使用 -
runc
: コンテナーイメージを実行するために使用 -
podman
: コンテナーエンジンの外部で Pod およびコンテナーイメージ (run、stop、start、ps、attach、exec など) を管理するために使用 -
buildah
: コンテナーイメージを構築、プッシュ、および署名するために使用 -
skopeo
: イメージをコピー、検証、削除、および署名するために使用
一部の Docker 機能は、CRI-O ではなく他のツールに含まれます。たとえば、podman
は、数多くの docker
コマンド機能と正確なコマンドラインの互換性を提供し、これらの機能を Pod の管理にも拡張します。podman
でコンテナーまたは Pod を実行する上で、コンテナーエンジンは必要ありません。
buildah
コマンドでは、同じくコンテナーエンジンでは必要とされない、コンテナーイメージの構築、プッシュ、および署名の機能を使用できます。docker
に代わるこれらのコマンドの詳細は、Finding, Running and Building Containers without Dockerを参照してください。
1.2. CRI-O の取得 リンクのコピーリンクがクリップボードにコピーされました!
CRI-O は、スタンドアロンのコンテナーエンジンとしてはサポートされていません。CRI-O は、OpenShift Container Platform などの Kubernetes インストールのコンテナーエンジンとして使用する必要があります。Kubernetes または OpenShift Container Platform を使用せずにコンテナーを実行するには、podman を使用します。
CRI-O コンテナーエンジンを OpenShift Container Platform クラスターで使用できるように設定するには、以下を実行できます。
- CRI-O を新規の OpenShift Container Platform クラスターと共にインストールする。または、
- ノードを既存クラスターに追加し、CRI-O をそのノードのコンテナーエンジンとして特定します。CRI-O および Docker ノードの両方を同じクラスター上に配置できます。
次のセクションでは、新しい OpenShift Container Platform クラスターと共に CRI-O をインストールする方法について説明します。
1.2.1. 新規の OpenShift Container Platform クラスターと共に CRI-O をインストールする リンクのコピーリンクがクリップボードにコピーされました!
CRI-O は、インストール時にノードごとに OpenShift Container Platform ノードのコンテナーエンジンとして選択できます。OpenShift Container Platform のインストール時に CRI-O コンテナーエンジンを有効化することについて、知っておくべき点を以下にいくつか示します。
- 以前は、ノードで CRI-O を使用するには Docker コンテナーエンジンも利用可能な状態である必要がありました。OpenShift Container Platform 3.10 以降では、Docker コンテナーエンジンは、すべての場合で必要なくなりました。現在は、CRI-O のみのノードを OpenShift Container Platform クラスターに含めることができます。ただし、ビルドおよびプッシュ操作を実行するノードには、依然として Docker コンテナーエンジンを CRI-O と共にインストールしておく必要があります。
- CRI-O コンテナーを使用した CRI-O の有効化はサポートされなくなりました。CRI-O の rpm ベースのインストールが必要です。
以下の手順では、Configuring Your Inventory File で説明されているような Ansible インベントリーファイルを使用して、OpenShift Container Platform をインストールしていることを前提としています。
コンテナーエンジンとして CRI-O を使用する OpenShift Container Platform ノードの個別のマウントポイントとして /var/lib/docker
を設定しないでください。CRI-O ノードのデプロイ時に、インストーラーは /var/lib/docker
を /var/lib/containers
へのシンボリックリンクにしようとします。このアクションは、既存の /var/lib/docker
を削除してシンボリックリンクを作成することはできないために失敗します。
- OpenShift Container Platform Ansible Playbook がインストールされた状態で、適切なインベントリーファイルを編集して CRI-O を有効にします。
選択したインベントリーファイルで CRI-O 設定を見つけます。OpenShift Container Platform のインストール時に CRI-O コンテナーエンジンをノードにインストールできるようにするには、Ansible インベントリーファイルの [OSEv3:vars] セクションを見つけます。CRI-O 設定のセクションには、以下が含まれる場合があります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow CRI-O 設定を有効にします。CRI-O のみを有効にするか、または Docker と共に CRI-O を有効にするかのいずれかを選択できます。以下の設定は、ノードのコンテナーエンジンとしての CRI-O および Docker を許可し、overlay2 ストレージを持つノードで Docker ガべージコレクションを有効にします。
注記CRI-O ノードでコンテナーをビルドできるようにするには、Docker コンテナーエンジンをインストールしておく必要があります。CRI-O のみのノードが必要な場合は、コンテナービルドを実行する他のノードを指定するだけで、可能となります。
[OSEv3:vars] ... openshift_use_crio=True openshift_use_crio_only=False openshift_crio_enable_docker_gc=True
[OSEv3:vars] ... openshift_use_crio=True openshift_use_crio_only=False openshift_crio_enable_docker_gc=True
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 各ノードの openshift_node_group_name を CRI-O ランタイム用に kubelet を設定する configmap に設定します。すべてのデフォルトノードグループに対応する CRI-O configmap があります。Defining Node Groups and Host Mappings では、ノードグループおよびマッピングを詳細に説明しています。
[nodes] ocp-crio01 openshift_node_group_name='node-config-all-in-one-crio' ocp-docker01 openshift_node_group_name='node-config-all-in-one'
[nodes] ocp-crio01 openshift_node_group_name='node-config-all-in-one-crio' ocp-docker01 openshift_node_group_name='node-config-all-in-one'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
これにより、必要な CRI-O パッケージが自動的にインストールされます。
結果として作成される OpenShift Container Platform 設定は、OpenShift Container Platform インストールのノードで CRI-O コンテナーエンジンを実行します。oc
コマンドを使用してノードのステータスを確認し、CRI-O を実行しているノードを特定します。
oc get nodes -o wide
$ oc get nodes -o wide
NAME STATUS ROLES AGE ... CONTAINER-RUNTIME
ocp-crio01 Ready compute,infra,master 16d ... cri-o://1.11.5
ocp-docker01 Ready compute,infra,master 16d ... docker://1.13.1
1.2.2. CRI-O ノードの OpenShift Container Platform クラスターへの追加 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform は、docker コンテナーエンジンの使用から CRI-O の使用へのノードの直接アップグレードをサポートしません。既存の OpenShift Container Platform クラスターを CRI-O を使用するようにアップグレードするには、以下を実行します。
- CRI-O コンテナーエンジンを使用するように設定されているノードをスケールアップします。
- CRI-O ノードが予想通りに実行されることを確認します。
- 必要に応じて CRI-O ノードをさらに追加します。
- クラスターが安定したら、Docker ノードをスケールダウンします。
CRI-O コンテナーエンジンでノードを作成する際に実行するアクションを確認するには、Upgrading to CRI-O with Ansible を参照してください。
OpenShift Container Platform クラスター全体を OpenShift Container Platform 3.10 以降にアップグレードし、コンテナー化されたバージョンの CRI-O がノードで実行されている場合、CRI-O コンテナーはそのノードから削除され、CRI-O rpm がインストールされます。それ以降、CRI-O サービスは systemd サービスとして実行されます。詳細は、BZ#1618425 を参照してください。
1.3. CRI-O の設定 リンクのコピーリンクがクリップボードにコピーされました!
CRI-O は、OpenShift Container Platform によってデプロイ、アップグレード、および管理されることを目的としているため、CRI-O 設定ファイルは、OpenShift Container Platform を介してのみ、または CRI-O のテストまたはトラブルシューティングの目的でのみ変更する必要があります。実行中の OpenShift Container Platform ノードでは、ほとんどの CRI-O 設定は /etc/crio/crio.conf
ファイルに保持されます。
crio.conf
ファイルの設定は、ストレージ、リスニングソケット、ランタイム機能、およびネットワークが CRI-O に設定される方法を定義します。以下は、デフォルトの crio.conf
ファイルの例です (これらの設定を説明するコメントを確認するには、ファイル自体を調べてください)。
以下のセクションでは、さまざまな CRI-O 設定が crio.conf
ファイルで使用される可能性のある方法について説明しています。
1.3.1. CRI-O ストレージの設定 リンクのコピーリンクがクリップボードにコピーされました!
OverlayFS2 は、コンテナーエンジンとして CRI-O または Docker を使用しているかどうかに関係なく、OpenShift Container Platform で推奨される (およびデフォルトの) ストレージドライバーになります。利用可能なストレージデバイスの詳細は、Choosing a graph driver を参照してください。
CRI-O ストレージについて知っておく必要のある点には、CRI-O ストレージに関する以下のファクトが含まれます。
- 付随するレイヤーと共に各コンテナーの root ファイルシステムを格納することにより、イメージを保持します。
- Docker サービスで使用されるものと同じストレージレイヤーが組み込まれています。
-
container-storage-setup
を使用して、コンテナーストレージエリアを管理します。 -
/etc/containers/storage.conf
および/etc/crio/crio.conf
ファイルの設定情報を使用します。 -
デフォルトでデータを
/var/lib/containers
に保存します。そのディレクトリーは、CRI-O とコンテナーを実行するためのツール (podman
など) の両方で使用されます。
同じストレージディレクトリーを使用しますが、コンテナーエンジンとコンテナーツールは、コンテナーを個別に管理します。
- Docker バージョン 1 およびバージョン 2 スキーマの両方を格納できます。
container-storage-setup
を使用して CRI-O のストレージを設定する方法の詳細については、Using container-storage-setup を参照してください。
1.3.2. CRI-O ネットワークの設定 リンクのコピーリンクがクリップボードにコピーされました!
CRI-O は Container Network Interface (CNI) と互換性のあるネットワーク機能をサポートします。サポートされるネットワーク機能には、ネットワークプラグインとして実装される loopback、flannel、および openshift-sdn が含まれます。
デフォルトで、OpenShift Container Platform は openshift-sdn ネットワークを使用します。crio.conf
ファイルの以下の設定は、CNI ネットワーク設定ファイルの保存場所 (/etc/cni/net.d/
) および CNI プラグインバイナリーの保存場所 (/opt/cni/bin/
) を定義します。
[crio.network] network_dir = "/etc/cni/net.d/" plugin_dir = "/opt/cni/bin/"
[crio.network]
network_dir = "/etc/cni/net.d/"
plugin_dir = "/opt/cni/bin/"
OpenShift Container Platform の CRI-O で必要なネットワーク機能を理解するには、Kubernetes および OpenShift Container Platform のネットワーク要件の両方を参照してください。
1.4. CRI-O のトラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
CRI-O コンテナーエンジンをヘルスチェックし、問題のトラブルシューティングを行うために、crictl
コマンドをいくつかのよく知られている Linux および OpenShift Container Platform コマンドと共に使用することができます。すべての OpenShift Container Platform コンテナーエンジンの場合と同様に、oc
および kubectl
などのコマンドを使用して、CRI-O の Pod を調査することもできます。
たとえば、Pod を一覧表示するには、以下を実行します。
sudo oc get pods -o wide
$ sudo oc get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
docker-registry-1-fb2g8 1/1 Running 1 5d 10.128.0.4 hostA <none>
registry-console-1-vktl6 1/1 Running 0 5d 10.128.0.6 hostA <none>
router-1-hjfm7 1/1 Running 0 5d 192.168.122.188 hostA <none>
Pod が CRI-O で実行されていることを確認するには、cri-o
の describe
オプションおよび grep
を使用します。
sudo oc describe pods registry-console-1-vktl6 | grep cri-o
$ sudo oc describe pods registry-console-1-vktl6 | grep cri-o
Container ID: cri-o://9a9209dc0608ce80f62bb4d7f7df61bcf8dd2abd77ef53075dee0542548238b7
CRI-O コンテナーランタイムをクエリーし、デバッグするには、crictl
コマンドを実行して CRI-O と直接通信します。crictl
が使用する CRI-O インスタンスは crictl.yaml
ファイルで識別されます。
cat /etc/crictl.yaml runtime-endpoint: /var/run/crio/crio.sock
# cat /etc/crictl.yaml
runtime-endpoint: /var/run/crio/crio.sock
デフォルトで、crictl.yaml
ファイルにより、crictl はローカルシステムの CRI-O ソケットをポイントします。crictl
で利用可能なオプションを確認するには、引数を指定せずに crictl
を実行します。特定のオプションについてのヘルプを参照するには 、--help
を追加します。以下に例を示します。
1.4.1. CRI-O の一般的なヘルスチェック リンクのコピーリンクがクリップボードにコピーされました!
CRI-O を実行している OpenShift Container Platform クラスターのノードにログインし、以下のコマンドを実行して CRI-O コンテナーエンジンの一般的なヘルスチェックをします。
CRI-O 関連のパッケージがインストールされていることを確認します。これには、crio(CRI-O デーモンと設定ファイル) および cri-tools(crictl コマンド) パッケージが含まれます。
rpm -qa | grep ^cri-
# rpm -qa | grep ^cri-
cri-o-1.11.6-1.rhaos3.11.git2d0f8c7.el7.x86_64
cri-tools-1.11.1-1.rhaos3.11.gitedabfb5.el7_5.x86_64
crio サービスが実行中であることを確認します。
1.4.2. CRI-O ログの検査 リンクのコピーリンクがクリップボードにコピーされました!
CRI-O コンテナーエンジンは systemd サービスとして実装されるため、標準の journalctl
コマンドを使用して CRI-O のログメッセージを検査できます。
1.4.2.1. crio および origin-node ログの確認 リンクのコピーリンクがクリップボードにコピーされました!
crio サービスからの情報のジャーナルを確認するには、-u
オプションを使用します。この例では、サービスが実行されていることを確認できますが、Pod は起動に失敗しています。
origin-node サービスで CRI-O 関連のメッセージを確認することもできます。以下に例を示します。
一覧表示されている Pod の 1 つ (cri-o // c94cc6 として示されている最後の Pod など) で何が起こっていたのかをさらに調査したかった場合は、crictl logs
コマンドを使用できます。
1.4.2.2. CRI-O のデバッグをオンにする リンクのコピーリンクがクリップボードにコピーされました!
CRI-O のロギング機能の詳細情報を取得するには、以下のようにログレベルを一時的に debug に設定できます。
/usr/lib/systemd/system/crio.service
ファイルを編集し、以下のように --loglevel=debug を ExecStart= 行に追加します。ExecStart=/usr/bin/crio --log-level=debug \ $CRIO_STORAGE_OPTIONS \ $CRIO_NETWORK_OPTIONS
ExecStart=/usr/bin/crio --log-level=debug \ $CRIO_STORAGE_OPTIONS \ $CRIO_NETWORK_OPTIONS
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のように設定ファイルを再読み込みし、サービスを再起動します。
systemctl daemon-reload systemctl restart crio
# systemctl daemon-reload # systemctl restart crio
Copy to Clipboard Copied! Toggle word wrap Toggle overflow journalctl
コマンドを再度実行します。CRI-O サービスで進行中の処理を表す多くのデバッグメッセージが表示されるようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 調査が完了したら
--loglevel=debug
オプションを削除し、生成されるメッセージの量を減らします。次に、2 つのsystemctl
コマンドを再度実行します。systemctl daemon-reload systemctl restart crio
# systemctl daemon-reload # systemctl restart crio
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.3. CRI-O Pod およびコンテナーのトラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
crictl
コマンドを使用すると、CRI-O コンテナーエンジンと直接インターフェイスして、コンテナーエンジンに関連付けられたコンテナー、イメージ、および Pod を確認し、操作できます。runc
コンテナーランタイムは、CRI-O と対話するもう 1 つの方法です。ノード上で support-tools を実行するなど、コンテナーを CRI-O コンテナーエンジンの外部で実行する必要がある場合は、podman
コマンドを使用できます。
これら 2 つのコマンドの説明とその違いについては、Crictl vs. Podman を参照してください。
開始するには、crictl info
および crictl version
コマンドを使用して、CRI-O サービスの一般的なステータスを確認できます。
1.4.3.1. イメージ、Pod、およびコンテナーの一覧表示 リンクのコピーリンクがクリップボードにコピーされました!
crictl
コマンドは、CRI-O 環境でコンポーネントを調査するためのオプションを提供します。以下は、イメージ、Pod、およびコンテナーについての情報を一覧表示するための crictl
の使用例の一部になります。
ローカル CRI-O ノードにプルされているイメージを表示するには、crictl images
コマンドを実行します。
CRI-O 環境で現在アクティブな Pod を表示するには、crictl pods
を実行します。
現在実行されているコンテナーを表示するには、crictl ps
コマンドを実行します。
実行中のコンテナーと、停止または終了したコンテナーの両方を表示するには、crictl ps -a
を実行します。
sudo crictl ps -a
$ sudo crictl ps -a
CRI-O サービスが停止しているか、または正常に機能していない場合、runc
コマンドを使用して、CRI-O で実行されたコンテナーを一覧表示できます。この例では、CRI-O が実行されているコンテナーと実行されていないコンテナーの存在を検索します。次に、CRI-O が停止している場合でも、runc
を使用してそのコンテナーを調査できることを示します。
ご覧のとおり、CRI-O サービスがオフの場合でも、さらに詳しく調べたい場合に備えて、runc
はコンテナーの存在とファイルシステム内のその場所を示します。
1.4.3.2. イメージ、Pod、およびコンテナーの調査 リンクのコピーリンクがクリップボードにコピーされました!
CRI-O 環境のイメージ、Pod またはコンテナーの内部で実行されていることについての詳細を確認するには、いくつかの crictl
オプションを使用できます。
(crictl ps
の出力からの) コンテナー ID が手元にあれば、そのコンテナー内でコマンドを実行できます。たとえば、コンテナー内のオペレーティングシステムの名前およびリリースを確認するには、以下を実行します。
crictl exec 756f20138381c cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)
$ crictl exec 756f20138381c cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
コンテナー内で実行されているプロセスの一覧を表示するには、以下を実行します。
crictl exec -t e47b3a837aa30 ps -ef
$ crictl exec -t e47b3a837aa30 ps -ef
UID PID PPID C STIME TTY TIME CMD
1000130+ 1 0 0 Oct17 ? 00:38:14 /usr/bin/origin-web-console --au
1000130+ 15894 0 0 15:38 pts/0 00:00:00 ps -ef
1000130+ 17518 1 0 Oct23 ? 00:00:00 [curl] <defunct>
別の方法として、runc
コマンドを使用してコンテナーに"exec"することができます。
sudo runc exec -t e47b3a837aa3023c748c4c31a090266f014afba641a8ab9cfca31b065b4f2ddd ps -ef
$ sudo runc exec -t e47b3a837aa3023c748c4c31a090266f014afba641a8ab9cfca31b065b4f2ddd ps -ef
UID PID PPID C STIME TTY TIME CMD
1000130+ 1 0 0 Oct17 ? 00:38:16 /usr/bin/origin-web-console --audit-log-path=- -v=0 --config=/var/webconsole-config/webc
1000130+ 16541 0 0 15:48 pts/0 00:00:00 ps -ef
1000130+ 17518 1 0 Oct23 ? 00:00:00 [curl] <defunct>
コンテナー内に ps
コマンドがない場合、runc
には ps
オプションがあります。これは、コンテナーで実行されているプロセスを表示するのと同じ効果があります。
sudo runc ps e47b3a837aa3023c748c4c31a090266f014afba641a8ab9cfca31b065b4f2ddd
$ sudo runc ps e47b3a837aa3023c748c4c31a090266f014afba641a8ab9cfca31b065b4f2ddd
runc
には完全なコンテナー ID が必要ですが、crictl
は最初のいくつかの固有の文字のみが必要である点に注意してください。
Pod サンドボックス ID (crictl pods
からの出力) が手元にある状態で、crictl inspectp
を実行して Pod サンドボックスに関する情報を表示します。
ローカルシステムの CRI-O で利用可能なイメージに関するステータス情報を確認するには、crictl inspecti
を実行します。
関連情報
- CRI-O - OCI-based implementation of Kubernetes Container Runtime Interface
- CRI-O Lightweight Container Runtime for Kubernetes
- CRI-O Command Line Interface: crictl
- Finding, Running, and Building Containers without Docker
- Container Commandos Coloring Book
- CRI-O now running production workloads in OpenShift Online
- CRI-O How Standards Power a Container Runtime
- A Practical Introduction to Container Terminology