インストールと設定
OpenShift Container Platform 3.9 のインストールおよび設定
概要
第1章 概要
『OpenShift Container Platform のインストールおよび設定』では、ご使用の環境で OpenShift Container Platform をインストールし、設定するための基本事項を説明します。設定、管理、およびロギングについても説明します。扱われるトピックを参照し、OpenShift Container Platform 環境の迅速な設定および組織のニーズに基づく設定に必要な一度だけ実行するタスク (one-time task) を実行してください。
日常的なクラスターの管理タスクについては、『Cluster Administration』を参照してください。
第2章 クラスターのインストール
2.1. 計画
2.1.1. 初期計画
実稼働環境の場合には、インストールの際にいくつかの要素を考慮に入れる必要があります。本書を読み進める上で、以下の質問を考慮してください。
- どのインストール方式を使用するか? 「インストール方式」セクションでは、クイックインストール方式と通常インストール (Advanced installation) 方式について説明します。
- クラスターに必要な Pod の数はどの程度か? 「サイジングに関する考慮事項」セクションでは、ノードおよび Pod の制限について説明します。これらの制限に基づいて、必要な環境のサイズを計算できます。
- クラスターに必要なホストの数はどの程度か? 「環境シナリオ」セクションでは、単一マスターおよび複数マスターの複数の設定例について説明します。
- 高可用性 は必要か? フォールトトレランスを可能にするための高可用性の使用が推奨されています。この場合、ご使用の環境のベースとして ネイティブの高可用性 (HA) を使用する複数マスターサンプルの使用を検討されるかもしれません。
- どのインストールタイプを使用するか? RPM またはコンテナー化? いずれのインストールも、作業用の OpenShift Container Platform 環境を提供しますが、サービスをインストールし、管理し、更新するために使用する上で、優先する方法があるかもしれません。
- 認証にどのアイデンティティープロバイダーを使用するか?サポートされているアイデンティティープロバイダーをすでに使用している場合は、 通常インストール (Advanced installation)の実行時にそのアイデンティティープロバイダーを使用するよう OpenShift Container Platform を設定することを推奨します。
- 他のテクノロジーとの統合の際に使用するインストールはサポートされるか? テスト済みの統合テクノロジーの一覧は、「OpenShift Container Platform Tested Integrations」を参照してください。
2.1.2. インストール方式
OpenShift Container Platform 3.9 の時点で、クイックインストールは廃止予定です。今後のリリースでは完全になくなります。また、クイックインストーラーによるバージョン 3.7 から 3.9 へのアップグレードはサポートされていません。
クイックインストールと通常インストール (Advanced installation) 方式は、開発環境と実稼働環境でサポートされます。初回のトライアル用に OpenShift Container Platform を迅速に稼働する必要がある場合は、クイックインクストーラーを使用し、ご使用の環境に関連する設定オプションを説明する対話型の CLI を使用できます。
ほとんどの場合、クラスター設定の制御には通常インストール (Advanced installation) 方式を使用することができます。この方式は、Ansible をすでに使い慣れている場合にとくに適しています。ただし、OpenShift Container Platform ドキュメントと共に以下の情報をご利用いただくことで、Ansible Playbook を直接使用してクラスターを信頼できる方法でデプロイし、その設定のデプロイ後の管理を行うのに必要な十分な情報が整います。
初期インストールでクイックインストーラーを使用する場合も、クラスターの設定をいつでも調整し、同じインストーラーツールを使用してクラスター内のホスト数を調整することができます。後に通常インストール (Advanced installation) 方式の使用に切り換える必要がある場合も、設定のインベントリーファイルを作成してからそのまま続行することが可能です。
2.1.3. サイジングに関する考慮事項
OpenShift Container Platform クラスターに必要なノードと Pod の数を判別します。クラスターの拡張性はクラスター環境内の Pod の数に相関します。この数は、セットアップの他の数に影響を及ぼします。OpenShift Container Platform のオブジェクトの制限についての最新情報は、「クラスターの制限」を参照してください。
2.1.4. 環境シナリオ
本セクションでは、OpenShift Container Platform 環境の複数の異なるシナリオ例について説明します。これらのシナリオは、実際のサイジングに必要に応じて独自の OpenShift Container Platform クラスターを計画する際のベースとして使用してください。
インストール後の単一マスタークラスターから複数マスターへの移行はサポートされていません。
ラベルの更新に関する情報については、「ノードのラベルの更新」を参照してください。
2.1.4.1. 1 つのシステムの単一マスターおよびノード
OpenShift Container Platform は開発環境の単一システムでのみインストールできます。オールインワン環境は実稼働環境として見なされません。
2.1.4.2. 単一マスターおよび複数ノード
以下の表では、単一マスター (etcd が同じホストにインストールされている) および 2 つのノードのサンプル環境について説明しています。
ホスト名 | インストールするインフラストラクチャーコンポーネント |
---|---|
master.example.com |
マスター、etcd、ノード |
node1.example.com |
ノード |
node2.example.com |
2.1.4.3. 単一マスター、複数 etcd、および複数ノード
以下の表では、単一マスター、3 つの etcd ホスト、および 2 つのノードのサンプル環境について説明しています。
ホスト名 | インストールするインフラストラクチャーコンポーネント |
---|---|
master.example.com |
マスターおよびノード |
etcd1.example.com |
etcd |
etcd2.example.com | |
etcd3.example.com | |
node1.example.com |
ノード |
node2.example.com |
2.1.4.4. 同一の場所に配置されたクラスター化された etcd を含む、ネイティブ HA を使用した複数マスター
以下では、ネイティブ
HA メソッドを使用する、同一の場所に配置されたクラスター化された etcd を含む 3 つのマスター、1 つの HAProxy ロードバランサー、 2 つのノードのサンプル環境を説明しています。
ホスト名 | インストールするインフラストラクチャーコンポーネント |
---|---|
master1.example.com |
マスター (クラスター化、ネイティブ HA を使用) およびノードおよびクラスター化された etcd |
master2.example.com | |
master3.example.com | |
lb.example.com |
API マスターエンドポイントの負荷分散を行う HAProxy |
node1.example.com |
ノード |
node2.example.com |
2.1.4.5. 外部のクラスター化された etcd を含む、ネイティブ HA を使用した複数マスター
以下では、ネイティブ
HA メソッドを使用する、3 つの マスター、1 つの HAProxy ロードバランサー、3 つの外部のクラスター化された etcd ホスト、 2 つのノードのサンプル環境を説明しています。
ホスト名 | インストールするインフラストラクチャーコンポーネント |
---|---|
master1.example.com |
マスター (クラスター化、ネイティブ HA を使用) およびノード |
master2.example.com | |
master3.example.com | |
lb.example.com |
API マスターエンドポイントの負荷分散を行う HAProxy |
etcd1.example.com |
クラスター化された etcd |
etcd2.example.com | |
etcd3.example.com | |
node1.example.com |
ノード |
node2.example.com |
2.1.4.6. スタンドアロンレジストリー
OpenShift Container Platform は、OpenShift Container Platform の統合レジストリーを使用するスタンドアロンレジストリーとして機能するようにインストールすることもできます。このシナリオの詳細は、「スタンドアロンレジストリーのインストール」を参照してください。
2.1.5. RPM 対 コンテナー化
RPM インストールは、パッケージ管理経由ですべてのサービスをインストールし、サービスが同じユーザー空間で実行されるように設定します。コンテナーインストールは、コンテナーイメージを使用してサービスをインストールし、個別のコンテナーで別々のサービスを実行します。
コンテナー化したサービスの設定についての詳細は、「コンテナー化したホストでのインストール」のトピックを参照してください。
2.2. 前提条件
2.2.1. システム要件
以下のセクションでは、ハードウェアの仕様および OpenShift Container Platform 環境内のすべてのホストについてのシステムレベルの要件を示しています。
2.2.1.1. Red Hat サブスクリプション
まず、お使いの Red Hat アカウントに有効な OpenShift Container Platform サブスクリプションがなければなりません。これがない場合は、営業担当者にお問い合わせください。
2.2.1.2. ハードウェアの最小要件
システムの要件はホストのタイプによって異なります。
| |
| |
外部 etcd ノード |
|
Ansible コントローラー |
Ansible Playbook を実行するホストには、ホストあたり 75MiB 以上の空きメモリーがインベントリーで必要になります。 |
/var/ ファイルシステムのサイジング要件を満たすには、デフォルト設定に変更を加える必要があります。インストール時またはインストール後にこの設定を行う方法については、「Managing Storage in Red Hat Enterprise Linux Atomic Host」を参照してください。
システムの一時ディレクトリーは、Python の標準ライブラリーにある tempfile
モジュールで定義されるルールに基づいて決定されます。
OpenShift Container Platform は、x86_64 アーキテクチャー搭載のサーバーのみをサポートします。
コンテナーデーモンを実行する各システムにストレージを設定する必要があります。コンテナー化インストールの場合、マスターにストレージが必要です。また、デフォルトで Web コンソールがマスターのコンテナーで実行されますが、Web コンソールを実行するためにストレージがマスター上で必要になります。コンテナーはノードで実行されるため、ストレージは常にノード上で必要になります。ストレージのサイズは、ワークロード、コンテナーの数、実行されているコンテナーのサイズ、およびコンテナーのストレージ要件によって異なります。また、コンテナー化された etcd には設定済みのコンテナーストレージが必要です。
2.2.1.3. 実稼働環境レベルのハードウェア要件
テストまたはサンプル環境は最小要件で機能します。実稼働環境の場合、以下の推奨事項が適用されます。
- マスターホスト
- 外部 etcd を含む可用性の高い OpenShift Container Platform クラスターにおいて、マスターホストには、上記の表に記載の最小要件のほかに、1000 Pod に対して 1 CPU コアと 1.5 GB のメモリーが必要になります。したがって、2000 Pod で構成される OpenShift Container Platform クラスターのマスターホストの推奨されるサイズとして、2 CPU コアと 16 GB の RAM、および 2 CPU コアと 3 GB の RAM、つまり合計 4 CPU コアと 19 GB の RAM が最小要件として必要になります。
最低 3 つの etcd ホストと 1 つのロードバランサーが複数のマスターホスト間で必要になります。
パフォーマンスのガイダンスについては、「Recommended Practices for OpenShift Container Platform Master Hosts」を参照してください。
- ノードホスト
- ノードホストのサイズは、そのワークロードの予想されるサイズによって異なります。OpenShift Container Platform クラスターの管理者は、予想されるワークロードを計算し、オーバーヘッドの約 10 パーセントを追加する必要があります。実稼働環境の場合、ノードホストの障害が最大容量に影響を与えることがないよう、十分なリソースを割り当てるようにします。
詳しくは、「サイジングに関する考慮事項」と「Cluster Limits」を参照してください。
ノードでの物理リソースの過剰なサブスクライブは、Kubernetes スケジューラーが Pod の配置時に行うリソース保証に影響を与えます。メモリースワップを防ぐために取れる処置について確認してください。
2.2.1.4. Red Hat Gluster Storage ハードウェア要件
Container-Native Storage または Container-Ready Storage クラスターで使用されるノードは、ストレージノードとみなされます。ストレージノードは異なるクラスターグループに分けられますが、単一ノードは複数のグループに属することはできません。ストレージノードの各グループについては、以下が当てはまります。
- 1 グループあたり 3 つ以上のストレージノードが必要です。
各ストレージノードには 8 GB 以上の RAM が必要です。これにより、Red Hat Gluster Storage Pod、その他のアプリケーションおよび基礎となる OS を実行できます。
- 各 GlusterFS ボリュームはストレージクラスターにあるすべてのストレージノードのメモリー (約 30 MB) も消費します。RAM の合計量は、コンカレントボリュームがいくつ求められているか、またはいくつ予想されるかによって決める必要があります。
各ストレージノードには、現在のデータまたはメタデータを含まない 1 つ以上の raw ブロックデバイスが必要です。それらのブロックデバイス全体は GlusterFS ストレージで使用されます。以下が存在しないことを確認してください。
- パーティションテーブル (GPT または MSDOS)
- ファイルシステムまたは未処理のファイルシステムの署名
- 以前のボリュームグループの LVM2 署名および論理ボリューム
- LVM2 物理ボリュームの LVM2 メタデータ
不確かな場合には、
wipefs -a <device>
で上記のすべてを消去する必要があります。
2 つのクラスター、つまりインフラストラクチャーアプリケーション (OpenShift Container レジストリーなど) のストレージ専用のクラスターと一般的なアプリケーションのストレージ専用のクラスターについて計画することをお勧めします。これには、合計で 6 つのストレージノードが必要となりますが、この設定は I/O およびボリューム作成のパフォーマンスへの潜在的な影響を回避するために推奨されます。
2.2.1.5. オプション: コアの使用についての設定
デフォルトで、OpenShift Container Platform マスターおよびノードは、それらが実行されるシステムで利用可能なすべてのコアを使用します。GOMAXPROCS
環境変数を設定することにより、OpenShift Container Platform で使用するコア数を選択することができます。GOMAXPROCS
環境変数の機能方法をはじめとする詳細については、Go Language ドキュメント を参照してください。
たとえば、以下を実行してからサーバーを起動し、OpenShift Container Platform が 1 つのコアでのみ実行されるようにします。
# export GOMAXPROCS=1
2.2.1.6. SELinux
Security-Enhanced Linux (SELinux) をすべてのサーバーで有効にしてから OpenShift Container Platform をインストールする必要があります。そうでないと、インストーラーは失敗します。さらに、/etc/selinux/config ファイルで SELINUX=enforcing
および SELINUXTYPE=targeted
を設定します。
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
2.2.1.7. Red Hat Gluster Storage
GlusterFS ボリュームにアクセスするには、すべてのスケジュール可能なノードで mount.glusterfs
コマンドを利用できる必要があります。RPM ベースのシステムの場合は、glusterfs-fuse パッケージがインストールされている必要があります。
# yum install glusterfs-fuse
このパッケージはすべての RHEL システムにインストールされています。ただし、Red Hat Gluster Storage の最新バージョンにアップデートすることを推奨します。そのためには、以下の RPM リポジトリーを有効にする必要があります。
# subscription-manager repos --enable=rh-gluster-3-client-for-rhel-7-server-rpms
glusterfs-fuse がノードにすでにインストールされている場合、最新バージョンがインストールされていることを確認します。
# yum update glusterfs-fuse
オプション: OverlayFS の使用
OverlayFS は、ファイルシステム上に別のファイルシステムを重ねる (オーバーレイする) ことができるユニオンファイルシステムです。
Red Hat Enterprise Linux 7.4 の時点で、OpenShift Container Platform 環境で OverlayFS を使用できるように設定するオプションがあります。古いバージョンの overlay
ドライバーのほかにも、overlay2
グラフドライバーが完全にサポートされています。ただし、Red Hat では、速度と実装の単純さを考慮し、overlay
ではなく overlay2
を使用することを推奨しています。
「Comparing the Overlay Versus Overlay2 Graph Drivers 」には、overlay および overlay2 ドライバーの詳細情報が記載されています。
Docker サービスの overlay2
グラフドライバーを有効化する方法については、Atomic Host ドキュメントの 「Overlay Graph Driver」セクションを参照してください。
2.2.1.8. セキュリティー警告
OpenShift Container Platform は、クラスター内のホストでコンテナーを実行し、ビルド操作やレジストリーサービスなど一部のケースでは特権付きコンテナーを使用して実行します。さらに、これらのコンテナーはホストの Docker daemon にアクセスし、docker build
および docker push
の操作を実行します。実質的に root アクセスが可能であるため、任意のイメージでの docker run
操作の実行については関連するセキュリティーリスクについてクラスター管理者が認識している必要があります。docker build
の操作についてはとくに注意が必要です。
特定のビルドをノードに割り当てることで、対象のノードにしか、危害を加える可能性のあるコンテナーが公開されないように制限できます。これついては、『開発ガイド』の「特定のノードへのビルドの割り当て」のセクションを参照してください。クラスター管理者の場合は、『インストールと設定ガイド』の「グローバルビルドのデフォルト設定および上書きの設定」のセクションを参照してください。
「SCC (Security Context Constraints)」を使用して、Pod が実行可能なアクションおよび、アクセス可能な機能を制御できます。Dockerfile の USER で実行するイメージを有効にする方法は、「Managing Security Context Constraints」 (ユーザーには cluster-admin 権限が必要) を参照してください。
詳細は、以下の記事を参照してください。
2.2.2. 環境要件
以下のセクションでは、OpenShift Container Platform 設定を含む環境の要件を定義します。これには、ネットワークの考慮事項や Git リポジトリーのアクセス、ストレージおよびクラウドインフラストラクチャープロバイダーなどの外部サービスへのアクセスが含まれます。
2.2.2.1. DNS
OpenShift Container Platform では、完全に機能する DNS サーバーが環境になければなりません。この場合、DNS ソフトウェアを実行する別個のホストを使用することが適しており、これによりプラットフォームで実行されるホストおよびコンテナーに対して名前解決を実行することができます。
各ホストの /etc/hosts ファイルにエントリーを追加するだけでは不十分です。このファイルは、プラットフォームで実行されるコンテナーにはコピーされません。
OpenShift Container Platform の主要コンポーネントはコンテナーの内部で実行され、名前解決に以下のプロセスを使用します。
- デフォルトで、コンテナーはホストから DNS 設定ファイル (/etc/resolv.conf) を受信します。
-
次に OpenShift Container Platform は 1 つの DNS 値を Pod に追加します (ノードのネームサーバー値の上)。その値は、
dnsIP
パラメーターによって /etc/origin/node/node-config.yaml ファイルに定義されます。このパラメーターは、ホストが dnsmasq を使用しているためにデフォルトではホストノードのアドレスに設定されます。 -
dnsIP
パラメーターが node-config.yaml ファイルから省かれている場合、その値はデフォルトで kubernetes サービス IP になり、これは Pod の /etc/resolv.conf ファイルにおける最初のネームサーバーになります。
OpenShift Container Platform 3.2 の時点で、dnsmasq はすべてのマスターおよびノードで自動的に設定されます。Pod は DNS としてノードを使用し、ノードは要求を転送します。デフォルトで、dnsmasq はポート 53 をリッスンするようにノード上に設定されます。そのため、ノードはその他の種類の DNS アプリケーションを実行することができません。
NetworkManager はネットワークに自動的に接続するシステムの検出と設定を行うプログラムであり、dnsmasq を DNS IP アドレスで設定するためにノードで必要となります。
NM_CONTROLLED
はデフォルトで yes
に設定されます。NM_CONTROLLED
が no
に設定されている場合、NetworkManager のディスパッチスクリプトは関連する origin-upstream-dns.conf dnsmasq ファイルを作成せず、dnsmasq を手動で設定する必要があります。
同様に、ネットワークスクリプト (例: /etc/sysconfig/network-scripts/ifcfg-em1) で PEERDNS
パラメーターが no
に設定されている場合、dnsmasq ファイルは生成されず、Ansible のインストールは失敗します。PEERDNS
設定が yes
に設定されていることを確認してください。
以下は DNS レコードのサンプルセットです。
master1 A 10.64.33.100 master2 A 10.64.33.103 node1 A 10.64.33.101 node2 A 10.64.33.102
適切に機能する DNS 環境がない場合には、以下に関連する障害が発生します。
- Ansible ベースの参照スクリプトによる製品のインストール
- インフラストラクチャーコンテナー (レジストリー、ルーター) のデプロイ
- OpenShift Container Platform web コンソールへのアクセス (IP アドレスのみではアクセスできないため)
2.2.2.1.1. DNS を使用するようホストを設定する
環境内の各ホストが DNS サーバーのホスト名を解決するように設定されていることを確認します。ホストの DNS 解決の設定は、DHCP が有効にされているかどうかによって異なります。
- DHCP が無効にされている場合、ネットワークインターフェースを static (静的) に設定し、DNS ネームサーバーを NetworkManager に追加します。
DHCP が有効にされている場合、NetworkManager ディスパッチスクリプトは DHCP 設定に基づいて DNS を自動的に設定します。オプションとして、値を node-config.yaml ファイルの
dnsIP
に追加し、Pod の resolv.conf ファイルを追加できます。次に 2 番目のネームサーバーがホストの 1 番目のネームサーバーによって定義されます。デフォルトでは、これはノードホストの IP アドレスになります。注記ほとんどの設定では、(Ansible の使用による) OpenShift Container Platform の拡張インストール時に
openshift_dns_ip
オプションは設定しないでください。このオプションにより、dnsIP
で設定されるデフォルト IP アドレスが上書きされるためです。代わりにインストーラーが各ノードを dnsmasq を使用し、要求を外部 DNS プロバイダーまたは SkyDNS (サービスと Pod の内部ホスト名のクラスター全体での DNS 解決を行うための内部 DNS サービス) に転送するよう設定できるようにします。
openshift_dns_ip
オプションを設定する場合は、 最初に SkyDNS をクエリーする DNS IP か、SkyDNS サービスまたはエンドポイント IP (Kubernetes サービス IP) のいずれかに設定する必要があります。
ホストが DNS サーバーで解決できることを確認するには、以下を実行します。
/etc/resolv.conf の内容を確認します。
$ cat /etc/resolv.conf # Generated by NetworkManager search example.com nameserver 10.64.33.1 # nameserver updated by /etc/NetworkManager/dispatcher.d/99-origin-dns.sh
この例では、10.64.33.1 が DNS サーバーのアドレスです。
/etc/resolv.conf に一覧表示されている DNS サーバーが OpenShift Container Platform 環境のすべてのマスターおよびノードの IP アドレスに対してホスト名を解決できることをテストします。
$ dig <node_hostname> @<IP_address> +short
例を以下に示します。
$ dig master.example.com @10.64.33.1 +short 10.64.33.100 $ dig node1.example.com @10.64.33.1 +short 10.64.33.101
2.2.2.1.2. DNS ワイルドカードの設定
オプションとして、使用するルーターのワイルドカードを設定し、新規ルートが追加される際に DNS 設定を更新しなくてもよいようにします。
DNS ゾーンのワイルドカードは、最終的には OpenShift Container Platform ルーターの IP アドレスに解決される必要があります。
たとえば、有効期間 (TTL) の低い値が設定されていて、ルーターがデプロイされるホストのパブリック IP アドレスをポイントする cloudapps のワイルドカード DNS エントリーを作成します。
*.cloudapps.example.com. 300 IN A 192.168.133.2
仮想マシンを参照するほとんどすべての場合に、ホスト名を使用する必要があり、使用するホスト名は、各ノードの hostname -f
コマンドの出力と一致している必要があります。
各ノードホストの/etc/resolv.conf ファイルで、ワイルドカードエントリーを持つ DNS サーバーがネームサーバーとして一覧表示されていないこと、またはワイルドカードドメインが検索一覧に表示されていないことを確認してください。そうでない場合、OpenShift Container Platform が管理するコンテナーはホスト名を適切に解決できないことがあります。
2.2.2.2. ネットワークアクセス
共有ネットワークは、マスターとノードホスト間に存在する必要があります。通常インストール (Advanced installation) 方式を使用して高可用性のために複数のマスターを設定する計画をしている場合、インストールのプロセスで 仮想 IP (VIP) として設定される IP を選択する必要もあります。選択した IP はすべてのノード間でルーティングできる必要があり、FQDN を使用して設定する場合は、すべてのノード上で解決する必要があります。
2.2.2.2.1. NetworkManager
NetworkManager はネットワークに自動的に接続するシステムの検出と設定を行うプログラムであり、dnsmasq を DNS IP アドレスで設定するためにノードで必要となります。
NM_CONTROLLED
はデフォルトで yes
に設定されます。NM_CONTROLLED
が no
に設定されている場合、NetworkManager のディスパッチスクリプトは関連する origin-upstream-dns.conf dnsmasq ファイルを作成せず、dnsmasq を手動で設定する必要があります。
2.2.2.2.2. firewalld のファイアウォールとしての設定
デフォルトのファイアウォールは iptables ですが、新規のインストールには firewalld が推奨されます。 Ansible インベントリーファイル で os_firewall_use_firewalld=true
を設定することで、firewalld を有効にすることができます。
[OSEv3:vars] os_firewall_use_firewalld=True
この変数を true
に設定することで、必要なポートが開き、ルールがデフォルトゾーンに追加されます。これにより、firewalld が適切に設定されていることを確認できます。
firewalld のデフォルトの設定オプションを使用する際には設定オプションが制限され、これらをオーバーライドすることはできません。たとえば、ストレージネットワークを複数ゾーンのインターフェースでセットアップすることができますが、ノードが通信に使用するインターフェースはデフォルトゾーンになければなりません。
2.2.2.2.3. 必要なポート
OpenShift Container Platform のインストールは、iptables を使用して各ホストに内部のファイアウォールルール一式を自動的に作成します。ただし、ネットワーク設定でハードウェアベースのファイアウォールなどの外部ファイアウォールを使用する場合、インフラストラクチャーコンポーネントが、特定のプロセスまたはサービスの通信エンドポイントとして機能する特定ポートで相互に通信できることを確認する必要があります。
OpenShift Container Platform で必要な以下のポートがネットワーク上で開いており、ホスト間のアクセスを許可するよう設定されていることを確認してください。設定や使用状況によって、一部はポートはオプションになります。
4789 |
UDP |
別個のホストの Pod 間の SDN 通信に必要です。 |
53 または 8053 |
TCP/UDP |
クラスターサービス (SkyDNS) の DNS 解決に必要です。3.2 よりも前のインストールまたは 3.2 にアップグレードした環境はポート 53 を使用します。新規インストールはデフォルトで 8053 を使用するため、dnsmasq が設定されることがあります。 |
4789 |
UDP |
別個のホストの Pod 間の SDN 通信に必要です。 |
443 または 8443 |
TCP |
ノードホストがマスター API と通信するために必要です。ノードホストがステータスをポストバックしたり、タスクを受信したりする際に使用します。 |
4789 |
UDP |
別個のホストの Pod 間の SDN 通信に必要です。 |
10250 |
TCP |
マスターは、 |
10010 |
TCP |
CRI-O を使用している場合は、このポートを開き、 |
53 または 8053 |
TCP/UDP |
クラスターサービス (SkyDNS) の DNS 解決に必要です。3.2 よりも前のインストールまたは 3.2 にアップグレードした環境はポート 53 を使用します。新規インストールはデフォルトで 8053 を使用するため、dnsmasq が設定されることがあります。 |
2049 |
TCP/UDP |
NFS ホストをインストーラーの一部としてプロビジョニングする場合に必要です。 |
2379 |
TCP |
スタンドアロン etcd (クラスター化) が状態の変更を受け取るために使用されます。 |
2380 |
TCP |
etcd はスタンドアロン etcd (クラスター化) を使用する場合、リーダー選定とピアリング接続のためにこのポートがマスター間で開かれていることを要求します。 |
4789 |
UDP |
別個のホストの Pod 間の SDN 通信に必要です。 |
9000 |
TCP |
|
443 または 8443 |
TCP |
ノードホストがマスター API と通信するために必要です。ノードホストがステータスをポストバックしたり、タスクを受信したりする際に使用します。 |
8444 |
TCP |
|
22 |
TCP |
インストーラーまたはシステム管理者が SSH で必要とします。 |
53 または 8053 |
TCP/UDP |
クラスターサービス (SkyDNS) の DNS 解決に必要です。3.2 よりも前のインストールまたは 3.2 にアップグレードした環境はポート 53 を使用します。新規インストールはデフォルトで 8053 を使用するため、dnsmasq が設定されることがあります。マスターホストの内部で開かれている必要があります。 |
80 または 443 |
TCP |
ルーターの HTTP/HTTPS 用です。ノードホスト、とくにルーターを実行しているノードで外部に開かれている必要があります。 |
1936 |
TCP |
(オプション) テンプレートルーターを実行して統計にアクセスする際に開かれている必要があります。統計をどのように公開する必要があるかによって、接続に対して外部または内部に開くことができます。この場合、追加の設定が必要になることがあります。詳しくは、以下の「注記」セクションを参照してください。 |
2379 および 2380 |
TCP |
スタンドアロン etcd 用です。マスターホストの内部で開かれている必要があります。2379 はサーバークライアント接続用です。2380 はサーバー間の接続用で、クラスター化された etcd がある場合にのみ必要となります。 |
4789 |
UDP |
VxLAN 用 (OpenShift SDN) です。ノードホストの内部で開かれている必要があります。 |
8443 |
TCP |
OpenShift Container Platform Web コンソール用で、API サーバーと共有します。 |
10250 |
TCP |
Kubelet 用です。ノード上で外部に開かれている必要があります。 |
注記
- 上記の例では、ポート 4789 は UDP (User Datagram Protocol) に使用されます。
- デプロイメントで SDN を使用している場合、レジストリーがデプロイされているのと同じノードからレジストリーにアクセスしているのでない限り、 Pod のネットワークはサービスプロキシー経由でアクセスされます。
-
OpenShift Container Platform の内部 DNS は SDN 経由で受け取ることができません。
openshift_facts
の検出される値に応じて、またはopenshift_ip
およびopenshift_public_ip
値が上書きされている場合、openshift_ip
の計算された値が使用されます。非クラウドデプロイメントの場合、これはデフォルトで、マスターホストのデフォルトルートに関連付けられた IP アドレスになります。クラウドデプロイメントの場合は、デフォルトで、クラウドメタデータで定義される最初の内部インターフェースに関連付けられた IP アドレスになります。 -
マスターホストはポート 10250 を使用してノードに到達し、SDN を経由しません。デプロイメントのターゲットホストによって異なりますが、
openshift_hostname
およびopenshift_public_hostname
の計算された値を使用します。 iptables ルールにより、ポート 1936 はアクセス不可能な状態になります。ポート 1936 を開くよう iptables を設定するには以下を使用してください。
# iptables -A OS_FIREWALL_ALLOW -p tcp -m state --state NEW -m tcp \ --dport 1936 -j ACCEPT
9200 |
TCP |
Elasticsearch API 用です。Kibana が表示用にログを取得できるようにインフラストラクチャーノードの内部で開かれている必要があります。ルートを使用して Elasticsearch に直接アクセスできるよう外部に開くこともできます。ルートは |
9300 |
TCP |
Elasticsearch のクラスター内での使用向けです。Elasticsearch クラスターのメンバーが相互に通信できるようにインフラストラクチャーノードで内部に開かれている必要があります。 |
2.2.2.3. 永続ストレージ
Kubernetes の永続ボリュームフレームワークにより、お使いの環境で利用可能なネットワークストレージを使用して、OpenShift Container Platform クラスターに永続ストレージをプロビジョニングできます。これは、アプリケーションのニーズに応じて初回 OpenShift Container Platform インストールの完了後に行うことができ、ユーザーは基礎となるインフラストラクチャーの知識がなくてもこれらのリソースを要求できるようになります。
『インストールと設定ガイド』には、NFS, GlusterFS、Ceph RBD、OpenStack Cinder、AWS Elastic Block Store (EBS)、GCE Persistent Disks、iSCSI を使用して OpenShift Container Platform クラスターに永続ストレージをプロビジョニングするためのクラスター管理者の手順を記載しています。
2.2.2.4. クラウドプロバイダーの留意事項
OpenShift Container Platform をクラウドプロバイダーにインストールする場合に考慮すべき事柄がいくつかあります。
- Amazon Web Services の場合は、「Permissions」および「Configuring a Security Group」のセクションを参照してください。
- OpenStack の場合は、「Permissions」および「Configuring a Security Group」のセクションを参照してください。
2.2.2.4.1. 検出された IP アドレスとホスト名の上書き
一部のデプロイメントでは、ユーザーがホストの検出されたホスト名と IP アドレスを上書きすることが必要です。デフォルト値を確認するには、openshift_facts
Playbook を実行します。
# ansible-playbook [-i /path/to/inventory] \ /usr/share/ansible/openshift-ansible/playbooks/byo/openshift_facts.yml
Amazon Web Services の場合は、「検出された IP アドレスとホスト名の上書き」のセクションを参照してください。
検出された共通の設定を確認してみましょう。それらが想定される内容と異なる場合にはそれらを上書きすることができます。
「通常インストール (Advanced installation)」トピックでは、利用可能な Ansible 変数を詳しく説明します。
変数 | 使用法 |
---|---|
|
|
|
|
|
|
|
|
|
|
openshift_hostname
がメタデータで提供される private-dns-name
値以外の値に設定される場合、それらのプロバイダーのネイティブクラウド統合は機能しなくなります。
2.2.2.4.2. クラウドプロバイダーのインストール後の設定
インストールプロセスの後に、AWS、OpenStack、または GCE 用に OpenShift Container Platform を設定することができます。
2.3. ホストの準備
2.3.1. PATH の設定
各ホストの root ユーザーの PATH
には以下のディレクトリーが含まれている必要があります。
- /bin
- /sbin
- /usr/bin
- /usr/sbin
これらすべてはデフォルトで新規の RHEL 7.x インストールに含まれています。
2.3.2. オペレーティングシステムの要件
7.3、7.4、7.5 のベースインストール (Extras チャンネルの最新パッケージを含む) または RHEL Atomic Host 7.4.2 以降が、マスターおよびノードホストに必要となります。各インストール手順については、以下のドキュメントを参照してください。
2.3.3. ホスト登録
各ホストは Red Hat サブスクリプションマネージャー (RHSM) を使用して登録されており、必要なパッケージにアクセスできるようアクティブな OpenShift Container Platform サブスクリプションがアタッチされている必要があります。
各ホストで RHSM に登録します。
# subscription-manager register --username=<user_name> --password=<password>
RHSM から最新サブスクリプションデータをプルします。
# subscription-manager refresh
利用可能なサブスクリプションの一覧を表示します。
# subscription-manager list --available --matches '*OpenShift*'
直前のコマンドの出力で、OpenShift Container Platform サブスクリプションのプール ID を見つけ、これをアタッチします。
# subscription-manager attach --pool=<pool_id>
Yum リポジトリーをすべて無効にします。
有効にされている RHSM リポジトリーをすべて無効にします。
# subscription-manager repos --disable="*"
残りの Yum リポジトリーを一覧表示し、
repo id
にあるそれらの名前をメモします (ある場合) 。# yum repolist
yum-config-manager
を使用して、残りの Yum リポジトリーを無効にします。# yum-config-manager --disable <repo_id>
または、すべてのリポジトリーを無効にします。
yum-config-manager --disable \*
利用可能なリポジトリーが多い場合には、数分の時間がかかることがあります。
OpenShift Container Platform 3.9 で必要なリポジトリーのみを有効にします。
# subscription-manager repos \ --enable="rhel-7-server-rpms" \ --enable="rhel-7-server-extras-rpms" \ --enable="rhel-7-server-ose-3.9-rpms" \ --enable="rhel-7-fast-datapath-rpms" \ --enable="rhel-7-server-ansible-2.4-rpms"
注記rhel-7-server-ansible-2.4-rpms リポジトリーの追加は、OpenShift Container Platform 3.9 時点での新たな要件です。
2.3.4. 基本パッケージのインストール
作業用のインベントリーファイルの準備ができたら、/usr/share/ansible/openshift-ansible/playbooks/prerequisites.yml を使用し、デフォルト設定でコンテナーランタイムをインストールすることができます。コンテナーランタイムにカスタマイズが必要な場合には、本トピックのガイダンスに従ってください。
RHEL 7 システムの場合:
以下の基本パッケージをインストールします。
# yum install wget git net-tools bind-utils yum-utils iptables-services bridge-utils bash-completion kexec-tools sos psacct
システムを最新パッケージに更新します。
# yum update # systemctl reboot
RPM ベースのインストーラーを使用して通常インストール (Advanced installation) を実行することを計画している場合は、この手順を省略できます。ただし、 コンテナー化されたインストーラーの使用を計画している場合は、以下を実行します。
atomic パッケージをインストールします。
# yum install atomic
- Docker のインストール に進みます。
RPM ベースの OpenShift Container Platform インストーラーユーティリティーを提供する以下のパッケージをインストールし、Ansible および関連する設定ファイルなどの クイックおよび通常インストール (Advanced installation)方式で必要となる他のツールをプルします。
# yum install atomic-openshift-utils
RHEL Atomic Host 7 システムの場合:
最新の Atomic ツリーにアップグレードしてホストが最新の状態にあることを確認します (利用可能な場合)。
# atomic host upgrade
アップグレードが完了し、以下の起動の準備ができたら、ホストを再起動します。
# systemctl reboot
2.3.5. Docker のインストール
ここで、すべてのマスターおよびノードホストで Docker をインストールする必要があります。これにより、OpenShift Container Platform をインストールする前に Docker ストレージオプションを設定することができます。
RHEL 7 システムの場合は、Docker 1.13 をインストールします。
RHEL Atomic Host 7 システムには、Docker がデフォルトでインストールされ、設定され、実行されている必要があります。
# yum install docker-1.13.1
パッケージのインストールが完了したら、バージョン 1.13 がインストールされていることを確認します。
# rpm -V docker-1.13.1 # docker version
通常インストール (Advanced installation)方式は /etc/sysconfig/docker を自動的に変更します。
2.3.6. Docker ストレージの設定
作成元のコンテナーとイメージは Docker のストレージバックエンドに保存されます。このストレージは一時的なストレージであり、アプリケーションの必要を満たすために割り当てられる 永続ストレージ とは区別されます。一時ストレージ の場合、コンテナーに保存されるデータはコンテナーが削除されると失われます。永続ストレージ の場合、コンテナーに保存されるデータはコンテナーが削除されてもそのまま残ります。
コンテナーデーモンを実行する各システムにストレージを設定する必要があります。コンテナー化インストールの場合、マスターにストレージが必要です。また、デフォルトで Web コンソールがマスターのコンテナーで実行されますが、Web コンソールを実行するためにストレージがマスター上で必要になります。コンテナーはノードで実行されるため、ストレージは常にノード上で必要になります。ストレージのサイズは、ワークロード、コンテナーの数、実行されているコンテナーのサイズ、およびコンテナーのストレージ要件によって異なります。また、コンテナー化された etcd には設定済みのコンテナーストレージが必要です。
作業用のインベントリーファイルの準備ができたら、/usr/share/ansible/openshift-ansible/playbooks/prerequisites.yml を使用し、デフォルト設定でコンテナーランタイムをインストールすることができます。コンテナーランタイムにカスタマイズが必要な場合には、本トピックのガイダンスに従ってください。
RHEL Atomic Host の場合
RHEL Atomic Host の Docker のデフォルトストレージバックエンドはシンプール論理ボリュームで、実稼働環境でサポートされています。システム要件にある Docker ストレージ要件に対して、このボリュームに十分なスペースが割り当てられていることを確認する必要があります。
十分なスペースが割り当てられていない場合、docker-storage-setup の使用と RHEL Atomic Host におけるストレージ管理の基本手順については、「Managing Storage with Docker Formatted Containers」を参照してください。
Red Hat Enterprise Linux の場合:
RHEL 7 の Docker のデフォルトストレージバックエンドは、ループバックデバイスにあるシンプールです。これは実稼働環境でサポートされておらず、概念実証向けの環境のみに適しています。実稼働環境の場合、シンプール論理ボリュームを作成し、Docker をそのボリュームを使用するよう再設定する必要があります。
Docker はグラフドライバーにイメージとコンテナーを保存します。グラフドライバーは DeviceMapper、OverlayFS、Btrfs などのプラグ可能なストレージ技術です。これらにはそれぞれメリットとデメリットがあります。たとえば、OverlayFS のコンテナーを起動し、停止するスピードは DeviceMapper よりも速いですが、Overlay FS はユニオンファイルシステムのアーキテクチャー上の制限により Portable Operating System Interface for Unix (POSIX) に準拠しておらず、Red Hat Enterprise Linux 7.2 よりも前のバージョンではサポートされていません。お使いの RHEL バージョンで OverlayFS を使用する方法についての情報は Red Hat Enterprise Linux リリースノートを参照してください。
DeviceMapper と OverlayFS のメリットと制限に関する情報は、「Choosing a Graph Driver」を参照してください。
2.3.6.1. OverlayFS の設定
OverlayFS はユニオンファイルシステムの一種です。これにより、あるファイルシステムを別のファイルシステムに重ねる (オーバーレイする) ことができます。上位のファイルシステムで変更が記録されても、下位のファイルシステムは変更されません。
「Comparing the Overlay Versus Overlay2 Graph Drivers 」には、overlay および overlay2 ドライバーの詳細情報が記載されています。
Docker サービスの OverlayFS ストレージドライバーの有効化については、Red Hat Enterprise Linux Atomic Host ドキュメントを参照してください。
2.3.6.2. シンプールストレージの設定
Docker に含まれる docker-storage-setup スクリプトを使用してシンプールデバイスを作成し、Docker ストレージドライバーを設定できます。これは Docker のインストール後に実行でき、イメージまたはコンテナーの作成前に実行する必要があります。このスクリプトは /etc/sysconfig/docker-storage-setup ファイルから設定オプションを読み取り、論理ボリュームを作成するための 3 つのオプションをサポートします。
- オプション A: 追加のブロックデバイスを使用する。
- オプション B: 既存の指定されたボリュームグループを使用する。
- オプション C: root ファイルシステムが置かれている残りのボリュームグループの空きスペースを使用する。
オプション A は最も信頼性の高いオプションですが、この場合 Docker ストレージを設定する前にブロックデバイスをホストに追加する必要があります。オプション B と C はどちらもホストのプロビジョニング時に利用可能な空きスペースを残しておく必要があります。オプション C は、Red Hat Mobile Application Platform (RHMAP) などの一部のアプリケーションで問題が発生することが確認されています。
以下の 3 つのオプションのいずれかを使用して docker-pool ボリュームを作成します。
オプション A: 追加のブロックデバイスを使用する。
/etc/sysconfig/docker-storage-setup で、使用するブロックデバイスのパスに DEVS を設定します。作成するボリュームグループ名に VG を設定します。docker-vg は適切なオプションになります。以下は例になります。
# cat <<EOF > /etc/sysconfig/docker-storage-setup DEVS=/dev/vdc VG=docker-vg EOF
次に docker-storage-setup を実行し、出力で docker-pool ボリュームが作成されたことを確認します。
# docker-storage-setup [5/1868] 0 Checking that no-one is using this disk right now ... OK Disk /dev/vdc: 31207 cylinders, 16 heads, 63 sectors/track sfdisk: /dev/vdc: unrecognized partition table type Old situation: sfdisk: No partitions found New situation: Units: sectors of 512 bytes, counting from 0 Device Boot Start End #sectors Id System /dev/vdc1 2048 31457279 31455232 8e Linux LVM /dev/vdc2 0 - 0 0 Empty /dev/vdc3 0 - 0 0 Empty /dev/vdc4 0 - 0 0 Empty Warning: partition 1 does not start at a cylinder boundary Warning: partition 1 does not end at a cylinder boundary Warning: no primary partition is marked bootable (active) This does not matter for LILO, but the DOS MBR will not boot this disk. Successfully wrote the new partition table Re-reading the partition table ... If you created or changed a DOS partition, /dev/foo7, say, then use dd(1) to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1 (See fdisk(8).) Physical volume "/dev/vdc1" successfully created Volume group "docker-vg" successfully created Rounding up size to full physical extent 16.00 MiB Logical volume "docker-poolmeta" created. Logical volume "docker-pool" created. WARNING: Converting logical volume docker-vg/docker-pool and docker-vg/docker-poolmeta to pool's data and metadata volumes. THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.) Converted docker-vg/docker-pool to thin pool. Logical volume "docker-pool" changed.
オプション B: 既存の指定されたボリュームグループを使用する。
/etc/sysconfig/docker-storage-setup で、VG を必要なボリュームグループに設定します。以下は例になります。
# cat <<EOF > /etc/sysconfig/docker-storage-setup VG=docker-vg EOF
次に docker-storage-setup を実行し、出力で docker-pool ボリュームが作成されたことを確認します。
# docker-storage-setup Rounding up size to full physical extent 16.00 MiB Logical volume "docker-poolmeta" created. Logical volume "docker-pool" created. WARNING: Converting logical volume docker-vg/docker-pool and docker-vg/docker-poolmeta to pool's data and metadata volumes. THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.) Converted docker-vg/docker-pool to thin pool. Logical volume "docker-pool" changed.
オプション C: root ファイルシステムが置かれているボリュームグループの残りの空きスペースを使用する。
root ファイルシステムが置かれているボリュームグループに必要な空きスペースがあることを確認してから、docker-storage-setup を実行して、出力で docker-pool ボリュームが作成されていることを確認します。
# docker-storage-setup Rounding up size to full physical extent 32.00 MiB Logical volume "docker-poolmeta" created. Logical volume "docker-pool" created. WARNING: Converting logical volume rhel/docker-pool and rhel/docker-poolmeta to pool's data and metadata volumes. THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.) Converted rhel/docker-pool to thin pool. Logical volume "docker-pool" changed.
設定を確認します。/etc/sysconfig/docker-storage ファイルに dm.thinpooldev 値と docker-pool 論理ボリュームが含まれている必要があります。
# cat /etc/sysconfig/docker-storage DOCKER_STORAGE_OPTIONS="--storage-driver devicemapper --storage-opt dm.fs=xfs --storage-opt dm.thinpooldev=/dev/mapper/rhel-docker--pool --storage-opt dm.use_deferred_removal=true --storage-opt dm.use_deferred_deletion=true " # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert docker-pool rhel twi-a-t--- 9.29g 0.00 0.12
重要Docker または OpenShift Container Platform を使用する前に、docker-pool 論理ボリュームが要求を満たす程度のサイズであることを確認します。docker-pool ボリュームは利用可能なボリュームグループの 60% である必要があり、これは LVM モニタリングによって拡張し、ボリュームグループを埋めていきます。
Docker がホストでまだ起動されていない場合は、サービスを有効にしてから起動し、それが実行されていることを確認します。
# systemctl enable docker # systemctl start docker # systemctl is-active docker
Docker がすでに実行されている場合は、Docker を再初期化します。
警告これは現在ホストにあるコンテナーまたはイメージを破棄します。
# systemctl stop docker # rm -rf /var/lib/docker/* # systemctl restart docker
/var/lib/docker/ にコンテンツがある場合、これを削除する必要があります。OpenShift Container Platform のインストール前に Docker が使用されていた場合にはファイルが存在します。
2.3.6.3. Docker ストレージの再設定
docker-pool を作成した後に Docker ストレージを再設定する必要がある場合は、まず docker-pool 論理ボリュームを削除する必要があります。専用のボリュームグループを使用している場合は、上記の手順に従って、docker-storage-setup を再設定する前にそのボリュームグループと関連する物理ボリュームを削除する必要もあります。
LVM 管理の詳細は、「論理ボリュームマネージャー管理」を参照してください。
2.3.6.4. イメージ署名サポートの有効化
OpenShift Container Platform は、イメージが信頼済みのソースのものかを暗号で確認することができます。『Container Security Guide』には、イメージ署名の仕組みの概要が記載されています。
atomic
コマンドラインインターフェース (CLI) (バージョン 1.12.5 以降) を使用してイメージ署名の検証を設定できます。atomic
CLI は RHEL Atomic Host システムにプリインストールされています。
atomic
CLI の詳細は、Atomic CLI についてのドキュメントを参照してください。
ホストシステムにインストールされていない場合は、atomic パッケージをインストールします。
$ yum install atomic
atomic trust サブコマンドは信頼設定を管理します。デフォルトの設定では、すべてのレジストリーをホワイトリストに入れます。これは、署名の検証が設定されていないことを意味します。
$ atomic trust show * (default) accept
適切な設定として、特定のレジストリーまたは namespace をホワイトリストに入れ、信頼されていないレジストリーはブラックリストに入れ (拒否)、ベンダーレジストリーで署名検証が必要になるようにします。以下のコマンドセットは、この設定例を実行します。
Atomic の信頼の設定例
$ atomic trust add --type insecureAcceptAnything 172.30.1.1:5000 $ atomic trust add --sigstoretype atomic \ --pubkeys pub@example.com \ 172.30.1.1:5000/production $ atomic trust add --sigstoretype atomic \ --pubkeys /etc/pki/example.com.pub \ 172.30.1.1:5000/production $ atomic trust add --sigstoretype web \ --sigstore https://access.redhat.com/webassets/docker/content/sigstore \ --pubkeys /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release \ registry.access.redhat.com # atomic trust show * (default) accept 172.30.1.1:5000 accept 172.30.1.1:5000/production signed security@example.com registry.access.redhat.com signed security@redhat.com,security@redhat.com
署名されたすべてのソースが検証される場合、グローバルの reject
デフォルトによりノードをさらに強化できます。
$ atomic trust default reject $ atomic trust show * (default) reject 172.30.1.1:5000 accept 172.30.1.1:5000/production signed security@example.com registry.access.redhat.com signed security@redhat.com,security@redhat.com
追加の例として atomic
man ページの man atomic-trust
を使用します。
以下のファイルとディレクトリーは、ホストの信頼設定を構成しています。
- /etc/containers/registries.d/*
- /etc/containers/policy.json
信頼設定は、各ノードまたは個別のホストで管理される生成ファイル上で直接管理でき、 Ansible などを使用して適切なノードに配布できます。Ansible を使用したファイル配布の自動化の例については、『Container Image Signing Integration Guide』を参照してください。
2.3.6.5. コンテナーログの管理
コンテナーのログファイル (コンテナーが実行されているノード上の /var/lib/docker/containers/<hash>/<hash>-json.log ファイル) が問題を生じさせかねないサイズに拡張してしまうことがあります。これは、Docker の json-file
ロギングドライバーを設定し、ログファイルのサイズと数を制限して管理できます。
オプション | 目的 |
---|---|
|
作成される新規ログファイルのサイズを設定します。 |
|
ホストごとに保持するログファイルの最大数を設定します。 |
たとえば、最大ファイルサイズを 1MB に設定し、最新の 3 つのログファイルを保持するには、/etc/sysconfig/docker ファイルを編集して、max-size=1M
と max-file=3
を設定します。
OPTIONS='--insecure-registry=172.30.0.0/16 --selinux-enabled --log-opt max-size=1M --log-opt max-file=3'
次に Docker サービスを再起動します。
# systemctl restart docker
2.3.6.6. 利用可能なコンテナーログの表示
コンテナーログは、コンテナーが実行されているノードの /var/lib/docker/containers/<hash>/ ディレクトリーに保存されます。以下は例になります。
# ls -lh /var/lib/docker/containers/f088349cceac173305d3e2c2e4790051799efe363842fdab5732f51f5b001fd8/ total 2.6M -rw-r--r--. 1 root root 5.6K Nov 24 00:12 config.json -rw-r--r--. 1 root root 649K Nov 24 00:15 f088349cceac173305d3e2c2e4790051799efe363842fdab5732f51f5b001fd8-json.log -rw-r--r--. 1 root root 977K Nov 24 00:15 f088349cceac173305d3e2c2e4790051799efe363842fdab5732f51f5b001fd8-json.log.1 -rw-r--r--. 1 root root 977K Nov 24 00:15 f088349cceac173305d3e2c2e4790051799efe363842fdab5732f51f5b001fd8-json.log.2 -rw-r--r--. 1 root root 1.3K Nov 24 00:12 hostconfig.json drwx------. 2 root root 6 Nov 24 00:12 secrets
ロギングドライバーの設定方法に関する詳細は、Docker ドキュメントを参照してください。
2.3.6.7. ローカルボリュームの使用サポート
ボリュームのプロビジョニングが Dockerfile の VOLUME
指示または docker run -v <volumename>
コマンドを使用して実行されると、ホストのストレージ領域が使用されます。このストレージを使用すると、予期しない領域不足の問題が生じ、ホストが停止する可能性があります。
OpenShift Container Platform では、独自のイメージを実行しようとするユーザーには、ノードホストのストレージ領域全体が一杯になるリスクがあります。この問題に対する 1 つの解決策として、ユーザーがボリュームを持つイメージを実行できないようにする方法があります。これにより、ユーザーがアクセスできるストレージのみを制限し、クラスター管理者はストレージのクォータを割り当てることができます。
docker-novolume-plugin を使用して、ローカルボリュームが定義されたコンテナーの起動を禁止することにより、この問題を解決することができます。とくに、このプラグインは以下を含む docker run
コマンドをブロックします。
-
--volumes-from
オプション -
VOLUME
が定義されたイメージ -
docker volume
コマンドを使ってプロビジョニングされた既存ボリュームの参照
プラグインはバインドマウントへの参照をブロックしません。
docker-novolume-plugin を有効にするには、各ノードホストで以下の手順を実行します。
docker-novolume-plugin パッケージをインストールします。
$ yum install docker-novolume-plugin
docker-novolume-plugin サービスを有効にし、起動します。
$ systemctl enable docker-novolume-plugin $ systemctl start docker-novolume-plugin
/etc/sysconfig/docker ファイルを編集し、以下を
OPTIONS
一覧に追加します。--authorization-plugin=docker-novolume-plugin
docker サービスを再起動します。
$ systemctl restart docker
このプラグインを有効にした後に、ローカルボリュームが定義されたコンテナーは起動に失敗し、以下のエラーメッセージを表示します。
runContainer: API error (500): authorization denied by plugin docker-novolume-plugin: volumes are not allowed
2.3.7. ホストアクセスの確保
クイックおよび通常インストール (advanced installation)方式では、すべてのホストにアクセスできるユーザーが必要になります。インストーラーを非 root ユーザーとして実行する場合は、それぞれの宛先ホストでパスワードレス sudo 権限を設定する必要があります。
たとえば、インストールプロセスを起動するホストで SSH キーを生成できます。
# ssh-keygen
パスワードは使用しないでください。
SSH キーを配布する簡単な方法として、bash
ループを使用できます。
# for host in master.example.com \ master.example.com \ node1.example.com \ node2.example.com; \ do ssh-copy-id -i ~/.ssh/id_rsa.pub $host; \ done
設定に従って、上記コマンドのホスト名を変更します。
bash
ループの実行後に、SSH でループに一覧表示されている各ホストにアクセスできます。
2.3.8. プロキシーの上書きの設定
ノードの /etc/environment ファイルに http_proxy
または https_proxy
値のいずれかが含まれる場合、OpenShift Container Platform コンポーネント間でのオープンな通信を可能にするため、そのファイルに no_proxy
値を設定する必要もあります。
/etc/environment ファイルの no_proxy
パラメーターは、インベントリーファイルに設定するグローバルプロキシー値と同じ値ではありません。グローバルプロキシー値では、プロキシーの設定を使って特定の OpenShift Container Platform サービスを設定します。詳細は、「グローバルプロキシーオプションの設定」を参照してください。
/etc/environment ファイルにプロキシー値が含まれる場合、以下の値を、各ノードでこのファイルの no_proxy
パラメーターに以下の値を定義します。
- マスターおよびノードのホスト名またはそれらのドメインサフィックス。
- 他の内部ホスト名またはそれらのドメインサフィックス。
- etcd IP アドレス。etcd アクセスはアドレスで制御されるので、ホスト名ではなく IP アドレスを指定する必要があります。
-
Kubernetes IP アドレス (デフォルトは
172.30.0.1
)。インベントリーファイルのopenshift_portal_net
パラメーターに設定される値である必要があります。 -
Kubernetes の内部ドメインサフィックス:
cluster.local
。 -
Kubernetes の内部ドメインサフィックス:
.svc
no_proxy
は CIDR をサポートしないので、ドメインサフィックスを使用できます。
http_proxy
または https_proxy
値のいずれかを使用する場合、 no_proxy
パラメーターの値は以下の例のようになります。
no_proxy=.internal.example.com,10.0.0.1,10.0.0.2,10.0.0.3,.cluster.local,.svc,localhost,127.0.0.1,172.30.0.1
2.3.9. 次のステップ
コンテナー化メソッドを使用して OpenShift Container Platform をインストールする場合は (RHEL の場合はオプションですが、RHEL Atomic Host では必須です)、 「コンテナー化ホストでのインストール 」を参照し、ホストを準備してください。
準備ができたら、クイックインストール または 通常インストール(advanced installation)方式を使用して OpenShift Container Platform をインストールできます。
OpenShift Container Platform 3.9 の時点で、クイックインストールは廃止予定です。今後のリリースでは完全になくなります。また、クイックインストーラーによるバージョン 3.7 から 3.9 へのアップグレードはサポートされていません。
スタンドアロンレジストリーをインストールする場合は、スタンドアロンレジストリーのインストール を続行します。
2.4. コンテナー化ホストでのインストール
2.4.1. RPM 対コンテナー化インストール
RPM またはコンテナー化パッケージ方法を使用した OpenShift Container Platform のインストールを選択できます。いずれのインストール方法も作業環境を生成しますが、選択はオペレーティングシステムやホストの更新方法によって異なります。
Red Hat Enterprise Linux (RHEL) での OpenShift Container Platform のインストールには、デフォルトで RPM を使用します。Red Hat Atomic Host システムをターゲットとしている場合、選択できるのはコンテナー化方法のみで、/run/ostree-booted ファイルの検出に基づいて自動的に選択されます。
RPM を使用する場合、すべてのサービスが外部ソースのパッケージ管理によってインストールされ、更新されます。これらは、同じユーザー空間内のホストの既存設定を変更します。コンテナー化インストールの場合は、OpenShift Container Platform の各コンポーネントはコンテナーとして同梱され (自己完結型パッケージ)、ホストのカーネルを利用して起動と実行を行います。更新された新しいコンテナーはホストの既存のものに置き換わります。どのインストール方法を選択するかは、OpenShift Container Platform の今後の更新方法によって異なるでしょう。
以下の表は、RPM とコンテナー化方法の違いをさらに示しています。
RPM | コンテナー化 | |
---|---|---|
インストール方法 |
|
|
サービス管理 |
|
|
オペレーティングシステム |
Red Hat Enterprise Linux |
Red Hat Enterprise Linux または Red Hat Atomic Host |
2.4.2. コンテナー化されたホストのインストール方法
RPM インストールと同様に、コンテナー化インストールでも クイック および 通常 (advanced)インストール方式のいずれかを選べます。
クイックインストール方式の場合、対話型インストール時にホストごとに RPM または コンテナー化方法を選択できます。または インストール設定ファイルで値を手動で設定することができます。
通常インストール (advanced installation) 方式の場合は、クラスター全体か、またはホストごとに インベントリーファイル で Ansible 変数 containerized=true
を設定できます。
2.4.3. 必須イメージ
コンテナー化インストールでは以下のイメージを使用します。
- openshift3/ose
- openshift3/node
- openshift3/openvswitch
- registry.access.redhat.com/rhel7/etcd
デフォルトで、上記のイメージはすべて registry.access.redhat.com の Red Hat Registry からプルされます。
プライベートレジストリーを使用してインストール中にこれらのイメージをプルする必要がある場合は、あらかじめレジストリー情報を指定できます。通常インストール (advanced installation) 方式の場合は、必要に応じてインベントリーファイルで以下の Ansible 変数を設定できます。
openshift_docker_additional_registries=<registry_hostname> openshift_docker_insecure_registries=<registry_hostname> openshift_docker_blocked_registries=<registry_hostname>
クイックインストール方式の場合、各ターゲットホストで以下の環境変数をエクスポートできます。
# export OO_INSTALL_ADDITIONAL_REGISTRIES=<registry_hostname> # export OO_INSTALL_INSECURE_REGISTRIES=<registry_hostname>
現在、ブロックされた Docker レジストリーはクイックインストール方式で指定することはできません。
安全でないブロックされた追加の Docker レジストリーの設定はインストールプロセスの開始時に行われ、必要なイメージをプルする前にそれらの設定が適用されるようにします。
2.4.4. コンテナーの起動と停止
インストールプロセスは、通常の systemctl コマンドを使用してサービスの起動、停止、ポーリングを実行するために使われる関連の systemd ユニットを作成します。コンテナー化インストールの場合、それらのユニット名は RPM インストールのものと一致します。ただし、etcd_container という名前の etcd を除きます。
これは、RHEL Atomic Host には現在オペレーティングシステムの一部としてインストールされる etcd パッケージが同梱されるために必要な変更と言えます。そのため、OpenShift Container Platform インストールにはコンテナー化バージョンが代わりに使用されます。このインストールプロセスではデフォルトの etcd サービスを無効にします。
etcd パッケージは今後 RHEL Atomic Host から削除される予定です。
2.4.5. ファイルパス
すべての OpenShift Container Platform 設定ファイルは、コンテナー化インストール時に RPM ベースのインストールの場合と同じ場所に置かれ、 os-treeアップグレード後も存続します。
ただし、デフォルトのイメージストリームおよびテンプレートファイルは、標準の /usr/share/openshift/examples/ がRHEL Atomic Host では読み取り専用であるため、そのディレクトリーにではなくコンテナー化インストールの /etc/origin/examples/ にインストールされます。
2.4.6. ストレージ要件
RHEL Atomic Host インストールが持つ root ファイルシステムは通常非常に小さいサイズです。ただし、etcd、マスター、ノードコンテナーは /var/lib/ ディレクトリーにデータを維持します。そのため、OpenShift Container Platform をインストールする前に root ファイルシステムに十分な空き領域があることを確認してください。詳細は「システム要件」のセクションを参照してください。
2.4.7. Open vSwitch SDN の初期化
OpenShift SDN の初期化では、Docker ブリッジが再設定され、Docker が再起動される必要があります。ノードがコンテナー内で実行されている場合には状況は複雑になります。Open vSwitch (OVS) SDN を使用すると、ノードが起動し、Docker が再設定されるので、Docker を再起動すると (すべてのコンテナーも再起動されます)、最終的に正常に起動します。
この場合、マスターサービスも Docker と一緒に再起動されるため、ノードサービスは起動に失敗し、数回再起動される場合があります。現在の実装では、Docker ベースの systemd ユニットの Restart=always
パラメーター設定に依存する回避策を使用できます。
2.5. クイックインストール
2.5.1. 概要
OpenShift Container Platform 3.9 の時点では、クイックインストール方式は非推奨になっています。今後のリリースでは完全に削除される予定です。さらに、クイックインストーラーを使用したバージョン 3.7 から 3.9 へのアップグレードはサポートされていません。通常インストール (advanced installation) 方式は、新規インストールおよびクラスターのアップグレードにおいて今後もサポートされます。
クイックインストール 方式により、対話型 CLI ユーティリティーの atomic-openshift-installer
コマンドを使用して一連のホストで OpenShift Container Platform をインストールできます。このインストーラーは、RPM をインストールするか、コンテナー化サービスを実行することによってターゲットのホストで OpenShift Container Platform コンポーネントをデプロイできます。
RHEL Atomic Host はコンテナー化された OpenShift Container Platform サービスを実行するためにサポートされており、インストーラーは RPM で提供されます ( RHEL Atomic Host でデフォルトで利用することができません)。したがって、これは Red Hat Enterprise Linux 7 システムから実行される必要があります。インストールを開始するホストは、OpenShift Container Platform クラスターに組み込む必要はありませんが、組み込むことは可能です。
このインストール方式は、各ホストで実行するのに必要なデータをインタラクティブに収集することでより簡単にインストールを行えるようにするために提供されています。このインストーラーは、Red Hat Enterprise Linux (RHEL) 7 システムでの使用を目的とする自己完結型のラッパーです。
対話型インストールを最初から実行するだけでなく、atomic-openshift-installer
コマンドは事前定義されたインストール設定ファイルを使用して実行または再実行することもできます。このファイルは、以下を実行するためにインストーラーで使用できます。
- 無人インストールの実行
- 既存クラスターへのノードの追加
- クラスターのアップグレード
- OpenShift Container Platform クラスターの完全な再インストール
OpenShift Container Platform をスタンドアロンレジストリーとして インストールするには、「スタンドアロンレジストリーのインストール」を参照してください。
2.5.2. 作業を開始する前に
インストーラーを使用して、定義されたホストで OpenShift Container Platform のマスターおよびノードコンポーネントをインストールできます。
デフォルトで、インストールプロセス時にマスターとして指定するホストは自動的にノードとして設定され、マスターは OpenShift Container Platform SDN の一部として設定されます。
以下の関連する技術上の変更点については、OpenShift Container Platform 3.9 リリースノートを参照してください。
OpenShift Container Platform をインストールする前に、まずホストの前提条件を満たしている必要があります。これには、システムと環境要件を確認し、Docker を正常にインストールし、設定することが含まれます。また、インストール時にターゲットホストのそれぞれについて以下の情報を指定するか、または確認できるようにしておく必要があります。
- Ansible ベースのインストールを実行するターゲットホストのユーザー名 (root または非 root)
- ホスト名
- マスター、ノード、またはその両方のコンポーネントをインストールするかどうか
- RPM またはコンテナー化方法を使用するかどうか
- 内部および外部 IP アドレス
コンテナー化方法を使用して OpenShift Container Platform をインストールする (RHEL の場合はオプションですが、RHEL Atomic Host の場合は必須です) 場合は、「コンテナー化ホストでのインストール」トピックを参照して、これらの方法の違いを確認してから、このトピックに戻って続行してください。
「前提条件」のトピックの手順に従い、RPM またはコンテナー化方法のどちらにするかを決めて、対話型または無人インストールの実行を続けることができます。
2.5.3. 対話型インストールの実行
必ず「作業を開始する前に」をすべてお読みください。
以下を実行して、対話型インストールを開始できます。
$ atomic-openshift-installer install
画面の手順に従って新規 OpenShift Container Platform クラスターをインストールします。
完了後に、作成される ~/.config/openshift/installer.cfg.yml インストール設定ファイル をバックアップします。このファイルは、後でインストールを再実行したり、ホストをクラスターに追加したり、クラスターをアップグレードしたりする場合に必要になります。次に インストールを検証します。
2.5.4. インストール設定ファイルの定義
インストーラーは、インストール、個別ホストおよびクラスターの情報が含まれる事前定義のインストールファイルを使用できます。対話型インストールを実行する際に、 回答に基づくインストール設定ファイルが ~/.config/openshift/installer.cfg.yml に作成されます。このファイルは、インストールを終了して手動で設定を変更することが求められる場合やインストールの完了時に作成されます。また、設定ファイルをゼロから手動で作成して無人インストールを実行することもできます。
インストール設定ファイルの仕様
version: v2 1 variant: openshift-enterprise 2 variant_version: 3.9 3 ansible_log_path: /tmp/ansible.log 4 deployment: ansible_ssh_user: root 5 hosts: 6 - ip: 10.0.0.1 7 hostname: master-private.example.com 8 public_ip: 24.222.0.1 9 public_hostname: master.example.com 10 roles: 11 - master - node containerized: true 12 connect_to: 24.222.0.1 13 - ip: 10.0.0.2 hostname: node1-private.example.com public_ip: 24.222.0.2 public_hostname: node1.example.com node_labels: {'region': 'infra'} 14 roles: - node connect_to: 10.0.0.2 - ip: 10.0.0.3 hostname: node2-private.example.com public_ip: 24.222.0.3 public_hostname: node2.example.com roles: - node connect_to: 10.0.0.3 roles: 15 master: <variable_name1>: "<value1>" 16 <variable_name2>: "<value2>" node: <variable_name1>: "<value1>" 17
- 1
- このインストール設定ファイルのバージョン。OpenShift Container Platform 3.3 の時点で、有効なバージョンは
v2
のみです。 - 2
- インストールする OpenShift Container Platform バリアント。OpenShift Container Platform の場合、これを
openshift-enterprise
に設定します。 - 3
- 選択したバリアントの有効なバージョン:
3.9
、3.7
、3.6
、3.5
、3.4
、3.3
、3.2
、3.1
。指定しない場合、これはデフォルトで指定したバリアントの最新バージョンになります。 - 4
- Ansible ログが保存される場所を定義します。デフォルトで、これは /tmp/ansible.log ファイルになります。
- 5
- Ansible がファクトの収集やインストールのためにリモートシステムに SSH で入るために使用するユーザーを定義します。デフォルトで、これは root ユーザーになりますが、sudo 権限を持つどのユーザーにも設定できます。
- 6
- OpenShift Container Platform マスターおよびノードコンポーネントをインストールするホストの一覧を定義します。
- 7 8
- 必須。これにより、インストーラーはインストールに進む前にシステムに接続し、ファクトを収集できます。
- 9 10
- 無人インストールの場合は必須。これらの詳細を指定しない場合、この情報はインストーラーによって収集されるファクトからプルされ、詳細を確認するよう求められます。無人インストールについて定義されていない場合にインストールは失敗します。
- 11
- インストールされるサービスの種類を決定します。一覧として指定されます。
- 12
- true に設定すると、コンテナー化された OpenShift Container Platform サービスは RPM パッケージを使用してインストールされるのではなく、ターゲットのマスターおよびノードホストで実行されます。false に設定するか、未設定の場合は、デフォルトの RPM 方法が使用されます。RHEL Atomic Host にはコンテナー化方法が必要となり、これは/run/ostree-booted ファイルの検出に基づいて自動的に選択されます。詳細は、「コンテナー化ホストでのインストール」を参照してください。
- 13
- Ansible がシステムのインストール、アップグレードまたはアンインストール時に接続を試みる IP アドレス。設定ファイルが自動生成された場合、これは対話型インストールプロセス時に最初に入力するホストの値になります。
- 14
- ノードラベルはホストごとにオプションで設定できます。
- 15
- デプロイメント全体でのロールの辞書を定義します。
- 16 17
- ロールを割り当てられたホストにのみ適用する Ansible 変数を定義できます。具体例については、「Ansible の設定」を参照してください。
2.5.5. 無人インストールの実行
必ず「作業を開始する前に」をお読みください。
無人インストールでは、インストーラーの実行前にインストール設定ファイルでホストとクラスター設定を定義できるので、対話型インストールの質問と回答すべて確認する必要はありません。また、これによって完了していない状態の対話型インストールを再開でき、インストール作業を中断した場所に簡単に戻ることができます。
無人インストールを実行するには、まず ~/.config/openshift/installer.cfg.yml で インストール設定ファイルを定義します。次に、 -u
フラグを指定してインストーラーを実行します。
$ atomic-openshift-installer -u install
対話型または無人モードでは、インストーラーはデフォルトで ~/.config/openshift/installer.cfg.yml にある設定ファイルを使用します (ある場合)。ファイルが存在しない場合は、無人インストールを開始できません。
または、-c
オプションを使用して設定ファイルの別の場所を指定できますが、これを実行するには、インストールを実行するたびにファイルの場所を指定する必要があります。
$ atomic-openshift-installer -u -c </path/to/file> install
無人インストールの完了後、使用された ~/.config/openshift/installer.cfg.yml ファイルをバックアップします。これは、インストールを後で再実行したり、ホストをクラスターに追加したり、クラスターをアップグレードしたりする場合に必要になります。次に インストールを検証します。
2.5.6. インストールの検証
マスターが起動しており、ノードが登録されており、Ready ステータスで報告されていることを確認します。マスターホストで 以下を root で実行します。
# oc get nodes NAME STATUS ROLES AGE VERSION master.example.com Ready master 7h v1.9.1+a0ce1bc657 node1.example.com Ready compute 7h v1.9.1+a0ce1bc657 node2.example.com Ready compute 7h v1.9.1+a0ce1bc657
Web コンソールが正常にインストールされているか確認するには、マスターホスト名と Web コンソールのポート番号を使用して Web ブラウザーで Web コンソールにアクセスします。
たとえば、ホスト名が
master.openshift.com
で、デフォルトポート8443
を使用するマスターホストの場合、Web コンソールはhttps://master.openshift.com:8443/console
にあります。- 次に、OpenShift Container Platform クラスターを設定する次の手順について「次のステップ」を確認します。
2.5.7. OpenShift Container Platform のアンインストール
インストーラーの uninstall
コマンドを使用してクラスターのすべてのホストから OpenShift Container Platform をアンインストールできます。デフォルトで、インストーラーは ~/.config/openshift/installer.cfg.yml にあるインストール設定ファイルを使用します (ある場合)。
$ atomic-openshift-installer uninstall
または、-c
オプションを使用して設定ファイルの別の場所を指定することができます。
$ atomic-openshift-installer -c </path/to/file> uninstall
その他のオプションについては、「通常インストール (advanced installation) 方式」を参照してください。
2.5.8. 次のステップ
これで OpenShift Container Platform インスタンスが機能し、以下を実行できるようになります。
- 認証の設定。デフォルトで認証は Deny All に設定されています。
- 自動デプロイされる統合 Docker レジストリーの設定。
- 自動デプロイされるルーターの設定。
2.6. 通常インストール (Advanced Installation)
2.6.1. 概要
Ansible Playbook を使用して実装される参照設定は、 OpenShift Container Platform クラスターをインストールするための通常インストール (advanced installation)方式として使用できます。ただし Ansible に精通している場合、この設定を参照として使用し、選択する設定管理ツールを使用して独自の実装を作成することもできます。
RHEL Atomic Host はコンテナー化された OpenShift Container Platform サービスを実行するためにサポートされていますが、通常インストール (advanced installation) 方式は RHEL Atomic Host で利用できない Ansible を使用します。そのため、RPM ベースのインストーラーは RHEL 7 システムから実行される必要があります。インストールを開始するホストは OpenShift Container Platform クラスターに組み込まれる必要はありませんが、組み込みは可能です。または、インストーラーのコンテナー化バージョンを、RHEL Atomic Host システムから実行できるシステムコンテナーとして使用することもできます。
OpenShift Container Platform をスタンドアロンレジストリーとして インストールするには、「スタンドアロンレジストリーのインストール」を参照してください。
2.6.2. 作業を開始する前に
OpenShift Container Platform をインストールする前に、まず「前提条件」と「ホストの準備」のトピックを参照して、ホストを準備します。この準備では、コンポーネントタイプごとにシステムおよび環境要件を確認し、Docker を適切にインストールし、設定することが含まれます。さらに、通常インストール (advanced installation) 方式は Ansible Playbook をベースとしており、Ansible を直接起動する必要があるため、Ansible バージョン 2.4 以降をインストールことも含まれます。
コンテナー化方法を使用して OpenShift Container Platform をインストールする場合 (RHEL の場合はオプションですが、RHEL Atomic Host の場合は必須です) は、「コンテナー化ホストでのインストール」を参照して、それらの方法の違いを理解してから、このトピックに戻って続行してください。
インストール時間の最適化などの提案を含む大規模インストールについては、『Scaling and Performance Guide』を参照してください。
「前提条件」のトピックの手順に従い、RPM またはコンテナー化方法のいずれにするかを決めた後に「Ansible インベントリーファイルの設定」に進みます。
2.6.3. Ansible インベントリーファイルの設定
/etc/ansible/hosts ファイルは、OpenShift Container Platform をインストールするために使用される Playbook の Ansible インベントリーファイルです。インベントリーファイルは、OpenShift Container Platform クラスターの設定を記述します。ファイルのデフォルトの内容を必要な設定に置き換える必要があります。
以下のセクションでは、通常インストール (advanced installation) 時にインベントリーファイルに設定する一般的な変数を説明し、インストールの開始時に使用できるインベントリーファイルの例も紹介します。
記載される Ansible 変数の多くはオプションです。デフォルト値は開発環境には十分ですが、実稼働環境の場合は、利用可能な各種オプションを理解しておくことをお勧めします。
インベントリーの例は、「高可用性のための複数マスターの使用」などの各種の環境トポロジーを示しています。各自の要件に一致するサンプルを選択し、ご使用の環境に一致するよう修正し、通常インストール (advanced installation) の実行時にこれをインベントリーファイルとして使用できます。
イメージのバージョンポリシー
イメージには更新を維持するためにバージョン番号ポリシーが必要です。詳細は『Architecture Guide』の「Image Version Tag Policy」のセクションを参照してください。
2.6.3.1. クラスター変数の設定
Ansible インストールの実行時に OpenShift Container Platform クラスター全体にグローバルに適用される環境変数を割り当てるには、必要な変数を /etc/ansible/hosts ファイルの [OSEv3:vars] セクションにそれぞれ単一行で指定します。以下は例になります。
[OSEv3:vars] openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}] openshift_master_default_subdomain=apps.test.example.com
Ansible インベントリーファイルのパラメーター値に、#
, {
or }
などの特殊文字が含まれている場合、値をダブルエスケープ (double-escape) する必要があります (値を単一と二重引用符で囲みます)。たとえば、mypasswordwith###hashsigns
を変数 openshift_cloudprovider_openstack_password
の値として使用し、これを Ansible ホストインベントリーファイルで openshift_cloudprovider_openstack_password='"mypasswordwith###hashsigns"'
として宣言します。
以下の表は、クラスター全体に割り当てることのできる Ansible インストーラーで使用される変数について説明しています。
変数 | 目的 |
---|---|
|
この変数はインストーラーで使用する SSH ユーザーを設定します。デフォルトは |
|
|
|
この変数は、 ログを
デバッグログのレベルについての詳細は、「ロギングレベルの設定」を参照してください。 |
|
|
|
クラスターノードでネットワークタイムプロトコル (NTP) を有効にするかどうか。デフォルトは 重要 クラスター内のマスターおよびノードが同期されなくなる状態を防ぐには、このパラメーターのデフォルト値を変更しないでください。 |
|
この変数は、インベントリーホストファイルの要件に基づいてパラメーターと任意の JSON 値を設定します。以下は例になります。 openshift_master_admission_plugin_config={"ClusterResourceOverride":{"configuration":{"apiVersion":"v1","kind":"ClusterResourceOverrideConfig","memoryRequestToLimitPercent":"25","cpuRequestToLimitPercent":"25","limitCPUToMemoryPercent":"200"}}} |
|
この変数は API サービスの監査を有効にします。詳細は、「監査の設定」を参照してください。 |
|
この変数はクラスターのホスト名を上書きします。デフォルトはマスターのホスト名です。 |
|
この変数はクラスターのパブリックホスト名を上書きします。デフォルトはマスターのホスト名です。外部ロードバランサーを使用する場合は、外部ロードバランサーのアドレスを指定します。 例を以下に示します。 openshift_master_cluster_public_hostname=openshift-ansible.public.example.com |
|
オプションです。この変数は複数マスターのデプロイ時の HA 方法を定義します。 |
|
この変数は、アップグレード Playbook を直接実行する時に HA マスターのローリング再起動 (例: マスターは一度に 1 つずつ停止します) を有効にします。これはデフォルトで |
|
この変数は アイデンティティープロバイダーを設定します。デフォルト値はDeny Allです。サポートされているアイデンティティープロバイダーを使用する場合は OpenShift Container Platform がそれを使用するよう設定します。 |
|
これらの変数は、インストールの一部としてデプロイされるカスタム証明書を設定するために使用されます。詳細は、「カスタム証明書の設定」を参照してください。 |
| |
|
ホストされているルーターのカスタム証明書の場所を指定します。 |
|
自動生成されるレジストリー証明書の有効日数。デフォルトで |
|
自動生成される CA 証明書の有効日数。デフォルトで |
|
自動生成されるノード証明書の有効日数。デフォルトで |
|
自動生成されるマスター証明書の有効日数。デフォルトで |
|
自動生成される外部 etcd 証明書の有効日数。etcd CA、ピア、サーバー、クライアント証明書の有効性を管理します。デフォルトで |
|
|
|
これらの変数は OAuth 設定のセッションオプションのデフォルトを上書きします。詳細は「 セッションオプションの設定」を参照してください。 |
| |
| |
| |
|
この変数はノード設定の |
|
マスター設定で |
|
ルーター Pod を自動的にデプロイするためのデフォルトのノードセレクター。詳細は「ノードホストラベルの設定」を参照してください。 |
|
レジストリー Pod を自動的にデプロイするためのデフォルトのノードセレクター。詳細は、「ノードホストラベルの設定」を参照してください。 |
|
この変数は、ブローカーが提供するテンプレートの 1 つ以上の namespace を指定することでテンプレートサービスブローカーを有効にします。 |
|
テンプレートサービスブローカー Pod を自動的にデプロイするためのデフォルトのノードセレクター。デフォルトで |
|
この変数は、Pod を配置する際にプロジェクトがデフォルトで使用するノードセレクターを上書きします。デフォルトのセレクターはマスター設定ファイルの |
|
OpenShift Container Platform は指定された追加レジストリーを docker 設定に追加します。これらは検索対象のレジストリーです。このレジストリーへのアクセスに必要なレジストリーが 例を以下に示します。 openshift_docker_additional_registries=example.com:443 |
|
OpenShift Container Platform は指定された追加の非セキュアなレジストリーを docker 設定に追加します。それらのレジストリーの SSL (Secure Sockets Layer) は検証されません。さらに、それらのレジストリーを |
|
OpenShift Container Platform は指定されたブロック済みレジストリーを docker 設定に追加します。これは一覧表示されるレジストリーをブロックします。これを |
|
この変数は、マスター設定でクラスターメトリクスの |
|
この変数は AWS アベイラビリティーゾーン固有のクラスター識別子です。これを使用することで、複数のゾーンまたは複数のクラスターを持つ Amazon Web Service (AWS) での潜在的な問題を回避することができます。詳細は「AWS のクラスターへのラベル付け」を参照してください。 |
|
この変数を使用して、インストールまたは設定するコンテナーイメージタグを指定します。 |
|
この変数を使用して、インストールまたは設定する RPM バージョンを指定します。 |
クラスターのセットアップ後に openshift_image_tag
または openshift_pkg_version
変数を変更する場合はアップグレードがトリガーされ、ダウンタイムが発生します。
-
openshift_image_tag
が設定されている場合、この値は別のバージョンがインストールされている場合でもコンテナー化された環境のすべてのホストに使用されます。 -
openshift_pkg_version
が設定されている場合、この値は別のバージョンがインストールされている場合でも RPM ベースの環境のすべてのホストに使用されます。
変数 | 目的 |
---|---|
|
この変数は、公開されるルートに使用するデフォルトのサブドメインを上書きします。 |
|
この変数は、どの OpenShift SDN プラグインを Pod ネットワークに使用するかを設定します。デフォルトでは標準 SDN プラグインの |
|
この変数は SDN クラスターネットワーク CIDR ブロックを上書きします。これは、Pod IP の割り当て元のネットワークです。このネットワークブロックは非公開ブロックとし、Pod、ノード、またはマスターがアクセスする必要のある可能性があるインフラストラクチャーの既存のネットワークブロックと競合しないようにする必要があります。デフォルトは |
|
この変数は、サービスを OpenShift Container Platform SDN 内で作成する際のサブネットを設定します。このネットワークブロックは非公開とし、Pod、ノード、またはマスターがアクセスする必要の可能性があるインフラストラクチャーの既存のネットワークブロックと競合しないようにする必要があります。そうでない場合、インストールは失敗します。デフォルトは |
|
この変数は、OpenShift Container Platform SDN により Pod IP のホストサブネットごとに割り当てられるサイズを指定します。デフォルトは |
|
この変数は、使用するサービスプロキシーモードを指定します。 |
|
この変数は、デフォルトの SDN の代わりに flannel を代替ネットワーキングレイヤーとして有効にします。flannel を有効にする場合は、 |
|
OpenShift SDN プラグインを無効にするには、 |
2.6.3.2. デプロイメントタイプの設定
Playbook 全体で使用される各種デフォルト値とインストーラーによって使用されるロールは、デプロイメントタイプの設定 (通常は Ansible インベントリーファイルで定義されます) に基づいて決定されます。
OpenShift Container Platform バリアントをインストールするには、インベントリーファイルの [OSEv3:vars]
セクションにある openshift_deployment_type
パラメーターが openshift-enterprise
に設定されていることを確認してください。
[OSEv3:vars] openshift_deployment_type=openshift-enterprise
2.6.3.3. ホスト変数の設定
Ansible のインストール時に環境変数をホストに割り当てるには、[masters] セクションまたは [nodes] セクションにホストを入力した後に /etc/ansible/hosts ファイルで必要な変数を指定します。以下は例を示しています。
[masters] ec2-52-6-179-239.compute-1.amazonaws.com openshift_public_hostname=ose3-master.public.example.com
以下の表は、Ansible インストーラーで使用され、個々のホストエントリーに割り当てることができる変数を示しています。
変数 | 目的 |
---|---|
|
この変数は、システムの内部クラスターホスト名を上書きします。システムのデフォルトの IP アドレスがシステムのホスト名に解決されない場合にこれを使用します。 |
|
この変数は、システムのパブリックホスト名を上書きします。クラウドインストールやネットワークアドレス変換 (NAT) を使用するネットワーク上のホストに使用します。 |
|
この変数は、システムのクラスター内部 IP アドレスを上書きします。デフォルトルートが設定されていないインターフェースを使用する場合に使用します。etcd には |
|
この変数は、システムのパブリック IP アドレスを上書きします。クラウドインストールやネットワークアドレス変換 (NAT) を使用するネットワーク上のホストに使用します。 |
|
true に設定した場合、コンテナー化された OpenShift Container Platform サービスは、RPM パッケージを使用してインストールされる代わりに、ターゲットマスターとノードホスト上で実行されます。 false に設定するか、値を設定しない場合、デフォルトの RPM 方法が使用されます。RHEL Atomic Host では、コンテナー化方法を使用する必要があり、/run/ostree-booted ファイルの検出に基づいて自動的に選択されます。詳細については、「コンテナー化ホストでのインストール」を参照してください。コンテナー化インストールは、OpenShift Container Platform 3.1.1 以降でサポートされています。 |
|
この変数は、インストール時にラベルをノードに追加します。詳細については、「ノードホストラベルの設定」を参照してください。 |
|
この変数は、ノードに |
|
この変数は、/etc/sysconfig/docker 内に追加の
次に、Docker が "--log-driver json-file --log-opt max-size=1M --log-opt max-file=3"
|
|
この変数は、ホストがスケジュール可能ノードとしてマークされているかどうか、つまり、新しい Pod を配置できるかどうかを設定します。マスターでのスケジュール可能性の設定を参照してください。 |
2.6.3.4. マスター API ポートの設定
マスター API で使用するデフォルトのポートを設定するには、/etc/ansible/hosts ファイルに以下の変数を定義します。
変数 | 目的 |
---|---|
|
この変数は、OpenShift Container Platform API へのアクセスに使用するポート番号を設定します。 |
例を以下に示します。
openshift_master_api_port=3443
Web コンソールポート設定 (openshift_master_console_port
) は、 API サーバーのポート (openshift_master_api_port
) に一致している必要があります。
2.6.3.5. クラスターのプレインストールチェックの設定
プレインストールチェックは、openshift_health_checker Ansible ロールの一部として実行される診断タスクのセットです。OpenShift Container Platform の Ansible インストールの前に実行され、必要なインベントリー値が設定されていることを確認し、正常なインストールを妨げたり干渉したりする可能性があるホストの潜在的な問題を特定します。
以下の表は、OpenShift Container Platform のすべての Ansible インストールの前に実行される、使用可能なプレインストールチェックを示しています。
チェック名 | 目的 |
---|---|
|
このチェックでは、OpenShift Container Platform の特定のデプロイメントで推奨されるメモリー容量がホストにあることを確認します。デフォルト値は、最新のインストールドキュメントから取得されたものです。インベントリーファイルで |
|
このチェックは、etcd、マスター、およびノードホストに対してのみ実行され、OpenShift Container Platform インストールのマウントパスに十分なディスク領域が残っていることを確認します。推奨されるディスク値は、最新のインストールドキュメントから取得されたものです。インベントリーファイルで |
|
docker デーモン (ノードとコンテナー化インストール) に依存するホストでのみ実行され、 docker の合計使用率がユーザー定義の上限を超えていないことを確認します。ユーザー定義の上限が設定されていない場合、docker の最大使用率のしきい値はデフォルトで使用可能な合計サイズの 90% になります。合計使用率のしきい値上限は、インベントリーファイルで変数を使用して設定できます。( |
|
docker デーモンが OpenShift Containe Platform でサポートされているストレージドライバーを使用していることを確認します。 |
|
OpenShift Container Platform インストールで必要なイメージがローカルで、またはホストマシン上の 1 つ以上の設定済みコンテナーイメージレジストリー で使用可能であることの確認を試行します。 |
|
|
|
OpenShift Container Platform の非コンテナー化インストールの前に実行され、現在のインストールに必要な RPM パッケージが利用可能であることを確認します。 |
|
|
特定のプレインストールチェックを無効にするには、カンマ区切りのチェック名の一覧を指定した変数 openshift_disable_check
をインベントリーファイルに組み込みます。以下は例になります。
openshift_disable_check=memory_availability,disk_availability
既存のクラスターの診断用に実行するための類似のヘルスチェックセットが Ansible ベースのヘルスチェックに用意されています。また、「証明書の再デプロイ」には証明書の有効期限を確認するためのチェックセットもあります。
2.6.3.6. システムコンテナーの設定
システムコンテナーを使用すると、docker
デーモンを実行する前に実行する必要があるサービスをコンテナー化できます。システムコンテナーは、以下の機能を使用する Docker 形式のコンテナーです。
したがって、システムコンテナーは従来の docker
サービスの外部で保存され、実行されます。システムコンテナーのテクノロジーについての詳細は、『Red Hat Enterprise Linux Atomic Host: Managing Containers』ドキュメントの「Running System Containers」を参照してください。
特定のコンポーネントを RPM や標準のコンテナー化方法の代わりにシステムコンテナーとして実行するように OpenShift Container Platform インストールを設定できます。現在 OpenShift Container Platform では、docker
コンポーネントと etcd コンポーネントをシステムコンテナーとして実行できます。
現時点でシステムコンテナーは OS 固有のコンテナーです。特定のバージョンの atomic
および systemd を必要とするためです。たとえば、 RHEL、Fedora、 CentOS 用に各種のシステムコンテナーが作成されます。使用するシステムコンテナーがコンテナーを実行するホストの OS に一致していることを確認してください。OpenShift Container Platform では、RHEL と RHEL Atomic のみがホスト OS としてサポートされています。そのため、RHEL 用のシステムコンテナーがデフォルトで使用されます。
2.6.3.6.1. Docker をシステムコンテナーとして実行する
OpenShift Container Platform クラスターでの docker
の従来の使用法は RPM パッケージインストールを使用する方法です。Red Hat Enterprise Linux (RHEL) システムの場合は、これは別途インストールする必要があります。RHEL Atomic Host の場合は、これはデフォルトで提供されます。
ただし、docker
をノードホストでシステムコンテナーとして実行するように OpenShift Container Platform インストールを設定できます。システムコンテナー方法を使用する場合は、docker
パッケージとサービスの代わりに container-engine
コンテナーイメージと systemd サービスがホストで使用されます。
docker
をシステムコンテナーとして実行するには、以下を実行します。
RHEL 7 では、Docker 用のデフォルトのストレージバックエンドはループバックデバイス上のシンプールです。そのため RHEL システムでは、OpenShift Container Platform を実行する前に
docker
用のシンプール論理ボリュームを設定する必要があります。RHEL Atomic Host システムでは、この手順を省略できます。RHEL システムについては、以下のセクションに記載されている手順を実行してください。
ストレージの設定手順が完了したら、RPM をインストールしたままにしておくことができます。
インベントリーファイルの
[OSEv3:vars]
セクションで以下のクラスター変数をTrue
に設定します。openshift_docker_use_system_container=True
システムコンテナー方法を使用する場合、docker
の以下のインベントリー変数は無視されます。
-
docker_version
-
docker_upgrade
また、以下のインベントリー変数は使用できません。
-
openshift_docker_options
システムコンテナーの docker
が container-engine
イメージをプルするときに、デフォルトの registry.access.redhat.com/openshift3/
ではなく、特定のコンテナーレジストリーとリポジトリーを使用するように強制することもできます。これを行うには、インベントリーファイルの [OSEv3:vars]
セクションで以下のクラスター変数を設定します。
openshift_docker_systemcontainer_image_override="<registry>/<user>/<image>:<tag>"
2.6.3.6.2. etcd をシステムコンテナーとして実行する
OpenShift Container Platform の RPM ベースのインストール方法を使用する場合、etcd は RPM パッケージを使用して RHEL システムにインストールされます。コンテナー化インストール方法を使用する場合は、代わりに RHEL または RHEL Atomic Host の rhel7/etcd
イメージが使用されます。
ただし、etcd をシステムコンテナーとして実行するように OpenShift Container Platform インストールを設定できます。標準のコンテナー化方法では etcd_container
という systemd サービスが使用されますが、システムコンテナー方法では RPM ベースの方法と同様にサービス名 etcd が使用されます。この方法を使用する etcd のデータディレクトリーは /var/lib/etcd です。
etcd をシステムコンテナーとして実行するには、インベントリーファイルの [OSEv3:vars]
セクションで以下のクラスター変数を設定します。
openshift_use_etcd_system_container=True
2.6.3.7. レジストリーの場所の設定
registry.access.redhat.com
にあるデフォルト以外のイメージレジストリーを使用する場合は、目的のレジストリーを /etc/ansible/hosts ファイル内に指定します。
oreg_url=example.com/openshift3/ose-${component}:${version} openshift_examples_modify_imagestreams=true
変数 | 目的 |
---|---|
|
代わりのイメージの場所に設定します。 |
|
デフォルト以外のレジストリーを参照している場合は |
|
1 つ以上の追加レジストリーを指定します。レジストリーにアクセスするために必要なレジストリーが |
|
registry-console イメージが置かれる namespace の URL およびパスを指定します。この値は、 |
|
Web コンソールイメージのプレフィックスを指定します。 |
|
サービスカタログコンポートイメージのプレフィックスを指定します。 |
|
Ansible サービスブローカーのコンポーネントイメージのプレフィックスを指定します。 |
|
テンプレートサービスブローカーのコンポーネントイメージのプレフィックスを指定します。 |
|
CRI-O を使用している場合、および別のレジストリーからの他の CRI-O システムコンテナーイメージを使用している場合の設定です。 |
例を以下に示します。
oreg_url=example.com/openshift3/ose-${component}:${version} openshift_examples_modify_imagestreams=true openshift_docker_additional_registries=example.com:443 +openshift_crio_systemcontainer_image_override=<registry>/<repo>/<image>:<tag> openshift_cockpit_deployer_prefix='registry.example.com/openshift3/' openshift_web_console_prefix='registry.example.com/openshift3/ose- openshift_service_catalog_image_prefix='registry.example.com/openshift3/ose-' ansible_service_broker_image_prefix='registry.example.com/openshift3/ose-' template_service_broker_prefix='registry.example.com/openshift3/ose-'
2.6.3.8. レジストリールートの設定
ユーザーが OpenShift Container Platform クラスターの外部からイメージをプルして内部の Docker レジストリーにプッシュできるように、/etc/ansible/hosts ファイルにレジストリールートを設定します。デフォルトでは、レジストリールートは docker-registry-default.router.default.svc.cluster.local です。
変数 | 目的 |
---|---|
|
必要なレジストリールートの値に設定します。ルートには、ルーターによって通信が管理されるインフラストラクチャーノードに解決される名前、またはデフォルトのアプリケーションサブドメインのワイルドカード値として設定したサブドメインのいずれかが含まれます。たとえば、 |
|
レジストリー証明書へのパスを設定します。証明書の場所の値を指定しない場合、証明書が生成されます。以下の証明書の場所を定義できます。
|
|
以下のいずれかの値に設定します。
|
例を以下に示します。
openshift_hosted_registry_routehost=<path> openshift_hosted_registry_routetermination=reencrypt openshift_hosted_registry_routecertificates= "{'certfile': '<path>/org-cert.pem', 'keyfile': '<path>/org-privkey.pem', 'cafile': '<path>/org-chain.pem'}"
2.6.3.9. レジストリーコンソールの設定
デフォルト以外の Cockpit レジストリーコンソールイメージを使用する場合や、特定のバージョンのコンソールが必要な場合は、以下のように必要なレジストリーを /etc/ansible/hosts ファイル内に指定します。
openshift_cockpit_deployer_prefix=<registry_name>/<namespace>/ openshift_cockpit_deployer_version=<cockpit_image_tag>
変数 | 目的 |
---|---|
|
イメージが置かれているディレクトリーの URL とパスを指定します。 |
|
Cockpit イメージのバージョンを指定します。 |
例: イメージが registry.example.com/openshift3/registry-console
にあり、バージョン 3.9.3 が必要な場合は、以下を入力します。
openshift_cockpit_deployer_prefix='registry.example.com/openshift3/' openshift_cockpit_deployer_version='3.9.3'
2.6.3.10. Red Hat Gluster Storage の永続ストレージの設定
Red Hat Gluster Storage は、OpenShift Container Platform の永続ストレージと動的プロビジョニングを提供するように設定でき、OpenShift Container Platform 内のコンテナー化ストレージ (Container-Native Storage) としても、独自のノード上の非コンテナー化ストレージ (Container-Ready Storage) としても使用できます。
追加情報と以下を含む例については、「 Red Hat Gluster Storage を使用する永続ストレージ」を参照してください。
2.6.3.10.1. Container-Native Storage の設定
具体的なホストの準備と前提条件については、Container-Native Storage に関する考慮事項を参照してください。
インベントリーファイルの
[OSEv3:children]
セクションにglusterfs
を追加して、[glusterfs]
グループを有効にします。[OSEv3:children] masters nodes glusterfs
GlusterFS ストレージをホストする各ストレージノードのエントリーを含む
[glusterfs]
セクションを追加します。ノードごとに、glusterfs_devices
を GlusterFS クラスターの一部として完全に管理される raw ブロックデバイスの一覧に設定します。少なくとも 1 つのデバイスを一覧に含める必要があります。各デバイスは、パーティションや LVM PV がないベアでなければなりません。変数は以下の形式で指定します。<hostname_or_ip> glusterfs_devices='[ "</path/to/device1/>", "</path/to/device2>", ... ]'
例を以下に示します。
[glusterfs] node11.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node12.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node13.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]'
[glusterfs]
の下に一覧表示されているホストを[nodes]
グループに追加します。[nodes] ... node11.example.com openshift_schedulable=True node12.example.com openshift_schedulable=True node13.example.com openshift_schedulable=True
2.6.3.10.2. Container-Ready Storage の設定
インベントリーファイルの
[OSEv3:children]
セクションにglusterfs
を追加して、[glusterfs]
グループを有効にします。[OSEv3:children] masters nodes glusterfs
以下の変数を
[OSEv3:vars]
セクションに追加し、お使いの設定に応じて調整します。[OSEv3:vars] ... openshift_storage_glusterfs_is_native=false openshift_storage_glusterfs_storageclass=true openshift_storage_glusterfs_heketi_is_native=true openshift_storage_glusterfs_heketi_executor=ssh openshift_storage_glusterfs_heketi_ssh_port=22 openshift_storage_glusterfs_heketi_ssh_user=root openshift_storage_glusterfs_heketi_ssh_sudo=false openshift_storage_glusterfs_heketi_ssh_keyfile="/root/.ssh/id_rsa"
GlusterFS ストレージをホストする各ストレージノードのエントリーを含む
[glusterfs]
セクションを追加します。ノードごとに、glusterfs_devices
を GlusterFS クラスターの一部として完全に管理される raw ブロックデバイスの一覧に設定します。少なくと も 1 つのデバイスを一覧に含める必要があります。各デバイスはパーティションや LVM PV がないベアでなければなりません。また、glusterfs_ip
をノードの IP アドレスに設定します。変数は以下の形式で指定します。<hostname_or_ip> glusterfs_ip=<ip_address> glusterfs_devices='[ "</path/to/device1/>", "</path/to/device2>", ... ]'
例を以下に示します。
[glusterfs] gluster1.example.com glusterfs_ip=192.168.10.11 glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' gluster2.example.com glusterfs_ip=192.168.10.12 glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' gluster3.example.com glusterfs_ip=192.168.10.13 glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]'
2.6.3.11. OpenShift Container レジストリーの設定
統合された OpenShift Container レジストリー は、通常インストーラー (Advanced Installer)を使用してデプロイできます。
2.6.3.11.1. レジストリーストレージの設定
レジストリーストレージオプションが使用されていない場合、デフォルトの OpenShift Container レジストリーは一時的で、Pod が存在しなくなるとすべてのデータが失われます。通常インストーラー (Advanced Installer) を使用する場合に、レジストリーストレージを有効にするオプションが複数用意されています。
オプション A: NFS ホストグループ
レジストリーストレージに NFS を使用することは、OpenShift Container Platform では推奨されていません。
次の変数が設定されている場合、通常インストール (Advanced installation) 時に [nfs]
ホストグループ内のホストのパス <nfs_directory>/<volume_name> に NFS ボリュームが作成されます。たとえば、次のオプションを使用した場合、ボリュームパスは /exports/registry になります。
[OSEv3:vars] openshift_hosted_registry_storage_kind=nfs openshift_hosted_registry_storage_access_modes=['ReadWriteMany'] openshift_hosted_registry_storage_nfs_directory=/exports openshift_hosted_registry_storage_nfs_options='*(rw,root_squash)' openshift_hosted_registry_storage_volume_name=registry openshift_hosted_registry_storage_volume_size=10Gi
オプション B: 外部 NFS ホスト
レジストリーストレージに NFS を使用することは、OpenShift Container Platform では推奨されていません。
外部の NFS ボリュームを使用するには、該当する NFS ボリュームがストレージホストの <nfs_directory>/<volume_name> パスにすでに存在している必要があります。次のオプションを使用した場合、リモートボリュームパスは nfs.example.com:/exports/registry になります。
[OSEv3:vars] openshift_hosted_registry_storage_kind=nfs openshift_hosted_registry_storage_access_modes=['ReadWriteMany'] openshift_hosted_registry_storage_host=nfs.example.com openshift_hosted_registry_storage_nfs_directory=/exports openshift_hosted_registry_storage_volume_name=registry openshift_hosted_registry_storage_volume_size=10Gi
オプション C: OpenStack プラットフォーム
OpenStack ストレージ設定がすでに存在している必要があります。
[OSEv3:vars] openshift_hosted_registry_storage_kind=openstack openshift_hosted_registry_storage_access_modes=['ReadWriteOnce'] openshift_hosted_registry_storage_openstack_filesystem=ext4 openshift_hosted_registry_storage_openstack_volumeID=3a650b4f-c8c5-4e0a-8ca5-eaee11f16c57 openshift_hosted_registry_storage_volume_size=10Gi
オプション D: AWS または別の S3 ストレージソリューション
シンプルストレージソリューション (S3) バケットがすでに存在している必要があります。
[OSEv3:vars] #openshift_hosted_registry_storage_kind=object #openshift_hosted_registry_storage_provider=s3 #openshift_hosted_registry_storage_s3_accesskey=access_key_id #openshift_hosted_registry_storage_s3_secretkey=secret_access_key #openshift_hosted_registry_storage_s3_bucket=bucket_name #openshift_hosted_registry_storage_s3_region=bucket_region #openshift_hosted_registry_storage_s3_chunksize=26214400 #openshift_hosted_registry_storage_s3_rootdirectory=/registry #openshift_hosted_registry_pullthrough=true #openshift_hosted_registry_acceptschema2=true #openshift_hosted_registry_enforcequota=true
Minio や ExoScale などの別の S3 サービスを使用している場合は、リージョンエンドポイントパラメーターも追加します。
openshift_hosted_registry_storage_s3_regionendpoint=https://myendpoint.example.com/
オプション E: Container-Native Storage
Container-Native Storage の設定と同様に、Red Hat Gluster Storage はクラスターの初期インストール時に OpenShift Container レジストリーのストレージを提供するように設定できます。これにより、冗長で信頼性の高いレジストリーのストレージを確保できます。
具体的なホストの準備と前提条件については、Container-Native Storage に関する考慮事項を参照してください。
インベントリーファイルの
[OSEv3:vars]
に次の変数を追加します。[OSEv3:vars] ... openshift_hosted_registry_storage_kind=glusterfs
[OSEv3:children]
セクションにglusterfs_registry
を追加して、[glusterfs_registry]
グループを有効にします。[OSEv3:children] masters nodes glusterfs_registry
GlusterFS ストレージをホストする各ストレージノードのエントリーを含む
[glusterfs_registry]
セクションを追加します。ノードごとに、glusterfs_devices
を GlusterFS クラスターの一部として完全に管理される raw ブロックデバイスの一覧に設定します。少なくとも 1 つのデバイスを一覧に含める必要があります。各デバイスはパーティションや LVM PV がないベアでなければなりません。変数は次の形式で指定します。<hostname_or_ip> glusterfs_devices='[ "</path/to/device1/>", "</path/to/device2>", ... ]'
例を以下に示します。
[glusterfs_registry] node11.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node12.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node13.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]'
[glusterfs_registry]
の下に一覧表示されているホストを[nodes]
グループに追加します。[nodes] ... node11.example.com openshift_schedulable=True node12.example.com openshift_schedulable=True node13.example.com openshift_schedulable=True
オプション F: Google Compute Engine (GCE) 上の Google Cloud Storage (GCS) バケット
GCS バケットがすでに存在している必要があります。
[OSEv3:vars] openshift_hosted_registry_storage_provider=gcs openshift_hosted_registry_storage_gcs_bucket=bucket01 openshift_hosted_registry_storage_gcs_keyfile=test.key openshift_hosted_registry_storage_gcs_rootdirectory=/registry
2.6.3.12. グローバルプロキシーオプションの設定
ホストが外部ホストに接続するために HTTP または HTTPS プロキシーを使用する必要がある場合は、プロキシーを使用するためにマスター、Docker、ビルドなどの多数のコンポーネントを設定する必要があります。ノードサービスは外部アクセスを必要としないマスター API にのみ接続するため、プロキシーを使用するように設定する必要はありません。
この設定を単純化するため、クラスターまたはホストレベルで次の Ansible 変数を指定し、これらの設定を環境全体に均一に適用することができます。
ビルド用のプロキシー環境の定義方法の詳細については、「グローバルビルドのデフォルトとオーバーライドの設定」を参照してください。
変数 | 目的 |
---|---|
|
この変数はマスターおよび Docker デーモンの |
|
この変数は、マスターおよび Docker デーモンの |
|
この変数は、マスターおよび Docker デーモンに |
|
このブール変数は、すべての定義済み OpenShift ホストの名前と |
|
この変数は、 |
|
この変数は、 |
|
この変数は、 |
|
この変数は、ビルド時に |
|
この変数は、ビルド時に |
2.6.3.13. ファイアウォールの設定
- デフォルトのファイアウォールを変更する場合は、不一致を防ぐために、クラスター内の各ホストが同じファイアウォールタイプを使用していることを確認してください。
- Atomic Host にインストールされた OpenShift Container Platform でファイアウォールを使用しないでください。ファイアウォールは Atomic Host ではサポートされていません。
iptables はデフォルトのファイアウォールですが、firewalld は新規インストールで推奨されるファイアウォールです。
OpenShift Container Platform は iptables をデフォルトのファイアウォールとして使用しますが、クラスターをインストールプロセス時に firewalld を使用するように設定できます。
iptables はデフォルトのファイアウォールであるため、OpenShift Container Platform は iptables を自動的に設定するように設計されています。ただし、iptables ルールが適切に設定されていない場合、iptables ルールによって OpenShift Container Platform が中断する可能性があります。 firewalld の利点の 1 つは、複数のオブジェクトでファイアウォールルールを安全に共有できることです。
firewalld を OpenShift Container Platform インストールのファイアウォールとして使用するには、インストール時に os_firewall_use_firewalld
変数を Ansible ホストファイルの設定変数の一覧に追加します。
[OSEv3:vars]
os_firewall_use_firewalld=True 1
- 1
- この変数を
true
に設定することで、必要なポートが開き、ルールがデフォルトゾーンに追加されます。これにより、firewalld が適切に設定されていることを確認できます。
firewalld のデフォルトの設定オプションを使用する際には設定オプションが制限され、これらをオーバーライドすることはできません。たとえば、ストレージネットワークを複数ゾーンのインターフェースでセットアップすることができますが、ノードが通信に使用するインターフェースはデフォルトゾーンになければなりません。
2.6.3.14. マスターでのスケジュール可能性の設定
インストールプロセス時にマスターとして指定するすべてのホストは、マスターが OpenShift SDN の一部として設定されるように、ノードとして設定される必要もあります。これらのホストのエントリーを [nodes]
セクションに追加してこの設定を行う必要があります。
[nodes] master.example.com
以前のバージョンの OpenShift Container Platform では、マスターホストはインストーラーによってデフォルトでスケジュール不能ノードとしてマークされました。そのため、マスターホストに新しい Pod を配置することができませんでした。しかし、OpenShift Container Platform 3.9 以降では、マスターはインストール時に自動的にスケジュール可能ノードとしてマークされます。この変更の主な目的は、以前はマスター自体の一部として実行されていた Web コンソールをマスターにデプロイされた Pod として実行できるようにすることです。
インストール後にホストのスケジュール可能性を変更したい場合は、「ノードをスケジュール対象外 (Unschedulable) またはスケジュール対象 (Schedulable) としてマークする」を参照してください。
2.6.3.15. ノードホストラベルの設定
Ansible のインストール時に /etc/ansible/hosts ファイルを設定することで、ノードホストにラベルを割り当てることができます。ラベルは、スケジューラーを使用して Pod のノードへの配置を決定するのに役立ちます。region=infra
( 専用インフラストラクチャーノードと呼ばれています。詳細は、「専用インフラストラクチャーノードの設定」を参照してください) を除き、実際のラベル名と値は任意に付けることができ、クラスターの要件に合わせて自由に割り当てることができます。
ラベルをAnsible のインストール時にノードホストに割り当てるには、openshift_node_labels
変数を、 [nodes]
セクションの必要なノードホストエントリーに追加されたラベルと共に使用します。次の例では、primary
というリージョンと east
というゾーンのラベルを設定しています。
[nodes] node1.example.com openshift_node_labels="{'region': 'primary', 'zone': 'east'}"
OpenShift Container Platform 3.9 以降では、マスターがデフォルトでスケジュール可能ノードとしてマークされるようになりました。そのため、デフォルトノードセレクター (マスター設定ファイルの projectConfig.defaultNodeSelector
フィールドで定義され、Pod を配置する際にプロジェクトがデフォルトで使用するノードを決定するために使用されます。以前はデフォルトで空白にされていました。) がクラスターのインストール時にデフォルトで設定されるようになりました。デフォルトノードセレクターは、osm_default_node_selector
Ansible 変数で上書きしない限り、node-role.kubernetes.io/compute=true
に設定されます。
さらに、osm_default_node_selector
が設定されているかどうかにかかわらず、以下の自動のラベル付けがインストール時にインベントリーファイルで定義されるホストに対して実行されます。
-
非マスター、非専用のインフラストラクチャーノードホスト (上記の
node1.example.com
ホストなど)には、node-role.kubernetes.io/compute=true
というラベルが付けられます。 -
マスターノードには
node-role.kubernetes.io/master=true
というラベルが付けられます。
これにより、Pod の配置を決定する際にデフォルトノードセレクターがノードを選択できるようになります。
インストール時にデフォルトノードセレクター node-role.kubernetes.io/compute=true
を受け入れる場合、クラスターで非マスターノードとして定義されているのが専用インフラストラクチャーノードだけでないことを確認してください。この場合、アプリケーション Pod はデプロイに失敗します。 プロジェクトの Pod のスケジュール時に、デフォルトノードセレクターに一致するnode-role.kubernetes.io/compute=true
ラベル付きのノードが存在しないためです。
インストール後に必要に応じてこの設定を調整する手順については、「クラスター全体でのデフォルトノードセレクターの設定」を参照してください。
2.6.3.15.1. 専用インフラストラクチャーノードの設定
実稼働環境では、レジストリー Pod とルーター Pod をユーザーアプリケーション用の Pod とは別に実行できる専用インフラストラクチャーノードを保持することを推奨します。
openshift_router_selector
および openshift_registry_selector
Ansible 設定は、レジストリー Pod とルーター Pod を配置する際に使用されるラベルセレクターを決定します。これらはデフォルトで region=infra
に設定されます。
# default selectors for router and registry services # openshift_router_selector='region=infra' # openshift_registry_selector='region=infra'
レジストリーとルーターは、region=infra
ラベルが付いた、専用インフラストラクチャーノードと見なされるノードホスト上でのみ実行できます。お使いの OpenShift Container Platform 環境に、region=infra
ラベルが付いたノードホストが 1 つ以上存在することを確認してください。以下は例になります。
[nodes] infra-node1.example.com openshift_node_labels="{'region': 'infra','zone': 'default'}"
セレクター設定に一致するノードが [nodes]
セクションにない場合、デフォルトのルーターとレジストリーはデプロイに失敗し、保留中
ステータスになります。
レジストリーとルーターの管理に OpenShift Container Platform を使用しない場合は、次の Ansible 設定を設定します。
openshift_hosted_manage_registry=false openshift_hosted_manage_router=false
デフォルトの registry.access.redhat.com
以外のイメージレジストリーを使用する場合は、/etc/ansible/hosts ファイルで 必要なレジストリーを指定する必要があります。
マスターでのスケジュール可能性の設定で説明されているように、マスターホストはデフォルトでスケジュール可能としてマークされます。マスターホストに region=infra
ラベルを付けており、他に専用インフラストラクチャーノードがない場合、マスターホストはスケジュール可能としてマークされる必要もあります。そうでない場合には、レジストリーとルーター Pod をどこにも配置することができなくなります。
[nodes] master.example.com openshift_node_labels="{'region': 'infra','zone': 'default'}" openshift_schedulable=true
2.6.3.16. セッションオプションの設定
OAuth 設定のセッションオプションはインベントリーファイルで設定できます。デフォルトで、Ansible は sessionSecretsFile
を生成された認証および暗号化シークレットで設定し、1 つのマスターで生成されたセッションが他のマスターによって復号化されるようにできます。デフォルトの場所は /etc/origin/master/session-secrets.yaml であり、このファイルはすべてのマスターで削除された場合にのみ再作成されます。
openshift_master_session_name
および openshift_master_session_max_seconds
を使用してセッション名と最大秒数を設定できます。
openshift_master_session_name=ssn openshift_master_session_max_seconds=3600
設定されている場合、openshift_master_session_auth_secrets
および openshift_master_encryption_secrets
は同じ長さでなければなりません。
HMAC を使用したセッションの認証に使用される openshift_master_session_auth_secrets
の場合、32 バイトまたは 64 バイトのシークレットを使用することを推奨します。
openshift_master_session_auth_secrets=['DONT+USE+THIS+SECRET+b4NV+pmZNSO']
セッションの暗号化に使用される openshift_master_encryption_secrets
の場合、シークレットの長さは AES-128、AES-192、または AES-256 を選択するできるようにそれぞれ 16、24、または 32 文字にする必要があります。
openshift_master_session_encryption_secrets=['DONT+USE+THIS+SECRET+b4NV+pmZNSO']
2.6.3.17. カスタム証明書の設定
OpenShift Container Platform API のパブリックホスト名と Web コンソールのカスタム提供証明書は、通常インストール (Advanced installation) 時にデプロイでき、インベントリーファイルで設定できます。
カスタム証明書は、publicMasterURL
に関連付けられたホスト名にのみ設定する必要があります。これは openshift_master_cluster_public_hostname
を使用して設定できます。masterURL
(openshift_master_cluster_hostname
) に関連付けられたホスト名のカスタム提供証明書を使用すると、インフラストラクチャーコンポーネントが内部の masterURL
ホストを使用してマスター API に接続しようとするので TLS エラーが生じます。
証明書とキーファイルのパスは、openshift_master_named_certificates
クラスター変数を使用して設定できます。
openshift_master_named_certificates=[{"certfile": "/path/to/custom1.crt", "keyfile": "/path/to/custom1.key", "cafile": "/path/to/custom-ca1.crt"}]
ファイルパスは、Ansible が実行されるシステムに対してローカルである必要があります。証明書はマスターホストにコピーされ、/etc/origin/master/named_certificates/ ディレクトリー内にデプロイされます。
Ansible は、証明書の Common Name
と Subject Alternative Names
を検出します。検出された名前は、openshift_master_named_certificates
の設定時に "names"
キーを指定して上書きできます。
openshift_master_named_certificates=[{"certfile": "/path/to/custom1.crt", "keyfile": "/path/to/custom1.key", "names": ["public-master-host.com"], "cafile": "/path/to/custom-ca1.crt"}]
openshift_master_named_certificates
を使用して設定される証明書はマスターにキャッシュされます。つまり、別の証明書セットで Ansible を実行するたびに、以前にデプロイされたすべての証明書がマスターホストとマスターの設定ファイル内に残ることになります。
openshift_master_named_certificates
を指定した値 (または値なし) で上書きする場合は、openshift_master_overwrite_named_certificates
クラスター変数を指定します。
openshift_master_overwrite_named_certificates=true
さらに詳細の例が必要な場合には、次のクラスター変数をインベントリーファイルに追加することを検討してください。
openshift_master_cluster_method=native openshift_master_cluster_hostname=lb-internal.openshift.com openshift_master_cluster_public_hostname=custom.openshift.com
後続の Ansible 実行で証明書を上書きするには、以下を設定できます。
openshift_master_named_certificates=[{"certfile": "/root/STAR.openshift.com.crt", "keyfile": "/root/STAR.openshift.com.key", "names": ["custom.openshift.com"]}] openshift_master_overwrite_named_certificates=true
2.6.3.18. 証明書の有効性の設定
デフォルトで、etcd、マスター、kubelet の管理に使用される証明書は 2 から 5 年で有効期限切れになります。自動生成されるレジストリー、CA、ノードおよびマスター証明書の有効性 (有効期限が切れるまでの日数) は、以下の変数 (デフォルト値が表示されています) を使用してインストール時に設定できます。
[OSEv3:vars] openshift_hosted_registry_cert_expire_days=730 openshift_ca_cert_expire_days=1825 openshift_node_cert_expire_days=730 openshift_master_cert_expire_days=730 etcd_ca_default_days=1825
これらの値は、 Ansible のインストール後での 証明書の再デプロイ時にも使用されます。
2.6.3.19. クラスターメトリクスの設定
クラスターメトリクスは、自動的にデプロイされるように設定されていません。通常インストール (Advanced installation) 方式を使用している場合にクラスターメトリクスを有効にするには、以下を設定します。
[OSEv3:vars] openshift_metrics_install_metrics=true
メトリクスのパブリック URL は、クラスターのインストール時に openshift_metrics_hawkular_hostname
Ansible 変数を使用して設定できます。デフォルト値は以下の通りです。
https://hawkular-metrics.{{openshift_master_default_subdomain}}/hawkular/metrics
この変数を変更する場合は、お使いのルーターからホスト名にアクセスできることを確認してください。
openshift_metrics_hawkular_hostname=hawkular-metrics.{{openshift_master_default_subdomain}}
アップストリームの Kubernetes ルールに応じて、eth0
のデフォルトインターフェースでのみメトリクスを収集できます。
メトリクスをデプロイするために openshift_master_default_subdomain
値を設定する必要があります。
2.6.3.19.1. メトリクスストレージの設定
メトリクスに永続ストレージを使用するには、openshift_metrics_cassandra_storage_type
変数を設定する必要があります。openshift_metrics_cassandra_storage_type
が設定されていない場合、クラスターのメトリクスデータは emptyDir
ボリュームに保存されます。このボリュームは、Cassandra Pod が終了すると削除されます。
通常インストール (Advanced installation) を使用している場合にクラスターメトリクスストレージを有効にするには、次の 3 つのオプションを選択できます。
オプション A: 動的
OpenShift Container Platform 環境がクラウドプロバイダーの動的ボリュームプロビジョニングをサポートする場合、以下の変数を使用します。
[OSEv3:vars] openshift_metrics_cassandra_storage_type=dynamic
gluster-storage および glusterfs-storage-block などのデフォルトで動的にプロビジョニングされたボリュームタイプが複数ある場合、変数でプロビジョニングされたボリュームタイプを指定できます。たとえば、openshift_metrics_cassandra_pvc_storage_class_name=glusterfs-storage-block
のようになります。
動的プロビジョニングを有効または無効にするために DynamicProvisioningEnabled
を使用する方法についての詳細は、「ボリュームの設定」を参照してください。
オプション B: NFS ホストグループ
メトリクスストレージに NFS を使用することは、OpenShift Container Platform では推奨されていません。
次の変数が設定されている場合、NFS ボリュームは通常インストール (Advanced installation) 時に [nfs]
ホストグループ内のホストのパス <nfs_directory>/<volume_name> に作成されます。たとえば、以下のオプションを使用した場合、ボリュームパスは /exports/metrics になります。
[OSEv3:vars] openshift_metrics_storage_kind=nfs openshift_metrics_storage_access_modes=['ReadWriteOnce'] openshift_metrics_storage_nfs_directory=/exports openshift_metrics_storage_nfs_options='*(rw,root_squash)' openshift_metrics_storage_volume_name=metrics openshift_metrics_storage_volume_size=10Gi
オプション C: 外部 NFS ホスト
メトリクスストレージに NFS を使用することは、OpenShift Container Platform では推奨されていません。
外部 NFS ボリュームを使用するには、該当する NFS ボリュームがストレージホストの <nfs_directory>/<volume_name> パスにすでに存在している必要があります。
[OSEv3:vars] openshift_metrics_storage_kind=nfs openshift_metrics_storage_access_modes=['ReadWriteOnce'] openshift_metrics_storage_host=nfs.example.com openshift_metrics_storage_nfs_directory=/exports openshift_metrics_storage_volume_name=metrics openshift_metrics_storage_volume_size=10Gi
以下のオプションを使用した場合、リモートボリュームのパスは nfs.example.com:/exports/metrics になります。
NFS を使用した OpenShift Container Platform のアップグレードまたはインストール
Red Hat のテスト時に、NFS (RHEL 上) をレジストリーのストレージバックエンドとして使用する場合の問題が確認されました。そのため、(RHEL 上で) NFS をレジストリーのストレージバックエンドとして使用することは推奨していません。
市場で提供されている他の NFS の実装には Red Hat のテスト時に確認された問題がない可能性があります。実施された可能性のあるテストに関する詳細情報は、個別の NFS 実装ベンダーにお問い合わせください。
2.6.3.20. クラスターロギングの設定
クラスターロギングは、デフォルトでは自動的にデプロイされるように設定されていません。通常インストール (Advanced installation) 方式を使用している場合にクラスターロギングを有効にするには、以下を設定します。
[OSEv3:vars] openshift_logging_install_logging=true
2.6.3.20.1. ロギングストレージの設定
ロギングに永続ストレージを使用するには、openshift_logging_es_pvc_dynamic
変数を設定する必要があります。openshift_logging_es_pvc_dynamic
が設定されていない場合、クラスターのロギングデータは emptyDir
ボリュームに保存されます。このボリュームは、Elasticsearch Pod が終了すると削除されます。
通常インストール (Advanced installation) を使用している場合にクラスターロギングストレージを有効にするには、以下の 3 つのオプションを選択できます。
オプション A: 動的
OpenShift Container Platform 環境がクラウドプロバイダーの動的ボリュームプロビジョニングをサポートする場合、以下の変数を使用します。
[OSEv3:vars] openshift_logging_es_pvc_dynamic=true
gluster-storage および glusterfs-storage-block などのデフォルトで動的にプロビジョニングされたボリュームタイプが複数ある場合、変数でプロビジョニングされたボリュームタイプを指定できます。たとえば、openshift_logging_es_pvc_storage_class_name=glusterfs-storage-block
のようになります。
動的プロビジョニングを有効または無効にするために DynamicProvisioningEnabled
を使用する方法についての詳細は、「ボリュームの設定」を参照してください。
オプション B: NFS ホストグループ
ロギングストレージに NFS を使用することは、OpenShift Container Platform では推奨されていません。
以下の変数が設定されている場合、通常インストール (Advanced installation) 時に [nfs]
ホストグループ内のホストのパス <nfs_directory>/<volume_name> に NFS ボリュームが作成されます。たとえば、以下のオプションを使用した場合、ボリュームパスは /exports/logging になります。
[OSEv3:vars] openshift_logging_storage_kind=nfs openshift_logging_storage_access_modes=['ReadWriteOnce'] openshift_logging_storage_nfs_directory=/exports openshift_logging_storage_nfs_options='*(rw,root_squash)' openshift_logging_storage_volume_name=logging openshift_logging_storage_volume_size=10Gi
オプション C: 外部 NFS ホスト
ロギングストレージに NFS を使用することは、OpenShift Container Platform では推奨されていません。
外部 NFS ボリュームを使用するには、該当する NFS ボリュームがストレージホストの <nfs_directory>/<volume_name> パスにすでに存在している必要があります。
[OSEv3:vars] openshift_logging_storage_kind=nfs openshift_logging_storage_access_modes=['ReadWriteOnce'] openshift_logging_storage_host=nfs.example.com openshift_logging_storage_nfs_directory=/exports openshift_logging_storage_volume_name=logging openshift_logging_storage_volume_size=10Gi
以下のオプションを使用した場合、リモートボリュームのパスは nfs.example.com:/exports/logging になります。
NFS を使用した OpenShift Container Platform のアップグレードまたはインストール
Red Hat のテスト時に、NFS (RHEL 上) をレジストリーのストレージバックエンドとして使用する場合の問題が確認されました。そのため、(RHEL 上で) NFS をレジストリーのストレージバックエンドとして使用することは推奨していません。
市場で提供されている他の NFS の実装には Red Hat のテスト時に確認された問題がない可能性があります。実施された可能性のあるテストに関する詳細情報は、個別の NFS 実装ベンダーにお問い合わせください。
2.6.3.21. サービスカタログオプションのカスタマイズ
サービスカタログはインストール時にデフォルトで有効にされます。サービスブローカーを有効にすると、サービスブローカーをカタログで登録できます。サービスカタログが有効にされると、OpenShift Ansible Broker およびテンプレートサービスブローカーが共にインストールされます。詳細は、「OpenShift Ansible Broker の設定」および「テンプレートサービスブローカーの設定」を参照してください。サービスカタログを無効にする場合は、OpenShift Ansible Broker およびテンプレートサービスブローカーはインストールされません。
サービスカタログの自動デプロイメントを無効にするには、以下のクラスター変数をインベントリーファイルに設定します。
openshift_enable_service_catalog=false
独自のレジストリーを使用する場合、以下を追加する必要があります。
-
openshift_service_catalog_image_prefix
: サービスカタログイメージをプルする際に、特定のプレフィックス (例:registry
) の使用を強制的に実行します。(イメージ名までの) 詳細なレジストリー名を指定する必要があります。 -
openshift_service_catalog_image_version
: サービスカタログイメージをプルする際に、特定のイメージバージョンの使用を強制的に実行します。
例を以下に示します。
openshift_service_catalog_image="docker-registry.default.example.com/openshift/ose-service-catalog:${version}" openshift_service_catalog_image_prefix="docker-registry-default.example.com/openshift/ose-" openshift_service_catalog_image_version="v3.9.30" template_service_broker_selector={"role":"infra"}
サービスカタログを有効にすると、OpenShift Ansible Broker とテンプレートサービスブローカーも有効になります。詳細については、「OpenShift Ansible Broker の設定」および「テンプレートサービスブローカーの設定 」を参照してください。
2.6.3.21.1. OpenShift Ansible Broker の設定
OpenShift Ansible Broker (OAB) は、インストール時にデフォルトで有効になります。
OAB をインストールしない場合は、インベントリーファイルで ansible_service_broker_install
パラメーター値を false
に設定します。
ansible_service_broker_install=false
2.6.3.21.1.1. OpenShift Ansible Broker 用の永続ストレージの設定
OAB は、残りの OpenShift Container Platform クラスターが使用する etcd とは別に独自の etcd インスタンスをデプロイします。OAB の etcd インスタンスが機能するためには、永続ボリューム (PV) を使用する個別のストレージが必要です。使用可能な PV がない場合、etcd は PV の条件が満たされるまで待機します。OAB アプリケーションは、etcd インスタンスが使用可能になるまで CrashLoop
状態になります。
以下の変数でインストーラーを使用し、NFS を使用する OAB の永続ストレージを設定できます。
変数 | 目的 |
---|---|
|
etcd PV に使用するストレージタイプ。 |
|
etcd PV の名前。 |
|
デフォルトで |
|
etcd PV のサイズ。デフォルトで |
|
etcd PV に使用するラベル。デフォルトで |
|
使用する NFS オプション。デフォルトで |
|
NFS エクスポートのディレクトリー。デフォルトで |
一部の Ansible Playbook Bundle (APB) でも、デプロイに専用の PV が必要になります。たとえば、APB の各データベースには 2 つのプランがあります。開発プランは一時的なストレージを使用し、PV を必要としませんが、実稼働プランは永続的であり、PV を必要とします。
APB | PV が必要? |
---|---|
postgresql-apb |
必要 (ただし実稼働プランの場合のみ必要) |
mysql-apb |
必要 (ただし実稼働プランの場合のみ必要) |
mariadb-apb |
必要 (ただし実稼働プランの場合のみ必要) |
mediawiki-apb |
Yes |
OAB の永続ストレージを設定するには、以下の手順を実行します。
インベントリーファイルの
[OSEv3:children]
セクションにnfs
を追加して、[nfs]
グループを有効にします。[OSEv3:children] masters nodes nfs
[nfs]
グループセクションを追加し、NFS ホストになるシステムのホスト名を追加します。[nfs] master1.example.com
[OSEv3:vars]
セクションに以下を追加します。openshift_hosted_etcd_storage_kind=nfs openshift_hosted_etcd_storage_nfs_options="*(rw,root_squash,sync,no_wdelay)" openshift_hosted_etcd_storage_nfs_directory=/opt/osev3-etcd 1 openshift_hosted_etcd_storage_volume_name=etcd-vol2 2 openshift_hosted_etcd_storage_access_modes=["ReadWriteOnce"] openshift_hosted_etcd_storage_volume_size=1G openshift_hosted_etcd_storage_labels={'storage': 'etcd'}
これらの設定は、クラスターのインストール時に OAB の etcd インスタンスに割り当てられる永続ボリュームを作成します。
2.6.3.21.1.2. ローカルの APB 開発用の OpenShift Ansible ブローカーの設定
OpenShift Container レジストリーと OAB を組み合わせて APB 開発 を行うには、OAB がアクセスできるイメージのホワイトリストを定義する必要があります。ホワイトリストが定義されていない場合、ブローカーは APB を無視し、使用可能な APB がユーザーに表示されません。
デフォルトでは、ホワイトリストは空になっており、クラスター管理者がブローカーを設定するまでユーザーが APB イメージをブローカーに追加できないようになっています。-apb
で終了するすべてのイメージをホワイトリスト化するには、以下の手順を実行します。
インベントリーファイルの
[OSEv3:vars]
セクションに以下を追加します。ansible_service_broker_local_registry_whitelist=['.*-apb$']
2.6.3.21.2. テンプレートサービスブローカーの設定
テンプレートサービスブローカー (TSB) は、インストール時にデフォルトで有効になります。
TSB をインストールしない場合は、template_service_broker_install
パラメーターの値を false
に設定します。
template_service_broker_install=false
TSB を設定するには、テンプレートとイメージストリームをサービスカタログに読み込めるように 1 つ以上のプロジェクトをブローカーのソースの namespace として定義する必要があります。インベントリーファイルの [OSEv3:vars]
セクションの以下の箇所を変更して、必要なプロジェクトを設定します。
openshift_template_service_broker_namespaces=['openshift','myproject']
デフォルトでは、TSB は Pod のデプロイにノードセレクター {"region": "infra"}
を使用します。インベントリーファイルの [OSEv3:vars]
セクションに必要なノードセレクターを設定してこれを変更できます。
template_service_broker_selector={"region": "infra"}
2.6.3.22. Web コンソールのカスタマイズの設定
以下の Ansible 変数は、Web コンソールをカスタマイズするためのマスター設定オプションを設定します。これらのカスタマイズオプションの詳細については、「Web コンソールのカスタマイズ」を参照してください。
変数 | 目的 |
---|---|
|
Web コンソールをインストールするかどうかを決定します。 |
|
コンポーネントイメージのプレフィックス。たとえば、 |
|
コンポーネントイメージのバージョン。たとえば、 |
|
Web コンソールの設定で |
|
Web コンソールの設定で |
|
Web コンソール設定で |
|
マスター設定で OAuth テンプレートを設定します。詳細については、「ログインページのカスタマイズ」を参照してください。値の例: |
|
マスター設定で |
|
マスター設定で |
|
アクティブでない状態が一定期間続いた後にユーザーを自動的にログアウトするように Web コンソールを設定します。5 以上の整数を指定する必要があります。この機能を無効にする場合は 0 を指定します。デフォルトは 0 (無効) です。 |
|
クラスターがオーバーコミット対応に設定されているかどうかを示すブール値。 |
2.6.4. インベントリーファイルの例
2.6.4.1. 単一マスターの例
単一マスターと複数ノード、単一または複数の外部 etcd ホストを含む環境を設定できます。
インストール後の単一マスタークラスターから複数マスターへの移行はサポートされていません。
単一マスター、単一 etcd および複数ノード
以下の表は、単一マスター (同じホストに単一 etcd がある)、ユーザーアプリケーションをホストする 2 つのノード、専用インフラストラクチャーをホストする region=infra
ラベル付きの 2 つのノードの環境の例を示しています。
ホスト名 | インストールするインフラストラクチャーコンポーネント |
---|---|
master.example.com |
マスター、etcd、ノード |
node1.example.com |
ノード |
node2.example.com | |
infra-node1.example.com |
ノード ( |
infra-node2.example.com |
これらのサンプルホストは、以下のサンプルインベントリーファイルの [masters]、[etcd]、および [nodes] セクションに記載されています。
単一マスター、単一 etcd、および複数ノードのインベントリーファイル
# Create an OSEv3 group that contains the masters, nodes, and etcd groups [OSEv3:children] masters nodes etcd # Set variables common for all OSEv3 hosts [OSEv3:vars] # SSH user, this user should allow ssh based auth without requiring a password ansible_ssh_user=root # If ansible_ssh_user is not root, ansible_become must be set to true #ansible_become=true openshift_deployment_type=openshift-enterprise oreg_url=example.com/openshift3/ose-${component}:${version} openshift_examples_modify_imagestreams=true # uncomment the following to enable htpasswd authentication; defaults to DenyAllPasswordIdentityProvider #openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}] # host group for masters [masters] master.example.com # host group for etcd [etcd] master.example.com # host group for nodes, includes region info [nodes] master.example.com node1.example.com openshift_node_labels="{'region': 'primary', 'zone': 'east'}" node2.example.com openshift_node_labels="{'region': 'primary', 'zone': 'west'}" infra-node1.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}" infra-node2.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}"
「ノードホストラベルの設定」を参照し、OpenShift Container Platform 3.9 以降のデフォルトノードセレクター要件とノードラベルに関する考慮事項を確認してください。
この例を使用するには、お使いの環境と仕様に合わせてファイルを変更し、これを /etc/ansible/hosts として保存します。
単一マスター、複数 etcd、および複数ノード
以下の表は、単一マスター、3 つの etcd ホスト、ユーザーアプリケーションをホストする 2 つのノード、専用インフラストラクチャーをホストする region=infra
ラベル付きの 2 つのノードの環境の例を示しています。
ホスト名 | インストールするインフラストラクチャーコンポーネント |
---|---|
master.example.com |
マスターおよびノード |
etcd1.example.com |
etcd |
etcd2.example.com | |
etcd3.example.com | |
node1.example.com |
ノード |
node2.example.com | |
infra-node1.example.com |
ノード ( |
infra-node2.example.com |
これらのサンプルホストは、以下のサンプルインベントリーファイルの [masters]、[nodes]、および [etcd] セクションに記載されています。
単一マスター、複数 etcd、および複数ノードのインベントリーファイル
# Create an OSEv3 group that contains the masters, nodes, and etcd groups [OSEv3:children] masters nodes etcd # Set variables common for all OSEv3 hosts [OSEv3:vars] ansible_ssh_user=root openshift_deployment_type=openshift-enterprise oreg_url=example.com/openshift3/ose-${component}:${version} openshift_examples_modify_imagestreams=true # uncomment the following to enable htpasswd authentication; defaults to DenyAllPasswordIdentityProvider #openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}] # host group for masters [masters] master.example.com # host group for etcd [etcd] etcd1.example.com etcd2.example.com etcd3.example.com # host group for nodes, includes region info [nodes] master.example.com node1.example.com openshift_node_labels="{'region': 'primary', 'zone': 'east'}" node2.example.com openshift_node_labels="{'region': 'primary', 'zone': 'west'}" infra-node1.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}" infra-node2.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}"
「ノードホストラベルの設定」を参照し、OpenShift Container Platform 3.9 以降のデフォルトノードセレクター要件とノードラベルに関する考慮事項を確認してください。
この例を使用するには、お使いの環境と仕様に合わせてファイルを変更し、これを /etc/ansible/hosts として保存します。
2.6.4.2. 複数マスターの例
複数マスター、複数 etcd ホスト、複数ノードを含む環境を設定できます。高可用性 (HA) 対応複数マスターを設定すると、クラスターに単一障害点が設定されないようにすることができます。
インストール後の単一マスタークラスターから複数マスターへの移行はサポートされていません。
複数マスターを設定する際には、通常インストール (Advanced installation) でネイティブ
高可用性 (HA) 方法がサポートされます。この方法は、OpenShift Container Platform に組み込まれているネイティブ HA マスター機能を活用するもので、 任意のロードバランシングソリューションと組み合わせことができます。
ホストがインベントリーファイルの [lb] セクションに定義されている場合、Ansible はロードバランシングソリューションとして HAProxy を自動的にインストールし、設定します。ホストが定義されていない場合、ユーザーが選択した外部のロードバランシングソリューションを事前に定義しており、マスター API (ポート 8443) をすべてのマスターホストで分散することが想定されます。
この HAProxy ロードバランサーは、API サーバーの HA モードを実証することを意図したものであり、実稼働環境での使用には推奨されません。クラウドプロバイダーにデプロイする場合は、クラウドネイティブの TCP ベースのロードバランサーをデプロイするか、または高可用性ロードバランサーを提供するための他の手順を実行することを推奨します。
外部のロードバランシングソリューションを使用する場合は、以下が必要になります。
- SSL パススルー対応に設定された、事前に作成されたロードバランサーの仮想 IP (VIP)
-
openshift_master_api_port
値 (デフォルトは 8443) で指定されたポートでリッスンし、そのポートですべてのマスターホストにプロキシー送信する VIP。 DNS に登録されている VIP のドメイン名。
-
このドメイン名は、OpenShift Container Platform インストーラーで
openshift_master_cluster_public_hostname
とopenshift_master_cluster_hostname
の両方の値になります。
-
このドメイン名は、OpenShift Container Platform インストーラーで
詳細については、「External Load Balancer Integrations example in Github」を参照してください。高可用性マスターアーキテクチャーの詳細については、 「 Kubernetes Infrastructure」を参照してください。
現時点で、通常インストール (Advanced installation) 方式はアクティブ/パッシブ設定の複数の HAProxy ロードバランサーをサポートしていません。インストール後の修正については、ロードバランサー管理ドキュメントを参照してください。
複数マスターを設定するには、「複数 etcd を持つ複数マスター」を参照してください。
外部のクラスター化された etcd を含む、ネイティブ HA を使用した複数マスター
以下の表は、 ネイティブ
HA 方法を使用する 3 つのマスター、1 つの HAProxy ロードバランサー、3 つの etcd ホスト、ユーザーアプリケーションをホストする 2 つのノード、専用インフラストラクチャーをホストする region=infra
ラベル付きの 2 つのノードの環境の例を示しています。
ホスト名 | インストールするインフラストラクチャーコンポーネント |
---|---|
master1.example.com |
マスター (クラスター化、ネイティブ HA を使用) およびノード |
master2.example.com | |
master3.example.com | |
lb.example.com |
API マスターエンドポイントの負荷分散を行う HAProxy |
etcd1.example.com |
etcd |
etcd2.example.com | |
etcd3.example.com | |
node1.example.com |
ノード |
node2.example.com | |
infra-node1.example.com |
ノード ( |
infra-node2.example.com |
これらのサンプルホストは、以下のサンプルインベントリーファイルの [masters]、[etcd]、[lb] および [nodes] セクションに記載されています。
HAProxy インベントリーファイルを使用する複数マスター
# Create an OSEv3 group that contains the master, nodes, etcd, and lb groups. # The lb group lets Ansible configure HAProxy as the load balancing solution. # Comment lb out if your load balancer is pre-configured. [OSEv3:children] masters nodes etcd lb # Set variables common for all OSEv3 hosts [OSEv3:vars] ansible_ssh_user=root openshift_deployment_type=openshift-enterprise oreg_url=example.com/openshift3/ose-${component}:${version} openshift_examples_modify_imagestreams=true # Uncomment the following to enable htpasswd authentication; defaults to # DenyAllPasswordIdentityProvider. #openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}] # Native high availbility cluster method with optional load balancer. # If no lb group is defined installer assumes that a load balancer has # been preconfigured. For installation the value of # openshift_master_cluster_hostname must resolve to the load balancer # or to one or all of the masters defined in the inventory if no load # balancer is present. openshift_master_cluster_method=native openshift_master_cluster_hostname=openshift-internal.example.com openshift_master_cluster_public_hostname=openshift-cluster.example.com # apply updated node defaults openshift_node_kubelet_args={'pods-per-core': ['10'], 'max-pods': ['250'], 'image-gc-high-threshold': ['90'], 'image-gc-low-threshold': ['80']} # enable ntp on masters to ensure proper failover openshift_clock_enabled=true # host group for masters [masters] master1.example.com master2.example.com master3.example.com # host group for etcd [etcd] etcd1.example.com etcd2.example.com etcd3.example.com # Specify load balancer host [lb] lb.example.com # host group for nodes, includes region info [nodes] master[1:3].example.com node1.example.com openshift_node_labels="{'region': 'primary', 'zone': 'east'}" node2.example.com openshift_node_labels="{'region': 'primary', 'zone': 'west'}" infra-node1.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}" infra-node2.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}"
「ノードホストラベルの設定」を参照し、OpenShift Container Platform 3.9 以降のデフォルトノードセレクター要件とノードラベルに関する考慮事項を確認してください。
この例を使用するには、お使いの環境と仕様に合わせてファイルを変更し、これを /etc/ansible/hosts として保存します。
同一の場所に配置されたクラスター化された etcd を含む、ネイティブ HA を使用した複数マスター
以下の表は、ネイティブ
HA 方法を使用する 3 つのマスター (各ホストに etcd がある)、1 つの HAProxy ロードバランサー、ユーザーアプリケーションをホストする 2 つのノード、専用インフラストラクチャーをホストする region=infra
ラベル付きの 2 つのノードの環境の例を示しています。
ホスト名 | インストールするインフラストラクチャーコンポーネント |
---|---|
master1.example.com |
各ホストに etcd があるマスター (ネイティブ HA を使用するクラスター化) とノード |
master2.example.com | |
master3.example.com | |
lb.example.com |
API マスターエンドポイントの負荷分散を行う HAProxy |
node1.example.com |
ノード |
node2.example.com | |
infra-node1.example.com |
ノード ( |
infra-node2.example.com |
これらのサンプルホストは、以下のサンプルインベントリーファイルの [masters]、[etcd]、[lb] および [nodes] セクションに記載されています。
# Create an OSEv3 group that contains the master, nodes, etcd, and lb groups. # The lb group lets Ansible configure HAProxy as the load balancing solution. # Comment lb out if your load balancer is pre-configured. [OSEv3:children] masters nodes etcd lb # Set variables common for all OSEv3 hosts [OSEv3:vars] ansible_ssh_user=root openshift_deployment_type=openshift-enterprise oreg_url=example.com/openshift3/ose-${component}:${version} openshift_examples_modify_imagestreams=true # Uncomment the following to enable htpasswd authentication; defaults to # DenyAllPasswordIdentityProvider. #openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}] # Native high availability cluster method with optional load balancer. # If no lb group is defined installer assumes that a load balancer has # been preconfigured. For installation the value of # openshift_master_cluster_hostname must resolve to the load balancer # or to one or all of the masters defined in the inventory if no load # balancer is present. openshift_master_cluster_method=native openshift_master_cluster_hostname=openshift-internal.example.com openshift_master_cluster_public_hostname=openshift-cluster.example.com # host group for masters [masters] master1.example.com master2.example.com master3.example.com # host group for etcd [etcd] master1.example.com master2.example.com master3.example.com # Specify load balancer host [lb] lb.example.com # host group for nodes, includes region info [nodes] master[1:3].example.com node1.example.com openshift_node_labels="{'region': 'primary', 'zone': 'east'}" node2.example.com openshift_node_labels="{'region': 'primary', 'zone': 'west'}" infra-node1.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}" infra-node2.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}"
「ノードホストラベルの設定」を参照し、OpenShift Container Platform 3.9 以降のデフォルトノードセレクター要件とノードラベルに関する考慮事項を確認してください。
この例を使用するには、お使いの環境と仕様に合わせてファイルを変更し、これを /etc/ansible/hosts として保存します。
2.6.5. 通常インストール (Advanced installation) の実行
/etc/ansible/hosts でインベントリーファイルを定義して Ansible の設定を完了した後に、通常インストール (Advanced installation) Playbook を Ansible を使用して実行します。
インストーラーはモジュール化された Playbook を使用します。そのため、管理者は必要に応じて特定のコンポーネントをインストールできます。ロールと Playbook を分けることで、アドホックな管理タスクをより適切にターゲット設定できます。その結果、インストール時の制御レベルが強化され、時間の節約が可能になります。
Playbook とその順序については、以下の「個別コンポーネント Playbook の実行」で詳しく説明しています。
既知の問題により、インストールの実行後、NFS ボリュームがいずれかのコンポーネント用にプロビジョニングされている場合、それらのコンポーネントが NFS ボリュームにデプロイされるかどうかにかかわらず、以下のディレクトリーが作成される可能性があります。
- /exports/logging-es
- /exports/logging-es-ops/
- /exports/metrics/
- /exports/prometheus
- /exports/prometheus-alertbuffer/
- /exports/prometheus-alertmanager/
インストール後にこれらのディレクトリーを随時削除することができます。
2.6.5.1. RPM ベースのインストーラーの実行
RPM ベースのインストーラーは、RPM パッケージでインストールされた Ansible を使用し、ローカルホストで使用可能な Playbook と設定ファイルを実行します。
OpenShift Ansible Playbook は nohup
で実行しないでください。Playbook で nohup
を使用すると、ファイル記述子が作成され、ファイルが閉じなくなります。その結果、システムでファイルをさらに開けなくなり、Playbook が失敗します。
RPM ベースのインストーラーを実行するには、以下の手順を実行します。
prerequisites.yml Playbook を実行します。この Playbook にはソフトウェアパッケージが必要であり (ある場合)、コンテナーランタイムを変更します。コンテナーランタイムを設定する必要がない限り、この Playbook はクラスターの初回のデプロイ前に 1 度のみ実行します。
# ansible-playbook [-i /path/to/inventory] \ 1 /usr/share/ansible/openshift-ansible/playbooks/prerequisites.yml
- 1
- インベントリーファイルが /etc/ansible/hosts ディレクトリーにない場合、
-i
およびインベントリーファイルのパスを指定します。
deploy_cluster.yml Playbook を実行してクラスターインストールを開始します。
# ansible-playbook [-i /path/to/inventory] \ /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
何らかの理由でインストールが失敗した場合は、インストーラーを再実行する前に「既知の問題」に目を通し、特定の指示や回避策がないかどうか確認してください。
インストーラーは、デフォルトで 10 分間 Playbook の設定値をキャッシュします。システム、ネットワーク、またはインベントリー設定を変更してから 10 分以内にインストーラーを再実行する場合、新規の値は使用されず、代わりに以前の値が使用されます。キャッシュのコンテンツは削除できます。これは、/etc/ansible/ansible.cfg ファイルの fact_caching_connection
の値で定義されます。このファイルのサンプルは、「Recommended Installation Practices」で説明されています。
2.6.5.2. コンテナー化インストーラーの実行
openshift3/ose-ansible イメージは、 OpenShift Container Platform インストーラーのコンテナー化バージョンです。このインストーラーイメージは、RPM ベースのインストーラーと同じ機能を提供しますが、ホストに直接インストールされるのではなく、そのすべての依存関係を提供するコンテナー化環境で実行されます。この使用にあたっての唯一の要件は、コンテナーを実行できることになります。
2.6.5.2.1. インストーラーをシステムコンテナーとして実行する
インストーラーイメージは、システムコンテナーとして使用できます。システムコンテナーは、従来の docker サービスの外部に保存して実行できます。これにより、ホストでのインストールによって docker が再起動されることを心配することなく、ターゲットホストのいずれかからインストーラーイメージを実行することが可能になります。
Atomic CLI を使用してインストーラーを 1 回だけ実行されるシステムコンテナーとして実行するには、以下の手順を root ユーザーとして実行します。
prerequisites.yml Playbook を実行します。
# atomic install --system \ --storage=ostree \ --set INVENTORY_FILE=/path/to/inventory \ 1 --set PLAYBOOK_FILE=/usr/share/ansible/openshift-ansible/playbooks/prerequisites.yml \ --set OPTS="-v" \ registry.access.redhat.com/openshift3/ose-ansible:v3.9
- 1
- ローカルホスト上にインベントリーファイルの場所を指定します。
このコマンドは、指定されるインベントリーファイルと
root
ユーザーの SSH 設定を使用して一連の前提条件タスクを実行します。deploy_cluster.yml Playbook を実行します。
# atomic install --system \ --storage=ostree \ --set INVENTORY_FILE=/path/to/inventory \ 1 --set PLAYBOOK_FILE=/usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml \ --set OPTS="-v" \ registry.access.redhat.com/openshift3/ose-ansible:v3.9
- 1
- ローカルホスト上にインベントリーファイルの場所を指定します。
このコマンドは、指定されるインベントリーファイルと
root
ユーザーの SSH 設定を使用してクラスターインストールを開始します。出力のログを端末に記録し、さらに /var/log/ansible.log ファイルに保存します。このコマンドの初回実行時に、イメージは OSTree ストレージ (システムコンテナーは docker デーモンストレージではなくこのストレージを使用します) にインポートされます。後続の実行では、保存されたイメージが再利用されます。何らかの理由でインストールが失敗した場合は、インストーラーを再実行する前に「既知の問題」に目を通し、特定の指示や回避策がないかどうか確認してください。
2.6.5.2.2. その他の Playbook の実行
PLAYBOOK_FILE
環境変数を使用すると、コンテナー化インストーラーで実行するその他の Playbook を指定できます。 PLAYBOOK_FILE
のデフォルト値は、メインのクラスターインストール Playbook である /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml ですが、これをコンテナー内の別の Playbook のパスに設定できます。
たとえば、インストールの前にプレインストールチェック Playbook を実行するには、以下のコマンドを使用します。
# atomic install --system \ --storage=ostree \ --set INVENTORY_FILE=/path/to/inventory \ --set PLAYBOOK_FILE=/usr/share/ansible/openshift-ansible/playbooks/openshift-checks/pre-install.yml \ 1 --set OPTS="-v" \ 2 registry.access.redhat.com/openshift3/ose-ansible:v3.9
2.6.5.2.3. インストーラーを Docker コンテナーとして実行する
インストーラーイメージは、docker が実行できる任意の場所で docker コンテナーとして実行することもできます。
この方法は、設定されているホストのいずれかでインストーラーを実行するために使用しないでください。インストールによってホストで docker が再起動され、インストーラーコンテナーの実行が中断する可能性があります。
この方法と上記のシステムコンテナー方法は同じイメージを使用しますが、それぞれ異なるエントリーポイントとコンテキストで実行されます。そのため、ランタイムパラメーターは同じではありません。
インストーラーを docker コンテナーとして実行する場合は、少なくとも以下を指定する必要があります。
- SSH キー (Ansible がホストにアクセスできるようにするため)。
- Ansible インベントリーファイル。
- そのインベントリーに対して実行する Ansible Playbook の場所。
次に、docker
経由でインストールを実行する方法の例を示します。これは、docker
へのアクセス権限を持つ非 root ユーザーとして実行する必要があります。
まず、prerequisites.yml Playbook を実行します。
$ docker run -t -u `id -u` \ 1 -v $HOME/.ssh/id_rsa:/opt/app-root/src/.ssh/id_rsa:Z \ 2 -v $HOME/ansible/hosts:/tmp/inventory:Z \ 3 -e INVENTORY_FILE=/tmp/inventory \ 4 -e PLAYBOOK_FILE=playbooks/prerequisites.yml \ 5 -e OPTS="-v" \ 6 registry.access.redhat.com/openshift3/ose-ansible:v3.9
- 1
-u `id -u`
は、コンテナーが現在のユーザーと同じ UID で実行されるようにします。これにより、そのユーザーがコンテナー内の SSH キーを使用できるようになります (SSH プライベートキーは所有者のみが判読できることが予想されます)。- 2
-v $HOME/.ssh/id_rsa:/opt/app-root/src/.ssh/id_rsa:Z
は、SSH キー ($HOME/.ssh/id_rsa
) をコンテナーユーザーの$HOME/.ssh
(/opt/app-root/src はコンテナー内のユーザーの$HOME
です) にマウントします。SSH キーを標準以外の場所にマウントする場合は、-e ANSIBLE_PRIVATE_KEY_FILE=/the/mount/point
で環境変数を追加するか、インベントリーでansible_ssh_private_key_file=/the/mount/point
を変数として設定し、Ansible がこれを参照するようにします。SSH キーは:Z
フラグでマウントされることに注意してください。これは、コンテナーがその制限された SELinux コンテキストで SSH キーを読み取れるようにするために必要です。これはまた、元の SSH キーファイルのラベルがsystem_u:object_r:container_file_t:s0:c113,c247
のようなラベルに変更されることも意味しています。:Z
の詳細については、docker-run(1)
の man ページを参照してください。これらの点は、このようなボリュームマウント仕様を提供する際に留意してください。これによって予期しない結果が生じる可能性があります。たとえば、$HOME/.ssh
ディレクトリー全体をマウントすると (したがってラベルを変更すると)、ホストの sshd がログイン時にパブリックキーにアクセスできなくなります。このため、元のファイルラベルを変更しなくてもすむように SSH キー (またはディレクトリー) の別のコピーを使用することをお勧めします。- 3 4
-v $HOME/ansible/hosts:/tmp/inventory:Z
と-e INVENTORY_FILE=/tmp/inventory
は、静的 Ansible インベントリーファイルを /tmp/inventory としてコンテナーにマウントし、これを参照する対応する環境変数を設定します。SSH キーと同様に、既存のラベルによっては、コンテナー内を読み取れるように、:Z
フラグを使用してインベントリーファイルの SELinux ラベルを変更しなければならない場合があります (ユーザーの$HOME
ディレクトリー内のファイルの場合、通常はラベルの変更が必要になります)。そのため、この場合もまた、マウント前にインベントリーを専用の場所にコピーすることをお勧めします。インベントリーファイルは、INVENTORY_URL
環境変数を指定した場合には、Web サーバーからダウンロードすることもできます。またはDYNAMIC_SCRIPT_URL
を使用して、動的なインベントリーを提供する実行可能スクリプトを指定することにより動的に生成することもできます。- 5
-e PLAYBOOK_FILE=playbooks/prerequisites.yml
は、実行する Playbook (この例では前提条件 Playbook) を、openshift-ansible コンテンツの最上位レベルのディレクトリーの相対パスとして指定します。RPM からのフルパスやコンテナー内のその他の Playbook へのパスも使用できます。- 6
-e OPTS="-v"
は、コンテナー内で実行されるansible-playbook
コマンドに任意のコマンドラインオプションを提供します (この例では、-v
を使用して省サイドを上げることができます)。
次に、deploy_cluster.yml playbook を実行してクラスターインストールを開始します。
$ docker run -t -u `id -u` \ -v $HOME/.ssh/id_rsa:/opt/app-root/src/.ssh/id_rsa:Z \ -v $HOME/ansible/hosts:/tmp/inventory:Z \ -e INVENTORY_FILE=/tmp/inventory \ -e PLAYBOOK_FILE=playbooks/deploy_cluster.yml \ -e OPTS="-v" \ registry.access.redhat.com/openshift3/ose-ansible:v3.9
2.6.5.2.4. OpenStack インストール Playbook の実行
OpenStack インストール Playbook はテクノロジープレビュー機能です。テクノロジープレビュー機能は Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。これらの機能は、近々発表予定の製品機能をリリースに先駆けてご提供することにより、お客様は機能性をテストし、開発プロセス中にフィードバックをお寄せいただくことができます。
Red Hat のテクノロジープレビュー機能のサポートについての詳細は、https://access.redhat.com/support/offerings/techpreview/ を参照してください。
OpenShift Container Platform を既存の OpenStack インストールにインストールするには、OpenStack Playbook を使用します。詳細の前提条件を含む Playbook についての詳細は、OpenStack Provisioning readme ファイルを参照してください。
Playbook を実行するには、以下のコマンドを実行します。
$ ansible-playbook --user openshift \ -i openshift-ansible/playbooks/openstack/inventory.py \ -i inventory \ openshift-ansible/playbooks/openstack/openshift-cluster/provision_install.yml
2.6.5.3. 個別コンポーネント playbook の実行
メインのインストール Playbook である /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.ymlは、一連の個別コンポーネント Playbook を特定の順序で実行します。実行の最後に、インストーラーから完了したフェーズが報告されます。インストールが失敗した場合は、そのフェーズが失敗したかについて Ansible の実行エラーと共に画面に表示されます。
エラーを解決した後に、インストールを継続できます。
- 残りのそれぞれのインストール Playbook を実行できます。
- 新規環境にインストールしている場合、deploy_cluster.yml を再度実行します。
残りの Playbook のみを実行する必要がある場合、失敗したフェーズの Playbook から実行し、その後に残りの Playbook を順番に実行します。
# ansible-playbook [-i /path/to/inventory] <playbook_file_location>
以下の表は、Playbook が実行される順序で Playbook を一覧表示しています。
Playbook 名 | ファイルの場所 |
---|---|
Health Check |
/usr/share/ansible/openshift-ansible/playbooks/openshift-checks/pre-install.yml |
etcd Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-etcd/config.yml |
NFS Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-nfs/config.yml |
Load Balancer Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-loadbalancer/config.yml |
Master Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-master/config.yml |
Master Additional Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-master/additional_config.yml |
Node Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-node/config.yml |
GlusterFS Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-glusterfs/config.yml |
Hosted Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-hosted/config.yml |
Web Console Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-web-console/config.yml |
Metrics Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml |
Logging Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml |
Prometheus Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-prometheus/config.yml |
Service Catalog Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-service-catalog/config.yml |
Management Install |
/usr/share/ansible/openshift-ansible/playbooks/openshift-management/config.yml |
2.6.6. インストールの検証
インストールが完了したら、次の手順を実行します。
マスターが起動しており、ノードが登録されており、Ready ステータスで報告されていることを確認します。マスターホストで 以下を root で実行します。
# oc get nodes NAME STATUS ROLES AGE VERSION master.example.com Ready master 7h v1.9.1+a0ce1bc657 node1.example.com Ready compute 7h v1.9.1+a0ce1bc657 node2.example.com Ready compute 7h v1.9.1+a0ce1bc657
Web コンソールが正常にインストールされているか確認するには、マスターホスト名と Web コンソールのポート番号を使用して Web ブラウザーで Web コンソールにアクセスします。
たとえば、ホスト名が
master.openshift.com
で、デフォルトポート8443
を使用するマスターホストの場合、Web コンソールはhttps://master.openshift.com:8443/console
にあります。
複数 etcd ホストの確認
複数 etcd ホストをインストールした場合は、以下の手順を実行します。
まず、
etcdctl
コマンドを提供する etcd パッケージがインストールされていることを確認します。# yum install etcd
マスターホストで etcd クラスターの正常性を確認します。以下で実際の etcd ホストの FQDN の置き換えを実行します。
# etcdctl -C \ https://etcd1.example.com:2379,https://etcd2.example.com:2379,https://etcd3.example.com:2379 \ --ca-file=/etc/origin/master/master.etcd-ca.crt \ --cert-file=/etc/origin/master/master.etcd-client.crt \ --key-file=/etc/origin/master/master.etcd-client.key cluster-health
メンバーリストが正しいことも確認します。
# etcdctl -C \ https://etcd1.example.com:2379,https://etcd2.example.com:2379,https://etcd3.example.com:2379 \ --ca-file=/etc/origin/master/master.etcd-ca.crt \ --cert-file=/etc/origin/master/master.etcd-client.crt \ --key-file=/etc/origin/master/master.etcd-client.key member list
HAProxy を使用する複数マスターの確認
HAProxy を使用する複数マスターをロードバランサーとしてインストールした場合は、[lb] セクションの定義に従って次の URL に移動し、HAProxy のステータスを確認します。
http://<lb_hostname>:9000
HAProxy の設定に関するドキュメントを参照してインストールを検証できます。
2.6.7. ビルドのオプションでのセキュリティー保護
docker build
の実行は特権付きのプロセスのため、コンテナーにはマルチテナント環境で許可される以上のノードに対するアクセスがある場合があります。ユーザーを信頼しない場合、インストール時により多くのセキュアなオプションを使用できます。クラスターで Docker ビルドを無効にし、ユーザーに対してクラスター外でイメージをビルドするように要求できます。このオプションのプロセスについての詳細は、「Securing Builds by Strategy」を参照してください。
2.6.8. OpenShift Container Platform のアンインストール
クラスターの OpenShift Container Platform ホストをアンインストールするには、uninstall.yml playbook を実行します。この playbook は、Ansible によってインストールされた OpenShift Container Platform コンテンツを削除します。これには以下が含まれます。
- 設定
- コンテナー
- デフォルトのテンプレートとイメージストリーム
- イメージ
- RPM パッケージ
この Playbook は、Playbook の実行時に指定するインベントリーファイルで定義されているすべてのホストのコンテンツを削除します。クラスター内のすべてのホストで OpenShift Container Platform をアンインストールする場合、最初に OpenShift Container Platform をインストールしたときに使用したインベントリーファイルか、または最近実行したインベントリーファイルを使用して Playbook を実行します。
# ansible-playbook [-i /path/to/file] \ /usr/share/ansible/openshift-ansible/playbooks/adhoc/uninstall.yml
2.6.8.1. ノードのアンインストール
uninstall.yml playbook を使用すると、ノードコンポーネントを特定のホストからアンインストールし、それ以外のホストとクラスターをそのままにしておくことができます。
この方法は、特定のノードホストをアンインストールする場合にのみ使用してください。特定のマスターホストや etcd ホストのアンインストールには使用しないでください。これらのホストをアンインストールするには、クラスター内での追加の設定変更が必要になります。
- まず、「ノードの削除」の手順に従ってクラスターからノードオブジェクトを削除します。次に、この残りの手順を実行します。
これらのホストのみを参照する別のインベントリーファイルを作成します。たとえば、1 つのノードのみからコンテンツを削除する場合は、以下を実行します。
[OSEv3:children] nodes 1 [OSEv3:vars] ansible_ssh_user=root openshift_deployment_type=openshift-enterprise [nodes] node3.example.com openshift_node_labels="{'region': 'primary', 'zone': 'west'}" 2
uninstall.yml playbook の実行時に、
-i
オプションを使用して新規インベントリーファイルを指定します。# ansible-playbook -i /path/to/new/file \ /usr/share/ansible/openshift-ansible/playbooks/adhoc/uninstall.yml
Playbook が完了すると、すべての OpenShift Container Platform コンテンツが指定したホストから削除されます。
2.6.9. 既知の問題
- 複数マスタークラスターでフェイルオーバーが発生すると、コントローラーマネージャーの過剰修正が生じ、結果として予定よりも多くの Pod がシステムで実行される可能性があります。ただし、これは一時的なイベントであり、後にシステムによって修正されます。詳細については、https://github.com/kubernetes/kubernetes/issues/10030 を参照してください。
Ansible インストーラーが失敗する場合でも、OpenShift Container Platform をインストールできます。
-
OpenShift Container Platform 3.9 の初期 GA リリースには、インストール Playbook とアップグレード Playbook が以前のリリースよりも多くのメモリーを消費するという既知の問題があります。Ansible のノードスケールアップ Playbook とインストール Playbook は、コントロールホスト (Playbook の実行元のシステム) で想定よりも多くのメモリーを消費することがありました。これは
include_tasks
が複数の場所で使用されていたためです。この問題は RHBA-2018:0600 のリリースで対応されています。現在これらのインスタンスの大半が、それほど多くのメモリーを消費しないimport_tasks
呼び出しに変換されています。この変更により、コントロール ホストでのメモリー消費量は、ホストあたり 100MiB 未満になります。大規模な環境 (100 以上のホスト) では、16GiB 以上のメモリーを搭載したコントロールホストを使用することを推奨します。(BZ#1558672)
2.6.10. 次のステップ
これで OpenShift Container Platform インスタンスが機能し、以下を実行できるようになります。
- 統合 Docker レジストリーをデプロイします。
- ルーターをデプロイします。
2.7. 非接続インストール
2.7.1. 概要
データセンターの一部が、プロキシーサーバー経由でもインターネットにアクセスできないことがよくあります。このような環境での OpenShift Container Platform のインストールは非接続インストールと見なされます。
OpenShift Container Platform の非接続インストールは、主に次の 2 つの点で通常のインストールと異なります。
- OpenShift Container Platform のソフトウェアチャンネルとリポジトリーが、 Red Hat のコンテンツ配信ネットワーク (CDN) 経由で利用できません。
- OpenShift Container Platform は複数のコンテナー化されたコンポーネントを使用します。通常、これらのイメージは Red Hat の Docker レジストリーから直接プルされますが、非接続環境ではこれを実行できません。
非接続インストールでは、該当するサーバーで OpenShift Container Platform ソフトウェアを利用できるようにし、その後は標準の接続インストールと同じインストールプロセスに従います。このトピックでは、コンテナーイメージを手動でダウンロードし、これを関連するサーバーに転送する方法について詳しく説明します。
インストールが完了したら、OpenShift Container Platform を使用するため、ソース管理リポジトリー (Git など) にソースコードが必要です。このトピックでは、ソースコードをホストできる内部 Git リポジトリーが利用可能であり、OpenShift Container Platform ノードからこのリポジトリーにアクセスできることを前提とします。ソース管理リポジトリーのインストールについては、本書では扱いません。
また、アプリケーションを OpenShift Container Platform でビルドする場合、ビルドに何らかの外部の依存関係 (Maven リポジトリーや Ruby アプリケーション用の Gem ファイルなど) がある場合があります。このため、このような依存関係には特定のタグが必要な場合があるため、OpenShift Container Platform で提供される Quickstart テンプレートの多くは、非接続環境では動作しない可能性があります。ただし、 Red Hat コンテナーイメージはデフォルトで外部リポジトリーへのアクセスを試みますが、OpenShift Container Platform を独自の内部リポジトリーを使用するように設定することもできます。本書では、このような内部リポジトリーがすでに存在しており、OpenShift Container Platform ノードホストからアクセスできることを前提としています。このリポジトリーのインストールについては、本書では扱いません。
インターネットまたは LAN 経由で Red Hat コンテンツへのアクセスを提供する Red Hat Satellite サーバーを利用することもできます。 Satellite が導入されている環境では、OpenShift Container Platform ソフトウェアを Satellite に同期し、OpenShift Container Platform サーバーで使用できます。
Red Hat Satellite 6.1 では、Docker レジストリーとして動作する機能も導入されています。この機能を使用すると、OpenShift Container Platform のコンテナー化されたコンポーネントをホストできます。この実行方法については、本書では扱いません。
2.7.2. 前提条件
本書では、OpenShift Container Platform の全体的なアーキテクチャーを理解していることと、環境トポロジーが計画済みであることを前提としています。
2.7.3. 必要なソフトウェアとコンポーネント
必要なソフトウェアリポジトリーとコンテナーイメージをプルするには、インターネットにアクセスできる Red Hat Enterprise Linux (RHEL) 7 サーバーと少なくとも 100GB の空き容量が必要です。このセクションのすべての手順は、インターネットに接続されたサーバーで root システムユーザーとして実行する必要があります。
2.7.3.1. リポジトリーの同期
必要なリポジトリーを同期する前に、適切な GPG キーのインポートが必要になる場合があります。
$ rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
キーをインポートしない場合、指定したパッケージはリポジトリーの同期後に削除されます。
必要なリポジトリーを同期するには、次の手順を実行します。
サーバーを Red Hat カスタマーポータルに登録します。OpenShift Container Platform サブスクリプションにアクセスできるアカウントに関連付けられているログインとパスワードを使用する必要があります。
$ subscription-manager register
RHSM から最新サブスクリプションデータをプルします。
$ subscription-manager refresh
OpenShift Container Platform チャンネルを提供するサブスクリプションにアタッチします。使用可能なサブスクリプションの一覧は、以下のコマンドで確認できます。
$ subscription-manager list --available --matches '*OpenShift*'
次に、OpenShift Container Platform を提供するサブスクリプションのプール ID を見つけ、これをアタッチします。
$ subscription-manager attach --pool=<pool_id> $ subscription-manager repos --disable="*" $ subscription-manager repos \ --enable="rhel-7-server-rpms" \ --enable="rhel-7-server-extras-rpms" \ --enable="rhel-7-fast-datapath-rpms" \ --enable="rhel-7-server-ansible-2.4-rpms" \ --enable="rhel-7-server-ose-3.9-rpms"
yum-utils
コマンドは、reposync ユーティリティーを提供します。これによって yum リポジトリーをミラーリングでき、createrepo
で使用可能なyum
リポジトリーをディレクトリーから作成できます。$ sudo yum -y install yum-utils createrepo docker git
ソフトウェアを同期するには、最大 110GB の空き容量が必要です。組織のポリシーの制限のレベルによっては、このサーバーを非接続 LAN に再接続し、これをリポジトリーサーバーとして使用できます。USB 接続ストレージを使用し、ソフトウェアをリポジトリーサーバーとして機能する別のサーバーに転送できます。このトピックでは、これらのオプションについて説明します。
ソフトウェアを同期する場所へのパスを作成します (ローカル、USB その他デバイスのいずれか)。
$ mkdir -p </path/to/repos>
パッケージを同期し、各パッケージのリポジトリーを作成します。上記の手順で作成した適切なパスに合わせてコマンドを変更する必要がります。
$ for repo in \ rhel-7-server-rpms \ rhel-7-server-extras-rpms \ rhel-7-fast-datapath-rpms \ rhel-7-server-ansible-2.4-rpms \ rhel-7-server-ose-3.9-rpms do reposync --gpgcheck -lm --repoid=${repo} --download_path=/path/to/repos createrepo -v </path/to/repos/>${repo} -o </path/to/repos/>${repo} done
2.7.3.2. イメージの同期
コンテナーイメージを同期するには、以下を実行します。
Docker デーモンを起動します。
$ systemctl start docker
Iコンテナー化インストールを実行する場合、必要な OpenShift Container Platform ホストコンポーネントイメージすべてをプルします。
<tag>
を最新バージョンのv3.9.43
に置き換えます。# docker pull registry.access.redhat.com/rhel7/etcd # docker pull registry.access.redhat.com/openshift3/ose:<tag> # docker pull registry.access.redhat.com/openshift3/node:<tag> # docker pull registry.access.redhat.com/openshift3/openvswitch:<tag>
必要な OpenShift Container Platform インフラストラクチャーコンポーネントイメージすべてをプルします。
<tag>
を最新バージョンのv3.9.43
に置き換えます。$ docker pull registry.access.redhat.com/openshift3/ose-ansible:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-cluster-capacity:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-deployer:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-docker-builder:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-docker-registry:<tag> $ docker pull registry.access.redhat.com/openshift3/registry-console:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-egress-http-proxy:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-egress-router:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-f5-router:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-haproxy-router:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-keepalived-ipfailover:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-pod:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-sti-builder:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-template-service-broker:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-web-console:<tag> $ docker pull registry.access.redhat.com/openshift3/ose:<tag> $ docker pull registry.access.redhat.com/openshift3/container-engine:<tag> $ docker pull registry.access.redhat.com/openshift3/node:<tag> $ docker pull registry.access.redhat.com/openshift3/openvswitch:<tag> $ docker pull registry.access.redhat.com/rhel7/etcd
注記NFS を使用している場合は、
ose-recycler
イメージが必要です。これを使用しないと、ボリュームはリサイクルされず、エラーが発生する可能性があります。リサイクル回収ポリシーは動的プロビジョニングが優先されるために非推奨となり、今後のリリースでは削除されます。
追加の一元的なログ集約およびメトリクス集約コンポーネントに必要な OpenShift Container Platform のコンテナー化されたコンポーネントすべてをプルします。
<tag>
を最新バージョンのv3.9.43
に置き換えます。$ docker pull registry.access.redhat.com/openshift3/logging-auth-proxy:<tag> $ docker pull registry.access.redhat.com/openshift3/logging-curator:<tag> $ docker pull registry.access.redhat.com/openshift3/logging-elasticsearch:<tag> $ docker pull registry.access.redhat.com/openshift3/logging-fluentd:<tag> $ docker pull registry.access.redhat.com/openshift3/logging-kibana:<tag> $ docker pull registry.access.redhat.com/openshift3/oauth-proxy:<tag> $ docker pull registry.access.redhat.com/openshift3/metrics-cassandra:<tag> $ docker pull registry.access.redhat.com/openshift3/metrics-hawkular-metrics:<tag> $ docker pull registry.access.redhat.com/openshift3/metrics-hawkular-openshift-agent:<tag> $ docker pull registry.access.redhat.com/openshift3/metrics-heapster:<tag> $ docker pull registry.access.redhat.com/openshift3/prometheus:<tag> $ docker pull registry.access.redhat.com/openshift3/prometheus-alert-buffer:<tag> $ docker pull registry.access.redhat.com/openshift3/prometheus-alertmanager:<tag> $ docker pull registry.access.redhat.com/openshift3/prometheus-node-exporter:<tag> $ docker pull registry.access.redhat.com/cloudforms46/cfme-openshift-postgresql $ docker pull registry.access.redhat.com/cloudforms46/cfme-openshift-memcached $ docker pull registry.access.redhat.com/cloudforms46/cfme-openshift-app-ui $ docker pull registry.access.redhat.com/cloudforms46/cfme-openshift-app $ docker pull registry.access.redhat.com/cloudforms46/cfme-openshift-embedded-ansible $ docker pull registry.access.redhat.com/cloudforms46/cfme-openshift-httpd $ docker pull registry.access.redhat.com/cloudforms46/cfme-httpd-configmap-generator $ docker pull registry.access.redhat.com/rhgs3/rhgs-server-rhel7 $ docker pull registry.access.redhat.com/rhgs3/rhgs-volmanager-rhel7 $ docker pull registry.access.redhat.com/rhgs3/rhgs-gluster-block-prov-rhel7 $ docker pull registry.access.redhat.com/rhgs3/rhgs-s3-server-rhel7
重要Red Hat サポートについては、Container-Native Storage (CNS) のサブスクリプションが
rhgs3/
イメージに必要です。重要OpenShift Container Platform 上での Prometheus はテクノロジープレビュー機能です。テクノロジープレビュー機能は Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。これらの機能は、近々発表予定の製品機能をリリースに先駆けてご提供することにより、お客様は機能性をテストし、開発プロセス中にフィードバックをお寄せいただくことができます。
Red Hat のテクノロジープレビュー機能のサポートについての詳細は、https://access.redhat.com/support/offerings/techpreview/ を参照してください。
サービスカタログ、OpenShift Ansible ブローカー、およびテンプレートサービスブローカー機能 (「通常インストール (Advanced installation)」に記載) が必要な場合は、以下のイメージをプルします。
<tag>
を最新バージョンのv3.9.43
に置き換えます。$ docker pull registry.access.redhat.com/openshift3/ose-service-catalog:<tag> $ docker pull registry.access.redhat.com/openshift3/ose-ansible-service-broker:<tag> $ docker pull registry.access.redhat.com/openshift3/mediawiki-apb:<tag> $ docker pull registry.access.redhat.com/openshift3/postgresql-apb:<tag>
OpenShift 環境で使用する Red Hat 認定の Source-to-Image (S2I) ビルダーイメージをプルします。以下のイメージをプルできます。
$ docker pull registry.access.redhat.com/jboss-amq-6/amq63-openshift $ docker pull registry.access.redhat.com/jboss-datagrid-7/datagrid71-openshift $ docker pull registry.access.redhat.com/jboss-datagrid-7/datagrid71-client-openshift $ docker pull registry.access.redhat.com/jboss-datavirt-6/datavirt63-openshift $ docker pull registry.access.redhat.com/jboss-datavirt-6/datavirt63-driver-openshift $ docker pull registry.access.redhat.com/jboss-decisionserver-6/decisionserver64-openshift $ docker pull registry.access.redhat.com/jboss-processserver-6/processserver64-openshift $ docker pull registry.access.redhat.com/jboss-eap-6/eap64-openshift $ docker pull registry.access.redhat.com/jboss-eap-7/eap70-openshift $ docker pull registry.access.redhat.com/jboss-webserver-3/webserver31-tomcat7-openshift $ docker pull registry.access.redhat.com/jboss-webserver-3/webserver31-tomcat8-openshift $ docker pull registry.access.redhat.com/openshift3/jenkins-1-rhel7 $ docker pull registry.access.redhat.com/openshift3/jenkins-2-rhel7 $ docker pull registry.access.redhat.com/openshift3/jenkins-slave-base-rhel7 $ docker pull registry.access.redhat.com/openshift3/jenkins-slave-maven-rhel7 $ docker pull registry.access.redhat.com/openshift3/jenkins-slave-nodejs-rhel7 $ docker pull registry.access.redhat.com/rhscl/mongodb-32-rhel7 $ docker pull registry.access.redhat.com/rhscl/mysql-57-rhel7 $ docker pull registry.access.redhat.com/rhscl/perl-524-rhel7 $ docker pull registry.access.redhat.com/rhscl/php-56-rhel7 $ docker pull registry.access.redhat.com/rhscl/postgresql-95-rhel7 $ docker pull registry.access.redhat.com/rhscl/python-35-rhel7 $ docker pull registry.access.redhat.com/redhat-sso-7/sso70-openshift $ docker pull registry.access.redhat.com/rhscl/ruby-24-rhel7 $ docker pull registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift $ docker pull registry.access.redhat.com/redhat-sso-7/sso71-openshift $ docker pull registry.access.redhat.com/rhscl/nodejs-6-rhel7 $ docker pull registry.access.redhat.com/rhscl/mariadb-101-rhel7
必要なバージョン番号を示す適切なタグを指定してください。たとえば、Tomcat イメージの前のバージョンと最新バージョンの両方をプルするには、以下を実行します。
$ docker pull \ registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat7-openshift:latest $ docker pull \ registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat7-openshift:1.1
2.7.3.3. イメージのエクスポートの準備
コンテナーイメージをシステムからエクスポートできます。これを行うには、まずコンテナーイメージを tarball に保存し、次にそれを転送します。
リポジトリーのホームディレクトリーを作成し、これに移動します。
$ mkdir </path/to/repos/images> $ cd </path/to/repos/images>
Iコンテナー化インストールを実行する場合、OpenShift Container Platform ホストコンポーネントイメージをエクスポートします。
# docker save -o ose3-host-images.tar \ registry.access.redhat.com/rhel7/etcd \ registry.access.redhat.com/openshift3/ose \ registry.access.redhat.com/openshift3/node \ registry.access.redhat.com/openshift3/openvswitch
OpenShift Container Platform インフラストラクチャーコンポーネントのイメージをエクスポートします。
$ docker save -o ose3-images.tar \ registry.access.redhat.com/openshift3/ose-ansible \ registry.access.redhat.com/openshift3/ose-ansible-service-broker \ registry.access.redhat.com/openshift3/ose-cluster-capacity \ registry.access.redhat.com/openshift3/ose-deployer \ registry.access.redhat.com/openshift3/ose-docker-builder \ registry.access.redhat.com/openshift3/ose-docker-registry \ registry.access.redhat.com/openshift3/registry-console registry.access.redhat.com/openshift3/ose-egress-http-proxy \ registry.access.redhat.com/openshift3/ose-egress-router \ registry.access.redhat.com/openshift3/ose-f5-router \ registry.access.redhat.com/openshift3/ose-haproxy-router \ registry.access.redhat.com/openshift3/ose-keepalived-ipfailover \ registry.access.redhat.com/openshift3/ose-pod \ registry.access.redhat.com/openshift3/ose-sti-builder \ registry.access.redhat.com/openshift3/ose-template-service-broker \ registry.access.redhat.com/openshift3/ose-web-console \ registry.access.redhat.com/openshift3/ose \ registry.access.redhat.com/openshift3/container-engine \ registry.access.redhat.com/openshift3/node \ registry.access.redhat.com/openshift3/openvswitch \ registry.access.redhat.com/openshift3/prometheus \ registry.access.redhat.com/openshift3/prometheus-alert-buffer \ registry.access.redhat.com/openshift3/prometheus-alertmanager \ registry.access.redhat.com/openshift3/prometheus-node-exporter \ registry.access.redhat.com/cloudforms46/cfme-openshift-postgresql \ registry.access.redhat.com/cloudforms46/cfme-openshift-memcached \ registry.access.redhat.com/cloudforms46/cfme-openshift-app-ui \ registry.access.redhat.com/cloudforms46/cfme-openshift-app \ registry.access.redhat.com/cloudforms46/cfme-openshift-embedded-ansible \ registry.access.redhat.com/cloudforms46/cfme-openshift-httpd \ registry.access.redhat.com/cloudforms46/cfme-httpd-configmap-generator \ registry.access.redhat.com/rhgs3/rhgs-server-rhel7 \ registry.access.redhat.com/rhgs3/rhgs-volmanager-rhel7 \ registry.access.redhat.com/rhgs3/rhgs-gluster-block-prov-rhel7 \ registry.access.redhat.com/rhgs3/rhgs-s3-server-rhel7
重要Red Hat サポートについては、CNS のサブスクリプションが
rhgs3/
イメージに必要です。メトリクスとログ集約イメージを同期した場合は、それらをエクスポートします。
$ docker save -o ose3-logging-metrics-images.tar \ registry.access.redhat.com/openshift3/logging-auth-proxy \ registry.access.redhat.com/openshift3/logging-curator \ registry.access.redhat.com/openshift3/logging-elasticsearch \ registry.access.redhat.com/openshift3/logging-fluentd \ registry.access.redhat.com/openshift3/logging-kibana \ registry.access.redhat.com/openshift3/metrics-cassandra \ registry.access.redhat.com/openshift3/metrics-hawkular-metrics \ registry.access.redhat.com/openshift3/metrics-hawkular-openshift-agent \ registry.access.redhat.com/openshift3/metrics-heapster
前のセクションで同期した S2I ビルダーイメージをエクスポートします。たとえば、Jenkins イメージと Tomcat イメージのみを同期した場合は、以下を実行します。
$ docker save -o ose3-builder-images.tar \ registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat7-openshift:latest \ registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat7-openshift:1.1 \ registry.access.redhat.com/openshift3/jenkins-1-rhel7 \ registry.access.redhat.com/openshift3/jenkins-2-rhel7 \ registry.access.redhat.com/openshift3/jenkins-slave-base-rhel7 \ registry.access.redhat.com/openshift3/jenkins-slave-maven-rhel7 \ registry.access.redhat.com/openshift3/jenkins-slave-nodejs-rhel7
2.7.4. リポジトリーサーバー
インストール時に (選択する場合はその後のアップデート時に)、リポジトリーをホストするための Web サーバーが必要となります。RHEL 7 では、Apache Web サーバーを提供しています。
オプション 1 : Web サーバーとしての再設定
ソフトウェアとイメージを LAN に同期しているサーバーに再接続ができる場合は、Apache をそのサーバーに単純にインストールできます。
$ sudo yum install httpd
ソフトウェアの配置に進んでください。
オプション 2: リポジトリーサーバーの構築
リポジトリーサーバーとして機能する別のサーバーを設定する必要がある場合には、110 GB 以上の空き領域を持つ新規の RHEL 7 システムをインストールしてください。インストール時に、このリポジトリーサーバーで Basic Web Server オプションが選択されていることを確認します。
2.7.4.1. ソフトウェアの配置
必要に応じて外部ストレージを割り当て、リポジトリーファイルを Apache のルートフォルダーにコピーします。同期に使用したサーバーを再利用している場合には、以下の copy の手順 (
cp -a
) を move (mv
) に置き換える必要があることに注意してください。$ cp -a /path/to/repos /var/www/html/ $ chmod -R +r /var/www/html/repos $ restorecon -vR /var/www/html
ファイアウォールのルールを追加します。
$ sudo firewall-cmd --permanent --add-service=http $ sudo firewall-cmd --reload
変更を有効にするには、Apache を有効にしてから起動します。
$ systemctl enable httpd $ systemctl start httpd
2.7.5. OpenShift Container Platform システム
2.7.5.1. ホストの構築
この時点で、OpenShift Container Platform 環境の一部を構成するホストの初回作成を実行できます。最新バージョンの RHEL 7 を使用し、最小限のインストールを実行するようにしてください。また、OpenShift Container Platform に固有の前提条件にも注意する必要があります。
ホストの最初の構築が完了したら、リポジトリーのセットアップが可能になります。
2.7.5.2. リポジトリーの接続
OpenShift Container Platform のソフトウェアコンポーネントを必要とするすべての関連システムで、必須のリポジトリー定義を作成します。以下のテキストを /etc/yum.repos.d/ose.repo ファイルに入力し、 <server_IP>
を、ソフトウェアリポジトリーをホストしている Apache サーバーの IP またはホスト名に置き換えます。
[rhel-7-server-rpms] name=rhel-7-server-rpms baseurl=http://<server_IP>/repos/rhel-7-server-rpms enabled=1 gpgcheck=0 [rhel-7-server-extras-rpms] name=rhel-7-server-extras-rpms baseurl=http://<server_IP>/repos/rhel-7-server-extras-rpms enabled=1 gpgcheck=0 [rhel-7-fast-datapath-rpms] name=rhel-7-fast-datapath-rpms baseurl=http://<server_IP>/repos/rhel-7-fast-datapath-rpms enabled=1 gpgcheck=0 [rhel-7-server-ansible-2.4-rpms] name=rhel-7-server-ansible-2.4-rpms baseurl=http://<server_IP>/repos/rhel-7-server-ansible-2.4-rpms enabled=1 gpgcheck=0 [rhel-7-server-ose-3.9-rpms] name=rhel-7-server-ose-3.9-rpms baseurl=http://<server_IP>/repos/rhel-7-server-ose-3.9-rpms enabled=1 gpgcheck=0
2.7.5.3. ホストの準備
この時点で、以下の OpenShift Container Platform ドキュメントに従ってシステムの準備を継続できます。
「ホスト登録」セクションを飛ばして、「基本パッケージのインストール」 に進んでください。
2.7.6. OpenShift Container Platform のインストール
2.7.6.1. OpenShift Container Platform Component イメージのインポート
関連するコンポーネントをインポートするには、接続したホストから OpenShift Container Platform の個々のホストにイメージを安全にコピーします。
$ scp /var/www/html/repos/images/ose3-images.tar root@<openshift_host_name>: $ ssh root@<openshift_host_name> "docker load -i ose3-images.tar" $ scp /var/www/html/images/ose3-builder-images.tar root@<openshift_master_host_name>: $ ssh root@<openshift_master_host_name> "docker load -i ose3-builder-images.tar"
インストールがコンテナー化される場合は、ホストコンポーネントに同じ手順を実行します。クラスターでメトリクスおよびロギングイメージを使用する場合は、それらについて同じ手順を実行します。
OpenShift Container Platform の各ホストで wget
を使用して tar ファイルを取得し、Docker のインポートコマンドをローカルで実行することも可能です。
2.7.6.2. OpenShift Container Platform インストーラーの実行
ドキュメントに記載されている OpenShift Container Platform の クイックインストールまたは基本インストール (Advanced installation)方式のいずれかを選択できます。
コンテナー化インストールでは、etcd コンテナーをインストールする際に、Ansible 変数 osm_etcd_image
をローカルレジストリーの etcd イメージの完全修飾名に設定します。例: registry.example.com/rhel7/etcd
2.7.6.3. 内部 Docker レジストリーの作成
ここで、内部 Docker レジストリーの作成が必要になります。
スタンドアロンレジストリーのインストールが必要な場合には、registry-console コンテナーイメージ をプルし、インベントリーファイルに deployment_subtype=registry
を設定する必要があります。
2.7.7. インストール後の変更
上記の手順で、S2I イメージは、OpenShift Container Platform のいずれかのマスターホストで実行されている Docker デーモンにインポートされています。接続されたインストールにおいて、これらのイメージは、要求に応じて Red Hat のレジストリーからプルされます。これを実行するために必要なインターネットが使用できないため、イメージは別の Docker レジストリーで使用できるようにしておく必要があります。
OpenShift Container Platform は、S2I プロセスの結果としてビルドされるイメージを格納するための内部レジストリーを提供していますが、このレジストリーは S2I ビルダーイメージの保持するために使用することもできます。以下の手順は、ユーザーがサービス IP サブネット (172.30.0.0/16) または Docker レジストリーポート (5000) をカスタマイズしていない場合を想定しています。
2.7.7.1. S2I ビルダーイメージの再タグ付け
S2I ビルダーイメージをインポートしたマスターホストで、そのマスター上にインストールした Docker レジストリーのサービスアドレスを取得します。
$ export REGISTRY=$(oc get service -n default \ docker-registry --output=go-template='{{.spec.clusterIP}}{{"\n"}}')
次に、OpenShift Container Platform Docker レジストリーにプッシュする前に、同期し、エクスポートしたすべてのビルダーイメージにタグ付けします。たとえば、Tomcat イメージのみを同期し、エクスポートした場合、以下のようになります。
$ docker tag \ registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat7-openshift:1.1 \ $REGISTRY:5000/openshift/webserver30-tomcat7-openshift:1.1 $ docker tag \ registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat7-openshift:latest \ $REGISTRY:5000/openshift/webserver30-tomcat7-openshift:1.2 $ docker tag \ registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat7-openshift:latest \ $REGISTRY:5000/openshift/webserver30-tomcat7-openshift:latest
2.7.7.2. レジストリーの場所の設定
registry.access.redhat.com
にあるデフォルト以外のイメージレジストリーを使用する場合は、目的のレジストリーを /etc/ansible/hosts ファイル内に指定します。
oreg_url=example.com/openshift3/ose-${component}:${version} openshift_examples_modify_imagestreams=true
レジストリーによっては、以下を設定することが必要になる場合があります。
openshift_docker_additional_registries=example.com openshift_docker_insecure_registries=example.com
ホストの IP アドレスに openshift_docker_insecure_registries
変数を設定することもできます。0.0.0.0/0
は有効な設定ではありません。
変数 | 目的 |
---|---|
|
代わりのイメージの場所に設定します。 |
|
デフォルト以外のレジストリーを参照している場合は |
|
|
|
|
2.7.7.3. 管理ユーザーの作成
コンテナーイメージを OpenShift Container Platform の Docker レジストリーにプッシュするには、ユーザーに cluster-admin 権限が必要です。OpenShift Container Platform のデフォルトのシステム管理者は標準の認証トークンを持っていないので、Docker レジストリーへのログインには使用できません。
管理ユーザーを作成するには、以下を実行します。
OpenShift Container Platform で使用している認証システムで新規ユーザーアカウントを作成します。たとえば、ローカルの
htpasswd
ベースの認証を使用している場合、以下のようになります。$ htpasswd -b /etc/openshift/openshift-passwd <admin_username> <password>
これで、外部の認証システムにユーザーアカウントが作成されます。ただしユーザーは、アカウントが内部データベースに作成される前に OpenShift Container Platform にログインしている必要があります。作成されるアカウントで OpenShift Container Platform にログインしてください。ここでは、インストール時に OpenShift Container Platform で生成される自己署名証明書が使用されることを前提としています。
$ oc login --certificate-authority=/etc/origin/master/ca.crt \ -u <admin_username> https://<openshift_master_host>:8443
ユーザーの認証トークンを取得します。
$ MYTOKEN=$(oc whoami -t) $ echo $MYTOKEN iwo7hc4XilD2KOLL4V1O55ExH2VlPmLD-W2-JOd6Fko
2.7.7.4. セキュリティーポリシーの変更
oc login
を使用すると、新しいユーザーに切り替わります。ポリシーを変更するには、OpenShift Container Platform のシステム管理者に再度切り替えます。$ oc login -u system:admin
イメージを OpenShift Container Platform Docker レジストリーにプッシュするには、アカウントに
image-builder
セキュリティーロールが必要です。このロールを、OpenShift Container Platform 管理ユーザーに追加します。$ oc adm policy add-role-to-user system:image-builder <admin_username>
次に、openshift プロジェクトのユーザーに管理者ロールを追加します。これで、管理ユーザーは openshift プロジェクトを編集できるようになります。ここでは、コンテナーイメージをプッシュします。
$ oc adm policy add-role-to-user admin <admin_username> -n openshift
2.7.7.5. イメージストリームの定義の編集
openshift プロジェクトでは、ビルダーイメージのすべてのイメージストリームはインストーラーによって作成されます。イメージストリームは、インストーラーが /usr/share/openshift/examples ディレクトリーから読み込まれます。OpenShift Container Platform のデータベースに読み込まれたイメージストリームを削除することですべての定義を変更し、これらを再作成します。
既存のイメージストリームを削除します。
$ oc delete is -n openshift --all
必要な場合、ファイルのバックアップを /usr/share/openshift/examples/ に作成します。次に、/usr/share/openshift/examples/image-streams フォルダーにあるファイル image-streams-rhel7.json を編集します。各ビルダーイメージにイメージストリームのセクションがあるはずです。
spec
スタンザを内部 Docker レジストリーを参照するように編集します。たとえば、以下のように変更します。
"from": { "kind": "DockerImage", "name": "registry.access.redhat.com/rhscl/httpd-24-rhel7" }
これを以下のように変更します。
"from": { "kind": "DockerImage", "name": "172.30.69.44:5000/openshift/httpd-24-rhel7" }
上記では、リポジトリー名が rhscl から openshift に変更されています。リポジトリーが rhscl、openshift3、またはそれ以外のディレクトリーであるかどうかにかかわらず、変更を確認する必要があります。すべての定義に以下の形式が使用されます。
<registry_ip>:5000/openshift/<image_name>
この変更を、ファイル内のすべてのイメージストリームに対して繰り返し実行します。先の手順で判別した正しい IP アドレスが使用されていることを確認します。終了したら、保存して終了します。/usr/share/openshift/examples/xpaas-streams/jboss-image-streams.json ファイルにある JBoss イメージストリームについても同じ手順を繰り返します。
2.7.7.6. コンテナーイメージの読み込み
この時点で、システムはコンテナーイメージを読み込むことができます。
先の手順で取得したトークンとレジストリーのサービス IP を使って Docker レジストリーにログインします。
$ docker login -u adminuser -e mailto:adminuser@abc.com \ -p $MYTOKEN $REGISTRY:5000
Docker イメージをプッシュします。
$ docker push $REGISTRY:5000/openshift/webserver30-tomcat7-openshift:1.1 $ docker push $REGISTRY:5000/openshift/webserver30-tomcat7-openshift:1.2 $ docker push $REGISTRY:5000/openshift/webserver30-tomcat7-openshift:latest
更新されたイメージストリームの定義を読み込みます。
$ oc create -f /usr/share/openshift/examples/image-streams/image-streams-rhel7.json -n openshift $ oc create -f /usr/share/openshift/examples/xpaas-streams/jboss-image-streams.json -n openshift
すべてのイメージストリームにタグが設定されていることを確認します。
$ oc get imagestreams -n openshift NAME DOCKER REPO TAGS UPDATED jboss-webserver30-tomcat7-openshift $REGISTRY/jboss-webserver-3/webserver30-jboss-tomcat7-openshift 1.1,1.1-2,1.1-6 + 2 more... 2 weeks ago ...
2.7.8. ルーターのインストール
この時点で、OpenShift Container Platform 環境はほとんど使用できる状態になります。ただし、ルーターのインストールと設定が必要になる場合もあります。
2.8. OpenShift Container レジストリーのスタンドアロンデプロイメントのインストール
2.8.1. OpenShift Container レジストリーについて
OpenShift Container Platform は、OpenShift Container レジストリー (OCR) と呼ばれる統合コンテナーレジストリーを含む完全な機能を備えたエンタープライズソリューションです。また、OpenShift Container Platform を開発者向けの完全な PaaS 環境としてデプロイする代わりに、 OCR をスタンドアロンのコンテナーレジストリーとしてインストールし、オンプレミスまたはクラウドで実行することも可能です。
OCR のスタンドアロンデプロイメントをインストールすると、標準的な OpenShift Container Platform のインストールと同様にマスターとノードのクラスターも引き続きインストールされます。次に、コンテナーレジストリーはそのクラスター上で実行されるようにデプロイされます。このスタンドアロンデプロイメントのオプションは、コンテナーレジストリーは必要だが、開発者向けの Web コンソールやアプリケーションのビルドおよびデプロイツールを含む OpenShift Container Platform の完全な環境は必要ない、という管理者に役立ちます。
OCR には以下の機能があります。
- ユーザー向けの レジストリー Web コンソール、Cockpit。
- デフォルトのセキュリティー保護されたトラフィック (TLS 経由で提供される)。
- グローバルなアイデンティティープロバイダー認証。
- チームがロールベースのアクセス制御 (RBAC) 認証を通じて連携できるようにするプロジェクト namespace モデル。
- サービスを管理するための Kubernetes ベースのクラスター。
- イメージ管理を強化するためのイメージストリームというイメージの抽象化。
管理者は、スタンドアロン OCR をデプロイすることで OpenShift Container Platform の複数のクラスターに対応しているレジストリーを個別に管理できます。また、スタンドアロン OCR を使うと、セキュリティーやコンプライアンスに関する独自の要件を満たすようにレジストリーを分離することも可能です。
2.8.2. ハードウェアの最小要件
スタンドアロン OCR をインストールするためのハードウェア要件は以下の通りです。
- 物理または仮想システム、またはパブリックまたはプライベート IaaS で実行されるインスタンス。
- ベース OS: RHEL 7.3、7.4、または 7.5 (RHEL 7 Extras チャンネルの「最小限の」インストールオプションおよび最新のパッケージ)、または、RHEL Atomic Host 7.4.5 以降。
- NetworkManager 1.0 以降
- 2 vCPU。
- 最小 16 GB の RAM。
- /var/ を含むファイルシステムの 15 GB 以上のハードディスク領域。
- Docker のストレージバックエンドに使用する 15 GB 以上の追加の未割り当て領域。詳細は「Docker ストレージの設定」を参照してください。
OpenShift Container Platform は、x86_64 アーキテクチャー搭載のサーバーのみをサポートします。
RHEL Atomic Host の /var/ のファイルシステムのサイジング要件を満たすには、デフォルト設定を変更する必要があります。インストール時またはインストール後にこの設定を行う方法については「Managing Storage in Red Hat Enterprise Linux Atomic Host」を参照してください。
2.8.3. サポートされているシステムトポロジー
以下のシステムトポロジーはスタンドアロン OCR でサポートされています。
オールインワン |
マスター、ノード、etcd、レジストリーの各コンポーネントを含む単一ホスト。 |
複数マスター (高可用性) |
すべてのコンポーネント (マスター、ノード、etcd、レジストリー) がそれぞれに含まれる 3 つのホスト。マスターはネイティブの高可用性を確保するように設定されます。 |
2.8.4. ホストの準備
スタンドアロン OCR をインストールする前に、完全な OpenShift Container Platform PaaS のインストールについて取り上げたホストの準備のトピックで説明している手順と同じ手順をすべて実行する必要があります。この手順には、適切なリポジトリーへのホストの登録とサブスクライブ、特定パッケージのインストールまたは更新、Docker とそのストレージ要件のセットアップなどが含まれます。
ホストの準備 の各手順を実行し、スタンドアロンレジストリーのインストール方法に進んでください。
2.8.5. スタンドアロンレジストリーのインストール方法
スタンドアロンレジストリーをインストールするには、OpenShift Container Platform の他のバージョンをインストールする際に使用した標準のインストール方式 (クイックインストールまたは通常インストール (Advanced installation)) のいずれかを使用します。
2.8.5.1. スタンドアロン OpenShift Container レジストリーのクイックインストール
OpenShift Container Platform 3.9 の時点で、クイックインストールは廃止予定です。今後のリリースでは完全になくなります。また、クイックインストーラーによるバージョン 3.7 から 3.9 へのアップグレードはサポートされていません。
以下では、OpenShift Container Platform をすべてインストールするのではなく、クイックインストールツールを実行して OpenShift Container レジストリーをインストールする方法を順を追って説明します。
対話型インストールを開始します。
$ atomic-openshift-installer install
画面の指示に従って新規レジストリーをインストールします。インストールに関する質問は、OpenShift Container Platform PaaS をすべてインストールする場合とほとんど同じです。以下の画面まで進んだら、
2
を選択してレジストリーのインストールパスに従ってください。Which variant would you like to install? (1) OpenShift Container Platform (2) Registry
クラスターを構成しているホストを指定します。
Enter hostname or IP address: Will this host be an OpenShift master? [y/N]: Will this host be RPM or Container based (rpm/container)? [rpm]:
RPM とコンテナー化ホストとの比較に関する情報は、コンテナー化ホストでのインストールのトピックを参照してください。
必要な場合は、クラスターのホスト名を変更します。
Enter hostname or IP address [None]:
ストレージホストとして機能するホストを選択します (デフォルトではマスターホスト)。
Enter hostname or IP address [master.host.example.com]:
必要な場合は、デフォルトのサブドメインを変更します。
New default subdomain (ENTER for none) []:
注記すべての証明書とルートはこのサブドメインで作成されます。インストール後に設定を変更しなくてすむように、これが適切なサブドメインに設定されていることを確認してください。
必要に応じて HTTP または HTTPS プロキシーを指定します。
Specify your http proxy ? (ENTER for none) []: Specify your https proxy ? (ENTER for none) []:
上記を入力したら、次ページでインストールの概要が示され、ホスト情報の収集が開始されます。
以下の手順を含む、一般的なクイックインストーラーの使用に関する詳細は、「クイックインストール」のトピックすべてを参照してください。
2.8.5.2. スタンドアロン OpenShift Container レジストリーの通常インストール (Advanced installation)
通常インストール (Advanced installation) 方式を使ってスタンドアロン OCR をインストールする際に、「通常インストール (Advanced installation)」のトピックで説明されている Ansible を使用した OpenShift Container Platform PaaS のインストールと同じ手順を使用します。大きな違いとして、ここでは Playbook がレジストリーのインストールパスをたどれるよう、インベントリーファイルの [OSEv3:vars]
セクションに deployment_subtype=registry
を設定する必要があります。
以下は、サポートされている複数の異なるシステムトポロジー用のインベントリーファイルの例です。
オールインワンのスタンドアロン OpenShift Container レジストリーインベントリーファイル
# Create an OSEv3 group that contains the masters and nodes groups [OSEv3:children] masters nodes etcd # Set variables common for all OSEv3 hosts [OSEv3:vars] # SSH user, this user should allow ssh based auth without requiring a password ansible_ssh_user=root openshift_master_default_subdomain=apps.test.example.com # If ansible_ssh_user is not root, ansible_become must be set to true #ansible_become=true openshift_deployment_type=openshift-enterprise deployment_subtype=registry 1 openshift_hosted_infra_selector="" 2 # uncomment the following to enable htpasswd authentication; defaults to DenyAllPasswordIdentityProvider #openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}] # host group for masters [masters] registry.example.com # host group for etcd [etcd] registry.example.com # host group for nodes [nodes] registry.example.com
複数マスター (高可用性) スタンドアロン OpenShift Container レジストリーインベントリーファイル
# Create an OSEv3 group that contains the master, nodes, etcd, and lb groups.
# The lb group lets Ansible configure HAProxy as the load balancing solution.
# Comment lb out if your load balancer is pre-configured.
[OSEv3:children]
masters
nodes
etcd
lb
# Set variables common for all OSEv3 hosts
[OSEv3:vars]
ansible_ssh_user=root
openshift_deployment_type=openshift-enterprise
deployment_subtype=registry 1
openshift_master_default_subdomain=apps.test.example.com
# Uncomment the following to enable htpasswd authentication; defaults to
# DenyAllPasswordIdentityProvider.
#openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}]
# Native high availability cluster method with optional load balancer.
# If no lb group is defined installer assumes that a load balancer has
# been preconfigured. For installation the value of
# openshift_master_cluster_hostname must resolve to the load balancer
# or to one or all of the masters defined in the inventory if no load
# balancer is present.
openshift_master_cluster_method=native
openshift_master_cluster_hostname=openshift-internal.example.com
openshift_master_cluster_public_hostname=openshift-cluster.example.com
# apply updated node defaults
openshift_node_kubelet_args={'pods-per-core': ['10'], 'max-pods': ['250'], 'image-gc-high-threshold': ['90'], 'image-gc-low-threshold': ['80']}
# enable ntp on masters to ensure proper failover
openshift_clock_enabled=true
# host group for masters
[masters]
master1.example.com
master2.example.com
master3.example.com
# host group for etcd
[etcd]
etcd1.example.com
etcd2.example.com
etcd3.example.com
# Specify load balancer host
[lb]
lb.example.com
# host group for nodes, includes region info
[nodes]
master[1:3].example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}"
node1.example.com openshift_node_labels="{'region': 'primary', 'zone': 'east'}"
node2.example.com openshift_node_labels="{'region': 'primary', 'zone': 'west'}"
- 1
deployment_subtype=registry
を設定して、OpenShift Container Platform 環境のすべてではなく、スタンドアロン OCR がインストールされるようにします。
/etc/ansible/hosts でインベントリーファイルを定義して Ansible を設定した後に、以下を実行します。
prerequisites.yml Playbook を実行してベースパッケージと Docker を設定します。これは、新規クラスターをデプロイする前に 1 回だけ実行します。インベントリーファイルが /etc/ansible/hosts 以外の場所にある場合には、
-i
を指定して以下のコマンドを実行します。重要Ansible Playbook を実行するホストには、ホストあたり 75MiB 以上の空きメモリーがインベントリーで必要になります。
# ansible-playbook [-i /path/to/inventory] \ /usr/share/ansible/openshift-ansible/playbooks/prerequisites.yml
deploy_cluster.yml Playbook を実行してインストールを開始します。
# ansible-playbook [-i /path/to/inventory] \ /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
通常インストール (Advanced installation) 方式に関する詳細 (使用可能な Ansible 変数の一覧を含む) は、「通常インストール (Advanced installation)」 のトピックすべてを参照してください。
第3章 レジストリーのセットアップ
3.1. レジストリーの概要
3.1.1. レジストリーについて
OpenShift Container Platform は、ソースコードからコンテナーイメージをビルドし、デプロイし、そのライフサイクルを管理することができます。これを有効にするために、OpenShift Container Platform は、イメージをローカルで管理するために OpenShift Container Platform 環境にデプロイできる内部の統合 Docker レジストリーを提供しています。
3.1.2. 統合レジストリーまたはスタンドアロンレジストリー
完全な OpenShift Container Platform クラスターの初回インストール時に、レジストリーはインストールプロセスで自動的にデプロイされている可能性があります。自動的にデプロイされていなかった場合やレジストリー設定のカスタマイズが追加で必要になる場合には、「既存クラスターへのレジストリーのデプロイ」を参照してください。
OpenShiftコンテナプラットフォームの完全な統合された部分として実行するために展開することができますが、OpenShiftコンテナプラットフォームのレジストリは、スタンドアロンのコンテナイメージレジストリとして別々にインストールすることもできます。
スタンドアロンレジストリーをインストールするには、スタンドアロンレジストリーのインストールの手順に従ってください。このインストールパスは、レジストリーと専用の Web コンソールを実行するオールインワンのクラスターをデプロイします。
3.2. 既存クラスターへのレジストリーのデプロイ
3.2.1. 概要
OpenShift Container Platform クラスターの初回インストール時に統合レジストリーが事前に自動的にデプロイされなかった場合や、正常に実行されず、既存のクラスターに再デプロイする必要がある場合は、以下のセクションで新規レジストリーをデプロイするためのオプションを参照してください。
スタンドアロンレジストリーをインストールしていない場合、このトピックは不要になります。
3.2.2. レジストリーのデプロイ
統合 Docker レジストリーをデプロイするには、クラスター管理者権限を持つユーザーとして oc adm registry
コマンドを使用します。以下は例になります。
$ oc adm registry --config=/etc/origin/master/admin.kubeconfig \1 --service-account=registry \2 --images='registry.access.redhat.com/openshift3/ose-${component}:${version}' 3
これでサービスとデプロイメント設定が作成されます。これらは共に docker-registry と呼ばれます。正常にデプロイされると、Pod が docker-registry-1-cpty9 などの名前付きで作成されます。
レジストリーの作成時に指定できるオプションの詳細の一覧を表示するには、以下を実行します。
$ oc adm registry --help
--fs-group
の値は、レジストリーが使用している SCC (通常は制限付き SCC) によって許可されている必要があります。
3.2.3. レジストリーを DaemonSet としてデプロイする
レジストリーを --daemonset
オプションを使用して DaemonSet
としてデプロイするには、 oc adm registry
コマンドを使用します。
デーモンセットでは、ノードが作成されるときに、指定されたポッドのコピーが含まれます。ノードが削除されると、ポッドはガベージコレクションされます。
DaemonSet
に関する詳細は、「Daemonset の使用」を参照してください。
3.2.4. レジストリーのコンピュートリソース
デフォルトでは、レジストリーはコンピュートリソースの要求や制限に関する設定がない状態で作成されます。実稼働環境では、レジストリーのデプロイメント設定を更新してレジストリー Pod のリソース要求や制限を設定しておくことが強く推奨されます。設定しない場合、レジストリー Pod は BestEffort Pod と判断されます。
要求や制限の設定に関する詳細は、「コンピュートリソース」を参照してください。
3.2.5. レジストリーのストレージ
レジストリーには、コンテナーのイメージとメタデータが格納されています。Pod をレジストリーと共に単純にデプロイする場合、Pod がすでに存在する場合に破棄される一時ボリュームが使用されます。この場合、誰かがビルドしたりレジストリーにプッシュしたりしたイメージは消えてしまいます。
以下のセクションでは、サポートされているレジストリーのストレージドライバーの一覧を示しています。詳細は、Docker レジストリーのドキュメントを参照してください。
次の一覧には、レジストリの構成ファイルで構成する必要があるストレージドライバが含まれています。
- ファイルシステム。ファイルシステムはデフォルトですので、設定の必要はありません。
- S3。詳細は、CloudFront の設定のドキュメントを参照してください。
- OpenStack Swift
- Google Cloud Storage (GCS)
- Microsoft Azure
- Aliyun OSS
レジストリーの一般的なストレージ設定オプションはサポートされています。詳細は、Docker レジストリーのドキュメントを参照してください。
以下のストレージオプションは、ファイルシステムドライバーで設定する必要があります。
サポートされている永続ストレージドライバーの詳細は、「永続ストレージの設定」および「永続ストレージの例」を参照してください。
3.2.5.1. 実稼働環境での使用
実稼働環境での使用の場合には、リモートボリュームを割り当てるか、または各自が選択した永続ストレージ方法を定義して使用します。
たとえば、既存の Persistent Volume Claim (永続ボリューム要求) を使用するには、以下を実行します。
$ oc volume deploymentconfigs/docker-registry --add --name=registry-storage -t pvc \ --claim-name=<pvc_name> --overwrite
テストにより、NFS サーバーを RHEL でコンテナーレジストリーのストレージバックエンドとして使用することに関する問題が検出されています。これには、OpenShift Container Registry および Quay が含まれます。そのため、コアサービスで使用される PV をサポートするために NFS を使用することは推奨されていません。
他の NFS の実装ではこれらの問題が検出されない可能性があります。OpenShift コアコンポーネントに対して実施された可能性のあるテストに関する詳細情報は、個別の NFS 実装ベンダーにお問い合わせください。
3.2.5.1.1. Amazon S3 をストレージのバックエンドとして使用する
Amazon Simple Storage Service のストレージを内部 Docker レジストリーと共に使用する方法もあります。Amazon Simple Storage Service は AWS マネジメントコンソールで管理できるセキュアなクラウドストレージです。これを使用するには、レジストリーの設定ファイルを手動で編集し、レジストリー Pod にマウントする必要があります。ただし、設定を開始する前にアップストリームの推奨される手順を確認してください。
デフォルトの YAML 設定ファイルをベースとして取得し、storageセクションのfilesystemエントリーを、以下のように s3 エントリーに置き換えます。これにより、ストレージのセクションは以下のようになります。
storage: cache: layerinfo: inmemory delete: enabled: true s3: accesskey: awsaccesskey 1 secretkey: awssecretkey 2 region: us-west-1 regionendpoint: http://myobjects.local bucket: bucketname encrypt: true keyid: mykeyid secure: true v4auth: false chunksize: 5242880 rootdirectory: /s3/object/name/prefix
s3 のすべての設定オプションは、アップストリームのドライバー参照ドキュメントに記載されています。
レジストリー設定を上書きすると、設定ファイルを Pod にマウントするための追加の手順に進みます。
レジストリーが S3 ストレージのバックエンドで実行されると、問題が報告されます。
3.2.5.2. 非実稼働環境での使用
非実稼働環境の場合、--mount-host=<path>
オプションを使って、永続ストレージに使用するレジストリーのディレクトリーを指定します。次に、レジストリーのボリュームがホストのマウントとして、指定された <path>
に作成されます。
--mount-host
オプションは、レジストリーのコンテナーが実行されているノードからディレクトリーをマウントします。docker-registry デプロイメント設定をスケールアップすると、レジストリー Pod とコンテナーが別々のノードで実行され、2 つ以上のレジストリーコンテナーがそれぞれのローカルストレージと共に作成される可能性があります。これは予期しない動作を生じさせます。その後に繰り返される同一イメージのプル要求が最終的に到達するコンテナーによっては必ずしも成功しない場合があるためです。
--mount-host
オプションは、レジストリーコンテナーを特権モードで実行することを要求します。この要求は、ユーザーが --mount-host
を指定すると自動的に有効にされます。ただしデフォルトでは、すべての Pod が特権付きコンテナー を実行できる訳ではありません。それでもこのオプションの使用する必要がある場合は、レジストリーを作成してから、レジストリーがインストール時に作成された registry サービスアカウントを使用するように指定してください。
$ oc adm registry --service-account=registry \ --config=/etc/origin/master/admin.kubeconfig \ --images='registry.access.redhat.com/openshift3/ose-${component}:${version}' \ --mount-host=<path>
Docker レジストリー Pod は、ユーザー 1001 として実行されます。このユーザーは、ホストのディレクトリーへの書き込みができなければなりません。したがって、以下のコマンドでディレクトリーの所有権をユーザー ID 1001 に変更する必要がある場合があります。
$ sudo chown 1001:root <path>
3.2.6. レジストリーコンソールの有効化
OpenShift Container Platform は、統合レジストリーへの Web ベースのインターフェースを提供します。このレジストリーコンソールは、イメージの参照と管理を行うためのオプションのコンポーネントであり、Pod として実行されるステートレスサービスとしてデプロイされます。
OpenShift Container Platform をスタンドアロンレジストリーとしてインストールした場合、レジストリーコンソールはインストール時にすでにデプロイされ、そのセキュリティーが自動的に保護されています。
Cockpit がすでに実行されている場合、レジストリーコンソールとのポート競合 (デフォルトでは9090) を避けるために、次に進む前にこれをシャットダウンする必要があります。
3.2.6.1. レジストリーコンソールのデプロイ
最初にレジストリーを公開しておく必要があります。
デフォルトのプロジェクトにパススルールートを作成します。このルートは、以下の手順でレジストリーコンソールのアプリケーションを作成する際に必要になります。
$ oc create route passthrough --service registry-console \ --port registry-console \ -n default
レジストリーコンソールのアプリケーションをデプロイします。
<openshift_oauth_url>
を OpenShift Container Platform OAuth プロバイダー の URL に置き換えます。通常これはマスターになります。$ oc new-app -n default --template=registry-console \ -p OPENSHIFT_OAUTH_PROVIDER_URL="https://<openshift_oauth_url>:8443" \ -p REGISTRY_HOST=$(oc get route docker-registry -n default --template='{{ .spec.host }}') \ -p COCKPIT_KUBE_URL=$(oc get route registry-console -n default --template='https://{{ .spec.host }}')
注記レジストリーコンソールへのログインの試行時にリダイレクト URL が間違っていた場合は、
oc get oauthclients
で OAuth クライアントを確認してください。- 最後に、Webブラウザを使用してルートURIを使用してコンソールを表示します。
3.2.6.2. レジストリーコンソールのセキュリティー保護
デフォルトでは、レジストリーコンソールは、レジストリーコンソールのデプロイの手順ごとに手動でデプロイされる場合に自己署名 TLS 証明書を生成します。詳細は、「レジストリーコンソールのトラブルシューティング」を参照してください。
組織の署名済み証明書をシークレットボリュームとして追加する際には、以下の手順に従ってください。ここでは、証明書が oc
クライアントホストで利用可能であることを前提としています。
証明書とキーを含む .cert ファイルを作成します。以下を使用してファイルをフォーマットします。
- サーバー証明書と中間証明機関のための 1 つ以上数の BEGIN CERTIFICATE ブロック。
キーの BEGIN PRIVATE KEY または同種のものを含むブロック。キーは暗号化することができません。
例を以下に示します。
-----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIJAPXW+CuNYS6QMA0GCSqGSIb3DQEBCwUAMD8xKTAnBgNV BAoMIGI0OGE2NGNkNmMwNTQ1YThhZTgxOTEzZDE5YmJjMmRjMRIwEAYDVQQDDAls ... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIJAPXW+CuNYS6QMA0GCSqGSIb3DQEBCwUAMD8xKTAnBgNV BAoMIGI0OGE2NGNkNmMwNTQ1YThhZTgxOTEzZDE5YmJjMmRjMRIwEAYDVQQDDAls ... -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyOJ5garOYw0sm 8TBCDSqQ/H1awGMzDYdB11xuHHsxYS2VepPMzMzryHR137I4dGFLhvdTvJUH8lUS ... -----END PRIVATE KEY-----
セキュリティーの保護されたレジストリーには、以下の SAN (サブジェクトの別名: Subject Alternative Names) 一覧が含まれているはずです。
2 つのサービスのホスト名。
例を以下に示します。
docker-registry.default.svc.cluster.local docker-registry.default.svc
サービス IP アドレス。
例を以下に示します。
172.30.124.220
以下のコマンドを使って Docker レジストリーのサービス IP アドレスを取得します。
oc get service docker-registry --template='{{.spec.clusterIP}}'
パブリックホスト名。
例を以下に示します。
docker-registry-default.apps.example.com
以下のコマンドを使って Docker レジストリーのパブリックホスト名を取得します。
oc get route docker-registry --template '{{.spec.host}}'
たとえば、サーバー証明書には以下のような SAN の詳細が記載されるはずです。
X509v3 Subject Alternative Name: DNS:docker-registry-public.openshift.com, DNS:docker-registry.default.svc, DNS:docker-registry.default.svc.cluster.local, DNS:172.30.2.98, IP Address:172.30.2.98
レジストリーコンソールは、証明書を /etc/cockpit/ws-certs.d ディレクトリーから読み込み、拡張子 .cert が付いたファイルをアルファベット順で (最後から) 使用します。したがって .cert ファイルには、 OpenSSL スタイルでフォーマットされた PEM ブロックが少なくとも 2 つ含まれている必要があります。
証明書がない場合、自己署名証明書が
openssl
コマンドで作成され、0-self-signed.cert ファイルに保存されます。
シークレットを作成します。
$ oc create secret generic console-secret \ --from-file=/path/to/console.cert
このシークレットを registry-console デプロイメント設定に追加します。
$ oc volume dc/registry-console --add --type=secret \ --secret-name=console-secret -m /etc/cockpit/ws-certs.d
これにより、レジストリーコンソールの新規デプロイメントがトリガーされ、署名済み証明書が組み込まれます。
3.2.6.3. レジストリーコンソールのトラブルシューティング
3.2.6.3.1. デバッグモード
レジストリーコンソールのデバッグモードは環境変数を使用して有効にされます。以下のコマンドは、レジストリーコンソールをデバッグモードで再デプロイします。
$ oc set env dc registry-console G_MESSAGES_DEBUG=cockpit-ws,cockpit-wrapper
デバッグモードを有効にすると、より詳細なログがレジストリーコンソールの Pod ログに表示されます。
3.2.6.3.2. SSL 証明書パスの表示
レジストリーコンソールが使用している証明書を確認するには、コマンドをコンソール Pod から実行します。
デフォルト のプロジェクトに Pod を一覧表示して、レジストリーコンソールの Pod 名を検索します。
$ oc get pods -n default NAME READY STATUS RESTARTS AGE registry-console-1-rssrw 1/1 Running 0 1d
直前のコマンドで取得した Pod 名を使って、cockpit-ws プロセスが使用している証明書パスを取得します。以下は、自動生成された証明書を使用しているコンソールの例です。
$ oc exec registry-console-1-rssrw remotectl certificate certificate: /etc/cockpit/ws-certs.d/0-self-signed.cert
3.3. レジストリーへのアクセス
3.3.1. ログの表示
Docker レジストリーのログを表示するには、デプロイメント設定で oc logs
コマンドを使用します。
$ oc logs dc/docker-registry 2015-05-01T19:48:36.300593110Z time="2015-05-01T19:48:36Z" level=info msg="version=v2.0.0+unknown" 2015-05-01T19:48:36.303294724Z time="2015-05-01T19:48:36Z" level=info msg="redis not configured" instance.id=9ed6c43d-23ee-453f-9a4b-031fea646002 2015-05-01T19:48:36.303422845Z time="2015-05-01T19:48:36Z" level=info msg="using inmemory layerinfo cache" instance.id=9ed6c43d-23ee-453f-9a4b-031fea646002 2015-05-01T19:48:36.303433991Z time="2015-05-01T19:48:36Z" level=info msg="Using OpenShift Auth handler" 2015-05-01T19:48:36.303439084Z time="2015-05-01T19:48:36Z" level=info msg="listening on :5000" instance.id=9ed6c43d-23ee-453f-9a4b-031fea646002
3.3.2. ファイルストレージ
タグとイメージメタデータは OpenShift Container Platform に格納されますが、レジストリーは、レイヤーと署名データを /registry にあるレジストリーコンテナーにマウントされているボリュームに格納します。oc exec
は特権付きコンテナーでは機能しないため、レジストリーの内容を確認するには、レジストリー Pod のコンテナーを格納しているノードに対して SSH を手動で実行し、コンテナー自体で docker exec
を実行します。
現在の Pod を一覧表示し、Docker レジストリーの Pod 名を検索します。
# oc get pods
次に、
oc describe
を使用して、コンテナーを実行しているノードのホスト名を検索します。# oc describe pod <pod_name>
必要なノードにログインします。
#ssh node.example.com
ノードホストのデフォルトプロジェクトから実行中のコンテナーを一覧表示し、Docker レジストリーのコンテナー ID を特定します。
#docker ps --filter = name = registry_docker-registry。* _ default_
oc rsh
コマンドを使用してレジストリーの内容を一覧表示します。# oc rsh dc/docker-registry find /registry /registry/docker /registry/docker/registry /registry/docker/registry/v2 /registry/docker/registry/v2/blobs 1 /registry/docker/registry/v2/blobs/sha256 /registry/docker/registry/v2/blobs/sha256/ed /registry/docker/registry/v2/blobs/sha256/ed/ede17b139a271d6b1331ca3d83c648c24f92cece5f89d95ac6c34ce751111810 /registry/docker/registry/v2/blobs/sha256/ed/ede17b139a271d6b1331ca3d83c648c24f92cece5f89d95ac6c34ce751111810/data 2 /registry/docker/registry/v2/blobs/sha256/a3 /registry/docker/registry/v2/blobs/sha256/a3/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4 /registry/docker/registry/v2/blobs/sha256/a3/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4/data /registry/docker/registry/v2/blobs/sha256/f7 /registry/docker/registry/v2/blobs/sha256/f7/f72a00a23f01987b42cb26f259582bb33502bdb0fcf5011e03c60577c4284845 /registry/docker/registry/v2/blobs/sha256/f7/f72a00a23f01987b42cb26f259582bb33502bdb0fcf5011e03c60577c4284845/data /registry/docker/registry/v2/repositories 3 /registry/docker/registry/v2/repositories/p1 /registry/docker/registry/v2/repositories/p1/pause 4 /registry/docker/registry/v2/repositories/p1/pause/_manifests /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions/sha256 /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions/sha256/e9a2ac6418981897b399d3709f1b4a6d2723cd38a4909215ce2752a5c068b1cf /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions/sha256/e9a2ac6418981897b399d3709f1b4a6d2723cd38a4909215ce2752a5c068b1cf/signatures 5 /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions/sha256/e9a2ac6418981897b399d3709f1b4a6d2723cd38a4909215ce2752a5c068b1cf/signatures/sha256 /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions/sha256/e9a2ac6418981897b399d3709f1b4a6d2723cd38a4909215ce2752a5c068b1cf/signatures/sha256/ede17b139a271d6b1331ca3d83c648c24f92cece5f89d95ac6c34ce751111810 /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions/sha256/e9a2ac6418981897b399d3709f1b4a6d2723cd38a4909215ce2752a5c068b1cf/signatures/sha256/ede17b139a271d6b1331ca3d83c648c24f92cece5f89d95ac6c34ce751111810/link 6 /registry/docker/registry/v2/repositories/p1/pause/_uploads 7 /registry/docker/registry/v2/repositories/p1/pause/_layers 8 /registry/docker/registry/v2/repositories/p1/pause/_layers/sha256 /registry/docker/registry/v2/repositories/p1/pause/_layers/sha256/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4 /registry/docker/registry/v2/repositories/p1/pause/_layers/sha256/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4/link 9 /registry/docker/registry/v2/repositories/p1/pause/_layers/sha256/f72a00a23f01987b42cb26f259582bb33502bdb0fcf5011e03c60577c4284845 /registry/docker/registry/v2/repositories/p1/pause/_layers/sha256/f72a00a23f01987b42cb26f259582bb33502bdb0fcf5011e03c60577c4284845/link
- 1
- このディレクトリーには、すべてのレイヤーと署名が Blob として格納されます。
- 2
- このファイルには、Blob の内容が含まれます。
- 3
- このディレクトリーには、すべてのイメージリポジトリーが格納されます。
- 4
- このディレクトリーは単一イメージリポジトリーの p1/pause 用です。
- 5
- このディレクトリーには、特定のイメージマニフェストリビジョンの署名が含まれます。
- 6
- このファイルには、Blob (署名データを含む) への参照が含まれます。
- 7
- このディレクトリーには、指定されたリポジトリーに対して現在アップロードされステージングされているすべてのレイヤーが含まれます。
- 8
- このディレクトリーには、このリポジトリーが参照するすべてのレイヤーへのリンクが含まれます。
- 9
- このファイルには、イメージを介してこのリポジトリーにリンクされている特定のレイヤーへの参照が含まれます。
3.3.3. レジストリーへの直接アクセス
さらに高度な使用方法として、レジストリーに直接アクセスし、docker
コマンドを起動することが可能です。これにより、docker push
や docker pull
などの操作で直接イメージをプッシュするか、または統合レジストリーからイメージをプルすることができます。これを実行するには、docker login
コマンドを使ってレジストリーにログインしている必要があります。実行できる操作は、以下のセクションで説明されているようにユーザーが持つ権限によって異なります。
3.3.3.1. ユーザーの前提条件
レジストリーに直接アクセスするには、使用するユーザーが、使用目的に応じて以下の前提条件を満たしている必要があります。
直接アクセスするには、ユーザーは選択するアイデンティティープロバイダーの通常ユーザーである必要があります。通常ユーザーは、レジストリーへのログインに必要なアクセストークンを生成できます。system:admin などのシステムユーザーはアクセストークンを取得できないため、レジストリーに直接アクセスすることはできません。
たとえば
HTPASSWD
認証を使用している場合は、以下のコマンドを使用してこれを作成することができます。# htpasswd /etc/origin/openshift-htpasswd <user_name>
docker pull
コマンドを使用する場合などにイメージをプルするには、ユーザーに registry-viewer ロールがなければなりません。このロールを追加するには、以下を実行します。$ oc policy add-role-to-user registry-viewer <user_name>
イメージの書き出しやプッシュを実行するには (
docker push
コマンドを使用する場合など)、ユーザーに registry-editor ロールが必要です。このロールを追加するには、以下を実行します。$ oc policy add-role-to-user registry-editor <user_name>
ユーザーパーミッションに関する詳細は、「ロールバインディングの管理」を参照してください。
3.3.3.2. レジストリーへのログイン
ユーザーが、レジストリーに直接アクセスできるための前提条件を満たしていることを確認してください。
レジストリーに直接ログインするには、以下を実行します。
OpenShift Container Platform に通常ユーザーとしてログインしていることを確認します。
$ oc login
アクセストークンを使用して Docker レジストリーにログインします。
docker login -u openshift -p $(oc whoami -t) <registry_ip>:<port>
ユーザー名の任意の値を渡すことができ、トークンには必要な情報がすべて含まれます。コロンを含むユーザー名を渡すとログインに失敗します。
3.3.3.3. イメージのプッシュとプル
レジストリーにログインすると、レジストリーに docker pull
および docker push
操作を実行できます。
任意のイメージをプルできますが、system:registry ロールを追加している場合は、各自のプロジェクトにあるレジストリーにのみイメージをプッシュすることができます。
以下の例では、以下を使用します。
コンポーネント |
値 |
<registry_ip> |
|
<port> |
|
<project> |
|
<image> |
|
<tag> |
省略 (デフォルトは |
任意のイメージをプルします。
$ docker pull docker.io/busybox
新規イメージに
<registry_ip>:<port>/<project>/<image>
形式でタグ付けします。プロジェクト名は、イメージを正しくレジストリーに配置し、これに後でアクセスできるようにするには OpenShift Container Platform のプル仕様に必ず表示されている必要があります。$ dockerタグdocker.io/busybox 172.30.124.220:5000/openshift/busybox
注記通常ユーザーには、指定されたプロジェクトの system:image-builder ロールが必要です。このロールにより、ユーザーはイメージの書き出しやプッシュを実行できます。このロールが設定されていない場合には以下の手順の
docker push
が失敗します。新規プロジェクトを作成して busybox イメージをプッシュしてみることができます。新しくタグ付けされたイメージをレジストリーにプッシュします。
$ docker push 172.30.124.220:5000/openshift/busybox ... cf2616975b4a: Image successfully pushed Digest: sha256:3662dd821983bc4326bee12caec61367e7fb6f6a3ee547cbaff98f77403cab55
3.3.4. レジストリーメトリクスへのアクセス
OpenShift Container レジストリーは、Prometheus メトリクス のエンドポイントを提供します。Prometheus はスタンドアロンのオープンソースシステムのモニタリングおよびアラートツールキットです。
メトリクスはレジストリーのエンドポイントの /extensions/v2/metrics パスに公開されます。ただし、このルートは最初に有効にされている必要があります。有効化の方法については、「レジストリー設定の拡張」を参照してください。
以下は、メトリクスクエリーの簡単な例です。
$ curl -s -u <user>:<secret> \ 1
http://172.30.30.30:5000/extensions/v2/metrics | grep openshift | head -n 10
# HELP openshift_build_info A metric with a constant '1' value labeled by major, minor, git commit & git version from which OpenShift was built.
# TYPE openshift_build_info gauge
openshift_build_info{gitCommit="67275e1",gitVersion="v3.6.0-alpha.1+67275e1-803",major="3",minor="6+"} 1
# HELP openshift_registry_request_duration_seconds Request latency summary in microseconds for each operation
# TYPE openshift_registry_request_duration_seconds summary
openshift_registry_request_duration_seconds{name="test/origin-pod",operation="blobstore.create",quantile="0.5"} 0
openshift_registry_request_duration_seconds{name="test/origin-pod",operation="blobstore.create",quantile="0.9"} 0
openshift_registry_request_duration_seconds{name="test/origin-pod",operation="blobstore.create",quantile="0.99"} 0
openshift_registry_request_duration_seconds_sum{name="test/origin-pod",operation="blobstore.create"} 0
openshift_registry_request_duration_seconds_count{name="test/origin-pod",operation="blobstore.create"} 5
高度なクエリーと推奨されるビジュアライザーについては、アップストリームの Prometheus ドキュメントを参照してください。
3.4. レジストリーのセキュリティー保護および公開
3.4.1. 概要
デフォルトでは、OpenShift Container Platform レジストリーは、TLS 経由でトラフィックを提供できるようクラスターのインストール時にセキュリティー保護されます。サービスを外部に公開するために、パススルールートもデフォルトで作成されます。
何らかの理由でレジストリーが保護されていないか、または公開されていない場合は、これらを手動で実行する方法について以下のセクションを参照してください。
3.4.2. レジストリーを手動でセキュリティー保護する
レジストリーを手動でセキュリティー保護して TLS 経由でトラフィックを処理するには、以下を実行します。
- レジストリーをデプロイします。
レジストリーのサービス IP とポートを取得します。
$ oc get svc/docker-registry NAME LABELS SELECTOR IP(S) PORT(S) docker-registry docker-registry=default docker-registry=default 172.30.124.220 5000/TCP
既存のサーバー証明書を使用するか、またはキーと、指定された CA で署名された指定 IP およびホスト名に有効なサーバー証明書を作成します。レジストリーのサービス IP と docker-registry.default.svc.cluster.local ホスト名のサーバー証明書を作成するには、Ansible ホストインベントリーファイル (デフォルトでは /etc/ansible/hosts) に一覧表示されている最初のマスターから以下のコマンドを実行します。
$ oc adm ca create-server-cert \ --signer-cert=/etc/origin/master/ca.crt \ --signer-key=/etc/origin/master/ca.key \ --signer-serial=/etc/origin/master/ca.serial.txt \ --hostnames='docker-registry.default.svc.cluster.local,docker-registry.default.svc,172.30.124.220' \ --cert=/etc/secrets/registry.crt \ --key=/etc/secrets/registry.key
ルーターを外部に公開する場合、公開ルートのホスト名を
--hostnames
フラグに追加します。--hostnames='mydocker-registry.example.com,docker-registry.default.svc.cluster.local,172.30.124.220 \
ルートを外部にアクセス可能にするためにデフォルトの証明書を更新する際のその他詳細については、「レジストリーとルーター証明書の再デプロイ」を参照してください。
注記oc adm ca create-server-cert
コマンドは、2 年間有効な証明書を生成します。この期間は--expire-days
オプションを使って変更することができますが、セキュリティー上の理由から、値をこれより大きくすることは推奨されません。レジストリー証明書のシークレットを作成します。
$ oc create secret generic registry-certificates \ --from-file=/etc/secrets/registry.crt \ --from-file=/etc/secrets/registry.key
シークレットをレジストリー Pod のサービスアカウント (デフォルトのサービスアカウントなど) に追加します。
$ oc secrets link registry registry-certificates $ oc secrets link default registry-certificates
注記シークレットをそれを参照しているサービスアカウントのみに制限することは、デフォルトで無効にされています。つまり、マスターの設定ファイルで
serviceAccountConfig.limitSecretReferences
がfalse
(デフォルトの設定) に設定されている場合、シークレットをサービスにリンクさせる必要はありません。docker-registry
サービスを一時停止します。$ oc rollout pause dc / docker-registry
シークレットボリュームをレジストリーのデプロイメント設定に追加します。
$ oc volume dc/docker-registry --add --type=secret \ --secret-name=registry-certificates -m /etc/secrets
以下の環境変数をレジストリーのデプロイメント設定に追加して TLS を有効にします。
$ oc set env dc/docker-registry \ REGISTRY_HTTP_TLS_CERTIFICATE=/etc/secrets/registry.crt \ REGISTRY_HTTP_TLS_KEY=/etc/secrets/registry.key
詳細は、「Docker ドキュメントのレジストリーの設定」セクションを参照してください。
レジストリーの liveness probe に使用されているスキームを HTTP から HTTPS に更新します。
$ oc patch dc/docker-registry -p '{"spec": {"template": {"spec": {"containers":[{ "name":"registry", "livenessProbe": {"httpGet": {"scheme":"HTTPS"}} }]}}}}'
レジストリーを OpenShift Container Platform 3.2 以降に初めてデプロイした場合は、レジストリーの readiness probe として使用されているスキームを HTTP から HTTPS に更新します。
$ oc patch dc/docker-registry -p '{"spec": {"template": {"spec": {"containers":[{ "name":"registry", "readinessProbe": {"httpGet": {"scheme":"HTTPS"}} }]}}}}'
docker-registry
サービスを再開します。$ oc rollout dc / docker-registryを再開する
レジストリーが TLS モードで実行されていることを検証します。最後の docker-registry のデプロイメントが完了するまで待機し、Docker ログでレジストリーコンテナーを確認します。
listening on :5000, tls
のエントリーが見つかるはずです。$ oc logs dc/docker-registry | grep tls time="2015-05-27T05:05:53Z" level=info msg="listening on :5000, tls" instance.id=deeba528-c478-41f5-b751-dc48e4935fc2
CA 証明書を Docker 証明書ディレクトリーにコピーします。これはクラスター内のすべてのノードで実行する必要があります。
$ dcertsdir=/etc/docker/certs.d $ destdir_addr=$dcertsdir/172.30.124.220:5000 $ destdir_name=$dcertsdir/docker-registry.default.svc.cluster.local:5000 $ sudo mkdir -p $destdir_addr $destdir_name $ sudo cp ca.crt $destdir_addr 1 $ sudo cp ca.crt $destdir_name
- 1
- ca.crt ファイルは、マスター上の /etc/origin/master/ca.crt のコピーです。
認証を使用している場合、
docker
のバージョンによっては、OS レベルで証明書を信頼するようにクラスターを設定することも必要になります。証明書をコピーします。
$ cp /etc/origin/master/ca.crt /etc/pki/ca-trust/source/anchors/myregistrydomain.com.crt
以下を実行します。
$ update-ca-trust enable
/etc/sysconfig/docker ファイルのこの特定のレジストリーに対してのみ、
--insecure-registry
オプションを削除します。次にデーモンを再度読み込み、 docker サービスを再起動して設定の変更を反映させます。$ sudo systemctl daemon-reload $ sudo systemctl restart docker
docker
クライアント接続を検証します。レジストリーに対するdocker push
、またはレジストリーからのdocker pull
が正常に実行されるはずです。必ずこのレジストリーにログインしていることを確認してください。$ docker tag|push <registry/image> <internal_registry/project/image>
例を以下に示します。
$ docker pull busybox $ docker tag docker.io/busybox 172.30.124.220:5000/openshift/busybox $ docker push 172.30.124.220:5000/openshift/busybox ... cf2616975b4a: Image successfully pushed Digest: sha256:3662dd821983bc4326bee12caec61367e7fb6f6a3ee547cbaff98f77403cab55
3.4.3. セキュアなレジストリーの手動による公開
OpenShift Container Platform レジストリーに OpenShift Container Platform クラスター内からログインする代わりに、最初にレジストリーのセキュリティーを保護し、それをルートで公開しておくことによって、これに外部からアクセスすることも可能です。この方法を使うと、ルートアドレスを使ってクラスターの外部からレジストリーにログインし、ルートのホストを使ってイメージにタグ付けしたり、イメージをプッシュしたりできます。
以下の前提条件に関するそれぞれの手順は、標準的なクラスターのインストール時にデフォルトで実行されます。これが実行されていない場合は、手動で実行してください。
パススルールートは、クラスターの初回インストール時にこのレジストリーについてデフォルトで作成されている必要があります。
ルートが存在するかどうかを確認します。
$ oc get route/docker-registry -o yaml apiVersion: v1 kind: Route metadata: name: docker-registry spec: host: <host> 1 to: kind: Service name: docker-registry 2 tls: termination: passthrough 3
注記Re-encrypt ルートはセキュアなレジストリーを公開するためにもサポートされています。
ルートが存在していない場合、
oc create route passthrough
コマンドで、レジストリーをルートのサービスとして指定してルートを作成します。デフォルトでは、作成したルートの名前はサービス名と同じです。docker-registry サービスの詳細を取得します。
$ oc get svc NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE docker-registry 172.30.69.167 <none> 5000/TCP docker-registry=default 4h kubernetes 172.30.0.1 <none> 443/TCP,53/UDP,53/TCP <none> 4h router 172.30.172.132 <none> 80/TCP router=router 4h
ルートを作成します。
$ oc create route passthrough \ --service=docker-registry \1 --hostname=<host> route "docker-registry" created 2
次に、ホストシステム上のレジストリーに使用されている証明書を信頼し、ホストによるイメージのプッシュおよびプルを許可する必要があります。参照される証明書は、レジストリーのセキュリティー保護を実行したときに作成されたものです。
$ sudo mkdir -p /etc/docker/certs.d/<host> $ sudo cp <ca_certificate_file> /etc/docker/certs.d/<host> $ sudo systemctl restart docker
レジストリーのセキュリティー保護の実行時に得られた情報を使ってレジストリーにログインします。ただし、ここではサービス IP ではなくルートで使用されているホスト名を指定します。セキュリティーが保護され、公開されているレジストリーにログインする際は、必ず
docker login
コマンドのレジストリーを指定してください。# docker login -e user@company.com \ -u f83j5h6 \ -p Ju1PeM47R0B92Lk3AZp-bWJSck2F7aGCiZ66aFGZrs2 \ <host>
これでルートのホストを使ってイメージのタグ付けとプッシュを実行できます。たとえば、
test
という名前のプロジェクトにあるbusybox
イメージをタグ付けし、プッシュするには、以下を実行します。$ oc get imagestreams -n test NAME DOCKER REPO TAGS UPDATED $ docker pull busybox $ docker tag busybox <host>/test/busybox $ docker push <host>/test/busybox The push refers to a repository [<host>/test/busybox] (len: 1) 8c2e06607696: Image already exists 6ce2e90b0bc7: Image successfully pushed cf2616975b4a: Image successfully pushed Digest: sha256:6c7e676d76921031532d7d9c0394d0da7c2906f4cb4c049904c4031147d8ca31 $ docker pull <host>/test/busybox latest: Pulling from <host>/test/busybox cf2616975b4a: Already exists 6ce2e90b0bc7: Already exists 8c2e06607696: Already exists Digest: sha256:6c7e676d76921031532d7d9c0394d0da7c2906f4cb4c049904c4031147d8ca31 Status: Image is up to date for <host>/test/busybox:latest $ oc get imagestreams -n test NAME DOCKER REPO TAGS UPDATED busybox 172.30.11.215:5000/test/busybox latest 2 seconds ago
注記イメージストリームにはルート名とポートではなく、レジストリーサービスの IP アドレスとポートが設定されます。詳細は
oc get imagestreams
を参照してください。
3.4.4. 非セキュアなレジストリーを手動で公開する
レジストリーのセキュリティーを確保してレジストリーを公開する代わりに、OpenShift Container Platform の非稼働環境に、セキュアでないレジストリーを簡単に公開できます。これにより、SSL 証明書を使用せずにレジストリーへの外部ルートを作成することができます。
非実稼働環境以外では、非セキュアなレジストリーを外部アクセスに公開すべきではありません。
非セキュアなレジストリーを公開するには、以下を実行します。
レジストリーを公開します。
# oc expose service docker-registry --hostname=<hostname> -n default
以下の JSON ファイルが作成されます。
apiVersion: v1 kind: Route metadata: creationTimestamp: null labels: docker-registry: default name: docker-registry spec: host: registry.example.com port: targetPort: "5000" to: kind: Service name: docker-registry status: {}
ルートが正常に作成されたことを確認します。
# oc get route NAME HOST/PORT PATH SERVICE LABELS INSECURE POLICY TLS TERMINATION docker-registry registry.example.com docker-registry docker-registry=default
レジストリーの健全性を確認します。
$ curl -v http://registry.example.com/healthz
HTTP 200 / OK メッセージが表示されるはずです。
レジストリーを公開したら、ポート番号を
OPTIONS
エントリーに追加して /etc/sysconfig/docker ファイルを更新します。以下は例になります。OPTIONS='--selinux-enabled --insecure-registry=172.30.0.0/16 --insecure-registry registry.example.com:80'
重要上記のオプションは、ログインしようとしているクライアントに追加してください。
また、Docker がクライアント上で実行されていることも確認してください。
公開されている非セキュアなレジストリーにログインする際に、docker login
コマンドでレジストリーを指定していることを確認します。以下は例になります。
# docker login -e user@company.com \ -u f83j5h6 \ -p Ju1PeM47R0B92Lk3AZp-bWJSck2F7aGCiZ66aFGZrs2 \ <host>
3.5. レジストリー設定の拡張
3.5.1. レジストリー IP アドレスの維持
OpenShift Container Platform はサービス IP アドレスによって統合レジストリーを参照します。したがって docker-registry サービスを削除し、再作成しようとする場合、古い IP アドレスを新しいサービスで再利用するように調整すると、完全に透過的な移行が可能になります。新規 IP アドレスを取得することが避けられない場合は、マスターのみを再起動してクラスターの中断を最小限に抑えられます。
- アドレスの再利用
- IP アドレスを再利用するには、古い docker-registry サービスの IP アドレスを削除する前に保存し、新たに割り当てられた IP アドレスを、新しい docker-registry サービスに保存されているアドレスに置き換えるように調整します。
サービスの
clusterIP
を書き留めておきます。$ oc get svc/docker-registry -o yaml | grep clusterIP:
サービスを削除します。
$ oc delete svc / docker-registry dc / docker-registry
レジストリーの定義を registry.yaml に作成し、
<options>
を、たとえば「非実稼働環境での使用」のセクションの手順 3 で使用されているものなどに置き換えます。$ oc adm registry <options> -o yaml > registry.yaml
-
registry.yaml を編集し、そこで
Service
を検索して、clusterIP
を手順 1 で書き留めたアドレスに変更します。 変更した registry.yaml を使ってレジストリーを作成します。
$ oc create -f registry.yaml
- マスターの再起動
IP アドレスを再利用できない場合、古い IP アドレスを含むプル仕様を使った操作は失敗します。クラスターの中断を最小限に抑えるには、マスターを再起動する必要があります。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers
これで、古い IP アドレスを含む古いレジストリー URL がキャッシュからクリアされます。
注記クラスター全体を再起動すると、Pod に不要なダウンタイムが発生し、実質、キャッシュのクリアが行われないので、これは推奨していません。
3.5.2. Docker レジストリーのホワイトリスト化
Docker レジストリーのホワイトリストを指定すると、OpenShift Container Platform ユーザーがダウンロードして入手できるイメージやテンプレートのセットをキュレートできます。このキュレートされたセットは、1 つまたは複数の Docker レジストリーに保管され、その後ホワイトリストに追加されます。ホワイトリストを使用する場合、OpenShift Container Platform からアクセスできるのは指定されたレジストリーのみで、その他すべてのレジストリーはデフォルトでアクセスが拒否されます。
ホワイトリストを設定するには、以下を実行します。
/etc/sysconfig/docker ファイルを編集し、すべてのレジストリーをブロックします。
BLOCK_REGISTRY = ' - ブロックレジストリ=すべて'
BLOCK_REGISTRY
行のコメント解除が必要となる場合があります。同じファイルで、アクセスを許可するレジストリーを追加します。
ADD_REGISTRY='--add-registry=<registry1> --add-registry=<registry2>'
レジストリーへのアクセスの許可
ADD_REGISTRY = ' - add-registry = registry.access.redhat.com'
上記の例では、Red Hat カスタマーポータルで入手できるイメージへのアクセスを制限しています。
ホワイトリストが設定されると、ホワイトリストにない Docker レジストリーからプルしようとすると、許可されていないレジストリーであることを示すエラーメッセージが表示されます。
3.5.3. レジストリーのホスト名の設定
内部参照と外部参照の両方でレジストリが認識されるホスト名とポートを構成できます。これにより、イメージストリームは画像のホスト名ベースのプッシュ/プル仕様を提供し、イメージのコンシューマはレジストリサービスのIPからの変更から隔離され、イメージストリームとその参照がクラスタ間で移植可能になる可能性があります。
クラスター内でレジストリーを参照するために使用されるホスト名を設定するには、マスター設定ファイルの imagePolicyConfig
セクションで internalRegistryHostname
を設定します。外部のホスト名は、同じ場所で externalRegistryHostname
の値を設定することで管理されます。
イメージポリシーの設定
imagePolicyConfig: internalRegistryHostname: docker-registry.default.svc.cluster.local:5000 externalRegistryHostname: docker-registry.mycompany.com
レジストリー自体は、同じ内部ホスト名の値で設定する必要があります。これは、レジストリーのデプロイメント設定で REGISTRY_OPENSHIFT_SERVER_ADDR
環境変数を設定するか、またはレジストリー設定の OpenShift セクションで値を設定することで実行できます。
レジストリーで TLS を有効にしている場合、サーバー証明書にはレジストリーの参照に使用されるホスト名が含まれている必要があります。ホスト名をサーバー証明書に追加する方法については、「レジストリーのセキュリティー保護」を参照してください。
3.5.4. レジストリー設定の上書き
統合レジストリーのデフォルトの設定 (デフォルトでは実行中のレジストリーコンテナーの /config.yml にあります) は、独自の カスタム設定で上書きできます。
このファイルのアップストリームの設定オプションも環境変数を使って上書きできます。ミドルウェアのセクションは、環境変数を使って上書きできるオプションがごく少数であるため例外とします。特定の設定オプションを上書きする方法についてこちらを参照してください。
レジストリー設定ファイルの直接的な管理を可能にし、ConfigMap
を使って更新された設定をデプロイするには、以下を実行します。
- レジストリーをデプロイします。
必要に応じて、レジストリー設定ファイルをローカルで編集します。以下は、レジストリーにデプロイされている初期 YAML ファイルです。サポートされているオプションを確認してください。
レジストリー設定ファイル
version: 0.1 log: level: debug http: addr: :5000 storage: cache: blobdescriptor: inmemory filesystem: rootdirectory: /registry delete: enabled: true auth: openshift: realm: openshift middleware: registry: - name: openshift repository: - name: openshift options: acceptschema2: true pullthrough: true enforcequota: false projectcachettl: 1m blobrepositorycachettl: 10m storage: - name: openshift openshift: version: 1.0 metrics: enabled: false secret: <secret>
各ファイルの内容を保持する
ConfigMap
をこのディレクトリーに作成します。$ oc create configmap registry-config \ --from-file=</path/to/custom/registry/config.yml>/
registry-config ConfigMap をボリュームとしてレジストリーのデプロイメント設定に追加し、カスタム設定ファイルを /etc/docker/registry/ にマウントします。
$ oc volume dc/docker-registry --add --type=configmap \ --configmap-name=registry-config -m /etc/docker/registry/
以下の環境変数をレジストリーのデプロイメント設定に追加して、直前の手順の設定パスを参照するようにレジストリーを更新します。
$ oc set env dc/docker-registry \ REGISTRY_CONFIGURATION_PATH=/etc/docker/registry/config.yml
上記の手順は、必要な設定を行えるように繰り返し実行される場合があります。たとえば、トラブルシューティング時に、デバッグ モードに切り換えるよう設定が一時的に更新される場合があります。
既存の設定を更新するには、以下を実行します。
この手順を実行すると、現在デプロイされているレジストリー設定が上書きされます。
- ローカルのレジストリー設定ファイル config.yml を編集します。
registry-config configmap を削除します。
$ oc delete configmap registry-config
更新された設定ファイルを参照するよう configmap を再作成します。
$ oc create configmap registry-config\ --from-file=</path/to/custom/registry/config.yml>/
更新された設定を読み取るためにレジストリーを再デプロイします。
$ oc rollout latest docker-registry
設定ファイルをソース管理リポジトリーに保持します。
3.5.5. レジストリー設定の参照
アップストリームの docker ディストリビューションライブラリーでは、多数の設定オプションを利用できます。ただし、すべての設定オプションがサポートされているか、または有効にされているわけではありません。このセクションは、レジストリー設定を上書きする際の参考としてご利用ください。
このファイルのアップストリームの設定オプションも環境変数を使って上書きできます。ただし、ミドルウェアのセクションは、環境変数を使って上書きすることはできません。特定の設定オプションを上書きする方法についてこちらを参照してください。
3.5.5.1. ログ
アップストリームのオプションはサポートされています。
例:
log: level: debug formatter: text fields: service: registry environment: staging
3.5.5.2. フック
メールフックはサポートされていません。
3.5.5.3. ストレージ
以下のセクションでは、サポートされているレジストリーのストレージドライバーの一覧を示しています。詳細は、Docker レジストリーのドキュメントを参照してください。
次の一覧には、レジストリの構成ファイルで構成する必要があるストレージドライバが含まれています。
- ファイルシステム。ファイルシステムはデフォルトですので、設定の必要はありません。
- S3。詳細は、CloudFront の設定のドキュメントを参照してください。
- OpenStack Swift
- Google Cloud Storage (GCS)
- Microsoft Azure
- Aliyun OSS
レジストリーの一般的なストレージ設定オプションはサポートされています。詳細は、Docker レジストリーのドキュメントを参照してください。
以下のストレージオプションは、ファイルシステムドライバーで設定する必要があります。
サポートされている永続ストレージドライバーの詳細は、「永続ストレージの設定」および「永続ストレージの例」を参照してください。
一般的なストレージ構成オプション
storage:
delete:
enabled: true 1
redirect:
disable: false
cache:
blobdescriptor: inmemory
maintenance:
uploadpurging:
enabled: true
age: 168h
interval: 24h
dryrun: false
readonly:
enabled: false
- 1
- このエントリーは、イメージのプルーニングが正常に機能するために必須です。
3.5.5.4. 認証
認証オプションは変更することができません。openshift の拡張がサポートされている唯一のオプションです。
auth: openshift: realm: openshift
3.5.5.5. ミドルウェア
リポジトリーのミドルウェアの拡張を使用して、OpenShift Container Platform やイメージプロキシーとの対話を行う OpenShift Container Platform ミドルウェアの設定を行うことができます。
middleware: registry: - name: openshift 1 repository: - name: openshift 2 options: acceptschema2: true 3 pullthrough: true 4 mirrorpullthrough: true 5 enforcequota: false 6 projectcachettl: 1m 7 blobrepositorycachettl: 10m 8 storage: - name: openshift 9
- 1 2 9
- これらの入力は必須です。これらの入力によって必要なコンポーネントが読み込まれていることを確認できます。これらの値は変更しないでください。
- 3
- レジストリーへのプッシュ時に manifest schema v2 を格納できます。詳細は、こちらを参照してください。
- 4
- レジストリーがリモート Blob のプロキシーとして機能できるようにします。詳細は、 こちらを参照してください。
- 5
- レジストリーキャッシュの Blob がリモートレジストリーから提供されるようにし、その後の迅速なアクセスを可能にします。Blob の初回アクセス時にミラーリングが開始されます。このオプションは、プルスルーが無効にされている場合は機能しません。
- 6
- ターゲットに設定されているプロジェクトで定義されているサイズ制限を超える Blob のアップロードを防止します。
- 7
- レジストリーにキャッシュされている制限の有効期限のタイムアウト。値が小さいほど、制限の変更がレジストリーに伝播するまでの時間が短くなります。ただし、レジストリーは制限をサーバーからより頻繁に照会するため、結果としてプッシュは遅くなります。
- 8
- Blob とリポジトリー間の記憶されている関連付けの有効期限のタイムアウト。値が高いほどルックアップが高速になり、レジストリー操作がより効率的になる可能性が高くなります。一方、アクセスできなくなったユーザーにイメージレイヤーを提供するリスクと同様にメモリー使用量も上昇します。
3.5.5.5.1. CloudFront ミドルウェア
CloudFront ミドルウェア拡張は、CloudFront CDN ストレージプロバイダーである AWS をサポートするために追加することができます。CloudFront ミドルウェアは、イメージコンテンツの海外への配信を高速化します。Blob は世界中の複数のエッジロケーションに配信されます。クライアントは常に最小の待機時間でエッジにアクセスできます。
CloudFront ミドルウェア拡張を使用できるストレージは S3 ストレージのみです。また、使用できるのは Blob が提供されている間のみです。したがって、高速化できるのは Blob のダウンロードのみで、アップロードは高速化しません。
以下は、CloudFront ミドルウェアを含む S3 ストレージドライバーの最小限の設定例です。
version: 0.1 log: level: debug http: addr: :5000 storage: cache: blobdescriptor: inmemory delete: enabled: true s3: 1 accesskey: BJKMSZBRESWJQXRWMAEQ secretkey: 5ah5I91SNXbeoUXXDasFtadRqOdy62JzlnOW1goS region: us-east-1 bucket: docker.myregistry.com auth: openshift: realm: openshift middleware: registry: - name: openshift repository: - name: openshift storage: - name: cloudfront 2 options: baseurl: https://jrpbyn0k5k88bi.cloudfront.net/ 3 privatekey: /etc/docker/cloudfront-ABCEDFGHIJKLMNOPQRST.pem 4 keypairid: ABCEDFGHIJKLMNOPQRST 5 - name: openshift
- 1
- S3 ストレージは、CloudFront ミドルウェアに関係なく同じ方法で設定する必要があります。
- 2
- CloudFront ストレージミドルウェアは、OpenShift ミドルウェアより前に一覧表示される必要があります。
- 3
- CloudFront ベースの URL。AWS マネジメントコンソールでは、これは CloudFront ディストリビューションの Domain Name として一覧表示されます。
- 4
- AWS のプライベートキーが格納されているファイルシステムの場所。Amazon EC2 のキーペアと混同しないよう注意してください。信頼される署名者の CloudFront キーペアの作成については、AWS ドキュメントを参照してください。このファイルは、レジストリー Pod にシークレットとしてマウントする必要があります。
- 5
- CloudfrontキーペアのID。
3.5.5.5.2. ミドルウェア設定オプションの上書き
middleware セクションは、環境変数を使って上書きできません。ただし例外がいくつかあります。以下は例になります。
middleware: repository: - name: openshift options: acceptschema2: true 1 pullthrough: true 2 mirrorpullthrough: true 3 enforcequota: false 4 projectcachettl: 1m 5 blobrepositorycachettl: 10m 6
- 1
- ブール環境変数
REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_ACCEPTSCHEMA2
で上書きできる設定オプション。manifest schema v2 をマニフェストの Put 要求で 受け入れる機能を有効にします。認識される値はtrue
とfalse
(以下の他のすべてのブール変数に適用されます) になります。 - 2
- ブール環境変数
REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_PULLTHROUGH
で上書きできる設定オプション。リモートレジストリーのプロキシーモードを有効にします。 - 3
- ブール環境変数
REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_MIRRORPULLTHROUGH
で上書きできる設定オプション。リモート Blob が提供されている場合、レジストリーに対して Blob をローカルにミラーリングするように指示します。 - 4
- ブール環境変数
REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_ENFORCEQUOTA
で上書きできる設定オプション。クォータ実施をオンまたはオフにする機能を有効にします。デフォルトでは、クォータの実施はオフになっています。 - 5
- 環境変数
REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_PROJECTCACHETTL
で上書きできる設定オプション。プロジェクトのクォータオブジェクトのエビクションタイムアウトを指定します。有効な時間文字列 (例:2m
) を取ります。空白の場合は、デフォルトのタイムアウトが取得されます。ゼロ (0m
) の場合、キャッシングは無効にされます。 - 6
- 環境変数
REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_BLOBREPOSITORYCACHETTL
で上書きできる設定オプション。Blob と含まれているレポジトリーの関連付けについてのエビクションタイムアウトを指定します。値のフォーマットはprojectcachettl
のケースと同じです。
3.5.5.5.3. イメージのプルスルー
この機能を有効にすると、Blob がローカルに存在しない限り、レジストリーは要求された Blob をリモートレジストリーから取得しようと試みます。リモートの候補は、クライアントがプルする イメージストリームの状態で保存された DockerImage エントリーから算出されます。このエントリーのすべての固有のリモートレジストリーの参照は Blob が見つかるまで繰り返し試行されます。
プルスルーは、プルされているイメージのイメージストリームタグが存在する場合にのみ発生します。たとえば、プルされているイメージが docker-registry.default.svc:5000/yourproject/yourimage:prod
である場合、レジストリーは、プロジェクト yourproject
で yourimage:prod
という名前のイメージストリームタグを検索します。タグが見つかると、レジストリーはそのイメージストリームタグに関連付けられた dockerImageReference
を使ってイメージのプルを試行します。
プルスルーを実行すると、レジストリーは、参照されているイメージストリームタグに関連付けられたプロジェクトにあるプル認証情報を使用します。また、この機能を使用すると、ユーザーは、イメージを参照しているイメージストリームタグにアクセスできる限り、アクセスに必要な認証情報を持たないレジストリーのイメージをプルすることができます。
使用しているレジストリーに、プルスルーの実行対象である外部レジストリーを信頼するのに必要な証明書があることを確認してください。証明書は Pod の /etc/pki/tls/certs ディレクトリーに配置する必要があります。証明書は設定マップまたはシークレットを使ってマウントできます。ここで、/etc/pki/tls/certs ディレクトリー全体を置き換える必要があることに注意してください。新しい証明書を組み込み、マウントするシークレットまたは設定マップのシステム証明書を置き換えます。
デフォルトでは、イメージストリームタグは Source
の参照ポリシータイプを使用することに注意してください。これは、イメージストリームの参照がイメージのプル仕様に対して解決される場合、使用される仕様はイメージのソースを参照することを意味します。外部レジストリーでホストされているイメージであれば、外部レジストリーが参照され、この結果としてリソースは外部レジストリーでイメージを参照し、プルします。この場合、registry.access.redhat.com/openshift3/jenkins-2-rhel7
とプルスルーは適用されません。イメージストリームを参照しているリソースが内部レジストリーを参照しているプル仕様を使用するようにするには、イメージストリームタグは Local
の参照ポリシータイプを使用する必要があります。詳細は、「参照ポリシー」を参照してください。
この機能はデフォルトでオンになっています。ただし、設定オプションを使って無効にすることができます。
デフォルトでは、この方法で提供されるすべてのリモート Blob は、mirrorpullthrough
が無効にされていない限りローカルに格納され、その後のアクセスが高速になります。ミラーリング機能の欠点はストレージの使用量が増えることにあります。
ミラーリングは、クライアントがBLOBの少なくとも1バイトをフェッチしようとすると開始されます。実際に必要となる前に特定のイメージを統合レジストリにプリフェッチするには、次のコマンドを実行します。
$ oc get imagestreamtag/${IS}:${TAG} -o jsonpath='{ .image.dockerImageLayers[*].name }' | \ xargs -n1 -I {} curl -H "Range: bytes=0-1" -u user:${TOKEN} \ http://${REGISTRY_IP}:${PORT}/v2/default/mysql/blobs/{}
OpenShift Container Platform のミラーリング機能をアップストリームの レジストリーのプルスルーキャッシュ機能と混同しないようにしてください。これらは似ていますが、全く異なる機能です。
3.5.5.5.4. Manifest Schema v2 サポート
各イメージには、Blob を記述するマニフェスト、それを実行するための命令、および追加のメタデータがあります。マニフェストはバージョン管理されており、バージョンごとに構造やフィールドが異なります。同一イメージが複数のマニフェストバージョンで表現されます。それぞれのバージョンはそれぞれ異なるダイジェストがあります。
現在サポートされているレジストリーは manifest v2 schema 1 (schema1) と manifest v2 schema 2 (schema2) です。前者は古くなっていますが、今後もしばらくはサポートされます。
各種の Docker クライアントとの互換性の問題に注意する必要があります。
- Docker クライアントのバージョン 1.9 以前は、schema1 のみをサポートしています。このクライアントがプルまたはプッシュするマニフェストはレガシースキーマになります。
- Docker クライアントのバージョン 1.10 は、schema1 と schema2 の両方をサポートしています。デフォルトでは、新しい方のスキーマをサポートする場合はこちらをレジストリーにプッシュします。
イメージを schema1 で格納するレジストリーは、常にイメージを変更せずにクライアントに返します。Schema2 は新規の Docker クライアントにのみ変更しない状態で移動します。古いクライアントの場合は、オンザフライで schema1 に変換されます。
これにより、大きな影響が想定されます。たとえば、新規 Docker クライアントでレジストリーにプッシュされたイメージは、古い Docker のダイジェストでプルすることはできません。格納されたイメージのマニフェストは schema2 であり、そのダイジェストはこのバージョンのマニフェストをプルする場合にのみ使用できるためです。
このため、レジストリーはデフォルトでは schema2 を格納しないように設定されています。これにより、すべての Docker クライアントはクライアントのバージョンに関係なく、プッシュされたイメージをレジストリーからプルできます。
すべてのレジストリークライアントが schema2 をサポートしていることを確認できたら、そのサポートをレジストリーで有効にすることができます。特定のオプションについては、上記の「ミドルウェア設定の参照」を参照してください。
3.5.5.6. OpenShift
このセクションでは、OpenShift Container Platform に特有の機能のグローバル設定について説明します。今後のリリースでは、 Middleware セクションにある openshift
関連の設定は廃止される予定です。
現在、このセクションではレジストリーメトリクスの収集を設定できます。
openshift: version: 1.0 1 server: addr: docker-registry.default.svc 2 metrics: enabled: false 3 secret: <secret> 4 requests: read: maxrunning: 10 5 maxinqueue: 10 6 maxwaitinqueue 2m 7 write: maxrunning: 10 8 maxinqueue: 10 9 maxwaitinqueue 2m 10
- 1
- このセクションの設定バージョンを指定する必須エントリー。サポートされている値は
1.0
のみです。 - 2
- レジストリーのホスト名。マスターで設定されている値と同じ値に設定される必要があります。これは環境変数
REGISTRY_OPENSHIFT_SERVER_ADDR
で上書きされる可能性があります。 - 3
- メトリクスの収集を有効にするには
true
に設定します。これはブール環境変数REGISTRY_OPENSHIFT_METRICS_ENABLED
で上書きされる可能性があります。 - 4
- クライアント要求の承認に使用されるシークレット。メトリクスのクライアントは これを
Authorization
ヘッダーでベアラートークンとして使用します。環境変数REGISTRY_OPENSHIFT_METRICS_SECRET
で上書きできます。 - 5
- 同時に行えるプル要求の最大数。環境変数
REGISTRY_OPENSHIFT_REQUESTS_READ_MAXRUNNING
で上書きできます。ゼロは無制限を意味します。 - 6
- キューに入れられるプル要求の最大数。環境変数
REGISTRY_OPENSHIFT_REQUESTS_READ_MAXINQUEUE
で上書きできます。ゼロは無制限を意味します。 - 7
- 拒否されるまでのキューにあるプル要求の最大待機時間。環境変数
REGISTRY_OPENSHIFT_REQUESTS_READ_MAXWAITINQUEUE
で上書きできます。ゼロは無制限を意味します。 - 8
- 同時に行えるプッシュ要求の最大数。環境変数
REGISTRY_OPENSHIFT_REQUESTS_WRITE_MAXRUNNING
で上書きできます。ゼロは無制限を意味します。 - 9
- キューにあるプッシュ要求の最大数。環境変数
REGISTRY_OPENSHIFT_REQUESTS_WRITE_MAXINQUEUE
で上書きできます。ゼロは無制限を意味します。 - 10
- 拒否されるまでのキューにあるプッシュ要求の最大待機時間。環境変数
REGISTRY_OPENSHIFT_REQUESTS_WRITE_MAXWAITINQUEUE
で上書きできます。ゼロは無制限を意味します。
使用状況の情報については レジストリーメトリクスへのアクセスを参照してください。
3.5.5.7. レポート (Reporting)
レポート (Reporting) はサポートされていません。
3.5.5.8. HTTP
アップストリームのオプションはサポートされています。環境変数を使って設定を変更する方法についてはこちらを参照してください。変更の必要があるのは tls セクションのみです。以下は例になります。
http: addr: :5000 tls: certificate: /etc/secrets/registry.crt key: /etc/secrets/registry.key
3.5.5.9. 通知
アップストリームのオプションはサポートされています。REST API リファレンス はより包括的な統合オプションを提供します。
例:
notifications: endpoints: - name: registry disabled: false url: https://url:port/path headers: Accept: - text/plain timeout: 500 threshold: 5 backoff: 1000
3.5.5.10. Redis
Redis はサポートされていません。
3.5.5.11. 健全性
アップストリームのオプションはサポートされています。レジストリーのデプロイメント設定は、 /healthz で統合されたヘルスチェックを提供します。
3.5.5.12. プロキシー
プロキシー設定は有効にできません。この機能は OpenShift Container Platform リポジトリーのミドルウェア拡張、pullthrough: true で提供されます。
3.5.5.13. キャッシュ
統合レジストリーは、データをアクティブにキャッシュして、速度の遅い外部リソースに対する呼び出しの回数を減らします。キャッシュには 2 種類あります。
- Blob のメタデータのキャッシュに使用されるストレージキャッシュ。このキャッシュには有効期限がなく、データは明示的に削除されるまで残り続けます。
- アプリケーションキャッシュには、Blob とリポジトリーの関連付けが含まれます。このキャッシュ内のデータには有効期限があります。
キャッシュを完全にオフににするには設定を変更する必要があります。
version: 0.1 log: level: debug http: addr: :5000 storage: cache: {} 1 openshift: version: 1.0 cache: disabled: true 2 blobrepositoryttl: 10m
3.6. 既知の問題
3.6.1. 概要
以下は、統合レジストリーのデプロイまたは使用時の既知の問題です。
3.6.2. 共有 NFS ボリュームとスケーリングされたレジストリーの使用時のイメージのプッシュエラー
スケーリングされたレジストリーを共有 NFS ボリュームで使用すると、イメージのプッシュ時に以下のいずれかのエラーが発生することがあります。
-
digest invalid: provided digest did not match uploaded content
-
blob upload unknown
-
blob upload invalid
これらのエラーは、Docker のイメージのプッシュの試行時に内部レジストリーサービスによって返されます。その原因は、ノード間のファイル属性の同期に起因します。NFS クライアント側のキャッシング、ネットワーク待機時間およびレイヤーサイズなどはすべて、デフォルトのラウンドロビンロードバランシング設定を使用してイメージをプッシュする際に発生するエラーの要因になる可能性があります。
このような障害の可能性を最小限に抑えるには、以下の手順を実行します。
docker-registry サービスの
sessionAffinity
がClientIP
に設定されていることを確認します。$ oc get svc / docker-registry --template = '{{。spec.sessionAffinity}}'
これにより
ClientIP
が返されるはずです。ClientIP は OpenShift Container Platform の最近のバージョンのデフォルトです。これが返されない場合は、以下のように変更してください。$ oc patch svc / docker-registry -p '{' spec ':{' sessionAffinity ':' ClientIP '}}'
-
NFS サーバー上のレジストリーボリュームの NFS エクスポート行に
no_wdelay
オプションが一覧表示されていることを確認します。no_wdelay
オプションは、サーバーによる書き込みの遅延を防ぎ、このレジストリーの要件である、書き込み直後の読み取りの整合性を大幅に改善します。
テストにより、NFS サーバーを RHEL でコンテナーレジストリーのストレージバックエンドとして使用することに関する問題が検出されています。これには、OpenShift Container Registry および Quay が含まれます。そのため、コアサービスで使用される PV をサポートするために NFS を使用することは推奨されていません。
他の NFS の実装ではこれらの問題が検出されない可能性があります。OpenShift コアコンポーネントに対して実施された可能性のあるテストに関する詳細情報は、個別の NFS 実装ベンダーにお問い合わせください。
3.6.3. 内部で管理されたイメージのプルに失敗し「見つかりません (not found)」のエラーが表示される
このエラーは、プルされたイメージがプルされているイメージストリームとは異なるイメージストリームにプッシュされた場合に発生します。これは、ビルドされたイメージを任意のイメージストリームに再タグ付けすることによって発生します。
$ oc tag srcimagestream:latest anyproject/pullimagestream:latest
その後、次のようなイメージ参照を使用して引き出します。
internal.registry.url:5000 / anyproject / pullimagestream:latest
Dockerを手動でプルするときにも同様のエラーが発生します。
Error: image anyproject/pullimagestream:latest not found
このエラーを防ぐには、内部で管理されたイメージのタグ付けを完全に避けるか、またはビルドしたイメージを必要な namespace に 手動で再プッシュします。
3.6.4. S3 ストレージでのイメージのプッシュが失敗し「500 内部サーバーエラー (500 Internal Server Error)」と表示される
レジストリーが S3 ストレージのバックエンドで実行されると、問題が報告されます。 Docker レジストリーへのプッシュは、以下のエラーを出して失敗することがあります。
Received unexpected HTTP status: 500 Internal Server Error
これをデバッグするには、レジストリーのログを表示する必要があります。ログで、プッシュの失敗時に発生した同様のエラーメッセージを探します。
time="2016-03-30T15:01:21.22287816-04:00" level=error msg="unknown error completing upload: driver.Error{DriverName:\"s3\", Enclosed:(*url.Error)(0xc20901cea0)}" http.request.method=PUT ... time="2016-03-30T15:01:21.493067808-04:00" level=error msg="response completed with error" err.code=UNKNOWN err.detail="s3: Put https://s3.amazonaws.com/oso-tsi-docker/registry/docker/registry/v2/blobs/sha256/ab/abe5af443833d60cf672e2ac57589410dddec060ed725d3e676f1865af63d2e2/data: EOF" err.message="unknown error" http.request.method=PUT ... time="2016-04-02T07:01:46.056520049-04:00" level=error msg="error putting into main store: s3: The request signature we calculated does not match the signature you provided. Check your key and signing method." http.request.method=PUT atest
このようなエラーを確認した場合には、Amazon S3 サポートにお問い合わせください。リージョンや特定のバケットで問題がある可能性があります。
3.6.5. イメージのプルーニングの失敗
イメージのプルーニング時に以下のエラーが発生した場合:
BLOB sha256:49638d540b2b62f3b01c388e9d8134c55493b1fa659ed84e97cb59b87a6b8e6c error deleting blob
さらに、レジストリーのログに以下の情報が含まれている場合。
error deleting blob \"sha256:49638d540b2b62f3b01c388e9d8134c55493b1fa659ed84e97cb59b87a6b8e6c\": operation unsupported
上記に該当する場合、お使いのカスタム設定ファイルにはストレージセクションに必須のエントリー、つまり true に設定された storage:delete:enabled
が含まれていないことを意味します。これらを追加し、レジストリーを再デプロイして、再度イメージプルーニングの操作を行ってください。
第4章 ルーターのセットアップ
4.1. ルーターの概要
4.1.1. ルーターについて
トラフィックをクラスターに送る方法は多数あります。最も一般的な方法として、 OpenShift Container Platform インストールで OpenShift Container Platform ルーターを、サービス向けの外部トラフィックの ingress ポイントとして使用できます。
OpenShift Container Platform は以下のルータープラグインを提供し、サポートしています。
- HAProxy テンプレートルーターはデフォルトのプラグインです。これは、openshift3/ose-haproxy-router イメージを使用して、OpenShift Container Platform のコンテナーにあるテンプレートルータープラグインと共に HAProxy インスタンスを実行します。現在は、HTTP(S) トラフィックと SNI を使用した TLS 対応のトラフィックをサポートしています。ルーターのコンテナーは、プライベート IP でのみリッスンする多数のコンテナーとは異なり、ホストのネットワークインターフェースでリッスンします。ルーターは、ルートに関連付けられたサービスで識別される実際の Pod の IP に対するルート名の外部要求をプロキシー処理します。
- F5 ルーターは、ルートを同期するためにお使いの環境で既存の F5 BIG-IP® システムに統合されます。F5 iControl REST API を使用するには、F5 BIG-IP® バージョン 11.4 以降が必要です。
F5 ルータープラグインは OpenShift Container Platform 3.0.2 以降で利用できます。
4.1.2. ルーターのサービスアカウント
OpenShift Container Platform クラスターをデプロイする前に、ルーターのサービスアカウントを取得する必要があります。OpenShift Container Platform 3.1 以降では、クイックインストールまたは通常インストール (Advanced installation) の実行時に、ルーターのサービスアカウントが自動的に作成されます (以前は手動で作成する必要がありました)。このサービスアカウントには、ホストポートを指定することを許可する SCC (security context constraint) のパーミッションがあります。
4.1.2.1. ラベルにアクセスするためのパーミッション
namespace ラベルが使用されている場合 (ルーターシャードを作成している場合など)、ルーターのサービスアカウントにはcluster-reader
のパーミッションが必要になります。
$ oc adm policy add-cluster-role-to-user \ cluster-reader \ system:serviceaccount:default:router
サービスアカウントを準備したら、デフォルト HAProxy ルーター、カスタマイズ HAProxy ルーター、または F5 ルーターのインストールに進むことができます。
4.2. デフォルト HAProxy ルーターの使用
4.2.1. 概要
oc adm router
コマンドには、新規インストールでのルーターのセットアップタスクを単純化する管理者 CLI が提供されます。 クイックインストールを実行している場合は、デフォルトのルーターが自動的に作成されます。oc adm router
コマンドは、サービスとデプロイメント設定オブジェクトを作成します。 --service-account
オプションを使用して、ルーターがマスターとの通信で使用するサービスアカウントを指定します。
ルーターサービスアカウントは事前に作成するか、oc adm router --service-account
コマンドで作成することができます。
OpenShift Container Platform コンポーネント間のあらゆる形式の通信は TLS によって保護され、各種の証明書や認証方法を使用します。--default-certificate
.pem フォーマットファイルは提供されるか、または oc adm router
コマンドで作成されます。ルートが作成されると、ユーザーはルートの処理時にルーターが使用するルート証明書を提供できるようになります。
ルーターを削除する際に、デプロイ設定やサービス、およびシークレットも削除されていることを確認します。
ルーターは特定のノードにデプロイされます。これにより、クラスター管理者と外部ネットワークマネージャーはどの IP アドレスがルーターを実行し、ルーターがどのトラフィックを処理するかについて調整しやすくなります。ノードセレクターを使用してルーターを特定のノードにデプロイします。
oc adm router
を使用して作成されるルーター Pod には、ルーター Pod がデプロイされるためにノードが満たさなければならないデフォルトのリソース要求が設定されます。デフォルトのリソース要求は、インフラストラクチャーコンポーネントの信頼性を向上させる取り組みとして、ルーター Pod の QoS 層をリソース要求を持たない Pod よりも高く設定するために使用されます。デフォルト値は、基本的なルーターがデプロイされるのに必要な最小限のリソースを表しており、ルーターデプロイメント設定で編集できます。また、ルーターの負荷に基づいてそれらの値を引き上げることもできます。
4.2.2. ルーターの作成
クイックインストールプロセスは、デフォルトルーターを自動的に作成します。ルーターが存在しない場合は、以下を実行してルーターを作成します。
$ oc adm router <router_name> --replicas=<number> --service-account=router
高可用性の設定が作成されない限り、--replicas
は通常 1
になります。
ルーターのホスト IP アドレスを見つけるには、以下を実行します。
$ oc get po <router-pod> --template={{.status.hostIP}}
また、ルーターシャードを使用して、ルーターを特定の namespace またはルートに絞り込むか、ルーターの作成後に環境変数を設定できます。この場合には、シャードごとにルーターを作成します。
4.2.3. その他の基本ルーターコマンド
- デフォルトルーターの確認
- router という名前のデフォルトのルーターサービスアカウントは、クイックおよび通常インストール (Advanced installation) 時に自動的に作成されます。このアカウントがすでに存在することを確認するには、以下を実行します。
$ oc adm router --dry-run --service-account=router
- デフォルトルーターの表示
- デフォルトルーターが作成されている場合でそれを確認するには、以下を実行します。
$ oc adm router --dry-run -o yaml --service-account=router
- ラベル付けされたノードへのルーターのデプロイ
- 指定されたノードラベルに一致するノードにルーターをデプロイするには、以下を実行します。
$ oc adm router <router_name> --replicas=<number> --selector=<label> \ --service-account=router
たとえば、router
という名前のルーターを作成し、それを region=infra
とラベルが付けられたノードに配置するには、以下を実行します。
$ oc adm router router --replicas=1 --selector='region=infra' \ --service-account=router
通常インストール (Advanced installation) の実行時に、openshift_router_selector
および openshift_registry_selector
Ansible 設定はデフォルトで region=infra に設定されます。region=infra ラベルと一致するノードが存在する場合、デフォルトのルーターとレジストリーは自動的にデプロイされます。
ラベルの更新に関する情報については、「ノードのラベルの更新」を参照してください。
複数のインスタンスが スケジューラーポリシーに従って複数の異なるホストに作成されます。
- 複数の異なるルーターイメージの使用
- 複数の異なるルーターイメージを使用し、使用されるルーター設定を表示するには、以下を実行します。
$ oc adm router <router_name> -o <format> --images=<image> \ --service-account=router
例を以下に示します。
$ oc adm router region-west -o yaml --images=myrepo/somerouter:mytag \ --service-account=router
4.2.4. ルートを特定のルーターに絞り込む
ROUTE_LABELS
環境変数を使用してルートを絞り込むことで、特定のルーターによってのみ使用されるようできます。
たとえば、複数のルーターと 100 のルートがある場合、ラベルをルートに割り当てることで、それらの一部を 1 つのルーターで処理し、残りを別のルーターで処理するようにできます。
ルーターの作成後に、
ROUTE_LABELS
環境変数を使用してルーターにタグ付けします。$ oc env dc/<router=name> ROUTE_LABELS="key=value"
ラベルを必要なルートに追加します。
oc label route <route=name> key=value
ラベルがルートに割り当てられていることを確認するには、ルートの設定をチェックします。
$ oc describe route/<route_name>
- 同時接続の最大数の設定
-
ルーターはデフォルトで最大 20000 の接続を処理できるようになっています。この上限は必要に応じて変更できます。接続が少なすぎると、ヘルスチェックが機能せず、不必要な再起動が実行されます。システムをこの接続の最大数に対応するように設定する必要があります。
'sysctl fs.nr_open'
と'sysctl fs.file-max'
に示される上限は十分に大きな値である必要があります。そうでない場合には HAproxy は起動しません。
ルーターを作成したら、--max-connections=
オプションで必要な上限を設定します。
$ oc adm router --max-connections=10000 ....
ルーターのデプロイメント設定で ROUTER_MAX_CONNECTIONS
環境変数を編集し、値を変更します。ルーター Pod は新しい値で再起動されます。ROUTER_MAX_CONNECTIONS
が存在しない場合は、デフォルト値の 20000 が使用されます。
接続にはフロントエンドおよび内部バックエンドが含まれます。これは 2 つの接続としてカウントされます。必ず ROUTER_MAX_CONNECTIONS
の値を作成しようとしている接続数の 2 倍以上になるように設定してください。
4.2.5. HAProxy Strict SNI
HAProxy strict-sni
は、ルーターのデプロイメント設定の ROUTER_STRICT_SNI
環境変数によって管理できます。また、これは --strict-sni
コマンドラインオプションを使用してルーターを作成する時にも設定できます。
$ oc adm router --strict-sni
4.2.6. TLS 暗号化スイート
ルーターの作成時に --ciphers
オプションを使用して、ルーターの暗号化スイートを設定します。
$ oc adm router --ciphers=modern ....
値は modern
、intermediate
、または old
で、デフォルトは intermediate
です。または、 ":" で区切られた暗号セットを指定することもできます。暗号は以下によって表示されるセットから取られたものである必要があります。
$ openssl ciphers
また、既存のルーターには ROUTER_CIPHERS
環境変数を使用します。
4.2.7. 高可用性ルーター
IP フェイルオーバーを使用して OpenShift Container Platform クラスターで高可用性ルーターをセットアップできます。このセットアップには複数の異なるノードの複数のレプリカが含まれるため、フェイルオーバーソフトウェアは現在のレプリカが失敗したら別のレプリカに切り替えることができます。
4.2.8. ルーターサービスポートのカスタマイズ
環境変数の ROUTER_SERVICE_HTTP_PORT
と ROUTER_SERVICE_HTTPS_PORT
を設定することで、テンプレートルーターがバインドするサービスポートをカスタマイズできます。これは、テンプレートルーターを作成し、そのデプロイメント設定を編集することで実行できます。
以下の例では、0
レプリカのルーターデプロイメントを作成し、ルーターサービス HTTP と HTTPS ポートをカスタマイズし、これを適切に (1
レプリカに) スケーリングしています。
$ oc adm router --replicas=0 --ports='10080:10080,10443:10443' 1
$ oc set env dc/router ROUTER_SERVICE_HTTP_PORT=10080 \
ROUTER_SERVICE_HTTPS_PORT=10443
$ oc scale dc/router --replicas=1
- 1
- 公開されるポートがコンテナーネットワークモード
--host-network=false
を使用するルーターに対して適切に設定されていることを確認します。
テンプレートルーターサービスポートをカスタマイズする場合は、ルーター Pod が実行されるノードのファイアウォールでカスタムポートが開いているようにする必要があります (Ansible または iptables
のいずれか、または firewall-cmd
で使用するその他のカスタム方法を使用します)。
以下は、カスタムルーターサービスポートを開くために iptables
を使用した例です。
$ iptables -A INPUT -p tcp --dport 10080 -j ACCEPT $ iptables -A INPUT -p tcp --dport 10443 -j ACCEPT
4.2.9. 複数ルーターの使用
管理者は同じ定義を使用して複数のルーターを作成し、同じルートのセットを提供することができます。各ルーターは複数の異なるノードに置かれ、異なる IP アドレスを持ちます。ネットワーク管理者は、各ノードに必要なトラフィックを送る必要があります。
複数のルーターをグループ化して、クラスター内や複数テナントでのルーティングの負荷を別のルーターまたはシャードに分散することができます。グループの各ルーターまたはシャードは、ルーターのセレクターに基づいてルートを許可します。管理者は ROUTE_LABELS
を使用してクラスター全体でシャードを作成できます。ユーザーは NAMESPACE_LABELS
を使用して namespace (プロジェクト) でシャードを作成できます。
4.2.10. デプロイメント設定へのノードセレクターの追加
特定のルーターを特定のノードにデプロイするには、2 つの手順を実行する必要があります。
ラベルを必要なノードに追加します。
$ oc label node 10.254.254.28 "router=first"
ノードセレクターをルーターのデプロイメント設定に追加します。
$ oc edit dc <deploymentConfigName>
template.spec.nodeSelector
フィールドに、ラベルに対応するキーと値を追加します。... template: metadata: creationTimestamp: null labels: router: router1 spec: nodeSelector: 1 router: "first" ...
- 1
router=first
ラベルに対応するキーと値はそれぞれrouter
とfirst
になります。
4.2.11. ルーターシャードの使用
ルーターのシャード化では NAMESPACE_LABELS
と ROUTE_LABELS
を使用してルーターの namespace とルートを絞り込みます。これにより、複数のルーターデプロイメントでルートのサブセットを分散させることができます。重複しないサブセットを使用することにより、ルートの設定のパーティション設定を効果的に行うことができます。または、ルートの重複するサブセットを構成するシャードを定義することもできます。
デフォルトで、ルーターはすべてのプロジェクト (namespace) からすべてのルートを選択します。シャード化によってラベルがルートまたはルーターの namespace およびラベルセレクターに追加されます。各ルーターシャードは特定のラベルのセットで選択されるルーターを構成するか、または特定のラベルセレクターで選択される namespace に属します。
ルーターサービスアカウントには [cluster reader
] パーミッションセットを設定し、他の namespace のラベルにアクセスできるようにする必要があります。
ルーターのシャード化および DNS
外部 DNS サーバーは要求を必要なシャードにルートするために必要となるので、管理者はプロジェクトの各ルーターに個別の DNS エントリーを作成する必要があります。ルーターは不明なルートを別のルーターに転送することはありません。
以下は例を示しています。
-
Router A はホスト 192.168.0.5 にあり、
*.foo.com
のルートを持つ。 -
Router B はホスト 192.168.1.9 にあり、
*.example.com
のルートを持つ。
各 DNS エントリーは *.foo.com を Router A をホストするノードに解決し、*.example.com を Router B をホストするノードに解決する必要があります。
-
*.foo.com A IN 192.168.0.5
-
*.example.com A IN 192.168.1.9
ルーターのシャード化の例
このセクションでは、namespace およびルートラベルを使用するルーターのシャード化について説明します。
図4.1 namespace ラベルに基づくルーターのシャード化
namespace ラベルセレクターでルーターを設定します。
$ oc set env dc/router NAMESPACE_LABELS="router=r1"
ルーターには namespace にセレクターがあるため、ルーターは一致する namespace のルートのみを処理します。このセレクターが namespace に一致させるようにするには、namespace に適宜ラベルを付けます。
$ oc label namespace default "router=r1"
ルートをデフォルトの namespace に作成すると、ルートはデフォルトのルーターで利用できるようになります。
$ oc create -f route1.yaml
新規プロジェクト (namespace) を作成し、
route2
というルートを作成します。$ oc new-project p1 $ oc create -f route2.yaml
ルートがルーターで利用できないことを確認します。
namespace
p1
にrouter=r1
のラベルを付けます。$ oc label namespace p1 "router=r1"
このラベルを追加すると、ルートはルーターで利用できるようになります。
- 例
ルーターのデプロイメント
finops-router
はルートセレクターNAMESPACE_LABELS="name in (finance, ops)"
を使用して設定され、ルーターのデプロイメントdev-router
はラベルセレクターNAMESPACE_LABELS="name=dev"
を使用して設定されます。すべてのルートが
name=finance
、name=ops
、およびname=dev
というラベルの付けられた namespace にある場合、この設定により、2 つのルーターのデプロイメント間でルートが効果的に分散されます。上記のシナリオでは、シャード化は重複するセットを持たないパーティション設定の特別なケースとなります。ルートは複数のルーターシャード間で分割されます。
ルート選択の基準によって、ルートの分散方法が決まります。複数のルーターデプロイメントに重複するルートのサブセットを設定することも可能です。
- 例
上記の例では
finops-router
とdev-router
のほかにdevops-router
があり、これはラベルセレクターNAMESPACE_LABELS="name in (dev, ops)"
を使用して設定されます。name=dev
またはname=ops
というラベルが付けられた namespace のルートは 2 つの異なるルーターデプロイメントによって提供されるようになりました。これは、「namespace ラベルに基づくルーターのシャード化」の手順で説明されているように、ルートの重複するサブセットを定義するケースです。また、これによりさらに複雑なルーティングルールを作成し、優先度の高いトラフィックを専用の
finops-router
に転送し、優先度の低いトラフィックはdevops-router
に送信できます。
ルートラベルに基づくルーターのシャード化
NAMESPACE_LABELS
によって、提供するプロジェクトをフィルターでき、それらのプロジェクトからすべてのルートを選択できますが、ルートはルート自体に関連する他の基準に基づいてパーティション設定する必要がある場合があります。ROUTE_LABELS
セレクターを使用すると、ルート自体を細かくフィルターできます。
- 例
ルーターデプロイメント
prod-router
はルートセレクターROUTE_LABELS="mydeployment=prod"
を使用して設定され、ルーターデプロイメントdevtest-router
はラベルセレクターROUTE_LABELS="mydeployment in (dev, test)"
を使用して設定されます。この設定は、namespace の種類を問わず、ルートのラベルに基づいて 2 つのルーターデプロイメント間のルートのパーティション設定を行います。
この例では、提供されるルートすべてがラベル
"mydeployment=<tag>"
でタグ付けされていることを想定しています。
4.2.11.1. ルーターシャードの作成
このセクションでは、ルーターシャードのさらに詳細な例を示します。さまざまなラベルを持つ a
— z
という 26 のルートがあることを想定してください。
ルートで使用可能なラベル
sla=high geo=east hw=modest dept=finance sla=medium geo=west hw=strong dept=dev sla=low dept=ops
これらのラベルは、サービスレベルアグリーメント、地理的な場所、ハードウェア要件、部門などの概念を表しています。ルートは各列のラベルを最大 1 つ持つことができます。ルートによっては他のラベルを持つことことも、ラベルをまったく持たないこともあります。
名前 | SLA | Geo (地理的な場所) | HW | Dept (部門) | その他のラベル |
---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
| ||
|
|
|
| ||
|
|
|
| ||
|
|
|
| ||
|
|
|
これは oc adm router
、oc set env
、oc scale
がどのように連携してルーターシャードを作成するかを表している便利なスクリプト mkshard です。
#!/bin/bash # Usage: mkshard ID SELECTION-EXPRESSION id=$1 sel="$2" router=router-shard-$id 1 oc adm router $router --replicas=0 2 dc=dc/router-shard-$id 3 oc set env $dc ROUTE_LABELS="$sel" 4 oc scale $dc --replicas=3 5
mkshard を複数回実行して、複数のルーターを作成します。
ルーター | 選択式 | ルート |
---|---|---|
|
|
|
|
|
|
|
|
|
4.2.11.2. ルーターシャードの変更
ルーターシャードはラベルに基づいた構成なので、(oc label
を使用して) ラベルまたは (oc set env
を使用して) 選択式のいずれかを変更できます。
このセクションでは「ルーターシャードの作成」セクションで扱った例をさらに詳細に取り上げ、選択式の変更方法を示します。
これは、新規の選択式を使用できるよう既存のルーターを変更する便利なスクリプト modshard です。
#!/bin/bash # Usage: modshard ID SELECTION-EXPRESSION... id=$1 shift router=router-shard-$id 1 dc=dc/$router 2 oc scale $dc --replicas=0 3 oc set env $dc "$@" 4 oc scale $dc --replicas=3 5
modshard
では、router-shard-<id>
のデプロイメントストラテジーが Rolling
の場合、oc scale
コマンドは不要です。
たとえば router-shard-3
の部門を拡張して ops
と dev
を含めるには、以下を実行します。
$ modshard 3 ROUTE_LABELS='dept in (dev, ops)'
結果として、router-shard-3
はルート g
— s
(g
— k
と l
— s
の組み合わせ) を選択します。
この例ではシャードから除外する 1 つの部門を指定します。このシナリオ例では 3 つの部門しかないため、これによって前述の例と同じ結果が得られます。
$ modshard 3 ROUTE_LABELS='dept != finance'
この例は 3 つのカンマで区切られた属性を指定しており、結果としてルート b
のみが選択されます。
$ modshard 3 ROUTE_LABELS='hw=strong,type=dynamic,geo=west'
ルートのラベルを使用する ROUTE_LABELS
と同様に、NAMESPACE_LABELS
環境変数を使用して、ルートはルートの namespace ラベルのラベルに基づいて選択できます。この例では、ラベル frequency=weekly
を持つルートの namespace を提供するように router-shard-3
を変更します。
$ modshard 3 NAMESPACE_LABELS='frequency=weekly'
最後の例は ROUTE_LABELS
と NAMESPACE_LABELS
を組み合わせて、ラベルsla=low
を持ち、ラベル frequency=weekly
を持つ namespace のルート選択します。
$ modshard 3 \ NAMESPACE_LABELS='frequency=weekly' \ ROUTE_LABELS='sla=low'
4.2.12. ルーターのホスト名の検索
サービスを公開する際に、ユーザーは外部ユーザーがアプリケーションにアクセスするために使用する DNS 名からの同じルートを使用できます。外部ネットワークのネットワーク管理者は、ホスト名がルートを許可したルーター名に解決することを確認する必要があります。ユーザーはこのホスト名を指す CNAME を使用して DNS をセットアップできます。ただし、ユーザーはルーターのホスト名を知らない場合があり、その場合はクラスター管理者がホスト名を知らせることができます。
クラスター管理者は、--router-canonical-hostname
オプションをルーター作成時のルーターの正規ホスト名で使用できます。以下は例になります。
# oc adm router myrouter --router-canonical-hostname="rtr.example.com"
これは、ルーターのホスト名を含む ROUTER_CANONICAL_HOSTNAME
環境変数をルーターのデプロイメント設定に作成します。
すでに存在しているルーターの場合、クラスター管理者はルーターのデプロイメント設定を編集し、ROUTER_CANONICAL_HOSTNAME
環境変数を追加します。
spec: template: spec: containers: - env: - name: ROUTER_CANONICAL_HOSTNAME value: rtr.example.com
ROUTER_CANONICAL_HOSTNAME
値は、ルートを許可したすべてのルーターのルートステータスに表示されます。ルートステータスはルーターがリロードされるたびに更新されます。
ユーザーがルートを作成すると、すべてのアクティブなルーターはそのルートを評価し、条件を満たしていればそのルートを許可します。ROUTER_CANONICAL_HOSTNAME
環境変数を定義するルーターがルートを許可すると、ルーターはルートステータスの routerCanonicalHostname
フィールドに値を入力します。ユーザーはルートステータスを検証して、どのルーターがルートを許可したかを確認でき、ルーターを一覧から選択し、ネットワーク管理者に渡すルーターのホスト名を見つけることができます (該当する場合)。
status: ingress: conditions: lastTransitionTime: 2016-12-07T15:20:57Z status: "True" type: Admitted host: hello.in.mycloud.com routerCanonicalHostname: rtr.example.com routerName: myrouter wildcardPolicy: None
oc describe
にはホスト名が含まれます (利用可能な場合)。
$ oc describe route/hello-route3 ... Requested Host: hello.in.mycloud.com exposed on router myroute (host rtr.example.com) 12 minutes ago
上記の情報を使用して、ユーザーは DNS 管理者に対し、ルートのホスト hello.in.mycloud.com
から CNAME をルーターの正規ホスト名 rtr.example.com
に応じてセットアップするよう依頼できます。この結果として、hello.in.mycloud.com
へのトラフィックがユーザーのアプリケーションに到達するようになります。
4.2.13. デフォルトのルーティングサブドメインのカスタマイズ
マスター設定ファイル (デフォルトでは /etc/origin/master/master-config.yaml ファイル) を変更することで、お使いの環境のデフォルトルーティングサブドメインとして使用されるサフィックスをカスタマイズできます。ホスト名を指定しないルートの場合、このデフォルトのルーティングサブドメインを使用してホスト名が生成されます。
以下の例は、設定されたサフィックスを v3.openshift.test に設定する方法を示しています。
routingConfig: subdomain: v3.openshift.test
この変更には、マスターを実行している場合は再起動が必要となります。
OpenShift Container Platform マスターが上記の設定を実行している場合、 namespace の mynamespace に追加されるホスト名を持たない no-route-hostname というルートの例では、生成されるホスト名は以下のようになります。
no-route-hostname-mynamespace.v3.openshift.test
4.2.14. カスタムルーティングサブドメインへのルートホスト名の強制
管理者がすべてのルートを特定のルーティングサブドメインに限定する場合、--force-subdomain
オプションを oc adm router
コマンドに渡すことができます。これはルートで指定されたホスト名を上書きし、--force-subdomain
オプションに提供されるテンプレートに基づいてホスト名を生成するようルーターに強制します。
以下の例ではルーターを実行し、カスタムサブドメインテンプレート ${name}-${namespace}.apps.example.com
を使用してルートホスト名を上書きしています。
$ oc adm router --force-subdomain='${name}-${namespace}.apps.example.com'
4.2.15. ワイルドカード証明書の使用
証明書を含まない TLS 対応のルートはルーターのデフォルト証明書を代わりに使用します。ほとんどの場合、この証明書は信頼された認証局から提供されますが、利便性を考慮して OpenShift Container Platform CA を使用して証明書を作成することができます。以下は例になります。
$ CA=/etc/origin/master $ oc adm ca create-server-cert --signer-cert=$CA/ca.crt \ --signer-key=$CA/ca.key --signer-serial=$CA/ca.serial.txt \ --hostnames='*.cloudapps.example.com' \ --cert=cloudapps.crt --key=cloudapps.key
oc adm ca create-server-cert
コマンドは、2 年間有効な証明書を生成します。この期間は --expire-days
オプションを使って変更することができますが、セキュリティー上の理由から、値をこれより大きくすることは推奨されません。
Ansible ホストインベントリーファイル (デフォルトで /etc/ansible/hosts) に最初に一覧表示されているマスターから oc adm
コマンドを実行します。
ルーターは、証明書とキーが単一ファイルに PEM 形式で入力されていると予想します。
$ cat cloudapps.crt cloudapps.key $CA/ca.crt > cloudapps.router.pem
ここで --default-cert
フラグを使用できます。
$ oc adm router --default-cert=cloudapps.router.pem --service-account=router
ブラウザーは、ワイルドカードを 1 つ深いレベルのサブドメインに有効であると見なします。この例では、証明書は a.cloudapps.example.com に対して有効ですが、a.b.cloudapps.example.com には有効ではありません。
4.2.16. 証明書を手動で再デプロイする
ルーター証明書を手動で再デプロイするには、以下を実行します。
デフォルトのルーター証明書を含むシークレットがルーターに追加されているかどうかを確認します。
$ oc volumes dc/router deploymentconfigs/router secret/router-certs as server-certificate mounted at /etc/pki/tls/private
証明書が追加されている場合は、以下の手順を省略してシークレットを上書きします。
デフォルト証明書ディレクトリーが以下の変数
DEFAULT_CERTIFICATE_DIR
に設定されていることを確認します。$ oc env dc/router --list DEFAULT_CERTIFICATE_DIR=/etc/pki/tls/private
設定されていない場合は、以下のコマンドを使用してディレクトリーを作成します。
$ oc env dc/router DEFAULT_CERTIFICATE_DIR=/etc/pki/tls/private
証明書を PEM 形式にエクスポートします。
$ cat custom-router.key custom-router.crt custom-ca.crt > custom-router.crt
ルーター証明書シークレットを上書きするか、またはこれを作成します。
証明書シークレットがルーターに追加されている場合は、シークレットを上書きします。追加されていなければ、新規シークレットを作成します。
シークレットを上書きするには、以下のコマンドを実行します。
$ oc create secret generic router-certs --from-file=tls.crt=custom-router.crt --from-file=tls.key=custom-router.key --type=kubernetes.io/tls -o json --dry-run | oc replace -f -
新規シークレットを作成するには、以下のコマンドを実行します。
$ oc create secret generic router-certs --from-file=tls.crt=custom-router.crt --from-file=tls.key=custom-router.key --type=kubernetes.io/tls $ oc volume dc/router --add --mount-path=/etc/pki/tls/private --secret-name='router-certs' --name router-certs
ルーターをデプロイします。
$ oc rollout latest dc/router
4.2.17. セキュリティー保護されたルートの使用
現時点で、パスワードで保護されたキーファイルはサポートされていません。HAProxy は開始時にパスワードのプロンプトを出しますが、このプロセスを自動化する方法は提供しません。キーファイルからパスフレーズを削除するために、以下を実行できます。
# openssl rsa -in <passwordProtectedKey.key> -out <new.key>
以下の例は、トラフィックが宛先にプロキシー処理される前に TLS 終端がルーターで生じる場合にセキュアな edge termination ルートを使用する方法を示しています。セキュアな edge termination ルートは TLS 証明書とキー情報を指定します。TLS 証明書は、ルーターのフロントエンドで提供されます。
最初にルーターインスタンスを起動します。
# oc adm router --replicas=1 --service-account=router
次に、セキュアな edge ルートのプライベートキー、CSR、証明書を作成します。この手順はお使いの認証局やプロバイダーによって異なります。www.example.test
というドメインの単純な自己署名証明書の場合は、以下の例を参照してください。
# sudo openssl genrsa -out example-test.key 2048 # # sudo openssl req -new -key example-test.key -out example-test.csr \ -subj "/C=US/ST=CA/L=Mountain View/O=OS3/OU=Eng/CN=www.example.test" # # sudo openssl x509 -req -days 366 -in example-test.csr \ -signkey example-test.key -out example-test.crt
上記の証明書とキーを使用してルートを生成します。
$ oc create route edge --service=my-service \ --hostname=www.example.test \ --key=example-test.key --cert=example-test.crt route "my-service" created
その定義を確認します。
$ oc get route/my-service -o yaml apiVersion: v1 kind: Route metadata: name: my-service spec: host: www.example.test to: kind: Service name: my-service tls: termination: edge key: | -----BEGIN PRIVATE KEY----- [...] -----END PRIVATE KEY----- certificate: | -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE-----
www.example.test
の DNS エントリーがルーターインスタンスを指し、ドメインへのルートが利用できることを確認します。以下の例では、Curl をローカルリゾルバーと共に使用して DNS ルックアップのシミュレーションを行っています。
# routerip="4.1.1.1" # replace with IP address of one of your router instances. # curl -k --resolve www.example.test:443:$routerip https://www.example.test/
4.2.18. (サブドメインの) ワイルドカードルートの使用
HAProxy ルーターはワイルドカードルートをサポートしており、ROUTER_ALLOW_WILDCARD_ROUTES
環境変数を true
に設定することでこれを有効にできます。ルーター許可のチェックをパスする Subdomain
のワイルドカードポリシーを持つすべてのルートは HAProxy ルーターによって提供されます。次に、HAProxy ルーターはルートのワイルドカードポリシーに基づいて (ルートの) 関連サービスを公開します。
ルートのワイルドカードポリシーを変更するには、ルートを削除してから更新されたワイルドカードポリシーでこれを再作成する必要があります。ルートの .yaml ファイルでルートのワイルドカードポリシーのみを編集しても機能しません。
$ oc adm router --replicas=0 ... $ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true $ oc scale dc/router --replicas=1
Web コンソールでワイルドカードルートを設定する方法についてはこちらを参照してください。
セキュアなワイルドカード edge termination ルートの使用
以下の例では、トラフィックが宛先にプロキシー処理される前にルーターで生じる TLS 終端を反映しています。サブドメイン example.org
(*.example.org
) のホストに送られるトラフィックは公開されるサービスにプロキシーされます。
セキュアな edge termination ルートは TLS 証明書とキー情報を指定します。TLS 証明書は、サブドメイン (*.example.org
) に一致するすべてのホストのルーターのフロントエンドによって提供されます。
ルーターインスタンスを起動します。
$ oc adm router --replicas=0 --service-account=router $ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true $ oc scale dc/router --replicas=1
セキュリティー保護された edge ルートについてのプライベートキー、証明書署名要求 (CSR) および証明書を作成します。
この手順はお使いの認証局やプロバイダーによって異なります。
*.example.test
というドメインの単純な自己署名証明書の場合はこの例を参照してください。# sudo openssl genrsa -out example-test.key 2048 # # sudo openssl req -new -key example-test.key -out example-test.csr \ -subj "/C=US/ST=CA/L=Mountain View/O=OS3/OU=Eng/CN=*.example.test" # # sudo openssl x509 -req -days 366 -in example-test.csr \ -signkey example-test.key -out example-test.crt
上記の証明書とキーを使用してワイルドカードのルートを生成します。
$ cat > route.yaml <<REOF apiVersion: v1 kind: Route metadata: name: my-service spec: host: www.example.test wildcardPolicy: Subdomain to: kind: Service name: my-service tls: termination: edge key: "$(perl -pe 's/\n/\\n/' example-test.key)" certificate: "$(perl -pe 's/\n/\\n/' example-test.cert)" REOF $ oc create -f route.yaml
*.example.test
の DNS エントリーがお使いのルーターインスタンスを指し、ドメインへのルートが利用できることを確認します。この例では
curl
をローカルリゾルバーと共に使用し、DNS ルックアップのシミュレーションを行います。# routerip="4.1.1.1" # replace with IP address of one of your router instances. # curl -k --resolve www.example.test:443:$routerip https://www.example.test/ # curl -k --resolve abc.example.test:443:$routerip https://abc.example.test/ # curl -k --resolve anyname.example.test:443:$routerip https://anyname.example.test/
ワイルドカードルートを許可しているルーター (ROUTER_ALLOW_WILDCARD_ROUTES
を true
に設定する) の場合、ワイルドカードルートに関連付けられたサブドメインの所有権についてのいくつかの注意点があります。
ワイルドカードルートの設定前に、所有権は、最も古いルートを持つ namespace のホスト名についての要求に基づいて設定されました (これはその他の要求を行うルートよりも優先されました)。たとえば、ルート r1
がルート r2
より古い場合、one.example.test
の要求を持つ namespace ns1
のルート r1
は同じホスト名 one.example.test
について namespace ns2
のルート ns2
よりも優先されます。
さらに、他の namespace のルートは重複しないホスト名を要求することを許可されていました。たとえば、namespace ns1
のルート rone
は www.example.test
を要求でき、namespace d2
の別のルート rtwo
は c3po.example.test
を要求できました。
これは、同じサブドメイン (上記の例では example.test
) を要求するワイルドカードルートがない場合には同様になります。
ただし、ワイルドカードルートはサブドメイン内のホスト名 ( \*.example.test
形式のホスト名) をすべて要求する必要があります。ワイルドカードルートの要求は、そのサブドメイン (example.test
) の最も古いルートがワイルドカードルートと同じ namespace 内にあるかどうかによって許可または拒否されます。最も古いルートは通常のルートまたはワイルドカードルートのいずれかになります。
たとえば、ホスト owner.example.test
を要求する 最も古い
ルートが namespace ns1
にすでに存在し、後からそのサブドメイン (example.test
) のルートを要求する新規のワイルドカードルート wildthing
が追加される場合、そのワイルドカードルートによる要求は、そのルートが所有ルートと同じ namespace (ns1
) にある場合にのみ許可されます。
以下の例では、ワイルドカードルートの要求が成功する場合と失敗する場合のさまざまなシナリオを示しています。
以下の例では、ワイルドカードルートを許可するルーターは、ワイルドカードルートがサブドメインを要求していない限り、サブドメイン example.test
のホストに対する重複しない要求を許可します。
$ oc adm router ... $ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true $ oc project ns1 $ oc expose service myservice --hostname=owner.example.test $ oc expose service myservice --hostname=aname.example.test $ oc expose service myservice --hostname=bname.example.test $ oc project ns2 $ oc expose service anotherservice --hostname=second.example.test $ oc expose service anotherservice --hostname=cname.example.test $ oc project otherns $ oc expose service thirdservice --hostname=emmy.example.test $ oc expose service thirdservice --hostname=webby.example.test
以下の例では、ワイルドカードルートを許可するルーターは、所有している namespace が ns1
なので、owner.example.test
または aname.example.test
の要求を許可しません。
$ oc adm router ... $ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true $ oc project ns1 $ oc expose service myservice --hostname=owner.example.test $ oc expose service myservice --hostname=aname.example.test $ oc project ns2 $ oc expose service secondservice --hostname=bname.example.test $ oc expose service secondservice --hostname=cname.example.test $ # Router will not allow this claim with a different path name `/p1` as $ # namespace `ns1` has an older route claiming host `aname.example.test`. $ oc expose service secondservice --hostname=aname.example.test --path="/p1" $ # Router will not allow this claim as namespace `ns1` has an older route $ # claiming host name `owner.example.test`. $ oc expose service secondservice --hostname=owner.example.test $ oc project otherns $ # Router will not allow this claim as namespace `ns1` has an older route $ # claiming host name `aname.example.test`. $ oc expose service thirdservice --hostname=aname.example.test
以下の例では、ワイルドカードルートを許可するルーターは、所有している namespace が ns1
で、そのワイルドカードルートが同じ namespace に属しているので、`\*.example.test
の要求を許可します。
$ oc adm router ... $ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true $ oc project ns1 $ oc expose service myservice --hostname=owner.example.test $ # Reusing the route.yaml from the previous example. $ # spec: $ # host: www.example.test $ # wildcardPolicy: Subdomain $ oc create -f route.yaml # router will allow this claim.
以下の例では、ワイルドカードルートを許可するルーターは、所有している namespace が ns1
で、ワイルドカードルートが別の namespace cyclone
に属するため、`\*.example.test
の要求を許可しません。
$ oc adm router ... $ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true $ oc project ns1 $ oc expose service myservice --hostname=owner.example.test $ # Switch to a different namespace/project. $ oc project cyclone $ # Reusing the route.yaml from a prior example. $ # spec: $ # host: www.example.test $ # wildcardPolicy: Subdomain $ oc create -f route.yaml # router will deny (_NOT_ allow) this claim.
同様に、ワイルドカードルートを持つ namespace がサブドメインを要求すると、その namespace 内のルートのみがその同じサブドメインでホストを要求できます。
以下の例では、ワイルドカードルートを持つ namespace ns1
のルートがサブドメイン example.test
を要求すると、namespace ns1
内のルートのみがその同じサブドメインのホストを要求することを許可されます。
$ oc adm router ... $ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true $ oc project ns1 $ oc expose service myservice --hostname=owner.example.test $ oc project otherns $ # namespace `otherns` is allowed to claim for other.example.test $ oc expose service otherservice --hostname=other.example.test $ oc project ns1 $ # Reusing the route.yaml from the previous example. $ # spec: $ # host: www.example.test $ # wildcardPolicy: Subdomain $ oc create -f route.yaml # Router will allow this claim. $ # In addition, route in namespace otherns will lose its claim to host $ # `other.example.test` due to the wildcard route claiming the subdomain. $ # namespace `ns1` is allowed to claim for deux.example.test $ oc expose service mysecondservice --hostname=deux.example.test $ # namespace `ns1` is allowed to claim for deux.example.test with path /p1 $ oc expose service mythirdservice --hostname=deux.example.test --path="/p1" $ oc project otherns $ # namespace `otherns` is not allowed to claim for deux.example.test $ # with a different path '/otherpath' $ oc expose service otherservice --hostname=deux.example.test --path="/otherpath" $ # namespace `otherns` is not allowed to claim for owner.example.test $ oc expose service yetanotherservice --hostname=owner.example.test $ # namespace `otherns` is not allowed to claim for unclaimed.example.test $ oc expose service yetanotherservice --hostname=unclaimed.example.test
以下の例では、所有権のあるルートが削除され、所有権が namespace 内または namespace 間で渡されるさまざまなシナリオが示されています。namespace ns1
のホスト eldest.example.test
を要求するルートが存在する場合、その namespace 内のワイルドカードルートはサブドメイン example.test
を要求できます。ホスト eldest.example.test
のルートが削除されると、次に古いルート senior.example.test
が最も古いルートになりますが、これは他のルートに影響を与えません。ホスト senior.example.test
のルートが削除されると、次に古いルート junior.example.test
が最も古いルートになり、ワイルドカードルートの要求をブロックします。
$ oc adm router ... $ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true $ oc project ns1 $ oc expose service myservice --hostname=eldest.example.test $ oc expose service seniorservice --hostname=senior.example.test $ oc project otherns $ # namespace `otherns` is allowed to claim for other.example.test $ oc expose service juniorservice --hostname=junior.example.test $ oc project ns1 $ # Reusing the route.yaml from the previous example. $ # spec: $ # host: www.example.test $ # wildcardPolicy: Subdomain $ oc create -f route.yaml # Router will allow this claim. $ # In addition, route in namespace otherns will lose its claim to host $ # `junior.example.test` due to the wildcard route claiming the subdomain. $ # namespace `ns1` is allowed to claim for dos.example.test $ oc expose service mysecondservice --hostname=dos.example.test $ # Delete route for host `eldest.example.test`, the next oldest route is $ # the one claiming `senior.example.test`, so route claims are unaffacted. $ oc delete route myservice $ # Delete route for host `senior.example.test`, the next oldest route is $ # the one claiming `junior.example.test` in another namespace, so claims $ # for a wildcard route would be affected. The route for the host $ # `dos.example.test` would be unaffected as there are no other wildcard $ # claimants blocking it. $ oc delete route seniorservice
4.2.19. コンテナーネットワークスタックの使用
OpenShift Container Platform ルーターはコンテナー内で実行され、デフォルトの動作として、ホスト (例: ルーターコンテナーが実行されるノードなど) のネットワークスタックを使用します。このデフォルトの動作には、リモートクライアントからのネットワークトラフィックがターゲットサービスとコンテナーに到達するためにユーザー空間で複数のホップを使用する必要がないので、パフォーマンス上のメリットがあります。
さらに、このデフォルト動作によってルーターはノードの IP アドレスではなくリモート接続の実際のソース IP アドレスを取得できます。これは、発信元の IP に基づいて ingress ルールを定義し、スティッキーセッションをサポートし、他に使用されているものの中でトラフィックを監視するのに役立ちます。
このホストネットワークの動作は --host-network
ルーターコマンドラインオプションによって制御でき、デフォルトの動作は --host-network=true
を使用した場合と等しくなります。コンテナーネットワークスタックを使用してルーターを実行する場合は、ルーターを作成する際に --host-network=false
オプションを使用します。以下は例になります。
$ oc adm router --service-account=router --host-network=false
内部的には、これは外部ネットワークがルーターと通信するために、ルーターコンテナーが 80 と 443 ポートを公開する必要があることを意味します。
コンテナーネットワークスタックを使用して実行することで、ルーターは接続のソース IP アドレスを実際のリモート IP アドレスではなくノードの NAT された IP アドレスとして扱うことを意味します。
マルチテナントネットワークの分離を使用する OpenShift Container Platform クラスターでは、--host-network=false
オプションを指定したデフォルト以外の namespace のルーターはクラスターのすべてのルートを読み込みますが、ネットワークの分離により複数の namespace にあるルートには到達できません。--host-network=true
オプションを指定すると、ルートはコンテナーネットワークをバイパスし、クラスターの任意の Pod にアクセスできます。この場合、分離が必要な場合は、複数の namespace のルートを追加しないでください。
4.2.20. ルーターメトリクスの公開
HAProxy ルーターメトリクス は、外部メトリクス収集および集約システム (例: Prometheus、statsd) で使用されるようにデフォルトで Prometheus 形式で公開されます。メトリクスは独自の HTML 形式でブラウザーで閲覧したり CSV ダウンロードを実行するために HAProxy ルーターから直接利用することもできます。これらのメトリクスには、HAProxy ネイティブメトリクスおよび一部のコントローラーメトリクスが含まれます。
以下のコマンドを使用してルーターを作成する場合、OpenShift Container Platform は Prometheus 形式のメトリクスをデフォルトが 1936 の統計ポートで利用可能にします。
$ oc adm router --service-account=router
Prometheus 形式で未加工統計を抽出するには、以下を実行します。
curl <user>:<password>@<router_IP>:<STATS_PORT>
例を以下に示します。
$ curl admin:sLzdR6SgDJ@10.254.254.35:1936/metrics
メトリクスにアクセスするために必要な情報は、ルーターサービスのアノテーションで確認できます。
$ oc edit router service <router-service-name> apiVersion: v1 kind: Service metadata: annotations: prometheus.io/port: "1936" prometheus.io/scrape: "true" prometheus.openshift.io/password: IImoDqON02 prometheus.openshift.io/username: admin
prometheus.io/port
はデフォルトが 1936 の統計ポートです。アクセスを許可するようファイウォールを設定する必要がある場合があります。直前のユーザー名およびパスワードを使用してメトリクスにアクセスします。パスは /metrics です。$ curl <user>:<password>@<router_IP>:<STATS_PORT> for example: $ curl admin:sLzdR6SgDJ@10.254.254.35:1936/metrics ... # HELP haproxy_backend_connections_total Total number of connections. # TYPE haproxy_backend_connections_total gauge haproxy_backend_connections_total{backend="http",namespace="default",route="hello-route"} 0 haproxy_backend_connections_total{backend="http",namespace="default",route="hello-route-alt"} 0 haproxy_backend_connections_total{backend="http",namespace="default",route="hello-route01"} 0 ... # HELP haproxy_exporter_server_threshold Number of servers tracked and the current threshold value. # TYPE haproxy_exporter_server_threshold gauge haproxy_exporter_server_threshold{type="current"} 11 haproxy_exporter_server_threshold{type="limit"} 500 ... # HELP haproxy_frontend_bytes_in_total Current total of incoming bytes. # TYPE haproxy_frontend_bytes_in_total gauge haproxy_frontend_bytes_in_total{frontend="fe_no_sni"} 0 haproxy_frontend_bytes_in_total{frontend="fe_sni"} 0 haproxy_frontend_bytes_in_total{frontend="public"} 119070 ... # HELP haproxy_server_bytes_in_total Current total of incoming bytes. # TYPE haproxy_server_bytes_in_total gauge haproxy_server_bytes_in_total{namespace="",pod="",route="",server="fe_no_sni",service=""} 0 haproxy_server_bytes_in_total{namespace="",pod="",route="",server="fe_sni",service=""} 0 haproxy_server_bytes_in_total{namespace="default",pod="docker-registry-5-nk5fz",route="docker-registry",server="10.130.0.89:5000",service="docker-registry"} 0 haproxy_server_bytes_in_total{namespace="default",pod="hello-rc-vkjqx",route="hello-route",server="10.130.0.90:8080",service="hello-svc-1"} 0 ...
ブラウザーでメトリクスを取得するには、以下を実行します。
以下の環境変数をデプロイメント設定ファイルから削除します。
$ oc edit service router - name: ROUTER_LISTEN_ADDR value: 0.0.0.0:1936 - name: ROUTER_METRICS_TYPE value: haproxy
ブラウザーで以下の URL を使用して統計ウィンドウを起動します。ここでは、
STATS_PORT
値はデフォルトで1936
になります。http://admin:<Password>@<router_IP>:<STATS_PORT>
;csv
を URL に追加して CVS 形式の統計を取得できます。例を以下に示します。
http://admin:<Password>@<router_IP>:1936;csv
ルーター IP、管理者名、およびパスワードを取得するには、以下を実行します。
oc describe pod <router_pod>
メトリクスのコレクションを表示しないようにするには、以下を実行します。
$ oc adm router --service-account=router --stats-port=0
大規模クラスターの ARP キャッシュのチューニング
(net.ipv4.neigh.default.gc_thresh3
の値 (デフォルトで65536
) を上回る) 多数のルート を持つ OpenShift Container Platform クラスターでは、ARP キャッシュでより多くのエントリーを許可するためにルーター Pod を実行するクラスターの各ノードで sysctl 変数のデフォルト値を増やす必要があります。
問題が発生している場合、以下のようなカーネルメッセージが表示されます。
[ 1738.811139] net_ratelimit: 1045 callbacks suppressed [ 1743.823136] net_ratelimit: 293 callbacks suppressed
この問題が発生すると、oc
コマンドは以下のエラーを出して失敗することがあります。
Unable to connect to the server: dial tcp: lookup <hostname> on <ip>:<port>: write udp <ip>:<port>-><ip>:<port>: write: invalid argument
IPv4 の ARP エントリーの実際の量を確認するには、以下を実行します。
# ip -4 neigh show nud all | wc -l
数字が net.ipv4.neigh.default.gc_thresh3
しきい値に近づき始めたら、値を増やします。以下を実行して現在値を取得します。
# sysctl net.ipv4.neigh.default.gc_thresh1 net.ipv4.neigh.default.gc_thresh1 = 128 # sysctl net.ipv4.neigh.default.gc_thresh2 net.ipv4.neigh.default.gc_thresh2 = 512 # sysctl net.ipv4.neigh.default.gc_thresh3 net.ipv4.neigh.default.gc_thresh3 = 1024
以下の sysctl は変数を OpenShift Container Platform の現在のデフォルト値に設定します。
# sysctl net.ipv4.neigh.default.gc_thresh1=8192 # sysctl net.ipv4.neigh.default.gc_thresh2=32768 # sysctl net.ipv4.neigh.default.gc_thresh3=65536
これらの設定を永続化するには、このドキュメントを参照してください。
4.2.21. DDoS 攻撃からの保護
timeout http-request をデフォルトの HAProxy ルーターイメージに追加して、分散型の denial-of-service (DDoS) 攻撃 (slowloris など) からデプロイメントを保護します。
# and the haproxy stats socket is available at /var/run/haproxy.stats
global
stats socket ./haproxy.stats level admin
defaults
option http-server-close
mode http
timeout http-request 5s
timeout connect 5s 1
timeout server 10s
timeout client 30s
- 1
- timeout http-request は最大 5 秒に設定されます。HAProxy は HTTP 要求全体の送信のための 5 秒をクライアントに対して指定します。この指定がないと、HAProxy はエラーを出して接続を切断します。
また、環境変数 ROUTER_SLOWLORIS_TIMEOUT
が設定されている場合、クライアントが HTTP 要求全体を送信するためにかかる合計時間が制限されます。これが設定されていない場合、HAProxy は接続を切断します。
環境変数を設定することで、情報をルーターのデプロイメント設定の一部として取得でき、テンプレートを手動で変更することが不要になります。一方、HAProxy 設定を手動で追加すると、ルーター Pod の再ビルドとルーターテンプレートファイルの保守が必要になります。
アノテーションを使用して、以下を制限する機能を含む基本的な DDoS 保護を HAProxy テンプレートルーターに実装します。
- 同時 TCP 接続の数
- クライアントが TCP 接続を要求できるレート
- HTTP 要求を実行できるレート
アプリケーションによってはトラフィックのパターンが完全に異なる場合があるため、これらはルートごとに有効にされます。
設定 | 説明 |
---|---|
|
設定した内容を有効にします (true に設定した場合など)。 |
|
このルートの同じ IP アドレスで接続できる同時 TCP 接続の数。 |
|
クライアント IP で開くことができる TCP 接続の数。 |
|
クライアント IP が 3 秒間で実行できる HTTP 要求の数。 |
4.3. カスタマイズされた HAProxy ルーターのデプロイ
4.3.1. 概要
デフォルトの HAProxy ルーターは多数のユーザーのニーズを対応することを目的としています。ただし、このルーターは HAProxy のすべての機能を公開している訳ではありません。そのため、ユーザーはそれぞれのニーズに合わせてルーターを変更する必要があります。
新機能をアプリケーションバックエンド内で実装したり、現在の操作を変更する必要がある場合があります。ルータープラグインはこのカスタマイズを行うために必要なすべての機能を提供します。
ルーター Pod はテンプレートファイルを使用して必要な HAProxy 設定ファイルを作成します。テンプレートファイルは golang テンプレート です。テンプレートを処理する際に、ルーターはルーターのデプロイメント設定、許可されたルートのセット、一部のヘルパー機能などの OpenShift Container Platform 情報にアクセスします。
ルーター Pod が起動し、リロードされるたびに、HAProxy 設定ファイルが作成され、HAProxy が起動します。『HAProxy 設定マニュアル』には HAProxy のすべての機能と有効な設定ファイルの作成方法が記載されています。
configMap を使用して新規テンプレートをルーター Pod に追加することができます。この方法により、ルーターデプロイメント設定を変更して、configMap をルーター Pod のボリュームとしてマウントできます。 TEMPLATE_FILE
環境変数はルーター Pod のテンプレートファイルのフルパス名に設定されます。
または、カスタムルーターイメージをビルドし、ルーターの一部またはすべてをデプロイする際にこれを使用することができます。すべてのルーターが同じイメージを実行する必要はありません。これを実行するには、 haproxy-template.config ファイルを変更し、ルーターイメージを再ビルドします。新しいイメージはクラスターの Docker リポジトリーにプッシュされ、ルーターのデプロイメント設定の image: フィールドが新しい名前で更新されます。クラスターが更新されたら、イメージを再ビルドし、プッシュする必要があります。
いずれの場合でも、ルーター Pod はテンプレートファイルを使用して起動します。
4.3.2. ルーター設定テンプレートの取得
HAProxy テンプレートファイルはかなり大きく複雑です。一部を変更するのであれば、すべてを書き換えるよりも既存のテンプレートを変更する方が簡単です。マスターでルーターを実行し、ルーター Pod を参照することで実行中のルーターから haproxy-config.templateファイルを取得できます。
# oc get po NAME READY STATUS RESTARTS AGE router-2-40fc3 1/1 Running 0 11d # oc rsh router-2-40fc3 cat haproxy-config.template > haproxy-config.template # oc rsh router-2-40fc3 cat haproxy.config > haproxy.config
または、ルーターを実行しているノードにログオンします。
# docker run --rm --interactive=true --tty --entrypoint=cat \ registry.access.redhat.com/openshift3/ose-haproxy-router:v3.7 haproxy-config.template
イメージ名は docker イメージ から取られます。
この内容をカスタマイズされたテンプレートのベースとして使用するためにファイルに保存します。保存された haproxy.config は実際に実行されているものを示します。
4.3.3. ルーター設定テンプレートの変更
4.3.3.1. 背景
このテンプレートは golang テンプレートに基づいています。これは、ルーターのデプロイメント設定の環境変数や、以下に示す設定情報およびルーターが提供するヘルパー機能を参照することができます。
テンプレートファイルの構造は作成される HAProxy 設定ファイルを反映します。テンプレートの処理時に、{{" something "}}
によって囲まれていないものはすべて設定ファイルに直接コピーされます。{{" something "}}
で囲まれている部分は評価されます。生成されるテキスト (ある場合) は設定ファイルにコピーされます。
4.3.3.2. Go テンプレートアクション
define アクションは、処理されるテンプレートを含むファイルに名前を付けます。
{{define "/var/lib/haproxy/conf/haproxy.config"}}pipeline{{end}}
関数 | 意味 |
---|---|
|
有効なエンドポイントの一覧を返します。アクションが「Shuffle」の場合、エンドポイントの順序はランダム化されます。 |
|
Pod からの名前付き環境変数の取得を試行します。これが定義されていないか、または空の場合、オプションの 2 つ目の引数が返されます。それ以外の場合には空の文字列を返します。 |
|
1 つ目の引数は正規表現を含む文字列で、2 つ目の引数はテストに使用できる変数です。1 つ目の引数として提供される正規表現が 2 つ目の引数として提供される文字列と一致するかどうかを示すブール値を返します。 |
|
指定された変数が整数かどうかを判別します。 |
|
所定の文字列を許可された文字列の一覧と比較します。左から右にスキャンし、最初の一致を返します。 |
|
所定の文字列を許可された文字列の一覧と比較します。文字列が許可される値の場合は「true」を返します。それ以外の場合は、「false」を返します。 |
|
ルートホスト (とパス) に一致する正規表現を生成します。最初の引数はホスト名であり、2 つ目はパス、3 つ目はワイルドカードブール値です。 |
|
証明書の提供/証明書のマッチングに使用するホスト名を生成します。1 つ目の引数はホスト名で、2 つ目はワイルドカードブール値です。 |
|
所定の変数に「true」が含まれるかどうかを判別します。 |
これらの関数は、HAProxy テンプレートルータープラグインによって提供されます。
4.3.3.3. ルーターが提供する情報
このセクションでは、ルーターがテンプレートで利用可能にする OpenShift Container Platform の情報について説明しますす。ルーター設定パラメーターは HAProxy ルータープラグインに与えられるデータセットです。フィールドには (dot) .Fieldname
を使用してアクセスします。
以下のルーター設定パラメーター表は各種フィールドの定義を詳しく取り上げています。とくに .State には許可されたルートセットが設定されます。
フィールド | 種別 | 説明 |
---|---|---|
|
文字列 |
ファイルが書き込まれるディレクトリー。デフォルトは /var/lib/containers/router に設定されます。 |
|
|
ルート。 |
|
|
サービスのルックアップ。 |
|
文字列 |
pem 形式のデフォルト証明書へのフルパス名。 |
|
|
ピア。 |
|
文字列 |
統計の公開に使用するユーザー名 (テンプレートがサポートしている場合)。 |
|
文字列 |
統計の公開に使用するパスワード (テンプレートがサポートしている場合)。 |
|
整数 |
統計の公開に使用するポート (テンプレートがサポートしている場合)。 |
|
bool |
ルーターがデフォルトポートをバインドすべきかどうか。 |
フィールド | 種別 | 説明 |
---|---|---|
|
文字列 |
ルートのユーザー固有の名前。 |
|
文字列 |
ルートの namespace。 |
|
文字列 |
ホスト名。例: |
|
文字列 |
オプションのパス。例: |
|
|
このバックエンドの終了ポリシー。マッピングファイルとルーター設定を利用します。 |
|
|
このバックエンドをセキュリティー保護するために使用する証明書。証明書 ID で指定します。 |
|
|
永続化する必要がある設定のステータスを示します。 |
|
文字列 |
ユーザーが公開したいポートを示します。空の場合、サービスのポートが選択されます。 |
|
|
edge termination ルートへの非セキュアな接続の必要な動作を示します。 |
|
文字列 |
Cookie ID を隠すために使用するルート + namespace 名のハッシュ。 |
|
bool |
このサービスユニットが ワイルドカードサポートを必要とすることを示します。 |
|
|
このルートに割り当てられるアノテーション。 |
|
|
このルートをサポートするサービスコレクション。マップの他のエントリーに関連してサービス名で指定され、これに割り当てられた重みで評価されます。 |
|
整数 |
ゼロ以外の重みを持つ |
ServiceAliasConfig
はサービスのルートです。ホスト + パスによって特定されます。デフォルトのテンプレートは {{range $cfgIdx, $cfg := .State }}
を使用してルートを繰り返し処理します。その {{range}}
ブロック内で、テンプレートは $cfg.Field
を使用して現在の ServiceAliasConfig
のフィールドを参照できます。
フィールド | 種別 | 説明 |
---|---|---|
|
文字列 |
名前はサービス名 + namespace に対応します。 |
|
|
サービスをサポートするエンドポイント。これはルーターの最終のバックエンド実装に変換されます。 |
ServiceUnit
はサービスをカプセル化したものであり、そのサービスをサポートするエンドポイントであり、またサービスを参照するルートです。これは、ルーター設定ファイルの作成を進めるデータです。
フィールド | 種別 |
---|---|
|
文字列 |
|
文字列 |
|
文字列 |
|
文字列 |
|
文字列 |
|
文字列 |
|
bool |
Endpoint
は、Kubernetes エンドポイントの内部表現です。
フィールド | 種別 | 説明 |
---|---|---|
|
文字列 |
パブリック/プライベートキーのペアを表します。これは ID で識別され、ファイル名になります。CA 証明書には |
|
文字列 |
この設定に必要なファイルがディスクに永続化されていることを示します。有効な値の例: "saved" または "" (ブランク)。 |
フィールド | 種別 | 説明 |
---|---|---|
ID |
文字列 | |
コンテンツ |
文字列 |
証明書。 |
PrivateKey |
文字列 |
プライベートキー。 |
フィールド | 種別 | 説明 |
---|---|---|
|
文字列 |
セキュアな通信が停止する場合を指示します。 |
|
文字列 |
ルートへの非セキュアな接続の必要な動作を示します。各ルーターは公開するポートを独自に決定することがありますが、通常はポート 80 になります。 |
TLSTerminationType
と InsecureEdgeTerminationPolicyType
はセキュアな通信が停止する場合を指示します。
定数 | 値 | 意味 |
---|---|---|
|
|
edge ルーターでの暗号化を終了します。 |
|
|
宛先での暗号化を終了し、宛先でトラフィックを復号化します。 |
|
|
edge ルーターで暗号化を終了し、宛先で提供される新規の証明書を使用して再暗号化します。 |
種別 | 意味 |
---|---|
|
トラフィックは非セキュアなポートのサーバーに送信されます (デフォルト)。 |
|
トラフィックは非セキュアなポートでは許可されません。 |
|
クライアントはセキュアなポートにリダイレクトされます。 |
なし (""
) は Disable
と同じです。
4.3.3.4. アノテーション
各ルートにはアノテーションが割り当てることができます。各アノテーションは名前と値のみで構成されます。
apiVersion: v1 kind: Route metadata: annotations: haproxy.router.openshift.io/timeout: 5500ms [...]
名前は既存のアノテーションと競合しないものにできます。値は文字列です。文字列では複数のトークンをスペースで区切ることができます (例: aa bb cc
)。テンプレートは {{index}}
を使用してアノテーションの値を抽出します。以下は例になります。
{{$balanceAlgo := index $cfg.Annotations "haproxy.router.openshift.io/balance"}}
この例は、これをどのようにクライアントの相互承認に使用できるかを示しています。
{{ with $cnList := index $cfg.Annotations "whiteListCertCommonName" }} {{ if ne $cnList "" }} acl test ssl_c_s_dn(CN) -m str {{ $cnList }} http-request deny if !test {{ end }} {{ end }}
このコマンドを使用してホワイトリストの CN を処理できます。
$ oc annotate route <route-name> --overwrite whiteListCertCommonName="CN1 CN2 CN3"
詳細は、「Route-specific Annotations」を参照してください。
4.3.3.5. 環境変数
テンプレートはルーター Pod に存在する任意の環境変数を使用できます。環境変数はデプロイメント設定に設定できます。また、新規の環境変数を追加できます。
これらは env
関数で参照されます。
{{env "ROUTER_MAX_CONNECTIONS" "20000"}}
1 つ目の文字列は変数であり、変数がないか、または nil
の場合には 2 つ目の文字列がデフォルトになります。ROUTER_MAX_CONNECTIONS
が設定されていないか、または nil
の場合、20000 が使用されます。環境変数はマップと言えます。ここでキーは環境変数名で、内容は変数の値になります。
詳細は、「Route-specific Environment variables」を参照してください。
4.3.3.6. 使用例
以下で HAProxy テンプレートファイルに基づく単純なテンプレートを示します。
以下のコメントで開始します。
{{/* Here is a small example of how to work with templates taken from the HAProxy template file. */}}
テンプレートは任意の数の出力ファイルを作成できます。define
コンストラクトを使用して出力ファイルを作成します。ファイル名は定義する引数として指定され、define
ブロック内の一致する終了部分までのすべての情報がそのファイルの内容として書き込まれます。
{{ define "/var/lib/haproxy/conf/haproxy.config" }} global {{ end }}
上記は global
を /var/lib/haproxy/conf/haproxy.config ファイルにコピーし、ファイルを閉じます。
ロギングを環境変数に基づいてセットアップします。
{{ with (env "ROUTER_SYSLOG_ADDRESS" "") }} log {{.}} {{env "ROUTER_LOG_FACILITY" "local1"}} {{env "ROUTER_LOG_LEVEL" "warning"}} {{ end }}
env
関数は、環境変数の値を抽出します。環境変数が定義されていないか、または nil
の場合、2 つ目の引数が返されます。
with コンストラクトは with ブロック内の "." (ドット) の値を with に引数として提供される値に設定します。with
アクションは Dot で nil
をテストします。nil
ではない場合、その句はend
(終了部分) まで処理されます。上記では、ROUTER_SYSLOG_ADDRESS
に /var/log/msg が含まれ、ROUTER_LOG_FACILITY
が定義されておらず、ROUTER_LOG_LEVEL
に info
が含まれていると想定しています。以下が出力ファイルにコピーされます。
log /var/log/msg local1 info
許可された各ルートは設定ファイルの行を生成します。range
を使用して、許可されたルートを確認します。
{{ range $cfgIdx, $cfg := .State }} backend be_http_{{$cfgIdx}} {{end}}
.State
は ServiceAliasConfig
のマップです。ここで、キーはルート名になります。range
はマップを通じて、パスするたびに key
を使用して $cfgIdx
を設定し、`$cfg
がルートを記述する ServiceAliasConfig
をポイントするよう設定します。 myroute
と hisroute
という 2 つのルートがある場合、上記により以下が出力ファイルにコピーされます。
backend be_http_myroute backend be_http_hisroute
ルートアノテーション $cfg.Annotations
もマップであり、アノテーション名がキーとなり、コンテンツの文字列が値になっています。ルートは必要な数だけアノテーションを持つことができ、テンプレートの作成者が使用方法を定義します。ユーザーはアノテーションをルートにコード化し、テンプレート作成者は HAProxy テンプレートをカスタマイズしてそのアノテーションを処理できるようにします。
通常はアノテーションをインデックス化して値を取得します。
{{$balanceAlgo := index $cfg.Annotations "haproxy.router.openshift.io/balance"}}
インデックスは指定されたアノテーションの値を抽出します。そのため、`$balanceAlgo
はアノテーションまたは nil
に関連付けられた文字列が含まれます。上記のように、nil
以外の文字列についてテストし、with
コンストラクトを使用して影響を確認することができます。
{{ with $balanceAlgo }} balance $balanceAlgo {{ end }}
$balanceAlgo
が nil
でない場合、balance $balanceAlgo
は出力ファイルにコピーされます。
2 つ目の例では、アノテーションのタイムアウト値の設定に基づいてサーバータイムアウトを設定します。
$value := index $cfg.Annotations "haproxy.router.openshift.io/timeout"
$value
を評価して、適切に作成された文字列が含まれていることを確認できます。matchPattern
関数は正規表現を受け入れ、引数が表現を満たしていれば true
を返します。
matchPattern "[1-9][0-9]*(us\|ms\|s\|m\|h\|d)?" $value
これにより 5000ms
を受け入れますが、7y
は受け取りません。この結果はテストで使用できます。
{{if (matchPattern "[1-9][0-9]*(us\|ms\|s\|m\|h\|d)?" $value) }} timeout server {{$value}} {{ end }}
これを使用してトークンに一致させることもできます。
matchPattern "roundrobin|leastconn|source" $balanceAlgo
または、matchValues
を使用してトークンと一致させることもできます。
matchValues $balanceAlgo "roundrobin" "leastconn" "source"
4.3.4. ConfigMap を使用してルーター設定テンプレートを置き換える
ConfigMap を使用して、ルーターイメージを再ビルドすることなくルーターインスタンスをカスタマイズできます。ルーター環境変数の作成し、変更することができるだけでなく、haproxy-config.template、reload-haproxy その他のスクリプトを変更することもできます。
- 上記のように変更する haproxy-config.template をコピーして、必要に応じて変更します。
ConfigMap を作成します。
$ oc create configmap customrouter --from-file=haproxy-config.template
customrouter
ConfigMap には変更された haproxy-config.template ファイルのコピーが含まれています。ルーターデプロイメント設定を変更し、ConfigMap をファイルとしてマウントし、
TEMPLATE_FILE
環境変数がこれをポイントするようにします。これは、oc set env
とoc volume
コマンドを使用するか、またはルーターデプロイメント設定を編集して実行できます。oc
コマンドの使用$ oc volume dc/router --add --overwrite \ --name=config-volume \ --mount-path=/var/lib/haproxy/conf/custom \ --source='{"configMap": { "name": "customrouter"}}' $ oc set env dc/router \ TEMPLATE_FILE=/var/lib/haproxy/conf/custom/haproxy-config.template
- ルーターデプロイメント設定の編集
oc edit dc router
を使用して、テキストエディターでルーターデプロイメント設定を編集します。... - name: STATS_USERNAME value: admin - name: TEMPLATE_FILE 1 value: /var/lib/haproxy/conf/custom/haproxy-config.template image: openshift/origin-haproxy-routerp ... terminationMessagePath: /dev/termination-log volumeMounts: 2 - mountPath: /var/lib/haproxy/conf/custom name: config-volume dnsPolicy: ClusterFirst ... terminationGracePeriodSeconds: 30 volumes: 3 - configMap: name: customrouter name: config-volume ...
変更を保存し、エディターを終了します。ルーターが再起動します。
4.3.5. Stick Table の使用
以下のカスタマイズの例を高可用なルーティングセットアップで使用することで、ピア間の同期を行う stick-table を使用できます。
ピアセクションの追加
ピア間で stick-table を同期するには、HAProxy 設定でピアセクションを定義する必要があります。このセクションによって、HAProxy がどのようにピアを識別し、接続するかが決まります。プラグインはデータを .PeerEndpoints
変数にあるテンプレートに提供するので、ルーターサービスのメンバーを簡単に識別できます。以下を追加することで、ピアセクションをルーターイメージ内の haproxy-config.template ファイルに追加することができます。
{{ if (len .PeerEndpoints) gt 0 }} peers openshift_peers {{ range $endpointID, $endpoint := .PeerEndpoints }} peer {{$endpoint.TargetName}} {{$endpoint.IP}}:1937 {{ end }} {{ end }}
リロードスクリプトの変更
stick-table を使用する場合、HAProxy にピアセクションでローカルホスト名として見なすものをオプションで指示することができます。エンドポイントの作成時に、プラグインは TargetName
をエンドポイントの TargetRef.Name
の値に設定するよう試みます。TargetRef
が設定されていない場合、TargetName
は IP アドレスに設定されます。TargetRef.Name
は Kubernetes ホスト名に対応しているので、-L
オプションを reload-haproxy
スクリプトに追加してローカルホストをピアセクションで識別できます。
peer_name=$HOSTNAME 1
if [ -n "$old_pid" ]; then
/usr/sbin/haproxy -f $config_file -p $pid_file -L $peer_name -sf $old_pid
else
/usr/sbin/haproxy -f $config_file -p $pid_file -L $peer_name
fi
- 1
- ピアセクションで使用されるエンドポイントターゲット名と一致している必要があります。
バックエンドの変更
最後に、stick-table をバックエンド内で使用するために、HAProxy 設定を変更して stick-table およびピアセットを使用することができます。以下は、stick-table を使用するように TCP 接続の既存のバックエンドを変更している例です。
{{ if eq $cfg.TLSTermination "passthrough" }} backend be_tcp_{{$cfgIdx}} balance leastconn timeout check 5000ms stick-table type ip size 1m expire 5m{{ if (len $.PeerEndpoints) gt 0 }} peers openshift_peers {{ end }} stick on src {{ range $endpointID, $endpoint := $serviceUnit.EndpointTable }} server {{$endpointID}} {{$endpoint.IP}}:{{$endpoint.Port}} check inter 5000ms {{ end }} {{ end }}
この変更を行った後に、ルーターを再ビルドできます。
4.3.6. ルーターの再ビルド
ルーターを再ビルドするには、実行中のルーターにある複数のファイルのコピーが必要になります。作業ディレクトリーを作成し、ルーターからファイルをコピーします。
# mkdir - myrouter/conf # cd myrouter # oc get po NAME READY STATUS RESTARTS AGE router-2-40fc3 1/1 Running 0 11d # oc rsh router-2-40fc3 cat haproxy-config.template > conf/haproxy-config.template # oc rsh router-2-40fc3 cat error-page-503.http > conf/error-page-503.http # oc rsh router-2-40fc3 cat default_pub_keys.pem > conf/default_pub_keys.pem # oc rsh router-2-40fc3 cat ../Dockerfile > Dockerfile # oc rsh router-2-40fc3 cat ../reload-haproxy > reload-haproxy
これらのファイルのいずれも編集するか、または置き換えることができます。ただし、conf/haproxy-config.template と reload-haproxy が変更される可能性が高くなります。
ファイルの更新後:
# docker build -t openshift/origin-haproxy-router-myversion . # docker tag openshift/origin-haproxy-router-myversion 172.30.243.98:5000/openshift/haproxy-router-myversion 1 # docker push 172.30.243.98:5000/openshift/origin-haproxy-router-pc:latest 2
新規ルーターを使用するには、image: 文字列を変更するか、または --images=<repo>/<image>:<tag>
フラグを oc adm router
コマンドに追加してルーターデプロイ設定を編集します。
変更のデバッグ時に、デプロイメント設定で imagePullPolicy: Always
を設定して各 Pod の作成時にイメージプルを強制的に実行すると便利です。デバッグが完了したら、これを imagePullPolicy: IfNotPresent
に戻して各 Pod の起動時のプルを回避します。
4.4. HAProxy ルーターを設定して PROXY プロトコルを使用する
4.4.1. 概要
デフォルトで HAProxy ルーターは、非セキュアな edge および re-encrypt ルートへの受信接続に HTTP を使用することを想定しています。ただし、PROXY プロトコルを使用することで、ルーターが受信要求を予想するよう設定することができます。このトピックでは、HAProxy ルーターと外部ロードバランサーを PROXY プロトコルを使用するように設定する方法を説明しています。
4.4.2. PROXY プロトコルを使用する理由
プロキシーサーバーやロードバランサーなどの中間サービスが HTTP 要求を転送する際に、これは接続のソースアドレスを要求の「Forwarded」ヘッダーに追加して、この情報を後続の中間サービスと、要求が最終的に転送されるバックエンドサービスに提供できます。ただし、接続が暗号化されている場合、中間サービスは「Forwarded」ヘッダーを変更できません。この場合、要求が転送されても HTTP ヘッダーは元のソースアドレスを正確に通信することができません。
この問題を解決するために、一部のロードバランサーは、単純に HTTP を転送する代替手段として PROXY プロトコルを使用して HTTP 要求をカプセル化します。カプセル化によって、ロードバランサーは転送される要求自体を変更することなく、情報を要求に追加することができます。これにより、ロードバランサーは、暗号化された接続を転送する場合でもソースアドレスを通信できます。
HAProxy ルーターが PROXY プロトコルを受け入れ、HTTP 要求のカプセル化を解除するように設定できます。ルーターは edge および re-encrypt ルートの暗号化を終了するので、ルーターは要求の「Forwarded」HTTP ヘッダー (および関連する HTTP ヘッダー) を更新でき、PROXY プロトコルを使用して通信されるソースアドレスを追加できます。
PROXY プロトコルと HTTP は互換性がなく、組み合わせることはできません。ルーターの前にロードバランサーを使用する場合、これらがどちらも PROXY プロトコルまたは HTTP のいずれかを使用する必要があります。一方を PROXY プロトコルを使用するように設定し、他方を HTTP を使用するように設定すると、ルーティングが失敗します。
4.4.3. PROXY プロトコルの使用
デフォルトで、HAProxy ルーターは PROXY プロトコルを使用しません。ROUTER_USE_PROXY_PROTOCOL
環境変数を使用することで、ルーターが受信接続に PROXY プロコトルの使用を予想するように設定できます。
PROXY プロコトルの有効化
$ oc env dc/router ROUTER_USE_PROXY_PROTOCOL=true
変数を true
または TRUE
以外の値に設定し、PROXY プロコトルを無効にします。
PROXY プロトコルの無効化
$ oc env dc/router ROUTER_USE_PROXY_PROTOCOL=false
ルーターで PROXY プロトコルを有効にする場合、ルーターの前のロードバランサーが PROXY プロコトルを使用するように設定する必要があります。以下は、Amazon の Elastic Load Balancer (ELB) サービスを PROXY プロトコルを使用するように設定した例です。この例では、ELB がポート 80 (HTTP)、443 (HTTPS)、5000 (イメージレジストリーの場合) を 1 つ以上の EC2 インスタンスで実行されるルーターに転送することを想定しています。
Amazon ELB を設定して PROXY プロコトルを使用する
後続の手順を単純化するために、最初に一部の Shell 変数を設定します。
$ lb='infra-lb' 1 $ instances=( 'i-079b4096c654f563c' ) 2 $ secgroups=( 'sg-e1760186' ) 3 $ subnets=( 'subnet-cf57c596' ) 4
次に、適切なリスナーやセキュリティーグループおよびサブネットを使用して ELB を作成します。
注記すべてのリスナーが HTTP プロトコルではなく TCP プロトコルを使用するよう設定する必要があります。
$ aws elb create-load-balancer --load-balancer-name "$lb" \ --listeners \ 'Protocol=TCP,LoadBalancerPort=80,InstanceProtocol=TCP,InstancePort=80' \ 'Protocol=TCP,LoadBalancerPort=443,InstanceProtocol=TCP,InstancePort=443' \ 'Protocol=TCP,LoadBalancerPort=5000,InstanceProtocol=TCP,InstancePort=5000' \ --security-groups $secgroups \ --subnets $subnets { "DNSName": "infra-lb-2006263232.us-east-1.elb.amazonaws.com" }
ルーターインスタンスを ELB に登録します。
$ aws elb register-instances-with-load-balancer --load-balancer-name "$lb" \ --instances $instances { "Instances": [ { "InstanceId": "i-079b4096c654f563c" } ] }
ELB のヘルスチェックを設定します。
$ aws elb configure-health-check --load-balancer-name "$lb" \ --health-check 'Target=HTTP:1936/healthz,Interval=30,UnhealthyThreshold=2,HealthyThreshold=2,Timeout=5' { "HealthCheck": { "HealthyThreshold": 2, "Interval": 30, "Target": "HTTP:1936/healthz", "Timeout": 5, "UnhealthyThreshold": 2 } }
最後に、
ProxyProtocol
属性を有効にしたロードバランサーのポリシーを作成し、ELB の TCP ポート 80 および 443 でポリシーを設定します。$ aws elb create-load-balancer-policy --load-balancer-name "$lb" \ --policy-name "${lb}-ProxyProtocol-policy" \ --policy-type-name 'ProxyProtocolPolicyType' \ --policy-attributes 'AttributeName=ProxyProtocol,AttributeValue=true' $ for port in 80 443 do aws elb set-load-balancer-policies-for-backend-server \ --load-balancer-name "$lb" \ --instance-port "$port" \ --policy-names "${lb}-ProxyProtocol-policy" done
設定の確認
ロードバランサーを以下のように検証して、設定が正しいことを確認します。
$ aws elb describe-load-balancers --load-balancer-name "$lb" | jq '.LoadBalancerDescriptions| [.[]|.ListenerDescriptions]' [ [ { "Listener": { "InstancePort": 80, "LoadBalancerPort": 80, "Protocol": "TCP", "InstanceProtocol": "TCP" }, "PolicyNames": ["infra-lb-ProxyProtocol-policy"] 1 }, { "Listener": { "InstancePort": 443, "LoadBalancerPort": 443, "Protocol": "TCP", "InstanceProtocol": "TCP" }, "PolicyNames": ["infra-lb-ProxyProtocol-policy"] 2 }, { "Listener": { "InstancePort": 5000, "LoadBalancerPort": 5000, "Protocol": "TCP", "InstanceProtocol": "TCP" }, "PolicyNames": [] 3 } ] ]
または、ELB をすでに設定していても、PROXY プロトコルを使用するよう設定されていない場合は、 TCP ポート 80 の既存リスナーを、HTTP ではなく TCP プロコトルを使用するように変更する必要があります (TCP ポート 443 はすでに TCP プロトコルを使用しているはずです)。
$ aws elb delete-load-balancer-listeners --load-balancer-name "$lb" \ --load-balancer-ports 80 $ aws elb create-load-balancer-listeners --load-balancer-name "$lb" \ --listeners 'Protocol=TCP,LoadBalancerPort=80,InstanceProtocol=TCP,InstancePort=80'
プロコトル更新の確認
プロコトルが以下のように更新されていることを確認します。
$ aws elb describe-load-balancers --load-balancer-name "$lb" |
jq '[.LoadBalancerDescriptions[]|.ListenerDescriptions]'
[
[
{
"Listener": {
"InstancePort": 443,
"LoadBalancerPort": 443,
"Protocol": "TCP",
"InstanceProtocol": "TCP"
},
"PolicyNames": []
},
{
"Listener": {
"InstancePort": 5000,
"LoadBalancerPort": 5000,
"Protocol": "TCP",
"InstanceProtocol": "TCP"
},
"PolicyNames": []
},
{
"Listener": {
"InstancePort": 80,
"LoadBalancerPort": 80,
"Protocol": "TCP", 1
"InstanceProtocol": "TCP"
},
"PolicyNames": []
}
]
]
- 1
- TCP ポート 80 のリスナーなど、すべてのリスナーが TCP プロコトルを使用している必要があります。
次にロードバランサーポリシーを作成し、上記の手順 5 に説明されているようにこれを ELB に追加します。
4.5. F5 ルータープラグインの使用
4.5.1. 概要
F5 ルータープラグインは OpenShift Container Platform 3.0.2 以降で利用できます。
F5 ルーターブラグインはコンテナーイメージとして提供され、デフォルトの HAProxy ルーターのように Pod として実行されます。
F5 と Red Hat 間のサポート体制により、Red Hat は F5 の統合を完全にサポートしています。F5 は F5 BIG-IP® 製品のサポートを提供しています。F5 と Red Hat は Red Hat OpenShift との統合を共同でサポートしています。Red Hat はバグフィックスおよび機能拡張を支援する一方で、すべての情報が F5 Networks に通信され、それらが開発サイクルの一部として管理されます。
4.5.2. 前提条件とサポート容易性
F5 ルータープラグインのデプロイ時に、以下の要件を満たしていることを確認してください。
F5 ホスト IPに以下が設定されている:
- API アクセスの認証情報
- プライベートキーによる SSH アクセス
- 高度な Shell アクセスを持つ F5 ユーザー
HTTP ルートの仮想サーバー:
- HTTP プロファイル は http である必要があります。
HTTP プロファイルルートを持つ仮想サーバー:
- HTTP プロファイル は http である必要があります。
- SSL プロファイル (クライアント) は clientssl である必要があります。
- SSL プロファイル (サーバー) は serverssl である必要があります。
edge 統合の場合 (非推奨):
- 稼働中の Ramp ノード
- Ramp ノードへの稼働中のトンネル
ネイティブ統合の場合:
- ポート 4789/UDP のすべてのノードと通信できるホストの内部 IP
- F5 ホストにインストールされた sdn-services アドオンライセンス
OpenShift Container Platform は以下の F5 BIG-IP® バージョンのみをサポートしています。
- 11.x
- 12.x
以下の機能は F5 BIG-IP® でサポートされていません。
- ワイルドカードルートと re-encrypt ルートの併用: ルートに証明書とキーを指定する必要があります。証明書、キー、認証局 (CA) を指定しても、CA は使用されません。
- 関連ルートを持たないサービスを含め、すべてのサービスのプールが作成されます。
- アプリケーションのアイドリング
-
redirect モードの暗号化されていない HTTP トラフィックと edge TLS 終端。(
insecureEdgeTerminationPolicy: Redirect
) -
シャード化、つまり F5 で複数の
vservers
を設定する。 -
SSL 暗号 (
ROUTER_CIPHERS=modern/old
) - エンドポイントのヘルスチェックの間隔やチェックタイプのカスタマイズ。
- メトリクスサーバーの使用による F5 メトリクスの提供。
-
サービスでされるポートではない各種ターゲットポート (
PreferPort
/TargetPort
) の指定。 - ソース IP ホワイトリストのカスタマイズ。つまり特定の IP アドレスのルートのみに対してトラフィックを許可する。
-
max connect time
またはtcp FIN timeout
などのタイムアウト値のカスタマイズ。 - F5 BIG-IP® の HA モード。
4.5.2.1. 仮想サーバーの設定
openshift-F5 統合ルーターを使用する前提条件として、2 つの仮想サーバー (HTTP および HTTPS プロファイルのそれぞれに 1 つの仮想サーバー) を F5 BIG-IP® アプライアンスでセットアップする必要があります。
F5 BIG-IP® アプライアンスで仮想サーバーを設定するには、F5 の指示に従います。
仮想サーバーを作成する際に、以下の設定が有効であることを確認します。
-
HTTP サーバーの場合は、
ServicePort
を'http'/80
に設定します。 -
HTTPS サーバーの場合は、
ServicePort
を'https'/443
に設定します。 - 基本設定で、両方の仮想サーバーの HTTP プロファイルを /Common/http に設定します。
HTTPS サーバーの場合は、 デフォルトの client-ssl プロファイルを作成し、SSL プロファイル (クライアント) に対してこれを選択します。
- デフォルトのクライアント SSL プロファイルを作成するには、F5 の指示、とくに 「Configuring the fallback (default) client SSL profile」セクションに従います。このセクションでは、カスタム証明書がルートまたはサーバー名に提供されない場合にデフォルトで提供される証明書/キーのペアについて説明しています。
4.5.3. F5 ルーターのデプロイ
ルート証明書は scp
コマンドを使用してコピーされるため、F5 ルーターは特権モードで実行される必要があります。
$ oc adm policy remove-scc-from-user hostnetwork -z router $ oc adm policy add-scc-to-user privileged -z router
oc adm router
コマンドを使用して F5 ルーターをデプロイしますが、F5 BIG-IP® ホストの以下のパラメーターを指定する追加のフラグ (または環境変数) を提供します。
フラグ | 説明 |
---|---|
|
F5 ルーターの起動を指定します (デフォルトの |
|
F5 BIG-IP® ホストの管理インターフェースのホスト名または IP アドレスを指定します。 |
|
F5 BIG-IP® のユーザー名 (通常は admin) を指定します。F5 BIG-IP のユーザーアカウントは F5 BIG-IP システムの Advanced Shell (Bash) へのアクセスがなければなりません。 |
|
F5 BIG-IP® のパスワードを指定します。 |
|
HTTP 接続の F5 仮想サーバーの名前を指定します。これは、ルーター Pod の起動前にユーザーによって設定される必要があります。 |
|
HTTPS 接続の F5 仮想サーバーの名前を指定します。これは、ルーター Pod の起動前にユーザーによって設定される必要があります。 |
|
F5 BIG-IP® ホストの SSH プライベートキーファイルへのパスを指定します。ルートのキーと証明書ファイルをアップロードし、削除する必要があります。 |
|
F5 ルーターが F5 BIG-IP® ホストの証明書の厳しい検証を省略することを示す Boolean フラグ。 |
|
F5 BIG-IP® パーティションパス (デフォルトは /Common) を指定します。 |
例を以下に示します。
$ oc adm router \ --type=f5-router \ --external-host=10.0.0.2 \ --external-host-username=admin \ --external-host-password=mypassword \ --external-host-http-vserver=ose-vserver \ --external-host-https-vserver=https-ose-vserver \ --external-host-private-key=/path/to/key \ --host-network=false \ --service-account=router
HAProxy ルーターの場合のように、oc adm router
コマンドがサービスとデプロイメント設定オブジェクトを作成するため、F5 ルーター自体が実行されるレプリケーションコントローラーと Pod が作成されます。レプリケーションコントローラーはクラッシュが発生した場合に F5 ルーターを再起動します。F5 ルーターはルート、エンドポイント、ノードを監視し、F5 BIG-IP® を適宜設定するため、 F5 ルーターを適切に設定された F5 BIG-IP® デプロイメントで実行することは高可用性の要件を満たすはずです。
4.5.4. F5 ルーターのパーティションパス
パーティションパスによって、デフォルトの /Common パーティションではなく、カスタムの F5 BIG-IP® 管理パーティションで OpenShift Container Platform ルーティング設定を保存できます。カスタム管理パーティションを使用して F5 BIG-IP® 環境を保護することができます。つまり、F5 BIG-IP® システムオブジェクトに保存される OpenShift Container Platform 特有の設定が論理コンテナー内にあり、管理者はその管理パーティションでアクセス制御を定義できます。
管理パーティションの詳細については、F5 BIG-IP® ドキュメントを参照してください。
パーティションパスについて OpenShift Container Platform を設定するには、以下を実行します。
オプションで一部のクリーニング手順を実行できます。
- F5 が /Common および /Custom パスに切り替えられるよう設定されていることを確認してください。
-
vxlan5000
の静的 FDB を削除します。詳細は、F5 BIG-IP® ドキュメントを参照してください。
- カスタムパーティションの仮想サーバーを設定します。
--external-host-partition-path
フラグを使用して F5 ルーターをデプロイし、パーティションパスを指定します。$ oc adm router --external-host-partition-path=/OpenShift/zone1 ...
4.5.5. F5 ネイティブ統合のセットアップ
このセクションでは、OpenShift Container Platform への F5 ネイティブ統合のセットアップ方法を確認します。F5 アプライアンスと OpenShift Container Platform 接続の概念および F5 ネイティブ統合のデータフローはルートに関するトピックの「F5 Native Integration」セクションで説明されています。
F5 BIG-IP® アプライアンスのバージョン 12.x 以降のみが、このセクションに記載されているネイティブ統合に対応しています。また、適切に統合を行うために sdn-services アドオンライセンスが必要になります。バージョン 11.x の場合は、ramp ノード のセットアップ手順に従ってください。
OpenShift Container Platform バージョン 3.4 時点で、F5 の OpenShift Container Platform とのネイティブな統合により、F5 の Ramp ノードを OpenShift SDN で作成されるオーバーレイネットワークの Pod に到達するように設定する必要がありません。
F5 コントローラー Pod は、Pod に直接正常に接続できるようにするために必要な十分な情報を使って起動する必要があります。
OpenShift Container Platform クラスターにゴースト
hostsubnet
を作成します。$ cat > f5-hostsubnet.yaml << EOF { "kind": "HostSubnet", "apiVersion": "v1", "metadata": { "name": "openshift-f5-node", "annotations": { "pod.network.openshift.io/assign-subnet": "true", "pod.network.openshift.io/fixed-vnid-host": "0" 1 } }, "host": "openshift-f5-node", "hostIP": "10.3.89.213" 2 } EOF $ oc create -f f5-hostsubnet.yaml
作成したゴースト
hostsubnet
に割り当てるサブネットを決定します。$ oc get hostsubnets NAME HOST HOST IP SUBNET openshift-f5-node openshift-f5-node 10.3.89.213 10.131.0.0/23 openshift-master-node openshift-master-node 172.17.0.2 10.129.0.0/23 openshift-node-1 openshift-node-1 172.17.0.3 10.128.0.0/23 openshift-node-2 openshift-node-2 172.17.0.4 10.130.0.0/23
-
新たに作成した
hostsubnet
のSUBNET
を確認します。この例では10.131.0.0/23
です。 Pod ネットワーク全体の CIDR を取得します。
$ oc get clusternetwork
この値は
10.128.0.0/14
のように表示されます。マスク (この例では14
) に注意してください。-
ゲートウェイアドレスを作成するには、
hostsubnet
から任意の IP アドレス (例:10.131.0.5
) を選択します。Pod ネットワークのマスク (14
) を使用します。ゲートウェイアドレスは10.131.0.5/14
になります。 こちらの指示に従って F5 コントローラー Pod を起動してください。さらに、サービスアカウントに「ノード」のクラスターリソースへのアクセスを許可し、VXLAN のネイティブ統合に 2 つの新しい追加オプションを使用します。
$ # Add policy to allow router to access nodes using the sdn-reader role $ oc adm policy add-cluster-role-to-user system:sdn-reader system:serviceaccount:default:router $ # Launch the router pod with vxlan-gw and F5's internal IP as extra arguments $ #--external-host-internal-ip=10.3.89.213 $ #--external-host-vxlan-gw=10.131.0.5/14 $ oc adm router \ --type=f5-router \ --external-host=10.3.89.90 \ --external-host-username=admin \ --external-host-password=mypassword \ --external-host-http-vserver=ose-vserver \ --external-host-https-vserver=https-ose-vserver \ --external-host-private-key=/path/to/key \ --service-account=router \ --host-network=false \ --external-host-internal-ip=10.3.89.213 \ --external-host-vxlan-gw=10.131.0.5/14
注記external-host-username
は、F5 BIG-IP システムの Advanced Shell (Bash) へのアクセスを持つ F5 BIG-IP ユーザーアカウントです。
これで Ramp ノードを設定せずに F5 のセットアップを開始できます。
第5章 Red Hat CloudForms のデプロイ
5.1. {mgmt-app} の OpenShift Container Platform へのデプロイ
5.1.1. はじめに
OpenShift Container Platform インストーラーには、Red Hat CloudForms 4.6 (CloudForms Management Engine 5.9 または CFME) を OpenShift Container Platform にデプロイするための Ansible ロールの openshift-management と Playbook が含まれています。
現在の実装には、OpenShift Container Platform 3.6 ドキュメントで説明されているように、Red Hat CloudForms 4.5 のテクノロジープレビューのデプロイメントプロセスとの互換性はありません。
Red Hat CloudForms を OpenShift Container Platform にデプロイする際には、以下の 2 つ点について決定する必要があります。
- 外部またはコンテナー化された (Pod 化された とも言う) PostgreSQL データベースを使用するかどうか。
- 永続ボリューム (PV) をどのストレージクラスでサポートするか。
最初の点については、Red Hat CloudForms で使用する PostgreSQL データベースが置かれている場所によって Red Hat CloudForms を以下のいずれかの方法でデプロイできます。
デプロイのバリアント | 説明 |
---|---|
完全コンテナー化 |
すべてのアプリケーションサービスと PostgreSQL データベースは、OpenShift Container Platform で Pod として実行されます。 |
外部データベース |
アプリケーションは外部でホストされた PostgreSQL データベースサーバーを使用し、その他すべてのサービスは OpenShift Container Platform で Pod として実行されます。 |
2 つ目の点については、openshift-management ロールが、多くのデフォルトのデプロイメントパラメーターの上書き用にカスタマイズオプションを提供します。これには、 PV をサポートするための以下のストレージクラスのオプションが含まれています。
ストレージクラス | 説明 |
---|---|
NFS (デフォルト) |
ローカル、クラスター上 |
NFS (外部) |
NFS の他の場所 、ストレージアプライアンスなど |
クラウドプロバイダー |
クラウドプロバイダー (GCE または AWS) の自動ストレージプロビジョニングを使用 |
事前設定 (詳細) |
ユーザーが事前にすべてを作成済みであることを前提とする |
本書では、Red Hat CloudForms を OpenShift Container Platform で実行するための要件、利用可能な設定変数の説明、および OpenShift Container Platform の初回インストール時かクラスターのプロビジョニング後のいずれかでインストーラーを実行する方法などについてのトピックを扱います。
5.2. Red Hat CloudForms を OpenShift Container Platform で使用するための要件
デフォルトの要件は以下の表に記載されています。これらはテンプレートパラメーターをカスタマイズして上書きできます。
以下の要件を満たしていないと、アプリケーションのパフォーマンスが低下するか、またはデプロイに失敗する可能性があります。
項目 | 要件 | 説明 | カスタマイズパラメーター |
---|---|---|---|
アプリケーションメモリー |
≥ 4.0 Gi |
アプリケーションのメモリー最小要件 |
|
アプリケーションストレージ |
≥ 5.0 Gi |
アプリケーションの PV サイズ最小要件 |
|
PostgreSQL メモリー |
≥ 6.0 Gi |
データベースのメモリー最小要件 |
|
PostgreSQL ストレージ |
≥ 15.0 Gi |
データベースの PV サイズ最小要件 |
|
クラスターホスト |
≥ 3 |
クラスター内のホスト数 |
該当なし |
以上の要件をまとめると以下のようになります。
- ユーザーにはいくつかのクラスターノードが必要である。
- クラスターノードには多くの利用可能なメモリーが必要である。
- ユーザーは、ローカルまたはクラウドプロバイダーに数 GiB の利用可能なストレージを持っている必要がある。
- PV サイズはテンプレートパラメーターの値を上書きして変更できる。
5.3. ロール変数の設定
5.3.1. 概要
以下のセクションでは、Ansible インベントリーファイル で使用されるロール変数について説明します。ロール変数は、インストーラーを実行する際に Red Hat CloudForms インストールの動作を制御するために使用されます。
5.3.2. 一般的な変数
変数 | 必須 | デフォルト | 説明 |
---|---|---|---|
|
不可 |
|
ブール値。アプリケーションをインストールするには |
|
Yes |
|
CFME 4.6 は現在利用可能 (ベータ版は利用不可) ですが、この変数はインストールを開始するために |
|
Yes |
|
インストールする Red Hat CloudForms のデプロイメントバリアント。現時点では、これをデフォルトの |
|
不可 |
|
Red Hat CloudForms インストールの namespace (プロジェクト)。 |
|
不可 |
|
namespace (プロジェクト) の説明。 |
|
不可 |
|
デフォルトの管理ユーザー名。この値を変更してもユーザー名は変更されません。名前をすでに変更しており、統合スクリプト (コンテナープロバイダーを追加するためのスクリプトなど) を実行している場合にのみこの値を変更してください。 |
|
不可 |
|
デフォルトの管理パスワード。この値を変更してもパスワードは変更されません。このパスワードをすでに変更しており、統合スクリプト (コンテナープロバイダーを追加するためのスクリプトなど) を実行している場合にのみこの値を変更してください。 |
5.3.3. テンプレートパラメーターのカスタマイズ
openshift_management_template_parameters
Ansible ロール変数は、アプリケーションまたは PV テンプレートで上書きする必要のあるテンプレートを指定するために使用します。
たとえば、PostgreSQL Pod のメモリー要件を減らしたい場合には、以下を設定します。
openshift_management_template_parameters={'POSTGRESQL_MEM_REQ': '1Gi'}
Red Hat CloudForms テンプレートが処理される際に、1Gi
が POSTGRESQL_MEM_REQ
テンプレートパラメーターの値に使用されます。
すべてのテンプレートパラメーターが (コンテナー化されたデータベースと外部データベースの) 両方 のテンプレートバリアントにある訳ではありません。たとえば、Pod 化されたデータベースのテンプレートには POSTGRESQL_MEM_REQ
パラメーターがありますが、このパラメーターは外部のデータベーステンプレートにはありません。そこには Pod を必要とするデータベースが存在せず、この情報は必要とされないためです。
したがって、テンプレートパラメーターを上書きする場合には十分注意する必要があります。テンプレートで定義されていないパラメーターを追加するとエラーの原因になります。管理アプリケーションの作成を確認する
タスクの実行時にエラーを受信した場合は、インストーラーを再度実行する前にアンインストールのスクリプトを実行してください。
5.3.4. データベース変数
5.3.4.1. コンテナー化された (Pod 化された) データベース
cfme-template.yaml ファイルにある POSTGRES_*
または DATABASE_*
テンプレートパラメーターは、インベントリーファイルの openshift_management_template_parameters
ハッシュを使用してカスタマイズすることができます。
5.3.4.2. 外部データベース
cfme-template-ext-db.yaml ファイルにある POSTGRES_*
または DATABASE_*
テンプレートパラメーターは、インベントリーファイルの openshift_management_template_parameters
ハッシュを使用してカスタマイズすることができます。
外部 PostgreSQL データベースは、ユーザーにデータベース接続パラメーターを指定するように要求します。必要な接続キーはインベントリーの openshift_management_template_parameters
パラメーターに設定する必要があります。必要なキー以下の通りです。
-
DATABASE_USER
-
DATABASE_PASSWORD
-
DATABASE_IP
-
DATABASE_PORT
(ほとんどの PostgreSQL サーバーはポート5432
で実行されます) -
DATABASE_NAME
外部データベースで PostgreSQL 9.5 が実行されていることを確認します。実行されていないと、CloudForms アプリケーションを正常にデプロイできない場合があります。
インベントリーに、以下のような行が含まれているはずです。
[OSEv3:vars]
openshift_management_app_template=cfme-template-ext-db 1
openshift_management_template_parameters={'DATABASE_USER': 'root', 'DATABASE_PASSWORD': 'mypassword', 'DATABASE_IP': '10.10.10.10', 'DATABASE_PORT': '5432', 'DATABASE_NAME': 'cfme'}
- 1
openshift_management_app_template
パラメーターをcfme-template-ext-db
に設定します。
5.3.5. ストレージクラス変数
変数 | 必須 | デフォルト | 説明 |
---|---|---|---|
|
不可 |
|
使用されるストレージのタイプ。オプションには |
|
不可 |
|
NetApp アプライアンスなどの外部 NFS サーバーを使用している場合、ここにホスト名を設定する必要があります。外部 NFS を使用していない場合は値を |
|
不可 |
|
外部 NFS を使用している場合、ベースパスをこのエクスポートの位置に設定できます。ローカルの NFS の場合、ローカルの NFS エクスポートに使用されているデフォルトのパスを変更する必要がある場合にも、この値を変更します。 |
|
不可 |
|
|
5.3.5.1. NFS (デフォルト)
NFS ストレージクラスは、概念実証およびテストデプロイメントに最も適しています。このクラスは、デプロイメント用のデフォルトのステージクラスにもなります。これを選択した場合、追加の設定は不要です。
このストレージクラスは、必要な PV をサポートするように NFS をクラスターホスト (デフォルトではインベントリーファイルの最初のマスター) に設定します。アプリケーションは PV を必要とし、データベース (外部でホストされている可能性がある) は 2 番目の PV が必要となる場合があります。PV サイズの最小要件は、Red Hat CloudForms アプリケーションは 5GiB、PostgreSQL データベースは 15GiB です (NFS 専用で使用する場合は、ボリュームまたはパーティション上の使用可能な最小領域は 20GiB です)。
カスタマイズは、以下のロール変数を使って行われます。
-
openshift_management_storage_nfs_base_dir
-
openshift_management_storage_nfs_local_hostname
5.3.5.2. NFS (外部)
外部 NFS は、必要な PV にエクスポートを提供するために事前設定された NFS サーバーを使用します。外部 NFS の場合、ユーザーは cfme-app
とオプションで cfme-db
(コンテナー化されたデータベース用) のエクスポートが必要です。
設定は、以下のロール変数を使って提供されます。
-
openshift_management_storage_nfs_external_hostname
-
openshift_management_storage_nfs_base_dir
openshift_management_storage_nfs_external_hostname
パラメーターは、外部 NFS サーバーのホスト名または IP に設定する必要があります。
/exports がエクスポートの親ディレクトリーではない場合、ベースディレクトリーを openshift_management_storage_nfs_base_dir
パラメーターで設定する必要があります。
たとえば、サーバーエクスポートが /exports/hosted/prod/cfme-app の場合は、openshift_management_storage_nfs_base_dir=/exports/hosted/prod
を設定する必要があります。
5.3.5.3. クラウドプロバイダー
ストレージクラスに OpenShift Container Platform のクラウドプロバイダー統合を使用している場合、Red Hat CloudForms は必要な PV をサポートするためにこのクラウドプロバイダーを使用することができます。これを正常に実行するには、openshift_cloudprovider_kind
変数 (AWS または GCE 用)と、ユーザーが選択したクラウドプロバイダーに固有のすべての関連パラメーターを設定している必要があります。
アプリケーションがこのストレージクラスを使って作成されている場合、必要な PV は、設定済みのクラウドプロバイダーのストレージ統合を使って自動的にプロビジョニングされます。
このストレージクラスの動作を設定するために使用される追加の変数はありません。
5.3.5.4. 事前設定 (詳細)
preconfigured
(事前設定されている) ストレージクラスの場合、ユーザーは各自の操作を正確に把握しており、すべてのストレージ要件が事前に配慮されていることを意味します。この場合、通常は適切なサイズに設定された PV がすでに作成されているので、インストーラーはストレージ設定を変更する必要がありません。
このストレージクラスの動作を設定するために使用される追加の変数はありません。
5.4. インストーラーの実行
5.4.1. OpenShift Container Platform のインストール時またはインストール後の Red Hat CloudForms のデプロイ
Red Hat CloudForms のデプロイを、OpenShift Container Platform の初回インストール時か、またはクラスターのプロビジョニング後のいずれかに実行することを選択できます。
以下が
[OSEv3:vars]
セクションの下にあるインベントリーファイルに設定されていることを確認します。[OSEv3:vars] openshift_management_install_management=true openshift_management_install_beta=true 1
- 1
- CFME 4.6 は現在利用可能 (ベータ版は利用不可) ですが、この変数はインストールを開始するために
true
に設定する必要があります。この要件は、今後のリリースでは取り除かれる予定です (BZ#1557909)。
- インベントリーファイルにある Red Hat CloudForms のその他のロール変数を、「ロール変数の設定」で説明されているように設定します。「インベントリーファイルの例」には、これを実行するのに役立つリソースがあります。
OpenShift Container Platform がすでにプロビジョニングされているかどうかに応じて、実行する Playbook を選択します。
- Red Hat CloudForms を、OpenShift Container Platform クラスターのインストールと同時にインストールする必要がある場合には、「通常インストール (Advanced installation) の実行」で説明されているように標準の config.yml Playbook を呼び出して、OpenShift Container Platform クラスターと Red Hat CloudForms のインストールを開始します。
Red Hat CloudForms を、すでにプロビジョニングされている OpenShift Container Platform クラスターにインストールする必要がある場合には、Red Hat CloudForms Playbook を直接呼び出してインストールを開始します。
# ansible-playbook -v [-i /path/to/inventory] \ /usr/share/ansible/openshift-ansible/playbooks/openshift-management/config.yml
5.4.2. インベントリーファイルの例
このセクションでは、インベントリーファイルのスニペットの例について説明し、使い始めに役立つ OpenShift Container Platform での Red Hat CloudForms の各種の設定について説明します。
変数の詳しい説明については、「ロール変数の設定」を参照してください。
5.4.2.1. すべてのデフォルト
以下は、すべてのデフォルト値と選択肢を使用した最も単純な例です。これで、Red Hat CloudForms のインストールが完全にコンテナー化 (Pod 化) されます。すべてのアプリケーションコンポーネントと PostgreSQL データベースが OpenShift Container Platform に Pod として作成されます。
[OSEv3:vars] openshift_management_app_template=cfme-template
5.4.2.2. 外部 NFS ストレージ
以下は、前述の例と同様に (ただしローカルの NFS サービスをクラスターで使用する代わりに)、既存の外部 NFS サーバー (ストレージアプライアンスなど) を使用しています。
[OSEv3:vars] openshift_management_app_template=cfme-template openshift_management_storage_class=nfs_external 1 openshift_management_storage_nfs_external_hostname=nfs.example.com 2
外部 NFS ホストが /exports/hosted/prod などの異なる親ディレクトリーの下でエクスポートディレクトリーをホストしている場合は、以下の変数を追加します。
openshift_management_storage_nfs_base_dir=/exports/hosted/prod
5.4.2.3. PV サイズの上書き
以下の例では、永続ボリューム (PV) のサイズを上書きします。PV サイズは openshift_management_template_parameters
で設定する必要があります。これにより、アプリケーションとデータベースは相互に干渉しあうことなく作成済みの PV で要求を実行できます。
[OSEv3:vars] openshift_management_app_template=cfme-template openshift_management_template_parameters={'APPLICATION_VOLUME_CAPACITY': '10Gi', 'DATABASE_VOLUME_CAPACITY': '25Gi'}
5.4.2.4. メモリー要件の上書き
テストまたは概念実証のインストールでは、アプリケーションとデータベースのメモリー要件を設定している容量内に収めるようにする必要がある場合があります。メモリーの上限を下げると、パフォーマンスが低下するか、またはアプリケーションの初期化に完全に失敗したりする可能性があることに注意してください。
[OSEv3:vars] openshift_management_app_template=cfme-template openshift_management_template_parameters={'APPLICATION_MEM_REQ': '3000Mi', 'POSTGRESQL_MEM_REQ': '1Gi', 'ANSIBLE_MEM_REQ': '512Mi'}
この例では、インストーラーに対し、パラメーター APPLICATION_MEM_REQ
を 3000Mi
に、POSTGRESQL_MEM_REQ
を 1Gi
に、さらに ANSIBLE_MEM_REQ
を 512Mi
に設定してアプリケーションテンプレートを処理するように指示します。
これらのパラメーターは、前述の例 PV サイズの上書きに示されているパラメーターと組み合せることができます。
5.4.2.5. 外部 PostgreSQL データベース
外部データベースを使用するには、openshift_management_app_template
パラメーターの値を cfme-template-ext-db
に変更する必要があります。
さらに、データベース接続情報を openshift_management_template_parameters
変数を使って入力する必要があります。詳細は、「ロール変数の設定」を参照してください。
[OSEv3:vars] openshift_management_app_template=cfme-template-ext-db openshift_management_template_parameters={'DATABASE_USER': 'root', 'DATABASE_PASSWORD': 'mypassword', 'DATABASE_IP': '10.10.10.10', 'DATABASE_PORT': '5432', 'DATABASE_NAME': 'cfme'}
PostgreSQL 9.5 が実行中であることを確認してください。実行されていないと、アプリケーションを正常にデプロイできない場合があります。
5.5. コンテナープロバイダー統合の有効化
5.5.1. 単一コンテナープロバイダーの追加
「インストーラーの実行」で説明されているように Red Hat CloudForms を OpenShift Container Platform にデプロイした後にコンテナープロバイダーの統合を有効にする方法として 、OpenShift Container Platform をコンテナープロバイダーとして手動で追加する方法と、このロールに含まれている Playbook を試行する方法の 2 つの方法があります。
5.5.1.1. 手動の追加
OpenShift Container Platform クラスターをコンテナープロバイダーとして手動で追加する手順については、以下の Red Hat CloudForms ドキュメントを参照してください。
5.5.1.2. 自動の追加
コンテナープロバイダーの自動的な統合は、このロールに含まれている Playbook を使用して実行できます。
この Playbook は以下を実行します。
- 必要な認証シークレットを収集します。
- Red Hat CloudForms アプリケーションとクラスター API への公開ルートを検索します。
- REST の呼び出しを実行し、OpenShift Container Platform クラスターをコンテナープロバイダーとして追加します。
コンテナープロバイダーの Playbook を実行するには、以下を実行します。
# ansible-playbook -v [-i /path/to/inventory] \ /usr/share/ansible/openshift-ansible/playbooks/openshift-management/add_container_provider.yml
5.5.2. 複数のコンテナープロバイダー
このロールには、最新の OpenShift Container Platform クラスターを Red Hat CloudForms デプロイメントに統合するための Playbook に加え、複数のコンテナープラットフォームを任意の Red Hat CloudForms サーバーに コンテナープロバイダーとして追加することを可能にするスクリプトが含まれています。コンテナープラットフォームは、OpenShift Container Platform または OpenShift Origin です。
複数のプロバイダースクリプトを使用する場合、Playbook の実行時に EXTRA_VARS
パラメーターを CLI に手動で設定することが必要になります。
5.5.2.1. スクリプトの作成
複数のプロバイダースクリプトを作成するには、以下の手動の設定を実行します。
- /usr/share/ansible/openshift-ansible/roles/openshift_management/files/examples/container_providers.yml のサンプルを、/tmp/cp.yml など別の場所にコピーします。このファイルは後で変更します。
-
Red Hat CloudForms の名前またはパスワードを変更している場合は、コピーしたcontainer_providers.yml ファイルの
management_server
キーにあるhostname
、user
、password
の各パラメーターを更新します。 コンテナープロバイダーとして追加する必要のある各 Container Platform クラスターについて、
container_providers
キーの下にエントリーを入力します。以下のパラメーターを設定する必要があります。
-
auth_key
-cluster-admin
権限を持つサービスアカウントのトークンです。 -
hostname
- クラスター API をポイントしているホスト名です。各コンテナープロバイダーは固有のホスト名を持っている必要があります。 -
name
- Red Hat CloudForms サーバーのコンテナープロバイダーの概要ページに表示されるクラスター名です。この名前は固有でなければなりません。
ヒントauth_key
ベアラートークンをクラスターから取得するには、以下を実行します。$ oc serviceaccounts get-token -n management-infra management-admin
-
以下のパラメーターは任意で設定することができます。
-
port
- Container Platform クラスターが API を8443
以外のポートで実行している場合は、このキーを更新します。 -
endpoint
- SSL 検証を有効にする (verify_ssl
) か、または検証設定をssl-with-validation
に変更することができます。現時点では、カスタムの信頼される CA 証明書のサポートは利用できません。
-
5.5.2.1.1. 例
例として以下のシナリオを見てみましょう。
- container_providers.yml ファイルを /tmp/cp.yml にコピーしている。
- 2 つの OpenShift Container Platform クラスターを追加する必要がある。
-
Red Hat CloudForms サーバーが
mgmt.example.com
で実行されている。
このシナリオでは、/tmp/cp.yml を以下のようにカスタマイズします。
container_providers: - connection_configurations: - authentication: {auth_key: "<token>", authtype: bearer, type: AuthToken} 1 endpoint: {role: default, security_protocol: ssl-without-validation, verify_ssl: 0} hostname: "<provider_hostname1>" name: <display_name1> port: 8443 type: "ManageIQ::Providers::Openshift::ContainerManager" - connection_configurations: - authentication: {auth_key: "<token>", authtype: bearer, type: AuthToken} 2 endpoint: {role: default, security_protocol: ssl-without-validation, verify_ssl: 0} hostname: "<provider_hostname2>" name: <display_name2> port: 8443 type: "ManageIQ::Providers::Openshift::ContainerManager" management_server: hostname: "<hostname>" user: <user_name> password: <password>
5.5.2.2. Playbook の実行
複数プロバイダー統合スクリプトを実行するには、コンテナープロバイダーの設定ファイルへのパスを EXTRA_VARS
パラメーターとしてansible-playbook
コマンドに指定する必要があります。container_providers_config
を設定ファイルパスに設定するには、-e
(または --extra-vars
) パラメーターを使用します。
# ansible-playbook -v [-i /path/to/inventory] \ -e container_providers_config=/tmp/cp.yml \ /usr/share/ansible/openshift-ansible/playbooks/openshift-management/add_many_container_providers.yml
Playbook が完成すると、Red Hat CloudForms サービスに 2 つの新しいコンテナープロバイダーが見つかるはずです。コンピュート → コンテナー → プロバイダー
の順にページを進んで概要を確認してください。
5.5.3. プロバイダーの更新
単一または複数のコンテナープロバイダーを追加したら、新規プロバイダーを Red Hat CloudForms で更新し、コンテナープロバイダーと管理されているコンテナーに関する最新データをすべて取得する必要があります。そのためには、Red Hat CloudForms Web コンソールの各プロバイダーに進み、それぞれについて更新ボタンをクリックします。
手順については、以下の Red Hat CloudForms ドキュメントを参照してください。
5.6. Red Hat CloudForms のアンインストール
5.6.1. アンインストール Playbook の実行
Red Hat CloudForms をアンインストールする前に、クラスターを OpenShift Container Platform バージョン 3.9.16 以上にアップグレードする必要があります。それよりも前のバージョンを使用している場合、Red Hat CloudForms のアンインストールにより、クラスターのすべての PV が除去されます。
デプロイした Red Hat CloudForms インストールを OpenShift Container Platform からアンインストールして削除するには、以下の Playbook を実行します。
# ansible-playbook -v [-i /path/to/inventory] \ /usr/share/ansible/openshift-ansible/playbooks/openshift-management/uninstall.yml
NFS エクスポートの定義とNFS エクスポートに格納されているデータは自動的に削除されません。新規デプロイメントの初期化を試行する前に、古いアプリケーションまたはデータベースデプロイメントのデータを手動で消去することが推奨されます。
5.6.2. トラブルシューティング
古い PostgreSQL データの消去に失敗すると連鎖的なエラーが発生し、postgresql Pod が crashloopbackoff
の状態になる可能性があります。この状態になると cfme Pod の起動が阻止されます。crashloopbackoff
は、以前のデプロイ時に作成されたデータベース NFS エクスポートの不正なファイル権限に起因します。
次に進むには、PostgreSQL エクスポートからすべてのデータを削除し、Pod (デプロイヤー Pod ではない) を削除します。以下の Pod がある場合の例を示します。
$ oc get pods NAME READY STATUS RESTARTS AGE httpd-1-cx7fk 1/1 Running 1 21h cfme-0 0/1 Running 1 21h memcached-1-vkc7p 1/1 Running 1 21h postgresql-1-deploy 1/1 Running 1 21h postgresql-1-6w2t4 0/1 CrashLoopBackOff 1 21h
この場合、以下を実行します。
- データベース NFS エクスポートのデータを消去します。
以下を実行します。
$ oc delete postgresql-1-6w2t4
PostgreSQL デプロイヤー Pod は、削除した Pod を置き換えるために新規の postgresql Pod の拡張を試みます。 postgresql Pod が実行された後に、cfme Pod は阻止する操作を停止し、アプリケーションの初期化を開始します。
第6章 マスターとノードの設定
openshift start
コマンドとそのサブコマンド (マスターサーバーを起動する master
と ノードサーバーを起動する node
) が受け取る引数のセット数は限定的ですが、これらは開発または実験環境でサーバーを起動するのには十分です。
ただしこれらの引数は、実稼働環境に必要な設定およびセキュリティーオプションのセットを詳細に記述し、管理するには不十分です。これらのオプションを指定するには、マスターとノードの設定ファイルを使用することが必要になります。
- マスターホストファイル (場所: /etc/origin/master/master-config.yaml)
- ノードホストファイル (場所: /etc/origin/node/node-config.yaml)
上記のファイルは、デフォルトプラグインの上書き、etcd への接続、サービスアカウントの自動作成、イメージ名の作成、プロジェクト要求のカスタマイズ、ボリュームプラグインの設定などの各種オプションを定義します。
このトピックでは、OpenShift Container Platform のマスターとノードのホストのカスタマイズに使用できるオプションについて説明し、インストール後に設定を変更する方法を紹介します。
これらのファイルはデフォルト値なしで完全に指定されます。したがって、空の値は、ユーザーがそのパラメーターを空の値で起動しようとしていることを意味します。これによりユーザーの設定を正確に推測することを簡単になりますが、指定する必要のあるすべてのオプションを思い出す必要があるという点では容易な作業にはなりません。これをより容易にするには、設定ファイルを --write-config
オプションを使って作成し、次に --config
オプションを指定して使用することができます。
6.1. インストールの依存関係
クイックインストールツールを使ってデプロイしたテスト環境では、マスターは 1 つあれば十分です。クイックインストール方式は実稼働環境では使用することができません。
実稼働環境は 通常インストール (Advanced installation) を使用してインストールする必要があります。実稼働環境では、高可用性 (HA) を維持するために複数のマスターを使用するのがよいでしょう。3 つのマスターで構成されるクラスターアーキテクチャーが推奨され、HAproxy の使用が推奨されるソリューションになります。
etcd が マスターホストにインストールされている場合は、etcd は権限を持つマスターを判別できないために、クラスターを 3 つ以上のマスターを使用するように設定する必要があります。2 つのマスターのみを正常に実行できるのは、etcd をマスター以外のホストにインストールしている場合です。
6.2. マスターとノードの設定
マスターとノードの設定ファイルの設定に使用する方法は、OpenShift Container Platform クラスターのインストールに使用した方法と同じでなければなりません。
- Ansible を使った通常インストール (Advanced installation) 方式を使用した場合は、Ansible Playbook で設定の変更を行ってください。
- クイックインストール方式を使用した場合は、それらの変更を設定ファイルで手動で実行してください。
6.3. Ansible を使用した設定の変更
このセクションは、Ansible に精通していることを前提に説明を行います。
Ansible に公開されているのは、利用可能なホスト設定オプションの一部のみです。OpenShift Container Platform のインストール後、Ansible は インベントリーファイルを置き換えられた値で作成します。このインベントリーファイルを変更し、Ansible インストーラー Playbook を再実行することで、OpenShift Container Platform クラスターをカスタマイズできます。
OpenShift Container Platform は Ansible を通常インストール (Advanced installation) 方式として使用することに対応していますが、Ansible Playbook とインベントリーファイルを使うことで、Puppet、Chef、Salt などの他の管理ツールを使用することもできます。
ユースケース: HTPasswd 認証を使用するようにクラスターを設定する
- このユースケースは、Playbook で参照されているすべてのノードに SSH キー がセットアップされていることを前提としています。
htpasswd
ユーティリティーはhttpd-tools
パッケージにあります。# yum install httpd-tools
Ansible インベントリーを変更し、設定の変更を行うには、以下を実行します。
./hosts インベントリーファイルを開きます。
例6.1 インベントリーファイルのサンプル:
[OSEv3:children] masters nodes [OSEv3:vars] ansible_ssh_user=cloud-user ansible_become=true openshift_deployment_type=openshift-enterprise [masters] ec2-52-6-179-239.compute-1.amazonaws.com openshift_ip=172.17.3.88 openshift_public_ip=52-6-179-239 openshift_hostname=master.example.com openshift_public_hostname=ose3-master.public.example.com containerized=True [nodes] ec2-52-6-179-239.compute-1.amazonaws.com openshift_ip=172.17.3.88 openshift_public_ip=52-6-179-239 openshift_hostname=master.example.com openshift_public_hostname=ose3-master.public.example.com containerized=True openshift_schedulable=False ec2-52-95-5-36.compute-1.amazonaws.com openshift_ip=172.17.3.89 openshift_public_ip=52.3.5.36 openshift_hostname=node.example.com openshift_public_hostname=ose3-node.public.example.com containerized=True
新規の変数をファイルの
[OSEv3:vars]
セクションに追加します。# htpasswd auth openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}] # Defining htpasswd users openshift_master_htpasswd_users={'<name>': '<hashed-password>', '<name>': '<hashed-password>'} # or #openshift_master_htpasswd_file=<path/to/local/pre-generated/htpasswdfile>
HTPasswd 認証では、指定されたユーザーとパスワードを作成する
openshift_master_htpasswd_users
変数か、またはすでに作成済みのユーザーとパスワードを持つ事前生成されたフラットファイル (htpasswd ファイル) を指定するopenshift_master_htpasswd_file
変数のいずれかを使用できます。OpenShift Container Platform は、HTPasswd 認証を設定するためにハッシュ化されたパスワードを必要とします。以下のセクションに示されるように
htpasswd
コマンドを使用してユーザー用のハッシュ化されたパスワードを生成するか、またはユーザーおよび関連付けられたハッシュ化されたパスワードを持つフラットファイルを作成することができます。以下の例では、認証方法をデフォルトの
deny all
設定からhtpasswd
に変更し、指定されたファイルを使ってjsmith
およびbloblaw
ユーザーのユーザー ID とパスワードを生成します。# htpasswd auth openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}] # Defining htpasswd users openshift_master_htpasswd_users={'jsmith': '$apr1$wIwXkFLI$bAygtKGmPOqaJftB', 'bloblaw': '7IRJ$2ODmeLoxf4I6sUEKfiA$2aDJqLJe'} # or #openshift_master_htpasswd_file=<path/to/local/pre-generated/htpasswdfile>
変更を有効にするために、Ansible Playbook を再実行します。
$ ansible-playbook -b -i ./hosts ~/src/openshift-ansible/playbooks/deploy_cluster.yml
Playbook が設定を更新し、OpenShift Container Platform マスターサービスを再起動して変更を適用します。
これで、Ansible を使用したマスターとノードの設定ファイルの変更が完了しました。ここまでは単純なユースケースですが、次は、どのマスターとノードの設定オプションが Ansibleに公開されているかを確認し、各自の Ansible インベントリーをカスタマイズします。
6.3.1. htpasswd
コマンドの使用
OpenShift Container Platform クラスターを HTPasswd 認証を使用するように設定するには、ハッシュ化されたパスワードを持つ 1 名以上のユーザーをインベントリーファイルに追加する必要があります。
以下を実行することができます。
- ユーザー名とパスワードを生成して ./hosts インベントリーファイルに直接追加する。
- フラットファイルを作成して認証情報を ./hosts インベントリーファイルに渡す。
ユーザーおよびハッシュ化されたパスワードを作成するには、以下を実行します。
以下のコマンドを実行して指定されたユーザーを追加します。
$ htpasswd -n <user_name>
注記-b
オプションを追加すると、パスワードをコマンドラインに指定できます。$ htpasswd -nb <user_name> <password>
ユーザーのクリアテキストのパスワードを入力し、確定します。
例を以下に示します。
$ htpasswd -n myuser New password: Re-type new password: myuser:$apr1$vdW.cI3j$WSKIOzUPs6Q
このコマンドはパスワードのハッシュ化バージョンを生成します。
これで、HTPasswd 認証を設定する際にハッシュ化パスワードを使用できます。ハッシュ化パスワードは、:
の後に続く文字列です。上記の例では、次を入力します。
openshift_master_htpasswd_users={'myuser': '$apr1$wIwXkFLI$bAygtISk2eKGmqaJftB'}
ユーザー名とハッシュ化パスワードを持つフラットファイルを作成するには、以下を実行します。
以下のコマンドを実行します。
$ htpasswd -c </path/to/users.htpasswd> <user_name>
注記-b
オプションを追加すると、パスワードをコマンドラインに指定できます。$ htpasswd -c -b <user_name> <password>
ユーザーのクリアテキストのパスワードを入力し、確定します。
例を以下に示します。
htpasswd -c users.htpasswd user1 New password: Re-type new password: Adding password for user user1
このコマンドは、ユーザー名とユーザーパスワードのハッシュ化されたバージョンを含むファイルを生成します。
これで、HTPasswd 認証を設定する際にこのパスワードファイルを使用できます。
htpasswd
コマンドについての詳細は、「HTPasswd Identity Provider」を参照してください。
6.4. 手動による設定変更
クイックインストールツールを使って OpenShift Container Platform をインストールすると、マスターとノードの設定ファイルを変更してクラスターをカスタマイズすることができます。
ユースケース: HTPasswd 認証を使用するようにクラスターを設定する
設定ファイルを手動で変更するには、以下を実行します。
- 変更する必要のある設定ファイルを開きます。ここでは /etc/origin/master/master-config.yaml ファイルです。
以下の新規変数をファイルの
identityProviders
スタンザに追加します。oauthConfig: ... identityProviders: - name: my_htpasswd_provider challenge: true login: true mappingMethod: claim provider: apiVersion: v1 kind: HTPasswdPasswordIdentityProvider file: /path/to/users.htpasswd
- 変更を保存してファイルを閉じます。
変更を有効にするために、マスターを再起動します。
$ systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers
これでマスターとノードの設定ファイルが手動で変更されました。ここまでは単純なユースケースです。次は、すべてのマスターとノードの設定オプションを確認し、変更を加えることでクラスターをさらにカスタマイズします。
6.5. マスター設定ファイル
このセクションでは、master-config.yaml ファイルに記述されているパラメーターについて説明します。
新規のマスター設定ファイルを作成して、OpenShift Container Platform のインストール済みバージョンに有効なオプションを確認できます。
master-config.yaml ファイルを変更する際には常にマスターを再起動して変更を有効にしてください。「OpenShift Container Platform サービスの再起動」を参照してください。
6.5.1. 受付制御の設定
パラメーター名 | 説明 |
---|---|
|
受付制御プラグイン設定が含まれています。OpenShift Container Platform には、API オブジェクトが作成または変更されるたびにトリガーされる、受付制御プラグインの設定可能な一覧が含まれます。このオプションを使用して、一部のプラグインの無効化、他の設定の追加、順序の変更や設定の指定など、デフォルトのプラグイン一覧を上書きできます。プラグインの一覧とその設定はどちらも Ansible で制御することができます。 |
|
API サーバーのコマンドライン引数に一致する Kube API サーバーに直接渡されるキーと値のペアです。これらは移行されませんが、存在しない値が参照されてもサーバーは起動しません。これらの値は、 apiServerArguments: event-ttl: - "15m" |
|
Kube コントローラーマネージャーのコマンドライン引数に一致する、コントローラーマネージャーに直接渡されるキーと値のペアです。これらは移行されませんが、存在しない値が参照されてもサーバーは起動しません。これらの値は、 |
|
各種の受付プラグインの有効化または無効化に使用されます。このタイプが |
|
設定ファイルを受付制御プラグインごとに指定することができます。 |
|
マスターにインストールされる受付制御プラグイン名の一覧です。順序には意味があります。空の場合は、プラグインのデフォルトの一覧が使用されます。 |
|
スケジューラーのコマンドライン引数に一致する、Kube スケジューラーに直接渡されるキーと値のペアです。これらは移行されませんが、存在しない値が参照されてもサーバーは起動しません。これらの値は、 |
6.5.2. アセットの設定
パラメーター名 | 説明 |
---|---|
|
これが存在する場合には、アセットサーバーは事前に定義されたパラメーターに基づいて起動します。以下は例になります。 assetConfig: logoutURL: "" masterPublicURL: https://master.ose32.example.com:8443 publicURL: https://master.ose32.example.com:8443/console/ servingInfo: bindAddress: 0.0.0.0:8443 bindNetwork: tcp4 certFile: master.server.crt clientCA: "" keyFile: master.server.key maxRequestsInFlight: 0 requestTimeoutSeconds: 0 |
|
異なるホスト名を使用して Web アプリケーションから API サーバーにアクセスするには、設定フィールドに |
|
起動することのできない機能の一覧です。null に設定してください。この機能を手動で無効にする必要性はほとんどなく、この操作を実行することも推奨されません。 |
|
サブコンテクストの下位のアセットサーバーファイルシステムから提供されるファイルです。 |
|
true に設定されている場合、起動時だけでなく要求が出されるたびに拡張機能スクリプトとスタイルシートをリロードするようアセットサーバーに指示します。変更のたびにサーバーを再起動しなくても、拡張機能を展開することができます。 |
|
コンソールのグローバル変数 |
|
Web コンソールが読み込む際にスクリプトとして読み込まれるアセットサーバーファイル上のファイルパスです。 |
|
Web コンソールが読み込む際にスタイルシートとして読み込まれるアセットサーバーファイル上のファイルパスです。 |
|
ロギング用のパブリックエンドポイント (オプション) です。 |
|
Web コンソールからログアウトした後に Web ブラウザーをリダイレクトするオプションの絶対 URL です。指定されていない場合は、ビルトインされたログアウトページが表示されます。 |
|
Web コンソールが OpenShift Container Platform サーバーにアクセスする方法について示します。 |
|
メトリクス用のパブリックエンドポイント (オプション) です。 |
|
アセットサーバーの URL です。 |
6.5.3. 認証と承認の設定
パラメーター名 | 説明 |
---|---|
|
認証および承認設定オプションを保持します。 |
|
キャッシュされる認証結果の数を示します。0 の場合は、デフォルトのキャッシュサイズが使用されます。 |
|
承認結果がキャッシュされる期間を示します。有効な時間文字列 (「5 m」など) を取り、空の場合はデフォルトのタイムアウトが取得されます。ゼロ (「0 m」など) の場合、キャッシシングは無効になります。 |
6.5.4. コントローラーの設定
パラメーター名 | 説明 |
---|---|
|
起動するコントローラーの一覧です。none に設定されている場合、コントローラーは自動的に起動されません。デフォルト値は * であり、これによりすべてのコントローラーが起動します。* を使用している場合は、コントローラーの名前の先頭に |
|
コントローラーの選択を有効にし、マスターに対してコントローラーが起動する前にリースを取得するように指示して、この値で定義された秒数内にリースを更新します。負の値以外の値を設定することで |
|
マスターに対してコントローラーを自動的に開始せず、起動前にサーバーへの通知が受信するまで待機するように指示します。 |
6.5.5. etcd の設定
パラメーター名 | 説明 |
---|---|
|
etcd へのクライアント接続用に公開される host:port です。 |
|
etcd に接続する方法についての情報が含まれます。etcd を組み込みまたは組み込み以外の方法で実行するかどうかを指定し、ホストを指定します。残りの設定は Ansible インベントリーで処理されます。以下は例になります。 etcdClientInfo: ca: ca.crt certFile: master.etcd-client.crt keyFile: master.etcd-client.key urls: - https://m1.aos.example.com:4001 |
|
これがある場合、etcd は定義されたパラメーターに基づいて起動します。以下は例になります。 etcdConfig: address: master.ose32.example.com:4001 peerAddress: master.ose32.example.com:7001 peerServingInfo: bindAddress: 0.0.0.0:7001 certFile: etcd.server.crt clientCA: ca.crt keyFile: etcd.server.key servingInfo: bindAddress: 0.0.0.0:4001 certFile: etcd.server.crt clientCA: ca.crt keyFile: etcd.server.key storageDirectory: /var/lib/origin/openshift.local.etcd |
|
API リソースを etcd に格納する方法についての情報が含まれます。これらの値は、etcd がクラスターのバッキングストアである場合にのみ関連する値になります。 |
|
Kubernetes のリソースがその下位に置かれる etcd 内のパスです。この値が変更されると etcd 内の既存のオブジェクトは検索できなくなります。デフォルトの値は kubernetes.io です。 |
|
etcd 内の Kubernetes リソースがシリアライズされる API バージョン。etcd から読み取りを行うクラスター内のすべてのクライアントが新規バージョンの読み取りを可能にするコードを取得するまでこの値を変更 することができません。 |
|
OpenShift Container Platform リソースがその下位に置かれる etcd 内のパスです。この値が変更されると、etcd 内の既存のオブジェクトは検索できなくなります。デフォルトの値は openshift.io です。 |
|
etcd 内の OS リソースがシリアライズされる API バージョンです。etcd から読み取りを行うクラスター内のすべてのクライアントが新規バージョンの読み取りを可能にするコードを取得するまで、この値を変更することができません。 |
|
etcd へのピア接続用に公開される host:port です。 |
|
etcd ピアの提供を開始する方法を記述します。 |
|
提供を開始する方法を記述します。以下は例になります。 servingInfo: bindAddress: 0.0.0.0:8443 bindNetwork: tcp4 certFile: master.server.crt clientCA: ca.crt keyFile: master.server.key maxRequestsInFlight: 500 requestTimeoutSeconds: 3600 |
|
etcd ストレージディレクトリーへのパスです。 |
6.5.6. 付与の設定
パラメーター名 | 説明 |
---|---|
|
付与を処理する方法を記述します。 |
|
クライアントの承認付与の要求を自動承認します。 |
|
クライアントの承認付与の要求を自動的に拒否します。 |
|
ユーザーに対し、クライアントの新規の承認付与要求を承認することを求めるプロンプトを出します。 |
|
OAuth クライアントが付与を要求したときに使用するデフォルトのストラテジーを決定します。この方法は特定の OAuth クライアントが独自のストラテジーを提供しない場合にのみ使用します。付与を処理するための有効な方法は以下の通りです。
|
6.5.7. イメージ設定
パラメーター名 | 説明 |
---|---|
|
システムコンポーネント用に作成される名前のフォーマットです。 |
|
最新のタグをレジストリーからプルするかどうかを決定します。 |
6.5.8. イメージポリシーの設定
パラメーター名 | 説明 |
---|---|
|
スケジュールされたイメージのバックグラウンドインポートの無効化を許可します。 |
|
ユーザーが Docker リポジトリーの一括インポートを行う際に、インポートされるイメージの数を制御します。デフォルトの値は 5 に設定され、ユーザーが誤って大量のイメージをインポートすることを防ぎます。-1 に設定すると無制限になります |
|
スケジュールされたイメージストリームがバックグラウンドでインポートされる 1 分あたりの最大数です。デフォルト値は 60 です。 |
|
バックグラウンドのインポートがスケジュールされているイメージストリームが、アップストリームのリポジトリーと照合される際の最小間隔 (秒単位) です。デフォルト値は 15 秒です。 |
|
標準ユーザーがイメージのインポートに使用する Docker レジストリーを制限します。この一覧を、有効な Docker イメージを含むものとユーザーが信頼し、アプリケーションのインポート元となるレジストリーに設定します。Images または ImageStreamMappings を API 経由で作成するパーミッションを持つユーザーは、このポリシーによる影響を受けません。通常、これらのパーミッションを持っているのは管理者またはシステム統合管理者のみです。 |
|
デフォルトの内部イメージレジストリーのホスト名を設定します。値は |
|
ExternalRegistryHostname は、デフォルトの外部イメージレジストリーのホスト名を設定します。この外部ホスト名は、イメージレジストリーが外部に公開される場合にのみ設定されます。値は ImageStreams の |
6.5.9. Kubernetes のマスター設定
パラメーター名 | 説明 |
---|---|
|
起動時に有効にする必要のある API レベルの一覧です (v1 など)。 |
|
無効にする必要のあるバージョン (または |
|
Kubelets に接続する方法についての情報が含まれます。 |
|
kubelet の KubernetesMasterConfig への接続方法についての情報が含まれます。これがある場合、Kubernetes のマスターをこのプロセスで起動します。 |
|
実行されていることが予想されるマスターの数です。デフォルトの値は 1 であり、正の整数に設定できますが、-1 に設定されている場合はそれがクラスターの一部であることを示します。 |
|
Kubernetes リソースのパブリック IP アドレスです。空の場合、 |
|
このノードをマスターに接続する方法を記述した .kubeconfig ファイルのファイル名です。 |
|
サービスのパブリックポートをホストに割り当てる際に使用される範囲です。デフォルトは 30000-32767 です。 |
|
サービス IP の割り当てに使用されるサブネットです。 |
|
静的に認識されるノードの一覧です。 |
6.5.10. ネットワーク設定
IPv4 アドレス領域はノード上のすべてのユーザーが共有するため、CIDR を以下のパラメーターで慎重に選択してください。OpenShift Container Platform はそれ自体に使用する CIDR を IPv4 アドレス領域から予約し、外部ユーザーとクラスターが共有するアドレス用の CIDR を IPv4 アドレス領域から予約します。
パラメーター名 | 説明 |
---|---|
|
グローバルなオーバーレイネットワークの L3 領域を指定する CIDR 文字列です。クラスターネットワークの内部使用のために予約されています。 |
|
サービスの外部 IP フィールドで許可される値を制御します。空の場合、 |
|
各ホストのサブネットに割り当てられるビット数です。たとえば 8 の場合は、ホスト上の /24 ネットワークを意味します。 |
|
ベアメタル上のタイプ LoadBalancer のサービス用に ingress IP を割り当てる範囲を制御します。そこから割り当てられる単一の CIDR を含めることができます。デフォルトは |
|
各ホストのサブネットに割り当てられるビット数です。たとえば 8 の場合は、ホスト上の /24 ネットワークを意味します。 |
|
compiled-in-network プラグインに渡されます。ここでのオプションの多くは Ansible インベントリーで制御されます。
以下は例になります。 networkConfig: clusterNetworks - cidr: 10.3.0.0/16 hostSubnetLength: 8 networkPluginName: example/openshift-ovs-subnet # serviceNetworkCIDR must match kubernetesMasterConfig.servicesSubnet serviceNetworkCIDR: 179.29.0.0/16 |
|
使用されるネットワークプラグインの名前です。 |
|
サービスネットワークを指定する CIDR 文字列です。 |
6.5.11. OAuth 認証設定
パラメーター名 | 説明 |
---|---|
|
単一プロバイダーしかない場合でも、プロバイダーの選択ページを強制的にレンダリングします。 |
|
外部アクセス用の有効なクライアントのリダイレクト URL の作成に使用されます。 |
|
認証または付与フローでエラーページのレンダリングに使用される Go テンプレートを含むファイルへのパスです。指定しない場合、デフォルトのエラーページが使用されます。 |
|
ユーザーが自身を確認する方法の順序付きの一覧です。 |
|
ログインページのレンダリングに使用される Go テンプレートを含むファイルへのパスです。指定しない場合、デフォルトのログインページが使用されます。 |
|
TLS 接続が |
|
外部アクセス用の有効なクライアントのリダイレクト URL の作成に使用されます。 |
|
アクセストークンの承認コードを交換するためのサーバー間の呼び出しに使用されます。 |
|
これがある場合、/oauth エンドポイントは定義されたパラメーターに基づいて開始します。以下は例になります。 oauthConfig: assetPublicURL: https://master.ose32.example.com:8443/console/ grantConfig: method: auto identityProviders: - challenge: true login: true mappingMethod: claim name: htpasswd_all provider: apiVersion: v1 kind: HTPasswdPasswordIdentityProvider file: /etc/origin/openshift-passwd masterCA: ca.crt masterPublicURL: https://master.ose32.example.com:8443 masterURL: https://master.ose32.example.com:8443 sessionConfig: sessionMaxAgeSeconds: 3600 sessionName: ssn sessionSecretsFile: /etc/origin/master/session-secrets.yaml tokenConfig: accessTokenMaxAgeSeconds: 86400 authorizeTokenMaxAgeSeconds: 500 |
|
ログインページなどページのカスタマイズを許可します。 |
|
プロバイダーの選択ページのレンダリングに使用される Go テンプレートを含むファイルへのパスです。指定されていない場合、デフォルトのプロバイダー選択ページが使用されます。 |
|
セッションの設定に関する情報を保持します。 |
|
ログインページなどのページのカスタマイズを許可します。 |
|
承認とアクセストークンのオプションが含まれます。 |
6.5.12. プロジェクトの設定
パラメーター名 | 説明 |
---|---|
|
デフォルトのプロジェクトノードのラベルセレクターを保持します。 |
|
プロジェクト作成とデフォルトに関する情報を保持します。
|
|
この文字列は、プロジェクトの要求 API エンドポイントからプロジェクトを要求できない場合にユーザーに提示されます。 |
|
projectrequest への応答としてプロジェクトを作成する際に使用されるテンプレートです。フォーマットは namespace/template です。これはオプションであり、指定されていない場合はデフォルトのテンプレートが使用されます。 |
6.5.13. スケジューラーの設定
パラメーター名 | 説明 |
---|---|
|
スケジューラーのセットアップ方法を記述しているファイルをポイントします。空の場合、デフォルトのスケジューリングルールが取得されます。 |
6.5.14. セキュリティーアロケーターの設定
パラメーター名 | 説明 |
---|---|
|
namespace に割り当てられる MCS カテゴリーの範囲を定義します。フォーマットは |
|
UID と MCS ラベルのプロジェクトへの自動割り当てを制御します。空の場合、割り当ては無効にされます。 |
|
プロジェクトに自動的に割り当てられる Unix ユーザー ID (UID) の合計セット数と、各 namespace が取得するブロックのサイズを定義します。たとえば、1000-1999/10 は namespace ごとに 10 の UID を割り当て、空間を使い果たす前に最大 100 のブロックを割り当てることが可能です。デフォルトでは、1 万のブロックに 10 億から 20 億 (ユーザー namespace の起動時にコンテナーイメージが使用する範囲の予想されるサイズ) を割り当てます。 |
6.5.15. サービスアカウントの設定
パラメーター名 | 説明 |
---|---|
|
サービスアカウントに、明示的な参照なしに namespace のシークレットの参照を許可するかどうかを制御します。 |
|
すべての namespace に自動作成されるサービスアカウント名の一覧です。名前が指定されていない場合、 |
|
TLS 接続がマスターに戻っていることを確認する CA です。サービスアカウントのコントローラーは、マスターへの接続を検証できるようにこのファイルの内容を Pod に自動的に挿入します。 |
|
PEM でエンコードされた RSA プライベートキーを含むファイルです。これはサービスアカウントのトークンの署名に使用されます。プライベートキーが指定されていない場合、サービスアカウント |
|
PEM でエンコードされた RSA パブリックキーを含むファイルの一覧です。いずれかのファイルにプライベートキーが含まれている場合、そのキーのパブリックの部分が使用されます。パブリックキーの一覧は、表示されているサービスアカウントのトークンの確認に使用されます。それぞれのキーは、一覧がすべて使用されるまで、または確認が正常に実行されるまで順番に試行されます。キーが指定されていない場合、サービスアカウントの認証は使用できません。 |
|
サービスアカウントに関連するオプションを保持します。
|
6.5.16. 提供情報の設定
パラメーター名 | 説明 |
---|---|
|
マスター上の DNS サーバーがクエリーに再帰的に応答することを許可します。オープンリゾルバーは DNS アンプ攻撃に使用される可能であり、マスター DNS は公開ネットワークでアクセスできないようにする必要があることに注意してください。 |
|
提供に使用される ip:port です。 |
|
イメージをインポートするための制限と動作を制御します。 |
|
PEM でエンコードされた証明書を含むファイルです。 |
|
セキュアなトラフィックを提供するための TLS 証明書情報です。 |
|
クライアント証明書が受信される際にユーザーが認識するすべての署名者の証明書バンドルです。 |
|
これがある場合、DNS サーバーが定義されたパラメーターに基づいて起動します。以下は例になります。 dnsConfig: bindAddress: 0.0.0.0:8053 bindNetwork: tcp4 |
|
ドメインサフィックスを保持します。 |
|
IP を保持します。 |
|
|
|
マスターへの接続に使用されたクライアント接続を上書きします。 |
|
サーバーに許可されている同時要求数です。ゼロの場合は無制限です。 |
|
特定のホスト名への要求を保護するのに使用される証明書の一覧です。 |
|
要求がタイムアウトするまでの秒数です。デフォルトは 60 分です。-1 の場合、要求について無制限となります。 |
|
アセット用の HTTP 提供情報です。 |
6.5.17. ボリュームの設定
パラメーター名 | 説明 |
---|---|
|
動的なプロビジョニングを有効化または無効化するブール値です。デフォルトは true です。 |
FSGroup |
固有の FSGroup ID ごとにローカルストレージの使用量のクォータを有効にするために指定できます。現時点では、これは emptyDir ボリュームのみに、基礎となる |
|
ノードのローカルボリュームのクォータを制御するオプションが含まれます。 |
|
マスターノードのボリュームプラグインを設定するオプションが含まれます。 |
|
ノードのボリュームを設定するオプションが含まれます。 |
|
ノードのボリュームプラグインを設定するオプションが含まれます。
|
|
ボリュームがその下に保存されるディレクトリーです。 |
6.5.18. 基本的な監査
監査は、システムに影響を与えた一連のアクティビティーを個別のユーザー、管理者その他システムのコンポーネント別に記述したセキュリティー関連の時系列のレコードを提供します。
監査は API サーバーレベルで実行され、サーバーに送られるすべての要求をログに記録します。それぞれの監査ログには以下の 2 つのエントリーが含まれます。
以下を含む要求行。
- 応答行 (以下の 2 を参照してください) と一致する固有 ID
- 要求のソース IP
- 呼び出されている HTTP メソッド
- 操作を呼び出している元のユーザー
-
操作を実行するための偽装ユーザー (
self
はユーザー自身を指します) -
操作を実行するための偽装グループ (
lookup
はユーザーのグループを指します) - 要求または <none> の namespace
- 要求される URI
以下を含む応答行。
- 上記 1 の固有の ID
- 応答コード
Pod の一覧を要求するユーザー admin の出力例。
AUDIT: id="5c3b8227-4af9-4322-8a71-542231c3887b" ip="127.0.0.1" method="GET" user="admin" as="<self>" asgroups="<lookup>" namespace="default" uri="/api/v1/namespaces/default/pods" AUDIT: id="5c3b8227-4af9-4322-8a71-542231c3887b" response="200"
openshift_master_audit_config
変数は、API サービス監査を有効にします。これは以下のオプションの配列を取ります。
パラメーター名 | 説明 |
---|---|
|
監査ログを有効または無効にするブール値です。デフォルト値は |
|
要求をログに記録するファイルパスです。設定されていない場合、ログはマスターログに出力されます。 |
|
ファイル名にエンコードされるタイムスタンプに基づいて古い監査ログファイルを保持する最大日数を指定します。 |
|
古い監査ログファイルを保持する最大数を指定します。 |
|
ログファイルがローテーションされる前に、ファイルの最大サイズをメガバイトで指定します。デフォルトは 100 MB です。 |
監査の設定例
auditConfig: auditFilePath: "/var/log/audit-ocp.log" enabled: true maximumFileRetentionDays: 10 maximumFileSizeMegabytes: 10 maximumRetainedFiles: 10
監査ログの高度なセットアップ
監査ログの高度なセットアップを使用する必要がある場合には、以下を使用できます。
openshift_master_audit_config={"enabled": true}
auditFilePath
のディレクトリーが、存在していない場合に作成されます。
openshift_master_audit_config={"enabled": true, "auditFilePath": "/var/log/openpaas-oscp-audit/openpaas-oscp-audit.log", "maximumFileRetentionDays": 14, "maximumFileSizeMegabytes": 500, "maximumRetainedFiles": 5}
6.5.19. 高度な監査
高度な監査機能は、詳細なイベントのフィルタリングや複数の出力バックエンドなど、基本的な監査機能に対するいくつかの改良機能を提供します。
高度な監査機能を有効にするには、以下の値を openshift_master_audit_config
パラメーターに指定します。
openshift_master_audit_config={"enabled": true, "auditFilePath": "/var/log/oscp-audit/-oscp-audit.log", "maximumFileRetentionDays": 14, "maximumFileSizeMegabytes": 500, "maximumRetainedFiles": 5, "policyFile": "/etc/security/adv-audit.yaml", "logFormat":"json"}
ポリシーファイル /etc/security/adv-audit.yaml は各マスターノードで利用可能でなければなりません。
以下の表には、使用できる追加のオプションが含まれています。
パラメーター名 | 説明 |
---|---|
|
監査ポリシー設定を定義するファイルへのパスです。 |
|
組み込まれる監査ポリシー設定です。 |
|
保存される監査ログのフォーマットを指定します。許可されている値は |
|
監査の Webhook 設定を定義する |
|
監査イベントを送信するためのストラテジーを指定します。許可される値は |
高度な監査機能を有効にするには、監査ポリシールールを記述する policyFile
または policyConfiguration
を指定する必要があります。
監査ポリシーの設定例
apiVersion: audit.k8s.io/v1beta1 kind: Policy rules: # Do not log watch requests by the "system:kube-proxy" on endpoints or services - level: None 1 users: ["system:kube-proxy"] 2 verbs: ["watch"] 3 resources: 4 - group: "" resources: ["endpoints", "services"] # Do not log authenticated requests to certain non-resource URL paths. - level: None userGroups: ["system:authenticated"] 5 nonResourceURLs: 6 - "/api*" # Wildcard matching. - "/version" # Log the request body of configmap changes in kube-system. - level: Request resources: - group: "" # core API group resources: ["configmaps"] # This rule only applies to resources in the "kube-system" namespace. # The empty string "" can be used to select non-namespaced resources. namespaces: ["kube-system"] 7 # Log configmap and secret changes in all other namespaces at the metadata level. - level: Metadata resources: - group: "" # core API group resources: ["secrets", "configmaps"] # Log all other resources in core and extensions at the request level. - level: Request resources: - group: "" # core API group - group: "extensions" # Version of group should NOT be included. # A catch-all rule to log all other requests at the Metadata level. - level: Metadata 8 # Log login failures from the web console or CLI. Review the logs and refine your policies. - level: Metadata nonResourceURLs: - /login* 9 - /oauth* 10
- 1 8
- すべてのイベントは以下の 4 つのレベルでログに記録できます。
-
None
- このルールに一致するイベントは記録されません。 -
Metadata
- 要求のメタデータ (要求しているユーザー、タイムスタンプ、リソース、verb など) をログに記録します。要求または応答本体はログに記録しません。基本的な監査で使用されるレベルと同じレベルになります。 -
Request
- イベントのメタデータと要求本体をログに記録します。応答本体はログに記録しません。 -
RequestResponse
- イベントのメタデータ、要求、および応答本体をログに記録します。
-
- 2
- このルールが適用されるユーザーの一覧です。一覧が空の場合はすべてのユーザーに適用されます。
- 3
- このルールが適用される verb の一覧です。一覧が空の場合はすべての verb に適用されます。これは API 要求に関連付けられる Kubernetes の verb です (
get
、list
、watch
、create
、update
、patch
、delete
、deletecollection
、proxy
など)。 - 4
- このルールが適用されるリソースの一覧です。一覧が空の場合はすべてのリソースに適用されます。各リソースは、それが割り当てられるグループ (例: 空の場合は Kubernetes core API、バッチ、build.openshift.io などを指します) 、およびそのグループのリソース一覧として指定されます。
- 5
- このルールが適用されるグループの一覧です。一覧が空の場合はすべてのグループに適用されます。
- 6
- このルールが適用されるリソース以外の URL の一覧です。
- 7
- このルールが適用される namespace の一覧です。一覧が空の場合はすべての namespace に適用されます。
- 9
- Web コンソールが使用するエンドポイントです。
- 10
- CLI が使用するエンドポイントです。
高度な監査についての詳細は、Kubernetes のドキュメントを参照してください。
6.5.20. etcd の TLS 暗号の指定
マスターと etcd サーバー間の通信で使用するサポートされている TLS 暗号を指定できます。
各 etcd ノードで、etcd をアップグレードします。
# yum update etcd iptables-services
お使いのバージョンが 3.2.22 以降であることを確認します。
# etcd --version etcd Version: 3.2.22
各マスターホストで、
/etc/origin/master/master-config.yaml
ファイルで有効にする暗号を指定します。servingInfo: ... minTLSVersion: VersionTLS12 cipherSuites: - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - TLS_RSA_WITH_AES_256_CBC_SHA - TLS_RSA_WITH_AES_128_CBC_SHA ...
各マスターホストで、マスターサービスを再起動します。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers
暗号が適用されていることを確認します。たとえば、TLSv1.2 暗号
ECDHE-RSA-AES128-GCM-SHA256
については、以下のコマンドを実行します。# openssl s_client -connect etcd1.example.com:2379 1 CONNECTED(00000003) depth=0 CN = etcd1.example.com verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 CN = etcd1.example.com verify error:num=21:unable to verify the first certificate verify return:1 139905367488400:error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate:s3_pkt.c:1493:SSL alert number 42 139905367488400:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177: --- Certificate chain 0 s:/CN=etcd1.example.com i:/CN=etcd-signer@1529635004 --- Server certificate -----BEGIN CERTIFICATE----- MIIEkjCCAnqgAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMR8wHQYDVQQDDBZldGNk ........ .... eif87qttt0Sl1vS8DG1KQO1oOBlNkg== -----END CERTIFICATE----- subject=/CN=etcd1.example.com issuer=/CN=etcd-signer@1529635004 --- Acceptable client certificate CA names /CN=etcd-signer@1529635004 Client Certificate Types: RSA sign, ECDSA sign Requested Signature Algorithms: RSA+SHA256:ECDSA+SHA256:RSA+SHA384:ECDSA+SHA384:RSA+SHA1:ECDSA+SHA1 Shared Requested Signature Algorithms: RSA+SHA256:ECDSA+SHA256:RSA+SHA384:ECDSA+SHA384:RSA+SHA1:ECDSA+SHA1 Peer signing digest: SHA384 Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 1666 bytes and written 138 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES128-GCM-SHA256 Session-ID: Session-ID-ctx: Master-Key: 1EFA00A91EE5FC5EDDCFC67C8ECD060D44FD3EB23D834EDED929E4B74536F273C0F9299935E5504B562CD56E76ED208D Key-Arg : None Krb5 Principal: None PSK identity: None PSK identity hint: None Start Time: 1529651744 Timeout : 300 (sec) Verify return code: 21 (unable to verify the first certificate)
- 1
etcd1.example.com
は etcd ホストの名前です。
6.6. ノード設定ファイル
以下の node-config.yaml ファイルは、現時点でデフォルト値で生成されるノード設定ファイルのサンプルです。ユーザーは新規ノード設定ファイルを作成し、OpenShift Container Platform のインストール済みバージョンの有効なオプションを表示できます。
例6.2 ノード設定ファイルのサンプル
allowDisabledDocker: false apiVersion: v1 authConfig: authenticationCacheSize: 1000 authenticationCacheTTL: 5m authorizationCacheSize: 1000 authorizationCacheTTL: 5m dnsDomain: cluster.local dnsIP: 10.0.2.15 1 dockerConfig: execHandlerName: native imageConfig: format: openshift/origin-${component}:${version} latest: false iptablesSyncPeriod: 5s kind: NodeConfig masterKubeConfig: node.kubeconfig networkConfig: mtu: 1450 networkPluginName: "" nodeIP: "" nodeName: node1.example.com podManifestConfig: 2 path: "/path/to/pod-manifest-file" 3 fileCheckIntervalSeconds: 30 4 proxyArguments: proxy-mode: - iptables 5 volumeConfig: localQuota: perFSGroup: null6 servingInfo: bindAddress: 0.0.0.0:10250 bindNetwork: tcp4 certFile: server.crt clientCA: node-client-ca.crt keyFile: server.key namedCertificates: null volumeDirectory: /root/openshift.local.volumes
- 1
- ここにアドレスを追加することで、Pod の /etc/resolv.conf の先頭に追加される IP アドレスを設定します。
- 2
- 特定のノードセット上、またはすべてのノード上に、スケジューラーを介することなく Pod を直接配置することを許可します。ユーザーは、Pod を使って同じ管理タスクを実行し、各ノードで同じサービスをサポートすることができます。
- 3
- Pod のマニフェストファイルまたはディレクトリーへのパスを指定します。ディレクトリーの場合、1 つ以上のマニフェストファイルが含まれることが予想されます。これは、Pod をノード上に作成するために Kubelet によって使用されます。
- 4
- 新規データのマニフェストファイルをチェックする間隔 (秒単位) です。この値は正の値で入力する必要があります。
- 5
- 使用するサービスプロキシーの実装です。
- 6
- ローカルの emptyDir ボリュームのクォータの予備サポートです。この値を FSGroup ごと、ノードごとに必要なクォータを示すリソース量に設定します (1Gi、512Mi など)。現時点で、volumeDirectory は「gquota」オプションを指定してマウントされている、 XFS ファイルシステム上にある必要があり、一致する SCC (security context constraint) の fsGroup タイプは「MustRunAs」に設定する必要があります。
ノード設定ファイルはノードのリソースを決定します。詳細は、「Allocating node resources section in the Cluster Administrator guide」を参照してください。
6.6.1. Pod とノードの設定
パラメーター名 | 説明 |
---|---|
|
OpenShift Container Platform ノードを起動する完全に指定された設定です。 |
|
ノードは複数の IP を持つことがあるため、Pod のトラフィックルーティングに使用する IP を指定します。指定されていない場合、nodeName でネットワーク解析/ルックアップが実行され、最初の非ループバックアドレスが使用されます。 |
|
クラスターの特定ノードを識別するために使用される値です。可能な場合、この値はユーザーの完全修飾ホスト名にできます。ユーザーが静的ノードのセットをマスターに記述している場合、この値は一覧にある値のいずれかに一致している必要があります。 |
|
失敗したノード上の Pod を削除するための猶予期間を制御します。有効な時間文字列を取ります。空の場合、Pod のデフォルトのエビクションタイムアウトを取ります。 |
|
Pod へのプロキシー処理時に使用するクライアント証明書/キーを指定します。 |
6.6.2. Docker の設定
パラメーター名 | 説明 |
---|---|
|
true の場合、Kubelet は Docker のエラーを無視します。これは、Docker を起動させていないマシンでノードを起動できることを意味します。 |
|
Docker 関連の設定オプションを保持します。 |
|
Docker コンテナーでのコマンドの実行に使用するハンドラーです。 |
6.6.3. Docker 1.9 以降を使用したイメージの並行プル
Docker 1.9 以降を使用している場合は、イメージの並行プルを有効にしておくことができます。デフォルトでは、イメージは一度に 1 つずつプルされます。
Docker 1.9 よりも前のバージョンでは、データの破損による問題が発生する可能性があります。1.9 以降では破損の問題は解消し、並行プルに安全に切り替えることができます。
kubeletArguments:
serialize-image-pulls:
- "false" 1
- 1
- 並行プルを無効にするには true に変更します (デフォルトの設定)。
6.7. パスワードおよびその他の機密データ
認証設定によっては、LDAP bindPassword
または OAuth clientSecret
の値が必須になる場合があります。これらの値は、マスター設定ファイルに直接指定する代わりに、環境変数、外部ファイルまたは暗号化ファイルとして指定することができます。
環境変数の例
... bindPassword: env: BIND_PASSWORD_ENV_VAR_NAME
外部ファイルの例
... bindPassword: file: bindPassword.txt
暗号化された外部ファイルの例
... bindPassword: file: bindPassword.encrypted keyFile: bindPassword.key
上記の例の暗号化ファイルとキーファイルを作成するには、以下を入力します。
$ oc adm ca encrypt --genkey=bindPassword.key --out=bindPassword.encrypted > Data to encrypt: B1ndPass0rd!
Ansible ホストインベントリーファイル (デフォルトで /etc/ansible/hosts) に最初に一覧表示されているマスターから oc adm
コマンドを実行します。
暗号化データのセキュリティーレベルは復号化キーと同程度です。ファイルシステムのパーミッションとキーファイルへのアクセスを制限する際には十分な注意が必要です。
6.8. 新規設定ファイルの作成
OpenShift Container Platform 設定をゼロから定義するときは、新規設定ファイルを作成することから開始します。
マスターホストの設定ファイルでは、openshift start
コマンドを --write-config
オプションと共に使用して設定ファイルを作成します。ノードホストの場合は、oc adm create-node-config
コマンドを使用して設定ファイルを作成します。
以下のコマンドは、関連する起動設定ファイル、証明書ファイルその他ファイルを指定された --write-config
または --node-dir
ディレクトリーに書き込みます。
生成される証明書ファイルは 2 年間有効です。一方、認証局 (CA) の証明書は 5 年間有効です。この値は --expire-days
と --signer-expire-days
のオプションを使用して変更できますが、セキュリティー上の理由によりこの値をこれ以上大きい値に変更しないことが推奨されます。
オールインワンサーバー (マスターとノードが同一ホスト上にある) の設定ファイルを指定されたディレクトリーに作成するには、以下を入力します。
$ openshift start --write-config=/openshift.local.config
マスター設定ファイルとその他の必須ファイルを指定されたディレクトリーに作成するには、以下を実行します。
$ openshift start master --write-config=/openshift.local.config/master
ノード設定ファイルとその他の関連ファイルを指定されたディレクトリーに作成するには、以下を実行します。
$ oc adm create-node-config \ --node-dir=/openshift.local.config/node-<node_hostname> \ --node=<node_hostname> \ --hostnames=<node_hostname>,<ip_address> \ --certificate-authority="/path/to/ca.crt" \ --signer-cert="/path/to/ca.crt" \ --signer-key="/path/to/ca.key" --signer-serial="/path/to/ca.serial.txt" --node-client-certificate-authority="/path/to/ca.crt"
ノード設定ファイルを作成する際に、--hostnames
オプションは、サーバー証明書を有効にする必要のあるすべてのホスト名または IP アドレスのカンマ区切りの一覧を受け入れます。
6.9. 設定ファイルの使用によるサーバーの起動
マスターまたはノード設定ファイルをユーザー仕様に変更すると、これを引数として指定してサーバーを起動すると、使用できるようになります。設定ファイルを指定する場合は、ユーザーが渡す他のコマンドラインオプションはいずれも認識されないことに注意してください。
マスター設定およびノード設定ファイルを使用してオールインワンサーバーを起動するには、以下を実行します。
$ openshift start --master-config=/openshift.local.config/master/master-config.yaml --node-config=/openshift.local.config/node-<node_hostname>/node-config.yaml
マスター設定ファイルを使用してマスターサーバーを起動するには、以下を実行します。
$ openshift start master --config=/openshift.local.config/master/master-config.yaml
ノード設定ファイルを使ってノードサーバーを起動するには、以下を実行します。
$ openshift start node --config=/openshift.local.config/node-<node_hostname>/node-config.yaml
6.10. ロギングレベルの設定
OpenShift Container Platform は、5 段階のログメッセージの重要度を用いて、systemd-journald.service
を使ってデバッグ用にログメッセージを収集します。ロギングレベルは、以下のような Kubernetes のロギング規則に基づいています。
オプション | 説明 |
---|---|
0 |
エラーと警告のみ |
2 |
通常の情報 |
4 |
デバッグレベルの情報 |
6 |
API レベルのデバッグ情報 (要求 / 応答) |
8 |
本体レベルの API のデバッグ情報 |
ユーザーは、/etc/sysconfig/atomic-openshift-node、/etc/sysconfig/atomic-openshift-master-api ファイル、および /etc/sysconfig/atomic-openshift-master-controllers ファイルにログレベルのオプションを設定することにより、ログに記録する INFO メッセージを制御できます。すべてのメッセージを収集するようにログを設定すると、解釈が困難な膨大なログが生成され、多くの領域が占領されます。すべてのメッセージの収集は、デバッグで使用する場合にとどめる必要があります。
FATAL、ERROR、WARNING、および一部の INFO の重要度を伴うメッセージは、ログの設定に関係なくログに表示されます。
マスターまたはノードシステムのログは、以下のコマンドで表示できます。
# journalctl -r -u <journal_name>
最新のエントリーから表示するには、-r
オプションを使用します。
例を以下に示します。
# journalctl -r -u atomic-openshift-master-controllers # journalctl -r -u atomic-openshift-master-api # journalctl -r -u atomic-openshift-node.service
ロギングレベルを変更するには、以下を実行します。
- マスターの /etc/sysconfig/atomic-openshift-master ファイル、またはノードの /etc/sysconfig/atomic-openshift-node ファイルを編集します。
上記の Log Level Options 表の値を
OPTIONS=--loglevel=
フィールドに入力します。例を以下に示します。
OPTIONS=--loglevel=4
- マスターまたはノードを再起動します。「OpenShift Container Platform サービスの再起動」を参照してください。
再起動後は、すべての新しいログメッセージは新しい設定に従ったメッセージに従います。古いメッセージは変更されません。
デフォルトのログレベルは、通常インストール (Advanced installation) を使って設定できます。詳細は「クラスター変数」を参照してください。
以下の例は、各種のログレベルのマスター journald ログの抜粋です。タイムスタンプとシステム情報はこれらの例では削除されています。
loglevel = 0 の journalctl -u atomic-openshift-master-controllers.service 出力の抜粋
4897 plugins.go:77] Registered admission plugin "NamespaceLifecycle" 4897 start_master.go:290] Warning: assetConfig.loggingPublicURL: Invalid value: "": required to view aggregated container logs in the console, master start will continue. 4897 start_master.go:290] Warning: assetConfig.metricsPublicURL: Invalid value: "": required to view cluster metrics in the console, master start will continue. 4897 start_master.go:290] Warning: aggregatorConfig.proxyClientInfo: Invalid value: "": if no client certificate is specified, the aggregator will be unable to proxy to remote servers, 4897 start_master.go:412] Starting controllers on 0.0.0.0:8444 (v3.7.14) 4897 start_master.go:416] Using images from "openshift3/ose-<component>:v3.7.14" 4897 standalone_apiserver.go:106] Started health checks at 0.0.0.0:8444 4897 plugins.go:77] Registered admission plugin "NamespaceLifecycle" 4897 configgetter.go:53] Initializing cache sizes based on 0MB limit 4897 leaderelection.go:105] Attempting to acquire openshift-master-controllers lease as master-bkr-hv03-guest44.dsal.lab.eng.bos.redhat.com-10.19.41.74-xtz6lbqb, renewing every 3s, hold 4897 leaderelection.go:179] attempting to acquire leader lease... systemd[1]: Started Atomic OpenShift Master Controllers. 4897 leaderelection.go:189] successfully acquired lease kube-system/openshift-master-controllers 4897 event.go:218] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"kube-system", Name:"openshift-master-controllers", UID:"aca86731-ffbe-11e7-8d33-525400c845a8", APIVersion:"v1", 4897 start_master.go:627] Started serviceaccount-token controller 4897 factory.go:351] Creating scheduler from configuration: {{ } [{NoVolumeZoneConflict <nil>} {MaxEBSVolumeCount <nil>} {MaxGCEPDVolumeCount <nil>} {MaxAzureDiskVolumeCount <nil>} {Mat 4897 factory.go:360] Registering predicate: NoVolumeZoneConflict 4897 plugins.go:145] Predicate type NoVolumeZoneConflict already registered, reusing. 4897 factory.go:360] Registering predicate: MaxEBSVolumeCount 4897 plugins.go:145] Predicate type MaxEBSVolumeCount already registered, reusing. 4897 factory.go:360] Registering predicate: MaxGCEPDVolumeCount
loglevel = 2 の journalctl -u atomic-openshift-master-controllers.service 出力の抜粋
4897 master.go:47] Initializing SDN master of type "redhat/openshift-ovs-subnet" 4897 master.go:107] Created ClusterNetwork default (network: "10.128.0.0/14", hostSubnetBits: 9, serviceNetwork: "172.30.0.0/16", pluginName: "redhat/openshift-ovs-subnet") 4897 start_master.go:690] Started "openshift.io/sdn" 4897 start_master.go:680] Starting "openshift.io/service-serving-cert" 4897 controllermanager.go:466] Started "namespace" 4897 controllermanager.go:456] Starting "daemonset" 4897 controller_utils.go:1025] Waiting for caches to sync for namespace controller 4897 shared_informer.go:298] resyncPeriod 120000000000 is smaller than resyncCheckPeriod 600000000000 and the informer has already started. Changing it to 600000000000 4897 start_master.go:690] Started "openshift.io/service-serving-cert" 4897 start_master.go:680] Starting "openshift.io/image-signature-import" 4897 start_master.go:690] Started "openshift.io/image-signature-import" 4897 start_master.go:680] Starting "openshift.io/templateinstance" 4897 controllermanager.go:466] Started "daemonset" 4897 controllermanager.go:456] Starting "statefulset" 4897 daemoncontroller.go:222] Starting daemon sets controller 4897 controller_utils.go:1025] Waiting for caches to sync for daemon sets controller 4897 controllermanager.go:466] Started "statefulset" 4897 controllermanager.go:456] Starting "cronjob" 4897 stateful_set.go:147] Starting stateful set controller 4897 controller_utils.go:1025] Waiting for caches to sync for stateful set controller 4897 start_master.go:690] Started "openshift.io/templateinstance" 4897 start_master.go:680] Starting "openshift.io/horizontalpodautoscaling
loglevel = 4 の journalctl -u atomic-openshift-master-controllers.service 出力の抜粋
4897 factory.go:366] Registering priority: Zone 4897 factory.go:401] Creating scheduler with fit predicates 'map[GeneralPredicates:{} CheckNodeMemoryPressure:{} CheckNodeDiskPressure:{} Region:{} NoVolumeZoneC 4897 controller_utils.go:1025] Waiting for caches to sync for tokens controller 4897 controllermanager.go:108] Version: v1.7.6+a08f5eeb62 4897 leaderelection.go:179] attempting to acquire leader lease... 4897 leaderelection.go:189] successfully acquired lease kube-system/kube-controller-manager 4897 event.go:218] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"kube-system", Name:"kube-controller-manager", UID:"acb3e9c6-ffbe-11e7-8d33-525400c845a8", APIVersion:"v1", Resou 4897 controller_utils.go:1032] Caches are synced for tokens controller 4897 plugins.go:101] No cloud provider specified. 4897 controllermanager.go:481] "serviceaccount-token" is disabled 4897 controllermanager.go:450] "bootstrapsigner" is disabled 4897 controllermanager.go:450] "tokencleaner" is disabled 4897 controllermanager.go:456] Starting "garbagecollector" 4897 start_master.go:680] Starting "openshift.io/build" 4897 controllermanager.go:466] Started "garbagecollector" 4897 controllermanager.go:456] Starting "deployment" 4897 garbagecollector.go:126] Starting garbage collector controller 4897 controller_utils.go:1025] Waiting for caches to sync for garbage collector controller 4897 controllermanager.go:466] Started "deployment" 4897 controllermanager.go:450] "horizontalpodautoscaling" is disabled 4897 controllermanager.go:456] Starting "disruption" 4897 deployment_controller.go:152] Starting deployment controller
loglevel = 8 の journalctl -u atomic-openshift-master-controllers.service 出力の抜粋
4897 plugins.go:77] Registered admission plugin "NamespaceLifecycle" 4897 start_master.go:290] Warning: assetConfig.loggingPublicURL: Invalid value: "": required to view aggregated container logs in the console, master start will continue. 4897 start_master.go:290] Warning: assetConfig.metricsPublicURL: Invalid value: "": required to view cluster metrics in the console, master start will continue. 4897 start_master.go:290] Warning: aggregatorConfig.proxyClientInfo: Invalid value: "": if no client certificate is specified, the aggregator will be unable to proxy to remote serv 4897 start_master.go:412] Starting controllers on 0.0.0.0:8444 (v3.7.14) 4897 start_master.go:416] Using images from "openshift3/ose-<component>:v3.7.14" 4897 standalone_apiserver.go:106] Started health checks at 0.0.0.0:8444 4897 plugins.go:77] Registered admission plugin "NamespaceLifecycle" 4897 configgetter.go:53] Initializing cache sizes based on 0MB limit 4897 leaderelection.go:105] Attempting to acquire openshift-master-controllers lease as master-bkr-hv03-guest44.dsal.lab.eng.bos.redhat.com-10.19.41.74-xtz6lbqb, renewing every 3s, 4897 leaderelection.go:179] attempting to acquire leader lease... systemd[1]: Started Atomic OpenShift Master Controllers. 4897 leaderelection.go:189] successfully acquired lease kube-system/openshift-master-controllers 4897 event.go:218] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"kube-system", Name:"openshift-master-controllers", UID:"aca86731-ffbe-11e7-8d33-525400c845a8", APIVersion:" 4897 start_master.go:627] Started serviceaccount-token controller
loglevel = 2 の journalctl -u atomic-openshift-master-api.service 出力の抜粋
4613 plugins.go:77] Registered admission plugin "NamespaceLifecycle" 4613 master.go:320] Starting Web Console https://bkr-hv03-guest44.dsal.lab.eng.bos.redhat.com:8443/console/ 4613 master.go:329] Starting OAuth2 API at /oauth 4613 master.go:320] Starting Web Console https://bkr-hv03-guest44.dsal.lab.eng.bos.redhat.com:8443/console/ 4613 master.go:329] Starting OAuth2 API at /oauth 4613 master.go:320] Starting Web Console https://bkr-hv03-guest44.dsal.lab.eng.bos.redhat.com:8443/console/ 4613 master.go:329] Starting OAuth2 API at /oauth 4613 swagger.go:38] No API exists for predefined swagger description /oapi/v1 4613 swagger.go:38] No API exists for predefined swagger description /api/v1 [restful] 2018/01/22 16:53:14 log.go:33: [restful/swagger] listing is available at https://bkr-hv03-guest44.dsal.lab.eng.bos.redhat.com:8443/swaggerapi [restful] 2018/01/22 16:53:14 log.go:33: [restful/swagger] https://bkr-hv03-guest44.dsal.lab.eng.bos.redhat.com:8443/swaggerui/ is mapped to folder /swagger-ui/ 4613 master.go:320] Starting Web Console https://bkr-hv03-guest44.dsal.lab.eng.bos.redhat.com:8443/console/ 4613 master.go:329] Starting OAuth2 API at /oauth 4613 swagger.go:38] No API exists for predefined swagger description /oapi/v1 4613 swagger.go:38] No API exists for predefined swagger description /api/v1 [restful] 2018/01/22 16:53:14 log.go:33: [restful/swagger] listing is available at https://bkr-hv03-guest44.dsal.lab.eng.bos.redhat.com:8443/swaggerapi [restful] 2018/01/22 16:53:14 log.go:33: [restful/swagger] https://bkr-hv03-guest44.dsal.lab.eng.bos.redhat.com:8443/swaggerui/ is mapped to folder /swagger-ui/ Starting Web Console https://bkr-hv03-guest44.dsal.lab.eng.bos.redhat.com:8443/console/ Starting OAuth2 API at /oauth No API exists for predefined swagger description /oapi/v1 No API exists for predefined swagger description /api/v1
6.11. OpenShift Container Platform サービスの再起動
設定の変更を適用するには、OpenShift Container Platform サービスを再起動する必要があります。
マスターを再起動するには、以下のコマンドを実行します。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers
各ノード上でノードホストを再起動するには、以下のコマンドを実行します。
# systemctl restart atomic-openshift-node
第7章 OpenShift Ansible Broker の設定
7.1. 概要
OpenShift Ansible Broker (OAB) をクラスターにデプロイする際に、その動作の大半は、起動時に読み込まれるブローカーの設定ファイルによって決定されます。ブローカーの設定は、ブローカーの namespace (デフォルトでは (openshift-ansible-service-broker) に ConfigMap オブジェクトとして格納されます。
OpenShift Ansible Broker 設定ファイルの例
registry: 1 - type: dockerhub name: docker url: https://registry.hub.docker.com org: <dockerhub_org> fail_on_error: false - type: rhcc name: rhcc url: https://registry.access.redhat.com fail_on_error: true white_list: - "^foo.*-apb$" - ".*-apb$" black_list: - "bar.*-apb$" - "^my-apb$" - type: local_openshift name: lo namespaces: - openshift white_list: - ".*-apb$" dao: 2 etcd_host: localhost etcd_port: 2379 log: 3 logfile: /var/log/ansible-service-broker/asb.log stdout: true level: debug color: true openshift: 4 host: "" ca_file: "" bearer_token_file: "" image_pull_policy: IfNotPresent sandbox_role: "edit" keep_namespace: false keep_namespace_on_error: true broker: 5 bootstrap_on_startup: true dev_broker: true launch_apb_on_bind: false recovery: true output_request: true ssl_cert_key: /path/to/key ssl_cert: /path/to/cert refresh_interval: "600s" auth: - type: basic enabled: true secrets: 6 - title: Database credentials secret: db_creds apb_name: dh-rhscl-postgresql-apb
7.2. OpenShift Ansible Broker 設定の変更
OAB のデフォルト設定をデプロイした後に変更するには、以下を実行します。
OAB の namespace の broker-config ConfigMap オブジェクトを、cluster-admin 権限を持つユーザーとして編集します。
$ oc edit configmap broker-config -n openshift-ansible-service-broker
更新内容を保存した後、変更を有効にするために OAB のデプロイメント設定を再デプロイします。
$ oc rollout latest dc/asb -n openshift-ansible-service-broker
7.3. レジストリー設定
registry
セクションでは、ブローカーが APB 用に参照する必要があるレジストリーを定義できます。
フィールド | 説明 | 必須 |
---|---|---|
|
レジストリーの名前です。このレジストリーから APB を識別するためにブローカーによって使用されます。 |
Y |
|
レジストリーに対して認証するためのユーザー名です。 |
N |
|
レジストリーに対して認証するためのパスワードです。 |
N |
|
レジストリー認証情報が |
N |
|
読み取る必要があるレジストリー認証情報を格納しているシークレットまたはファイルの名前です。 |
N ( |
|
イメージが含まれている namespace または組織です。 |
N |
|
レジストリーのタイプです。使用可能なアダプターは |
Y |
|
|
N |
|
イメージ情報を取得するために使用される URL です。これは、RHCC の場合に広範囲に使用されます。 |
N |
|
このレジストリーが失敗した場合にブートストラップ要求を失敗させるかどうかを指定します。失敗させる場合、その他のレジストリーの読み込みの実行を停止します。 |
N |
|
許可されるイメージ名を定義するための正規表現の一覧です。カタログへの APB の追加を許可するホワイトリストを作成する必要があります。レジストリー内のすべての APB を取得する必要がある場合は、最も許容度の高い正規表現である |
N |
|
許可できないイメージ名を定義するために使用される正規表現の一覧です。詳細については、「APB のフィルタリング」を参照してください。 |
N |
|
OpenShift Container レジストリーで使用されるイメージの一覧です。 |
N |
7.3.1. 実稼働または開発
実稼働ブローカー設定は、Red Hat Container Catalog (RHCC) などの信頼できるコンテナーディストリビューションレジストリーを参照するように設計されています。
registry: - name: rhcc type: rhcc url: https://registry.access.redhat.com tag: v3.9 white_list: - ".*-apb$" - type: local_openshift name: localregistry namespaces: - openshift white_list: []
開発ブローカー設定は、主にブローカーの開発作業に取り組む開発者によって使用されます。開発者設定を有効にするには、レジストリー名を dev
に設定し、broker
セクションの dev_broker
フィールドを true
に設定します。
registry: name: dev
broker: dev_broker: true
7.3.2. レジストリー認証情報の保存
ブローカー設定は、ブローカーによるレジストリー認証情報の読み取り方法を決定します。レジストリー認証情報は、registry
セクションの user
値と pass
値から読み取ることができます。以下は例になります。
registry: - name: isv type: openshift url: https://registry.connect.redhat.com user: <user> pass: <password>
これらの認証情報にパブリックにアクセスできないようにするには、registry
セクションの auth_type
フィールドを secret
または file
タイプに設定します。secret
タイプは、ブローカーの namespace からシークレットを使用するようにレジストリーを設定します。一方、file
タイプは、ボリュームとしてマウントされているシークレットを使用するようにレジストリーを設定します。
secret
または file
タイプを使用するには、以下を実行します。
関連するシークレットには、
username
とpassword
の値が定義されている必要があります。シークレットを使用する場合は、openshift-ansible-service-broker
namespace が存在していることを確認する必要があります。シークレットはこの namespace から読み取られるためです。たとえば、reg-creds.yaml ファイルを作成します。
$ cat reg-creds.yaml --- username: <username> password: <password>
このファイルから
openshift-ansible-service-broker
namespace にシークレットを作成します。$ oc create secret generic \ registry-credentials-secret \ --from-file reg-creds.yaml \ -n openshift-ansible-service-broker
secret
またはfile
のどちらのタイプを使用するか選択します。secret
タイプを使用するには、以下を実行します。ブローカー設定で、
auth_type
をsecret
に、auth_name
をシークレットの名前に設定します。registry: - name: isv type: openshift url: https://registry.connect.redhat.com auth_type: secret auth_name: registry-credentials-secret
シークレットが置かれている namespace を設定します。
openshift: namespace: openshift-ansible-service-broker
file
タイプを使用するには、以下を実行します。asb
デプロイメント設定を編集し、ファイルを /tmp/registry-credentials/reg-creds.yaml にマウントします。$ oc edit dc/asb -n openshift-ansible-service-broker
containers.volumeMounts
セクションに、以下を追加します。volumeMounts: - mountPath: /tmp/registry-credentials name: reg-auth
volumes
セクションに、以下を追加します。volumes: - name: reg-auth secret: defaultMode: 420 secretName: registry-credentials-secret
ブローカー設定で、
auth_type
をfile
に、auth_type
をファイルの場所に設定します。registry: - name: isv type: openshift url: https://registry.connect.redhat.com auth_type: file auth_name: /tmp/registry-credentials/reg-creds.yaml
7.3.3. モックレジストリー
モックレジストリーは、ローカルの APB 仕様を読み取る場合に便利です。イメージ仕様を検索するために外部のレジストリーにアクセスする代わりに、ローカル仕様の一覧を使用します。 モックレジストリーを使用するには、レジストリーの名前を mock
に設定します。
registry: - name: mock type: mock
7.3.4. Dockerhub レジストリー
dockerhub
タイプを使用すると、DockerHub の特定の組織から APB を読み込むことができます (例: ansibleplaybookbundle)。
registry: - name: dockerhub type: dockerhub org: ansibleplaybookbundle user: <user> pass: <password> white_list: - ".*-apb$"
7.3.5. APB のフィルタリング
APB は、ブローカー設定内のレジストリーベースに設定された white_list
または black_list
パラメーターの組み合わせを使用して、イメージ名でフィルタリングできます。
これらはどちらもオプションの正規表現の一覧であり、特定のレジストリーで一致するものを判別できるように検出されたすべての APB に対して実行されます。
存在するパラメーター | 許可 | ブロック |
---|---|---|
ホワイトリストのみ |
一覧の正規表現に一致。 |
一致しないすべての APB。 |
ブラックリストのみ |
一致しないすべての APB。 |
一覧の正規表現に一致する APB。 |
両方とも存在する |
ホワイトリストの正規表現に一致し、ブラックリストの正規表現に一致しない。 |
ブラックリストの正規表現に一致する APB。 |
なし |
レジストリーのどの APB も許可されない。 |
レジストリーのすべての APB。 |
例を以下に示します。
ホワイトリストのみ
white_list: - "foo.*-apb$" - "^my-apb$"
この場合は、foo.*-apb$
と my-apb
に一致する APB が許可されます。それ以外の APB はすべて拒否されます。
ブラックリストのみ
black_list: - "bar.*-apb$" - "^foobar-apb$"
この場合は、bar.*-apb$
と foobar-apb
に一致する APB がブロックされます。それ以外の APB はすべて許可されます。
ホワイトリストとブラックリスト
white_list: - "foo.*-apb$" - "^my-apb$" black_list: - "^foo-rootkit-apb$"
ここでは、foo-rootkit-apb
はホワイトリストに一致するにもかかわらず、ブラックリストによって明確にブロックされます。これは、ホワイトリストの一致が上書きされるためです。
そうでない場合は、foo.*-apb$
と my-apb
に一致する APB のみが許可されます。
ブローカー設定の registry
セクションのサンプル:
registry: - type: dockerhub name: dockerhub url: https://registry.hub.docker.com user: <user> pass: <password> org: <org> white_list: - "foo.*-apb$" - "^my-apb$" black_list: - "bar.*-apb$" - "^foobar-apb$"
7.3.6. ローカルの OpenShift Container レジストリー
local_openshift
タイプを使用すると、OpenShift Container Platform クラスター内の OpenShift Container レジストリーから APB を読み込むことができます。公開された APB を検索する namespace を設定できます。
registry: - type: local_openshift name: lo namespaces: - openshift white_list: - ".*-apb$"
7.3.7. Red Hat Container Catalog レジストリー
rhcc
タイプを使用すると、Red Hat Container Catalog (RHCC) レジストリーに公開された APB を読み込むことができます。
registry: - name: rhcc type: rhcc url: https://registry.access.redhat.com white_list: - ".*-apb$"
7.3.8. ISV レジストリー
openshift
タイプを使用すると、 registry.connect.redhat.com にある ISV コンテナーレジストリーに公開された APB を読み込むことができます。
registry: - name: isv type: openshift user: <user> 1 pass: <password> url: https://registry.connect.redhat.com images: 2 - <image_1> - <image_2> white_list: - ".*-apb$"
- 1
- その他の認証オプションについては、「レジストリー認証情報の保存」を参照してください。
- 2
- 現時点で
openshift
タイプは設定済みのレジストリーを検索できないため、ブローカーのブートストラップ時にソースとして使用するイメージの一覧でブローカーを設定する必要があります。イメージ名は、レジストリー URL のない完全修飾名でなければなりません。
7.3.9. 複数のレジストリー
複数のレジストリーを使用して APB を論理的な組織に分割し、それらを同じブローカーから管理できます。レジスターには一意の空でない名前が必要です。一意の名前がない場合、サービスブローカーは起動に失敗し、問題について警告するエラーメッセージを表示します。
registry: - name: dockerhub type: dockerhub org: ansibleplaybookbundle user: <user> pass: <password> white_list: - ".*-apb$" - name: rhcc type: rhcc url: <rhcc_url> white_list: - ".*-apb$"
7.4. DAO 設定
フィールド | 説明 | 必須 |
---|---|---|
|
etcd ホストの URL です。 |
Y |
|
|
Y |
7.5. ログ設定
フィールド | 説明 | 必須 |
---|---|---|
|
ブローカーのログを書き込む場所です。 |
Y |
|
ログを標準出力に書き込みます。 |
Y |
|
ログ出力のレベルです。 |
Y |
|
ログに色付けします。 |
Y |
7.6. OpenShift 設定
フィールド | 説明 | 必須 |
---|---|---|
|
OpenShift Container Platform ホストです。 |
N |
|
認証局ファイルの場所です。 |
N |
|
使用するベアラートークンの場所です。 |
N |
|
イメージをプルするタイミングです。 |
Y |
|
ブローカーがデプロイされている namespace です。シークレットを介して渡されるパラメーター値などに重要です。 |
Y |
|
APB サンドボックス環境に対して指定するロールです。 |
Y |
|
APB の実行後に namespace を常に保持します。 |
N |
|
APB の実行でエラーが発生した後に namespace を保持します。 |
N |
7.7. ブローカー設定
broker
セクションでは、有効/無効にする機能をブローカーに指示します。また、完全な機能を有効にするファイルがディスク上のどこにあるかをブローカーに指示します。
フィールド | 説明 | デフォルト値 | 必須 |
---|---|---|---|
|
開発ルートにアクセスできるようにします。 |
|
N |
|
バインドが no-op (無処理) になることを許可します。 |
|
N |
|
ブローカーが起動時に自らをブートストラップできるようにします。APB を設定済みのレジストリーから取得します。 |
|
N |
|
etcd にある保留中のジョブを処理することによって、ブローカーが自らをリカバリーできるようにします。 |
|
N |
|
デバッグを容易に行えるように、ブローカーが要求の受信時にそれをログファイルに出力できるようにします。 |
|
N |
|
TLS キーファイルがどこにあるかをブローカーに指示します。これが設定されない場合、API サーバーはキーファイルの作成を試みます。 |
|
N |
|
TLS .crt ファイルがどこにあるかをブローカーに指示します。これが設定されない場合、API サーバーはファイルの作成を試みます。 |
|
N |
|
レジストリーで新規イメージ仕様をクエリーする間隔です。 |
|
N |
|
ブローカーが APB の実行中にユーザーのパーミッションをエスカレーションできるようにします。 |
|
N |
|
ブローカーが予期する URL のプレフィックスを設定します。 |
|
N |
非同期のバインドまたはバインド解除は実験的な機能であり、サポートされていないか、デフォルトでは有効になっていません。非同期バインドがない場合に launch_apb_on_bind
を true
に設定すると、バインドアクションがタイムアウトになり、再試行が実行されます。これはパラメーターの異なる同じバインド要求であるため、ブローカーは「409 Conflicts」で処理します。
7.8. シークレット設定
secrets
セクションでは、ブローカーの namespace のシークレットとブローカーが実行する APB 間の関連付けを作成します。ブローカーは、これらのルールに従って実行中の APB にシークレットをマウントします。これにより、ユーザーはシークレットを使用して、パラメーターをカタログやユーザーに公開せずに渡すことができます。
このセクションは一覧の形式であり、各エントリーは以下の構造を持ちます。
フィールド | 説明 | 必須 |
---|---|---|
|
ルールのタイトルです。表示と出力の目的でのみ使用されます。 |
Y |
|
指定されたシークレットに関連付けられる APB の名前です。これは完全修飾名 ( |
Y |
|
パラメーターをプルするシークレットの名前です。 |
Y |
create_broker_secret.py ファイルをダウンロードし、これを使用して、この設定セクションの作成とフォーマットを行うことができます。
secrets: - title: Database credentials secret: db_creds apb_name: dh-rhscl-postgresql-apb
7.9. プロキシー環境での実行
プロキシー化された OpenShift Container Platform クラスター内で OAB を実行する場合は、その中心的な概念を理解し、外部ネットワークアクセスに使用するプロキシーのコンテキストで検討することが重要です。
概要としては、ブローカー自体はクラスター内で Pod として実行され、そのレジスターの設定方法に応じて外部ネットワークにアクセスする必要があります。
7.9.1. レジストリーアダプターのホワイトリスト
ブローカーの設定済みレジストリーアダプターは、正常にブートストラップしてリモートの APB マニフェストを読み込むために、外部レジスターと通信できなければなりません。これらの要求はプロキシー経由で実行できますが、プロキシーでは必要なリモートホストにアクセスできるようにする必要があります。
必要なホワイトリスト化されたホストの例:
レジストリーアダプターのタイプ | ホワイトリスト化されたホスト |
---|---|
|
|
|
|
7.9.2. Ansible を使用したプロキシー環境でのブローカーの設定
初期インストール時に OpenShift Container Platform クラスターがプロキシーの環境下で実行されるように設定した場合 (「グローバルプロキシーオプションの設定」を参照)、OAB はデプロイ時に以下を実行します。
- クラスター全体のプロキシー設定を自動的に継承する
-
cidr
フィールドおよびserviceNetworkCIDR
を含む必要なNO_PROXY
一覧を生成する
それ以外の設定は必要ありません。
7.9.3. プロキシー環境でのブローカーの手動設定
クラスターのグローバルプロキシーオプションが初期インストール時またはブローカーのデプロイ前に設定されていない場合や、グローバルプロキシー設定を変更した場合、ブローカーの外部アクセスについてプロキシー経由で手動で設定する必要があります。
OAB をプロキシー環境で実行する前に「HTTP プロキシーの使用」を確認し、クラスターがプロキシー環境で実行されるように適切に設定されていることを確認してください。
とくに、クラスターは内部クラスター要求をプロキシー処理しないように設定されている必要があります。通常、これは以下の
NO_PROXY
設定を使用して設定されます。.cluster.local,.svc,<serviceNetworkCIDR_value>,<master_IP>,<master_domain>,.default
その他の必要な
NO_PROXY
設定も追加する必要があります。詳細については、「NO_PROXY の設定」を参照してください。注記バージョンなしまたは v1 の APB をデプロイするブローカーは、
172.30.0.1
もNO_PROXY
の一覧に追加する必要があります。v2 より前の APB は、シークレットの交換ではなく、exec
HTTP 要求を使用して実行中の APB Pod から認証情報を抽出しました。実験的なプロキシーサポートがあるブローカーを OpenShift Container Platform 3.9 より前のクラスターで実行していない限り、この点を心配する必要はおそらくありません。ブローカーの
DeploymentConfig
を cluster-admin 権限を持つユーザーとして編集します。$ oc edit dc/asb -n openshift-ansible-service-broker
以下の環境変数を設定します。
-
HTTP_PROXY
-
HTTPS_PROXY
-
NO_PROXY
注記詳細については、「Pod でのプロキシー環境変数の設定」を参照してください。
-
更新内容を保存した後、変更を有効にするために OAB のデプロイメント設定を再デプロイします。
$ oc rollout latest dc/asb -n openshift-ansible-service-broker
7.9.4. Pod でのプロキシー環境変数の設定
一般に、APB Pod 自体もプロキシー経由の外部アクセスを必要とします。ブローカーは、自らにプロキシー設定があることを認識すると、生成する APB Pod にこれらの環境変数を透過的に適用します。APB 内で使用されるモジュールが環境変数経由でプロキシー設定に従う限り、APB もこれらの設定に基づいて動作します。
最後に、APB によって生成されたサービスもプロキシー経由の外部ネットワークアクセスを必要とする場合があります。APB は、それ自体の実行環境でこのようなサービスを検出した場合にこれらの環境変数を明示的に設定するように作成されている必要があります。そうでない場合には、クラスターオペレーターが必要なサービスを変更してそれらを環境に組み込む必要があります。
第8章 ホストの既存クラスターへの追加
8.1. 概要
OpenShift Container Platform クラスターのインストール方式に応じて、インストールツールによるクイックインストールか、または scaleup.yml Playbook による通常インストール (Advanced installation) を使用して新規ホスト (ノードまたはマスター) をインストールに追加できます。
8.2. クイックインストーラーツールを使用したホストの追加
クイックインストールツールを使用して OpenShift Container Platform クラスターをインストールした場合は、クイックインストールツールを使用して新規ノードホストを既存クラスターに追加できます。
現時点では、クイックインストーラーツールを使用して新規マスターホストを追加することはできません。新規マスターホストを追加するには、通常インストール (Advanced installation) 方式を使用する必要があります。
インストーラーを対話型モードまたは無人モードのいずれかで使用した場合は、インストール設定ファイルが ~/.config/openshift/installer.cfg.ymlにある限り (または -c
オプションで別の場所を指定して)、インストールを再実行できます。
推奨される最大ノード数については、「Cluster Limits」セクションを参照してください。
ノードをインストールに追加するには、以下を実行します。
atomic-openshift-utils パッケージを更新して最新のインストーラーと Playbook を取得します。
# yum update atomic-openshift-utils
対話型モードまたは無人モードで
scaleup
サブコマンドを使用してインストーラーを実行します。# atomic-openshift-installer [-u] [-c </path/to/file>] scaleup
インストーラーによって現在の環境が検出され、ノードを追加できるようになります。
*** Installation Summary *** Hosts: - 100.100.1.1 - OpenShift master - OpenShift node - Etcd (Embedded) - Storage Total OpenShift masters: 1 Total OpenShift nodes: 1 --- We have detected this previously installed OpenShift environment. This tool will guide you through the process of adding additional nodes to your cluster. Are you ready to continue? [y/N]:
(y) を選択し、画面の指示に従って必要なタスクを完了します。
8.3. ホストの追加
scaleup.yml Playbook を実行して新規ホストをクラスターに追加できます。この Playbook は、マスターをクエリーし、新規ホストの新規証明書を生成して配布し、これらの新規ホストでのみ、設定 Playbook を実行します。scaleup.yml Playbook を実行する前に、前提条件となるホストの準備手順をすべて完了してください。
scaleup.yml の Playbook は新規ホストの設定のみを実行します。マスターサービスの NO_PROXY の更新やマスターサービスの再起動は行いません。
scaleup.yml Playbook を実行するには、現在のクラスター設定を表す既存のインベントリーファイル (/etc/ansible/hosts など) が必要です。以前に atomic-openshift-installer
コマンドを使用してインストールを実行した場合は、~/.config/openshift/hosts を調べて、インストーラーによって生成された最新のインベントリーファイルを見つけ、それをそのまま使用するか、インベントリーファイルの必要に応じて変更することができます。後で ansible-playbook
を呼び出すときに、-i
オプションを使用してそのファイルを指定する必要があります。
推奨される最大ノード数については、「Cluster Limits」セクションを参照してください。
手順
atomic-openshift-utils パッケージを更新して最新の Playbook を取得します。
# yum update atomic-openshift-utils
/etc/ansible/hosts ファイルを編集し、 new_<host_type> を [OSEv3:children] セクションに追加します。
たとえば、新規ノードホストを追加するには、new_nodes を追加します。
[OSEv3:children] masters nodes new_nodes
新規マスターホストを追加するには、new_masters を追加します。
[new_<host_type>] セクションを作成して、新規ホストのホスト情報を指定します。このセクションは、以下の新規ノードの追加例で示されているように、既存のセクションと同じような形式で作成します。
[nodes] master[1:3].example.com node1.example.com openshift_node_labels="{'region': 'primary', 'zone': 'east'}" node2.example.com openshift_node_labels="{'region': 'primary', 'zone': 'west'}" infra-node1.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}" infra-node2.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}" [new_nodes] node3.example.com openshift_node_labels="{'region': 'primary', 'zone': 'west'}"
その他のオプションについては、「ホスト変数の設定」を参照してください。
新規マスターを追加する場合は、[new_masters] セクションと [new_nodes] セクションの両方に新規ホストを追加して。新規マスターホストが OpenShift SDN の一部となるようにします。
[masters] master[1:2].example.com [new_masters] master3.example.com [nodes] master[1:2].example.com node1.example.com openshift_node_labels="{'region': 'primary', 'zone': 'east'}" node2.example.com openshift_node_labels="{'region': 'primary', 'zone': 'west'}" infra-node1.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}" infra-node2.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}" [new_nodes] master3.example.com
重要マスターホストに
region=infra
ラベルを付け、それ以外に専用インフラストラクチャーノードがない場合は、エントリーにopenshift_schedulable=true
を追加してホストにスケジュール可能であることを示すマークを明示的に付ける必要もあります。そうしないと、レジストリー Pod とルーター Pod をどこにも配置できなくなります。scaleup.yml Playbook を実行します。インベントリーファイルがデフォルトの /etc/ansible/hosts 以外の場所にある場合は、
-i
オプションで場所を指定します。ノードを追加する場合は、以下を指定します。
# ansible-playbook [-i /path/to/file] \ /usr/share/ansible/openshift-ansible/playbooks/openshift-node/scaleup.yml
マスターを追加する場合は、以下を実行します。
# ansible-playbook [-i /path/to/file] \ /usr/share/ansible/openshift-ansible/playbooks/openshift-master/scaleup.yml
- Playbook の実行後に、インストールを確認します。
[new_<host_type>] セクションで定義したホストを適切なセクションに移動します。このようにホストを移動することで、このインベントリーファイルを使用するその後の Playbook の実行で、正しくノードが処理されるようになります。[new_<host_type>] セクションは空のままで結構です。たとえば、新規ノードを追加する場合は以下のように指定します。
[nodes] master[1:3].example.com node1.example.com openshift_node_labels="{'region': 'primary', 'zone': 'east'}" node2.example.com openshift_node_labels="{'region': 'primary', 'zone': 'west'}" node3.example.com openshift_node_labels="{'region': 'primary', 'zone': 'west'}" infra-node1.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}" infra-node2.example.com openshift_node_labels="{'region': 'infra', 'zone': 'default'}" [new_nodes]
8.4. etcd ホストの既存クラスターへの追加
etcd scaleup Playbook を実行して新規 etcd ホストを追加することができます。この Playbook は、マスターをクエリーし、新規ホストの新規証明書を生成してこれを配布し、設定 Playbook を新規ホストにのみ実行します。etcd scaleup.yml Playbook を実行する前に、前提条件となるホストの準備 手順をすべて完了してください。
etcd ホストを既存クラスターに追加するには、以下を実行します。
atomic-openshift-utils パッケージを更新して最新の Playbook を取得します。
$ yum update atomic-openshift-utils
/etc/ansible/hosts ファイルを編集し、new_<host_type> を [OSEv3:children] グループに、ホストを new_<host_type> グループに追加します。
たとえば、新規 etcd を追加するには、new_etcd を追加します。
[OSEv3:children] masters nodes etcd new_etcd [etcd] etcd1.example.com etcd2.example.com [new_etcd] etcd3.example.com
etcd scaleup.yml Playbook を実行します。インベントリーファイルがデフォルトの /etc/ansible/hosts 以外の場所にある場合は、
-i
オプションで場所を指定します。$ ansible-playbook [-i /path/to/file] \ /usr/share/ansible/openshift-ansible/playbooks/openshift-etcd/scaleup.yml
ノードラベルを
logging-infra-fluentd: "true"
に設定します。# oc label node/new-node.example.com logging-infra-fluentd: "true"
- Playbook が正常に完了したら、インストールを確認します。
8.5. 共存する etcd での既存のマスターの置き換え
マシンを別のデータセンターに移行し、割り当てられているネットワークと IP が変更される場合には、以下の手順を実行します。
プライマリー etcd およびマスターノードをバックアップします。
重要「etcd のバックアップ」の説明にあるように、/etc/etcd/ ディレクトリーがバックアップされていることを確認します。
- 置き換えるマスターの数だけ、新規マシンをプロビジョニングします。
クラスターを追加または拡張します。たとえば、etcd が共存するマスターを 3 つ追加する場合には、マスターノード 3 つまたは etcd ノード 3 つに拡張します。
-
マスターを追加します。このプロセスのステップ 3 で、
[new_masters]
と[new_nodes]
に新規データセンターのホストを追加して、マスターの scaleup.yml Playbook を実行します。 - 同じホストを etcd セクションに配置して、etcd scaleup.yml Playbook を実行します。
ホストが追加されたことを確認します。
# oc get nodes
マスターホストの IP が追加されたことを確認します。
# oc get ep kubernetes
etcd が追加されたことを確認します。
ETCDCTL_API
の値は、使用するバージョンにより異なります。# source /etc/etcd/etcd.conf # ETCDCTL_API=2 etcdctl --cert-file=$ETCD_PEER_CERT_FILE --key-file=$ETCD_PEER_KEY_FILE \ --ca-file=/etc/etcd/ca.crt --endpoints=$ETCD_LISTEN_CLIENT_URLS member list
- /etc/origin/master ディレクトリーから、インベントリーファイルの最初に記載されている新規マスターホストに、/etc/origin/master/ca.serial.txt をコピーします。デフォルトでは、これは /etc/ansible/hosts です。
-
マスターを追加します。このプロセスのステップ 3 で、
etcd ホストを削除します。
- /etc/etcd/ca ディレクトリーを、インベントリーファイルの最初に記載されている新規 etcd ホストにコピーします。デフォルトでは、これは /etc/ansible/hosts です。
master-config.yaml ファイルから以前の etcd クライアントを削除します。
# grep etcdClientInfo -A 11 /etc/origin/master/master-config.yaml
マスターを再起動します。
# systemctl restart atomic-openshift-master-*
クラスターから以前の etcd メンバーを削除します。
ETCDCTL_API
の値は、使用するバージョンにより異なります。# source /etc/etcd/etcd.conf # ETCDCTL_API=2 etcdctl --cert-file=$ETCD_PEER_CERT_FILE --key-file=$ETCD_PEER_KEY_FILE \ --ca-file=/etc/etcd/ca.crt --endpoints=$ETCD_LISTEN_CLIENT_URLS member list
上記のコマンドの出力から ID を取得して、この ID で以前のメンバーを削除します。
# etcdctl --cert-file=$ETCD_PEER_CERT_FILE --key-file=$ETCD_PEER_KEY_FILE \ --ca-file=/etc/etcd/ca.crt --endpoints=$ETCD_LISTEN_CLIENT_URL member remove 1609b5a3a078c227
以前の etcd ホストで etcd サービスを停止して、無効化します。
# systemctl stop etcd # systemctl disable etcd
以前のマスター API とコントローラーサービスをシャットダウンします。
# systemctl stop atomic-openshift-master-api
- ネイティブのインストールプロセス時にデフォルトでロードバランサーとしてインストールされていた、マスターノードを、HA プロキシー設定から削除します。
マシンの使用を停止します。
削除するマスター上の
atomic-openshift-node
サービスを停止します。# systemctl stop atomic-openshift-node
ノードリソースを削除します。
# oc delete node
8.6. ノードの移行
ノード上のサービスの実行方法やスケーリング方法、慣れた方法により、ノードを個別での移行や、グループ (2、5、10 ずつなど) 単位での移行が可能です。
- 移行するノードについては、新規データセンターでのノードの使用のために新規の仮想マシンをプロビジョニングします。
- 新規ノードを追加するには、インフラストラクチャーを拡大します。新規ノードのラベルが適切に設定されており、新規 API サーバーがロードバランサーに追加され、トラフィックを適切に送信していることを確認します。
評価し、縮小します。
ノードを削除します。
- ノードが空であり、実行中のプロセスがないことを確認します。
- サービスを停止するか、またはノードを削除します。
第9章 デフォルトのイメージストリームとテンプレートの読み込み
9.1. 概要
OpenShift Container Platform インストールには、Red Hat が提供するイメージストリームとテンプレートの便利なセットが含まれています。このセットを使用すると、開発者は新規アプリケーションを簡単に作成できます。デフォルトでは、これらのセットは クイックインストール方式と通常インストール (Advanced installation) 方式で openshift プロジェクトに自動的に作成されます。このプロジェクトは、すべてのユーザーが表示アクセスを持つデフォルトのグローバルプロジェクトです。
9.2. サブスクリプションタイプ別のサービス
お使いの Red Hat アカウントのアクティブなサブスクリプションに応じて、以下のイメージストリームとテンプレートのセットが Red Hat によって提供され、サポートされます。サブスクリプションの詳細については、Red Hat の営業担当者にお問い合わせください。
9.2.1. OpenShift Container Platform サブスクリプション
アクティブな OpenShift Container Platform サブスクリプション により、イメージストリームとテンプレートのコアのセットが提供され、サポートされます。これには以下のテクノロジーが含まれます。
種別 | テクノロジー |
---|---|
言語とフレームワーク | |
データベース | |
ミドルウェアサービス | |
他のサービス |
9.2.2. xPaaS ミドルウェアアドオンサブスクリプション
xPaaS ミドルウェアイメージのサポートは、xPaaS 製品ごとに提供されるサブスクリプションである xPaaS ミドルウエアアドオンサブスクリプション で提供されます。お使いのアカウントで該当するサブスクリプションがアクティブになっている場合は、以下のテクノロジーのイメージストリームとテンプレートが提供され、サポートされます。
種別 | テクノロジー |
---|---|
ミドルウェアサービス |
9.3. 作業を開始する前に
このトピックのタスクの実行を検討する前に、以下のいずれかを実行してこれらのイメージストリームとテンプレートが OpenShift Container Platform クラスターにすでに登録されているかどうかを確認してください。
- Web コンソールにログインして Add to Project をクリックします。
CLI を使用して openshift プロジェクト用のイメージストリームとテンプレートの一覧を表示します。
$ oc get is -n openshift $ oc get templates -n openshift
デフォルトのイメージストリームとテンプレートが削除または変更されている場合は、このトピックに従ってデフォルトのオブジェクトを各自で作成できます。そうしない場合は、以下の指示に従う必要はありません。
9.4. 前提条件
デフォルトのイメージストリームとテンプレートを作成する前に、以下を確認してください。
- 統合 Docker レジストリーサービスが OpenShift Container Platform インストールにデプロイされている必要があります。
-
oc create
コマンドを cluster-admin 権限で実行できる必要があります。デフォルトの openshift プロジェクト で動作できるようにするためです。 - atomic-openshift-utils RPM パッケージがインストールされている必要があります。手順については、「ソフトウェアの前提条件」を参照してください。
イメージストリームとテンプレートが含まれているディレクトリーのシェル変数を定義します。これにより、以降のセクションで使用するコマンドが大幅に短くなります。これを実行するには、以下のように入力します。
$ IMAGESTREAMDIR="/usr/share/ansible/openshift-ansible/roles/openshift_examples/files/examples/v3.9/image-streams"; \ XPAASSTREAMDIR="/usr/share/ansible/openshift-ansible/roles/openshift_examples/files/examples/v3.9/xpaas-streams"; \ XPAASTEMPLATES="/usr/share/ansible/openshift-ansible/roles/openshift_examples/files/examples/v3.9/xpaas-templates"; \ DBTEMPLATES="/usr/share/ansible/openshift-ansible/roles/openshift_examples/files/examples/v3.9/db-templates"; \ QSTEMPLATES="/usr/share/ansible/openshift-ansible/roles/openshift_examples/files/examples/v3.9/quickstart-templates"
9.5. OpenShift Container Platform イメージのイメージストリームの作成
ノードホストが Red Hat サブスクリプションマネージャーを使用してサブスクライブされていて、Red Hat Enterprise Linux (RHEL) 7 ベースのイメージを使用したイメージストリームのコアセットを使用する必要がある場合には、以下を実行します。
$ oc create -f $IMAGESTREAMDIR/image-streams-rhel7.json -n openshift
または、CentOS 7 ベースのイメージを使用するイメージストリームのコアセットを作成するには、以下を実行します。
$ oc create -f $IMAGESTREAMDIR/image-streams-centos7.json -n openshift
CentOS と RHEL の両方のイメージストリームセットは同じ名前なので、両方を作成することはできません。両方のイメージストリームセットをユーザーが使用できるようにするには、一方のセットを別のプロジェクトに作成するか、いずれかのファイルを編集し、イメージストリームの名前を一意の名前に変更します。
9.6. xPaaS ミドルウェアイメージのイメージストリームの作成
xPaaS ミドルウェアイメージストリームは、JBoss EAP、JBoss JWS、JBoss A-MQ、JBoss Fuse Integration Services、Decision Server、JBoss Data Virtualization、および JBoss Data Grid のイメージを提供します。それらのイメージは、提供されるテンプレートを使用してこれらのプラットフォームのアプリケーションを作成するために使用できます。
xPaaS ミドルウェアイメージストリームセットを作成するには、以下を実行します。
$ oc create -f $XPAASSTREAMDIR/jboss-image-streams.json -n openshift
これらのイメージストリームによって参照されるイメージにアクセスするには、該当する xPaaS ミドルウェアサブスクリプションが必要です。
9.7. データベースサービステンプレートの作成
データベースサービステンプレートを使用すると、他のコンポーネントで利用できるデータベースイメージを簡単に実行できます。データベース (MongoDB、MySQL、および PostgreSQL) ごとに、2 つのテンプレートが定義されています。
1 つのテンプレートはコンテナー内の一時ストレージを使用します。つまり、保存データは Pod の移動などによってコンテナーが再起動されると失われます。このテンプレートは、デモ目的にのみ使用してください。
もう 1 つのテンプレートは永続ボリュームをストレージに使用しますが、OpenShift Container Platform インストールに永続ボリュームが設定されている必要があります。
データベーステンプレートのコアセットを作成するには、以下を実行します。
$ oc create -f $DBTEMPLATES -n openshift
テンプレートを作成したら、ユーザーは各種のテンプレートを簡単にインスタンス化し、データベースデプロイメントにすばやくアクセスできるようになります。
9.8. インスタントアプリケーションおよびクイックスタートテンプレートの作成
インスタントアプリケーションおよびクイックスタートテンプレートでは、実行中のアプリケーションのオブジェクトの完全なセットを定義します。これには以下が含まれます。
いくつかのテンプレートでは、アプリケーションがデータベース操作を実行できるように、データベースデプロイメントとサービスも定義します。
データベースを定義するテンプレートでは、一時ストレージを使用してデータベースコンテンツを格納します。これらのテンプレートはデモ目的にのみ使用してください。何らかの理由でデータベース Pod が再起動すると、すべてのデータベースデータが失われるためです。
これらのテンプレートを使用すると、ユーザーは、OpenShift Container Platform で提供される各種の言語イメージを使用する完全なアプリケーションを簡単にインスタンス化できます。また、インストール時にテンプレートのパラメーターをカスタマイズし、サンプルリポジトリーではなく独自のリポジトリーからソースがビルドされるようにできます。つまり、これは新規アプリケーションのビルドの単純な開始点となります。
コアのインスタントアプリケーションおよびクイックスタートテンプレートを作成するには、以下を実行します。
$ oc create -f $QSTEMPLATES -n openshift
各種の xPaaS ミドルウェア製品 (JBoss EAP、JBoss JWS、JBoss A-MQ、JBoss Fuse Integration Services、Decision Server、および JBoss Data Grid) を使用するアプリケーションを作成するためのテンプレートのセットも用意されています。このテンプレートセットを登録するには、以下を実行します。
$ oc create -f $XPAASTEMPLATES -n openshift
xPaaS ミドルウェアテンプレートには、xPaaS ミドルウェアイメージストリームが必要です。さらに、xPaaS ミドルウェアイメージストリームには、該当する xPaaS ミドルウェアサブスクリプションが必要です。
データベースを定義するテンプレートでは、一時ストレージを使用してデータベースコンテンツを格納します。これらのテンプレートはデモ目的にのみ使用してください。何らかの理由でデータベース Pod が再起動すると、すべてのデータベースデータが失われるためです。
9.9. 次のステップ
これらのアーティファクトを作成したら、開発者は Web コンソールにログインし、テンプレートからの作成フローを実行できるようになります。任意のデータベースまたはアプリケーションテンプレートを選択し、現在のプロジェクトで実行するデータベースサービスまたはアプリケーションを作成できます。一部のアプリケーションテンプレートでは独自のデータベースサービスも定義することに注意してください。
サンプルアプリケーションはすべて、SOURCE_REPOSITORY_URL
パラメーター値が示すように、テンプレートのデフォルトの参照先である GitHub リポジトリーからビルドされます。これらのリポジトリーはフォークすることができ、テンプレートから作成する際にフォークを SOURCE_REPOSITORY_URL
パラメーター値として指定できます。これにより、開発者は独自のアプリケーションの作成を試行することができます。
開発者は、開発者ガイドの「インスタントアプリおよびクイックスタートテンプレートの使用」セクションでこれらの手順を確認できます。
第10章 カスタム証明書の設定
10.1. 概要
管理者は、OpenShift Container Platform API のパブリックホスト名および Web コンソール用のカスタム提供証明書を設定できます。この設定は、通常インストール (Advanced installation) の実行時か、またはインストール後に行うことができます。
10.2. インストール時のカスタム証明書の設定
通常インストール (Advanced installation) の実行時に、カスタム証明書はインベントリーファイルで設定可能な openshift_master_named_certificates
パラメーターと openshift_master_overwrite_named_certificates
パラメーターを使用して設定できます。詳細については、「Ansible を使用したカスタム証明書の設定」を参照してください。
カスタム証明書の設定パラメーター
openshift_master_overwrite_named_certificates=true 1 openshift_master_named_certificates=[{"certfile": "/path/on/host/to/crt-file", "keyfile": "/path/on/host/to/key-file", "names": ["public-master-host.com"], "cafile": "/path/on/host/to/ca-file"}] 2 openshift_hosted_router_certificate={"certfile": "/path/on/host/to/app-crt-file", "keyfile": "/path/on/host/to/app-key-file", "cafile": "/path/on/host/to/app-ca-file"} 3
- 1
openshift_master_named_certificates
パラメーターの値を指定した場合は、このパラメーターをtrue
に設定します。- 2
- マスター API 証明書をプロビジョニングします。
- 3
- ワイルドカード API 証明書をプロビジョニングします。
以下は、マスター API 証明書のパラメーターの例です。
openshift_master_overwrite_named_certificates=true openshift_master_named_certificates=[{"names": ["master.148.251.233.173.nip.io"], "certfile": "/home/cloud-user/master-bundle.cert.pem", "keyfile": "/home/cloud-user/master.148.251.233.173.nip.io.key.pem" ]
以下は、ワイルドカード API 証明書のパラメーターの例です。
openshift_hosted_router_certificate={"certfile": "/home/cloud-user/star-apps.148.251.233.173.nip.io.cert.pem", "keyfile": "/home/cloud-user/star-apps.148.251.233.173.nip.io.key.pem", "cafile": "/home/cloud-user/ca-chain.cert.pem"}
10.3. Web コンソールまたは CLI 用カスタム証明書の設定
Web コンソールおよび CLI 用のカスタム証明書は、マスター設定ファイルの servingInfo
セクションで指定できます。
-
servingInfo.namedCertificates
セクションでは、Web コンソール用のカスタム証明書を指定します。 -
servingInfo
セクションでは、CLI およびその他の API 呼び出し用のカスタム証明書を指定します。
この方法で複数の証明書を設定し、それぞれの証明書を複数のホスト名、複数のルーター、または OpenShift Container Platform イメージレジストリーに関連付けることができます。
デフォルトの証明書は、namedCertificates
のほかにも servingInfo.certFile
および servingInfo.keyFile
設定セクションに設定する必要があります。
namedCertificates
セクションは、/etc/origin/master/master-config.yaml ファイルの masterPublicURL
および oauthConfig.assetPublicURL
設定に関連付けられたホスト名についてのみ設定する必要があります。masterURL
に関連付けられたホスト名にカスタム提供証明書を使用すると、インフラストラクチャーコンポーネントが内部の masterURL
ホストを使用してマスター API と通信しようとするため、TLS エラーが発生します。
カスタム証明書の設定
servingInfo: logoutURL: "" masterPublicURL: https://openshift.example.com:8443 publicURL: https://openshift.example.com:8443/console/ bindAddress: 0.0.0.0:8443 bindNetwork: tcp4 certFile: master.server.crt 1 clientCA: "" keyFile: master.server.key 2 maxRequestsInFlight: 0 requestTimeoutSeconds: 0 namedCertificates: - certFile: wildcard.example.com.crt 3 keyFile: wildcard.example.com.key 4 names: - "openshift.example.com" metricsPublicURL: "https://metrics.os.example.com/hawkular/metrics"
Ansible インベントリーファイル (デフォルトでは /etc/ansible/hosts
) の openshift_master_cluster_public_hostname
パラメーターと openshift_master_cluster_hostname
パラメーターは異なっていなければなりません。これらが同じであると、名前付き証明書が失敗し、証明書の再インストールが必要になります。
# Native HA with External LB VIPs openshift_master_cluster_hostname=internal.paas.example.com openshift_master_cluster_public_hostname=external.paas.example.com
OpenShift Container Platform で DNS を使用する方法の詳細については、「DNS のインストールの前提条件」を参照してください。
この方法では、OpenShift Container Platformによって生成される自己署名証明書を利用して、必要に応じて信頼できるカスタム証明書を個々のコンポーネントに追加できます。
内部インフラストラクチャーの証明書は自己署名のままであることに注意してください。これは一部のセキュリティーチームや PKI チームから不適切な使用法と見なされる場合があります。ただし、これらの証明書を信頼するクライアントはクラスター内のその他のコンポーネントだけであるため、これに伴うリスクは最小限です。外部のユーザーとシステムはすべて、信頼できるカスタム証明書を使用します。
相対パスは、マスター設定ファイルの場所に基づいて解決されます。設定の変更が反映されるようにサーバーを再起動します。
10.4. カスタムマスターホスト証明書の設定
OpenShift Container Platform の外部ユーザーとの信頼できる接続を容易にするために、Ansible インベントリーファイル (デフォルトでは /etc/ansible/hosts
) の openshift_master_cluster_public_hostname
パラメーターで指定されたドメイン名に一致する名前付き証明書をプロビジョニングできます。
この証明書は Ansible がアクセスできるディレクトリーに置き、以下のように Ansible インベントリーファイルにパスを追加する必要があります。
openshift_master_named_certificates=[{"certfile": "/path/to/console.ocp-c1.myorg.com.crt", "keyfile": "/path/to/console.ocp-c1.myorg.com.key", "names": ["console.ocp-c1.myorg.com"]}]
パラメーター値は以下のようになります。
- certfile は、OpenShift Container Platform ルーター証明書を含むファイルへのパスです。
- keyfile は、OpenShift Container Platform ワイルドカードキーを含むファイルへのパスです。
- names は、クラスターのパブリックホスト名です。
ファイルパスは、Ansible が実行されるシステムにとってローカルでなければなりません。証明書はマスターホストにコピーされ、/etc/origin/master ディレクトリー内にデプロイされます。
レジストリーのセキュリティーを保護する場合、サービスのホスト名と IP アドレスをレジストリーのサーバー証明書に追加します。SAN (Subject Alternative Name) には以下の情報が含まれている必要があります。
2 つのサービスホスト名。
docker-registry.default.svc.cluster.local docker-registry.default.svc
サービス IP アドレス。
例を以下に示します。
172.30.252.46
以下のコマンドを使って Docker レジストリーのサービス IP アドレスを取得します。
oc get service docker-registry --template='{{.spec.clusterIP}}'
パブリックホスト名。
docker-registry-default.apps.example.com
以下のコマンドを使って Docker レジストリーのパブリックホスト名を取得します。
oc get route docker-registry --template '{{.spec.host}}'
たとえば、サーバー証明書には以下のような SAN の詳細が記載されるはずです。
X509v3 Subject Alternative Name: DNS:docker-registry-public.openshift.com, DNS:docker-registry.default.svc, DNS:docker-registry.default.svc.cluster.local, DNS:172.30.2.98, IP Address:172.30.2.98
10.5. デフォルトルーター用のカスタムワイルドカード証明書の設定
OpenShift Container Platform のデフォルトルーターをデフォルトのワイルドカード証明書を使って設定できます。デフォルトのワイルドカード証明書を使用すると、OpenShift Container Platform にデプロイされているアプリケーションでカスタム証明書を使用せずにデフォルトの暗号化を簡単に使用することができます。
デフォルトのワイルドカード証明書の使用は、非実稼働環境でのみ推奨されます。
デフォルトのワイルドカード証明書を設定するには、.<app_domain>
で有効な証明書をプロビジョニングします。ここで、<app_domain>
は、Ansible インベントリーファイル(デフォルトでは /etc/ansible/hosts
) の openshift_master_default_subdomain
の値です。プロビジョニングが完了したら、証明書、キー、CA 証明書ファイルを Ansible ホストに置き、以下の行を Ansible インベントリーファイルに追加します。
openshift_hosted_router_certificate={"certfile": "/path/to/apps.c1-ocp.myorg.com.crt", "keyfile": "/path/to/apps.c1-ocp.myorg.com.key", "cafile": "/path/to/apps.c1-ocp.myorg.com.ca.crt"}
例を以下に示します。
openshift_hosted_router_certificate={"certfile": "/home/cloud-user/star-apps.148.251.233.173.nip.io.cert.pem", "keyfile": "/home/cloud-user/star-apps.148.251.233.173.nip.io.key.pem", "cafile": "/home/cloud-user/ca-chain.cert.pem"}
パラメーター値は以下のようになります。
- certfile は、OpenShift Container Platform ルーター証明書を含むファイルへのパスです。
- keyfile は、OpenShift Container Platform ワイルドカードキーを含むファイルへのパスです。
- cafile は、このキーと証明書のルート CA を含むファイルへのパスです。中間 CA を使用している場合は、中間 CA とルート CA の両方がこのファイルに含まれている必要があります。
これらの証明書ファイルを OpenShift Container Platform クラスターで初めて使用する場合は、Ansible deploy_router.yml Playbook を実行し、これらのファイルを OpenShift Container Platform 設定ファイルに追加します。この Playbook は、証明書ファイルを /etc/origin/master/ ディレクトリーに追加します。
# ansible-playbook [-i /path/to/inventory] \ /usr/share/ansible/openshift-ansible/playbooks/openshift-hosted/deploy_router.yml
これらの証明書を使用するのが初めてでない場合、たとえば、既存の証明書を変更するか、期限切れの証明書を置き換える場合は、以下の Playbook を実行します。
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/redeploy-certificates.yml
この Playbook を実行する場合は、証明書名を変更しないでください。証明書名を変更した場合は、新規証明書の場合と同様に Ansible deploy_cluster.yml Playbook を再実行してください。
10.6. イメージレジストリー用のカスタム証明書の設定
OpenShift Container Platform イメージレジストリーは、ビルドとデプロイメントを容易にする内部サービスです。レジストリーとの通信の大部分は、OpenShift Container Platform の内部コンポーネントによって処理されます。そのため、レジストリーサービス自体が使用する証明書を置き換える必要はありません。
ただし、デフォルトでは、レジストリーは、外部のシステムとユーザーがイメージのプルとプッシュを実行できるルートを使用します。内部の自己署名証明書を使用する代わりに、外部ユーザーに提供されるカスタム証明書を使用してre-encrypt ルートを使用することができます。
これを設定するには、以下のコード行を Ansible インベントリーファイル (デフォルトでは /etc/ansible/hosts ファイル) の [OSEv3:vars] セクションに追加します。レジストリールートで使用する証明書を指定します。
openshift_hosted_registry_routehost=registry.apps.c1-ocp.myorg.com 1 openshift_hosted_registry_routecertificates={"certfile": "/path/to/registry.apps.c1-ocp.myorg.com.crt", "keyfile": "/path/to/registry.apps.c1-ocp.myorg.com.key", "cafile": "/path/to/registry.apps.c1-ocp.myorg.com-ca.crt"} 2 openshift_hosted_registry_routetermination=reencrypt 3
- 1
- レジストリーのホスト名です。
- 2
- cacert、root、および cafile ファイルの場所です。
- certfile は、OpenShift Container Platform ルーター証明書を含むファイルへのパスです。
- keyfile は、OpenShift Container Platform ワイルドカードキーを含むファイルへのパスです。
- cafile は、このキーと証明書のルート CA を含むファイルへのパスです。中間 CA を使用している場合は、中間 CA とルート CA の両方がこのファイルに含まれている必要があります。
- 3
- 暗号化を実行する場所を指定します。
-
edge ルーターで暗号化を終了し、送信先から提供される新規の証明書で再暗号化するには、
reencrypt
に設定し、re-encrypt ルートを指定します。 -
送信先で暗号化を終了するには、
passthrough
に設定します。トラフィックは送信先で復号化されます。
-
edge ルーターで暗号化を終了し、送信先から提供される新規の証明書で再暗号化するには、
10.7. ロードバランサー用のカスタム証明書の設定
OpenShift Container Platform クラスターでデフォルトのロードバランサーか、またはエンタープライズレベルのロードバランサーを使用している場合、カスタム証明書の使用により、 パブリックに署名されたカスタム証明書を使って Web コンソールと API を外部で利用できるようにし、既存の内部証明書を内部のエンドポイント用に残しておくことができます。
カスタム証明書をこの方法で使用するように OpenShift Container Platform を設定するには、以下を実行します。
マスター設定ファイルの
servingInfo
セクションを編集します。servingInfo: logoutURL: "" masterPublicURL: https://openshift.example.com:8443 publicURL: https://openshift.example.com:8443/console/ bindAddress: 0.0.0.0:8443 bindNetwork: tcp4 certFile: master.server.crt clientCA: "" keyFile: master.server.key maxRequestsInFlight: 0 requestTimeoutSeconds: 0 namedCertificates: - certFile: wildcard.example.com.crt 1 keyFile: wildcard.example.com.key 2 names: - "openshift.example.com" metricsPublicURL: "https://metrics.os.example.com/hawkular/metrics"
注記masterPublicURL
およびoauthConfig.assetPublicURL
設定に関連付けられたホスト名についてのみnamedCertificates
セクションを設定します。masterURL
に関連付けられたホスト名にカスタム提供証明書を使用すると、インフラストラクチャーコンポーネントが内部の masterURL ホストを使用してマスター API と通信しようとするため、TLS エラーが発生します。Ansible インベントリーファイル (デフォルトでは /etc/ansible/hosts) で
openshift_master_cluster_public_hostname
パラメーターとopenshift_master_cluster_hostname
パラメーターを指定します。これらの値は異なっていなければなりません。同じ値を指定した場合、名前付き証明書が失敗します。# Native HA with External LB VIPs openshift_master_cluster_hostname=paas.example.com 1 openshift_master_cluster_public_hostname=public.paas.example.com 2
お使いのロードバランサー環境に固有の情報については、お使いのプロバイダーについての OpenShift Container Platform リファレンスアーキテクチャーと「Custom Certificate SSL Termination (Production)」を参照してください。
10.8. カスタム証明書の変更およびクラスターへの組み込み
カスタムマスター証明書とカスタムルーター証明書を変更して、既存の OpenShift Container Platform クラスターに組み込むことができます。これを行うには、Ansible インベントリーファイル (デフォルトでは /etc/ansible/hosts) を編集し、Playbook を実行します。
10.8.1. カスタムマスター証明書の変更およびクラスターへの組み込み
カスタム証明書を変更するには、以下を実行します。
-
Ansible インベントリーファイルを編集して
openshift_master_overwrite_named_certificates=true
を設定します。 openshift_master_named_certificates
パラメーターを使用して証明書へのパスを指定します。openshift_master_overwrite_named_certificates=true openshift_master_named_certificates=[{"certfile": "/path/on/host/to/crt-file", "keyfile": "/path/on/host/to/key-file", "names": ["public-master-host.com"], "cafile": "/path/on/host/to/ca-file"}] 1
- 1
- マスター API 証明書へのパスです。
以下の Playbook を実行します。
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/redeploy-certificates.yml
10.8.2. カスタムルーター証明書の変更およびクラスターへの組み込み
カスタムルーター証明書を変更し、これを組み込むには、以下を実行します。
-
Ansible インベントリーファイルを編集して
openshift_master_overwrite_named_certificates=true
を設定します。 openshift_hosted_router_certificate
パラメーターを使用して証明書へのパスを指定します。openshift_master_overwrite_named_certificates=true openshift_hosted_router_certificate={"certfile": "/path/on/host/to/app-crt-file", "keyfile": "/path/on/host/to/app-key-file", "cafile": "/path/on/host/to/app-ca-file"} 1
- 1
- ワイルドカード API 証明書へのパスです。
以下の Playbook を実行します。
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/openshift-hosted/redeploy-router-certificates.yml
10.9. その他のコンポーネントでのカスタム証明書の使用
ロギングやメトリクスなどのその他のコンポーネントでカスタム証明書を使用する方法については、「 Certificate Management」を参照してください。
第11章 証明書の再デプロイ
11.1. 概要
OpenShift Container Platform は、以下のコンポーネントで証明書を使用してセキュアな接続を提供します。
- マスター (API サーバーとコントローラー)
- etcd
- ノード
- レジストリー
- ルーター
インストーラーによって提供される Ansible Playbook を使用すると、クラスター証明書の有効期限を自動的にチェックできます。これらの証明書を自動的にバックアップしたり、再デプロイしたりするための Playbook も提供されます。これらの Playbook を使用すると、一般的な証明書エラーを修正できます。
証明書の再デプロイのユースケースとして以下が考えられます。
- インストーラーによって誤ったホスト名が検出され、そのことがすぐに判明しなかった。
- 証明書の有効期限が切れており、証明書を更新する必要がある。
- 新しい CA があり、その CA を代わりに使用する証明書を作成する。
11.2. 証明書の有効期限のチェック
インストーラーを使用して、設定可能な日数内に有効期限が切れる証明書に関する警告やすでに有効期限が切れた証明書に関する通知を受け取ることができます。証明書の有効期限 Playbook では、Ansible の openshift_certificate_expiry
ロールが使用されます。
ロールによって検査される証明書には、以下が含まれます。
- マスターおよびノードサービス証明書
- etcd シークレットのルーターおよびレジストリーサービス証明書
- マスター、ノード、ルーター、レジストリー、および cluster-admin ユーザーの kubeconfig ファイル
- etcd 証明書 (組み込み証明書を含む)
11.2.1. ロールの変数
openshift_certificate_expiry
ロールは、以下の変数を使用します。
変数名 | デフォルト値 | 説明 |
---|---|---|
|
|
OpenShift Container Platform 基本設定ディレクトリーです。 |
|
|
現在を起点として指定された日数内に有効期限が切れる証明書にフラグを付けます。 |
|
|
正常な (期限切れや警告のない) 証明書を結果に組み込みます。 |
変数名 | デフォルト値 | 説明 |
---|---|---|
|
|
有効期限切れのチェック結果に関する HTML レポートを生成します。 |
|
|
HTML レポートを保存するための完全パスです。 |
|
|
有効期限のチェック結果を JSON ファイルとして保存します。 |
|
|
JSON レポートを保存するための完全パスです。 |
11.2.2. 証明書の有効期限 Playbook の実行
OpenShift Container Platform インストーラーは、openshift_certificate_expiry
ロールのさまざまな設定セットを使用して証明書の有効期限 Playbook のサンプル一式を提供します。
これらの Playbook は、クラスターを表す インベントリーファイルと一緒に使用する必要があります。最適な結果を得るには、ansible-playbook
に -v
オプションを指定して実行します。
easy-mode.yaml のサンプル Playbook を使用すると、ロールアウトを仕様に合わせて調整する前に試すことができます。この Playbook は以下を実行します。
- JSON レポートと定型化された HTML レポートを /tmp/ に生成します。
- ほぼ常に結果が得られるように警告期間を長い期間に設定します。
- すべての証明書 (正常であるかどうかを問わず) を結果に組み込みます。
easy-mode.yaml Playbook
- name: Check cert expirys hosts: nodes:masters:etcd become: yes gather_facts: no vars: openshift_certificate_expiry_warning_days: 1500 openshift_certificate_expiry_save_json_results: yes openshift_certificate_expiry_generate_html_report: yes openshift_certificate_expiry_show_all: yes roles: - role: openshift_certificate_expiry
easy-mode.yaml Playbook を実行するには、以下を実行します。
$ ansible-playbook -v -i <inventory_file> \ /usr/share/ansible/openshift-ansible/playbooks/openshift-checks/certificate_expiry/easy-mode.yaml
他のサンプル Playbook
その他のサンプル Playbook も /usr/share/ansible/openshift-ansible/playbooks/certificate_expiry/ ディレクトリーから直接実行できます。
ファイル名 | 使用法 |
---|---|
default.yaml |
|
html_and_json_default_paths.yaml |
HTML および JSON アーティファクトをデフォルトのパスに生成します。 |
longer_warning_period.yaml |
有効期限切れの警告期間を 1500 日に変更します。 |
longer-warning-period-json-results.yaml |
有効期限切れの警告期間を 1500 日に変更し、結果を JSON ファイルとして保存します。 |
これらのサンプル Playbook を実行するには、以下を実行します。
$ ansible-playbook -v -i <inventory_file> \ /usr/share/ansible/openshift-ansible/playbooks/openshift-checks/certificate_expiry/<playbook>
11.2.3. 出力形式
上述のように、チェックレポートは 2 つの形式で出力できます。機械の解析に適した JSON 形式と簡単にスキミングできる定型化された HTML ページを使用できます。
HTML レポート
インストーラーには、HTML レポートのサンプルが付属しています。以下のファイルをブラウザーで開いて表示できます。
/usr/share/ansible/openshift-ansible/roles/openshift_certificate_expiry/examples/cert-expiry-report.html
JSON レポート
保存された JSON の結果には、data
と summary
の 2 つの最上位レベルのキーがあります。
data
キーは、検証された各ホストの名前がキーとして、該当するホストごとに特定された証明書の確認結果が値として含まれるハッシュです。
summary
キーは、以下の条件に当てはまる証明書の合計数をまとめたハッシュです。
- クラスター全体で検査済み
- 問題なし
- 設定された警告期間内に有効期限が切れる
- すでに有効期限が切れている
完全な JSON レポートのサンプルについては、/usr/share/ansible/openshift-ansible/roles/openshift_certificate_expiry/examples/cert-expiry-report.json を参照してください。
JSON データのサマリーでは、さまざまなコマンドラインツールを使用して警告や有効期限を簡単にチェックできます。たとえば、grep
を使用して summary
という語を検索し、一致した箇所の後ろの 2 行を出力できます (-A2
)。
$ grep -A2 summary /tmp/cert-expiry-report.json "summary": { "warning": 16, "expired": 0
また、jq
ツールが使用可能な場合は、このツールを使用して特定の値を選択できます。以下の最初の 2 つの例は、warning
または expired
のいずれかの値を選択する方法を示しています。3 つ目の例は、両方の値を一度に選択する方法を示しています。
$ jq '.summary.warning' /tmp/cert-expiry-report.json 16 $ jq '.summary.expired' /tmp/cert-expiry-report.json 0 $ jq '.summary.warning,.summary.expired' /tmp/cert-expiry-report.json 16 0
11.3. 証明書の再デプロイ
該当するすべてのホストにマスター、etcd、ノード、レジストリーまたはルーター証明書を再デプロイするには、以下の Playbook を使用します。現在の CA を使用してこれらすべての証明書を一度に再デプロイすることも、特定のコンポーネント用の証明書のみを再デプロイすることも、新しく生成された CA またはカスタム CA 自体を再デプロイすることもできます。
証明書の有効期限 Playbook と同様に、これらの Playbook はクラスターを表すインベントリーファイルを使用して実行する必要があります。
とくにインベントリーでは、すべてのホスト名と IP アドレスが現在のクラスター設定に一致するように、以下の変数でそれらを指定するか、または上書きする必要があります。
-
openshift_hostname
-
openshift_public_hostname
-
openshift_ip
-
openshift_public_ip
-
openshift_master_cluster_hostname
-
openshift_master_cluster_public_hostname
以下のコマンドを実行すると、必要な Playbook が利用できるようになります。
# yum install atomic-openshift-utils
再デプロイ中に自動生成された証明書の有効性 (有効期限が切れるまでの日数) も Ansible で設定できます。「証明書の有効性の設定」を参照してください。
OpenShift Container Platform CA および etcd 証明書の有効期限は 5 年です。署名付きの OpenShift Container Platform 証明書の有効期限は 2 年です。
11.3.1. 現行の OpenShift Container Platform および etcd CA を使用したすべての証明書の再デプロイ
redeploy-certificates.yml Playbook は、OpenShift Container Platform CA 証明書を再生成しません。新しいマスター 、etcd、ノード、レジストリー、およびルーター証明書は、新規の証明書に署名するために現在の CA 証明書を使用して作成されます。
これには、以下の順次の再起動も伴います。
- etcd
- マスターサービス
- ノードサービス
現行の OpenShift Container Platform CA を使用してマスター、etcd、およびノード証明書を再デプロイするには、この Playbook を実行し、インベントリーファイルを指定します。
$ ansible-playbook -i <inventory_file> \ /usr/share/ansible/openshift-ansible/playbooks/redeploy-certificates.yml
11.3.2. 新規またはカスタムの OpenShift Container Platform CA の再デプロイ
openshift-master/redeploy-openshift-ca.yml Playbook は、新規の CA 証明書を生成し、クライアントの kubeconfig ファイルとノードの信頼できる CA のデータベース (CA-trust) を含むすべてのコンポーネントに更新されたバンドルを配布することによって OpenShift Container Platform CA 証明書を再デプロイします。
これには、以下の順次の再起動も伴います。
- マスターサービス
- ノードサービス
- Docker
さらに、証明書を再デプロイする際には、OpenShift Container Platform によって生成される CA を使用する代わりに、カスタム CA 証明書を指定することもできます。
マスターサービスが再起動すると、レジストリーとルーターは、再デプロイされなくてもマスターと引き続き通信できます。これは、マスターの提供証明書が同一であり、レジストリーとルーターの CA が依然として有効であるためです。
新たに生成される CA またはカスタム CA を再デプロイするには、以下を実行します。
オプションで、カスタム CA を指定します。カスタム CA パラメーター
openshift_master_ca_certificate
の一部として指定するcertfile
には、OpenShift Container Platform 証明書に署名する単一証明書のみが含まれる必要があります。チェーンに中間証明書が含まれる場合、それらを別のファイルにバンドルする必要があります。中間証明書なしで CA を指定するには、インベントリーファイルに以下の変数を指定します。
# Configure custom ca certificate # NOTE: CA certificate will not be replaced with existing clusters. # This option may only be specified when creating a new cluster or # when redeploying cluster certificates with the redeploy-certificates # playbook. openshift_master_ca_certificate={'certfile': '</path/to/ca.crt>', 'keyfile': '</path/to/ca.key>'}
中間 CA によって発行された CA 証明書を指定するには、以下を実行します。
CA の中間およびルート証明書の詳細チェーンが含まれるバンドルされた証明書を作成します。
# cat intermediate/certs/<intermediate.cert.pem> \ certs/ca.cert.pem >> intermediate/certs/ca-chain.cert.pem
以下の変数をインベントリーファイルに設定します。
# Configure custom ca certificate # NOTE: CA certificate will not be replaced with existing clusters. # This option may only be specified when creating a new cluster or # when redeploying cluster certificates with the redeploy-certificates # playbook. openshift_master_ca_certificate={'certfile': '</path/to/ca.crt>', 'keyfile': '</path/to/ca.key>'} openshift_additional_ca=intermediate/certs/ca-chain.cert.pem
openshift-master/redeploy-openshift-ca.yml Playbook を実行し、インベントリーファイルを指定します。
$ ansible-playbook -i <inventory_file> \ /usr/share/ansible/openshift-ansible/playbooks/openshift-master/redeploy-openshift-ca.yml
新規の OpenShift Container Platform CA が導入されている場合、新規の CA によって署名された証明書をすべてのコンポーネントに再デプロイする必要がある場合にはいつでも openshift-master/redeploy-certificates.yml Playbook を使用できます。
11.3.3. 新規 etcd CA の再デプロイ
openshift-etcd/redeploy-ca.yml Playbook は、新規 CA 証明書を生成し、すべての etcd ピアとマスタークライアントに更新したバンドルを配布することによって etcd CA 証明書を再デプロイします。
これには、以下の順次の再起動も伴います。
- etcd
- マスターサービス
新たに生成された etcd CA を再デプロイするには、以下を実行します。
openshift-etcd/redeploy-ca.yml Playbook を実行し、インベントリーファイルを指定します。
$ ansible-playbook -i <inventory_file> \ /usr/share/ansible/openshift-ansible/playbooks/openshift-etcd/redeploy-ca.yml
新規 etcd CA が導入されている場合、新規 CA によって署名された証明書を etcd ピアとマスタークライアントに再デプロイする必要がある場合にはいつでも openshift-etcd/redeploy-certificates.yml Playbook を使用できます。または、redeploy-certificates.yml Playbook を使用して、etcd ピアとマスタークライアントに加えて、OpenShift Container Platform コンポーネントの証明書も再デプロイできます。
11.3.4. マスター証明書のみの再デプロイ
openshift-master/redeploy-certificates.yml Playbook は、マスター証明書のみを再デプロイします。これには、マスターサービスの順次の再起動も伴います。
マスター証明書を再デプロイするには、この Playbook を実行し、インベントリーファイルを指定します。
$ ansible-playbook -i <inventory_file> \ /usr/share/ansible/openshift-ansible/playbooks/openshift-master/redeploy-certificates.yml
この Playbook を実行した後に、サービス提供証明書を含む既存のシークレットを削除するか、またはアノテーションを削除し、適切なサービスに再度追加して、サービス提供証明書またはキーペアを再生成する必要があります。
11.3.5. etcd 証明書のみの再デプロイ
openshift-etcd/redeploy-certificates.yml Playbook は、マスタークライアント証明書を含む etcd 証明書のみを再デプロイします。
これには、以下の順次の再起動も伴います。
- etcd
- マスターサービス
etcd 証明書を再デプロイするには、この Playbook を実行し、インベントリーファイルを指定します。
$ ansible-playbook -i <inventory_file> \ /usr/share/ansible/openshift-ansible/playbooks/openshift-etcd/redeploy-certificates.yml
11.3.6. ノード証明書のみの再デプロイ
openshift-node/redeploy-certificates.yml Playbook は、ノード証明書のみを再デプロイします。これには、ノードサービスの順次の再起動も伴います。
ノード証明書を再デプロイするには、この Playbook を実行し、インベントリーファイルを指定します
$ ansible-playbook -i <inventory_file> \ /usr/share/ansible/openshift-ansible/playbooks/openshift-node/redeploy-certificates.yml
11.3.7. レジストリー証明書またはルーター証明書のみの再デプロイ
openshift-hosted/redeploy-registry-certificates.yml Playbook と openshift-hosted/redeploy-router-certificates.yml Playbook は、インストーラーによって作成されたレジストリー証明書とルーター証明書を置き換えます。レジストリーとルーターでカスタム証明書が使用されている場合にそれらを手動で置き換えるには、「 カスタムのレジストリー証明書またはルーター証明書の再デプロイ」を参照してください。
11.3.7.1. レジストリー証明書のみの再デプロイ
レジストリー証明書を再デプロイするには、以下の Playbook を実行し、インベントリーファイルを指定します。
$ ansible-playbook -i <inventory_file> \ /usr/share/ansible/openshift-ansible/playbooks/openshift-hosted/redeploy-registry-certificates.yml
11.3.7.2. ルーター証明書のみの再デプロイ
ルーター証明書を再デプロイするには、以下の Playbook を実行し、インベントリーファイルを指定します。
$ ansible-playbook -i <inventory_file> \ /usr/share/ansible/openshift-ansible/playbooks/openshift-hosted/redeploy-router-certificates.yml
11.3.8. カスタムのレジストリー証明書またはルーター証明書の再デプロイ
再デプロイされた CA が原因でノードが退避させられると、レジストリー Pod とルーター Pod が再起動されます。レジストリー証明書とルーター証明書を新規 CA と共に再デプロイしなかった場合は、それらが古い証明書を使用してマスターにアクセスできなくなるため、停止状態が生じることがあります。
証明書を再デプロイする Playbook は、カスタムのレジストリー証明書またはルーター証明書を再デプロイできません。この問題を解決するため、レジストリー証明書とルーター証明書を手動で再デプロイする必要があります。
11.3.8.1. 手動によるレジストリー証明書の再デプロイ
レジストリー証明書を手動で再デプロイするには、新規レジストリー証明書を registry-certificates
という名前のシークレットに追加してから、レジストリーを再デプロイする必要があります。
これ以降の手順では
default
プロジェクトに切り替えます。$ oc project default
最初にレジストリーを OpenShift Container Platform 3.1 以前で作成した場合は、環境変数が証明書を保存するために使用されている場合があります (この方法は現在は推奨されていません。代わりにシークレットをご使用ください)。
以下のコマンドを実行し、
OPENSHIFT_CA_DATA
、OPENSHIFT_CERT_DATA
、およびOPENSHIFT_KEY_DATA
環境変数を探します。$ oc env dc/docker-registry --list
これらの環境変数が存在しない場合は、この手順を省略します。存在する場合は、以下の
ClusterRoleBinding
を作成します。$ cat <<EOF | apiVersion: v1 groupNames: null kind: ClusterRoleBinding metadata: creationTimestamp: null name: registry-registry-role roleRef: kind: ClusterRole name: system:registry subjects: - kind: ServiceAccount name: registry namespace: default userNames: - system:serviceaccount:default:registry EOF oc create -f -
次に、以下のコマンドを実行して環境変数を削除します。
$ oc env dc/docker-registry OPENSHIFT_CA_DATA- OPENSHIFT_CERT_DATA- OPENSHIFT_KEY_DATA- OPENSHIFT_MASTER-
以下の環境変数をローカルに設定し、後で使用するコマンドを単純化します。
$ REGISTRY_IP=`oc get service docker-registry -o jsonpath='{.spec.clusterIP}'` $ REGISTRY_HOSTNAME=`oc get route/docker-registry -o jsonpath='{.spec.host}'`
新規レジストリー証明書を作成します。
$ oc adm ca create-server-cert \ --signer-cert=/etc/origin/master/ca.crt \ --signer-key=/etc/origin/master/ca.key \ --hostnames=$REGISTRY_IP,docker-registry.default.svc,docker-registry.default.svc.cluster.local,$REGISTRY_HOSTNAME \ --cert=/etc/origin/master/registry.crt \ --key=/etc/origin/master/registry.key \ --signer-serial=/etc/origin/master/ca.serial.txt
Ansible ホストインベントリーファイル (デフォルトで /etc/ansible/hosts) に最初に一覧表示されているマスターから
oc adm
コマンドを実行します。registry-certificates
シークレットを新規レジストリー証明書で更新します。$ oc create secret generic registry-certificates \ --from-file=/etc/origin/master/registry.crt,/etc/origin/master/registry.key \ -o json --dry-run | oc replace -f -
レジストリーを再デプロイします。
$ oc rollout latest dc/docker-registry
11.3.8.2. 手動によるルーター証明書の再デプロイ
ルーターの初回デプロイ時に、アノテーションがサービス提供証明書シークレットを自動的に作成するルーターのサービスに追加されます。
ルーター証明書を手動で再デプロイするため、そのサービス提供証明書の再作成をトリガーできます。これは、シークレットを削除し、アノテーションを削除してから router
サービスに再度追加し、ルーターを再デプロイして実行できます。
これ以降の手順では
default
プロジェクトに切り替えます。$ oc project default
最初にレジストリーを OpenShift Container Platform 3.1 以前で作成した場合は、環境変数が証明書を保存するために使用されている場合があります (この方法は現在は推奨されていません。代わりにサービス提供証明書シークレットをご使用ください)。
以下のコマンドを実行し、
OPENSHIFT_CA_DATA
、OPENSHIFT_CERT_DATA
、およびOPENSHIFT_KEY_DATA
環境変数を探します。$ oc env dc/router --list
それらの変数が存在する場合は、以下の
ClusterRoleBinding
を作成します。$ cat <<EOF | apiVersion: v1 groupNames: null kind: ClusterRoleBinding metadata: creationTimestamp: null name: router-router-role roleRef: kind: ClusterRole name: system:router subjects: - kind: ServiceAccount name: router namespace: default userNames: - system:serviceaccount:default:router EOF oc create -f -
それらの変数が存在する場合は、以下のコマンドを実行してそれらを削除します。
$ oc env dc/router OPENSHIFT_CA_DATA- OPENSHIFT_CERT_DATA- OPENSHIFT_KEY_DATA- OPENSHIFT_MASTER-
証明書を取得します。
- 外部の認証局 (CA) を使用して証明書に署名する場合、以下の内部プロセスに従って、新規の証明書を作成し、これを OpenShift Container Platform に指定します。
内部 OpenShift Container Platform CA を使用して証明書に署名する場合は、以下のコマンドを実行します。
重要以下のコマンドは、内部で署名される証明書を生成します。これは、OpenShift Container Platform CA を信頼するクライアントによってのみ信頼されます。
$ cd /root $ mkdir cert ; cd cert $ oc adm ca create-server-cert \ --signer-cert=/etc/origin/master/ca.crt \ --signer-key=/etc/origin/master/ca.key \ --signer-serial=/etc/origin/master/ca.serial.txt \ --hostnames='*.hostnames.for.the.certificate' \ --cert=router.crt \ --key=router.key \
これらのコマンドは以下のファイルを生成します。
- router.crt という名前の新規の証明書
- 署名する CA 証明書チェーン /etc/origin/master/ca.crt のコピーです。このチェーンには中間の CA を使用する場合に複数の証明書が含まれる場合があります。
- router.key という名前の対応するプライベートキー。
生成された証明書を連結する新規ファイルを作成します。
$ cat router.crt /etc/origin/master/ca.crt router.key > router.pem
新規シークレットを生成する前に、現在のシークレットをバックアップします。
$ oc export secret router-certs > ~/old-router-certs-secret.yaml
新規の証明書およびキーを保持する新規シークレットを作成し、既存のシークレットの内容を置き換えます。
$ oc create secret tls router-certs --cert=router.pem \ 1 --key=router.key -o json --dry-run | \ oc replace -f -
- 1
- router.pem は、生成した証明書の連結を含むファイルです。
以下のアノテーションを
router
サービスから削除します。$ oc annotate service router \ service.alpha.openshift.io/serving-cert-secret-name- \ service.alpha.openshift.io/serving-cert-signed-by-
アノテーションを再度追加します。
$ oc annotate service router \ service.alpha.openshift.io/serving-cert-secret-name=router-certs
ルーターを再デプロイします。
$ oc rollout latest dc/router
第12章 認証およびユーザーエージェントの設定
12.1. 概要
OpenShift Container Platform マスターには、OAuth サーバーがビルトインされています。開発者と管理者は、API に対する認証を実行するために OAuth アクセストークンを取得します。
管理者はマスター設定ファイルを使用して OAuth を アイデンティティープロバイダーを指定するように設定できます。アイデンティティープロバイダーは、通常インストール (advanced installation) の実行中に設定するのが最適ですが、インストール後に設定することもできます。
/
、:
、および %
を含む OpenShift Container Platform ユーザー名はサポートされません。
クイックインストールまたは通常インストール (Advanced installation) 方式を使用して OpenShift Container Platform をインストールした場合、Deny All アイデンティティープロバイダーがデフォルトで使用されます。このアイデンティティープロバイダーは、すべてのユーザー名とパスワードについてアクセスを拒否します。アクセスを許可するには、別のアイデンティティープロバイダーを選択し、マスター設定ファイル (デフォルトでは、/etc/origin/master/master-config.yamlにあります) を適宜設定する必要があります。
設定ファイルなしでマスターを実行する場合は、Allow All アイデンティティープロバイダーがデフォルトで使用されます。このアイデンティティープロバイダーは、空でないユーザー名とパスワードによるログインをすべて許可します。これはテストを行う場合に便利です。その他のアイデンティティープロバイダーを使用するか、token、grant、または session オプション を変更する場合は、設定ファイルからマスターを実行する必要があります。
外部ユーザーのセットアップを管理するためのロールが割り当てられている必要があります。
アイデンティティープロバイダーに変更を加えたら、変更を有効にするためにマスターサービスを再起動する必要があります。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers
12.2. アイデンティティープロバイダーパラメーター
すべてのアイデンティティープロバイダーには共通する 4 つのパラメーターがあります。
パラメーター | 説明 |
---|---|
|
プロバイダー名は、プロバイダーのユーザー名にプレフィックスとして付加され、アイデンティティー名が作成されます。 |
|
true の場合、非 Web クライアント (CLI など) からの認証されていないトークン要求は、
ブラウザークライアントに対するクロスサイトリクエストフォージェリー (CSRF) 攻撃を防止するため、基本的な認証チャレンジは |
|
true の場合、Web クライアント (Web コンソールなど) からの認証されていないトークン要求は、このプロバイダーがサポートするログインページにリダイレクトされます。これはすべてのアイデンティティープロバイダーによってサポートされている訳ではありません。
ユーザーがアイデンティティープロバイダーのログインにリダイレクトされる前にブランドページに移動するようにする場合、マスター設定ファイルで |
|
新規アイデンティティーがログイン時にユーザーにマップされる方法を定義します。以下の値のいずれかを入力します。
|
mappingMethod
パラメーターを add
に設定すると、アイデンティティープロバイダーの追加または変更時に新規プロバイダーのアイデンティティーを既存ユーザーにマッピングできます。
12.3. アイデンティティープロバイダーの設定
OpenShift Container Platform は単一のアイデンティティープロバイダーの設定のみをサポートします。ただし、LDAP フェイルオーバーなどのより複雑な設定の基本認証を拡張することが可能です。
これらのパラメーターを使用して、インストール時またはインストール後にアイデンティティープロバイダーを定義できます。
12.3.1. Ansible を使用したアイデンティティープロバイダーの設定
初回の 通常インストール (Advanced installation) では、Deny All アイデンティティープロバイダーがデフォルトで設定されます。ただし、これは、インベントリーファイルで設定可能な openshift_master_identity_providers
パラメーターを使用してインストール時に上書きすることができます。OAuth 設定のセッションオプションもインベントリーファイルで設定できます。
例12.1 Ansible を使用したアイデンティティープロバイダー設定の例
# htpasswd auth
openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}]
# Defining htpasswd users
#openshift_master_htpasswd_users={'user1': '<pre-hashed password>', 'user2': '<pre-hashed password>'
# or
#openshift_master_htpasswd_file=<path to local pre-generated htpasswd file>
# Allow all auth
#openshift_master_identity_providers=[{'name': 'allow_all', 'login': 'true', 'challenge': 'true', 'kind': 'AllowAllPasswordIdentityProvider'}]
# LDAP auth
#openshift_master_identity_providers=[{'name': 'my_ldap_provider', 'challenge': 'true', 'login': 'true', 'kind': 'LDAPPasswordIdentityProvider', 'attributes': {'id': ['dn'], 'email': ['mail'], 'name': ['cn'], 'preferredUsername': ['uid']}, 'bindDN': '', 'bindPassword': '', 'ca': '', 'insecure': 'false', 'url': 'ldap://ldap.example.com:389/ou=users,dc=example,dc=com?uid'}]
# Configuring the ldap ca certificate 1
#openshift_master_ldap_ca=<ca text>
# or
#openshift_master_ldap_ca_file=<path to local ca file to use>
# Available variables for configuring certificates for other identity providers:
#openshift_master_openid_ca
#openshift_master_openid_ca_file
#openshift_master_request_header_ca
#openshift_master_request_header_ca_file
- 1
openshift_master_identity_providers
パラメーターに CA 証明書の場所を指定する場合、証明書の値をopenshift_master_ldap_ca
パラメーターに指定したり、パスをopenshift_master_ldap_ca_file
パラメーターに使用したりしないようにしてください。
12.3.2. マスター設定ファイルでのアイデンティティープロバイダーの設定
マスター設定ファイルを変更することで、必要なアイデンティティープロバイダーを使用してマスターホストで認証を設定できます。
例12.2 マスター設定ファイルでのアイデンティティープロバイダーの設定例
... oauthConfig: identityProviders: - name: htpasswd_auth challenge: true login: true mappingMethod: "claim" ...
デフォルトの claim
値に設定されている場合、アイデンティティーを以前に存在していたユーザー名にマッピングすると OAuth が失敗します。
12.3.3. アイデンティティープロバイダーまたはメソッドの設定
12.3.3.1. lookup マッピング方法を使用する場合のユーザーの手動プロビジョニング
lookup
マッピング方法を使用する場合、ユーザープロビジョニングは外部システムによって API 経由で行われます。通常、アイデンティティーは、ログイン時にユーザーに自動的にマッピングされます。「 lookup」マッピング方法は、この自動マッピングを自動的に無効にします。そのため、ユーザーを手動でプロビジョニングする必要があります。
identity オブジェクトの詳細については、Identity ユーザー API オブジェクトを参照してください。
lookup
マッピング方法を使用する場合は、アイデンティティープロバイダーを設定した後にユーザーごとに以下の手順を使用してください。
OpenShift Container Platform ユーザーを作成します (まだ作成していない場合)。
$ oc create user <username>
たとえば、以下のコマンドを実行して OpenShift Container Platform ユーザー
bob
を作成します。$ oc create user bob
OpenShift Container Platform アイデンティティーを作成します (まだ作成していない場合)。アイデンティティープロバイダーの名前と、アイデンティティープロバイダーの範囲でこのアイデンティティーを一意に表す名前を使用します。
$ oc create identity <identity-provider>:<user-id-from-identity-provider>
<identity-provider>
は、マスター設定のアイデンティティープロバイダーの名前であり、以下の該当するアイデンティティープロバイダーセクションに表示されています。たとえば、以下のコマンドを実行すると、アイデンティティープロバイダーが
ldap_provider
、アイデンティティープロバイダーのユーザー名がbob_s
のアイデンティティーが作成されます。$ oc create identity ldap_provider:bob_s
作成したユーザーとアイデンティティーのユーザー/アイデンティティーマッピングを作成します。
$ oc create useridentitymapping <identity-provider>:<user-id-from-identity-provider> <username>
たとえば、以下のコマンドを実行すると、アイデンティティーがユーザーにマッピングされます。
$ oc create useridentitymapping ldap_provider:bob_s bob
12.3.4. Allow All
空でないユーザー名とパスワードによるログインを許可するには、 identityProviders
スタンザに AllowAllPasswordIdentityProvider を設定します。
例12.3 AllowAllPasswordIdentityProvider を使用したマスター設定
oauthConfig: ... identityProviders: - name: my_allow_provider 1 challenge: true 2 login: true 3 mappingMethod: claim 4 provider: apiVersion: v1 kind: AllowAllPasswordIdentityProvider
- 1
- このプロバイダー名は、プロバイダーのユーザー名にプレフィックスとして付加され、アイデンティティー名が作成されます。
- 2
- true の場合、非 Web クライアント (CLI など) からの認証されていないトークン要求は、このプロバイダーの
WWW-Authenticate
チャレンジヘッダーと共に送信されます。 - 3
- true の場合、Web クライアント (Web コンソールなど) からの認証されていないトークン要求は、このプロバイダーがサポートするログインページにリダイレクトされます。
- 4
- このプロバイダーのアイデンティティーとユーザーオブジェクト間のマッピングの確立方法を制御します (上記を参照してください)。
12.3.5. Deny All
すべてのユーザー名とパスワードについてアクセスを拒否するには、 identityProviders
スタンザに DenyAllPasswordIdentityProvider を設定します。
例12.4 DenyAllPasswordIdentityProvider を使用したマスター設定
oauthConfig: ... identityProviders: - name: my_deny_provider 1 challenge: true 2 login: true 3 mappingMethod: claim 4 provider: apiVersion: v1 kind: DenyAllPasswordIdentityProvider
- 1
- このプロバイダー名は、プロバイダーのユーザー名にプレフィックスとして付加され、アイデンティティー名が作成されます。
- 2
- true の場合、非 Web クライアント (CLI など) からの認証されていないトークン要求は、このプロバイダーの
WWW-Authenticate
チャレンジヘッダーと共に送信されます。 - 3
- true の場合、Web クライアント (Web コンソールなど) からの認証されていないトークン要求は、このプロバイダーがサポートするログインページにリダイレクトされます。
- 4
- このプロバイダーのアイデンティティーとユーザーオブジェクト間のマッピングの確立方法を制御します (上記を参照してください)。
12.3.6. HTPasswd
ユーザー名およびパスワードを htpasswd
を使用して生成されたフラットファイルに対して検証するには、identityProviders
スタンザに HTPasswdPasswordIdentityProvider を設定します。
htpasswd
ユーティリティーは httpd-tools
パッケージにあります。
# yum install httpd-tools
OpenShift Container Platform では、 Bcrypt、SHA-1、および MD5 暗号化ハッシュ関数がサポートされ、MD5 は htpasswd
のデフォルトです。プレーンテキスト、暗号化テキスト、およびその他のハッシュ関数は、現時点ではサポートされていません。
フラットファイルは、その変更時間が変わると再度読み取られます。サーバーの再起動は必要ありません。
htpasswd コマンドを使用するには、以下の手順を実行します。
ユーザー名とハッシュされたパスワードを含むフラットファイルを作成するには、以下を実行します。
$ htpasswd -c </path/to/users.htpasswd> <user_name>
次に、ユーザーのクリアテキストのパスワードを入力し、確認します。コマンドにより、ハッシュされたバージョンのパスワードが生成されます。
例を以下に示します。
htpasswd -c users.htpasswd user1 New password: Re-type new password: Adding password for user user1
注記-b
オプションを追加すると、パスワードをコマンドラインに指定できます。$ htpasswd -c -b <user_name> <password>
例を以下に示します。
$ htpasswd -c -b file user1 MyPassword! Adding password for user user1
ファイルにログインを追加するか、ログインを更新するには、以下のコマンドを実行します。
$ htpasswd </path/to/users.htpasswd> <user_name>
ファイルからログインを削除するには、以下のコマンドを実行します。
$ htpasswd -D </path/to/users.htpasswd> <user_name>
例12.5 HTPasswdPasswordIdentityProvider を使用したマスター設定
oauthConfig: ... identityProviders: - name: my_htpasswd_provider 1 challenge: true 2 login: true 3 mappingMethod: claim 4 provider: apiVersion: v1 kind: HTPasswdPasswordIdentityProvider file: /path/to/users.htpasswd 5
- 1
- このプロバイダー名は、プロバイダーのユーザー名にプレフィックスとして付加され、アイデンティティー名が作成されます。
- 2
- true の場合、非 Web クライアント (CLI など) からの認証されていないトークン要求は、このプロバイダーの
WWW-Authenticate
チャレンジヘッダーと共に送信されます。 - 3
- true の場合、Web クライアント (Web コンソールなど) からの認証されていないトークン要求は、このプロバイダーがサポートするログインページにリダイレクトされます。
- 4
- このプロバイダーのアイデンティティーとユーザーオブジェクト間のマッピングの確立方法を制御します (上記を参照してください)。
- 5
htpasswd
を使用して生成されたファイルです。
12.3.7. Keystone
Keystone は、アイデンティティー、トークン、カタログ、およびポリシーサービスを提供する OpenStack プロジェクトです。OpenShift Container Platform クラスターと Keystone を統合すると、内部データベースにユーザーを格納するように設定された OpenStack Keystone v3 サーバーによる共有認証を有効にできます。この設定を完了すると、ユーザーは Keystone 認証情報を使用して OpenShift Container Platform にログインできるようになります。
12.3.7.1. マスターでの認証の設定
状況に応じて以下のいずれかの手順を実行します。
Openshift のインストールがすでに完了している場合は、/etc/origin/master/master-config.yaml ファイルを新規ディレクトリーにコピーします。以下は例になります。
$ cd /etc/origin/master $ mkdir keystoneconfig; cp master-config.yaml keystoneconfig
OpenShift Container Platform をまだインストールしていない場合は、OpenShift Container Platform API サーバーを起動し、(将来の) OpenShift Container Platform マスターのホスト名と、起動コマンドによって作成された設定ファイルを格納するディレクトリーを指定します。
$ openshift start master --public-master=<apiserver> --write-config=<directory>
例を以下に示します。
$ openshift start master --public-master=https://myapiserver.com:8443 --write-config=keystoneconfig
注記Ansible を使用してインストールする場合は、
identityProvider
設定を Ansible Playbook に追加する必要があります。Ansible を使用してインストールした後、以下の手順に従って設定を手動で変更した場合、インストールツールまたはアップグレードを再実行するたびに変更内容がすべて失われます。
新規の keystoneconfig/master-config.yaml ファイルの
identityProviders
スタンザを編集し、KeystonePasswordIdentityProvider
の設定例をコピーして貼り付け、既存のスタンザを置き換えます。oauthConfig: ... identityProviders: - name: my_keystone_provider 1 challenge: true 2 login: true 3 mappingMethod: claim 4 provider: apiVersion: v1 kind: KeystonePasswordIdentityProvider domainName: default 5 url: http://keystone.example.com:5000 6 ca: ca.pem 7 certFile: keystone.pem 8 keyFile: keystonekey.pem 9
- 1
- このプロバイダー名は、プロバイダーのユーザー名にプレフィックスとして付加され、アイデンティティー名が作成されます。
- 2
- true の場合、非 Web クライアント (CLI など) からの認証されていないトークン要求は、このプロバイダーの
WWW-Authenticate
チャレンジヘッダーと共に送信されます。 - 3
- true の場合、Web クライアント (Web コンソールなど) からの認証されていないトークン要求は、このプロバイダーがサポートするログインページにリダイレクトされます。
- 4
- このプロバイダーのアイデンティティーとユーザーオブジェクト間のマッピングの確立方法を制御します (上記を参照してください)。
- 5
- Keystone のドメイン名です。Keystone では、ユーザー名はドメイン固有です。単一ドメインのみがサポートされます。
- 6
- Keystone サーバーへの接続に使用する URL (必須) です。
- 7
- オプション: 設定された URL のサーバー証明書を検証するために使用する証明書バンドルです。
- 8
- オプション: 設定された URL に対して要求を実行する際に提示するクライアント証明書です。
- 9
- クライアント証明書のキーです。
certFile
が指定されている場合は必須です。
以下の変更を
identityProviders
スタンザに加えます。-
プロバイダーの
name
(「my_keystone_provider」) を、使用する Keystone サーバーに合わせて変更します。この名前は、プロバイダーのユーザー名にプレフィックスとして付加され、アイデンティティー名が作成されます。 -
必要な場合、
mappingMethod
を変更して、プロバイダーのアイデンティティーとユーザーオブジェクト間でマッピングを確立する方法を制御します。 -
domainName
を OpenStack Keystone サーバーのドメイン名に変更します。Keystone では、ユーザー名はドメイン固有です。単一ドメインのみがサポートされます。 -
OpenStack Keystone への接続に使用する
url
を指定します。 -
オプションで、設定された URL のサーバー証明書を検証できるように
ca
を使用する証明書バンドルに変更します。 -
オプションで、
certFile
を、設定された URL に対する要求の実行時に提示するクライアント証明書に変更します。 -
certFile
が指定されている場合は、keyFile
をクライアント証明書のキーに変更する必要があります。
-
プロバイダーの
- 変更を保存してファイルを閉じます。
OpenShift Container Platform API サーバーを起動し、変更したばかりの設定ファイルを指定します。
$ openshift start master --config=<path/to/modified/config>/master-config.yaml
設定が完了すると、OpenShift Container Platform Web コンソールにログインするすべてのユーザーに Keystone 認証情報を使用してログインすることを求めるプロンプトが出されます。
12.3.7.2. Keystone 認証を使用するユーザーの作成
外部認証プロバイダー (この場合は Keystone) と統合する場合、OpenShift Container Platform にはユーザーを作成しません。Keystone は「system of record」であり、ユーザーは Keystone データベースで定義され、設定された認証サーバーに対する有効な Keystone ユーザー名を持つ任意のユーザーがログインできます。
ユーザーを OpenShift Container Platform に追加するには、そのユーザーが Keystone データベースに存在している必要があります。また、必要な場合はそのユーザーの新しい Keystone アカウントを作成する必要があります。
12.3.7.3. ユーザーの確認
1 名以上のユーザーがログインしたら、oc get users
を実行してユーザーの一覧を表示し、ユーザーが正しく作成されていることを確認できます。
例12.6 oc get users
コマンドの出力
$ oc get users
NAME UID FULL NAME IDENTITIES
bobsmith a0c1d95c-1cb5-11e6-a04a-002186a28631 Bob Smith keystone:bobsmith 1
- 1
- OpenShift Container Platform のアイデンティティーは、Keystone ユーザー名とそれにプレフィックスとして付加されるアイデンティティープロバイダー名で構成されます。
ここからは、ユーザーロールの管理方法を学習することをお勧めします。
12.3.8. LDAP 認証
単純なバインド認証を使用してユーザー名とパスワードを LDAPv3 サーバーに対して検証するには、identityProviders
スタンザに LDAPPasswordIdentityProvider を設定します。
これらの手順に従う代わりに LDAP サーバーのファイルオーバーを要求する場合には、LDAP フェイルオーバーに SSSD を設定して基本認証メソッドを拡張します。
認証時に、指定されたユーザー名に一致するエントリーが LDAP ディレクトリーで検索されます。単一の一意な一致が見つかった場合、エントリーの識別名 (DN) と指定されたパスワードを使用した単純なバインドが試みられます。
以下の手順が実行されます。
-
設定された
url
の属性およびフィルターとユーザーが指定したユーザー名を組み合わせて検索フィルターを生成します。 - 生成されたフィルターを使用してディレクトリーを検索します。検索によって 1 つもエントリーが返されない場合は、アクセスを拒否します。
- 検索で取得したエントリーの DN とユーザー指定のパスワードを使用して LDAP サーバーへのバインドを試みます。
- バインドが失敗した場合は、アクセスを拒否します。
- バインドが成功した場合は、アイデンティティー、電子メールアドレス、表示名、および推奨ユーザー名として設定された属性を使用してアイデンティティーを作成します。
設定される url
は、LDAP ホストと使用する検索パラメーターを指定する RFC 2255 URL です。URL の構文は以下のようになります。
ldap://host:port/basedn?attribute?scope?filter
上記の例は、以下のコンポーネントで構成されています。
URL コンポーネント | 説明 |
---|---|
|
通常の LDAP の場合は、文字列 |
|
LDAP サーバーの名前とポートで。デフォルトは、ldap の場合は |
|
すべての検索が開始されるディレクトリーのブランチの DN です。これは少なくともディレクトリーツリーの最上位になければなりませんが、ディレクトリーのサブツリーを指定することもできます。 |
|
検索対象の属性です。RFC 2255 はカンマ区切りの属性の一覧を許可しますが、属性をどれだけ指定しても最初の属性のみが使用されます。属性を指定しない場合は、デフォルトで |
|
検索の範囲です。 |
|
有効な LDAP 検索フィルターです。指定しない場合、デフォルトは |
検索の実行時に属性、フィルター、指定したユーザー名が組み合わされて以下のような検索フィルターが作成されます。
(&(<filter>)(<attribute>=<username>))
たとえば、以下の URL について見てみましょう。
ldap://ldap.example.com/o=Acme?cn?sub?(enabled=true)
クライアントが bob
というユーザー名を使用して接続を試みる場合、生成される検索フィルターは (&(enabled=true)(cn=bob))
になります。
LDAP ディレクトリーの検索に認証が必要な場合は、エントリー検索の実行に使用する bindDN
と bindPassword
を指定します。
LDAPPasswordIdentityProvider を使用したマスターの設定
oauthConfig: ... identityProviders: - name: "my_ldap_provider" 1 challenge: true 2 login: true 3 mappingMethod: claim 4 provider: apiVersion: v1 kind: LDAPPasswordIdentityProvider attributes: id: 5 - dn email: 6 - mail name: 7 - cn preferredUsername: 8 - uid bindDN: "" 9 bindPassword: "" 10 ca: my-ldap-ca-bundle.crt 11 insecure: false 12 url: "ldap://ldap.example.com/ou=users,dc=acme,dc=com?uid" 13
- 1
- このプロバイダー名は返されるユーザー名にプレフィックスとして付加され、アイデンティティー名が作成されます。
- 2
- true の場合、非 Web クライアント (CLI など) からの認証されていないトークン要求は、このプロバイダーの
WWW-Authenticate
チャレンジヘッダーと共に送信されます。 - 3
- true の場合、Web クライアント (Web コンソールなど) からの認証されていないトークン要求は、このプロバイダーがサポートするログインページにリダイレクトされます。
- 4
- このプロバイダーのアイデンティティーとユーザーオブジェクト間のマッピングの確立方法を制御します (上記を参照してください)。
- 5
- アイデンティティーとして使用する属性の一覧です。最初の空でない属性が使用されます。少なくとも 1 つの属性が必要です。一覧表示される属性のいずれにも値がない場合、認証は失敗します。
- 6
- メールアドレスとして使用する属性の一覧です。最初の空でない属性が使用されます。
- 7
- 表示名として使用する属性の一覧です。最初の空でない属性が使用されます。
- 8
- このアイデンティティーのユーザーをプロビジョニングする際に推奨ユーザー名として使用する属性の一覧です。最初の空でない属性が使用されます。
- 9
- 検索フェーズでバインドするために使用するオプションの DN です。
- 10
- 検索フェーズでバインドするために使用するオプションのパスワードです。この値は、環境変数、外部ファイル、または暗号化ファイルで指定することもできます。
- 11
- 設定された URL のサーバー証明書を検証するために使用する証明書バンドルです。空の場合、システムで信頼されたルートが使用されます。これは insecure: false の場合にのみ適用されます。
- 12
- true の場合、サーバーへの TLS 接続は確立されません。false の場合、
ldaps://
URL は TLS を使用して接続し、ldap://
URL は TLS にアップグレードされます。 - 13
- LDAP ホストと使用する検索パラメーターを指定する RFC 2255 URL です (上記を参照してください)。
LDAP 統合のためのユーザーのホワイトリストを作成するには、lookup
マッピング方法を使用します。LDAP からのログインが許可される前に、クラスター管理者は各 LDAP ユーザーのアイデンティティーとユーザーオブジェクトを作成する必要があります。
12.3.9. Basic 認証 (リモート)
Basic 認証は、ユーザーがリモートのアイデンティティープロバイダーに対して検証した認証情報を使用して OpenShift Container Platform にログインすることを可能にする汎用バックエンド統合メカニズムです。
Basic 認証は汎用性があるため、このアイデンティティープロバイダー使用して詳細な認証設定を実行できます。詳細なリモート Basic 認証設定の開始点として、LDAP フェイルオーバーを設定したり、コンテナー化された Basic 認証リポジトリーを使用できます。
Basic 認証では、ユーザー ID とパスワードのスヌーピングを防ぎ、中間者攻撃を回避するためにリモートサーバーへの HTTPS 接続を使用する必要があります。
BasicAuthPasswordIdentityProvider
を設定していると、ユーザーはユーザー名とパスワードを OpenShift Container Platform に送信し、サーバー間の要求を行い、認証情報を基本認証ヘッダーとして渡すことで、これらの認証情報をリモートサーバーに対して検証することができます。このため、ユーザーはログイン時に認証情報を OpenShift Container Platform に送信する必要があります。
これはユーザー名/パスワードログインの仕組みにのみ有効で、OpenShift Container Platform はリモート認証サーバーに対するネットワーク要求を実行できる必要があります。
identityProviders
スタンザで BasicAuthPasswordIdentityProvider を設定し、サーバー間の基本認証要求を使用してユーザー名とパスワードをリモートサーバーに対して検証できるようにします。ユーザー名とパスワードは基本認証で保護されるリモート URL に対して検証され、JSON を返します。
401
応答は認証の失敗を示しています。
200
以外のステータスまたは空でない「エラー」キーはエラーを示しています。
{"error":"Error message"}
sub
(サブジェクト) キーを持つ 200
ステータスは、成功を示しています。
{"sub":"userid"} 1
- 1
- このサブジェクトは認証ユーザーに固有である必要があり、変更することができません。
正常な応答により、以下のような追加データがオプションで提供されることがあります。
name
キーを使用した表示名。以下は例になります。{"sub":"userid", "name": "User Name", ...}
email
キーを使用したメールアドレス。以下は例になります。{"sub":"userid", "email":"user@example.com", ...}
preferred_username
キーを使用した推奨ユーザー名。これは、固有の変更できないサブジェクトがデータベースキーまたは UID であり、判読可能な名前が存在する場合に便利です。これは、認証された ID に対して OpenShift Container Platform ユーザーをプロビジョニングする場合にヒントとして使われます。以下は例を示しています。{"sub":"014fbff9a07c", "preferred_username":"bob", ...}
12.3.9.1. マスターでの認証の設定
状況に応じて以下のいずれかの手順を実行します。
Openshift のインストールがすでに完了している場合は、/etc/origin/master/master-config.yaml ファイルを新規ディレクトリーにコピーします。以下は例になります。
$ mkdir basicauthconfig; cp master-config.yaml basicauthconfig
OpenShift Container Platform をまだインストールしていない場合は、OpenShift Container Platform API サーバーを起動し、(将来の) OpenShift Container Platform マスターのホスト名と、起動コマンドによって作成された設定ファイルを格納するディレクトリーを指定します。
$ openshift start master --public-master=<apiserver> --write-config=<directory>
例を以下に示します。
$ openshift start master --public-master=https://myapiserver.com:8443 --write-config=basicauthconfig
注記Ansible を使用してインストールする場合は、
identityProvider
設定を Ansible Playbook に追加する必要があります。Ansible を使用してインストールした後、以下の手順に従って設定を手動で変更した場合、インストールツールまたはアップグレードを再実行するたびに変更内容がすべて失われます。
新規の master-config.yaml ファイルの
identityProviders
スタンザを編集し、BasicAuthPasswordIdentityProvider
設定のサンプルをコピーして貼り付け、既存のスタンザを置き換えます。oauthConfig: ... identityProviders: - name: my_remote_basic_auth_provider 1 challenge: true 2 login: true 3 mappingMethod: claim 4 provider: apiVersion: v1 kind: BasicAuthPasswordIdentityProvider url: https://www.example.com/remote-idp 5 ca: /path/to/ca.file 6 certFile: /path/to/client.crt 7 keyFile: /path/to/client.key 8
- 1
- このプロバイダー名は返されるユーザー名にプレフィックスとして付加され、アイデンティティー名が作成されます。
- 2
- true の場合、非 Web クライアント (CLI など) からの認証されていないトークン要求は、このプロバイダーの
WWW-Authenticate
チャレンジヘッダーと共に送信されます。 - 3
- true の場合、Web クライアント (Web コンソールなど) からの認証されていないトークン要求は、このプロバイダーがサポートするログインページにリダイレクトされます。
- 4
- このプロバイダーのアイデンティティーとユーザーオブジェクト間のマッピングの確立方法を制御します (上記を参照してください)。
- 5
- Basic 認証ヘッダーで認証情報を受け入れる URL。
- 6
- オプション: 設定された URL のサーバー証明書を検証するために使用する証明書バンドルです。
- 7
- オプション: 設定された URL に対して要求を実行する際に提示するクライアント証明書です。
- 8
- クライアント証明書のキーです。
certFile
が指定されている場合は必須です。
以下の変更を
identityProviders
スタンザに加えます。-
プロバイダーの
name
をデプロイメントに対して固有で関連するものに設定します。この名前は返されるユーザー ID にプレフィックスとして付加され、アイデンティティー名が作成されます。 -
必要な場合、
mappingMethod
を設定して、プロバイダーのアイデンティティーとユーザーオブジェクト間でマッピングを確立する方法を制御します。 -
Basic 認証ヘッダーで認証情報を受け入れるサーバーへの接続に使用する HTTPS
url
を指定します。 -
オプションで、設定された URL のサーバー証明書を検証するために
ca
を使用する証明書バンドルに設定するか、またはこれを空にしてシステムで信頼されるルートを使用します。 -
オプションで、
certFile
を削除するか、またはこれを設定された URL へ要求を行う時に提示するクライアント証明書に設定します。 -
certFile
を指定する場合、keyFile
をクライアント証明書のキーに設定する必要があります。
- 変更を保存してファイルを閉じます。
OpenShift Container Platform API サーバーを起動し、変更したばかりの設定ファイルを指定します。
$ openshift start master --config=<path/to/modified/config>/master-config.yaml
これが設定されると、OpenShift Container Platform Web コンソールにログインするユーザーには、Basic 認証の認証情報を使用してログインすることを求めるプロンプトが表示されます。
12.3.9.2. トラブルシューティング
最もよく起こる問題は、バックエンドサーバーへのネットワーク接続に関連しています。簡単なデバッグの場合は、マスターで curl
コマンドを実行します。正常なログインをテストするには、以下のコマンド例の <user>
と <password>
を有効な認証情報に置き換えます。無効なログインをテストするには、それらを正しくない認証情報に置き換えます。
curl --cacert /path/to/ca.crt --cert /path/to/client.crt --key /path/to/client.key -u <user>:<password> -v https://www.example.com/remote-idp
正常な応答
sub
(サブジェクト) キーを持つ 200
ステータスは、成功を示しています。
{"sub":"userid"}
サブジェクトは認証ユーザーに固有である必要があり、変更することはできません。
正常な応答により、以下のような追加データがオプションで提供されることがあります。
name
キーを使用した表示名:{"sub":"userid", "name": "User Name", ...}
email
キーを使用したメールアドレス:{"sub":"userid", "email":"user@example.com", ...}
preferred_username
キーを使用した推奨ユーザー名:{"sub":"014fbff9a07c", "preferred_username":"bob", ...}
preferred_username
キーは、固有の変更できないサブジェクトがデータベースキーまたは UID であり、判読可能な名前が存在する場合に便利です。これは、認証 ID に対して OpenShift Container Platform ユーザーをプロビジョニングする場合にヒントとして使われます。
失敗の応答
-
401
応答は認証の失敗を示しています。 -
200
以外のステータスまたは空でない「エラー」キーはエラーを示しています:{"error":"Error message"}
12.3.10. 要求ヘッダー
identityProviders
スタンザで RequestHeaderIdentityProvider を設定して、X-Remote-User
などの要求ヘッダー値からユーザーを識別します。これは通常、プロキシー認証と組み合わせて使用され、要求ヘッダー値を設定します。これは OpenShift Enterprise 2 のリモートユーザープラグイン によって管理者が Kerberos、LDAP、その他の数多くの形式のエンタープライズ認証を指定する方法と似ています。
さらに、SAML 認証などの詳細な設定に要求ヘッダーアイデンティティープロバイダーを使用できます。
ユーザーがこのアイデンティティープロバイダーを使用して認証を行うには、認証プロキシー経由で https://<master>/oauth/authorize
(およびサブパス) にアクセスする必要があります。これを実行するには、OAuth トークンに対する非認証の要求を https://<master>/oauth/authorize
にプロキシー処理するプロキシーエンドポイントにリダイレクトするよう OAuth サーバーを設定します。
ブラウザーベースのログインフローが想定されるクライアントからの非認証要求をリダイレクトするには、以下を実行します。
-
login
パラメーターを true に設定します。 -
provider.loginURL
パラメーターをインタラクティブなクライアントを認証する認証プロキシー URL に設定してから、要求をhttps://<master>/oauth/authorize
にプロキシーします。
WWW-Authenticate
チャレンジが想定されるクライアントからの非認証要求をリダイレクトするには、以下を実行します。
-
challenge
パラメーターを true に設定します。 -
provider.challengeURL
パラメーターをWWW-Authenticate
チャレンジが想定されるクライアントを認証する認証プロキシー URL に設定し、要求をhttps://<master>/oauth/authorize
にプロキシーします。
provider.challengeURL
および provider.loginURL
パラメーターには、URL のクエリー部分に以下のトークンを含めることができます。
${url}
は現在の URL と置き換えられ、エスケープされてクエリーパラメーターで保護されます。例:
https://www.example.com/sso-login?then=${url}
${query}
は最新のクエリー文字列と置き換えられ、エスケープされません。例:
https://www.example.com/auth-proxy/oauth/authorize?${query}
非認証要求が OAuth サーバーに到達することを想定する場合は、要求ヘッダーのユーザー名がチェックされる前に受信要求の有効なクライアント証明書をチェックするように、clientCA
パラメーターをこのアイデンティティープロバイダーに対して設定する必要があります。これを設定しない場合、OAuth サーバーへの直接的な要求は、要求ヘッダーを設定するだけでこのプロバイダーのアイデンティティーになりすます可能性があります。
例12.7 RequestHeaderIdentityProvider を使用したマスター設定
oauthConfig: ... identityProviders: - name: my_request_header_provider 1 challenge: true 2 login: true 3 mappingMethod: claim 4 provider: apiVersion: v1 kind: RequestHeaderIdentityProvider challengeURL: "https://www.example.com/challenging-proxy/oauth/authorize?${query}" 5 loginURL: "https://www.example.com/login-proxy/oauth/authorize?${query}" 6 clientCA: /path/to/client-ca.file 7 clientCommonNames: 8 - my-auth-proxy headers: 9 - X-Remote-User - SSO-User emailHeaders: 10 - X-Remote-User-Email nameHeaders: 11 - X-Remote-User-Display-Name preferredUsernameHeaders: 12 - X-Remote-User-Login
- 1
- このプロバイダー名は要求ヘッダーのユーザー名にプレフィックスとして付加され、アイデンティティー名が作成されます。
- 2
- RequestHeaderIdentityProvider は、設定された
challengeURL
にリダイレクトすることで、WWW-Authenticate
チャレンジを要求するクライアントにのみ応答します。設定される URL はWWW-Authenticate
チャレンジを使用して応答します。 - 3
- RequestHeaderIdentityProvider は、設定された
loginURL
にリダイレクトすることで、ログインフローを要求するクライアントにのみ応答できます。設定される URL はログインフローを使用して応答します。 - 4
- このプロバイダーのアイデンティティーとユーザーオブジェクト間のマッピングの確立方法を制御します (上記を参照してください)。
- 5
- オプション: 非認証の
/oauth/authorize
要求のリダイレクト先となる URLです。これは、ブラウザーベースのクライアントを認証し、その要求をhttps://<master>/oauth/authorize
にプロキシーします。https://<master>/oauth/authorize
にプロキシーする URL は/authorize
で終了し (末尾のスラッシュなし)、OAuth 承認フローが適切に機能するようサブパスもプロキシーします。${url}
は現在の URL に置き換えられ、エスケープされてクエリーパラメーターで保護されます。${query}
は現在のクエリー文字列に置き換えられます。 - 6
- オプション: 非認証の
/oauth/authorize
要求のリダイレクト先となる URL です。WWW-Authenticate
チャレンジが想定されるクライアントを認証し、それらをhttps://<master>/oauth/authorize
にプロキシーします。${url}
は現在の URL に置き換えられ、エスケープされてクエリーパラメーターで保護されます。${query}
は現在のクエリー文字列に置き換えられます。 - 7
- オプション: PEM でエンコードされた証明書バンドルです。これが設定されている場合、要求ヘッダーのユーザー名をチェックする前に、有効なクライアント証明書が提示され、指定ファイルで認証局に対して検証される必要があります。
- 8
- オプション: 共通名 (
cn
) の一覧です。これが設定されている場合は、要求ヘッダーのユーザー名をチェックする前に指定される一覧の Common Name (cn
) を持つ有効なクライアント証明書が提示される必要があります。空の場合、すべての Common Name が許可されます。これはclientCA
との組み合わせる場合にのみ使用できます。 - 9
- ユーザーアイデンティティーを順番にチェックする際に使用するヘッダー名です。値を含む最初のヘッダーはアイデンティティーとして使用されます。これは必須であり、大文字小文字を区別します。
- 10
- メールアドレスを順番にチェックする際に使用するヘッダー名です。値を含む最初のヘッダーはメールアドレスとして使用されます。これは任意であり、大文字小文字を区別します。
- 11
- 表示名を順番にチェックする際に使用するヘッダー名です。値を含む最初のヘッダーは表示名として使用されます。これは任意であり、大文字小文字を区別します。
- 12
- 推奨ユーザー名を順番にチェックする際に使用するヘッダー名です (
headers
で指定されるヘッダーで決定される変更できないアイデンティティーと異なる場合)。値を含む最初のヘッダーは、プロビジョニング時に推奨ユーザー名として使用されます。これは任意であり、大文字小文字を区別します。
例12.8 RequestHeaderIdentityProvider を使用した Apache 認証
この例は、マスターと同じホストに認証プロキシーを設定しています。同じホストにプロキシーとマスターがあると便利ですが、ご使用中の環境に適さない場合があります。たとえば、すでにマスターでルーターを実行している場合、ポート 443 が利用できなくなります。
この参照設定は Apache の mod_auth_form を使用していますが、これは決して必須ではなく、以下の要件を満たしていれば他のプロキシーを簡単に使用することができます。
-
クライアント要求の
X-Remote-User
ヘッダーをブロックして、スプーフィングを防ぎます。 - RequestHeaderIdentityProvider 設定でクライアント証明書認証を実施します。
-
チャレンジフローを使用してすべての認証要求についての
X-Csrf-Token
ヘッダーを設定する必要があります。 -
/oauth/authorize
エンドポイントとそのサブパスのみがプロキシーされる必要があります。バックエンドサーバーがクライアントを正しい場所へ送信できるようリダイレクトは書き換えないでください。 https://<master>/oauth/authorize
へプロキシーする URL は/authorize
で終了 (末尾のスラッシュなし) する必要があります。以下は例になります。-
https://proxy.example.com/login-proxy/authorize?…
→https://<master>/oauth/authorize?…
-
https://<master>/oauth/authorize
にプロキシーされる URL のサブパスは、https://<master>/oauth/authorize
のサブパスにプロキシーする必要があります。以下は例になります。-
https://proxy.example.com/login-proxy/authorize/approve?…
→https://<master>/oauth/authorize/approve?…
-
前提条件のインストール
mod_auth_form モジュールは Optional チャンネル にある mod_session パッケージの一部として同梱されます。
# yum install -y httpd mod_ssl mod_session apr-util-openssl
信頼されたヘッダーを送信する要求を検証するために CA を生成します。この CA は マスターのアイデンティティープロバイダーの設定 の clientCA
のファイル名として使用されます。
# oc adm ca create-signer-cert \ --cert='/etc/origin/master/proxyca.crt' \ --key='/etc/origin/master/proxyca.key' \ --name='openshift-proxy-signer@1432232228' \ --serial='/etc/origin/master/proxyca.serial.txt'
oc adm ca create-signer-cert
コマンドは、5 年間有効な証明書を生成します。この期間は --expire-days
オプションを使って変更することができますが、セキュリティー上の理由から、値をこれ以上大きくすることは推奨されません。
Ansible ホストインベントリーファイル (デフォルトで /etc/ansible/hosts) に最初に一覧表示されているマスターから oc adm
コマンドを実行します。
このプロキシー用のクライアント証明書を生成します。x509 証明書ツーリングを使用して実行することができます。oc adm
CLI を使用すると便利です。
# oc adm create-api-client-config \ --certificate-authority='/etc/origin/master/proxyca.crt' \ --client-dir='/etc/origin/master/proxy' \ --signer-cert='/etc/origin/master/proxyca.crt' \ --signer-key='/etc/origin/master/proxyca.key' \ --signer-serial='/etc/origin/master/proxyca.serial.txt' \ --user='system:proxy' 1 # pushd /etc/origin/master # cp master.server.crt /etc/pki/tls/certs/localhost.crt 2 # cp master.server.key /etc/pki/tls/private/localhost.key # cp ca.crt /etc/pki/CA/certs/ca.crt # cat proxy/system\:proxy.crt \ proxy/system\:proxy.key > \ /etc/pki/tls/certs/authproxy.pem # popd
- 1
- ユーザー名は任意に指定できますが、ログにそのまま表示されるのでわかりやすい名前をつけると便利です。
- 2
- マスターと異なるホスト名で認証プロキシーを実行する場合、上記のようにデフォルトのマスター証明書を使用するのではなく、ホスト名と一致する証明書を生成することが重要です。/etc/origin/master/master-config.yaml ファイルの
masterPublicURL
の値は、SSLCertificateFile
に対して指定される証明書のX509v3 Subject Alternative Name
に含まれる必要があります。新規の証明書を作成する必要がある場合は、oc adm ca create-server-cert
コマンドを使用できます。
oc adm create-api-client-config
コマンドは、2 年間有効な証明書を生成します。この期間は --expire-days
オプションを使って変更することができますが、セキュリティー上の理由から、値をこれ以上大きくすることは推奨されません。Ansible ホストインベントリーファイル (デフォルトは /etc/ansible/hosts) に一覧表示される 1 つ目のマスターからのみ oc adm
コマンドを実行します。
Apache の設定
このプロキシーはマスターと同じホストにある必要はありません。これはクライアント証明書を使用してマスターに接続し、X-Remote-User
ヘッダーを信頼するように設定されます。
-
Apache 設定の証明書を作成します。
SSLProxyMachineCertificateFile
パラメーターの値として指定する証明書は、プロキシーをサーバーに対して認証するために使用されるプロキシーのクライアント証明書です。これは、拡張されたキーのタイプとしてTLS Web Client Authentication
を使用する必要があります。 - 以下のそれぞれに対して Apache を設定します。
LoadModule auth_form_module modules/mod_auth_form.so LoadModule session_module modules/mod_session.so LoadModule request_module modules/mod_request.so # Nothing needs to be served over HTTP. This virtual host simply redirects to # HTTPS. <VirtualHost *:80> DocumentRoot /var/www/html RewriteEngine On RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L] </VirtualHost> <VirtualHost *:443> # This needs to match the certificates you generated. See the CN and X509v3 # Subject Alternative Name in the output of: # openssl x509 -text -in /etc/pki/tls/certs/localhost.crt ServerName www.example.com DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /etc/pki/tls/certs/localhost.crt SSLCertificateKeyFile /etc/pki/tls/private/localhost.key SSLCACertificateFile /etc/pki/CA/certs/ca.crt SSLProxyEngine on SSLProxyCACertificateFile /etc/pki/CA/certs/ca.crt # It's critical to enforce client certificates on the Master. Otherwise # requests could spoof the X-Remote-User header by accessing the Master's # /oauth/authorize endpoint directly. SSLProxyMachineCertificateFile /etc/pki/tls/certs/authproxy.pem # Send all requests to the console RewriteEngine On RewriteRule ^/console(.*)$ https://%{HTTP_HOST}:8443/console$1 [R,L] # In order to using the challenging-proxy an X-Csrf-Token must be present. RewriteCond %{REQUEST_URI} ^/challenging-proxy RewriteCond %{HTTP:X-Csrf-Token} ^$ [NC] RewriteRule ^.* - [F,L] <Location /challenging-proxy/oauth/authorize> # Insert your backend server name/ip here. ProxyPass https://[MASTER]:8443/oauth/authorize AuthType basic </Location> <Location /login-proxy/oauth/authorize> # Insert your backend server name/ip here. ProxyPass https://[MASTER]:8443/oauth/authorize # mod_auth_form providers are implemented by mod_authn_dbm, mod_authn_file, # mod_authn_dbd, mod_authnz_ldap and mod_authn_socache. AuthFormProvider file AuthType form AuthName openshift ErrorDocument 401 /login.html </Location> <ProxyMatch /oauth/authorize> AuthUserFile /etc/origin/master/htpasswd AuthName openshift Require valid-user RequestHeader set X-Remote-User %{REMOTE_USER}s env=REMOTE_USER # For ldap: # AuthBasicProvider ldap # AuthLDAPURL "ldap://ldap.example.com:389/ou=People,dc=my-domain,dc=com?uid?sub?(objectClass=*)" # It's possible to remove the mod_auth_form usage and replace it with # something like mod_auth_kerb, mod_auth_gssapi or even mod_auth_mellon. # The former would be able to support both the login and challenge flows # from the Master. Mellon would likely only support the login flow. # For Kerberos # yum install mod_auth_gssapi # AuthType GSSAPI # GssapiCredStore keytab:/etc/httpd.keytab </ProxyMatch> </VirtualHost> RequestHeader unset X-Remote-User
その他の mod_auth_form 要件
サンプルログインページは、openshift_extras リポジトリーから利用できます。このファイルは DocumentRoot
(デフォルトでは /var/www/html) に配置する必要があります。
ユーザーの作成
ここで、Apache がアカウント情報を保存するために使用しているシステムでユーザーを作成することができます。たとえば、ファイルベース (file-backed) 認証が使用されます。
# yum -y install httpd-tools # touch /etc/origin/master/htpasswd # htpasswd /etc/origin/master/htpasswd <user_name>
マスターの設定
/etc/origin/master/master-config.yaml ファイルの identityProviders
スタンザも更新する必要があります。
identityProviders: - name: requestheader challenge: true login: true provider: apiVersion: v1 kind: RequestHeaderIdentityProvider challengeURL: "https://[MASTER]/challenging-proxy/oauth/authorize?${query}" loginURL: "https://[MASTER]/login-proxy/oauth/authorize?${query}" clientCA: /etc/origin/master/proxyca.crt headers: - X-Remote-User
サービスの再起動
最後に、以下のサービスを再起動します。
# systemctl restart httpd # systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers
設定の検証
プロキシーをバイパスしてテストします。正しいクライアント証明書とヘッダーを指定すれば、トークンを要求できます。
# curl -L -k -H "X-Remote-User: joe" \ --cert /etc/pki/tls/certs/authproxy.pem \ https://[MASTER]:8443/oauth/token/request
クライアント証明書を指定しない場合、要求は拒否されます。
# curl -L -k -H "X-Remote-User: joe" \ https://[MASTER]:8443/oauth/token/request
これは、設定された
challengeURL
(追加のクエリーパラメーターを含む) へのリダイレクトを示します。# curl -k -v -H 'X-Csrf-Token: 1' \ '<masterPublicURL>/oauth/authorize?client_id=openshift-challenging-client&response_type=token'
これは、
WWW-Authenticate
基本チャレンジの 401 応答を示します。# curl -k -v -H 'X-Csrf-Token: 1' \ '<redirected challengeURL from step 3 +query>'
これはアクセストークンを使用するリダイレクトを示します。
# curl -k -v -u <your_user>:<your_password> \ -H 'X-Csrf-Token: 1' '<redirected_challengeURL_from_step_3 +query>'
12.3.11. GitHub
GitHub は OAuth を使用します。OpenShift Container Platform クラスターを統合して OAuth 認証を使用できます。OAuth は基本的にトークンの交換フローを促進します。
GitHub 認証を設定することによって、ユーザーは GitHub 認証情報を使用して OpenShift Container Platform にログインできます。GitHub ユーザー ID を持つすべてのユーザーが OpenShift Container Platform クラスターにログインできないようにするために、アクセスを特定の GitHub 組織のユーザーに制限することができます。
12.3.11.1. GitHub でのアプリケーションの登録
- GitHub で Settings → OAuth applications → Developer applications → Register an application を順番にクリックし、new OAuth application のページに移動します。
-
アプリケーション名を入力します。例:
My OpenShift Install
-
ホームページの URL を入力します。例:
https://myapiserver.com:8443
- オプションで、アプリケーションの説明を入力します。
承認コールバック URL を入力します。ここで、URL の末尾にはアイデンティティープロバイダーの 名前 (マスター設定ファイル の
identityProviders
スタンザで定義されます。このトピックの以下のセクションで設定を行います) が含まれます。<apiserver>/oauth2callback/<identityProviderName>
例を以下に示します。
https://myapiserver.com:8443/oauth2callback/github/
- Register application をクリックします。GitHub はクライアント ID とクライアントシークレットを提供します。このウィンドウを開いたままにして、それらの値をコピーし、マスター設定ファイルに貼り付けます。
12.3.11.2. マスターでの認証の設定
状況に応じて以下のいずれかの手順を実行します。
Openshift のインストールがすでに完了している場合は、/etc/origin/master/master-config.yaml ファイルを新規ディレクトリーにコピーします。以下は例になります。
$ cd /etc/origin/master $ mkdir githubconfig; cp master-config.yaml githubconfig
OpenShift Container Platform をまだインストールしていない場合は、OpenShift Container Platform API サーバーを起動し、(将来の) OpenShift Container Platform マスターのホスト名と、起動コマンドによって作成された設定ファイルを格納するディレクトリーを指定します。
$ openshift start master --public-master=<apiserver> --write-config=<directory>
例を以下に示します。
$ openshift start master --public-master=https://myapiserver.com:8443 --write-config=githubconfig
注記Ansible を使用してインストールする場合は、
identityProvider
設定を Ansible Playbook に追加する必要があります。Ansible を使用してインストールした後、以下の手順に従って設定を手動で変更した場合、インストールツールまたはアップグレードを再実行するたびに変更内容がすべて失われます。注記openshift start master
を使用するとホスト名が自動的に検出されますが、GitHub はアプリケーション登録時に指定した正確なホスト名にリダイレクトできる必要があります。このため、ID は間違ったアドレスにリダイレクトする可能性があるために自動検出することはできません。代わりに、Web ブラウザーが OpenShift Container Platform クラスターとの対話に使用するホスト名を指定する必要があります。
新規 master-config.yaml ファイルの
identityProviders
スタンザを編集し、GitHubIdentityProvider
設定例をコピーして貼り付け、既存のスタンザを置き換えます。oauthConfig: ... identityProviders: - name: github 1 challenge: false 2 login: true 3 mappingMethod: claim 4 provider: apiVersion: v1 kind: GitHubIdentityProvider clientID: ... 5 clientSecret: ... 6 organizations: 7 - myorganization1 - myorganization2 teams: 8 - myorganization1/team-a - myorganization2/team-b
- 1
- このプロバイダー名は GitHub の数字ユーザー ID にプレフィックスとして付加され、アイデンティティー名が作成されます。これはコールバック URL を作成するためにも使用されます。
- 2
- GitHubIdentityProvider を使用して
WWW-Authenticate
チャレンジを送信することはできません。 - 3
- true の場合、(Web コンソールの場合のように) Web クライアントからの非認証トークン要求はログインする GitHub にリダイレクトされます。
- 4
- このプロバイダーのアイデンティティーとユーザーオブジェクト間のマッピングの確立方法を制御します (上記を参照してください)。
- 5
- 登録済みの GitHub OAuth アプリケーション のクライアント ID です。アプリケーションは、
<master>/oauth2callback/<identityProviderName>
のコールバック URL を使用して設定する必要があります。 - 6
- GitHub で発行されるクライアントシークレットです。この値は環境変数、外部ファイル、または暗号化されたファイルでも指定できます。
- 7
- 組織のオプションの一覧です。これが指定されている場合、少なくとも一覧のいずれかの組織のメンバーである GitHub ユーザーのみがログインできます。その組織が clientID で設定された GitHub OAuth アプリケーションを所有していない場合、組織の所有者はこのオプションを使用するためにサードパーティーのアクセスを付与する必要があります。これは組織の管理者が初回の GitHub ログイン時に、または GitHub の組織設定で実行できます。これは
teams
フィールドと組み合わせて使用することはできません。 - 8
- チームのオプションの一覧です。これが指定されている場合、少なくとも一覧のいずれかのチームのメンバーである GitHub ユーザーのみがログインできます。そのチームの組織が clientID で設定された GitHub OAuth アプリケーションを所有していない場合、組織の所有者はこのオプションを使用するためにサードパーティーのアクセスを付与する必要があります。これは組織の管理者が初回の GitHub ログイン時に、または GitHub の組織設定から実行できます。これは
organizations
フィールドと組み合わせて使用することはできません。
以下の変更を
identityProviders
スタンザに加えます。プロバイダーの
name
を変更して、GitHub で設定したコールバック URL に一致させます。たとえば、コールバック URL を
https://myapiserver.com:8443/oauth2callback/github/
として定義した場合、name
はgithub
にする必要があります。-
clientID
を以前に登録した GitHub のクライアント ID に変更します。 -
clientSecret
を以前に登録した GitHub のクライアントシークレットに変更します。 -
organizations
またはteams
を変更して、ユーザーが認証を行うためにメンバーシップを設定している必要がある 1 つ以上の GitHub 組織またはチームの一覧を組み込むようにします。これが指定されている場合、少なくとも一覧のいずれかの組織またはチームのメンバーである GitHub ユーザーのみがログインできます。これが指定されていない場合、有効な GitHub アカウントを持つすべてのユーザーがログインできます。
- 変更を保存してファイルを閉じます。
OpenShift Container Platform API サーバーを起動し、変更したばかりの設定ファイルを指定します。
$ openshift start master --config=<path/to/modified/config>/master-config.yaml
これが設定されると、OpenShift Container Platform の Web コンソールにログインするユーザーには GitHub の認証情報を使用してログインすることを求めるプロンプトが出されます。初回ログイン時に、ユーザーは authorize application をクリックして GitHub が OpenShift Container Platform でのユーザー名、パスワードおよび組織のメンバーシップを使用することを許可する必要があります。その後、ユーザーは Web コンソールにリダイレクトされます。
12.3.11.3. GitHub 認証を持つユーザーの作成
GitHub などの外部認証プロバイダーを統合する場合は、ユーザーを OpenShift Container Platform では作成しません。GitHub は「system of record」であり、ユーザーは GitHub で定義され、指定される組織に属するすべてのユーザーがログインできることになります。
ユーザーを OpenShift Container Platform に追加するには、そのユーザーを GitHub で承認された組織に追加する必要があり、必要な場合は、そのユーザーの新しい GitHub アカウントを作成します。
12.3.11.4. ユーザーの確認
1 名以上のユーザーがログインしたら、oc get users
を実行してユーザーの一覧を表示し、ユーザーが正しく作成されていることを確認できます。
例12.9 oc get users
コマンドの出力
$ oc get users
NAME UID FULL NAME IDENTITIES
bobsmith 433b5641-066f-11e6-a6d8-acfc32c1ca87 Bob Smith github:873654 1
- 1
- OpenShift Container Platform のアイデンティティーは、アイデンティティープロバイダー名と GitHub の内部の数字のユーザー ID で構成されます。そのため、ユーザーが GitHub のユーザー名またはメールアドレスを変更した場合でも、GitHub アカウントに割り当てられる認証情報に依存せず、OpenShift Container Platform にログインできます。これにより安定したログインが作成されます。
ここからは、ユーザーロールを制御する方法を学習することをお勧めします。
12.3.12. GitLab
OAuth 統合 を使用して、identityProviders
スタンザで GitLabIdentityProvider を設定し、GitLab.com またはその他の GitLab インスタンスをアイデンティティープロバイダーとして使用するようにします。OAuth プロバイダー機能には GitLab バージョン 7.7.0 以降が必要です。
例12.10 GitLabIdentityProvider を使用したマスター設定
oauthConfig: ... identityProviders: - name: gitlab 1 challenge: true 2 login: true 3 mappingMethod: claim 4 provider: apiVersion: v1 kind: GitLabIdentityProvider url: ... 5 clientID: ... 6 clientSecret: ... 7 ca: ... 8
- 1
- このプロバイダー名は GitLab 数字ユーザー ID にプレフィックスとして付加され、アイデンティティー名が作成されます。これはコールバック URL を作成するためにも使用されます。
- 2
- true の場合、非 Web クライアント (CLI など) からの認証されていないトークン要求は、このプロバイダーの
WWW-Authenticate
チャレンジヘッダーと共に送信されます。これは Resource Owner Password Credentials 付与フローを使用して GitLab からアクセストークンを取得します。 - 3
- true の場合、Web クライアント (Web コンソールなど) からの非認証トークン要求はログインする GitLab にリダイレクトされます。
- 4
- このプロバイダーのアイデンティティーとユーザーオブジェクト間のマッピングの確立方法を制御します (上記を参照してください)。
- 5
- GitLab OAuth プロバイダーのホスト URL です。これは
https://gitlab.com/
か、または他の GitLab の自己ホストインスタンスのいずれかになります。 - 6
- 登録済みの GitLab OAuth アプリケーションのクライアント ID です。アプリケーションは
<master>/oauth2callback/<identityProviderName>
のコールバック URL で設定する必要があります。 - 7
- GitLab で発行されるクライアントシークレットです。この値は環境変数、外部ファイル、または暗号化されたファイルでも指定できます。
- 8
- CA は、GitLab インスタンスへの要求を行う際に使用する任意の信頼される認証局バンドルです。空の場合、デフォルトのシステムルートが使用されます。
12.3.13. Google
Google の OpenID Connect 統合を使用して、identityProviders
スタンザで GoogleIdentityProvider を設定し、アイデンティティープロバイダーとして Google を使用するようにします。
Google をアイデンティティープロバイダーとして使用するには、<master>/oauth/token/request
を使用してトークンを取得し、コマンドラインツールで使用する必要があります。
Google をアイデンティティープロバイダーとして使用することで、Google ユーザーはサーバーに対して認証されます。以下のように hostedDomain
設定属性を使用して、特定のホストドメインのメンバーに認証を限定することができます。
例12.11 GoogleIdentityProvider を使用したマスター設定
oauthConfig: ... identityProviders: - name: google 1 challenge: false 2 login: true 3 mappingMethod: claim 4 provider: apiVersion: v1 kind: GoogleIdentityProvider clientID: ... 5 clientSecret: ... 6 hostedDomain: "" 7
- 1
- このプロバイダー名は Google の数字のユーザー ID にプレフィックスとして付加され、アイデンティティー名が作成されます。これはリダイレクト URL を作成するためにも使用されます。
- 2
- GoogleIdentityProvider を使用して
WWW-Authenticate
チャレンジを送信することはできません。 - 3
- true の場合、Web クライアント (Web コンソールなど) からの非認証トークン要求はログインする Google へリダイレクトされます。
- 4
- このプロバイダーのアイデンティティーとユーザーオブジェクト間のマッピングの確立方法を制御します (上記を参照してください)。
- 5
- 登録済みの Google プロジェクト のクライアント ID です。プロジェクトは、
<master>/oauth2callback/<identityProviderName>
のリダイレクト URI で設定する必要があります。 - 6
- Google で発行されるクライアントシークレットです。この値は環境変数、外部ファイル、または暗号化されたファイルでも指定できます。
- 7
- サインインアカウントを制限するオプションの ホスト型ドメイン です。空の場合、すべての Google アカウントの認証が許可されます。
12.3.14. OpenID Connect
identityProviders
スタンザで OpenIDIdentityProvider を設定し、Authorization Code Flow を使用して OpenID Connect アイデンティティープロバイダーと統合します。
OpenShift Container Platform の OpenID Connect アイデンティティープロバイダーとして Red Hat シングルサインオンを設定できます。
ID Token および UserInfo の復号化はサポートされていません。
デフォルトで、openid の範囲が要求されます。必要な場合は、extraScopes
フィールドで追加の範囲を指定できます。
要求は、OpenID アイデンティティープロバイダーから返される JWT id_token
から読み取られ、指定される場合は UserInfo
URL によって返される JSON から読み取られます。
1 つ以上の要求をユーザーのアイデンティティーを使用するように設定される必要があります。標準のアイデンティティー要求は sub
になります。
また、どの要求をユーザーの推奨ユーザー名、表示名およびメールアドレスとして使用するか指定することができます。複数の要求が指定されている場合、値が入力されている最初の要求が使用されます。標準のアイデンティティー要求は以下の通りです。
|
「subject identifier」の省略形です。発行側のユーザーのリモートアイデンティティーです。 |
|
ユーザーのプロビジョニング時に優先されるユーザー名です。 |
|
メールアドレス。 |
|
表示名。 |
詳細は、OpenID claim のドキュメントを参照してください。
OpenID Connect アイデンティティープロバイダーを使用するには、<master>/oauth/token/request
を使用してトークンを取得し、コマンドラインツールで使用する必要があります。
OpenIDIdentityProvider を使用する標準マスター設定
oauthConfig: ... identityProviders: - name: my_openid_connect 1 challenge: true 2 login: true 3 mappingMethod: claim 4 provider: apiVersion: v1 kind: OpenIDIdentityProvider clientID: ... 5 clientSecret: ... 6 claims: id: 7 - sub preferredUsername: - preferred_username name: - name email: - email urls: authorize: https://myidp.example.com/oauth2/authorize 8 token: https://myidp.example.com/oauth2/token 9
- 1
- このプロバイダー名はアイデンティティー要求の値にプレフィックスとして付加され、アイデンティティー名が作成されます。これは、リダイレクト URL を作成するためにも使用されます。
- 2
- true の場合、非 Web クライアント (CLI など) からの認証されていないトークン要求は、このプロバイダーの
WWW-Authenticate
チャレンジヘッダーと共に送信されます。この場合、OpenID プロバイダーが Resource Owner Password Credentials 付与フローをサポートしている必要があります。 - 3
- true の場合、Web クライアント (Web コンソールなど) からの非認証トークン要求は、ログインする認証 URL にリダイレクトされます。
- 4
- このプロバイダーのアイデンティティーとユーザーオブジェクト間のマッピングの確立方法を制御します (上記を参照してください)。
- 5
- OpenID プロバイダーに登録されているクライアントのクライアント ID です。このクライアントは
<master>/oauth2callback/<identityProviderName>
にリダイレクトすることを許可されている必要があります。 - 6
- クライアントシークレットです。この値は環境変数、外部ファイル、または暗号化されたファイルでも指定できます。
- 7
- アイデンティティーとして使用する要求の一覧です。空でない最初の要求が使用されます。1 つ以上の要求が必要になります。一覧表示される要求のいずれにも値がないと、認証は失敗します。たとえば、これは、ユーザーのアイデンティティーとして、返される
id_token
のsub
要求の値を使用します。 - 8
- OpenID 仕様に記述される承認エンドポイントです。
https
を使用する必要があります。 - 9
- OpenID 仕様に記述されるトークンエンドポイントです。
https
を使用する必要があります。
カスタム証明書バンドル、追加の範囲、追加の承認要求パラメーター、および userInfo
URL も指定できます。
例12.12 OpenIDIdentityProvider を使用する完全なマスター設定
oauthConfig: ... identityProviders: - name: my_openid_connect challenge: false login: true mappingMethod: claim provider: apiVersion: v1 kind: OpenIDIdentityProvider clientID: ... clientSecret: ... ca: my-openid-ca-bundle.crt 1 extraScopes: 2 - email - profile extraAuthorizeParameters: 3 include_granted_scopes: "true" claims: id: 4 - custom_id_claim - sub preferredUsername: 5 - preferred_username - email name: 6 - nickname - given_name - name email: 7 - custom_email_claim - email urls: authorize: https://myidp.example.com/oauth2/authorize token: https://myidp.example.com/oauth2/token userInfo: https://myidp.example.com/oauth2/userinfo 8
- 1
- 設定される URL のサーバー証明書を検証するために使用する証明書バンドルです。空の場合、システムで信頼されるルートを使用します。
- 2
- 承認トークン要求時に openid の範囲のほかに要求する範囲のオプションの一覧です。
- 3
- 承認トークン要求に追加する追加パラメーターのオプションのマップです。
- 4
- アイデンティティーとして使用する要求の一覧です。空でない最初の要求が使用されます。1 つ以上の要求が必要になります。一覧表示される要求のいずれにも値がないと、認証は失敗します。
- 5
- このアイデンティティーのユーザーをプロビジョニングする際に推奨ユーザー名として使用される要求の一覧です。空でない最初の要求が使用されます。
- 6
- 表示名として使用する要求の一覧です。空でない最初の要求が使用されます。
- 7
- メールアドレスとして使用する要求の一覧です。空でない最初の要求が使用されます。
- 8
- OpenID 仕様に記述される UserInfo エンドポイントです。
https
を使用する必要があります。
12.4. トークンオプション
OAuth サーバーは以下の 2 種類のトークンを生成します。
アクセストークン |
API へのアクセスを付与する永続的なトークン。 |
認証コード |
アクセストークンの交換にのみ使われる一時的なトークン。 |
tokenConfig
スタンザを使用してトークンオプションを設定します。
例12.13 マスター設定のトークンオプション
OAuthClient
オブジェクト定義 により accessTokenMaxAgeSeconds
値を上書きできます。
12.5. 付与オプション
OAuth サーバーが、ユーザーが以前にパーミッションを付与していないクライアントに対するトークン要求を受信する場合、OAuth サーバーが実行するアクションは OAuth クライアントの付与ストラテジーによって変わります。
トークンを要求する OAuth クライアントが独自の付与ストラテジーを提供しない場合、サーバー全体でのデフォルトストラテジーが使用されます。デフォルトストラテジーを設定するには、grantConfig
スタンザで method
値を設定します。method
の有効な値は以下の通りです。
|
付与を自動承認し、要求を再試行します。 |
|
ユーザーに対して付与の承認または拒否を求めるプロンプトを出します。 |
|
付与を自動的に拒否し、失敗エラーをクライアントに返します。 |
例12.14 マスター設定の付与オプション
oauthConfig: ... grantConfig: method: auto
12.6. セッションオプション
OAuth サーバーは、ログインおよびリダイレクトフローで署名および暗号化される Cookie ベースセッションを使用します。
sessionConfig
スタンザを使用してセッションオプションを設定します。
例12.15 マスター設定のセッションオプション
oauthConfig: ... sessionConfig: sessionMaxAgeSeconds: 300 1 sessionName: ssn 2 sessionSecretsFile: "..." 3
- 1
- セッションの最大期間を制御します。トークン要求が完了すると、セッションは自動的に期限切れとなります。auto-grant が有効にされていない場合、ユーザーがクライアント承認要求を承認または拒否するためにかかると想定される時間の間、セッションは継続する必要があります。
- 2
- セッションを保存するために使用される Cookie の名前です。
- 3
- シリアライズされた
SessionSecrets
オブジェクトを含むファイル名です。空の場合、サーバーが起動されるたびにランダムの署名および暗号化シークレットが生成されます。
sessionSecretsFile
が指定されていない場合、マスターサーバーが起動されるたびにランダムの署名および暗号化シークレットが生成されます。つまりマスターが再起動されると、進行中のログインではセッションが無効になります。また、これは他のマスターのいずれかによって生成されるセッションを復号化することはできないことも意味します。
使用する署名および暗号化シークレットを指定するには、sessionSecretsFile
を指定します。これにより、シークレット値と設定ファイルを分離でき、たとえば、設定ファイルをデバッグなどの目的に合わせて配布可能な状態とすることができます。
複数のシークレットを sessionSecretsFile
に指定してローテーションを有効にできます。一覧の最初のシークレットを使用して、新しいセッションに署名し、これを暗号化します。既存のセッションは、成功するまで各シークレットによって復号化され、認証されます。
例12.16 セッションシークレット設定:
apiVersion: v1 kind: SessionSecrets secrets: 1 - authentication: "..." 2 encryption: "..." 3 - authentication: "..." encryption: "..." ...
12.7. ユーザーエージェントによる CLI バージョンの不一致の防止
OpenShift Container Platform は、アプリケーション開発者の CLI が OpenShift Container Platform API にアクセスすることを防止するために使用されるユーザーエージェントを実装しています。
OpenShift Container Platform CLI のユーザーエージェントは、OpenShift Container Platform 内の値のセットで構成されています。
<command>/<version> (<platform>/<architecture>) <client>/<git_commit>
たとえば、以下の場合を考慮しましょう。
-
<command> =
oc
-
<version> = クライアントのバージョン。たとえば、
v3.3.0
。/api
で Kubernetes API に対して行われる要求が Kubernetes のバージョンを受信し、/oapi
で OpenShift Container Platform API に対して行われる要求が OpenShift Container Platform のバージョン (oc version
によって指定される) を受信します。 -
<platform> =
linux
-
<architecture> =
amd64
-
<client> =
openshift
またはkubernetes
。要求が/api
で Kubernetes API に対して行われるか、/oapi
で OpenShift Container Platform API に対して行われるかによって決まります。 -
<git_commit> = クライアントバージョンの Git コミット (例:
f034127
)
上記の場合、ユーザーエージェントは以下のようになります。
oc/v3.3.0 (linux/amd64) openshift/f034127
OpenShift Container Platform 管理者として、マスター設定の userAgentMatching
設定を使用してクライアントが API にアクセスできないようにすることができます。そのため、クライアントが特定のライブラリーまたはバイナリーを使用している場合、クライアントは API にアクセスできなくなります。
以下のユーザーエージェントの例は、Kubernetes 1.2 クライアントバイナリー、OpenShift Origin 1.1.3 バイナリー、POST および PUT httpVerbs を拒否します。
policyConfig: userAgentMatchingConfig: defaultRejectionMessage: "Your client is too old. Go to https://example.org to update it." deniedClients: - regex: '\w+/v(?:(?:1\.1\.1)|(?:1\.0\.1)) \(.+/.+\) openshift/\w{7}' - regex: '\w+/v(?:1\.1\.3) \(.+/.+\) openshift/\w{7}' httpVerbs: - POST - PUT - regex: '\w+/v1\.2\.0 \(.+/.+\) kubernetes/\w{7}' httpVerbs: - POST - PUT requiredClients: null
管理者は、予想されるクライアントに正確に一致しないクライアントを拒否することもできます。
policyConfig: userAgentMatchingConfig: defaultRejectionMessage: "Your client is too old. Go to https://example.org to update it." deniedClients: [] requiredClients: - regex: '\w+/v1\.1\.3 \(.+/.+\) openshift/\w{7}' - regex: '\w+/v1\.2\.0 \(.+/.+\) kubernetes/\w{7}' httpVerbs: - POST - PUT
クライアントのユーザーエージェントが設定と一致しない場合にエラーが発生します。変更する要求が一致するように、ホワイトリストを実施します。ルールは特定の verb にマップされるので、変化する要求を禁止し、変化しない要求を許可することができます。
第13章 グループと LDAP の同期
13.1. 概要
OpenShift Container Platform 管理者として、グループを使用してユーザーを管理し、権限を変更し、連携を強化できます。組織ではユーザーグループをすでに作成し、それらを LDAP サーバーに保存している場合があります。OpenShift Container Platform はそれらの LDAP レコードを内部 OpenShift Container Platform レコードと同期できるので、グループを 1 つの場所で管理できます。現時点で OpenShift Container Platform はグループメンバーシップを定義するための 3 つの共通スキーマ (RFC 2307、Active Directory、拡張された Active Directory) を使用してグループと LDAP サーバーの同期をサポートしています。
グループを同期するには cluster-admin
権限を持っている必要があります。
13.2. LDAP 同期の設定
LDAP 同期を実行するには、同期設定ファイルが必要です。このファイルには LDAP クライアント設定の詳細が含まれます。
- LDAP サーバーへの接続の設定。
- LDAP サーバーで使用されるスキーマに依存する同期設定オプション。
同期設定ファイルには、OpenShift Container Platform Group 名を LDAP サーバーのグループにマップする管理者が定義した名前マッピングの一覧も含まれます。
13.2.1. LDAP クライアント設定
例13.1 LDAP クライアント設定
url: ldap://10.0.0.0:389 1 bindDN: cn=admin,dc=example,dc=com 2 bindPassword: password 3 insecure: false 4 ca: my-ldap-ca-bundle.crt 5
- 1
- データベースをホストする LDAP サーバーの接続プロトコル、 IP アドレス、および
scheme://host:port
としてフォーマットされる接続先のポートです。 - 2
- バインド DN として使用する任意の識別名 (DN) です。同期操作のエントリーを取得するために昇格した権限が必要となる場合、OpenShift Container Platform はこれを使用します。
- 3
- バインドに使用する任意のパスワードです。同期操作のエントリーを取得するために昇格した権限が必要となる場合、OpenShift Container Platform はこれを使用します。この値は環境変数、外部ファイル、または暗号化ファイルでも指定できます。
- 4
true
の場合、サーバーへの TLS 接続は行われません。false
の場合、セキュアな LDAP (ldaps://
) URL は TLS を使用して接続し、非セキュアな LDAP (ldap://
) URL は TLS にアップグレードされます。- 5
- 設定された URL のサーバー証明書を検証するために使用する証明書バンドルです。空の場合、OpenShift Container Platform はシステムで信頼されるルートを使用します。
insecure
がfalse
に設定されている場合にのみ、これが適用されます。
13.2.2. LDAP クエリー定義
同期設定は、同期に必要となるエントリーの LDAP クエリー定義で構成されています。LDAP クエリーの特定の定義は、LDAP サーバーにメンバーシップ情報を保存するために使用されるスキーマに依存します。
例13.2 LDAP クエリー定義
baseDN: ou=users,dc=example,dc=com 1 scope: sub 2 derefAliases: never 3 timeout: 0 4 filter: (objectClass=inetOrgPerson) 5 pageSize: 0 6
- 1
- すべての検索が開始されるディレクトリーのブランチの識別名 (DN) です。ディレクトリーツリーの上部を指定する必要がありますが、ディレクトリーのサブツリーを指定することもできます。
- 2
- 3
- LDAP ツリーのエイリアスに関連する検索の動作です。有効な値は
never
、search
、base
、またはalways
です。これを定義しない場合、デフォルトはalways
となり、エイリアスを逆参照します。逆参照の動作については以下の表で説明されています。 - 4
- クライアントによって検索に許可される時間制限です。秒単位で表示されます。0 の値はクライアント側の制限がないことを意味します。
- 5
- 有効な LDAP 検索フィルターです。これを定義しない場合、デフォルトは
(objectClass=*)
になります。 - 6
- LDAP エントリーで測定される、サーバーからの応答ページの任意の最大サイズです。0 に設定すると、応答ページのサイズ制限はなくなります。クライアントまたはサーバーがデフォルトで許可しているエントリー数より多いエントリーをクエリーが返す場合、ページングサイズの設定が必要となります。
LDAP 検索範囲 | 説明 |
---|---|
|
クエリーに対して指定されるベース DN で指定するオブジェクトのみを考慮します。 |
|
クエリーについてベース DN とツリー内の同じレベルにあるすべてのオブジェクト考慮します。 |
|
クエリーに指定されるベース DN のサブツリー全体を考慮します。 |
逆参照動作 | 説明 |
---|---|
|
LDAP ツリーにあるエイリアスを逆参照しません。 |
|
検索中に見つかったエイリアスのみを逆参照します。 |
|
ベースオブジェクトを検索中にエイリアスのみを逆参照します。 |
|
LDAP ツリーにあるすべてのエイリアスを常に逆参照します。 |
13.2.3. ユーザー定義の名前マッピング
ユーザー定義の名前マッピングは、OpenShift Container Platform Groups の名前を LDAP サーバーでグループを検出する固有の識別子に明示的にマップします。マッピングは通常の YAML 構文を使用します。ユーザー定義のマッピングには LDAP サーバーのすべてのグループのエントリーを含めることも、それらのグループのサブセットのみを含めることもできます。ユーザー定義の名前マッピングを持たないグループが LDAP サーバーにある場合、同期時のデフォルト動作では Group の名前として指定される属性が使用されます。
例13.3 ユーザー定義の名前マッピング
groupUIDNameMapping: "cn=group1,ou=groups,dc=example,dc=com": firstgroup "cn=group2,ou=groups,dc=example,dc=com": secondgroup "cn=group3,ou=groups,dc=example,dc=com": thirdgroup
13.3. LDAP 同期の実行
同期設定ファイルを作成すると、同期を開始できます。OpenShift Container Platform では、管理者は同じサーバーを使用して多数の異なる同期タイプを実行できます。
デフォルトでは、すべてのグループ同期またはプルーニング操作がドライランされるので、OpenShift Container Platform Group レコードを変更するために sync-groups
コマンドで --confirm
フラグを設定する必要があります。
OpenShift Container Platform を使用して LDAP サーバーからすべてのグループを同期するには、以下を実行します。
$ oc adm groups sync --sync-config=config.yaml --confirm
設定ファイルで指定された LDAP サーバーのグループに対応する OpenShift Container Platform の Group をすべて同期するには、以下を実行します。
$ oc adm groups sync --type=openshift --sync-config=config.yaml --confirm
LDAP グループのサブセットと OpenShift Container Platform を同期するには、ホワイトリストファイル、ブラックリストファイル、またはその両方を使用します。
ブラックリストファイル、ホワイトリストファイル、またはホワイトリストのリテラルの組み合わせを使用できます。ホワイトリストのリテラルはコマンド自体に直接含めることができます。これは LDAP サーバーにあるグループと OpenShift Container Platform にすでにあるグループに適用されます。ファイルには 1 行ごとの 1 つの固有のグループ識別子を含める必要があります。
$ oc adm groups sync --whitelist=<whitelist_file> \ --sync-config=config.yaml \ --confirm $ oc adm groups sync --blacklist=<blacklist_file> \ --sync-config=config.yaml \ --confirm $ oc adm groups sync <group_unique_identifier> \ --sync-config=config.yaml \ --confirm $ oc adm groups sync <group_unique_identifier> \ --whitelist=<whitelist_file> \ --blacklist=<blacklist_file> \ --sync-config=config.yaml \ --confirm $ oc adm groups sync --type=openshift \ --whitelist=<whitelist_file> \ --sync-config=config.yaml \ --confirm
13.4. グループのプルーニングジョブの実行
グループを作成した LDAP サーバーのレコードが存在しなくなった場合、管理者は OpenShift Container Platform レコードからグループを削除することを選択できます。プルーニングジョブは、同期ジョブに使用されるものと同じ同期設定ファイルとホワイトまたはブラックリストを受け入れます。
たとえば、グループが config.yaml ファイルを使用して LDAP から同期されており、その一部のグループが LDAP サーバーに存在しなくなっている場合、以下のコマンドを使用して、どの OpenShift Container Platform の Group が LDAP で削除されたグループに対応するかを判断し、それらを OpenShift Container Platform から削除できます。
$ oc adm groups prune --sync-config=config.yaml --confirm
13.5. 同期の例
このセクションでは、RFC 2307、Active Directory と 拡張された Active Directory スキーマの例を紹介しています。以下のすべての例では 2 名のメンバー (Jane
と Jim
) を持つ admins
というグループを同期しています。それぞれの例では以下について説明しています。
- グループとユーザーが LDAP サーバーに追加される方法。
- LDAP 同期設定ファイルの概観。
- 同期後に生成される OpenShift Container Platform の Group レコード。
これらの例では、すべてのユーザーがそれぞれのグループの直接的なメンバーであることを想定しています。とくに、グループには他のグループがメンバーとして含まれません。ネスト化されたグループを同期する方法の詳細については、「ネスト化されたメンバーシップ同期の例」を参照してください。
13.5.1. RFC 2307
RFC 2307 スキーマでは、ユーザー (Jane と Jim) とグループの両方がファーストクラスエントリーとして LDAP サーバーに存在し、グループメンバーシップはグループの属性に保存されます。以下の ldif
のスニペットでは、このスキーマのユーザーとグループを定義しています。
例13.4 RFC 2307 スキーマを使用する LDAP エントリー: rfc2307.ldif
dn: ou=users,dc=example,dc=com objectClass: organizationalUnit ou: users dn: cn=Jane,ou=users,dc=example,dc=com objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: Jane sn: Smith displayName: Jane Smith mail: jane.smith@example.com dn: cn=Jim,ou=users,dc=example,dc=com objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: Jim sn: Adams displayName: Jim Adams mail: jim.adams@example.com dn: ou=groups,dc=example,dc=com objectClass: organizationalUnit ou: groups dn: cn=admins,ou=groups,dc=example,dc=com 1 objectClass: groupOfNames cn: admins owner: cn=admin,dc=example,dc=com description: System Administrators member: cn=Jane,ou=users,dc=example,dc=com 2 member: cn=Jim,ou=users,dc=example,dc=com
このグループを同期するには、まず設定ファイルを作成する必要があります。RFC 2307 スキーマでは、ユーザーとグループエントリー両方の LDAP クエリー定義と内部 OpenShift Container Platform レコードでそれらを表すのに使用する属性を指定する必要があります。
明確にするために、OpenShift Container Platform で作成するグループは (可能な場合) ユーザーまたは管理者に表示されるフィールドに識別名以外の属性を使用する必要があります。たとえば、メールによってグループのユーザーを識別し、一般名としてグループの名前を使用します。以下の設定ファイルでは、このような関係を作成しています。
ユーザー定義の名前マッピングを使用する場合は、設定ファイルが異なります。
例13.5 RFC 2307 スキーマを使用する LDAP 同期設定: rfc2307_config.yaml
kind: LDAPSyncConfig apiVersion: v1 url: ldap://LDAP_SERVICE_IP:389 1 insecure: false 2 rfc2307: groupsQuery: baseDN: "ou=groups,dc=example,dc=com" scope: sub derefAliases: never pageSize: 0 groupUIDAttribute: dn 3 groupNameAttributes: [ cn ] 4 groupMembershipAttributes: [ member ] 5 usersQuery: baseDN: "ou=users,dc=example,dc=com" scope: sub derefAliases: never pageSize: 0 userUIDAttribute: dn 6 userNameAttributes: [ mail ] 7 tolerateMemberNotFoundErrors: false tolerateMemberOutOfScopeErrors: false
- 1
- このグループのレコードが保存される LDAP サーバーの IP アドレスとホストです。
- 2
true
の場合、サーバーへの TLS 接続は行われません。false
の場合、セキュアな LDAP (ldaps://
) URL は TLS を使用して接続し、非セキュアな LDAP (ldap://
) URL は TLS にアップグレードされます。- 3
- LDAP サーバーのグループを一意に識別する属性です。groupUIDAttribute に DN を使用している場合、
groupsQuery
フィルターを指定できません。詳細なフィルターを実行するには、ホワイトリスト/ブラックリスト方法を使用します。 - 4
- Group の名前として使用する属性です。
- 5
- メンバーシップ情報を保存するグループの属性です。
- 6
- LDAP サーバーでユーザーを一意に識別する属性です。userUIDAttribute に DN を使用している場合は、
usersQuery
フィルターを指定できません。詳細のフィルターを実行するには、ホワイトリスト/ブラックリスト方法を使用します。 - 7
- OpenShift Container Platform Group レコードでユーザー名として使用される属性です。
rfc2307_config.yaml ファイルと同期するには、以下を実行します。
$ oc adm groups sync --sync-config=rfc2307_config.yaml --confirm
OpenShift Container Platform は、上記の同期操作の結果として以下のグループレコードを作成します。
例13.6 rfc2307_config.yaml を使用して作成される OpenShift Container Platform Group
apiVersion: user.openshift.io/v1 kind: Group metadata: annotations: openshift.io/ldap.sync-time: 2015-10-13T10:08:38-0400 1 openshift.io/ldap.uid: cn=admins,ou=groups,dc=example,dc=com 2 openshift.io/ldap.url: LDAP_SERVER_IP:389 3 creationTimestamp: name: admins 4 users: 5 - jane.smith@example.com - jim.adams@example.com
13.5.1.1. ユーザー定義の名前マッピングに関する RFC2307
グループとユーザー定義の名前マッピングを同期する場合、設定ファイルは、以下に示すこれらのマッピングが含まれるように変更されます。
例13.7 ユーザー定義の名前マッピングに関する RFC 2307 スキーマを使用する LDAP 同期設定: rfc2307_config_user_defined.yaml
kind: LDAPSyncConfig apiVersion: v1 groupUIDNameMapping: "cn=admins,ou=groups,dc=example,dc=com": Administrators 1 rfc2307: groupsQuery: baseDN: "ou=groups,dc=example,dc=com" scope: sub derefAliases: never pageSize: 0 groupUIDAttribute: dn 2 groupNameAttributes: [ cn ] 3 groupMembershipAttributes: [ member ] usersQuery: baseDN: "ou=users,dc=example,dc=com" scope: sub derefAliases: never pageSize: 0 userUIDAttribute: dn 4 userNameAttributes: [ mail ] tolerateMemberNotFoundErrors: false tolerateMemberOutOfScopeErrors: false
- 1
- ユーザー定義の名前マッピングです。
- 2
- ユーザー定義の名前マッピングでキーに使用される固有の識別属性です。groupUIDAttribute に DN を使用している場合は
groupsQuery
フィルターを指定できません。詳細なフィルターを実行するには、ホワイトリスト/ブラックリスト方法を使用します。 - 3
- 固有の識別子がユーザー定義の名前マッピングに存在しない場合に OpenShift Container Platform Group に名前を付けるための属性です。
- 4
- LDAP サーバーでユーザーを一意に識別する属性です。userUIDAttribute に DN を使用している場合は、
usersQuery
フィルターを指定できません。詳細のフィルターを実行するには、ホワイトリスト/ブラックリスト方法を使用します。
rfc2307_config_user_defined.yaml ファイルと同期するには、以下を実行します。
$ oc adm groups sync --sync-config=rfc2307_config_user_defined.yaml --confirm
OpenShift Container Platform は、上記の同期操作の結果として以下のグループレコードを作成します。
例13.8 rfc2307_config_user_defined.yaml を使用して作成される OpenShift Container Platform Group
apiVersion: user.openshift.io/v1
kind: Group
metadata:
annotations:
openshift.io/ldap.sync-time: 2015-10-13T10:08:38-0400
openshift.io/ldap.uid: cn=admins,ou=groups,dc=example,dc=com
openshift.io/ldap.url: LDAP_SERVER_IP:389
creationTimestamp:
name: Administrators 1
users:
- jane.smith@example.com
- jim.adams@example.com
- 1
- ユーザー定義の名前マッピングが指定するグループ名です。
13.5.2. ユーザー定義のエラートレランスに関する RFC 2307
デフォルトでは、同期されるグループにメンバークエリーで定義された範囲外にあるエントリーを持つメンバーが含まれる場合、グループ同期は以下のエラーを出して失敗します。
Error determining LDAP group membership for "<group>": membership lookup for user "<user>" in group "<group>" failed because of "search for entry with dn="<user-dn>" would search outside of the base dn specified (dn="<base-dn>")".
これは usersQuery
フィールドの baseDN
が間違って設定されていることを示していることがよくあります。ただし、baseDN
にグループの一部のメンバーが意図的に含まれていない場合、tolerateMemberOutOfScopeErrors: true
を設定することでグループ同期が継続されます。範囲外のメンバーは無視されます。
同様に、グループ同期プロセスでグループのメンバーの検出に失敗した場合、同期はエラーを出して失敗します。
Error determining LDAP group membership for "<group>": membership lookup for user "<user>" in group "<group>" failed because of "search for entry with base dn="<user-dn>" refers to a non-existent entry". Error determining LDAP group membership for "<group>": membership lookup for user "<user>" in group "<group>" failed because of "search for entry with base dn="<user-dn>" and filter "<filter>" did not return any results".
これは、usersQuery
フィールドが間違って設定されていることを示していることがよくあります。ただし、グループに欠落していると認識されているメンバーエントリーが含まれる場合、tolerateMemberNotFoundErrors: true
を設定することでグループ同期が継続されます。問題のあるメンバーは無視されます。
LDAP グループ同期のエラートレランスを有効にすると、同期プロセスは問題のあるメンバーエントリーを無視します。LDAP グループ同期が正しく設定されていない場合、同期された OpenShift Container Platform グループにメンバーが欠落する可能性があります。
例13.9 問題のあるグループメンバーシップに関する RFC 2307 スキーマを使用する LDAP エントリー: rfc2307_problematic_users.ldif
dn: ou=users,dc=example,dc=com objectClass: organizationalUnit ou: users dn: cn=Jane,ou=users,dc=example,dc=com objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: Jane sn: Smith displayName: Jane Smith mail: jane.smith@example.com dn: cn=Jim,ou=users,dc=example,dc=com objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: Jim sn: Adams displayName: Jim Adams mail: jim.adams@example.com dn: ou=groups,dc=example,dc=com objectClass: organizationalUnit ou: groups dn: cn=admins,ou=groups,dc=example,dc=com objectClass: groupOfNames cn: admins owner: cn=admin,dc=example,dc=com description: System Administrators member: cn=Jane,ou=users,dc=example,dc=com member: cn=Jim,ou=users,dc=example,dc=com member: cn=INVALID,ou=users,dc=example,dc=com 1 member: cn=Jim,ou=OUTOFSCOPE,dc=example,dc=com 2
上記の例でエラーを許容するには、以下を同期設定ファイルに追加する必要があります。
例13.10 エラーを許容する RFC 2307 スキーマを使用した LDAP 同期設定: rfc2307_config_tolerating.yaml
kind: LDAPSyncConfig apiVersion: v1 url: ldap://LDAP_SERVICE_IP:389 rfc2307: groupsQuery: baseDN: "ou=groups,dc=example,dc=com" scope: sub derefAliases: never groupUIDAttribute: dn groupNameAttributes: [ cn ] groupMembershipAttributes: [ member ] usersQuery: baseDN: "ou=users,dc=example,dc=com" scope: sub derefAliases: never userUIDAttribute: dn 1 userNameAttributes: [ mail ] tolerateMemberNotFoundErrors: true 2 tolerateMemberOutOfScopeErrors: true 3
- 2
true
の場合、同期ジョブは一部のメンバーが見つからなかったグループを許容し、LDAP エントリーが見つからなかったメンバーは無視されます。グループのメンバーが見つからない場合、同期ジョブのデフォルト動作は失敗します。- 3
true
の場合、同期ジョブは、一部のメンバーがusersQuery
ベース DN で指定されるユーザー範囲外にいるグループを許容し、メンバークエリー範囲外のメンバーは無視されます。グループのメンバーが範囲外の場合、同期ジョブのデフォルト動作は失敗します。- 1
- LDAP サーバーでユーザーを一意に識別する属性です。userUIDAttribute に DN を使用している場合は、
usersQuery
フィルターを指定できません。詳細のフィルターを実行するには、ホワイトリスト/ブラックリスト方法を使用します。
rfc2307_config_tolerating.yaml ファイルを使用して同期するには、以下を実行します。
$ oc adm groups sync --sync-config=rfc2307_config_tolerating.yaml --confirm
OpenShift Container Platform は、上記の同期操作の結果として以下のグループレコードを作成します。
例13.11 rfc2307_config.yaml を使用して作成される OpenShift Container Platform Group
apiVersion: user.openshift.io/v1
kind: Group
metadata:
annotations:
openshift.io/ldap.sync-time: 2015-10-13T10:08:38-0400
openshift.io/ldap.uid: cn=admins,ou=groups,dc=example,dc=com
openshift.io/ldap.url: LDAP_SERVER_IP:389
creationTimestamp:
name: admins
users: 1
- jane.smith@example.com
- jim.adams@example.com
- 1
- 同期ファイルで指定されるグループのメンバーのユーザーです。検索中に許容されるエラーがないメンバーです。
13.5.3. Active Directory
Active Directory スキーマでは、両方のユーザー (Jane と Jim) がファーストクラスエントリーとして LDAP サーバーに存在し、グループメンバーシップはユーザーの属性に保存されます。以下の ldif
のスニペットでは、このスキーマのユーザーとグループを定義しています。
例13.12 Active Directory スキーマを使用する LDAP エントリー: active_directory.ldif
dn: ou=users,dc=example,dc=com
objectClass: organizationalUnit
ou: users
dn: cn=Jane,ou=users,dc=example,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: testPerson
cn: Jane
sn: Smith
displayName: Jane Smith
mail: jane.smith@example.com
memberOf: admins 1
dn: cn=Jim,ou=users,dc=example,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: testPerson
cn: Jim
sn: Adams
displayName: Jim Adams
mail: jim.adams@example.com
memberOf: admins
- 1
- ユーザーのグループメンバーシップはユーザーの属性として一覧表示され、グループはサーバー上にエントリーとして存在しません。
memberOf
属性はユーザーのリテラル属性である必要はありません。一部の LDAP サーバーでは、これは検索中に作成され、クライアントに返されますが、データベースにコミットされません。
このグループを同期するには、まず設定ファイルを作成する必要があります。Active Directory スキーマでは、ユーザーエントリーの LDAP クエリー定義と内部 OpenShift Container Platform Group レコードでそれらを表すのに使用する属性を指定する必要があります。
明確にするために、OpenShift Container Platform で作成したグループは (可能な場合) ユーザーまたは管理者に表示されるフィールドに識別名以外の属性を使用する必要があります。たとえば、メールによってグループのユーザーを識別しますが、LDAP サーバーのグループ名でグループの名前を定義します。以下の設定ファイルでは、このような関係を作成しています。
例13.13 Active Directory スキーマを使用する LDAP 同期設定: active_directory_config.yaml
kind: LDAPSyncConfig apiVersion: v1 url: ldap://LDAP_SERVICE_IP:389 activeDirectory: usersQuery: baseDN: "ou=users,dc=example,dc=com" scope: sub derefAliases: never filter: (objectclass=inetOrgPerson) pageSize: 0 userNameAttributes: [ mail ] 1 groupMembershipAttributes: [ memberOf ] 2
active_directory_config.yaml ファイルを使用して同期するには、以下を実行します。
$ oc adm groups sync --sync-config=active_directory_config.yaml --confirm
OpenShift Container Platform は、上記の同期操作の結果として以下のグループレコードを作成します。
例13.14 active_directory_config.yaml を使用して作成される OpenShift Container Platform Group
apiVersion: user.openshift.io/v1 kind: Group metadata: annotations: openshift.io/ldap.sync-time: 2015-10-13T10:08:38-0400 1 openshift.io/ldap.uid: admins 2 openshift.io/ldap.url: LDAP_SERVER_IP:389 3 creationTimestamp: name: admins 4 users: 5 - jane.smith@example.com - jim.adams@example.com
13.5.4. 拡張された Active Directory
拡張された Active Directory スキーマでは、両方のユーザー (Jane と Jim) とグループがファーストクラスエントリーとして LDAP サーバーに存在し、グループメンバーシップはユーザーの属性に保存されます。以下の ldif
のスニペットではこのスキーマのユーザーとグループを定義しています。
例13.15 拡張された Active Directory スキーマを使用する LDAP エントリー: augmented_active_directory.ldif
dn: ou=users,dc=example,dc=com objectClass: organizationalUnit ou: users dn: cn=Jane,ou=users,dc=example,dc=com objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: testPerson cn: Jane sn: Smith displayName: Jane Smith mail: jane.smith@example.com memberOf: cn=admins,ou=groups,dc=example,dc=com 1 dn: cn=Jim,ou=users,dc=example,dc=com objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: testPerson cn: Jim sn: Adams displayName: Jim Adams mail: jim.adams@example.com memberOf: cn=admins,ou=groups,dc=example,dc=com dn: ou=groups,dc=example,dc=com objectClass: organizationalUnit ou: groups dn: cn=admins,ou=groups,dc=example,dc=com 2 objectClass: groupOfNames cn: admins owner: cn=admin,dc=example,dc=com description: System Administrators member: cn=Jane,ou=users,dc=example,dc=com member: cn=Jim,ou=users,dc=example,dc=com
このグループを同期するには、まず設定ファイルを作成する必要があります。拡張された Active Directory スキーマでは、ユーザーエントリーとグループエントリーの両方の LDAP クエリー定義と内部 OpenShift Container Platform Group レコードでそれらを表すのに使用する属性を指定する必要があります。
明確にするために、OpenShift Container Platform で作成するグループは (可能な場合) ユーザーまたは管理者に表示されるフィールドに識別名以外の属性を使用する必要があります。たとえば、メールによってグループのユーザーを識別し、一般名としてグループの名前を使用します。以下の設定ファイルではこのような関係を作成しています。
例13.16 拡張された Active Directory スキーマを使用する LDAP 同期設定: augmented_active_directory_config.yaml
kind: LDAPSyncConfig apiVersion: v1 url: ldap://LDAP_SERVICE_IP:389 augmentedActiveDirectory: groupsQuery: baseDN: "ou=groups,dc=example,dc=com" scope: sub derefAliases: never pageSize: 0 groupUIDAttribute: dn 1 groupNameAttributes: [ cn ] 2 usersQuery: baseDN: "ou=users,dc=example,dc=com" scope: sub derefAliases: never filter: (objectclass=inetOrgPerson) pageSize: 0 userNameAttributes: [ mail ] 3 groupMembershipAttributes: [ memberOf ] 4
- 1
- LDAP サーバーのグループを一意に識別する属性です。groupUIDAttribute に DN を使用している場合、
groupsQuery
フィルターを指定できません。詳細なフィルターを実行するには、ホワイトリスト/ブラックリスト方法を使用します。 - 2
- Group の名前として使用する属性です。
- 3
- OpenShift Container Platform Group レコードでユーザー名として使用される属性です。
- 4
- メンバーシップ情報を保存するユーザーの属性です。
augmented_active_directory_config.yaml ファイルを使用して同期するには、以下を実行します。
$ oc adm groups sync --sync-config=augmented_active_directory_config.yaml --confirm
OpenShift Container Platform は、上記の同期操作の結果として以下のグループレコードを作成します。
例13.17 augmented_active_directory_config.yaml を使用して作成される OpenShift Group
apiVersion: user.openshift.io/v1 kind: Group metadata: annotations: openshift.io/ldap.sync-time: 2015-10-13T10:08:38-0400 1 openshift.io/ldap.uid: cn=admins,ou=groups,dc=example,dc=com 2 openshift.io/ldap.url: LDAP_SERVER_IP:389 3 creationTimestamp: name: admins 4 users: 5 - jane.smith@example.com - jim.adams@example.com
13.6. ネスト化されたメンバーシップ同期の例
OpenShift Container Platform の Group はネスト化しません。LDAP サーバーはデータが使用される前にグループメンバーシップを平坦化する必要があります。Microsoft の Active Directory Server は、LDAP_MATCHING_RULE_IN_CHAIN
ルールによりこの機能をサポートしており、これには OID 1.2.840.113556.1.4.1941
が設定されています。さらに、このマッチングルールを使用すると、明示的にホワイトリスト化されたグループのみを同期できます。
このセクションでは、拡張された Active Directory スキーマの例を取り上げ、1 名のユーザー Jane
と 1 つのグループ otheradmins
をメンバーとして持つ admins
というグループを同期します。otheradmins
グループには 1 名のユーザーメンバー Jim
が含まれます。この例では以下のことを説明しています。
- グループとユーザーが LDAP サーバーに追加される方法。
- LDAP 同期設定ファイルの概観。
- 同期後に生成される OpenShift Container Platform の Group レコード。
拡張された Active Directory スキーマでは、ユーザー (Jane
と Jim
) とグループの両方がファーストクラスエントリーとして LDAP サーバーに存在し、グループメンバーシップはユーザーまたはグループの属性に保存されます。以下の ldif
のスニペットはこのスキーマのユーザーとグループを定義します。
ネスト化されたメンバーを持つ拡張された Active Directory スキーマを使用する LDAP エントリー: augmented_active_directory_nested.ldif
dn: ou=users,dc=example,dc=com objectClass: organizationalUnit ou: users dn: cn=Jane,ou=users,dc=example,dc=com objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: testPerson cn: Jane sn: Smith displayName: Jane Smith mail: jane.smith@example.com memberOf: cn=admins,ou=groups,dc=example,dc=com 1 dn: cn=Jim,ou=users,dc=example,dc=com objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: testPerson cn: Jim sn: Adams displayName: Jim Adams mail: jim.adams@example.com memberOf: cn=otheradmins,ou=groups,dc=example,dc=com 2 dn: ou=groups,dc=example,dc=com objectClass: organizationalUnit ou: groups dn: cn=admins,ou=groups,dc=example,dc=com 3 objectClass: group cn: admins owner: cn=admin,dc=example,dc=com description: System Administrators member: cn=Jane,ou=users,dc=example,dc=com member: cn=otheradmins,ou=groups,dc=example,dc=com dn: cn=otheradmins,ou=groups,dc=example,dc=com 4 objectClass: group cn: otheradmins owner: cn=admin,dc=example,dc=com description: Other System Administrators memberOf: cn=admins,ou=groups,dc=example,dc=com 5 6 member: cn=Jim,ou=users,dc=example,dc=com
Active Directory を使用してネスト化されたグループを同期するには、ユーザーエントリーとグループエントリーの両方の LDAP クエリー定義と内部 OpenShift Container Platform Group レコードでそれらを表すのに使用する属性を指定する必要があります。さらに、この設定では特定の変更が必要となります。
-
oc adm groups sync
コマンドはグループを明示的にホワイトリスト化する必要があります。 -
ユーザーの
groupMembershipAttributes
には"memberOf:1.2.840.113556.1.4.1941:"
を含め、LDAP_MATCHING_RULE_IN_CHAIN
ルールに従う必要があります。 -
groupUIDAttribute
はdn
に設定される必要があります。 groupsQuery
:-
filter
を設定しないでください。 -
有効な
derefAliases
を設定する必要があります。 -
baseDN
を設定しないでください。この値は無視されます。 -
scope
を設定しないでください。この値は無視されます。
-
明確にするために、OpenShift Container Platform で作成するグループは (可能な場合) ユーザーまたは管理者に表示されるフィールドに識別名以外の属性を使用する必要があります。たとえば、メールによってグループのユーザーを識別し、一般名としてグループの名前を使用します。以下の設定ファイルではこれらの関係を作成しています。
ネスト化されたメンバーを持つ拡張された Active Directory スキーマを使用する LDAP 同期設定: augmented_active_directory_config_nested.yaml
kind: LDAPSyncConfig apiVersion: v1 url: ldap://LDAP_SERVICE_IP:389 augmentedActiveDirectory: groupsQuery: 1 derefAliases: never pageSize: 0 groupUIDAttribute: dn 2 groupNameAttributes: [ cn ] 3 usersQuery: baseDN: "ou=users,dc=example,dc=com" scope: sub derefAliases: never filter: (objectclass=inetOrgPerson) pageSize: 0 userNameAttributes: [ mail ] 4 groupMembershipAttributes: [ "memberOf:1.2.840.113556.1.4.1941:" ] 5
- 1
groupsQuery
フィルターは指定できません。groupsQuery
ベース DN とスコープ値は無視されます。groupsQuery
は有効なderefAliases
を設定する必要があります。- 2
- LDAP サーバーのグループを一意に識別する属性です。
dn
に設定される必要があります。 - 3
- Group の名前として使用する属性です。
- 4
- OpenShift Container Platform Group レコードでユーザー名として使用される属性です。
mail
またはsAMAccountName
がほとんどのインストールで推奨されます。 - 5
- メンバーシップ情報を保存するユーザーの属性です。
LDAP_MATCHING_RULE_IN_CHAIN
を使用することに注意してください。
augmented_active_directory_config_nested.yaml ファイルを使用して同期するには、以下を実行します。
$ oc adm groups sync \ 'cn=admins,ou=groups,dc=example,dc=com' \ --sync-config=augmented_active_directory_config_nested.yaml \ --confirm
cn=admins,ou=groups,dc=example,dc=com
グループを明示的にホワイトリスト化する必要があります。
OpenShift Container Platform は、上記の同期操作の結果として以下のグループレコードを作成します。
augmented_active_directory_config_nested.yaml を使用して作成される OpenShift Group
apiVersion: user.openshift.io/v1 kind: Group metadata: annotations: openshift.io/ldap.sync-time: 2015-10-13T10:08:38-0400 1 openshift.io/ldap.uid: cn=admins,ou=groups,dc=example,dc=com 2 openshift.io/ldap.url: LDAP_SERVER_IP:389 3 creationTimestamp: name: admins 4 users: 5 - jane.smith@example.com - jim.adams@example.com
13.7. LDAP 同期設定の仕様
設定ファイルのオブジェクト仕様は以下で説明されています。スキーマオブジェクトにはそれぞれのフィールドがあることに注意してください。たとえば、v1.ActiveDirectoryConfig は groupsQuery
フィールドを持ちませんが、v1.RFC2307Config と v1.AugmentedActiveDirectoryConfig の両方にこのフィールドがあります。
バイナリー属性はサポートされていません。LDAP サーバーの全属性データは、UTF-8 エンコード文字列の形式である必要があります。たとえば、ID 属性として、バイナリー属性を使用することはできません (例: objectGUID
)。代わりに sAMAccountName
または userPrincipalName
などの文字列属性を使用する必要があります。
13.7.1. v1.LDAPSyncConfig
LDAPSyncConfig
は、LDAP グループ同期を定義するために必要な設定オプションを保持します。
名前 | 説明 | スキーマ |
---|---|---|
|
このオブジェクトが表す REST リソースを表す文字列の値です。サーバーはクライアントが要求を送信するエンドポイントからこれを推測できることがあります。これを更新することはできません。CamelCase。詳細については、https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#types-kinds を参照してください。 |
文字列 |
|
オブジェクトのこの表現のバージョンスキーマを定義します。サーバーは認識されたスキーマを最新の内部値に変換し、認識されない値は拒否することがあります。詳細については、https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#resources を参照してください。 |
文字列 |
|
ホストは接続先の LDAP サーバーのスキーム、ホストおよびポートになります。 |
文字列 |
|
LDAP サーバーをバインドする任意の DN です。 |
文字列 |
|
検索フェーズでバインドする任意のパスワードです。 | |
|
|
ブール値 |
|
サーバーへ要求を行う際に使用する任意の信頼された認証局バンドルです。空の場合は、デフォルトのシステムルートが使用されます。 |
文字列 |
|
LDAP グループ UID の OpenShift Container Platform Group 名への任意の直接マッピングです。 |
object |
|
RFC2307 と同じ方法でセットアップされた LDAP サーバーからデータを抽出するための設定を保持します。ファーストクラスグループとユーザーエントリーを抽出し、グループメンバーシップはメンバーを一覧表示するグループエントリーの複数値の属性によって決定されます。 | |
|
Active Directory に使用されるのと同じ方法でセットアップされた LDAP サーバーからデータを抽出するための設定を保持します。ファーストクラスユーザーエントリーを抽出し、グループメンバーシップはメンバーが属するグループを一覧表示するメンバーの複数値の属性によって決定されます。 | |
|
上記の Active Directory で使用されるのと同じ方法でセットアップされた LDAP サーバーからデータを抽出するための設定を保持します。1 つの追加として、ファーストクラスグループエントリーが存在し、それらはメタデータを保持するために使用されますが、グループメンバーシップは設定されません。 |
13.7.2. v1.StringSource
StringSource
によって文字列インラインを指定できます。または環境変数またはファイルを使用して外部から指定することもできます。文字列の値のみを含む場合、単純な JSON 文字列にマーシャルします。
名前 | 説明 | スキーマ |
---|---|---|
|
クリアテキスト値、または |
文字列 |
|
クリアテキスト値、または |
文字列 |
|
クリアテキスト値、または |
文字列 |
|
値を復号化するために使用するキーを含むファイルを参照します。 |
文字列 |
13.7.3. v1.LDAPQuery
LDAPQuery
は LDAP クエリーの作成に必要なオプションを保持します。
名前 | 説明 | スキーマ |
---|---|---|
|
すべての検索が開始されるディレクトリーのブランチの DN です。 |
文字列 |
|
検索の (任意の) 範囲です。 |
文字列 |
|
エイリアスに関する検索の (任意の) 動作です。 |
文字列 |
|
応答の待機を中止するまでにサーバーへの要求を未処理のままにする時間制限 (秒単位) を保持します。これが |
整数 |
|
ベース DN を持つ LDAP サーバーから関連するすべてのエントリーを取得する有効な LDAP 検索フィルターです。 |
文字列 |
|
LDAP エントリーで測定される、推奨される最大ページサイズです。ページサイズ |
整数 |
13.7.4. v1.RFC2307Config
RFC2307Config
は、RFC2307 スキーマを使用してどのように LDAP グループ同期が LDAP サーバーに相互作用するかを定義するために必要な設定オプションを保持します。
名前 | 説明 | スキーマ |
---|---|---|
|
グループエントリーを返す LDAP クエリーのテンプレートを保持します。 | |
|
LDAP グループエントリーのどの属性が固有の識別子として解釈されるかを定義します。( |
文字列 |
|
LDAP グループエントリーのどの属性が OpenShift Container Platform グループに使用する名前として解釈されるかを定義します。 |
文字列の配列 |
|
LDAP グループエントリーのどの属性がメンバーとして解釈されるかを定義します。それらの属性に含まれる値は |
文字列の配列 |
|
ユーザーエントリーを返す LDAP クエリーのテンプレートを保持します。 | |
|
LDAP ユーザーエントリーのどの属性が固有の識別子として解釈されるかを定義します。 |
文字列 |
|
LDAP ユーザーエントリーのどの属性が順番に OpenShift Container Platform ユーザー名として使われるかを定義します。空でない値を持つ最初の属性が使用されます。これは |
文字列の配列 |
|
ユーザーエントリーがない場合の LDAP 同期ジョブの動作を決定します。 |
ブール値 |
|
範囲外のユーザーエントリーが検出される場合の LDAP 同期ジョブの動作を決定します。 |
ブール値 |
13.7.5. v1.ActiveDirectoryConfig
ActiveDirectoryConfig
は必要な設定オプションを保持し、どのように LDAP グループ同期が Active Directory スキーマを使用して LDAP サーバーと相互作用するかを定義します。
名前 | 説明 | スキーマ |
---|---|---|
|
ユーザーエントリーを返す LDAP クエリーのテンプレートを保持します。 | |
|
LDAP ユーザーエントリーのどの属性が OpenShift Container Platform ユーザー名として解釈されるかを定義します。OpenShift Container Platform Group レコードでユーザーの名前として使用する属性。ほとんどのインストールで、 |
文字列の配列 |
|
LDAP ユーザーのどの属性がメンバーの属するグループとして解釈されるかを定義します。 |
文字列の配列 |
13.7.6. v1.AugmentedActiveDirectoryConfig
AugmentedActiveDirectoryConfig
は必要な設定オプションを保持し、どのように LDAP グループ同期が拡張された Active Directory スキーマを使用して LDAP サーバーに相互作用するかを定義します。
名前 | 説明 | スキーマ |
---|---|---|
|
ユーザーエントリーを返す LDAP クエリーのテンプレートを保持します。 | |
|
LDAP ユーザーエントリーのどの属性が OpenShift Container Platform ユーザー名として解釈されるかを定義します。OpenShift Container Platform Group レコードでユーザーの名前として使用する属性。ほとんどのインストールで、 |
文字列の配列 |
|
LDAP ユーザーのどの属性がメンバーの属するグループとして解釈されるかを定義します。 |
文字列の配列 |
|
グループエントリーを返す LDAP クエリーのテンプレートを保持します。 | |
|
LDAP グループエントリーのどの属性が固有の識別子として解釈されるかを定義します。( |
文字列 |
|
LDAP グループエントリーのどの属性が OpenShift Container Platform グループに使用する名前として解釈されるかを定義します。 |
文字列の配列 |
第14章 LDAP フェイルオーバーの設定
OpenShift Container Platform は Lightweight Directory Access Protocol (LDAP) セットアップで使用するための 認証プロバイダーを提供しますが、接続できるのは単一の LDAP サーバーのみです。OpenShift Container Platform インストール時に、LDAP フェイルオーバーの System Security Services Daemon (SSSD) を設定し、ある LDAP サーバーが失敗した場合にクラスターにアクセスできるようにします。
この設定には、詳細な設定および通信先となる OpenShift Container Platform の認証サーバー (リモート Basic 認証サーバー とも呼ばれます) が別途必要となります。メールアドレスなどの追加の属性を OpenShift Container Platform に渡すようにこのサーバーを設定し、それらの属性を Web コンソールで表示できるようにします。
このトピックでは、専用の物理または仮想マシン (VM) のセットアップを完了する方法や、コンテナーでの SSSD の設定方法についても説明します。
このトピックのすべてのセクションを完了する必要があります。
14.1. 基本リモート認証の前提条件
セットアップを始める前に、LDAP サーバーの以下の情報について知っておく必要があります。
- ディレクトリーサーバーが FreeIPA、Active Directory、または別の LDAP ソリューションでサポートされているかどうか。
- LDAP サーバーの Uniform Resource Identifier (URI) (例: ldap.example.com)。
- LDAP サーバーの CA 証明書の場所。
- LDAP サーバーがユーザーグループの RFC 2307 または RFC2307bis に対応しているかどうか。
サーバーを準備します。
remote-basic.example.com: リモート基本認証サーバーとして使用する VM。
- Red Hat Enterprise Linux 7.0 以降などの、このサーバーの SSSD バージョン 1.12.0 を含むオペレーティングシステムを選択します。
openshift.example.com: OpenShift Container Platform の新規インストール。
- 認証方法をこのクラスターに設定することはできません。
- このクラスターで OpenShift Container Platform を起動することはできません。
14.2. 証明書の生成およびリモート Basic 認証サーバーとの共有
Ansible ホストインベントリーファイル (デフォルトは /etc/ansible/hosts) に一覧表示された 1 つ目のマスターホストで以下の手順を実行します。
リモート Basic 認証サーバーと OpenShift Container Platform 間の通信に新異性をもたせるために、このセットアップの他のフェーズで使用する Transport Layer Security (TLS) 証明書のセットを作成します。以下のコマンドを実行します。
# openshift start \ --public-master=https://openshift.example.com:8443 \ --write-config=/etc/origin/
出力には、/etc/origin/master/ca.crt および /etc/origin/master/ca.key の署名用証明書が含まれます。
署名用証明書を使用してリモート Basic 認証サーバーで使用するキーを生成します。
# mkdir -p /etc/origin/remote-basic/ # oc adm ca create-server-cert \ --cert='/etc/origin/remote-basic/remote-basic.example.com.crt' \ --key='/etc/origin/remote-basic/remote-basic.example.com.key' \ --hostnames=remote-basic.example.com \ 1 --signer-cert='/etc/origin/master/ca.crt' \ --signer-key='/etc/origin/master/ca.key' \ --signer-serial='/etc/origin/master/ca.serial.txt'
- 1
- リモート Basic 認証サーバーにアクセスする必要のある、すべてのホスト名およびインターネット IP アドレスのコンマ区切りの一覧です。
注記生成する証明書ファイルは 2 年間有効です。この期間は、
--expire-days
および--signer-expire-days
の値を変更して変更することができますが、セキュリティー上の理由により、730 より大きな値を設定しないでください。重要リモート Basic 認証サーバーにアクセスする必要のあるすべてのホスト名およびインターフェース IP アドレスを一覧表示しない場合、HTTPS 接続は失敗します。
必要な証明書およびキーをリモート Basic 認証サーバーにコピーします。
# scp /etc/origin/master/ca.crt \ root@remote-basic.example.com:/etc/pki/CA/certs/ # scp /etc/origin/remote-basic/remote-basic.example.com.crt \ root@remote-basic.example.com:/etc/pki/tls/certs/ # scp /etc/origin/remote-basic/remote-basic.example.com.key \ root@remote-basic.example.com:/etc/pki/tls/private/
14.3. SSSD での LDAP フェイルオーバーの設定
リモート Basic 認証サーバーで以下の手順を実行します。
メールアドレスおよび表示名などの属性を取得し、それらを OpenShift Container Platform に渡して Web インターフェースに表示することができるように SSSD を設定します。以下の手順では、メールアドレスを OpenShift Container Platform に指定するように SSSD を設定します。
必要な SSSD および Web サーバーコンポーネントをインストールします。
# yum install -y sssd \ sssd-dbus \ realmd \ httpd \ mod_session \ mod_ssl \ mod_lookup_identity \ mod_authnz_pam \ php \ mod_php
LDAP サーバーに対してこの VM を認証するように SSSD を設定します。LDAP サーバーが FreeIPA または Active Directory 環境の場合、realmd を使用してこのマシンをドメインに参加させることができます。
# realm join ldap.example.com
より高度なケースの場合は、『システムレベル認証ガイド』を参照してください。
- SSSD を使用して LDAP のフェイルオーバーの状態を使用するには、ldap_uri 行の /etc/sssd/sssd.conf ファイルにその他のエントリーを追加します。FreeIPA に登録されたシステムは DNS SRV レコードを使用してフェイルオーバーを自動的に処理します。
/etc/sssd/sssd.conf ファイルの [domain/DOMAINNAME] セクションを変更し、この属性を追加します。
[domain/example.com] ... ldap_user_extra_attrs = mail 1
- 1
- LDAP ソリューションのメールアドレスを取得するために正しい属性を指定します。IPA については、
mail
を指定します。他の LDAP ソリューションはemail
などの別の属性を使用する可能性があります。
/etc/sssd/sssd.conf ファイルの domain パラメーターには [domain/DOMAINNAME] セクションに一覧表示されているドメイン名のみが含まれていることを確認します。
domains = example.com
メール属性を取得するために Apache パーミッションを付与します。以下の行を /etc/sssd/sssd.conf ファイルの [ifp] セクションに追加します。
[ifp] user_attributes = +mail allowed_uids = apache, root
すべての変更が適切に適用されていることを確認するには、SSSD を再起動します。
$ systemctl restart sssd.service
ユーザー情報が適切に取得できるかどうかをテストします。
$ getent passwd <username> username:*:12345:12345:Example User:/home/username:/usr/bin/bash
指定したメール属性がドメインからメールアドレスを返すことを確認します。
# dbus-send --print-reply --system --dest=org.freedesktop.sssd.infopipe \ /org/freedesktop/sssd/infopipe org.freedesktop.sssd.infopipe.GetUserAttr \ string:username \ 1 array:string:mail 2 method return time=1528091855.672691 sender=:1.2787 -> destination=:1.2795 serial=13 reply_serial=2 array [ dict entry( string "mail" variant array [ string "username@example.com" ] ) ]
- LDAP ユーザーとしての VM へのログインを試行し、LDAP 認証情報を使用してログインできることを確認します。ログインにはローカルコンソールまたは SSH などのリモートサービスを使用できます。
デフォルトで、すべてのユーザーは LDAP 認証情報を使用してリモート Basic 認証サーバーにログインできます。この動作は変更することができます。
- IPA に参加するシステムを使用する場合、ホストベースのアクセス制御を設定します。
- Active Directory に参加するシステムを使用する場合には、グループポリシーオブジェクトを使用します。
- その他のケースについては、SSSD 設定 についてのドキュメントを参照してください。
14.4. Apache での SSSD の使用の設定
以下の内容を含む /etc/pam.d/openshift ファイルを作成します。
auth required pam_sss.so account required pam_sss.so
この設定により、認証要求が openshift スタックに対して発行された時に PAM (プラグ可能な認証モジュール) は pam_sss.so を使用して認証とアクセス制御を決定できるようになります。
/etc/httpd/conf.modules.d/55-authnz_pam.conf ファイルを編集して、以下の行のコメントを解除します。
LoadModule authnz_pam_module modules/mod_authnz_pam.so
Apache httpd.conf ファイルをリモート基本認証用に設定するには、openshift-remote-basic-auth.conf ファイルを /etc/httpd/conf.d ディレクトリーに作成します。以下のテンプレートを使用して必要な設定および値を指定します。
重要テンプレートの詳細を確認し、その内容を環境に合うようにカスタマイズします。
LoadModule request_module modules/mod_request.so LoadModule php7_module modules/libphp7.so # Nothing needs to be served over HTTP. This virtual host simply redirects to # HTTPS. <VirtualHost *:80> DocumentRoot /var/www/html RewriteEngine On RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L] </VirtualHost> <VirtualHost *:443> # This needs to match the certificates you generated. See the CN and X509v3 # Subject Alternative Name in the output of: # openssl x509 -text -in /etc/pki/tls/certs/remote-basic.example.com.crt ServerName remote-basic.example.com DocumentRoot /var/www/html # Secure all connections with TLS SSLEngine on SSLCertificateFile /etc/pki/tls/certs/remote-basic.example.com.crt SSLCertificateKeyFile /etc/pki/tls/private/remote-basic.example.com.key SSLCACertificateFile /etc/pki/CA/certs/ca.crt # Require that TLS clients provide a valid certificate SSLVerifyClient require SSLVerifyDepth 10 # Other SSL options that may be useful # SSLCertificateChainFile ... # SSLCARevocationFile ... # Send logs to a specific location to make them easier to find ErrorLog logs/remote_basic_error_log TransferLog logs/remote_basic_access_log LogLevel warn # PHP script that turns the Apache REMOTE_USER env var # into a JSON formatted response that OpenShift understands <Location /check_user.php> # all requests not using SSL are denied SSLRequireSSL # denies access when SSLRequireSSL is applied SSLOptions +StrictRequire # Require both a valid basic auth user (so REMOTE_USER is always set) # and that the CN of the TLS client matches that of the OpenShift master <RequireAll> Require valid-user Require expr %{SSL_CLIENT_S_DN_CN} == 'system:openshift-master' </RequireAll> # Use basic auth since OpenShift will call this endpoint with a basic challenge AuthType Basic AuthName openshift AuthBasicProvider PAM AuthPAMService openshift # Store attributes in environment variables. Specify the email attribute that # you confirmed. LookupOutput Env LookupUserAttr mail REMOTE_USER_MAIL LookupUserGECOS REMOTE_USER_DISPLAY_NAME # Other options that might be useful # While REMOTE_USER is used as the sub field and serves as the immutable ID, # REMOTE_USER_PREFERRED_USERNAME could be used to have a different username # LookupUserAttr <attr_name> REMOTE_USER_PREFERRED_USERNAME # Group support may be added in a future release # LookupUserGroupsIter REMOTE_USER_GROUP </Location> # Deny everything else <Location ~ "^((?!\/check_user\.php).)*$"> Deny from all </Location> </VirtualHost>
check_user.php スクリプトを /var/www/html ディレクトリーに作成します。以下のコードを組み込みます。
<?php // Get the user based on the Apache var, this should always be // set because we 'Require valid-user' in the configuration $user = apache_getenv('REMOTE_USER'); // However, we assume it may not be set and // build an error response by default $data = array( 'error' => 'remote PAM authentication failed' ); // Build a success response if we have a user if (!empty($user)) { $data = array( 'sub' => $user ); // Map of optional environment variables to optional JSON fields $env_map = array( 'REMOTE_USER_MAIL' => 'email', 'REMOTE_USER_DISPLAY_NAME' => 'name', 'REMOTE_USER_PREFERRED_USERNAME' => 'preferred_username' ); // Add all non-empty environment variables to JSON data foreach ($env_map as $env_name => $json_name) { $env_data = apache_getenv($env_name); if (!empty($env_data)) { $data[$json_name] = $env_data; } } } // We always output JSON from this script header('Content-Type: application/json', true); // Write the response as JSON echo json_encode($data); ?>
Apache がモジュールを読み込めるようにします。/etc/httpd/conf.modules.d/55-lookup_identity.conf ファイルを変更し、以下の行のコメントを解除します。
LoadModule lookup_identity_module modules/mod_lookup_identity.so
SELinux ブール値を設定し、SElinux が Apache が D-BUS を介して SSSD に接続することを許可するようにします。
# setsebool -P httpd_dbus_sssd on
SELinux に Apache による PAM サブシステムへの問い合わせを受け入れることを指示するブール値を設定します。
# setsebool -P allow_httpd_mod_auth_pam on
Apache を起動します。
# systemctl start httpd.service
14.5. OpenShift Container Platform が SSSD を基本リモート認証サーバーとして使用する設定
作成した新規のアイデンティティープロバイダーのデフォルト設定を変更します。Ansible ホストインベンリーファイルに一覧表示される最初のマスターホストで以下の手順を実行します。
- /etc/origin/master/master-config.yaml ファイルを開きます。
identityProviders セクションの場所を見つけ、これを以下のコードに置き換えます。
identityProviders: - name: sssd challenge: true login: true mappingMethod: claim provider: apiVersion: v1 kind: BasicAuthPasswordIdentityProvider url: https://remote-basic.example.com/check_user.php ca: /etc/origin/master/ca.crt certFile: /etc/origin/master/openshift-master.crt keyFile: /etc/origin/master/openshift-master.key
更新された設定を使って OpenShift Container Platform を起動します。
# openshift start \ --public-master=https://openshift.example.com:8443 \ --master-config=/etc/origin/master/master-config.yaml \ --node-config=/etc/origin/node-node1.example.com/node-config.yaml
oc
CLI を使用してログインをテストします。oc login https://openshift.example.com:8443
有効な LDAP 認証情報のみを使用してログインすることができます。
アイデンティティーを一覧表示し、各ユーザー名のメールアドレスが表示されていることを確認します。以下のコマンドを実行します。
$ oc get identity -o yaml
第15章 SDN の設定
15.1. 概要
OpenShift SDN は、OpenShift Container Platform クラスターでの Pod 間の通信を有効にして Pod ネットワークを構築します。現在利用可能な SDN プラグイン は 3 種類 (ovs-subnet、ovs-multitenant、ovs-networkpolicy) あり、これらは Pod ネットワークを設定するためのそれぞれ異なる方法を提供します。
15.2. 利用可能な SDN プロバイダー
アップストリームの Kubernetes プロジェクトはデフォルトのネットワークソリューションを備えていません。その代わりに、Kubernetes では Container Network Interface (CNI) を開発し、ネットワークプロバイダーが独自の SDN ソリューションを統合することを可能にしています。
Red Hat は、サードパーティーのプラグインのほかにも追加設定なしで使用できるいくつかの OpenShift SDN プラグインを提供しています。
Red Hat は数多くの SDN プロバイダーと協力し、Kubernetes CNI インターフェースを使用した OpenShift Container Platform 上での SDN ネットワークソリューション (これには、製品のエンタイトルメントプロセスでの SDN プラグインのサポートプロセスが含まれます) の認定を行っています。Red Hat は、ユーザーが OpenShift でサポートケースを作成される場合、両社が共にユーザーのニーズに対応できるよう交換プロセスを促進し、これを容易にできます。
以下は、サードパーティーのベンダーが OpenShift Container Platform で直接検証を行い、サポートしている SDN ソリューションです。
- Cisco Contiv (™)
- Juniper Contrail (™)
- Nokia Nuage (™)
- Tigera Calico (™)
- VMware NSX-T (™)
VMware NSX-T (™) の OpenShift Container Platform へのインストール
VMware NSX-T (™) は、クラウドネイティブなアプリケーション環境を構築するための SDN およびセキュリティー基盤を提供しています。これらの環境には、vSphere Hypervisors (ESX) のほかに KVM とネイティブなパブリッククラウドが含まれます。
現在の統合には、NSX-T と OpenShift Container Platform の両方の新規インストールが必要です。現時点で、NSX-T バージョン 2.1 がサポートされ、これは ESX と KVM のハイパーバイザーの使用のみに対応しています。
詳細は「NSX-T Container Plug-in for OpenShift - Installation and Administration Guide」を参照してください。
15.3. Ansible を使用した Pod ネットワークの設定
初回の通常インストール (Advanced installation) では、ovs-subnet プラグインはデフォルトでインストールされ、設定されますが、このプラグインは、os_sdn_network_plugin_name
パラメーターを使ってインストール時に上書きできます。これは Ansible インベントリーファイルで設定できます。
たとえば、標準の ovs-subnet プラグインを上書きし、代わりに ovs-multitenant プラグインを使用するには、以下を実行します。
# Configure the multi-tenant SDN plugin (default is 'redhat/openshift-ovs-subnet') os_sdn_network_plugin_name='redhat/openshift-ovs-multitenant'
インベントリーファイルに設定できるネットワーキング関連の Ansible 変数の詳細については、「クラスター変数の設定」を参照してください。
初回のクイックインストールでも、ovs-subnet プラグインは同様にデフォルトでインストールされ、設定され、master-config.yaml ファイルの networkConfig
スタンザを使って、インストール後に再設定することができます。
15.4. マスターでの Pod ネットワークの設定
クラスター管理者は、マスター設定ファイル (デフォルトの場所は /etc/origin/master/master-config.yaml) の networkConfig
セクションにあるパラメーターを変更することで、マスターホスト上で Pod ネットワーク設定を管理できます。
単一 CIDR の Pod ネットワーク設定
networkConfig: clusterNetworks: - cidr: 10.128.0.0/14 1 hostSubnetLength: 9 2 networkPluginName: "redhat/openshift-ovs-subnet" 3 serviceNetworkCIDR: 172.30.0.0/16 4
また、複数の CIDR 範囲を持つ Pod ネットワークを作成することもできます。これは、個別の範囲をその範囲と hostSubnetLength
を指定した clusterNetworks
フィールドに追加して実行できます。
複数の範囲は同時に使用することができ、この範囲は拡張または縮小することが可能です。ノードは、ノードの退避、削除および再作成によってある範囲から別の範囲に移動できます。詳細は、「ノードの管理」セクションを参照してください。ノードの割り当ては一覧の順序で行われ、範囲が一杯になると以下の一覧に移行します。
複数 CIDR の Pod ネットワークの設定
networkConfig: clusterNetworks: - cidr: 10.128.0.0/14 1 hostSubnetLength: 9 2 - cidr: 10.132.0.0/14 hostSubnetLength: 9 externalIPNetworkCIDRs: null hostSubnetLength: 9 ingressIPNetworkCIDR: 172.29.0.0/16 networkPluginName: redhat/openshift-ovs-multitenant 3 serviceNetworkCIDR: 172.30.0.0/16
clusterNetworks
値に要素を追加するか、その CIDR 範囲を使用しているノードがなければ要素を削除することができます。ただし変更を有効にするために、必ず atomic-openshift-master-api
および atomic-openshift-master-controllers
のサービスを再起動してください。
hostSubnetLength
の値は、クラスターの初回作成後に変更することができません。cidr
は、ノードが範囲内に割り当てられている場合に最初のネットワークが含まれるより大きいネットワークに変更することのみ可能です。また、serviceNetworkCIDR
は拡張可能です。たとえば、デフォルト値が 10.128.0.0/14 の場合、cidr
を 10.128.0.0/9 (上半分の net 10 を参照) に変更することは可能ですが、10.64.0.0/16 には元の値と重複しないために変更することができません。
serviceNetworkCIDR
は 172.30.0.0/16 から 172.30.0.0/15 に変更できますが、172.28.0.0/14 に変更できません。元の範囲が新規の範囲内にある場合でも、その範囲が CIDR の開始部分になければならないためです。
15.5. ノードでの Pod ネットワークの設定
クラスター管理者は、ノード設定ファイル (デフォルトの場所は /etc/origin/node/node-config.yaml ) の networkConfig
セクションにあるパラメーターを変更することで、ノード上に設定される Pod ネットワークを制御できます。
networkConfig: mtu: 1450 1 networkPluginName: "redhat/openshift-ovs-subnet" 2
OpenShift Container Platform SDN を構成するすべてのマスターおよび ノードで MTU サイズを変更する必要があります。また、tun0 インターフェースの MTU サイズはクラスターを構成するすべてのノードで同一である必要があります。
15.6. SDN プラグイン間の移行
SDN プラグインをすでに 1 つ使用していて、別のプラグインへ切り替える場合には、以下を実行します。
-
設定ファイル内のすべてのマスターとノードで
networkPluginName
パラメーターを変更します。 - すべてのマスターで atomic-openshift-master-api および atomic-openshift-master-controllers サービスを再起動します。
- すべてのマスターおよびノードで atomic-origin-node サービスを停止します。
- OpenShift SDN プラグインを切り換える場合、すべてのマスターおよびノードで openvswitch サービスを再起動します。
- すべてのマスターおよびノードで atomic-openshift-node サービスを停止します。
- OpenShift SDN プラグインからサードパーティーのプラグインへ切り替える場合は、OpenShift SDN 固有のアーティファクトを消去します。
$ oc delete clusternetwork --all $ oc delete hostsubnets --all $ oc delete netnamespaces --all
ovs-subnet から ovs-multitenant OpenShift SDN プラグインに切り替えると、クラスター内の既存のすべてのプロジェクトが完全に分離します (つまり、これらに固有の VNID が割り当てられます)。クラスター管理者は、管理者 CLI を使用してプロジェクトネットワークの変更を選択できます。
以下を実行して VNID をチェックします。
$ oc get netnamespace
15.6.1. ovs-multitenant から ovs-networkpolicy への移行
「SDN プラグイン間の移行」セクションでの上記の一般的なプラグインの移行に加え、ovs-multitenant プラグインから ovs-networkpolicy プラグインへの移行にはもう 1 つの追加の手順があります。つまり、すべての namespace に NetID
があることを確認する必要があります。これは、以前にプロジェクトを結合している場合や、プロジェクトをグローバルにしている場合に、ovs-networkpolicy プラグインに切り換える前にこのやり直しを実行する必要があります。そうしない場合には、NetworkPolicy オブジェクトが適切に機能しなくなる可能性があります。
ヘルパースクリプトを使うと、NetID’s
の修正、以前に分離した namespace を分離するための NetworkPolicy オブジェクトの作成、および以前に結合した namespace 間の接続の有効化を実行できます。
ovs-multitenant プラグインを実行した状態でヘルパースクリプトを使用して ovs-networkpolicy プラグインを移行するには、以下の手順に従ってください。
スクリプトをダウンロードし、実行ファイルパーミッションを追加します。
$ curl -O https://raw.githubusercontent.com/openshift/origin/master/contrib/migration/migrate-network-policy.sh $ chmod a+x migrate-network-policy.sh
スクリプトを実行します (クラスター管理者ロールが必要です)。
$ ./migrate-network-policy.sh
このスクリプトを実行すると、すべての namespace が他のすべての namespace から完全に分離されるので、ovs-networkpolicy プラグインへの移行が完了するまでは、異なる namespace にある Pod 間で接続を試行してもこれに失敗します。
新たに作成した namespace に同じポリシーをデフォルトで適用したい場合には、移行スクリプトで作成した default-deny
および allow-from-global-namespaces
ポリシーと一致する デフォルトの NetworkPolicy オブジェクトが作成されるように設定します。
スクリプトが失敗するか他のエラーが発生した場合、または ovs-multitenant プラグインに戻したい場合は、移行取り消し (un-migration) スクリプトを使用します。このスクリプトは移行スクリプトが実行した変更を取り消し、以前に結合した namespace を再度結合します。
15.7. クラスターネットワークへの外部アクセス
OpenShift Container Platform の外部にあるホストがクラスターネットワークへのアクセスを要求した場合、ユーザーには 2 つの選択肢があります。
- ホストを OpenShift Container Platform ノードとして設定する。ただし、これには スケジュール対象外 (unschedulable)のマークを付け、マスターがこれにコンテナーをスケジュールできないようにします。
- ユーザーのホストとクラスターネットワーク上のホストの間にトンネルを作成する。
上記のオプションはどちらも OpenShift SDN 内での edge ロードバランサーからコンテナーへのルーティングを設定するための実践的ユースケースの一部として本ドキュメントで紹介されています。
15.8. Flannel の使用
デフォルトの SDN の代わりとして、OpenShift Container Platform は、flannel ベースのネットワークをインストールするための Ansible Playbook を提供しています。これは、SDN に依存しているクラウドプロバイダーのプラットフォーム (Red Hat OpenStack Platform など) で OpenShift Container Platform を実行していて、両方のプラットフォームでパケットのカプセル化を 2 回実行することを避けたい場合に役立ちます。
Flannel は、すべてのコンテナーに単一の IP ネットワーク空間を使用し、隣接する空間のサブセットを各インスタンスに割り当てることを可能にします。これにより、コンテナーは何にも妨げられずに同じネットワーク空間内の任意の IP へ接続を試みることができます。これはネットワークを使ってアプリケーション内にあるコンテナーを別のアプリケーションから分離することができないために、マルチテナンシーを妨げます。
マルチテナンシーの分離とパフォーマンスのどちらを優先するかに応じて、内部ネットワークに OpenShift SDN (マルチテナンシー) と Flannel (パフォーマンス) のいずれか適切な方を選択する必要があります。
Flannel は、Red Hat OpenStack Platform の OpenShift Container Platform のみでサポートされています。
Neutron の現行バージョンはデフォルトで、各ポートに対するポートセキュリティーが有効になっているので、ポート自体のアドレスと異なる MAC アドレスを使ったパケットの送受信を実行できません。Flannel は、仮想の MAC アドレスと IP アドレスを作成し、パケットをポート上で送受信する必要があります。したがって、Flannel のトラフィックを実行するポートでは、ポートセキュリティーを無効にしておく必要があります。
OpenShift Container Platform クラスターで Flannel を無効にするには、以下を実行します。
Neutron のポートセキュリティーコントロールは、Flannel と互換性を持つように設定される必要があります。Red Hat OpenStack Platform のデフォルト設定では、
port_security
のユーザーコントロールは無効にされています。Neutron を、ユーザーが個々のポートでport_security
設定を制御できるように設定します。Neutron サーバーで、以下を /etc/neutron/plugins/ml2/ml2_conf.ini ファイルに追加します。
[ml2] ... extension_drivers = port_security
次に、Neutron のサービスを再起動します。
service neutron-dhcp-agent restart service neutron-ovs-cleanup restart service neutron-metadata-agentrestart service neutron-l3-agent restart service neutron-plugin-openvswitch-agent restart service neutron-vpn-agent restart service neutron-server restart
Red Hat OpenStack Platform で OpenShift Container Platform インスタンスが作成されている間に、ポートのポートセキュリティーとセキュリティーグループの両方を無効にします。ここで、コンテナーネットワークの Flannel インターフェースは以下のようになります。
neutron port-update $port --no-security-groups --port-security-enabled=False
注記Flannel は、ノードのサブネットを設定し、割り当てるために etcd からの情報を収集します。したがって、etcd ホストに割り当てられるセキュリティーグループは、ノードからポート 2379/tcp へのアクセスを許可し、ノードのセキュリティーグループは etcd ホストでのそのポートへの egress 通信を許可する必要があります。
インストールを実行する前に以下の変数を Ansible インベントリーファイルに設定します。
openshift_use_openshift_sdn=false 1 openshift_use_flannel=true 2 flannel_interface=eth0
オプションで、
flannel_interface
変数を使用してホスト間の通信に使用するインターフェースを指定することができます。この変数がない場合は、OpenShift Container Platform インストールではデフォルトのインターフェースが使用されます。注記Flannel を使用した Pod とサービスのカスタムのネットワーク CIDR は、今後のリリースでサポートされる予定です。BZ#1473858
OpenShift Container Platform をインストールした後、iptables の一連のルールを各 OpenShift Container Platform ノードに追加します。
iptables -A DOCKER -p all -j ACCEPT iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
これらの変更を /etc/sysconfig/iptables で永続化するには、すべてのノードで以下のコマンドを使用します。
cp /etc/sysconfig/iptables{,.orig} sh -c "tac /etc/sysconfig/iptables.orig | sed -e '0,/:DOCKER -/ s/:DOCKER -/:DOCKER ACCEPT/' | awk '"\!"p && /POSTROUTING/{print \"-A POSTROUTING -o eth1 -j MASQUERADE\"; p=1} 1' | tac > /etc/sysconfig/iptables"
注記iptables-save
コマンドは、現在の インメモリー の iptables ルールをすべて保存します。ただし、Docker、Kubernetes、OpenShift Container Platform では永続化することが意図されていない iptables ルール (サービスなど) が多数作成されるために、これらのルールを保存すると問題が発生する可能性があります。
コンテナーのトラフィックを OpenShift Container Platform の残りのトラフィックから分離するには、分離されたテナントネットワークを作成し、すべてのノードをこれに割り当てることを推奨します。異なるネットワークインターフェース (eth1) を使用している場合は、インターフェースをブート時に /etc/sysconfig/network-scripts/ifcfg-eth1 ファイルを使用して起動するように設定してください。
DEVICE=eth1 TYPE=Ethernet BOOTPROTO=dhcp ONBOOT=yes DEFTROUTE=no PEERDNS=no
第16章 Nuage SDN の設定
16.1. Nuage SDN と OpenShift Container Platform
Nuage Networks Virtualized Services Platform (VSP) は、仮想ネットワークとソフトウェアによるネットワーク制御 (SDN) インフラストラクチャーを Docker コンテナー環境に提供し、IT 運用を単純化して OpenShift Container Platform のネイティブなネットワーク機能を拡張します。
Nuage Networks VSP は、OpenShift Container Platform で実行される Docker ベースのアプリケーションに対応し、Pod と従来のワークロード間の仮想ネットワークのプロビジョニングを加速化し、セキュリティーポリシーをクラウドインフラストラクチャー全体で有効にします。また、セキュリティーアプライアンスによる、コンテナーアプリケーション用の詳細なセキュリティーとマイクロセグメンテーションポリシーの組み込みを自動化します。
VSP を OpenShift Container Platform のアプリケーションワークフローに統合することにより、DevOps チームが直面するネットワークのラグを取り除き、ビジネスアプリケーションのより迅速な調整と更新を可能にします。また、VSP は OpenShift Container Platform のさまざまなワークフローに対応し、ユーザーがポリシーベースの自動化によって使いやすさと完全な制御のいずれかを選択できる各種シナリオに対応します。
VSP を OpenShift Container Platform に統合する方法についての詳細は、「Networking」を参照してください。
16.2. 開発者のワークフロー
ワークフローは開発者環境で使用され、ネットワークのセットアップ時に開発者のインプットはほとんど必要ありません。ここでは nuage-openshift-monitor は、OpenShift Container Platform プロジェクトで作成される Pod の適切なポリシーとネットワークを提供するために必要な、VSP 構成 (ゾーン、サブネットなど) を作成します。プロジェクトが作成されると、nuage-openshift-monitor がそのプロジェクトのデフォルトのゾーンとデフォルトのサブネットを作成します。指定のプロジェクトに作成されたデフォルトのサブネットが使い果たされると、nuage-openshift-monitor が追加のサブネットを動的に作成します。
プロジェクト間の分離を確保するため、各 OpenShift Container Platform プロジェクトに個別の VSP ゾーンが作成されます。
16.3. オペレーションワークフロー
このワークフローは、アプリケーションをロールアウトするオペレーションチームが使用します。このワークフローでは、まずネットワークとセキュリティーポリシーが、アプリケーションをデプロイするために組織が規定するルールに従って VSD に設定されます。管理ユーザーは、複数のゾーンとサブネットを作成し、ラベルを使ってそれらを同じプロジェクトにマップすることがあります。Pod をスピンアップする一方で、ユーザーは、Pod が接続すべきネットワークと、ポリシーが適用されるべきネットワークを Nuage Label を使って指定します。これにより、デプロイメントでプロジェクト間およびプロジェクト内のトラフィックを詳細に制御できます。たとえば、プロジェクト間の通信はプロジェクトベースで有効にされますが、この方法は、プロジェクトを共有プロジェクトにデプロイされている共通サービスに接続するために使用できます。
16.4. インストール
VSP と OpenShift Container Platform の統合は、仮想マシン (VM) とベアメタルの OpenShift Container Platform インストールの両方で機能します。
高可用性 (HA) を備えた環境は、複数マスターと複数ノードを使って設定することができます。
マルチマスターモードによる Nuage VSP 統合は、このセクションで説明するネイティブの HA 設定方法のみに対応しています。この統合は、負荷分散ソリューション (デフォルトは HAProxy) と組み合わせることもできます。インベントリーファイルには、3 つのマスターホスト、ノード、etcd サーバー、およびすべてのマスターホスト上でマスター API の負荷を分散するための HAProxy として機能するホストが含まれます。HAProxy ホストはインベントリーファイルの [lb] セクションに定義され、Ansible が HAProxy を負荷分散ソリューションとして自動的にインストールし、設定することを可能にします。
Ansible ノードファイルでは、Nuage VSP をネットワークプラグインとしてセットアップするために、以下のパラーメーターを指定する必要があります。
# Create and OSEv3 group that contains masters, nodes, load-balancers, and etcd hosts masters nodes etcd lb # Nuage specific parameters openshift_use_openshift_sdn=False openshift_use_nuage=True os_sdn_network_plugin_name='nuage/vsp-openshift' openshift_node_proxy_mode='userspace' # VSP related parameters vsd_api_url=https://192.168.103.200:8443 vsp_version=v4_0 enterprise=nuage domain=openshift vsc_active_ip=192.168.103.201 vsc_standby_ip=192.168.103.202 uplink_interface=eth0 # rpm locations nuage_openshift_rpm=http://location_of_rpm_server/openshift/RPMS/x86_64/nuage-openshift-monitor-4.0.X.1830.el7.centos.x86_64.rpm vrs_rpm=http://location_of_rpm_server/openshift/RPMS/x86_64/nuage-openvswitch-4.0.X.225.el7.x86_64.rpm plugin_rpm=http://location_of_rpm_server/openshift/RPMS/x86_64/vsp-openshift-4.0.X1830.el7.centos.x86_64.rpm # Required for Nuage Monitor REST server and HA openshift_master_cluster_method=native openshift_master_cluster_hostname=lb.nuageopenshift.com openshift_master_cluster_public_hostname=lb.nuageopenshift.com nuage_openshift_monitor_rest_server_port=9443 # Optional parameters nuage_interface_mtu=1460 nuage_master_adminusername='admin's user-name' nuage_master_adminuserpasswd='admin's password' nuage_master_cspadminpasswd='csp admin password' nuage_openshift_monitor_log_dir=/var/log/nuage-openshift-monitor # Required for brownfield install (where a {product-title} cluster exists without Nuage as the networking plugin) nuage_dockker_bridge=lbr0 # Specify master hosts [masters] fqdn_of_master_1 fqdn_of_master_2 fqdn_of_master_3 # Specify load balancer host [lb] fqdn_of_load_balancer
第17章 Amazon Web サービス (AWS) の設定
17.1. 概要
OpenShift Container Platform は、AWS ボリュームをアプリケーションデータの永続ストレージとして使用するなど、AWS EC2 インフラストラクチャーにアクセスできるように設定できます。これを実行するには、AWS を設定した後に OpenShift Container Platform ホストで追加の設定を行う必要があります。
17.2. パーミッション
OpenShift Container Platform で AWS を設定するには以下のパーミッションが必要です。
Elastic Compute Cloud(EC2) |
|
Elastic Load Balancing |
|
Elastic Compute Cloud(EC2) |
|
-
マスターホスト、ノードホスト、サブネットにはすべて、
kubernetes.io/cluster/<clusterid>,Value=(owned|shared)
のタグが必要です。 1 つのセキュリティーグループ (ノードにリンクされていることが望ましい) に
kubernetes.io/cluster/<clusterid>,Value=(owned|shared)
タグが必要です。-
すべてのセキュリティーグループに
kubernetes.io/cluster/<clusterid>,Value=(owned|shared)
のタグを付けないでください。その場合、Elastic Load Balancing (ELB) がロードバランサーを作成できなくなります。
-
すべてのセキュリティーグループに
17.3. セキュリティーグループの設定
AWS に OpenShift Container Platform をインストールする際は、適切なセキュリティーグループがセットアップされていることを確認してください。
セキュリティーグループにはいくつかのポートを設定しておく必要があり、それらがないとインストールは失敗します。また、インストールしようとしているクラスターの設定によっては、追加のポートが必要になる場合があります。セキュリティーグループの詳細、およびその適切な調整方法については、「必要なポート」を参照してください。
すべての OpenShift Container Platform ホスト |
|
etcd セキュリティーグループ |
|
マスターのセキュリティーグループ |
|
ノードのセキュリティーグループ |
|
インフラストラクチャーノード (OpenShift Container Platform ルーターをホストできるノード) |
|
CRI-O |
CRI-O を使用している場合は、tcp/10010 を開き、 |
マスターまたはルートの負荷分散のために外部のロードバランサー (ELB) を設定する場合は、ELB の Ingress および Egress のセキュリティーグループを設定することも必要になります。
17.3.1. 検出された IP アドレスとホスト名の上書き
AWS では、以下のような場合に変数の上書きが必要になります。
変数 | 使用法 |
---|---|
|
ユーザーが |
|
複数のネットワークインターフェースを設定しており、デフォルト以外のインターフェースを使用することを検討している。ユーザーは |
|
|
|
|
openshift_hostname
がメタデータで提供される private-dns-name
値以外の値に設定される場合、それらのプロバイダーのネイティブクラウド統合は機能しなくなります。
EC2 ホストの場合にはとくに、DNS host names
と DNS resolution
の両方が有効にされている VPC にデプロイされる必要があります。openshift_hostname
は上書きできません。
17.4. AWS 変数の設定
必要な AWS 変数を設定するには、OpenShift Container Platform のマスターとノード両方のすべてのホストに、/etc/origin/cloudprovider/aws.confファイルを以下の内容で作成します。
[Global]
Zone = us-east-1c 1
- 1
- これは AWS インスタンスのアベイラビリティーゾーンであり、EBS ボリュームがある場所です。この情報は AWS マネジメントコンソールから取得されます。
17.5. OpenShift Container Platform での AWS の設定
AWS は OpenShift Container Platform に 2 通りの方法で設定できます。
17.5.1. Ansible を使用した AWS についての OpenShift Container Platform の設定
AWS は、通常インストール (Advanced installation) の実行中に、openshift_cloudprovider_aws_access_key
、openshift_cloudprovider_aws_secret_key
、openshift_cloudprovider_kind
、openshift_clusterid
の各パラメーターを使って設定することができます。これらはインベントリーファイルで設定できます。
Ansible を使用した AWS の設定例
# Cloud Provider Configuration # # Note: You may make use of environment variables rather than store # sensitive configuration within the ansible inventory. # For example: #openshift_cloudprovider_aws_access_key="{{ lookup('env','AWS_ACCESS_KEY_ID') }}" #openshift_cloudprovider_aws_secret_key="{{ lookup('env','AWS_SECRET_ACCESS_KEY') }}" # #openshift_clusterid=unique_identifier_per_availablility_zone # # AWS (Using API Credentials) #openshift_cloudprovider_kind=aws #openshift_cloudprovider_aws_access_key=aws_access_key_id #openshift_cloudprovider_aws_secret_key=aws_secret_access_key # # AWS (Using IAM Profiles) #openshift_cloudprovider_kind=aws # Note: IAM roles must exist before launching the instances.
Ansible が AWS を設定する際に、必要な変更が以下のファイルに自動的に実行されます。
- /etc/origin/cloudprovider/aws.conf
- /etc/origin/master/master-config.yaml
- /etc/origin/node/node-config.yaml
- /etc/sysconfig/atomic-openshift-master-api
- /etc/sysconfig/atomic-openshift-master-controllers
- /etc/sysconfig/atomic-openshift-node
17.5.2. 手動による AWS についての OpenShift Container Platform マスターの設定
すべてのマスターでマスター設定ファイル (デフォルトは /etc/origin/master/master-config.yaml) を編集するか、または作成し、apiServerArguments
と controllerArguments
の各セクションの内容を更新します。
kubernetesMasterConfig: ... apiServerArguments: cloud-provider: - "aws" cloud-config: - "/etc/origin/cloudprovider/aws.conf" controllerArguments: cloud-provider: - "aws" cloud-config: - "/etc/origin/cloudprovider/aws.conf"
現時点では、クラウドプロバイダーの統合を正常に機能させるため、nodeName
は AWS のインスタンス名と一致している必要があります。また、この名前は RFC1123 に準拠している必要もあります。
コンテナー化インストールをトリガーする場合、/etc/origin と /var/lib/origin のディレクトリーのみがマスターとノードのコンテナーにマウントされます。したがって、aws.conf は /etc/ ではなく /etc/origin/ になければなりません。
17.5.3. 手動による AWS についての OpenShift Container Platform ノードの設定
すべてのノードでノード設定ファイル (デフォルトは /etc/origin/node/node-config.yaml) を編集するか、または作成し、kubeletArguments
セクションの内容を更新します。
kubeletArguments: cloud-provider: - "aws" cloud-config: - "/etc/origin/cloudprovider/aws.conf"
コンテナー化インストールをトリガーする場合、/etc/origin と /var/lib/origin のディレクトリーのみがマスターとノードのコンテナーにマウントされます。したがって、aws.conf は /etc/ ではなく /etc/origin/ になければなりません。
17.5.4. キーと値のアクセスペアの手動設定
以下の環境変数が、マスターの /etc/sysconfig/atomic-openshift-master-api ファイルと /etc/sysconfig/atomic-openshift-master-controllers ファイル、およびノードの /etc/sysconfig/atomic-openshift-node ファイルに設定されていることを確認します。
AWS_ACCESS_KEY_ID=<key_ID> AWS_SECRET_ACCESS_KEY=<secret_key>
アクセスキーは、AWS IAM ユーザーを設定する際に取得されます。
17.6. 設定変更の適用
マスターおよびノードのすべてのホストで OpenShift Container Platform サービスを起動または再起動し、設定の変更を適用します。「OpenShift Container Platform サービスの再起動」を参照してください。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers # systemctl restart atomic-openshift-node
クラウドプロバイダーを不使用から使用に切り替えるとエラーメッセージが表示されます。クラウドプロバイダーを追加すると、ノードが hostname を externalID
として使用する (クラウドプロバイダーが使用されていなかった場合のケース) 代わりに、クラウドプロバイダーの instance-id
(クラウドプロバイダーによって指定される) の使用に切り替えるため、ノードの削除が試みられます。この問題を解決するには、以下を実行します。
- CLI にクラスター管理者としてログインします。
既存のノードラベルをチェックし、これらをバックアップします。
$ oc describe node <node_name> | grep -Poz '(?s)Labels.*\n.*(?=Taints)'
ノードを削除します。
$ oc delete node <node_name>
各ノードホストで OpenShift Container Platform サービスを再起動します。
# systemctl restart atomic-openshift-node
- 以前に使用していた各ノードのラベルを再度追加します。
17.7. クラスターに対する AWS のラベリング
OpenShift Container Platform バージョン 3.7 以降の atomic-openshift-installer
では、AWS プロバイダー認証情報を設定している場合に、すべてのホストにラベルが付けられていることを確認することも必要になります。
クラスターに関連付けられているリソースを正確に特定するには、キー kubernetes.io/cluster/<clusterid>
でリソースにタグを付けます。
-
<clusterid>
はクラスターに固有の名前です。
該当の値を、ノードがこのクラスターだけに所属する場合には owned
に、また、他のシステムとリソースが共有されている場合には shared
に設定します。
すべてのリソースに kubernetes.io/cluster/<clusterid>,Value=(owned|shared)
タグを付けることで、複数ゾーンまたは複数クラスターに関連する潜在的な問題を回避できます。
OpenShift Container Platform 3.6 よりも前のバージョンでは、これは Key=KubernetesCluster,Value=clusterid
でした。
OpenShift Container Platform へのラベル付けとタグ付けに関する詳細は、「Pods and Services」を参照してください。
17.7.1. タグを必要とするリソース
タグ付けが必要なリソースは以下の 4 種類です。
- インスタンス
- セキュリティーグループ
- ロードバランサー
- EBS ボリューム
17.7.2. 既存クラスターへのタグ付け
クラスターは kubernetes.io/cluster/<clusterid>,Value=(owned|shared)
タグの値を使用して、AWS クラスターに所属するリソースを判断します。したがって、関連のリソースはすべて、そのキーの同じ値を使用して kubernetes.io/cluster/<clusterid>,Value=(owned|shared)
タグでラベルを付ける必要があります。これらのリソースには以下が含まれます。
- 全ホスト
- AWS インスタンスで使用する関連のロードバランサーすべて
EBS ボリュームすべて。タグ付けが必要な EBS ボリュームは以下を使用して見つけることができます。
$ oc get pv -o json|jq '.items[].spec.awsElasticBlockStore.volumeID'
AWS インスタンスで使用する関連のセキュリティーグループすべて
注記すべての既存セキュリティーグループに
kubernetes.io/cluster/<name>,Value=<clusterid>
のタグを付けないでください。その場合、Elastic Load Balancing (ELB) がロードバランサーを作成できなくなります。
リソースにタグを付けた後に、マスターサービスをマスター上で、ノードサービスをすべてのノード上で再起動します。「設定変更の適用」を参照してください。
第18章 OpenStack の設定
18.1. 概要
OpenShift Container Platform は、OpenStack にデプロイする際に、OpenStack Cinder ボリュームをアプリケーションデータの永続ストレージとして使用など、OpenStack インフラストラクチャーにアクセスするように設定できます。
18.2. パーミッション
OpenShift Container Platform に OpenStack を設定するには、以下のロールが必要です。
member |
アセット (インスタンス、ネットワーキングポート、Floating IP、ボリュームなど) を作成するために、テナント member ロールが必要になります。 |
18.3. セキュリティーグループの設定
OpenStack に OpenShift Container Platform を インストールする際は、適切なセキュリティーグループがセットアップされていることを確認します。
セキュリティーグループにはいくつかのポートを設定しておく必要があり、それらがないとインストールは失敗します。また、インストールしようとしているクラスターの設定によっては、追加のポートが必要になる場合があります。セキュリティーグループの詳細、およびその適切な調整方法については、「必要なポート」を参照してください。
すべての OpenShift Container Platform ホスト |
|
etcd セキュリティーグループ |
|
マスターのセキュリティーグループ |
|
ノードのセキュリティーグループ |
|
インフラストラクチャーノード (OpenShift Container Platform ルーターをホストできるノード) |
|
CRI-O |
CRI-O を使用している場合は、tcp/10010 を開き、 |
マスターまたはルートの負荷分散のために外部のロードバランサー (ELB) を設定する場合は、ELB の Ingress および Egress のセキュリティーグループを設定することも必要になります。
18.4. OpenStack 変数の設定
必要な OpenStack 変数を設定するには、OpenShift Container Platform のマスターとノード両方のすべてのホストに、/etc/cloud.conf ファイルを以下の内容で作成します。
[Global] auth-url = <OS_AUTH_URL> username = <OS_USERNAME> password = <password> domain-id = <OS_USER_DOMAIN_ID> tenant-id = <OS_TENANT_ID> region = <OS_REGION_NAME> [LoadBalancer] subnet-id = <UUID of the load balancer subnet>
OS_
変数の値については OpenStack の管理者にお問い合わせください。この値は通常 OpenStack の設定で使用されます。
18.5. OpenStack についての OpenShift Container Platform マスターの設定
OpenStack は、OpenShift Container Platform のマスターとノードの各ホストに以下の 2 通りの方法で設定できます。
18.5.1. Ansible を使用した OpenStack についての OpenShift Container Platform の設定
OpenStack は、通常インストール (Advanced installation) の実行中に以下のパラメーターを使って設定することができます。これらはインベントリーファイルで設定できます。
-
openshift_cloudprovider_kind
-
openshift_cloudprovider_openstack_auth_url
-
openshift_cloudprovider_openstack_username
-
openshift_cloudprovider_openstack_password
-
openshift_cloudprovider_openstack_domain_id
-
openshift_cloudprovider_openstack_domain_name
-
openshift_cloudprovider_openstack_tenant_id
-
openshift_cloudprovider_openstack_tenant_name
-
openshift_cloudprovider_openstack_region
-
openshift_cloudprovider_openstack_lb_subnet_id
Ansible インベントリーファイルのパラメーター値に、#
, {
or }
などの特殊文字が含まれている場合、値をダブルエスケープ (double-escape) する必要があります (値を単一と二重引用符で囲みます)。たとえば、mypasswordwith###hashsigns
を変数 openshift_cloudprovider_openstack_password
の値として使用し、これを Ansible ホストインベントリーファイルで openshift_cloudprovider_openstack_password='"mypasswordwith###hashsigns"'
として宣言します。
例18.1 Ansible を使用した OpenStack の設定例
# Cloud Provider Configuration # # Note: You may make use of environment variables rather than store # sensitive configuration within the ansible inventory. # For example: #openshift_cloudprovider_openstack_username="{{ lookup('env','USERNAME') }}" #openshift_cloudprovider_openstack_password="{{ lookup('env','PASSWORD') }}" # # Openstack #openshift_cloudprovider_kind=openstack #openshift_cloudprovider_openstack_auth_url=http://openstack.example.com:35357/v2.0/ #openshift_cloudprovider_openstack_username=username #openshift_cloudprovider_openstack_password=password #openshift_cloudprovider_openstack_domain_id=domain_id #openshift_cloudprovider_openstack_domain_name=domain_name #openshift_cloudprovider_openstack_tenant_id=tenant_id #openshift_cloudprovider_openstack_tenant_name=tenant_name #openshift_cloudprovider_openstack_region=region #openshift_cloudprovider_openstack_lb_subnet_id=subnet_id
18.5.2. 手動による OpenStack についての OpenShift Container Platform マスターの設定
すべてのマスターでマスター設定ファイル (デフォルトは /etc/origin/master/master-config.yaml) を編集するか、または作成し、apiServerArguments
と controllerArguments
の各セクションの内容を更新します。
kubernetesMasterConfig: ... apiServerArguments: cloud-provider: - "openstack" cloud-config: - "/etc/cloud.conf" controllerArguments: cloud-provider: - "openstack" cloud-config: - "/etc/cloud.conf"
コンテナー化インストールをトリガーすると、/etc/origin と /var/lib/origin のディレクトリーのみがマスターとノードのコンテナーにマウントされます。したがって、cloud.conf は /etc/ ではなく /etc/origin/ になければなりません。
18.5.3. 手動による OpenStack についての OpenShift Container Platform ノードの設定
すべてのノードでノード設定ファイル (デフォルトは /etc/origin/node/node-config.yaml) を編集するか、または作成し、kubeletArguments
と nodeName
の各セクションの内容を更新します。
nodeName:
<instance_name> 1
kubeletArguments:
cloud-provider:
- "openstack"
cloud-config:
- "/etc/cloud.conf"
- 1
- ノードが実行される OpenStack インスタンスの名前 (仮想マシンの名前)。
現時点では、クラウドプロバイダーの統合を正常に機能させるため、nodeName
は Openstack のインスタンス名と一致していなければなりません。また、この名前は RFC1123 に準拠している必要もあります。
コンテナー化インストールをトリガーすると、/etc/origin と /var/lib/origin のディレクトリーのみがマスターとノードのコンテナーにマウントされます。したがって、cloud.conf は /etc/ ではなく /etc/origin/ になければなりません。
18.5.4. Ansible Playbook を使用した OpenShift Container Platform のインストール
OpenStack インストール Playbook は、テクノロジープレビュー機能のみとなっています。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) ではサポートされていません。これらは、機能的に完全でない可能性があり、Red Hat では実稼働環境での使用を推奨しません。テクノロジープレビュー機能は、近々発表予定の製品機能をリリースに先駆けてご提供することにより、お客様に機能性をテストしていただき、開発プロセス中にフィードバックをお寄せいただくことを目的としています。Red Hat テクノロジープレビュー機能のサポート対象範囲に関する詳しい情報は、https://access.redhat.com/support/offerings/techpreview/ を参照してください。
OpenShift Container Platform を既存の OpenStack インストールにインストールするには、OpenStack Playbook を使用します。詳細の前提条件を含む Playbook についての詳細は、OpenStack Provisioning readme ファイルを参照してください。
Playbook を実行するには、以下のコマンドを実行します。
$ ansible-playbook --user openshift \ -i openshift-ansible/playbooks/openstack/inventory.py \ -i inventory \ openshift-ansible/playbooks/openstack/openshift-cluster/provision_install.yml
18.6. 設定変更の適用
マスターおよびノードのすべてのホストで OpenShift Container Platform サービスを起動または再起動し、設定の変更を適用します。「OpenShift Container Platform サービスの再起動」を参照してください。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers # systemctl restart atomic-openshift-node
クラウドプロバイダーを不使用から使用に切り替えるとエラーメッセージが表示されます。クラウドプロバイダーを追加すると、ノードが hostname を externalID
として使用する (クラウドプロバイダーが使用されていなかった場合のケース) 代わりに、クラウドプロバイダーの instance-id
(クラウドプロバイダーによって指定される) の使用に切り替えるため、ノードの削除が試みられます。この問題を解決するには、以下を実行します。
- CLI にクラスター管理者としてログインします。
既存のノードラベルをチェックし、これらをバックアップします。
$ oc describe node <node_name> | grep -Poz '(?s)Labels.*\n.*(?=Taints)'
ノードを削除します。
$ oc delete node <node_name>
各ノードホストで OpenShift Container Platform サービスを再起動します。
# systemctl restart atomic-openshift-node
- 以前に使用していた各ノードのラベルを再度追加します。
第19章 GCE の設定
19.1. 概要
OpenShift Container Platform は、Google Compute Engine (GCE) ボリュームをアプリケーションデータの永続ストレージとして使用するなど、GCE インフラストラクチャーにアクセスするように設定することが可能です。これを実行するには、GCE を適切に設定した後に OpenShift Container Platform ホストで追加の設定を行う必要があります。
19.2. パーミッション
OpenShift Container Platform に GCE を設定するには、以下のロールが必要です。
roles/owner |
サービスアカウント、クラウドストレージ、インスタンス、イメージ、テンプレート、Cloud DNS エントリーを作成し、ロードバランサーとヘルスチェックをデプロイします。さらに |
19.3. マスターの設定
GCE は、OpenShift Container Platform のマスターホストに 2 通りの方法で設定できます。
19.3.1. Ansible を使用した GCE についての OpenShift Container Platform マスターの設定
GCE は、通常インストール (Advanced installation) の実行中に openshift_cloudprovider_kind
パラメーターを使って設定することができます。このパラメーターはインベントリーファイルで設定できます。
-
GCE を使用する際は、
openshift_gcp_project
とopenshift_gcp_prefix
の各パラメーターを定義する必要があります。 -
Google Compute Platform を使用してロードバランサーサービスを実行する場合は、ノード (Compute Engine VM インスタンス) に
<openshift_gcp_prefix>ocp
タグを付ける必要があります (ocp
サフィックスを追加する)。たとえば、openshift_gcp_prefix
パラメーターの値がmycluster
に設定される場合、ノードにはmyclusterocp
のタグが付けられる必要があります。ネットワークタグを Compute Engine VM インスタンスに追加する方法についての詳細は、「Adding and Removing Network Tags」を参照してください。
Ansible を使用した GCE の設定例
# Cloud Provider Configuration # openshift_cloudprovider_kind=gce # openshift_gcp_project=<projectid> 1 # openshift_gcp_prefix=<uid> 2 # openshift_gcp_multizone=False 3
Ansible が GCE を設定する際に、以下のファイルがユーザー用に作成されます。
- /etc/origin/cloudprovider/gce.conf
- /etc/origin/master/master-config.yaml
- /etc/origin/node/node-config.yaml
通常インストール (Advanced installation) は、デフォルトでシングルゾーンのサポートを設定します。マルチゾーンのサポートが必要な場合は、「GCE デプロイメントにおけるマルチゾーンサポートの設定」で説明されているように /etc/origin/cloudprovider/gce.conf を編集します。
19.3.2. 手動による GCE についての OpenShift Container Platform マスターの設定
GCE について OpenShift Container Platform マスターを設定するには、以下を実行します。
すべてのマスターでマスター設定ファイル (デフォルトは /etc/origin/master/master-config.yaml) を編集するか、または作成し、
apiServerArguments
とcontrollerArguments
の各セクションの内容を更新します。kubernetesMasterConfig: ... apiServerArguments: cloud-provider: - "gce" cloud-config: - "/etc/origin/cloudprovider/gce.conf" controllerArguments: cloud-provider: - "gce" cloud-config: - "/etc/origin/cloudprovider/gce.conf"
重要コンテナー化インストールをトリガーすると、/etc/origin と /var/lib/origin のディレクトリーのみがマスターとノードのコンテナーにマウントされます。したがって、master-config.yaml は/etc/ ではなく /etc/origin/master になければなりません。
OpenShift Container Platform サービスを起動または再起動します。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers
19.4. ノードの設定
GCE について OpenShift Container Platform ノードを設定するには、以下を実行します。
すべてのノードでノード設定ファイル (デフォルトは /etc/origin/node/node-config.yaml) を編集するか、または作成し、
kubeletArguments
セクションの内容を更新します。kubeletArguments: cloud-provider: - "gce" cloud-config: - "/etc/origin/cloudprovider/gce.conf"
現時点では、クラウドプロバイダーの統合を正常に機能させるため、nodeName
は GCE のインスタンス名と一致している必要があります。また、この名前は RFC1123 に準拠している必要もあります。
コンテナー化インストールをトリガーすると、/etc/origin と /var/lib/origin のディレクトリーのみがマスターとノードのコンテナーにマウントされます。したがって、node-config.yaml は/etc/ ではなく /etc/origin/node になければなりません。
すべてのノードで OpenShift Container Platform サービスを起動または再起動します。
# systemctl restart atomic-openshift-node
19.5. GCE デプロイメントにおけるマルチゾーンサポートの設定
GCE を手動で設定した場合、マルチゾーンのサポートはデフォルトでは設定されません。
通常インストール (Advanced installation) ではシングルゾーンのサポートがデフォルトで設定されます。
マルチゾーンのサポートを使用するには、以下を実行します。
- OpenShift Container Platform のマスターとノード両方のすべてのホストで、/etc/origin/cloudprovider/gce.confファイルを編集するか、または作成します。
以下の内容を追加します。
[Global] project-id = <project-id> network-name = <network-name> node-tags = <node-tags> node-instance-prefix = <instance-prefix> multizone = true
シングルゾーンのサポートに戻すには、multizone
値を false
に設定します。
19.6. 設定変更の適用
マスターおよびノードのすべてのホストで OpenShift Container Platform サービスを起動または再起動し、設定の変更を適用します。「OpenShift Container Platform サービスの再起動」を参照してください。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers # systemctl restart atomic-openshift-node
クラウドプロバイダーを不使用から使用に切り替えるとエラーメッセージが表示されます。クラウドプロバイダーを追加すると、ノードが hostname を externalID
として使用する (クラウドプロバイダーが使用されていなかった場合のケース) 代わりに、クラウドプロバイダーの instance-id
(クラウドプロバイダーによって指定される) の使用に切り替えるため、ノードの削除が試みられます。この問題を解決するには、以下を実行します。
- CLI にクラスター管理者としてログインします。
既存のノードラベルをチェックし、これらをバックアップします。
$ oc describe node <node_name> | grep -Poz '(?s)Labels.*\n.*(?=Taints)'
ノードを削除します。
$ oc delete node <node_name>
各ノードホストで OpenShift Container Platform サービスを再起動します。
# systemctl restart atomic-openshift-node
- 以前に使用していた各ノードのラベルを再度追加します。
第20章 Azure の設定
20.1. 概要
OpenShift Container Platform は、「Microsoft Azure ディスクをアプリケーションデータの永続ストレージとして使用する」など、「Azure インフラストラクチャー」にアクセスするように設定できます。これを実行するには、Microsoft Azure を適切に設定した後に OpenShift Container Platform ホストで追加の設定を行う必要があります。
20.2. パーミッション
OpenShift Container Platform 向けに Microsoft Azure を設定するには、以下のロールが必要です。
Contributor |
すべての種類の Microsoft Azure リソースを作成し、管理します。 |
管理者ロールの追加に関する詳細情報は、「Azure サブスクリプション管理者の追加または変更」を参照してください。
20.3. 前提条件
- OpenShift Container Platform バージョン 3.5 以降で、Microsoft Azure Disk を永続ボリュームとして使用する場合には、Azure Cloud Provider を有効化する必要があります。
- Microsoft Azure で実行している OpenShift Container Platform ノードの仮想マシン (VM) はすべて、単一のリソースグループに所属する必要があります。
- Microsoft Azure 仮想マシンは、OpenShift Container Platform ノードと同じにする必要があり、これには大文字を含めることはできません。
Azure Managed Disks を使用する予定の場合:
- OpenShift Container Platform バージョン 3.7 以降が必要です。
- Azure Managed Disks で、仮想マシンを作成する必要があります。
アンマネージドディスクを使用する予定の場合:
- アンマネージドディスクで、仮想マシンを作成する必要があります。
- OpenShift Container Platform クラスターに、カスタムの DNS 設定を使用する場合やクラスターノードが別の Microsoft Azure Virtual Networks (VNet) に含まれる場合には、クラスター内の各ノードが他のノードの IP アドレスを解決できるように、DNS を設定する必要があります。
20.4. Azure 設定ファイル
Azure ついて OpenShift Container Platform を設定するには、各ノードホストに /etc/azure/azure.conf ファイルが必要です。
ファイルが存在しない場合は、ファイルを作成し、以下を追加します。
tenantId: <> 1 subscriptionId: <> 2 aadClientId: <> 3 aadClientSecret: <> 4 aadTenantId: <> 5 resourceGroup: <> 6 cloud: <> 7 location: <> 8 vnetName: <> 9 securityGroupName: <> 10 primaryAvailabilitySetName: <> 11
- 1
- クラスターがデプロイされているサブスクリプションの AAD テナント ID。
- 2
- クラスターがデプロイされている Azure サブスクリプション ID。
- 3
- Azure RM API と対話するための RBAC アクセス権を持つ AAD アプリケーションのクライアント ID。
- 4
- Azure RM API と対話するための RBAC アクセス権を持つ AAD アプリケーションのクライアントシークレット。
- 5
- これがテナント ID と同一であることを確認します (オプション)。
- 6
- Azure VM が属する Azure のリソースグループ名。
- 7
- 特定のクラウドリージョン。
AzurePublicCloud
など。 - 8
- コンパクトな形式の Azure リージョン。
southeastasia
など (オプション)。 - 9
- インスタンスを含む仮想ネットワーク。ロードバランサー作成時に使用します。
- 10
- インスタンスとロードバランサーに関連付けられているセキュリティーグループ名。
- 11
- ロードバランサーなどのリソースの作成時に使用するように設定されている可用性 (オプション)。
インスタンスへのアクセスに使用される NIC には internal-dns-name
が設定されている必要があります。これがないと、ノードはクラスターに再結合できず、コンソールにビルドログを表示できず、oc rsh
が正常に機能しなくなる可能性があります。
20.5. マスターの設定
すべてのマスターでマスター設定ファイル (デフォルトは /etc/origin/master/master-config.yaml) を編集するか、または作成し、apiServerArguments
と controllerArguments
の各セクションの内容を更新します。
kubernetesMasterConfig: ... apiServerArguments: cloud-provider: - "azure" cloud-config: - "/etc/azure/azure.conf" controllerArguments: cloud-provider: - "azure" cloud-config: - "/etc/azure/azure.conf"
コンテナー化インストールをトリガーすると、/etc/origin と /var/lib/origin のディレクトリーのみがマスターとノードのコンテナーにマウントされます。したがって、master-config.yaml は/etc/ ではなく /etc/origin/master になければなりません。
20.6. ノードの設定
すべてのノードでノード設定ファイル (デフォルトは /etc/origin/node/node-config.yaml) を編集するか、または作成し、
kubeletArguments
セクションの内容を更新します。kubeletArguments: cloud-provider: - "azure" cloud-config: - "/etc/azure/azure.conf"
重要コンテナー化インストールをトリガーすると、/etc/origin と /var/lib/origin のディレクトリーのみがマスターとノードのコンテナーにマウントされます。したがって、node-config.yaml は/etc/ ではなく /etc/origin/node になければなりません。
20.7. 設定変更の適用
マスターおよびノードのすべてのホストで OpenShift Container Platform サービスを起動または再起動し、設定の変更を適用します。「OpenShift Container Platform サービスの再起動」を参照してください。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers # systemctl restart atomic-openshift-node
クラウドプロバイダーを不使用から使用に切り替えるとエラーメッセージが表示されます。クラウドプロバイダーを追加すると、ノードが hostname を externalID
として使用する (クラウドプロバイダーが使用されていなかった場合のケース) 代わりに、クラウドプロバイダーの instance-id
(クラウドプロバイダーによって指定される) の使用に切り替えるため、ノードの削除が試みられます。この問題を解決するには、以下を実行します。
- CLI にクラスター管理者としてログインします。
既存のノードラベルをチェックし、これらをバックアップします。
$ oc describe node <node_name> | grep -Poz '(?s)Labels.*\n.*(?=Taints)'
ノードを削除します。
$ oc delete node <node_name>
各ノードホストで OpenShift Container Platform サービスを再起動します。
# systemctl restart atomic-openshift-node
- 以前に使用していた各ノードのラベルを再度追加します。
第21章 VMWare vSphere の設定
21.1. 概要
OpenShift Container Platform は、VMWare vSphere VMDK ボリュームをアプリケーションデータの永続ストレージとして使用するなど、VMWare vSphere VMDK ボリュームにアクセスするように設定できます。
vSphere クラウドプロバイダーは、OpenShift Container Platform 内での vSphere の管理対象ストレージの使用を許可します。vSphere クラウドプロバイダーは以下に対応しています。
- ボリューム
- 永続ボリューム
- ストレージクラスとボリュームのプロビジョニング
21.2. VMWare vSphere クラウドプロバイダーの有効化
VMware vSphere を有効化すると、各ノードの仮想マシンに VMware ツールをインストールする必要があります。詳しい情報は、「VMware ツールのインストール」を参照してください。
OpenShift Container Platform で VMWare vSphere クラウドプロバイダーを有効にするには、以下を実行します。
- VM フォルダーを作成し、OpenShift Container Platform ノード VM をこのフォルダーに移動します。
ノードの VM 名が正規表現
[a-z](()?[0-9a-z])?(\.[a-z0-9](([-0-9a-z])?[0-9a-z])?)*
に従っていることを確認します。重要VM 名では以下が禁止されています。
- 数字から始めることはできません。
- 大文字を含めることはできません。
-
-
以外の特殊文字を含めることはできません。 - 文字数は 3 文字未満、64 文字以上に指定できません。
各ノード VM で
disk.EnableUUID
パラメーターをTRUE
に設定します。これにより VMDK は常に一貫した UUID を VM に提供し、ディスクが適切にマウントされるようになります。クラスターに参加するすべての仮想マシンノードについては、以下の GOVC ツールを使用する手順に従ってください。GOVC 環境をセットアップします。
export GOVC_URL='vCenter IP OR FQDN' export GOVC_USERNAME='vCenter User' export GOVC_PASSWORD='vCenter Password' export GOVC_INSECURE=1
ノード VM パスを見つけます。
govc ls /datacenter/vm/<vm-folder-name>
すべての VM で disk.EnableUUID を true に設定します。
govc vm.change -e="disk.enableUUID=1" -vm='VM Path'
注記OpenShift Container Platform ノード VM がテンプレート VM で作成されている場合、
disk.EnableUUID=1
をテンプレート VM に設定することができます。このテンプレートからクローン作成される VM はこのプロパティーを継承します。
ロールを作成して、ロールを vSphere クラウドプロバイダーユーザーと vSphere エンティティーに割り当てます。vSphere クラウドプロバイダーでは、vCenter と対話するために以下の権限が必要になります。カスタムロール、ユーザーおよびロールの割り当てを作成する手順については、vSphere Documentation Center を参照してください。
ロール 権限 エンティティー 子への伝播 manage-k8s-node-vms
Resource.AssignVMToPool System.Anonymous System.Read System.View VirtualMachine.Config.AddExistingDisk VirtualMachine.Config.AddNewDisk VirtualMachine.Config.AddRemoveDevice VirtualMachine.Config.RemoveDisk VirtualMachine.Inventory.Create VirtualMachine.Inventory.Delete
クラスター、ホスト、VM フォルダー
Yes
manage-k8s-volumes
Datastore.AllocateSpace Datastore.FileManagement System.Anonymous System.Read System.View
データストア
不可
k8s-system-read-and-spbm-profile-view
StorageProfile.View System.Anonymous System.Read System.View
vCenter
不可
ReadOnly
System.Anonymous System.Read System.View
データセンター、データストアクラスター、データストアストレージフォルダー
不可
vSphere クラウドプロバイダーを有効にすると、ノード名が vCenter インベントリーの VM 名に設定されます。
openshift_hostname
変数は仮想マシンの名前およびそのホスト名に一致する必要があります。openshift_hostname
変数は、node-config.yaml ファイルに nodeName
値を定義します。この値は、コマンド uname -n
を使用して判別される nodeName
値と比較されます。不一致の場合、それらのプロバイダーのネイティブクラウド統合は機能しません。
21.3. VMWare vSphere 設定ファイル
VMWare vSphere について OpenShift Container Platform を設定するには、各ノードホストに /etc/origin/cloudprovider/vsphere.conf ファイルが必要です。
ファイルが存在しない場合は、ファイルを作成し、以下を追加します。
[Global] 1 user = "myusername" 2 password = "mypassword" 3 port = "443" 4 insecure-flag = "1" 5 datacenter = "mydatacenter" 6 [VirtualCenter "1.2.3.4"] 7 user = "myvCenterusername" password = "password" [VirtualCenter "1.2.3.5"] port = "448" insecure-flag = "0" [Workspace] 8 server = "10.10.0.2" 9 datacenter = "mydatacenter" folder = "path/to/file" 10 datastore = "mydatastore" 11 resourcepool-path = "myresourcepoolpath" 12 [Disk] scsicontrollertype = pvscsi [Network] public-network = "VM Network" 13
- 1
[Global]
セクションに設定されるプロパティーは、個別の[VirtualCenter]
セクションの設定で上書きされない限り、すべての指定される vcenter で使用されます。- 2
- vSphere クラウドプロバイダーの vCenter ユーザー名。
- 3
- 指定されたユーザーの vCenter パスワード。
- 4
- オプション。vCenter サーバーのポート番号。デフォルトはポート
443
になります。 - 5
- vCenter が自己署名証明書を使用している場合は
1
に設定します。 - 6
- ノード VM がデプロイされているデータセンターの名前。
- 7
- この Virtual Center の特定の
[Global]
プロパティーを上書きします。使用できる設定は[Port]
、[user]
、[insecure-flag]
、[datacenters]
です。指定されない設定は[Global]
セクションからプルされます。 - 8
- 各種の vSphere Cloud Provider 機能で使用されるプロパティーを設定します。たとえば、動的プロビジョニング、ストレージプロファイルベースのボリュームプロビジョニングなどがこれに含まれます。
- 9
- vCenter サーバーの IP アドレスまたは FQDN。
- 10
- ノード VM の VM ディレクトリーへのパス。
- 11
- ストレージクラスまたは動的プロビジョニングを使ったボリュームのプロビジョニングに使用されるデータストアの名前に設定されます。データストアがストレージディレクトリーにあるか、またはデータストアクラスターのメンバーである場合には、完全パスを指定する必要があります。
- 12
- オプション。ストレージプロファイルベースのボリュームプロビジョニングのダミー VM が作成される必要のあるリソースプールのパスに設定されます。
- 13
- vSphere がノードにアクセスするために使用されるネットワークポートグループに設定されます。これはデフォルトで VM ネットワークと呼ばれます。これは Kubernetes に登録されているノードホストの ExternalIP です。
21.4. マスターの設定
すべてのマスターでマスター設定ファイル (デフォルトは /etc/origin/master/master-config.yaml) を編集するか、または 作成し、apiServerArguments
と controllerArguments
の各セクションの内容を以下で更新します。
kubernetesMasterConfig: admissionConfig: pluginConfig: {} apiServerArguments: cloud-provider: - "vsphere" cloud-config: - "/etc/origin/cloudprovider/vsphere.conf" controllerArguments: cloud-provider: - "vsphere" cloud-config: - "/etc/origin/cloudprovider/vsphere.conf"
コンテナー化インストールをトリガーすると、/etc/origin と /var/lib/origin のディレクトリーのみがマスターとノードのコンテナーにマウントされます。したがって、master-config.yaml は/etc/ ではなく /etc/origin/master になければなりません。
21.5. ノードの設定
すべてのノードでノード設定ファイル (デフォルトは /etc/origin/node/node-config.yaml) を編集するか、または作成し、
kubeletArguments
セクションの内容を更新します。kubeletArguments: cloud-provider: - "vsphere"
重要コンテナー化インストールをトリガーする際は、/etc/origin と /var/lib/origin のディレクトリーのみがマスターとノードのコンテナーにマウントされます。したがって、node-config.yaml は/etc/ ではなく /etc/origin/node になければなりません。
21.6. 設定変更の適用
マスターおよびノードのすべてのホストで OpenShift Container Platform サービスを起動または再起動し、設定の変更を適用します。「OpenShift Container Platform サービスの再起動」を参照してください。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers # systemctl restart atomic-openshift-node
クラウドプロバイダーを不使用から使用に切り替えるとエラーメッセージが表示されます。クラウドプロバイダーを追加すると、ノードが hostname を externalID
として使用する (クラウドプロバイダーが使用されていなかった場合のケース) 代わりに、クラウドプロバイダーの instance-id
(クラウドプロバイダーによって指定される) の使用に切り替えるため、ノードの削除が試みられます。この問題を解決するには、以下を実行します。
- CLI にクラスター管理者としてログインします。
既存のノードラベルをチェックし、これらをバックアップします。
$ oc describe node <node_name> | grep -Poz '(?s)Labels.*\n.*(?=Taints)'
ノードを削除します。
$ oc delete node <node_name>
各ノードホストで OpenShift Container Platform サービスを再起動します。
# systemctl restart atomic-openshift-node
- 以前に使用していた各ノードのラベルを再度追加します。
21.7. 永続ボリュームのバックアップ
OpenShift Container Platform は、自由にクラスターないのノードにあるボリュームをアタッチしたり、アタッチ解除できるように、「個別の永続ディスク」として新規ボリュームをプロビジョニングします。そのため、スナップショットを使用するボリュームはバックアップできません。
以下の方法で、PV のバックアップを作成します。
- PV を使用してアプリケーションを停止します。
- 永続ディスクのクローンを作成します。
- アプリケーションを再起動します。
- クローンしたディスクのバックアップを作成します。
- クローンしたディスクを削除します。
第22章 ローカルボリュームの設定
22.1. 概要
OpenShift Container Platform は、アプリケーションデータのローカルボリュームにアクセスするように設定できます。
ローカルボリュームは、ローカルにマウントされたファイルシステムを表す永続ボリューム (PV) です。今後は、これらが raw ブロックデバイスに拡張される可能性があります。
ローカルボリュームは hostPath とは異なります。これらには特殊なアノテーションがあり、このアノテーションを使用して PV を使用する Pod を、ローカルボリュームがマウントされているノードと同じノードにスケジュールします。
また、ローカルボリュームには、ローカルにマウントされたデバイスに PV を自動作成するプロビジョナーが含まれます。現時点で、このプロビジョナーは制限が付けられており、これは事前設定されたディレクトリーのみをスキャンします。ボリュームを動的にプロビジョニングする機能はありませんが、今後のリリースで実装される可能性はあります。
ローカルボリュームのプロビジョナーを使用すると、ローカルストレージを OpenShift Container Platform 内で使用することができます。ローカルボリュームのプロビジョナーは以下に対応しています。
- ボリューム
- PV
ローカルボリュームはアルファ機能であり、OpenShift Container Platform の今後のリリースで変更される場合があります。
22.1.1. ローカルボリュームの有効化
すべてのマスターとノードで PersistentLocalVolumes
機能ゲートを有効にします。
すべてのマスターでマスター設定ファイル (デフォルトは /etc/origin/master/master-config.yaml) を編集するか、または作成して
PersistentLocalVolumes=true
をapiServerArguments
とcontrollerArguments
の各セクションの下に追加します。apiServerArguments: feature-gates: - PersistentLocalVolumes=true ... controllerArguments: feature-gates: - PersistentLocalVolumes=true ...
すべてのノードでノード設定ファイル (デフォルトは /etc/origin/node/node-config.yaml) を編集するか、または作成して
PersistentLocalVolumes=true
機能ゲートをkubeletArguments
の下に追加します。kubeletArguments: feature-gates: - PersistentLocalVolumes=true
22.1.2. ローカルボリュームのマウント
すべてのローカルボリュームは、OpenShift Container Platform によって PV として使用される前に手動でマウントする必要があります。
すべてのボリュームは、/mnt/local-storage/<storage-class-name>/<volume> パスにマウントされる必要があります。管理者は、必要に応じてローカルデバイスを作成し (ディスクパーティションまたは LVM などの方法を使用する)、これらのデバイスに適切なファイルシステムを作成して、スクリプトまたは /etc/fstab
エントリーを使用してそれらをマウントします。
/etc/fstab
エントリーの例
# device name # mount point # FS # options # extra /dev/sdb1 /mnt/local-storage/ssd/disk1 ext4 defaults 1 2 /dev/sdb2 /mnt/local-storage/ssd/disk2 ext4 defaults 1 2 /dev/sdb3 /mnt/local-storage/ssd/disk3 ext4 defaults 1 2 /dev/sdc1 /mnt/local-storage/hdd/disk1 ext4 defaults 1 2 /dev/sdc2 /mnt/local-storage/hdd/disk2 ext4 defaults 1 2
すべてのボリュームは、Docker コンテナー内で実行されているプロセスからアクセスできる必要があります。そのためには、マウントしたファイルシステムのラベルを変更します。
$ chcon -R unconfined_u:object_r:svirt_sandbox_file_t:s0 /mnt/local-storage/
22.1.3. ローカルプロビジョナーの設定
OpenShift Container Platform は、ローカルデバイス用に PV を作成する場合やそれら (の再利用の有効化) が不要になった際のクリーンアップ時に、外部のプロビジョナーを使用します。
- ローカルボリュームのプロビジョナーは大半のプロビジョナーとは異なり、動的なプロビジョニングに対応していません。
- ローカルボリュームのプロビジョナーは、管理者に対し、各ノードでローカルボリュームを事前設定し、それらを discovery ディレクトリーの下にマウントすることを要求します。その後にプロビジョナーは各ボリュームについて PV の作成とクリーンアップを実行してボリュームを管理します。
この外部のプロビジョナーは、ディレクトリーを StorageClasses に関連付けるために ConfigMap
を使って設定される必要があります。この設定は、プロビジョナーをデプロイする前に作成する必要があります。
(オプション) ローカルボリュームのプロビジョナーおよびその設定用にスタンドアロンの namespace を作成します。例: oc new-project local-storage
apiVersion: v1 kind: ConfigMap metadata: name: local-volume-config data: "local-ssd": | 1 { "hostDir": "/mnt/local-storage/ssd", 2 "mountDir": "/mnt/local-storage/ssd" 3 } "local-hdd": | { "hostDir": "/mnt/local-storage/hdd", "mountDir": "/mnt/local-storage/hdd" }
上記の設定により、プロビジョナーは以下を作成します。
-
/mnt/local-storage/ssd のすべてのサブディレクトリーについて StorageClass が
local-ssd
に設定されている 1 つの PV。 -
/mnt/local-storage/hdd のすべてのサブディレクトリーについて StorageClass が
local-hdd
に設定されている 1 つの PV。
LocalPersistentVolumes
のアルファ機能には、VolumeScheduling
のアルファ機能も必要になります。この変更に伴って以下の変更を実行することが必要になります。
-
VolumeScheduling
機能ゲートを kube-scheduler と kube-controller-manager の各コンポーネントで有効にする。 -
NoVolumeNodeConflict
述語を削除する。デフォルト以外のスケジューラーの場合、ユーザーのスケジューラーポリシーを更新する。 -
CheckVolumeBinding
述語は、デフォルト以外のスケジューラーで有効にする必要があります。
22.1.4. ローカルプロビジョナーのデプロイ
プロビジョナーを起動する前に、すべてのローカルデバイスをマウントし、ストレージクラスとそれらのディレクトリーと共に ConfigMap
を作成します。
local-storage-provisioner-template.yaml ファイルからローカルプロビジョナーをインストールします。
実行中の Pod を root ユーザーとして許可するサービスアカウントを作成し、hostPath ボリュームを使用して、SELinux コンテキストを使用してローカルボリュームの監視、管理、および消去を実行できるようにします。
$ oc create serviceaccount local-storage-admin $ oc adm policy add-scc-to-user privileged -z local-storage-admin
プロビジョナー Pod で任意の Pod が作成したローカルボリュームのコンテンツを削除できるようにするには、root 権限と任意の SELinux コンテキストが必要です。ホスト上の /mnt/local-storage パスにアクセスするには hostPath が必要です。
テンプレートをインストールします。
$ oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/storage-examples/local-examples/local-storage-provisioner-template.yaml
configmap
、account
、provisioner_image
のパラメーターの値を指定して、テンプレートをインスタンス化します。$ oc new-app -p CONFIGMAP=local-volume-config \ -p SERVICE_ACCOUNT=local-storage-admin \ -p NAMESPACE=local-storage \ -p PROVISIONER_IMAGE=registry.access.redhat.com/openshift3/local-storage-provisioner:v3.9 \ 1 local-storage-provisioner
- 1
v3.9
を適切な OpenShift Container Platform のバージョンに置き換えます。
必要なストレージクラスを追加します。
oc create -f ./storage-class-ssd.yaml oc create -f ./storage-class-hdd.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-ssd provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-hdd provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer
その他の設定オプションについては、テンプレート 参照してください。このテンプレートは、すべてのノード上で Pod を実行する DeamonSet を作成します。Pod は
ConfigMap
に指定されるディレクトリーを監視し、それらの PV を自動的に作成します。プロビジョナーは、PV が解放され、すべてのデータの削除が必要になる場合にディレクトリーをクリーンアップできるよう root として実行されます。
22.1.5. 新規デバイスの追加
新規デバイスを追加するには、手動による操作がいくつか必要になります。
- プロビジョナーで DaemonSet を停止します。
- 新規デバイスを使ってノードの適切なディレクトリーにサブディレクトリーを作成し、これをマウントします。
- プロビジョナーを使って DeamonSet を起動します。
上記のいずれかの操作を省くと、適切な PV が作成されなくなることがあります。
第23章 Persistent Volume Claim (永続ボリューム要求) 保護の設定
23.1. 概要
OpenShift Container Platform は Persistent Volume Claim (永続ボリューム要求、PVC) の保護機能を有効にするように設定することができます。これは、Pod に使用されている PVC がシステムから削除されないようにするための機能です。削除するとデータが失われる可能性があるためです。
PVC 保護はアルファ機能であり、OpenShift Container Platform の今後のリリースで変更される場合があります。
23.1.1. PVC 機能の有効化
すべてのマスターとノードで PVCProtection
機能ゲートを有効にするには、以下を実行します。
すべてのマスターでマスター設定ファイル (デフォルトは /etc/origin/master/master-config.yaml) を編集するか、または作成します。
-
PVCProtection=true
をapiServerArguments
およびcontrollerArguments
セクションの下に追加します。 PVCProtection
受付プラグイン設定をadmissionConfig
セクションの下に追加します。admissionConfig: pluginConfig: PVCProtection: configuration: apiVersion: v1 disable: false kind: DefaultAdmissionConfig ... kubernetesMasterConfig: ... apiServerArguments: feature-gates: - PVCProtection=true ... controllerArguments: feature-gates: - PVCProtection=true ...
-
すべてのノードでノード設定ファイル (デフォルトは /etc/origin/node/node-config.yaml) を作成し、
PVCProtection=true
機能ゲートをkubeletArguments
の下に追加します。kubeletArguments: feature-gates: - PVCProtection=true
- すべてのマスターとノードで OpenShift Container Platform を再起動して変更を有効にします。
第24章 永続ストレージの設定
24.1. 概要
Kubernetes の永続ボリュームフレームワークにより、お使いの環境で利用可能なネットワークストレージを使用して、OpenShift Container Platform クラスターに永続ストレージをプロビジョニングできます。これは、アプリケーションのニーズに応じて初回 OpenShift Container Platform インストールの完了後に行うことができ、ユーザーは基礎となるインフラストラクチャーの知識がなくてもこれらのリソースを要求できるようになります。
このトピックでは、以下のサポートされるボリュームプラグインを使って永続ボリュームを OpenShift Container Platform で設定する方法を説明します。
24.2. NFS を使用した永続ストレージ
24.2.1. 概要
OpenShift Container Platform クラスターは、NFS を使用している永続ストレージを使ってプロビジョニングすることが可能です。永続ボリューム (PV) および Persistent Volume Claim (永続ボリューム要求、PVC) は、プロジェクト全体でボリュームを共有するための便利な方法を提供します。PV 定義に含まれる NFS に固有の情報は、Pod 定義で直接定義することも可能ですが、この方法の場合にはボリュームが一意のクラスターリソースとして作成されされないため、ボリュームが競合の影響を受けやすくなります。
このトピックでは、NFS 永続ストレージタイプの具体的な使用方法について説明します。OpenShift Container Platform と NFS についてある程度理解していることを前提とします。OpenShift Container Platform 永続ボリューム (PV) の一般的なフレームワークの詳細は永続ストレージの概念に関するトピックを参照してください。
24.2.2. プロビジョニング
OpenShift Container Platform でストレージをボリュームとしてマウントするには、ストレージがあらかじめ基礎となるインフラストラクチャーに存在している必要があります。NFS ボリュームをプロビジョニングするには、NFS サーバーの一覧とエクスポートパスのみが必要です。
最初に、PV のオブジェクト定義を作成します。
例24.1 NFS を使用した PV オブジェクト定義
apiVersion: v1 kind: PersistentVolume metadata: name: pv0001 1 spec: capacity: storage: 5Gi 2 accessModes: - ReadWriteOnce 3 nfs: 4 path: /tmp 5 server: 172.17.0.2 6 persistentVolumeReclaimPolicy: Recycle 7
- 1
- ボリュームの名前。これは、各種の
oc <command> pod
コマンドの PV アイデンティティーです。 - 2
- このボリュームに割り当てられるストレージの量。
- 3
- これはボリュームへのアクセスの制御に関連するように見えますが、実際はラベルの場合と同様に、PVC を PV に一致させるために使用されます。現時点では、
accessModes
に基づくアクセスルールは適用されていません。 - 4
- 使用されているボリュームタイプ。この場合は nfs プラグインです。
- 5
- NFS サーバーがエクスポートしているパス。
- 6
- NFS サーバーのホスト名または IP アドレス
- 7
- PV の回収ポリシー。ボリュームが要求から解放されるタイミングでボリュームで実行されることを定義します。有効な選択肢は Retain (デフォルト) と Recycle です。「リソースの回収」を参照してください。
各 NFS ボリュームは、クラスター内のスケジュール可能なすべてのノードによってマウント可能でなければなりません。
定義をファイル (nfs-pv.yaml など) に保存し、PV を作成します。
$ oc create -f nfs-pv.yaml persistentvolume "pv0001" created
PV が作成されたことを確認します。
# oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE pv0001 <none> 5368709120 RWO Available 31s
以下の手順で PVC が作成されます。これは新規 PV にバインドされます。
例24.2 PVC オブジェクト定義
定義をファイル (nfs-claim.yaml など) に保存し、PVC を作成します。
# oc create -f nfs-claim.yaml
24.2.3. ディスククォータの実施
ディスクパーティションを使用して、ディスククォータとサイズ制限を実施することができます。それぞれのパーティションを独自のエクスポートとすることができ、それぞれのエクスポートは 1 つの PV になります。OpenShift Container Platform は PV に固有の名前を適用しますが、NFS ボリュームのサーバーとパスの一意性については管理者に委ねられています。
この方法でクォータを実施すると、開発者は永続ストレージを具体的な量 (10Gi など) で要求することができ、同等かそれ以上の容量の対応するボリュームに一致させることができます。
24.2.4. NFS ボリュームのセキュリティー
このセクションでは、一致するパーミッションや SELinux の考慮点を含む、NFS ボリュームのセキュリティーについて説明します。ユーザーは、POSIX パーミッションやプロセス UID、補助グループおよび SELinux の基礎的な点を理解している必要があります。
NFS ボリュームを実装する前に 「ボリュームのセキュリティー」のトピックをすべてお読みください。
開発者は、Pod 定義の volumes
セクションで、PVC を名前で参照するか、または NFS ボリュームのプラグインを直接参照して NFS ストレージを要求します。
NFS サーバーの /etc/exports ファイルにはアクセス可能な NFS ディレクトリーが含まれています。ターゲットの NFS ディレクトリーには、POSIX の所有者とグループ ID があります。OpenShift Container Platform NFS プラグインは、同じ POSIX の所有者とエクスポートされる NFS ディレクトリーにあるパーミッションを使って、コンテナーの NFS ディレクトリーをマウントします。ただし、コンテナーは NFS マウントの所有者と同等の実効 UID では実行されません。これは期待される動作です。
ターゲットの NFS ディレクトリーが NFS サーバーに表示される場合を例に取って見てみましょう。
# ls -lZ /opt/nfs -d drwxrws---. nfsnobody 5555 unconfined_u:object_r:usr_t:s0 /opt/nfs # id nfsnobody uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
コンテナーは SELinux ラベルと一致している必要があり、ディレクトリーにアクセスするために UID 65534 (nfsnobody 所有者) か、または補助グループの 5555 のいずれかを使って実行する必要があります。
ここで、所有者 ID 65534 は一例として使用されています。NFS の root_squash が root (0) を nfsnobody (65534) にマップしても、NFS エクスポートは任意の所有者 ID を持つことができます。所有者 65534 は NFS エクスポートには必要ありません。
24.2.4.1. グループ ID
NFS アクセスに対応する際の推奨される方法として、補助グループを使用することができます (NFS エクスポートのパーミッションを変更するオプションがないことを前提としています)。OpenShift Container Platform の補助グループは共有ストレージに使用されます (例: NFS)。これとは対照的に、Ceph RBD や iSCSI などのブロックストレージは、Pod の securityContext
で fsGroup SCC ストラテジーと fsGroup の値を使用します。
一般的に、永続ストレージへのアクセスを取得する場合、ユーザー ID ではなく補助グループ ID を使用することが推奨されます。補助グループについては「ボリュームのセキュリティー」トピックで詳しく説明されています。
上記のターゲット NFS ディレクトリーの例で使用したグループ ID は 5555 なので、Pod は、supplementalGroups
を使用してグループ ID を Pod レベルの securityContext
定義の下で定義することができます。以下は例になります。
spec: containers: - name: ... securityContext: 1 supplementalGroups: [5555] 2
Pod の要件を満たすカスタム SCC が存在しない場合、Pod は 制限付きの SCC に一致する可能性があります。この SCC では、supplementalGroups
ストラテジーが RunAsAny に設定されています。これは、指定されるグループ ID は範囲のチェックなしに受け入れられることを意味します。
その結果、上記の Pod は受付をパスして起動します。しかし、グループ ID の範囲をチェックすることが望ましい場合は、「Pod のセキュリティーとカスタム SCC」で説明されているようにカスタム SCC の使用が推奨されます。カスタム SCC は、最小および最大のグループ ID が定義され、グループ ID の範囲チェックが実施され、グループ ID 5555 が許可されるように作成できます。
カスタム SCC を使用するには、最初にそこに適切なサービスアカウントを追加しておく必要があります。たとえば、所定のプロジェクトでは、Pod 仕様において別のサービスアカウントが指定されていない限り、default
のサービスアカウントを使用してください。詳細は、「SCC のユーザー、グループまたはプロジェクトへの追加」を参照してください。
24.2.4.2. ユーザー ID
ユーザー ID は、コンテナーイメージまたは Pod 定義で定義できます。ユーザー ID に基づいてストレージアクセスを制御する方法については、「ボリュームのセキュリティー」のトピックで説明されています。NFS 永続ストレージをセットアップする前に、必ず読んでおいてください。
永続ストレージへのアクセスを取得する場合、通常はユーザー ID ではなく 補助グループ ID を使用することが推奨されます。
上記の ターゲット NFS ディレクトリーの例 では、コンテナーは UID を 65534 (ここではグループ ID を省略します) に設定する必要があります。したがって以下を Pod 定義に追加することができます。
spec: containers: 1 - name: ... securityContext: runAsUser: 65534 2
デフォルトのプロジェクトと制限付き SCC を前提とする場合は、Pod が要求するユーザー ID 65534 は許可されず、Pod は失敗します。Pod が失敗する理由は以下の通りです。
- 65534 をユーザー ID として要求している。
- ユーザー ID 65534 を許可する SCC を確認するために Pod で利用できるすべての SCC が検査される (実際は SCC のすべてのポリシーがチェックされますが、ここでのフォーカスはユーザー ID になります)。
-
利用可能なすべての SCC は
runAsUser
ストラテジーに MustRunAsRange を使用するため、UID の範囲チェックが必要である。 - 65534 は SCC またはプロジェクトのユーザー ID 範囲に含まれていない。
一般に、事前定義された SCC は変更しないことが勧められています。ただし、この状況を改善するには、「ボリュームのセキュリティー」のトピックで説明されているようにカスタム SCC を作成することが推奨されます。カスタム SCC は、最小および最大のユーザー ID が定義され、UID 範囲のチェックの実施が設定されており、UID 65534 が許可されるように作成できます。
カスタム SCC を使用するには、最初にそこに適切なサービスアカウントを追加しておく必要があります。たとえば、所定のプロジェクトでは、Pod 仕様において別のサービスアカウントが指定されていない限り、default
のサービスアカウントを使用してください。詳細は、「SCC のユーザー、グループまたはプロジェクトへの追加」を参照してください。
24.2.4.3. SELinux
SELinux を使用してストレージアクセスを制御する方法についての詳細は、「ボリュームのセキュリティー」を参照してください。
デフォルトでは、SELinux は Pod からリモートの NFS サーバーへの書き込みを許可していません。NFS ボリュームは正常にマウントされますが、読み取り専用です。
SELinux を各ノードで有効にした状態で NFS ボリュームへの書き込みを有効にするには、以下を実行します。
# setsebool -P virt_use_nfs 1
上記の -P
オプションは、ブール値をリブート間で継続させます。
virt_use_nfs ブール値は docker-selinux パッケージで定義されます。このブール値が定義されていないことを示すエラーが表示された場合は、このパッケージがインストールされていることを確認してください。
24.2.4.4. エクスポート設定
任意のコンテナーユーザーにボリュームの読み取りと書き出しを許可するには、NFS サーバーにエクスポートされる各ボリュームは以下の条件を満たしている必要があります。
各エクスポートを以下のように指定します。
/<example_fs> *(rw,root_squash)
ファイアウォールは、マウントポイントへのトラフィックを許可するように設定する必要があります。
NFSv4 の場合、デフォルトのポート
2049
(nfs) とポート111
(portmapper) を設定します。NFSv4
# iptables -I INPUT 1 -p tcp --dport 2049 -j ACCEPT # iptables -I INPUT 1 -p tcp --dport 111 -j ACCEPT
NFSv3 の場合、以下の 3 つのポートを設定します。
2049
(nfs)、20048
(mountd)、111
(portmapper)。NFSv3
# iptables -I INPUT 1 -p tcp --dport 2049 -j ACCEPT # iptables -I INPUT 1 -p tcp --dport 20048 -j ACCEPT # iptables -I INPUT 1 -p tcp --dport 111 -j ACCEPT
-
NFS エクスポートとディレクトリーは、ターゲット Pod からアクセスできるようにセットアップされる必要があります。この場合、エクスポートをコンテナーのプライマリー UID で所有されるように設定するか、または上記の「グループ ID」で説明したように、
supplementalGroups
を使用して Pod にグループアクセスを付与します。Pod のセキュリティーに関する追加情報は、「ボリュームのセキュリティー」のトピックを参照してください。
24.2.5. リソースの回収
NFS は OpenShift Container Platform の再利用可能な プラグインインターフェースを実装します。回収タスクは、それぞれの永続ボリュームに設定されるポリシーに基づいて自動プロセスによって処理されます。
デフォルトでは、PV は Retain に設定されます。Recycle に設定される NFS ボリュームは、要求からの解放後 (このボリュームにバインドされるユーザーの PersistentVolumeClaim
の削除後) に除去されます ( rm -rf
がこのボリュームで実行されます)。リサイクルされた NFS ボリュームは新規の要求にバインドさせることができます。
PV への要求が解除される (PVC が削除される) と、PV オブジェクトは再利用できません。代わりに、新規の PV が元のボリュームと同じ基本ボリューム情報を使って作成されます。
たとえば、管理者は nfs1
という名前の PV を作成するとします。
apiVersion: v1 kind: PersistentVolume metadata: name: nfs1 spec: capacity: storage: 1Mi accessModes: - ReadWriteMany nfs: server: 192.168.1.1 path: "/"
ユーザーは、nfs1
にバインドされる PVC1
を作成します。次にユーザーは PVC1
を削除し、nfs1
への要求を解除します。これにより、nfs1
は Released
になります。管理者が同じ NFS 共有を利用可能にする必要がある場合には、同じ NFS サーバー情報を使って新規 PV を作成する必要があります。この場合、PV の名前は元の名前とは異なる名前にします。
apiVersion: v1 kind: PersistentVolume metadata: name: nfs2 spec: capacity: storage: 1Mi accessModes: - ReadWriteMany nfs: server: 192.168.1.1 path: "/"
元の PV を削除して、PV を同じ名前で再作成することは推奨されません。PV のステータスを Released
から Available
に手動で変更しようとすると、エラーが発生しデータが失われる可能性があります。
Recycle
の保持ポリシーを持つ PV はデータを除去 (rm -rf
を実行) し、要求について Available
というマークを付けます。Recycle
の保持ポリシーは、OpenShift Container Platform 3.6 以降で非推奨となっています。Recycler を利用しているユーザーは、代わりに動的プロビジョニングとボリュームの削除機能を使用してください。
24.2.6. 自動化
クラスターは、NFS を使用している永続ストレージを使って以下の方法でプロビジョニングすることができます。
- ディスクパーティションを使ってストレージクォータを実施する。
- 要求を持つプロジェクトにボリュームを制限してセキュリティーを実施する。
- 破棄されたリソースの回収を各 PV に設定する。
スクリプトを使って上記タスクを自動化する方法は多数あります。まずは Ansible Playbook のサンプルを使用して開始することができます。
24.2.7. その他の設定とトラブルシューティング
適切なエクスポートとセキュリティーマッピングを行うため、使用している NFS のバージョンおよびその設定方法に応じて追加の設定が必要になることがあります。以下は例になります。
NFSv4 のマウントにすべてのファイルの所有者が nobody:nobody と誤って表示される。 |
|
NFSv4 の ID マッピングが無効になっている |
|
24.3. Red Hat Gluster Storage を使用する永続ストレージ
24.3.1. 概要
Red Hat Gluster Storage は、OpenShift Container Platform の永続ストレージと動的プロビジョニングを提供するように設定でき、OpenShift Container Platform 内のコンテナー化ストレージ (Container-Native Storage) としても、独自のノード上の非コンテナー化ストレージ (Container-Ready Storage) としても使用できます。
24.3.1.1. Container-Native Storage
Red Hat Gluster Storage は、Container-Native Storage を使って、コンテナー化されたディレクトリーを OpenShift Container Platform ノードで実行します。それにより、コンピュートおよびストレージインスタンスをスケジュールでき、同じハードウェアのセットから実行することができます。
図24.1 アーキテクチャー: Container-Native Storage
Container-Native Storage は Red Hat Gluster Storage 3.1 update 3 より利用能になっています。詳細については、「Container-Native Storage for OpenShift Container Platform」を参照してください。
24.3.1.2. Container-Ready Storage
Container-Ready Storage を使用することで、Red Hat Gluster Storage は独自の専用ノードで実行され、GlusterFS のボリューム管理 REST サービスの heketi のインスタンスによって管理されます。heketi サービスは、スタンドアロンまたはコンテナー化のいずれかで実行できます。コンテナー化の場合、簡単なメカニズムで高可用性をサービスに提供できます。ここでは、heketi をコンテナー化した場合の設定に焦点を当てます。
24.3.1.3. スタンドアロンの Red Hat Gluster Storage
スタンドアロンの Red Hat Gluster Storage クラスターが環境で使用できる場合、OpenShift Container Platform の GlusterFS ボリュームプラグインを使用してそのクラスター上でボリュームを使用することができます。この方法は、アプリケーションが専用のコンピュートノード、OpenShift Container Platform クラスターで実行され、ストレージはその専用ノードから提供される従来のデプロイメントです。
図24.2 アーキテクチャー: OpenShift Container Platform の GlusterFS ボリュームプラグインを使用したスタンドアロンの Red Hat Gluster Storage クラスター
Red Hat Gluster Storage の詳細については、『Red Hat Gluster Storage Installation Guide』および『Red Hat Gluster Storage Administration Guide』を参照してください。
インフラストラクチャーにおけるストレージの高可用性は、基礎となるストレージのプロバイダーに委ねられています。
24.3.1.4. GlusterFS ボリューム
GlusterFS ボリュームは、POSIX に準拠したファイルシステムを提供し、クラスター上の 1 つ以上のノードにまたがる 1 つ以上の「ブリック」から構成されます。このブリックは所定のストレージノード上のディレクトリーであり、一般的にブロックストレージデバイスのマウントポイントになります。GlusterFS はボリュームの設定に応じて、所定のボリュームのブリック間でファイルの分散および複製を処理します。
heketi は、ボリューム管理において、作成、削除、サイズ変更といった一般的な操作に使用することが推奨されます。OpenShift Container Platform は、GlusterFS プロビジョナーを使用する際に heketi が存在していることを前提としています。heketi はデフォルトで、レプリカ数が 3 のボリュームを作成します。このボリュームの各ファイルには 3 つの異なるノードをまたがる 3 つのコピーがあります。したがって、heketi が使用する Red Hat Gluster Storage クラスターでは 3 つ以上のノードを利用可能にすることが推奨されます。
GlusterFS ボリュームに使用可能な機能は多数ありますが、これらについては本書では扱いません。
24.3.1.5. gluster-block ボリューム
gluster-block ボリュームは、iSCSI 上にマウントすることが可能なボリュームです。既存の GlusterFS ボリュームにファイルを作成し、そのファイルをブロックデバイスとして iSCSI ターゲットを介して提供することでマウントできます。このような GlusterFS ボリュームは、ブロックホスティングボリュームと呼ばれます。
gluster-block ボリュームにはトレードオフもあります。iSCSI ターゲットとして使用される場合、複数のノード/クライアントでマウントできる GlusterFS ボリュームとは対照的に、gluster-block ボリュームをマウントできるのは 1 回に 1 つのノード/クライアントのみです。ただし、バックエンドのファイルであるため、GlusterFS ボリュームでは一般にコストのかかる操作 (メタデータの参照など) を、GlusterFS ボリュームでの一般的により高速な操作 (読み取り、書き込みなど) に変換することが可能です。それにより、特定の負荷に対するパフォーマンスを大幅に改善できる可能性があります。
現時点では、gluster-block ボリュームは OpenShift ロギングと OpenShift メトリクスストレージにのみを使用することが推奨されます。
24.3.1.6. Gluster S3 ストレージ
Gluster S3 サービスは、ユーザーアプリケーションが S3 インターフェースを介して GlusterFS ストレージへアクセスすることを可能にします。このサービスは GlusterFS の、オブジェクトデータ用とオブジェクトメタデータ用の 2 つのボリュームにバインドされ、受信する S3 REST 要求をボリューム上のファイルシステム操作に変換します。このサービスは OpenShift Container Platform 内の Pod として実行することが推奨されます。
現時点では、Gluster S3 サービスの使用およびインストールはテクノロジープレビューの段階にあります。
24.3.2. 考慮事項
このセクションでは、Red Hat Gluster Storage を OpenShift Container Platform で使用する際に考慮すべきトピックについて取り上げます。
24.3.2.1. ソフトウェア要件
GlusterFS ボリュームにアクセスするには、すべてのスケジュール可能なノードで mount.glusterfs
コマンドを利用できる必要があります。RPM ベースのシステムの場合は、glusterfs-fuse パッケージがインストールされている必要があります。
# yum install glusterfs-fuse
このパッケージはすべての RHEL システムにインストールされています。ただし、Red Hat Gluster Storage の最新バージョンにアップデートすることを推奨します。そのためには、以下の RPM リポジトリーを有効にする必要があります。
# subscription-manager repos --enable=rh-gluster-3-client-for-rhel-7-server-rpms
glusterfs-fuse がノードにすでにインストールされている場合、最新バージョンがインストールされていることを確認します。
# yum update glusterfs-fuse
24.3.2.2. ハードウェア要件
Container-Native Storage または Container-Ready Storage クラスターで使用されるノードは、ストレージノードとみなされます。ストレージノードは異なるクラスターグループに分けられますが、単一ノードは複数のグループに属することはできません。ストレージノードの各グループについては、以下が当てはまります。
- 1 グループあたり 3 つ以上のストレージノードが必要です。
各ストレージノードには 8 GB 以上の RAM が必要です。これにより、Red Hat Gluster Storage Pod、その他のアプリケーションおよび基礎となる OS を実行できます。
- 各 GlusterFS ボリュームはストレージクラスターにあるすべてのストレージノードのメモリー (約 30 MB) も消費します。RAM の合計量は、コンカレントボリュームがいくつ求められているか、またはいくつ予想されるかによって決める必要があります。
各ストレージノードには、現在のデータまたはメタデータを含まない 1 つ以上の raw ブロックデバイスが必要です。それらのブロックデバイス全体は GlusterFS ストレージで使用されます。以下が存在しないことを確認してください。
- パーティションテーブル (GPT または MSDOS)
- ファイルシステムまたは未処理のファイルシステムの署名
- 以前のボリュームグループの LVM2 署名および論理ボリューム
- LVM2 物理ボリュームの LVM2 メタデータ
不確かな場合には、
wipefs -a <device>
で上記のすべてを消去する必要があります。
2 つのクラスター、つまりインフラストラクチャーアプリケーション (OpenShift Container レジストリーなど) のストレージ専用のクラスターと一般的なアプリケーションのストレージ専用のクラスターについて計画することをお勧めします。これには、合計で 6 つのストレージノードが必要となりますが、この設定は I/O およびボリューム作成のパフォーマンスへの潜在的な影響を回避するために推奨されます。
24.3.2.3. ストレージのサイジング
GlusterFS クラスターは、そのストレージを利用するアプリケーションの予想されるニーズに基づいてサイズを決定する必要があります。たとえば、OpenShift ロギングと OpenShift メトリクスの両方に適用できるサイジングについてのガイドを参照できます。
その他考慮すべき事項:
Container-Native Storage または Container-Ready Storage クラスターでは、デフォルトの動作により 3 通りのレプリケーションを持つ GlusterFS ボリュームが作成されます。そのため、合計のストレージの計画を立てる際には、必要な容量の 3 倍にする必要があります。
-
例として、各 heketi インスタンスは 2 GB の
heketidbstorage
ボリュームを作成する場合、ストレージクラスター内の 3 つのノードに合計で 6 GB の raw ストレージが必要になります。この容量は常に必要となり、これをサイジングの際に考慮する必要があります。 - 統合 OpenShift Container レジストリーなどのアプリケーションでは、GlusterFS の単一ボリュームがアプリケーションの複数インスタンスで共有されます。
-
例として、各 heketi インスタンスは 2 GB の
gluster-block ボリュームを使用する場合は、所定のブロックのボリューム容量をフルサイズで保持するための十分な容量を備えた GlusterFS ブロックホスティングボリュームがなければなりません。
- デフォルトでは、このようなブロックホスティングボリュームが存在しない場合、これが設定されたサイズで自動的に 1 つ作成されます。デフォルトのサイズは 100 GB です。クラスター内に新しいブロックホスティングボリュームを作成するための十分なスペースがない場合、ブロックボリュームの作成は失敗します。自動作成の動作、および自動作成されるボリュームのサイズはどちらも設定することが可能です。
- OpenShift ロギングや OpenShift メトリクスなどの gluster-block ボリュームを使用する複数のインスタンスを持つアプリケーションは、各インスタンスにつき 1 つのボリュームを使用します。
- Gluster S3 サービスは、2 つの GlusterFS ボリュームにバインドされます。通常インストーラー (Advanced Installer) を使用したデフォルトのインストールでは、ボリュームはそれぞれ 1 GB となり、合計 6 GB の raw ストレージを使用します。
24.3.2.4. ボリューム操作の動作
作成や削除などのボリューム操作は、さまざまな環境条件の影響を受けることもあれば、アプリケーションに影響を与えることもあります。
アプリケーション Pod が動的にプロビジョニングされた GlusterFS の Persistent Volume Claim (永続ボリューム要求、PVC) を要求する場合は、ボリュームの作成と対応する PVC へのバインドにかかる追加の時間を考慮する必要があります。これはアプリケーション Pod の起動時間に影響します。
注記GlusterFS ボリュームの作成時間は、ボリュームの数に応じて直線的に増加します。たとえば、クラスター内に推奨されるハードウェア仕様を使用する 100 のボリュームがある場合、各ボリュームの作成、割り当て、Pod へのバインドに約 6 秒の時間がかかりました。
PVC が削除されると、基礎となる GlusterFS ボリュームの削除がトリガーされます。PVC は
oc get pvc
の出力からすぐに消えますが、ボリュームが完全に削除される訳ではありません。GlusterFS ボリュームは、heketi-cli volume list
およびgluster volume list
のコマンドライン出力に表示されなくなったときにのみ削除されていると見なされます。注記GlusterF ボリュームの削除とそのストレージのリサイクルの時間は、アクティブな GlusterFS ボリュームの数に応じて直線的に増加します。保留中のボリューム削除は実行中のアプリケーションに影響しませんが、ストレージ管理者は、とくにリソース消費を大きな規模で調整している場合には、ボリュームの削除にかかる時間を認識し、それを見積もることができるようにしておく必要があります。
24.3.2.5. ボリュームのセキュリティー
このセクションでは、Portable Operating System Interface [Unix 向け] (POSIX) パーミッションや SELinux に関する考慮事項を含む、Red Hat Gluster Storage ボリュームのセキュリティーについて説明します。ボリュームのセキュリティー、POSIX パーミッションおよび SELinux に関する基本を理解していることを前提とします。
24.3.2.5.1. POSIX パーミッション
Red Hat Gluster Storage ボリュームは POSIX 準拠のファイルシステムを表します。そのため、chmod や chown などの標準コマンドラインツールを使用してアクセスパーミッションを管理できます。
Container-Native Storage と Container-Ready Storage では、ボリュームの作成時にボリュームのルートを所有するグループ ID を指定することもできます。静的プロビジョニングの場合、これは heketi-cli ボリューム作成コマンドの一部として指定されます。
$ heketi-cli volume create --size=100 --gid=10001000
このボリュームに関連付けられる PersistentVolume には、PersistentVolume を使用する Pod がファイルシステムにアクセスできるように、グループ ID をアノテーションとして付加する必要があります。このアノテーションは以下の形式で指定します。
pv.beta.kubernetes.io/gid: "<GID>" ---
動的プロビジョニングの場合は、プロビジョナーがグループ ID を自動的に生成し、これを適用します。gidMin および gidMax StorageClass パラメーターを使用してこのグループ ID の選択範囲を制御できます (「動的プロビジョニング」を参照してください)。プロビジョナーは、生成される PersistentVolume にグループ ID をアノテーションとして付ける処理も行います。
24.3.2.5.2. SELinux
デフォルトでは、SELinux は Pod からリモート Red Hat Gluster Storage サーバーへの書き込みを許可しません。SELinux が有効な状態で Red Hat Gluster Storage ボリュームへの書き込みを有効にするには、GlusterFS を実行する各ノードで以下のコマンドを実行します。
$ sudo setsebool -P virt_sandbox_use_fusefs on 1
$ sudo setsebool -P virt_use_fusefs on
- 1
-P
オプションを使用すると、再起動した後もブール値が永続化されます。
virt_sandbox_use_fusefs
ブール値は、docker-selinux パッケージによって定義されます。このブール値が定義されていないというエラーが表示される場合は、このパッケージがインストールされていることを確認してください。
Atomic Host を使用している場合に、Atomic Host をアップグレードすると、SELinux のブール値が消去されるので、Atomic Host をアップグレードする場合には、これらのブール値を設定し直す必要があります。
24.3.3. サポート要件
Red Hat Gluster Storage と OpenShift Container Platform のサポートされる統合を作成するには、以下の要件が満たされている必要があります。
Container-Ready Storage または スタンドアロンの Red Hat Gluster Storage の場合:
- 最小バージョン: Red Hat Gluster Storage 3.1.3
- すべての Red Hat Gluster Storage ノードに Red Hat Network チャンネルとサブスクリプションマネージャーリポジトリーへの有効なサブスクリプションが必要です。
- Red Hat Gluster Storage ノードは、「Planning Red Hat Gluster Storage Installation」に記載されている要件に準拠している必要があります。
- Red Hat Gluster Storage ノードは、最新のパッチとアップグレードが適用された完全に最新の状態でなければなりません。最新バージョンへのアップグレードについては、『Red Hat Gluster Storage Installation Guide』を参照してください。
- 各 Red Hat Gluster Storage ノードには、完全修飾ドメイン名 (FQDN) が設定されている必要があります。適切な DNS レコードが存在すること、および FQDN が正引きと逆引きの両方の DNS ルックアップで解決できることを確認してください。
24.3.4. インストール
スタンドアロンの Red Hat Gluster Storage の場合、OpenShift Container Platform で使用するためにインストールする必要があるコンポーネントはありません。OpenShift Container Platform には組み込み GlusterFS ボリュームドライバーが付属しており、これを使用して既存のボリュームを既存のクラスターで活用できます。既存のボリュームの使用方法については、「プロビジョニング」を参照してください。
Container-Native Storage および Container-Ready Storage の場合は、通常インストーラー (Advanced Installer) を使用して必要なコンポーネントをインストールすることを推奨します。
24.3.4.1. Container-Ready Storage: Red Hat Gluster Storage ノードのインストール
Container-Ready Storage の場合は、Red Hat Gluster Storage ノードに適切なシステム設定 (ファイアウォールポートやカーネルモジュールなど) が設定されており、Red Hat Gluster Storage サービスが実行されている必要があります。このサービスは追加で設定できず、Trusted Storage Pool を作成することはできません。
Red Hat Gluster Storage ノードのインストールは本書の対象外です。詳細については、「Setting Up Container-Ready Storage」を参照してください。
24.3.4.2. 通常インストーラー (Advanced Installer) の使用
通常インストーラー (Advanced Installer) を使用すると、以下の 2 つの GlusterFS ノードグループのいずれかまたは両方をインストールできます。
-
glusterfs
: ユーザーアプリケーション用の汎用ストレージクラスター。 -
glusterfs-registry
: 統合 OpenShift Container レジストリーなどのインフラストラクチャーアプリケーション用の専用ストレージクラスター。
I/O およびボリューム作成のパフォーマンスに対する潜在的影響を回避するため、両方のグループをデプロイすることを推奨します。これらはどちらもインベントリーホストファイルで定義されます。
クラスターを定義するには、[OSEv3:children]
グループに該当する名前を追加し、類似した名前付きグループを作成して、グループにノード情報を設定します。その後、[OSEv3:vars]
グループのさまざまな変数を使用してクラスターを定義できます。glusterfs
変数は openshift_storage_glusterfs_
から、glusterfs-registry
変数は openshift_storage_glusterfs_registry_
からそれぞれ始まります。openshift_hosted_registry_storage_kind
などのその他のいくつかの変数は GlusterFS クラスターと対話します。
すべてのコンテナー化されたコンポーネントにバージョンタグを指定することが推奨されています。この主な目的は、コンポーネント (とくに Red Hat Gluster Storage Pod) が停止後にアップグレードされ、その結果、クラスター内にさまざまなソフトウェアバージョンが混在する状態になることを防止することです。該当する変数は以下の通りです。
-
openshift_storage_glusterfs_version
-
openshift_storage_glusterfs_block_version
-
openshift_storage_glusterfs_s3_version
-
openshift_storage_glusterfs_heketi_version
-
openshift_storage_glusterfs_registry_version
-
openshift_storage_glusterfs_registry_block_version
-
openshift_storage_glusterfs_registry_s3_version
-
openshift_storage_glusterfs_registry_heketi_version
変数の詳細な一覧については、GitHub の GlusterFS ロールに関する README を参照してください。
変数を設定したら、インストールの環境に応じていくつかの Playbook が利用可能になります。
通常インストーラー (Advanced Installer) のメイン Playbook を使用すると、OpenShift Container Platform の初期インストールと並行して GlusterFS クラスターをデプロイできます。
- これには、GlusterFS ストレージを使用する統合 OpenShift Container レジストリーのデプロイが含まれます。
- OpenShift ロギングや OpenShift メトリクスは含まれません。現時点では、これは別の手順で扱われるためです。詳細については、「OpenShift ロギングおよびメトリクス用の Container-Native Storage」を参照してください。
-
playbooks/openshift-glusterfs/config.yml
を使用して、クラスターを既存の OpenShift Container Platform インストールにデプロイできます。 playbooks/openshift-glusterfs/registry.yml
を使用して、クラスターを既存の OpenShift Container Platform インストールにデプロイできます。さらに、GlusterFS ストレージを使用する統合 OpenShift Container レジストリーもデプロイされます。重要OpenShift Container Platform クラスターに既存のレジストリーがない状態でなければなりません。
playbooks/openshift-glusterfs/uninstall.yml
を使用して、インベントリーホストファイルの設定に一致する既存のクラスターを削除できます。これは、設定エラーによってデプロイメントが失敗した場合に OpenShift Container Platform 環境をクリーンアップするのに便利です。注記GlusterFS Playbook は必ずしも常にべき等である訳ではありません。
注記GlusterFS インストール全体 (ディスクデータを含む) を削除してインストールし直すことなく、特定のインストールに対して Playbook を複数回実行することは、現在はサポートされていません。
24.3.4.2.1. 例: 基本的な Container-Native Storage インストール
インベントリーファイルの
[OSEv3:children]
セクションにglusterfs
を追加して、[glusterfs]
グループを有効にします。[OSEv3:children] masters nodes glusterfs
GlusterFS ストレージをホストする各ストレージノードのエントリーを含む
[glusterfs]
セクションを追加します。ノードごとに、glusterfs_devices
を GlusterFS クラスターの一部として完全に管理される raw ブロックデバイスの一覧に設定します。少なくとも 1 つのデバイスを一覧に含める必要があります。各デバイスは、パーティションや LVM PV がないベアでなければなりません。変数は以下の形式で指定します。<hostname_or_ip> glusterfs_devices='[ "</path/to/device1/>", "</path/to/device2>", ... ]'
例を以下に示します。
[glusterfs] node11.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node12.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node13.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]'
[glusterfs]
の下に一覧表示されているホストを[nodes]
グループに追加します。[nodes] ... node11.example.com openshift_schedulable=True node12.example.com openshift_schedulable=True node13.example.com openshift_schedulable=True
24.3.4.2.2. 例: 基本的な Container-Ready Storage インストール
インベントリーファイルの
[OSEv3:children]
セクションにglusterfs
を追加して、[glusterfs]
グループを有効にします。[OSEv3:children] masters nodes glusterfs
以下の変数を
[OSEv3:vars]
セクションに追加し、お使いの設定に応じて調整します。[OSEv3:vars] ... openshift_storage_glusterfs_is_native=false openshift_storage_glusterfs_storageclass=true openshift_storage_glusterfs_heketi_is_native=true openshift_storage_glusterfs_heketi_executor=ssh openshift_storage_glusterfs_heketi_ssh_port=22 openshift_storage_glusterfs_heketi_ssh_user=root openshift_storage_glusterfs_heketi_ssh_sudo=false openshift_storage_glusterfs_heketi_ssh_keyfile="/root/.ssh/id_rsa"
GlusterFS ストレージをホストする各ストレージノードのエントリーを含む
[glusterfs]
セクションを追加します。ノードごとに、glusterfs_devices
を GlusterFS クラスターの一部として完全に管理される raw ブロックデバイスの一覧に設定します。少なくと も 1 つのデバイスを一覧に含める必要があります。各デバイスはパーティションや LVM PV がないベアでなければなりません。また、glusterfs_ip
をノードの IP アドレスに設定します。変数は以下の形式で指定します。<hostname_or_ip> glusterfs_ip=<ip_address> glusterfs_devices='[ "</path/to/device1/>", "</path/to/device2>", ... ]'
例を以下に示します。
[glusterfs] gluster1.example.com glusterfs_ip=192.168.10.11 glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' gluster2.example.com glusterfs_ip=192.168.10.12 glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' gluster3.example.com glusterfs_ip=192.168.10.13 glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]'
24.3.4.2.3. 例: 統合 OpenShift Container レジストリーを含む Container-Native Storage インストール
インベントリーファイルの
[OSEv3:vars]
に次の変数を追加します。[OSEv3:vars] ... openshift_hosted_registry_storage_kind=glusterfs
[OSEv3:children]
セクションにglusterfs_registry
を追加して、[glusterfs_registry]
グループを有効にします。[OSEv3:children] masters nodes glusterfs_registry
GlusterFS ストレージをホストする各ストレージノードのエントリーを含む
[glusterfs_registry]
セクションを追加します。ノードごとに、glusterfs_devices
を GlusterFS クラスターの一部として完全に管理される raw ブロックデバイスの一覧に設定します。少なくとも 1 つのデバイスを一覧に含める必要があります。各デバイスはパーティションや LVM PV がないベアでなければなりません。変数は次の形式で指定します。<hostname_or_ip> glusterfs_devices='[ "</path/to/device1/>", "</path/to/device2>", ... ]'
例を以下に示します。
[glusterfs_registry] node11.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node12.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node13.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]'
[glusterfs_registry]
の下に一覧表示されているホストを[nodes]
グループに追加します。[nodes] ... node11.example.com openshift_schedulable=True node12.example.com openshift_schedulable=True node13.example.com openshift_schedulable=True
24.3.4.2.4. 例: OpenShift ロギングおよびメトリクス用の Container-Native Storage
インベントリーファイルで、以下の変数を
[OSEv3:vars]
に設定します。[OSEv3:vars] ... openshift_metrics_hawkular_nodeselector={"role":"infra"} 1 openshift_metrics_cassandra_nodeselector={"role":"infra"} 2 openshift_metrics_heapster_nodeselector={"role":"infra"} 3 openshift_metrics_storage_kind=dynamic openshift_metrics_cassanda_pvc_storage_class_name="glusterfs-registry-block" 4 openshift_logging_es_nodeselector={"role":"infra"} 5 openshift_logging_kibana_nodeselector={"role":"infra"} 6 openshift_logging_curator_nodeselector={"role":"infra"} 7 openshift_logging_storage_kind=dynamic openshift_logging_es_pvc_size=10Gi 8 openshift_logging_es_pvc_storage_class_name="glusterfs-registry-block" 9 openshift_storage_glusterfs_registry_block_deploy=true openshift_storage_glusterfs_registry_block_host_vol_size=50 openshift_storage_glusterfs_registry_block_storageclass=true openshift_storage_glusterfs_registry_block_storageclass_default=true openshift_storageclass_default=false
- 1 2 3 5 6 7
- 統合 OpenShift Container レジストリー、ロギングおよびメトリクスは、管理者が OpenShift Container Platform クラスターにサービスを提供するためにデプロイしたアプリケーションである「インフラストラクチャー」アプリケーション専用のノードで実行することを推奨します。
- 4 9
- ロギングとメトリクスに使用する StorageClass を指定します。この名前は、ターゲットの GlusterFS クラスター (例:
glusterfs-<name>-block
) 名から生成されます。この例ではregistry
にデフォルト設定されています。 - 8
- OpenShift ロギングでは、PVC のサイズを指定する必要があります。ここで指定される値は単なる例であり、推奨される値ではありません。
注記これらの変数とその他の変数の詳細については、GlusterFS ロールに関する README を参照してください。
[OSEv3:children]
セクションにglusterfs_registry
を追加して、[glusterfs_registry]
グループを有効にします。[OSEv3:children] masters nodes glusterfs_registry
GlusterFS ストレージをホストする各ストレージノードのエントリーを含む
[glusterfs_registry]
セクションを追加します。ノードごとに、glusterfs_devices
を GlusterFS クラスターの一部として完全に管理される raw ブロックデバイスの一覧に設定します。少なくとも 1 つのデバイスを一覧に含める必要があります。各デバイスはパーティションや LVM PV がないベアでなければなりません。変数は次の形式で指定します。<hostname_or_ip> glusterfs_devices='[ "</path/to/device1/>", "</path/to/device2>", ... ]'
例を以下に示します。
[glusterfs_registry] node11.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node12.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node13.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]'
[glusterfs_registry]
の下に一覧表示されているホストを[nodes]
グループに追加します。[nodes] ... node11.example.com openshift_schedulable=True node12.example.com openshift_schedulable=True node13.example.com openshift_schedulable=True
通常インストーラー (Advanced Installer) を実行します。これは以下のように OpenShift Container Platform の初期インストールの一部として実行できます。
ansible-playbook -i <path_to_inventory_file> /usr/share/ansible/openshift-ansible/playbooks/prerequisites.yml ansible-playbook -i <path_to_inventory_file> /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
または、以下のようにブラウンフィールドで実行することができます。
ansible-playbook -i <path_to_inventory_file> /usr/share/ansible/openshift-ansible/playbooks/openshift-glusterfs/config.yml
24.3.4.2.5. 例: アプリケーション、レジストリー、ロギング、およびメトリクス用の Container-Native Storage
インベントリーファイルで、以下の変数を
[OSEv3:vars]
に設定します。[OSEv3:vars] ... openshift_registry_selector="role=infra" 1 openshift_hosted_registry_storage_kind=glusterfs openshift_metrics_hawkular_nodeselector={"role":"infra"} 2 openshift_metrics_cassandra_nodeselector={"role":"infra"} 3 openshift_metrics_heapster_nodeselector={"role":"infra"} 4 openshift_metrics_storage_kind=dynamic openshift_metrics_cassanda_pvc_storage_class_name="glusterfs-registry-block" 5 openshift_logging_es_nodeselector={"role":"infra"} 6 openshift_logging_kibana_nodeselector={"role":"infra"} 7 openshift_logging_curator_nodeselector={"role":"infra"} 8 openshift_logging_storage_kind=dynamic openshift_logging_es_pvc_size=10Gi 9 openshift_logging_es_pvc_storage_class_name="glusterfs-registry-block" 10 openshift_storage_glusterfs_block_deploy=false openshift_storage_glusterfs_registry_block_deploy=true openshift_storage_glusterfs_registry_block_storageclass=true openshift_storage_glusterfs_registry_block_storageclass_default=false
- 1 2 3 4 6 7 8
- 統合 OpenShift Container レジストリー、ロギングおよびメトリクスをインフラストラクチャーノードで実行することが推奨されます。インフラストラクチャーノードは、OpenShift Container Platform クラスターのサービスを提供するために管理者がデプロイするアプリケーションを実行する専用ノードです。
- 5 10
- ロギングとメトリクスに使用する StorageClass を指定します。この名前は、ターゲットの GlusterFS クラスター (例:
glusterfs-<name>-block
) 名から生成されます。この例では<name>
はregistry
にデフォルト設定されています。 - 9
- OpenShift ロギングでは、PVC サイズを指定する必要があります。ここで指定される値は単なる例であり、推奨される値ではありません。
[OSEv3:children]
セクションにglusterfs
とglusterfs_registry
を追加し、[glusterfs]
グループと[glusterfs_registry]
グループを有効にします。[OSEv3:children] ... glusterfs glusterfs_registry
[glusterfs]
セクションと[glusterfs_registry]
セクションを追加し、両セクションに GlusterFS ストレージをホストするストレージノードを入力します。ノードごとにglusterfs_devices
を、GlusterFS クラスターの一部として完全に管理される raw ブロックデバイスの一覧に設定します。少なくとも 1 つのデバイスを一覧に含める必要があります。各デバイスは、パーティションや LVM PV がないベアでなければなりません。変数は以下の形式で指定します。<hostname_or_ip> glusterfs_devices='[ "</path/to/device1/>", "</path/to/device2>", ... ]'
例を以下に示します。
[glusterfs] node11.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node12.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node13.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' [glusterfs_registry] node14.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node15.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' node16.example.com glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]'
[glusterfs]
と[glusterfs_registry]
に一覧表示されているホストを[nodes]
グループに追加します。[nodes] ... node11.example.com openshift_schedulable=True openshift_node_labels="{'role': 'app'}" 1 node12.example.com openshift_schedulable=True openshift_node_labels="{'role': 'app'}" 2 node13.example.com openshift_schedulable=True openshift_node_labels="{'role': 'app'}" 3 node14.example.com openshift_schedulable=True openshift_node_labels="{'role': 'infra'}" 4 node15.example.com openshift_schedulable=True openshift_node_labels="{'role': 'infra'}" 5 node16.example.com openshift_schedulable=True openshift_node_labels="{'role': 'infra'}" 6
通常インストーラー (Advanced Installer) を実行します。
OpenShift Container Platform の初回インストール:
ansible-playbook -i <path_to_inventory_file> /usr/share/ansible/openshift-ansible/playbooks/prerequisites.yml ansible-playbook -i <path_to_inventory_file> /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
既存の OpenShift Container Platform クラスターに対するスタンドアロンのインストール:
ansible-playbook -i <path_to_inventory_file> /usr/share/ansible/openshift-ansible/playbooks/openshift-glusterfs/config.yml
24.3.4.2.6. 例: アプリケーション、レジストリー、ロギング、およびメトリクス用の Container-Ready Storage
インベントリーファイルで、以下の変数を
[OSEv3:vars]
に設定します。[OSEv3:vars] ... openshift_registry_selector="role=infra" 1 openshift_hosted_registry_storage_kind=glusterfs openshift_metrics_hawkular_nodeselector={"role":"infra"} 2 openshift_metrics_cassandra_nodeselector={"role":"infra"} 3 openshift_metrics_heapster_nodeselector={"role":"infra"} 4 openshift_metrics_storage_kind=dynamic openshift_metrics_cassanda_pvc_storage_class_name="glusterfs-registry-block" 5 openshift_logging_es_nodeselector={"role":"infra"} 6 openshift_logging_kibana_nodeselector={"role":"infra"} 7 openshift_logging_curator_nodeselector={"role":"infra"} 8 openshift_logging_storage_kind=dynamic openshift_logging_es_pvc_size=10Gi 9 openshift_logging_es_pvc_storage_class_name="glusterfs-registry-block" 10 openshift_storage_glusterfs_is_native=false openshift_storage_glusterfs_block_deploy=false openshift_storage_glusterfs_storageclass=true openshift_storage_glusterfs_heketi_is_native=true openshift_storage_glusterfs_heketi_executor=ssh openshift_storage_glusterfs_heketi_ssh_port=22 openshift_storage_glusterfs_heketi_ssh_user=root openshift_storage_glusterfs_heketi_ssh_sudo=false openshift_storage_glusterfs_heketi_ssh_keyfile="/root/.ssh/id_rsa" openshift_storage_glusterfs_is_native=false openshift_storage_glusterfs_registry_block_deploy=true openshift_storage_glusterfs_registry_block_storageclass=true openshift_storage_glusterfs_registry_block_storageclass_default=true openshift_storage_glusterfs_registry_heketi_is_native=true openshift_storage_glusterfs_registry_heketi_executor=ssh openshift_storage_glusterfs_registry_heketi_ssh_port=22 openshift_storage_glusterfs_registry_heketi_ssh_user=root openshift_storage_glusterfs_registry_heketi_ssh_sudo=false openshift_storage_glusterfs_registry_heketi_ssh_keyfile="/root/.ssh/id_rsa"
- 1 2 3 4 6 7 8
- 統合 OpenShift Container レジストリーは、管理者が OpenShift Container Platform クラスターにサービスを提供するためにデプロイしたアプリケーションである「インフラストラクチャー」アプリケーション専用のノードで実行することが推奨されます。インフラストラクチャーアプリケーション用のノードは、管理者が選択し、それにラベルを付けます。
- 5 10
- ロギングとメトリクスに使用する StorageClass を指定します。この名前は、ターゲットの GlusterFS クラスター (例:
glusterfs-<name>-block
) 名から生成されます。この例ではregistry
にデフォルト設定されています。 - 9
- OpenShift ロギングでは、PVC のサイズを指定する必要があります。ここで指定される値は単なる例であり、推奨される値ではありません。
[OSEv3:children]
セクションにglusterfs
とglusterfs_registry
を追加し、[glusterfs]
グループと[glusterfs_registry]
グループを有効にします。[OSEv3:children] ... glusterfs glusterfs_registry
[glusterfs]
セクションと[glusterfs_registry]
セクションを追加し、両セクションに GlusterFS ストレージをホストするストレージノードを入力します。ノードごとに、glusterfs_devices
を、GlusterFS クラスターの一部として完全に管理される raw ブロックデバイスの一覧に設定します。少なくと も 1 つのデバイスを一覧に含める必要があります。各デバイスは、パーティションや LVM PV がないベアでなければなりません。また、glusterfs_ip
をノードの IP アドレスに設定します。変数は以下の形式で指定します。<hostname_or_ip> glusterfs_ip=<ip_address> glusterfs_devices='[ "</path/to/device1/>", "</path/to/device2>", ... ]'
例を以下に示します。
[glusterfs] gluster1.example.com glusterfs_ip=192.168.10.11 glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' gluster2.example.com glusterfs_ip=192.168.10.12 glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' gluster3.example.com glusterfs_ip=192.168.10.13 glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' [glusterfs_registry] gluster4.example.com glusterfs_ip=192.168.10.14 glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' gluster5.example.com glusterfs_ip=192.168.10.15 glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]' gluster6.example.com glusterfs_ip=192.168.10.16 glusterfs_devices='[ "/dev/xvdc", "/dev/xvdd" ]'
通常インストーラー (Advanced Installer) を実行します。これは以下のように OpenShift Container Platform の初期インストールの一部として実行できます。
ansible-playbook -i <path_to_inventory_file> /usr/share/ansible/openshift-ansible/playbooks/prerequisites.yml ansible-playbook -i <path_to_inventory_file> /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
または、以下のように既存の OpenShift Container Platform クラスターに対するスタンドアロンの操作として実行することができます。
ansible-playbook -i <path_to_inventory_file> /usr/share/ansible/openshift-ansible/playbooks/openshift-glusterfs/config.yml
24.3.5. Container-Native Storage のアンインストール
Container-Native Storage の場合、OpenShift Container Platform のインストールには、クラスターから全リソースおよびアーティファクトをアンイストールするための Playbook が同梱されています。この Playbook を使用するには、Container-Native Storage のターゲットインスタンスをインストールするのに使用した元のインベントリーファイルを指定して、以下の Playbook を実行します。
# ansible-playbook -i <path_to_inventory_file> /usr/share/ansible/openshift-ansible/playbooks/openshift-glusterfs/uninstall.yml
さらに、Playbook は、openshift_storage_glusterfs_wipe
と呼ばれる変数の使用をサポートします。これは、有効化されている場合には、Red Hat Gluster Storage ブロックデバイス上のデータを破棄します。openshift_storage_glusterfs_wipe
変数を使用するには、以下を実行します。
# ansible-playbook -i <path_to_inventory_file> -e "openshift_storage_glusterfs_wipe=true" /usr/share/ansible/openshift-ansible/playbooks/openshift-glusterfs/uninstall.yml
この手順ではデータが破棄されるので、注意して進めてください。
24.3.6. プロビジョニング
GlusterFS ボリュームは、静的または動的にプロビジョニングできます。静的プロビジョニングは、すべての設定で使用できます。動的プロビジョニングは、Container-Native Storage と Container-Ready Storage のみでサポートされます。
24.3.6.1. 静的プロビジョニング
-
静的プロビジョニングを有効にするには、最初に GlusterFS ボリュームを作成します。
gluster
コマンドラインインターフェースを使用してこれを行う方法については、『Red Hat Gluster Storage Administration Guide』を参照してください。また、heketi-cli
を使用してこれを行う方法については、heketi プロジェクトサイトを参照してください。この例では、ボリュームにmyVol1
という名前を付けます。 gluster-endpoints.yaml
で以下のサービスとエンドポイントを定義します。--- apiVersion: v1 kind: Service metadata: name: glusterfs-cluster 1 spec: ports: - port: 1 --- apiVersion: v1 kind: Endpoints metadata: name: glusterfs-cluster 2 subsets: - addresses: - ip: 192.168.122.221 3 ports: - port: 1 4 - addresses: - ip: 192.168.122.222 5 ports: - port: 1 6 - addresses: - ip: 192.168.122.223 7 ports: - port: 1 8
OpenShift Container Platform マスターホストからサービスとエンドポイントを作成します。
$ oc create -f gluster-endpoints.yaml service "glusterfs-cluster" created endpoints "glusterfs-cluster" created
サービスとエンドポイントが作成されたことを確認します。
$ oc get services NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE glusterfs-cluster 172.30.205.34 <none> 1/TCP <none> 44s $ oc get endpoints NAME ENDPOINTS AGE docker-registry 10.1.0.3:5000 4h glusterfs-cluster 192.168.122.221:1,192.168.122.222:1,192.168.122.223:1 11s kubernetes 172.16.35.3:8443 4d
注記エンドポイントはプロジェクトごとに一意です。GlusterFS にアクセスする各プロジェクトには独自のエンドポイントが必要です。
ボリュームにアクセスするには、ボリューム上のファイルシステムにアクセスできるユーザー ID (UID) またはグループ ID (GID) でコンテナーを実行する必要があります。この情報は以下の方法で取得できます。
$ mkdir -p /mnt/glusterfs/myVol1 $ mount -t glusterfs 192.168.122.221:/myVol1 /mnt/glusterfs/myVol1 $ ls -lnZ /mnt/glusterfs/ drwxrwx---. 592 590 system_u:object_r:fusefs_t:s0 myVol1 1 2
gluster-pv.yaml
で以下の PersistentVolume (PV) を定義します。apiVersion: v1 kind: PersistentVolume metadata: name: gluster-default-volume 1 annotations: pv.beta.kubernetes.io/gid: "590" 2 spec: capacity: storage: 2Gi 3 accessModes: 4 - ReadWriteMany glusterfs: endpoints: glusterfs-cluster 5 path: myVol1 6 readOnly: false persistentVolumeReclaimPolicy: Retain
OpenShift Container Platform マスターホストから PV を作成します。
$ oc create -f gluster-pv.yaml
PV が作成されたことを確認します。
$ oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE gluster-default-volume <none> 2147483648 RWX Available 2s
gluster-claim.yaml
で、新規 PV にバインドする PersistentVolumeClaim (PVC) を作成します。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: gluster-claim 1 spec: accessModes: - ReadWriteMany 2 resources: requests: storage: 1Gi 3
OpenShift Container Platform マスターホストから PVC を作成します。
$ oc create -f gluster-claim.yaml
PV と PVC がバインドされていることを確認します。
$ oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE gluster-pv <none> 1Gi RWX Available gluster-claim 37s $ oc get pvc NAME LABELS STATUS VOLUME CAPACITY ACCESSMODES AGE gluster-claim <none> Bound gluster-pv 1Gi RWX 24s
PVC はプロジェクトごとに一意です。GlusterFS ボリュームにアクセスする各プロジェクトには独自の PVC が必要です。PV は単一のプロジェクトにバインドされないため、複数のプロジェクトにまたがる PVC が同じ PV を参照する場合があります。
24.3.6.2. 動的プロビジョニング
動的プロビジョニングを有効にするには、最初に
StorageClass
オブジェクト定義を作成します。以下の定義は、OpenShift Container Platform でこの例を使用するために必要な最小要件に基づいています。その他のパラメーターと仕様定義については、「動的プロビジョニングとストレージクラスの作成」を参照してください。kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: glusterfs provisioner: kubernetes.io/glusterfs parameters: resturl: "http://10.42.0.0:8080" 1 restauthenabled: "false" 2
OpenShift Container Platform マスターホストから StorageClass を作成します。
# oc create -f gluster-storage-class.yaml storageclass "glusterfs" created
新たに作成される StorageClass を使用して PVC を作成します。以下は例になります。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: gluster1 spec: accessModes: - ReadWriteMany resources: requests: storage: 30Gi storageClassName: glusterfs
OpenShift Container Platform マスターホストから PVC を作成します。
# oc create -f glusterfs-dyn-pvc.yaml persistentvolumeclaim "gluster1" created
PVC を表示し、ボリュームが動的に作成され、PVC にバインドされていることを確認します。
# oc get pvc NAME STATUS VOLUME CAPACITY ACCESSMODES STORAGECLASS AGE gluster1 Bound pvc-78852230-d8e2-11e6-a3fa-0800279cf26f 30Gi RWX gluster-dyn 42s
24.4. OpenStack Cinder を使用した永続ストレージ
24.4.1. 概要
OpenStack Cinder を使用して、OpenShift Container Platform クラスターに永続ストレージをプロビジョニングできます。これには、Kubernetes と OpenStack についてある程度の理解があることが前提となります。
Cinder を使用して永続ボリューム (PV) を作成する前に、「OpenStack 向けに OpenShft Container Platform を設定」してください。
Kubernetes の 永続ボリュームフレームワークは、管理者がクラスターに永続ストレージをプロビジョニングできるようにします。ユーザーが基礎となるインフラストラクチャーの知識がなくてもこれらのリソースを要求できるようにします。OpenStack Cinder ボリュームを動的にプロビジョニングできます。
永続ボリュームは、単一のプロジェクトまたは namespace にバインドされず、OpenShift Container Platform クラスター全体で共有できます。ただし、Persistent Volume Claim (永続ボリューム要求) は、プロジェクトまたは namespace に固有で、ユーザーが要求できます。
インフラストラクチャーにおけるストレージの高可用性は、基礎となるストレージのプロバイダーに委ねられています。
24.4.2. Cinder PV のプロビジョニング
OpenShift Container Platform でストレージをボリュームとしてマウントするには、ストレージが基礎となるインフラストラクチャーに存在している必要があります。OpenShift Container Platform が OpenStack 用に設定されていることを確認した後、Cinder に必要なのは、Cinder ボリューム ID と PersistentVolume
API のみになります。
24.4.2.1. 永続ボリュームの作成
Cinder では、「リサイクル」回収ポリシーはサポートされません。
OpenShift Container Platform に PV を作成する前に、PV をオブジェクト定義に定義する必要があります。
オブジェクト定義を cinder-pv.yaml などのファイルに保存します。
apiVersion: "v1" kind: "PersistentVolume" metadata: name: "pv0001" 1 spec: capacity: storage: "5Gi" 2 accessModes: - "ReadWriteOnce" cinder: 3 fsType: "ext3" 4 volumeID: "f37a03aa-6212-4c62-a805-9ce139fab180" 5
重要ボリュームをフォーマットしてプロビジョニングした後には、
fstype
パラメーターの値は変更しないでください。この値を経脳すると、データの損失や、Pod の障害につながる可能性があります。永続ボリュームを作成します。
# oc create -f cinder-pv.yaml persistentvolume "pv0001" created
永続ボリュームの存在を確認します。
# oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE pv0001 <none> 5Gi RWO Available 2s
次に、ユーザーは Persistent Volume Claim (永続ボリューム要求) を使用してストレージを要求し、この新規の永続ボリュームを活用できます。
Persistent Volume Claim (永続ボリューム要求) は、ユーザーの namespace にのみ存在し、同じ namespace 内の Pod からしか参照できません。別の namespace から永続ボリューム要求にアクセスしようとすると、Pod にエラーが発生します。
24.4.2.2. Cinder の PV 形式
OpenShift Container Platform は、ボリュームをマウントしてコンテナーに渡す前に、永続ボリューム定義の fsType
パラメーターで指定されたファイルシステムがボリュームにあるかどうか確認します。デバイスが指定されたファイルシステムでフォーマットされていない場合、デバイスのデータはすべて消去され、デバイスはそのファイルシステムで自動的にフォーマットされます。
これにより、OpenShift Container Platform がフォーマットされていない Cinder ボリュームを初回の使用前にフォーマットするため、それらを永続ボリュームとして使用することが可能になります。
24.4.2.3. Cinder ボリュームのセキュリティー
お使いのアプリケーションで Cinder PV を使用する場合に、そのデプロイメント設定にセキュリティーを追加します。
Cinder ボリュームを実装する前に、ボリュームのセキュリティーを確認します。
-
適切な
fsGroup
ストラテジーを使用する SCC を作成します。 サービスアカウントを作成して、そのアカウントを SCC に追加します。
[source,bash] $ oc create serviceaccount <service_account> $ oc adm policy add-scc-to-user <new_scc> -z <service_account> -n <project>
アプリケーションのデプロイ設定で、サービスアカウント名と
securityContext
を指定します。apiVersion: v1 kind: ReplicationController metadata: name: frontend-1 spec: replicas: 1 1 selector: 2 name: frontend template: 3 metadata: labels: 4 name: frontend 5 spec: containers: - image: openshift/hello-openshift name: helloworld ports: - containerPort: 8080 protocol: TCP restartPolicy: Always serviceAccountName: <service_account> 6 securityContext: fsGroup: 7777 7
24.5. Ceph Rados ブロックデバイス (RBD) を使用した永続ストレージ
24.5.1. 概要
OpenShift Container Platform クラスターでは、Ceph RBD を使用して永続ストレージをプロビジョニングできます。
永続ボリューム (PV) と Persistent Volume Claim (永続ボリューム要求、PVC) は、単一プロジェクトでボリュームを共有できます。PV 定義に含まれている Ceph RBD 固有の情報は Pod 定義で直接定義することも可能ですが、この方法だとボリュームが一意のクラスターリソースとして作成されず、競合の影響を受けやすくなります。
このトピックでは、OpenShift Container Platform と Ceph RBD についてある程度理解していることを前提とします。OpenShift Container Platform 永続ボリューム (PV) の一般的なフレームワークについての詳細は、永続ストレージの概念に関するトピックを参照してください。
本書では、プロジェクトと namespace は区別せずに使用されています。両者の関係については、「Projects and Users」を参照してください。
インフラストラクチャーにおけるストレージの高可用性は、基礎となるストレージのプロバイダーに委ねられています。
24.5.2. プロビジョニング
Ceph ボリュームをプロビジョニングするには、以下が必要になります。
- 基礎となるインフラストラクチャーの既存ストレージデバイス。
- OpenShift Container Platform シークレットオブジェクトで使用される Ceph キー。
- Ceph イメージ名。
- ブロックストレージ上部のファイルシステムタイプ (ext4 など)。
クラスター内のスケジュール可能な各 OpenShift Container Platform ノードにインストールされた ceph-common。
# yum install ceph-common
24.5.2.1. Ceph シークレットの作成
承認キーをシークレット設定に定義します。これは後に OpenShift Container Platform で使用できるように base64 に変換されます。
Ceph ストレージを使用して永続ボリュームをサポートするには、シークレットを PVC や Pod と同じプロジェクトに作成する必要があります。シークレットは、単にデフォルトプロジェクトに置くことはできません。
Ceph MON ノードで
ceph auth get-key
を実行し、client.admin
ユーザーのキー値を表示します。apiVersion: v1 kind: Secret metadata: name: ceph-secret data: key: QVFBOFF2SlZheUJQRVJBQWgvS2cwT1laQUhPQno3akZwekxxdGc9PQ==
シークレット定義を ceph-secret.yaml などのファイルに保存し、シークレットを作成します。
$ oc create -f ceph-secret.yaml
シークレットが作成されたことを確認します。
# oc get secret ceph-secret NAME TYPE DATA AGE ceph-secret Opaque 1 23d
24.5.2.2. 永続ボリュームの作成
Ceph RBD では、「リサイクル」回収ポリシーはサポートされません。
開発者は、PVC を参照するか、Pod 仕様の volumes
セクションにある Gluster ボリュームプラグインを直接参照することによって Ceph RBD ストレージを要求します。PVC は、ユーザーの namespace にのみ存在し、同じ namespace 内の Pod からしか参照できません。別の namespace から PV にアクセスしようとすると、Pod エラーが発生します。
OpenShift Container Platform に PV を作成する前に、PV をオブジェクト定義に定義します。
例24.3 Ceph RBD を使用した永続ボリュームオブジェクトの定義
apiVersion: v1 kind: PersistentVolume metadata: name: ceph-pv 1 spec: capacity: storage: 2Gi 2 accessModes: - ReadWriteOnce 3 rbd: 4 monitors: 5 - 192.168.122.133:6789 pool: rbd image: ceph-image user: admin secretRef: name: ceph-secret 6 fsType: ext4 7 readOnly: false persistentVolumeReclaimPolicy: Retain
- 1
- Pod 定義で参照されるか、または各種の
oc
ボリュームコマンドで表示される PV の名前。 - 2
- このボリュームに割り当てられるストレージの量。
- 3
accessModes
は、PV と PVC を一致させるためのラベルとして使用されます。現時点で、これらはいずれの形式のアクセス制御も定義しません。すべてのブロックストレージは単一ユーザーに対して定義されます (非共有ストレージ)。- 4
- 使用されるボリュームタイプ。この場合は、rbd プラグインです。
- 5
- Ceph モニターの IP アドレスとポートの配列。
- 6
- OpenShift Container Platform から Ceph サーバーへのセキュアな接続を作成するために使用される Ceph シークレット。
- 7
- Ceph RBD ブロックデバイスにマウントされるファイルシステムタイプ。
重要ボリュームをフォーマットしてプロビジョニングした後に
fstype
パラメーターの値を変更すると、データ損失や Pod エラーが発生する可能性があります。定義を ceph-pv.yaml などのファイルに保存し、PV を作成します。
# oc create -f ceph-pv.yaml
永続ボリュームが作成されたことを確認します。
# oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE ceph-pv <none> 2147483648 RWO Available 2s
新規 PV にバインドされる PVC を作成します。
定義をファイル (ceph-claim.yaml など) に保存し、PVC を作成します。
# oc create -f ceph-claim.yaml
24.5.3. Ceph ボリュームのセキュリティー
Ceph RBD ボリュームを実装する前に、「ボリュームのセキュリティー」トピックの詳細を参照してください。
共有ボリューム (NFS および GlusterFS) とブロックボリューム (Ceph RBD、iSCSI、およびほとんどのクラウドストレージ) の大きな違いは、Pod 定義またはコンテナーイメージで定義されたユーザー ID とグループ ID がターゲットの物理ストレージに適用されることです。これはブロックデバイスの所有権の管理と呼ばれます。たとえば、Ceph RBD マウントで所有者が 123 に、グループ ID が 567 に設定されていて、Pod で runAsUser
が 222 に、fsGroup
が 7777 に定義されている場合、Ceph RBD 物理マウントの所有権は 222:7777 に変更されます。
ユーザー ID とグループ ID が Pod 仕様で定義されていない場合でも、生成される Pod では、これらの ID のデフォルト値が一致する SCC またはプロジェクトに基づいて定義されることがあります。詳細については、「ボリュームのセキュリティー」トピックの詳細を参照してください。このトピックでは、SCC のストレージの側面とデフォルト値について説明しています。
Pod の securityContext
定義で fsGroup
スタンザを使用して、Pod で Ceph RBD ボリュームのグループ所有権を定義します。
24.6. AWS Elastic Block Store を使用した永続ストレージ
24.6.1. 概要
OpenShift Container Platform では、AWS Elastic Block Store ボリューム (EBS) がサポートされます。AWS EC2 を使用して、OpenShift Container Platform クラスターに永続ストレージをプロビジョニングできます。これには、Kubernetes と AWS についてある程度の理解があることが前提となります。
AWS を使用して永続ボリュームを作成する前に、まず OpenShift Container Platform を AWS ElasticBlockStore 用に適切に設定する必要があります。
Kubernetes 永続ボリュームフレームワークは、管理者がクラスターに永続ストレージをプロビジョニングできるようにします。ユーザーが基礎となるインフラストラクチャーの知識がなくてもこれらのリソースを要求できるようになります。AWS Elastic Block Store ボリュームは、動的にプロビジョニングできます。永続ボリュームは、単一のプロジェクトまたは namespace にバインドされず、OpenShift Container Platform クラスター全体で共有できます。ただし、Persistent Volume Claim (永続ボリューム要求) は、プロジェクトまたは namespace に固有で、ユーザーが要求できます。
インフラストラクチャーにおけるストレージの高可用性は、基礎となるストレージのプロバイダーに委ねられています。
24.6.2. プロビジョニング
OpenShift Container Platform でストレージをボリュームとしてマウントするには、ストレージが基礎となるインフラストラクチャーにストレージが存在している必要があります。OpenShift Container Platform が AWS Elastic Block Store 用に設定されていることを確認した後、OpenShift と AWS に必要になるのは、AWS EBS ボリューム ID と PersistentVolume
API のみです。
24.6.2.1. 永続ボリュームの作成
AWS では、「リサイクル」回収ポリシーはサポートされません。
OpenShift Container Platform に永続ボリュームを作成する前に、永続ボリュームをオブジェクト定義で定義する必要があります。
例24.5 AWS を使用した永続ボリュームオブジェクトの定義
apiVersion: "v1" kind: "PersistentVolume" metadata: name: "pv0001" 1 spec: capacity: storage: "5Gi" 2 accessModes: - "ReadWriteOnce" awsElasticBlockStore: 3 fsType: "ext4" 4 volumeID: "vol-f37a03aa" 5
ボリュームをフォーマットしてプロビジョニングした後に fstype
パラメーターの値を変更すると、データ損失や Pod エラーが発生する可能性があります。
定義を aws-pv.yaml などのファイルに保存し、永続ボリュームを作成します。
# oc create -f aws-pv.yaml persistentvolume "pv0001" created
永続ボリュームが作成されたことを確認します。
# oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE pv0001 <none> 5Gi RWO Available 2s
次に、ユーザーは Persistent Volume Claim (永続ボリューム要求) を使用してストレージを要求し、この新規の永続ボリュームを活用できます。
Persistent Volume Claim (永続ボリューム要求) は、ユーザーの namespace にのみ存在し、同じ namespace 内の Pod からしか参照できません。別の namespace から永続ボリュームにアクセスしようとすると、Pod にエラーが発生します。
24.6.2.2. ボリュームのフォーマット
OpenShift Container Platform は、ボリュームをマウントしてコンテナーに渡す前に、永続ボリューム定義の fsType
パラメーターで指定されたファイルシステムがボリュームにあるかどうか確認します。デバイスが指定されたファイルシステムでフォーマットされていない場合、デバイスのデータはすべて消去され、デバイスはそのファイルシステムで自動的にフォーマットされます。
これにより、OpenShift Container Platform がフォーマットされていない AWS ボリュームを初回の使用前にフォーマットするため、それらを永続ボリュームとして使用することが可能になります。
24.6.2.3. ノード上の EBS ボリュームの最大数
OpenShift Container Platform では、デフォルトで 1 つのノードに最大 39 の EBS ボリュームを割り当てることができます。この制限は、AWS ボリュームの制限に合致します。
OpenShift Container Platform では、環境変数 KUBE_MAX_PD_VOLS
を設定することで、より大きな制限値を設定できます。ただし、AWS では、割り当てられるデバイスに特定の命名スキーム (AWS デバイスの命名) を使用する必要があります。この命名スキームでは、最大で 52 のボリュームしかサポートされません。これにより、OpenShift Container Platform 経由でノードに割り当てることができるボリュームの数が 52 に制限されます。
24.7. GCE Persistent Disk を使用した永続ストレージ
24.7.1. 概要
OpenShift Container Platform では、GCE Persistent Disk ボリューム (gcePD) がサポートされます。GCE を使用して、OpenShift Container Platform クラスターに永続ストレージをプロビジョニングできます。これには、Kubernetes と GCE についてある程度の理解があることが前提となります。
GCE を使用して永続ボリュームを作成する前に、まず OpenShift Container Platform を GCE Persistent Disk 用に適切に設定する必要があります。
Kubernetes の 永続ボリュームフレームワークは、管理者がクラスターに永続ストレージをプロビジョニングできるようにします。また、ユーザーが基礎となるインフラストラクチャーの知識がなくてもこれらのリソースを要求できるようにします。GCE Persistent Disk ボリュームは、動的にプロビジョニングできます。永続ボリュームは、単一のプロジェクトまたは namespace にバインドされず、OpenShift Container Platform クラスター全体で共有できます。ただし、Persistent Volume Claim (永続ボリューム要求) は、プロジェクトまたは namespace に固有で、ユーザーが要求できます。
インフラストラクチャーにおけるストレージの高可用性は、基礎となるストレージのプロバイダーに委ねられています。
24.7.2. プロビジョニング
OpenShift Container Platform でストレージをボリュームとしてマウントするには、基礎となるインフラストラクチャーにストレージが存在している必要があります。OpenShift Container Platform が GCE Persistent Disk 用に設定されていることを確認した後、OpenShift Container Platform と GCE に必要となるのは、GCE Persistent Disk ボリューム ID と PersistentVolume
API のみです。
24.7.2.1. 永続ボリュームの作成
GCE では、「リサイクル」回収ポリシーはサポートされません。
OpenShift Container Platform に永続ボリュームを作成する前に、永続ボリュームをオブジェクト定義で定義する必要があります。
例24.6 GCE を使用した永続ボリュームオブジェクトの定義
apiVersion: "v1" kind: "PersistentVolume" metadata: name: "pv0001" 1 spec: capacity: storage: "5Gi" 2 accessModes: - "ReadWriteOnce" gcePersistentDisk: 3 fsType: "ext4" 4 pdName: "pd-disk-1" 5
ボリュームをフォーマットしてプロビジョニングした後に fstype
パラメーターの値を変更すると、データ損失や Pod にエラーが発生する可能性があります。
定義を gce-pv.yaml などのファイルに保存し、永続ボリュームを作成します。
# oc create -f gce-pv.yaml persistentvolume "pv0001" created
永続ボリュームが作成されたことを確認します。
# oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE pv0001 <none> 5Gi RWO Available 2s
次に、ユーザーは Persistent Volume Claim (永続ボリューム要求) を使用してストレージを要求し、この新規の永続ボリュームを活用できます。
Persistent Volume Claim (永続ボリューム要求) は、ユーザーの namespace にのみ存在し、同じ namespace 内の Pod からしか参照できません。別の namespace から永続ボリュームにアクセスしようとすると、Pod にエラーが発生します。
24.7.2.2. ボリュームのフォーマット
OpenShift Container Platform は、ボリュームをマウントしてコンテナーに渡す前に、永続ボリューム定義の fsType
パラメーターで指定されたファイルシステムがボリュームにあるかどうか確認します。デバイスが指定されたファイルシステムでフォーマットされていない場合、デバイスのデータはすべて消去され、デバイスはそのファイルシステムで自動的にフォーマットされます。
これにより、OpenShift Container Platform がフォーマットされていない GCE ボリュームを初回の使用前にフォーマットするため、それらを永続ボリュームとして使用することが可能になります。
24.8. iSCSI を使用した永続ストレージ
24.8.1. 概要
iSCSI を使用して、OpenShift Container Platform クラスターに永続ストレージをプロビジョニングできます。これには、Kubernetes と iSCSI についてある程度の理解があることが前提となります。
Kubernetes の 永続ボリュームフレームワークは、管理者がクラスターに永続ストレージをプロビジョニングできるようにします。ユーザーが基礎となるインフラストラクチャーの知識がなくてもこれらのリソースを要求できるようにします。
インフラストラクチャーにおけるストレージの高可用性は、基礎となるストレージのプロバイダーに委ねられています。
24.8.2. プロビジョニング
OpenShift Container Platform でストレージをボリュームとしてマウントする前に、基礎となるインフラストラクチャーにストレージが存在することを確認します。iSCSI に必要になるのは、iSCSI ターゲットポータル、有効な iSCSI 修飾名 (IQN)、有効な LUN 番号、ファイルシステムタイプ、および PersistentVolume
API のみです。
オプションで、マルチマスポータルとチャレンジハンドシェイク認証プロトコル (CHAP) 設定を提供できます。
iSCSI では、「リサイクル」回収ポリシーはサポートされません。
例24.7 永続ボリュームオブジェクトの定義
apiVersion: v1 kind: PersistentVolume metadata: name: iscsi-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce iscsi: targetPortal: 10.16.154.81:3260 portals: ['10.16.154.82:3260', '10.16.154.83:3260'] iqn: iqn.2014-12.example.server:storage.target00 lun: 0 fsType: 'ext4' readOnly: false chapAuthDiscovery: true chapAuthSession: true secretRef: name: chap-secret
24.8.2.1. ディスククォータの実施
LUN パーティションを使用してディスククォータとサイズ制限を実施します。それぞれの LUN には 1 つの永続ボリュームです。Kubernetes では、永続ボリュームに一意の名前を使用する必要があります。
上記の方法でクォータを実施すると、エンドユーザーは永続ストレージを具体的な量 (10Gi など) で要求することができ、これを同等またはそれ以上の容量の対応するボリュームに一致させることができます。
24.8.2.2. iSCSI ボリュームのセキュリティー
ユーザーは PersistentVolumeClaim
でストレージを要求します。この要求はユーザーの namespace にのみ存在し、同じ namespace 内の Pod からのみ参照できます。namespace をまたいで永続ボリュームにアクセスしようとすると、Pod にエラーが発生します。
それぞれの iSCSI LUN は、クラスター内のすべてのノードからアクセスできる必要があります。
24.8.2.3. iSCSI のマルチパス化
iSCSI ベースのストレージの場合は、複数のターゲットポータルの IP アドレスに同じ IQN を使用することでマルチパスを設定できます。マルチパス化により、パス内の 1 つ以上のコンポーネントで障害が発生した場合でも、永続ボリュームにアクセスできることができます。
Pod 仕様でマルチパスを指定するには、portals
フィールドを使用します。以下は例になります。
apiVersion: v1
kind: PersistentVolume
metadata:
name: iscsi_pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
iscsi:
targetPortal: 10.0.0.1:3260
portals: ['10.0.2.16:3260', '10.0.2.17:3260', '10.0.2.18:3260'] 1
iqn: iqn.2016-04.test.com:storage.target00
lun: 0
fsType: ext4
readOnly: false
- 1
portals
フィールドを使用してターゲットポータルを追加します。
24.8.2.4. iSCSI のカスタムイニシエーター IQN
iSCSI ターゲットが特定に IQN に制限されている場合に、カスタムイニシエーターの iSCSI Qualified Name (IQN) を設定します。ただし、iSCSI PV が割り当てられているノードが必ず、これらの IQN を使用する保証はありません。
カスタムのイニシエーター IQN を指定するには、initiatorName
フィールドを使用します。
apiVersion: v1
kind: PersistentVolume
metadata:
name: iscsi_pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
iscsi:
targetPortal: 10.0.0.1:3260
portals: ['10.0.2.16:3260', '10.0.2.17:3260', '10.0.2.18:3260']
iqn: iqn.2016-04.test.com:storage.target00
lun: 0
initiatorName: iqn.2016-04.test.com:custom.iqn 1
fsType: ext4
readOnly: false
- 1
- カスタムのイニシエーター IQN を追加するには、
initiatorName
フィールドを使用します。
24.9. ファイバーチャネルを使用した永続ストレージ
24.9.1. 概要
ファイバーチャネル を使用して、OpenShift Container Platform クラスターに永続ストレージをプロビジョニングできます。これには、Kubernetes と Fibre Channel についてある程度の理解があることが前提となります。
Kubernetes の 永続ボリュームフレームワークは、管理者がクラスターに永続ストレージをプロビジョニングできるようにします。ユーザーが基礎となるインフラストラクチャーの知識がなくてもこれらのリソースを要求できるようにします。
インフラストラクチャーにおけるストレージの高可用性は、基礎となるストレージのプロバイダーに委ねられています。
24.9.2. プロビジョニング
OpenShift Container Platform でストレージをボリュームとしてマウントするには、基礎となるインフラストラクチャーにストレージが存在している必要があります。ファイバーチャネルの永続ストレージに必要になるのは、targetWWNs (ファイバーチャネルターゲットのワールドワイド名の配列)、有効な LUN 番号、ファイルシステムタイプ、および PersistentVolume
API のみです。 永続ボリュームと LUN は 1 対 1 でマッピングされます。
ファイバーチャネルでは、「リサイクル」回収ポリシーはサポートされません。
永続ボリュームオブジェクトの定義
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0001
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
fc:
targetWWNs: ['500a0981891b8dc5', '500a0981991b8dc5'] 1
lun: 2
fsType: ext4
- 1
- ファイバーチャネルl WWN は、
/dev/disk/by-path/pci-<IDENTIFIER>-fc-0x<WWN>-lun-<LUN#>
として識別されます。ただし、WWN
までのパス (0x
を含む) と WWN の後の文字 (-
(ハイフン) を含む) を入力する必要はありません。
ボリュームをフォーマットしてプロビジョニングした後に fstype
パラメーターの値を変更すると、データ損失や Pod エラーが発生する可能性があります。
24.9.2.1. ディスククォータの実施
LUN パーティションを使用してディスククォータとサイズ制限を実施します。それぞれの LUN には 1 つの永続ボリュームです。Kubernetes では、永続ボリュームに一意の名前を使用する必要があります。
上記の方法でクォータを実施すると、エンドユーザーは永続ストレージを具体的な量 (10Gi など) で要求することができ、これを同等またはそれ以上の容量の対応するボリュームに一致させることができます。
24.9.2.2. ファイバーチャネルボリュームのセキュリティー
ユーザーは PersistentVolumeClaim
でストレージを要求します。この要求はユーザーの namespace にのみ存在し、同じ namespace 内の Pod からのみ参照できます。namespace をまたいで永続ボリュームにアクセスしようとすると、Pod にエラーが発生します。
それぞれのファイバーチャネル LUN は、クラスター内のすべてのノードからアクセスできる必要があります。
24.10. Azure Disk を使用した永続ストレージ
24.10.1. 概要
OpenShift Container Platform では、Microsoft Azure Disk ボリュームがサポートされます。Azure を使用して、OpenShift Container Platform クラスターに永続ストレージをプロビジョニングできます。これには、Kubernetes と Azure についてある程度の理解があることが前提となります。
Kubernetes 永続ボリュームフレームワークは、管理者がクラスターに永続ストレージをプロビジョニングできるようにします。ユーザーが基礎となるインフラストラクチャーの知識がなくてもこれらのリソースを要求できるようにします。
Azure Disk ボリュームは、動的にプロビジョニングできます。永続ボリュームは、単一のプロジェクトまたは namespace にバインドされず、OpenShift Container Platform クラスター全体で共有できます。ただし、Persistent Volume Claim (永続ボリューム要求) は、プロジェクトまたは namespace に固有で、ユーザーが要求できます。
インフラストラクチャーにおけるストレージの高可用性は、基礎となるストレージのプロバイダーに委ねられています。
24.10.2. 前提条件
Azure を使用して永続ボリュームを作成する前に、OpenShift Container Platform クラスターが以下の要件を満たしていることを確認してください。
- まず、OpenShift Container Platform を Azure Disk 用に設定する必要があります。
- インフラストラクチャー内の各ノードは、Azure 仮想マシン名に一致している必要があります。
- それぞれのノードホストは、同じリソースグループに属している必要があります。
24.10.3. プロビジョニング
OpenShift Container Platform でストレージをボリュームとしてマウントするには、基礎となるインフラストラクチャーにストレージが存在している必要があります。OpenShift Container Platform が Azure Disk 用に設定されていることを確認した後、OpenShift Container Platform と Azure に必要になるのは、Azure Disk Name および Disk URI と PersistentVolume
API のみです。
24.10.4. Azure Disk でのリージョンクラウドの設定
Azure には、インスタンスをデプロイする複数のリージョンがあります。必要なリージョンを指定するには、以下を azure.conf ファイルに追加します。
cloud: <region>
リージョンは以下のいずれかになります。
-
ドイツクラウド:
AZUREGERMANCLOUD
-
中国クラウド:
AZURECHINACLOUD
-
パブリッククラウド:
AZUREPUBLICCLOUD
-
米国クラウド:
AZUREUSGOVERNMENTCLOUD
24.10.4.1. 永続ボリュームの作成
Azure では、リサイクル回収ポリシーはサポートされません。
OpenShift Container Platform に永続ボリュームを作成する前に、永続ボリュームをオブジェクト定義で定義する必要があります。
例24.8 Azure を使用した永続ボリュームオブジェクトの定義
apiVersion: "v1" kind: "PersistentVolume" metadata: name: "pv0001" 1 spec: capacity: storage: "5Gi" 2 accessModes: - "ReadWriteOnce" azureDisk: 3 diskName: test2.vhd 4 diskURI: https://someacount.blob.core.windows.net/vhds/test2.vhd 5 cachingMode: ReadWrite 6 fsType: ext4 7 readOnly: false 8
- 1
- ボリュームの名前です。これは Persistent Volume Claim (永続ボリューム要求) を使用して、または Pod からボリュームを識別するために使用されます。
- 2
- このボリュームに割り当てられるストレージの量。
- 3
- これは使用されるボリュームタイプを定義します (この例では、azureDisk プラグイン)。
- 4
- Blob ストレージのデータディスクの名前。
- 5
- Blob ストレージのデータディスクの URI
- 6
- ホストのキャッシングモード: None、ReadOnly、または ReadWrite。
- 7
- マウントするファイルシステムタイプ (
ext4
、xfs
など)。 - 8
- デフォルトは
false
(読み取り/書き込み) です。ここでReadOnly
を指定すると、VolumeMounts
でReadOnly
設定が強制的に実行されます。
ボリュームをフォーマットしてプロビジョニングした後に fsType
パラメーターの値を変更すると、データ損失や Pod にエラーが発生する可能性があります。
定義を azure-pv.yaml などのファイルに保存し、永続ボリュームを作成します。
# oc create -f azure-pv.yaml persistentvolume "pv0001" created
永続ボリュームが作成されたことを確認します。
# oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE pv0001 <none> 5Gi RWO Available 2s
これで、Persistent Volume Claim (永続ボリューム要求) を使用してストレージを要求し、新規の永続ボリュームを活用できるようになります。
Azure Disk PVC を介してボリュームがマウントされている Pod の場合、新規ノードへの Pod のスケジューリングに数分の時間がかかります。ディスクの割り当て解除操作が完了するまで 2 ~ 3 分待ってから、新規デプロイメントを開始してください。ディスクの割り当て解除操作が完了する前に新規の Pod の作成要求が開始されると、Pod の作成によって開始されたディスクの割り当て操作が失敗し、結果として Pod の作成が失敗します。
Persistent Volume Claim (永続ボリューム要求) は、ユーザーの namespace にのみ存在し、同じ namespace 内の Pod からしか参照できません。別の namespace から永続ボリュームにアクセスしようとすると、Pod にエラーが発生します。
24.10.4.2. ボリュームのフォーマット
OpenShift Container Platform は、ボリュームをマウントしてコンテナーに渡す前に、永続ボリューム定義の fsType
パラメーターで指定されたファイルシステムがボリュームにあるかどうか確認します。デバイスが指定されたファイルシステムでフォーマットされていない場合、デバイスのデータはすべて消去され、デバイスはそのファイルシステムで自動的にフォーマットされます。
これにより、OpenShift Container Platform がフォーマットされていない Azure ボリュームを初回の使用前にフォーマットするため、それらを永続ボリュームとして使用することが可能になります。
24.11. Azure File を使用した永続ストレージ
24.11.1. 概要
OpenShift Container Platform では、Microsoft Azure File ボリュームがサポートされます。Azure を使用して、OpenShift Container Platform クラスターに永続ストレージをプロビジョニングできます。これには、Kubernetes と Azure についてのある程度の理解があることが前提となります。
インフラストラクチャーにおけるストレージの高可用性は、基礎となるストレージのプロバイダーに委ねられています。
24.11.2. 作業を開始する前の注意事項
すべてのノードに
samba-client
、samba-common
、およびcifs-utils
をインストールします。$ sudo yum install samba-client samba-common cifs-utils
すべてのノードで SELinux ブール値を有効にします。
$ /usr/sbin/setsebool -P virt_use_samba on $ /usr/sbin/setsebool -P virt_sandbox_use_samba on
mount
コマンドを実行してdir_mode
およびfile_mode
パーミッションなどを確認します。$ mount
dir_mode
および file_mode
のパーミッションが 0755
に設定されている場合には、デフォルト値 0755
を 0777
または 0775
に変更します。OpenShift Container Platform 3.9 では、デフォルトの dir_mode
および file_mode
パーミッションが 0777
から 0755
に変更されるので、この手動の手順が必要です。以下の例では、変更された値が含まれる設定ファイルを紹介しています。
Azure File での MySQL および PostgresSQL を使用する場合の留意事項
- Azure File がマウントされるディレクトリーの所有者 UID は、コンテナーの UID とは異なります。
MySQL コンテナーは、マウントされたディレクトリーのファイルの所有者パーミッションを変更します。所有者 UID とコンテナープロセスの UID が一致しないので、この操作に失敗してしまいます。そのため、Azure File で MySQL を実行するには、以下を行うようにしてください。
PV 設定ファイルの
runAsUser
変数に、Azure File のマウントされたディレクトリー UID を指定します。spec: containers: ... securityContext: runAsUser: <mounted_dir_uid>
PV 設定ファイルの
mountOptions
でコンテナーのプロセス UID を指定します。mountOptions: - dir_mode=0700 - file_mode=0600 - uid=<conatiner_process_uid> - gid=0
- PostgreSQL は Azure File と併用はできません。これは、PostgreSQL に Azure File ディレクトリーのハードリンクが必要であるにもかかわらず、Azure File では ハードリンク をサポートしていないため、Pod の起動に失敗します。
PV 設定ファイル例
# azf-pv.yml apiVersion: "v1" kind: "PersistentVolume" metadata: name: "azpv" spec: capacity: storage: "1Gi" accessModes: - "ReadWriteMany" azureFile: secretName: azure-secret shareName: azftest readOnly: false mountOptions: - dir_mode=0777 - file_mode=0777
ストレージクラスの設定ファイル例
$ azure-file-sc.yaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: azurefile provisioner: kubernetes.io/azure-file mountOptions: - dir_mode=0777 - file_mode=0777 parameters: storageAccount: ocp39str location: centralus
24.11.3. Azure File でのリージョンクラウドの設定
Azure Disk は複数のリージョンクラウドに対応していますが、Azure File は、エンドポイントがハードコードされているために Azure パブリッククラウドのみをサポートしています。
24.11.4. PV の作成
Azure File では、リサイクル回収ポリシーはサポートされません。
24.11.5. Azure Storage Account シークレットの作成
Azure Storage Account の名前とキーをシークレット設定に定義します。これは後に OpenShift Container Platform で使用できるように base64 に変換されます。
Azure Storage Account の名前とキーを取得し、base64 にエンコードします。
apiVersion: v1 kind: Secret metadata: name: azure-secret type: Opaque data: azurestorageaccountname: azhzdGVzdA== azurestorageaccountkey: eElGMXpKYm5ub2pGTE1Ta0JwNTBteDAyckhzTUsyc2pVN21GdDRMMTNob0I3ZHJBYUo4akQ2K0E0NDNqSm9nVjd5MkZVT2hRQ1dQbU02WWFOSHk3cWc9PQ==
シークレット定義を azure-secret.yaml などのファイルに保存し、シークレットを作成します。
$ oc create -f azure-secret.yaml
シークレットが作成されたことを確認します。
$ oc get secret azure-secret NAME TYPE DATA AGE azure-secret Opaque 1 23d
OpenShift Container Platform に PV を作成する前に、PV をオブジェクト定義に定義します。
Azure File を使用した PV オブジェクト定義の例
apiVersion: "v1" kind: "PersistentVolume" metadata: name: "pv0001" 1 spec: capacity: storage: "5Gi" 2 accessModes: - "ReadWriteMany" azureFile: 3 secretName: azure-secret 4 shareName: example 5 readOnly: false 6
定義を azure-file-pv.yaml などのファイルに保存し、PV を作成します。
$ oc create -f azure-file-pv.yaml persistentvolume "pv0001" created
PV が作成されたことを確認します。
$ oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE pv0001 <none> 5Gi RWM Available 2s
これで、「PV Claim (永続ボリューム要求) を使用してストレージを要求」し、新規の永続ボリュームを活用できるようになります。
PV Claim (永続ボリューム要求) は、ユーザーの namespace にのみ存在し、同じ namespace 内の Pod からしか参照できません。別の namespace から永続ボリュームにアクセスしようとすると、Pod にエラーが発生します。
24.12. FlexVolume プラグインを使用した永続ストレージ
24.12.1. 概要
OpenShift Container Platform には、各種のストレージテクノロジーを使用するためにボリュームプラグインが組み込まれています。組み込みプラグインがないバックエンドのストレージを使用する場合は、FlexVolume ドライバーを使用して OpenShift Container Platform を拡張し、アプリケーションに永続ストレージを提供できます。
24.12.2. FlexVolume ドライバー
FlexVolume ドライバーは、クラスター内のすべてのマシン (マスターとノードの両方) の明確に定義されたディレクトリーに格納されている実行可能ファイルです。OpenShift Container Platform は、flexVolume
をソースとする PersistentVolume
によって表されるボリュームの割り当て、割り当て解除、マウント、またはアンマウントが必要になるたびに FlexVolume ドライバーを呼び出します。
ドライバーの最初のコマンドライン引数は常に操作名です。その他のパラメーターは操作ごとに異なります。ほとんどの操作は、JSON (JavaScript Object Notation) 文字列をパラメーターとして取ります。このパラメーターは完全な JSON 文字列であり、JSON データを含むファイルの名前ではありません。
FlexVolume ドライバーには以下が含まれます。
-
すべての
flexVolume.options
。 -
kubernetes.io/
というプレフィックスが付いたflexVolume
のいくつかのオプション。たとえば、fsType
やreadwrite
などです。 -
kubernetes.io/secret/
というプレフィックスが付いた参照先シークレット (指定されている場合) の内容。
FlexVolume ドライバーの JSON 入力例
{ "fooServer": "192.168.0.1:1234", 1 "fooVolumeName": "bar", "kubernetes.io/fsType": "ext4", 2 "kubernetes.io/readwrite": "ro", 3 "kubernetes.io/secret/<key name>": "<key value>", 4 "kubernetes.io/secret/<another key name>": "<another key value>", }
OpenShift Container Platform は、ドライバーの標準出力に JSON データが含まれていると想定します。指定されていない場合、出力には操作の結果が示されます。
FlexVolume ドライバーのデフォルトの出力
{ "status": "<Success/Failure/Not supported>", "message": "<Reason for success/failure>" }
ドライバーの終了コードは、成功の場合は 0
、エラーの場合は 1
です。
操作はべき等です。つまり、すでに割り当てられているボリュームの割り当て操作や、すでにマウントされているボリュームのマウント操作は成功します。
FlexVolume ドライバーは以下の 2 つのモードで動作します。
attach/detach
操作は、OpenShift Container Platform マスターにより、ノードにボリュームを割り当てるため、およびノードからボリュームの割り当てを解除するために使用されます。これは何らかの理由でノードが応答不能になった場合に役立ちます。その後、マスターはノード上のすべての Pod を強制終了し、ノードからすべてのボリュームの割り当てを解除して、ボリュームを他のノードに割り当てることで、元のノードがまだ到達不能な状態であってもアプリケーションを再開できます。
マスター実行の、別のマシンからのボリュームの割り当て解除は、すべてのストレージバックエンドでサポートされる訳ではありません。
24.12.2.1. マスターで実行される割り当て/割り当て解除がある FlexVolume ドライバー
マスター制御の割り当て/割り当て解除をサポートする FlexVolume ドライバーは、以下の操作を実装する必要があります。
init
ドライバーを初期化します。マスターとノードの初期化中に呼び出されます。
- 引数: なし
- 実行場所: マスター、ノード
- 予期される出力: デフォルトの JSON
getvolumename
ボリュームの一意の名前を返します。この名前は、後続の
detach
呼び出しで<volume-name>
として使用されるため、すべてのマスターとノード間で一致している必要があります。<volume-name>
の/
文字は自動的に~
に置き換えられます。-
引数:
<json>
- 実行場所: マスター、ノード
予期される出力: デフォルトの JSON +
volumeName
:{ "status": "Success", "message": "", "volumeName": "foo-volume-bar" 1 }
- 1
- ストレージバックエンド
foo
のボリュームの一意の名前。
-
引数:
attach
指定されたノードに、JSON で表現したボリュームを割り当てます。この操作は、ノード上のデバイスが既知の場合 (つまり、そのデバイスが実行前にストレージバックエンドによって割り当て済みの場合)、そのデバイスの名前を返します。デバイスが既知でない場合は、後続の
waitforattach
操作によってノード上のデバイスが検出される必要があります。-
引数:
<json>
<node-name>
- 実行場所: マスター
予期される出力: デフォルトの JSON +
device
(既知の場合)。{ "status": "Success", "message": "", "device": "/dev/xvda" 1 }
- 1
- ノード上のデバイスの名前 (既知の場合)。
-
引数:
waitforattach
ボリュームがノードに完全に割り当てられ、デバイスが出現するまで待機します。前の
attach
操作から<device-name>
が返された場合は、それが入力パラメーターとして渡されます。そうでない場合、<device-name>
は空であり、この操作によってノード上のデバイスを検出する必要があります。-
引数:
<device-name>
<json>
- 実行場所: ノード
予期される出力: デフォルトの JSON +
device
{ "status": "Success", "message": "", "device": "/dev/xvda" 1 }
- 1
- ノード上のデバイスの名前。
-
引数:
detach
指定されたボリュームをノードから割り当て解除します。
<volume-name>
は、getvolumename
操作から返されるデバイスの名前です。<volume-name>
の/
文字は、~
に自動的に置き換えられます。-
引数:
<volume-name>
<node-name>
- 実行場所: マスター
- 予期される出力: デフォルトの JSON
-
引数:
isattached
ボリュームがノードに割り当てられていることを確認します。
-
引数:
<json>
<node-name>
- 実行場所: マスター
予期される出力: デフォルトの JSON +
attached
{ "status": "Success", "message": "", "attached": true 1 }
- 1
- ノードへのボリュームの割り当てのステータス。
-
引数:
mountdevice
ボリュームのデバイスをディレクトリーにマウントします。
<device-name>
は、前のwaitforattach
操作から返されるデバイスの名前です。-
引数:
<mount-dir>
<device-name>
<json>
- 実行場所: ノード
- 予期される出力: デフォルトの JSON
-
引数:
unmountdevice
ボリュームのデバイスをディレクトリーからアンマウントします。
-
引数:
<mount-dir>
- 実行場所: ノード
-
引数:
その他のすべての操作は、{"status": "Not supported"}
と終了コード 1
を出して JSON を返します。
OpenShift Container Platform 3.6 では、マスター実行の割り当て/割り当て解除操作はデフォルトで有効にされています。これらの操作は古いバージョンでも使用できる場合がありますが、その場合には明示的に有効にする必要があります。「コントローラー管理の割り当ておよび割り当て解除」を参照してください。有効にされていない場合、割り当て/割り当て解除操作は、ボリュームの割り当て/割り当て解除が実行される必要のあるノードで開始されます。FlexVolume ドライバー呼び出しの構文とすべてのパラメーターはどちらの場合も同じになります。
24.12.2.2. マスター実行の割り当て/割り当て解除がない FlexVolume ドライバー
マスター制御の割り当て/割り当て解除をサポートしない FlexVolume ドライバーは、ノードでのみ実行され、以下の操作を実装する必要があります。
init
ドライバーを初期化します。すべてのノードの初期化中に呼び出されます。
- 引数: なし
- 実行場所: ノード
- 予期される出力: デフォルトの JSON
mount
ボリュームをディレクトリーにマウントします。これには、ノードへのボリュームの割り当て、ノードのデバイスの検出、その後のデバイスのマウントを含む、ボリュームのマウントに必要なあらゆる操作が含まれます。
-
引数:
<mount-dir>
<json>
- 実行場所: ノード
- 予期される出力: デフォルトの JSON
-
引数:
unmount
ボリュームをディレクトリーからアンマウントします。これには、ノードからのボリュームの割り当て解除など、アンマウント後のボリュームのクリーンアップに必要なあらゆる操作が含まれます。
-
引数:
<mount-dir>
- 実行場所: ノード
- 予期される出力: デフォルトの JSON
-
引数:
その他のすべての操作は、{"status": "Not supported"}
と終了コード 1
を出して JSON を返します。
24.12.3. FlexVolume ドライバーのインストール
FlexVolume ドライバーをインストールします。
- この実行可能ファイルがクラスター内のすべてのマスターとノードに存在することを確認します。
- この実行可能ファイルをボリュームプラグインのパス (/usr/libexec/kubernetes/kubelet-plugins/volume/exec/<vendor>~<driver>/<driver>) に配置します。
たとえば、ストレージ foo
の FlexVolume ドライバーをインストールするには、実行可能ファイルを /usr/libexec/kubernetes/kubelet-plugins/volume/exec/openshift.com~foo/foo に配置します。
24.12.4. FlexVolume ドライバーを使用したストレージの使用
インストールされているストレージを参照するには、PersistentVolume
オブジェクトを使用します。OpenShift Container Platform の各 PersistentVolume
オブジェクトは、ストレージバックエンドの 1 つのストレージアセット (通常はボリューム) を表します。
FlexVolume ドライバーを使用した永続ボリュームのオブジェクト定義例
apiVersion: v1 kind: PersistentVolume metadata: name: pv0001 1 spec: capacity: storage: 1Gi 2 accessModes: - ReadWriteOnce flexVolume: driver: openshift.com/foo 3 fsType: "ext4" 4 secretRef: foo-secret 5 readOnly: true 6 options: 7 fooServer: 192.168.0.1:1234 fooVolumeName: bar
- 1
- ボリュームの名前。これは Persistent Volume Claim (永続ボリューム要求) を使用するか、または Pod からボリュームを識別するために使用されます。この名前は、バックエンドストレージのボリューム名とは異なるものにすることができます。
- 2
- このボリュームに割り当てられるストレージの量。
- 3
- ドライバーの名前。このフィールドは必須です。
- 4
- ボリュームに存在するオプションのファイルシステム。このフィールドはオプションです。
- 5
- シークレットへの参照。このシークレットのキーと値は、起動時に FlexVolume ドライバーに渡されます。このフィールドはオプションです。
- 6
- 読み取り専用のフラグ。このフィールドはオプションです。
- 7
- FlexVolume ドライバーの追加オプション。
options
フィールドでユーザーが指定するフラグに加え、以下のフラグも実行可能ファイルに渡されます。
"fsType":"<FS type>", "readwrite":"<rw>", "secret/key1":"<secret1>" ... "secret/keyN":"<secretN>"
シークレットは、呼び出しのマウント/マウント解除のためにだけ渡されます。
24.13. 永続ストレージ用の VMware vSphere ボリューム
24.13.1. 概要
OpenShift Container Platform では、VMWare vSphere の仮想マシンディスク (VMDK: Virtual Machine Disk) ボリュームがサポートされます。VMWare vSphere を使用して、OpenShift Container Platform クラスターに「永続ストレージ」をプロビジョニングできます。これには、Kubernetes と VMWare vSphere についてのある程度の理解があることが前提となります。
OpenShift Container Platform の「永続ボリューム (PV)」フレームワークを使用すると、管理者がクラスターに永続ストレージをプロビジョニングできるようになるだけでなく、ユーザーが、基盤となるインフラストラクチャーに精通していなくてもこれらのリソースを要求できるようになります。VMWare vSphere VMDK ボリュームは、動的にプロビジョニングできます。
永続ボリュームは、単一のプロジェクトまたは namespace にバインドされず、OpenShift Container Platform クラスター全体で共有できます。ただし、Persistent Volume Claim (永続ボリューム要求) は、プロジェクトまたは namespace に固有で、ユーザーが要求できます。
インフラストラクチャーにおけるストレージの高可用性は、基礎となるストレージのプロバイダーに委ねられています。
前提条件
vSphere を使用して永続ボリュームを作成する前に、OpenShift Container Platform クラスターが以下の要件を満たしていることを確認してください。
- 最初に OpenShift Container Platform を vSphere 用に設定する必要があります。
- インフラストラクチャー内の各ノードホストは、vSphere 仮想マシン名に一致する必要があります。
- それぞれのノードホストは、同じリソースグループに属している必要があります。
VMDK を使用する前に、以下のいずれかの方法を使用して VMDK を作成します。
vmkfstools
を使用して作成する。セキュアシェル (SSH) を使用して ESX にアクセスし、以下のコマンドを使用して vmdk ボリュームを作成します。
vmkfstools -c 2G /vmfs/volumes/DatastoreName/volumes/myDisk.vmdk
vmware-vdiskmanager
を使用して作成する。shell vmware-vdiskmanager -c -t 0 -s 40GB -a lsilogic myDisk.vmdk
24.13.2. VMware vSphere ボリュームのプロビジョニング
OpenShift Container Platform でストレージをボリュームとしてマウントするには、ストレージが基礎となるインフラストラクチャーに存在している必要があります。OpenShift Container Platform が vSpehere 用に設定されていることを確認した後、OpenShift Container Platform と vSphere に必要になるのは、VM フォルダーパス、ファイルシステムタイプ、および PersistentVolume
API のみです。
24.13.2.1. 永続ボリュームの作成
OpenShift Container Platform に PV を作成する前に、PV をオブジェクト定義に定義する必要があります。
VMware vSphere を使用した PV オブジェクト定義の例
apiVersion: v1 kind: PersistentVolume metadata: name: pv0001 1 spec: capacity: storage: 2Gi 2 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain vsphereVolume: 3 volumePath: "[datastore1] volumes/myDisk" 4 fsType: ext4 5
- 1
- ボリュームの名前です。これを使用して、PV Claim (永続ボリューム要求)で、または Pod からボリュームを識別する必要があります。
- 2
- このボリュームに割り当てられるストレージの量。
- 3
- これは使用されるボリュームタイプを定義します (この例では、vsphereVolume プラグイン)。
vsphereVolume
ラベルは、vSphere VMDK ボリュームを Pod にマウントするために使用されます。ボリュームがアンマウントされてもボリュームのコンテンツは保持されます。このボリュームタイプは、VMFS データストアと VSAN データストアの両方をサポートします。 - 4
- VMDK ボリュームが存在し、ボリューム定義内に括弧 ([]) を含める必要があります。
- 5
- マウントするファイルシステムタイプ (
ext4
、xfs
、その他のファイルシステムなど)。
ボリュームをフォーマットしてプロビジョニングした後に fsType
パラメーターの値を変更すると、データ損失や Pod にエラーが発生する可能性があります。
永続ボリュームを作成します。
定義を vsphere-pv.yaml などのファイルに保存し、PV を作成します。
$ oc create -f vsphere-pv.yaml persistentvolume "pv0001" created
PV が作成されたことを確認します。
$ oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE pv0001 <none> 2Gi RWO Available 2s
これで、PVC (永続ボリューム要求) を使用してストレージを要求し、永続ボリュームを活用できるようになります。
PV Claim (永続ボリューム要求) は、ユーザーの namespace にのみ存在し、同じ namespace 内の Pod からしか参照できません。別の namespace から永続ボリュームにアクセスしようとすると、Pod にエラーが発生します。
24.13.2.2. VMware vSphere ボリュームのフォーマット
OpenShift Container Platform は、ボリュームをマウントしてコンテナーに渡す前に、永続ボリューム定義の fsType
パラメーターで指定されたファイルシステムがボリュームにあるかどうかを確認します。デバイスが指定されたファイルシステムでフォーマットされていない場合、デバイスのデータはすべて消去され、デバイスはそのファイルシステムで自動的にフォーマットされます。
これにより、OpenShift Container Platform がフォーマットされていない vSphere ボリュームを初回の使用前にフォーマットするため、それらを永続ボリュームとして使用できるようになります。
24.14. ローカルボリュームを使用した永続ストレージ
24.14.1. 概要
OpenShift Container Platform クラスターでは、ローカルボリュームを使用して永続ストレージをプロビジョニングできます。ローカル永続ボリュームを使用すると、標準の PVC インターフェースからディスク、パーティション、ディレクトリーなどのローカルストレージデバイスにアクセスできます。
ローカルボリュームは、Pod をノードに手動でスケジュールせずに使用できます。ボリュームのノード制約がシステムによって認識されるためです。ただし、ローカルボリュームは、依然として基礎となるノードの可用性に依存しており、すべてのアプリケーションに適している訳ではありません。
ローカルボリュームはアルファ機能であり、OpenShift Container Platform の今後のリリースで変更される場合があります。既知の問題と回避策については、「Feature Status(Local Volume)」セクションを参照してください。
ローカルボリュームは、静的に作成された永続ボリュームとしてのみ使用できます。
24.14.2. プロビジョニング
OpenShift Container Platform でストレージをボリュームとしてマウントするには、ストレージが基礎となるインフラストラクチャーに存在している必要があります。PersistentVolume
API を使用する前に、OpenShift Container Platform がローカルボリューム用に設定されていることを確認してください。
24.14.3. ローカルの Persistent Volume Claim (永続ボリューム要求) の作成
Persistent Volume Claim (永続ボリューム要求) をオブジェクト定義に定義します。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: example-local-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi 1 storageClassName: local-storage 2
24.14.4. 機能のステータス
機能すること:
- ノードアフィニティーがあるディレクトリーを指定して PV を作成する。
- 前述の PV にバインドされている PVC を使用する Pod は常に該当ノードにスケジューリングされる。
- ローカルディレクトリーを検出し、PV を作成、クリーンアップ、および削除する外部の静的プロビジョナーデーモンセット。
機能しないこと:
- 単一 Pod に複数のローカル PVC を持たせる。
PVC バインディングでは Pod のスケジューリング要件を考慮しないため、最適でないか、または適切でない決定がなされる可能性がある。
回避策
- ローカルボリュームを必要とする Pod を最初に実行します。
- それらの Pod に高い優先順位を設定します。
- 動作が中断している Pod への PVC のバインドを解除する回避策となるコントローラーを実行します。
外部プロビジョナーの起動後にマウントを追加した場合、外部プロビジョナーはマウントの正確な容量を検出できなくなる。
回避策
- 新規のマウントポイントを追加する前に、デーモンセットを停止し、新規マウントポイントを追加してから deamonset を起動します。
-
同じ PV を使用する複数の Pod で別々の
fsgroup
を指定すると、fsgroup
の競合が発生する。
24.15. 動的プロビジョニングとストレージクラスの作成
24.15.1. 概要
StorageClass リソースオブジェクトは、要求可能なストレージを記述し、分類するほか、動的にプロビジョニングされるストレージのパラメーターを要求に応じて渡すための手段を提供します。StorageClass オブジェクトは、さまざまなレベルのストレージとストレージへのアクセスを制御するための管理メカニズムとしても機能します。クラスター管理者 (cluster-admin
) またはストレージ管理者 (storage-admin
) は、ユーザーが基礎となるストレージボリュームソースに関する詳しい知識がなくても要求できる StorageClass オブジェクトを定義し、作成します。
OpenShift Container Platform の永続ボリュームフレームワークは、この機能を有効にし、管理者がクラスターに永続ストレージをプロビジョニングできるようにします。このフレームワークにより、ユーザーは基礎となるインフラストラクチャーの知識がなくてもこれらのリソースを要求できるようになります。
OpenShift Container Platform では、数多くのストレージタイプを永続ボリュームとして使用できます。これらはすべて管理者によって静的にプロビジョニングされますが、一部のストレージタイプは組み込みプロバイダーとプラグイン API を使用して動的に作成できます。
動的プロビジョニングを有効にするには、openshift_master_dynamic_provisioning_enabled
変数を Ansible インベントリーファイルの [OSEv3:vars]
セクションに追加し、その値を True
に設定します。
[OSEv3:vars] openshift_master_dynamic_provisioning_enabled=True
24.15.2. 動的にプロビジョニングされる使用可能なプラグイン
OpenShift Container Platform は、以下のプロビジョナープラグインを提供します。これらには、クラスターの設定済みプロバイダーの API を使用して新規ストレージリソースを作成する動的プロビジョニング用の一般的な実装が含まれます。
ストレージタイプ | プロビジョナープラグインの名前 | 必要な設定 | 備考 |
---|---|---|---|
OpenStack Cinder |
| ||
AWS Elastic Block Store (EBS) |
|
複数クラスターを別々のゾーンで使用する際の動的プロビジョニングの場合、各ノードに | |
GCE Persistent Disk (gcePD) |
|
マルチゾーン設定では、PV が現行クラスターのノードが存在しないゾーンで作成されないようにするため、Openshift クラスターを GCE プロジェクトごとに実行することが推奨されます。 | |
GlusterFS |
| ||
Ceph RBD |
| ||
NetApp の Trident |
|
NetApp ONTAP、SolidFire、および E-Series ストレージ向けのストレージオーケストレーター。 | |
| |||
Azure Disk |
|
選択したプロビジョナープラグインでは、関連するクラウド、ホスト、またはサードパーティープロバイダーを、関連するドキュメントに従って設定する必要もあります。
24.15.3. StorageClass の定義
現時点で、StorageClass オブジェクトはグローバルなスコープ付きオブジェクトであり、cluster-admin
または storage-admin
ユーザーによって作成される必要があります。
GCE と AWS の場合、デフォルトの StorageClass が OpenShift Container Platform のインストール時に作成されます。デフォルトの StorageClass を変更または削除することができます。
現時点で 6 つのプラグインがサポートされています。以下のセクションでは、StorageClass の基本オブジェクトの定義とサポートされている各プラグインタイプの具体的な例について説明します。
24.15.3.1. 基本 StorageClass オブジェクトの定義
StorageClass 基本オブジェクトの定義
kind: StorageClass 1 apiVersion: storage.k8s.io/v1 2 metadata: name: foo 3 annotations: 4 ... provisioner: kubernetes.io/plug-in-type 5 parameters: 6 param1: value ... paramN: value
24.15.3.2. StorageClass のアノテーション
StorageClass をクラスター全体のデフォルトとして設定するには、以下を実行します。
storageclass.kubernetes.io/is-default-class: "true"
これにより、特定のボリュームを指定しない Persistent Volume Claim (永続ボリューム要求、PVC) が デフォルト StorageClass によって自動的にプロビジョニングされるようになります。
ベータアノテーションの storageclass.beta.kubernetes.io/is-default-class
は以前として使用可能ですが、今後のリリースで削除される予定です。
StorageClass の記述を設定するには、以下のように指定します。
kubernetes.io/description: My StorageClass Description
24.15.3.3. OpenStack Cinder オブジェクトの定義
cinder-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: gold provisioner: kubernetes.io/cinder parameters: type: fast 1 availability: nova 2 fsType: ext4 3
24.15.3.4. AWS ElasticBlockStore (EBS) オブジェクトの定義
aws-ebs-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: slow provisioner: kubernetes.io/aws-ebs parameters: type: io1 1 zone: us-east-1d 2 iopsPerGB: "10" 3 encrypted: "true" 4 kmsKeyId: keyvalue 5 fsType: ext4 6
- 1
- 2
- AWS ゾーン。ゾーンを指定しない場合、ボリュームは通常、OpenShift Container Platform クラスターのノードがあるすべてのアクティブゾーンでラウンドロビンされます。zone パラメーターと zones パラメーターを同時に使用することはできません。
- 3
- io1 ボリュームのみ。1 GiB あたり 1 秒あたりの I/O 処理数。AWS ボリュームプラグインは、この値と要求されたボリュームのサイズを乗算してボリュームの IOPS を算出します。値の上限は、AWS でサポートされる最大値である 20,000 IOPS です。詳細については、AWS のドキュメントを参照してください。
- 4
- EBS ボリュームを暗号化するかどうかを示します。有効な値は
true
またはfalse
です。 - 5
- オプション。ボリュームを暗号化する際に使用するキーの完全な ARN。値を指定しない場合でも
encypted
がtrue
に設定されている場合は、AWS によってキーが生成されます。有効な ARN 値については、AWS のドキュメントを参照してください。 - 6
- 動的にプロビジョニングされたボリュームで作成されるファイルシステム。この値は、動的にプロビジョニングされる永続ボリュームの
fsType
フィールドにコピーされ、ボリュームの初回マウント時にファイルシステムが作成されます。デフォルト値はext4
です。
24.15.3.5. GCE PersistentDisk (gcePD) オブジェクトの定義
gce-pd-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: slow provisioner: kubernetes.io/gce-pd parameters: type: pd-standard 1 zone: us-central1-a 2 zones: us-central1-a, us-central1-b, us-east1-b 3 fsType: ext4 4
- 1
pd-standard
またはpd-ssd
のいずれかを選択します。デフォルトはpd-ssd
です。- 2
- GCE ゾーン。ゾーンを指定しない場合、ボリュームは通常、OpenShift Container Platform クラスターのノードがあるすべてのアクティブゾーンでラウンドロビンされます。zone パラメーターと zones パラメーターを同時に使用することはできません。
- 3
- GCE ゾーンのカンマ区切りの一覧。ゾーンを指定しない場合、ボリュームは通常、OpenShift Container Platform クラスターのノードがあるすべてのアクティブゾーンでラウンドロビンされます。zone パラメーターと zones パラメーターを同時に使用することはできません。
- 4
- 動的にプロビジョニングされたボリュームで作成されるファイルシステム。この値は、動的にプロビジョニングされる永続ボリュームの
fsType
フィールドにコピーされ、ボリュームの初回マウント時にファイルシステムが作成されます。デフォルト値はext4
です。
24.15.3.6. GlusterFS オブジェクトの定義
glusterfs-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: slow provisioner: kubernetes.io/glusterfs parameters: resturl: "http://127.0.0.1:8081" 1 restuser: "admin" 2 secretName: "heketi-secret" 3 secretNamespace: "default" 4 gidMin: "40000" 5 gidMax: "50000" 6
- 1
- GlusterFS ボリュームをオンデマンドでプロビジョニングする heketi (Gluster 用のボリューム管理 REST サービス) URL。一般的な形式は
{http/https}://{IPaddress}:{Port}
です。GlusterFS 動的プロビジョナーの場合、これは必須パラメーターです。heketi サービスが OpenShift Container Platform で ルーティング可能なサービスとして公開されている場合には、解決可能な完全修飾ドメイン名 (FQDN) と heketi サービス URL が割り当てられます。 - 2
- ボリュームを作成するためのアクセスを持つ heketi ユーザー。通常は「admin」です。
- 3
- heketi との通信に使用するユーザーパスワードを含むシークレットの ID。オプションです。
secretNamespace
とsecretName
の両方を省略した場合、空のパスワードが使用されます。指定するシークレットは"kubernetes.io/glusterfs"
タイプである必要があります。 - 4
- 前述の
secretName
の namespace。オプションです。secretNamespace
とsecretName
の両方を省略した場合、空のパスワードが使用されます。指定するシークレットは"kubernetes.io/glusterfs"
タイプである必要があります。 - 5
- オプション。この StorageClass のボリュームの GID 範囲の最小値です。
- 6
- オプション。この StorageClass のボリュームの GID 範囲の最大値です。
gidMin
値と gidMax
値を指定しない場合、デフォルトはそれぞれ 2000 と 2147483647 になります。動的にプロビジョニングされる各ボリュームには、この範囲 (gidMin-gidMax
) の GID が割り当てられます。GID は、対応するボリュームが削除されるとプールから解放されます。GID プールは StorageClass ごとに設定されます。複数のストレージクラス間で GID 範囲が重複している場合、プロビジョナーによって、重複する GID が割り当てられる可能性があります。
heketi 認証を使用する場合は、管理キーを含むシークレットも存在している必要があります。
heketi-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: heketi-secret
namespace: default
data:
key: bXlwYXNzd29yZA== 1
type: kubernetes.io/glusterfs
- 1
- base64 でエンコードされたパスワード。例:
echo -n "mypassword" | base64
PV が動的にプロビジョニングされると、GlusterFS プラグインによってエンドポイントと gluster-dynamic-<claimname>
という名前のヘッドレスサービスが自動的に作成されます。PVC が削除されると、これらの動的リソースは自動的に削除されます。
24.15.3.7. Ceph RBD オブジェクトの定義
ceph-storageclass.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast provisioner: kubernetes.io/rbd parameters: monitors: 10.16.153.105:6789 1 adminId: admin 2 adminSecretName: ceph-secret 3 adminSecretNamespace: kube-system 4 pool: kube 5 userId: kube 6 userSecretName: ceph-secret-user 7 fsType: ext4 8
- 1
- Ceph モニター (カンマ区切り)。必須です。
- 2
- Ceph クライアント ID。これにより、プール内にイメージを作成できます。デフォルトは「admin」です。
- 3
adminId
のシークレット名。必須です。設定するシークレットのタイプは「kubernetes.io/rbd」である必要があります。- 4
adminSecret
の namespace。デフォルトは「default」です。- 5
- Ceph RBD プール。デフォルトは「rbd」です。
- 6
- Ceph RBD イメージのマッピングに使用される Ceph クライアント ID。デフォルトは
adminId
と同じです。 - 7
- Ceph RBD イメージをマッピングするために使用する
userId
用の Ceph シークレットの名前。PVC と同じ namespace に存在する必要があります。必須です。 - 8
- 動的にプロビジョニングされたボリュームで作成されるファイルシステム。この値は、動的にプロビジョニングされる永続ボリュームの
fsType
フィールドにコピーされ、ボリュームの初回マウント時にファイルシステムが作成されます。デフォルト値はext4
です。
24.15.3.8. Trident オブジェクトの定義
trident.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: gold provisioner: netapp.io/trident 1 parameters: 2 media: "ssd" provisioningType: "thin" snapshots: "true"
Trident は、これらのパラメーターを Trident に登録されているさまざまなストレージプールの選択条件として使用します。Trident 自体は個別に設定されます。
- 1
- Trident を OpenShift Container Platform にインストールする方法の詳細については、Trident のドキュメントを参照してください。
- 2
- サポートされているパラメーターの詳細については、Trident のドキュメントのストレージ属性に関するセクションを参照してください。
24.15.3.9. VMWare vSphere オブジェクトの定義
vsphere-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1beta1 metadata: name: slow provisioner: kubernetes.io/vsphere-volume 1 parameters: diskformat: thin 2
- 1
- VMWare vSphere を OpenShift Container Platform で使用する方法の詳細については、VMWare vSphere のドキュメントを参照してください。
- 2
diskformat
:thin
、zeroedthick
、およびeagerzeroedthick
。詳細については、vSphere のドキュメントを参照してください。デフォルト:thin
24.15.3.10. Azure Disk オブジェクト定義
azure-advanced-disk-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: slow provisioner: kubernetes.io/azure-disk parameters: storageAccount: azure_storage_account_name 1 storageaccounttype: Standard_LRS 2 kind: Dedicated 3
- 1
- Azure ストレージアカウントの名前。これはクラスターと同じリソースグループに存在している必要があります。ストレージアカウントを指定した場合、
location
は無視されます。ストレージアカウントを指定しない場合、新しいストレージアカウントがクラスターと同じリソースグループに作成されます。storageAccount
を指定する場合は、kind
の値はDedicated
でなければなりません。 - 2
- Azure ストレージアカウントの SKU の層。デフォルトは空です。注: プレミアム VM は Standard_LRS ディスクと Premium_LRS ディスクの両方を割り当て、標準 VM は Standard_LRS ディスクのみを、マネージド VM はマネージドディスクのみを、アンマネージド VM はアンマネージドディスクのみを割り当てることができます。
- 3
- 許容値は、
Shared
(デフォルト)、Dedicated
およびManaged
です。-
kind
がShared
に設定されている場合は、Azure は、クラスターと同じリソースグループにあるいくつかの共有ストレージアカウントに、アンマネージドディスクをすべて作成します。 -
kind
がManaged
に設定されている場合は、Azure は新しいマネージドディスクを作成します。 kind
がDedicated
に設定されており、storageAccount
が指定されている場合には、Azure は、クラスターと同じリソースグループ内にある新規のアンマネージドディスク用に、指定のストレージアカウントを使用します。これを機能させるには、以下が前提となっています。- 指定のストレージアカウントが、同じリージョン内にあること。
- Azure Cloud Provider にストレージアカウントへの書き込み権限があること。
-
kind
がDedicated
に設定されており、storageAccount
が指定されていない場合には、Azure はクラスターと同じリソースグループ内の新規のアンマネージドディスク用に、新しい専用のストレージアカウントを作成します。
-
Azure StorageClass は OpenShift Container Platform バージョン 3.7 で改訂され、以前のバージョンからアップグレードした場合には、以下のいずれかを行ってください。
-
kind: dedicated
のプロパティーを指定して、アップグレード前に作成した Azure StorageClass を使用し続ける。または、 -
azure.conf ファイルにロケーションのパラメーター (例:
"location": "southcentralus",
) を追加して、デフォルトのプロパティーkind: shared
を使用します。こうすることで、新しいストレージアカウントを作成し、今後使用できるようになります。
24.15.4. デフォルト StorageClass の変更
GCE と AWS を使用している場合にデフォルトの StorageClass を変更するには、以下のプロセスを使用します。
StorageClass の一覧を表示します。
$ oc get storageclass NAME TYPE gp2 (default) kubernetes.io/aws-ebs 1 standard kubernetes.io/gce-pd
- 1
(default)
はデフォルトの StorageClass を示します。
デフォルトの StorageClass のアノテーション
storageclass.kubernetes.io/is-default-class
の値をfalse
に変更します。$ oc patch storageclass gp2 -p '{"metadata": {"annotations": \ {"storageclass.kubernetes.io/is-default-class": "false"}}}'
アノテーション
storageclass.kubernetes.io/is-default-class=true
を追加するか、このアノテーションに変更して別の StorageClass をデフォルトにします。$ oc patch storageclass standard -p '{"metadata": {"annotations": \ {"storageclass.kubernetes.io/is-default-class": "true"}}}'
変更内容を確認します。
$ oc get storageclass NAME TYPE gp2 kubernetes.io/aws-ebs standard (default) kubernetes.io/gce-pd
24.15.5. 追加情報とサンプル
24.16. ボリュームのセキュリティー
24.16.1. 概要
このトピックでは、ボリュームのセキュリティーに関連する Pod のセキュリティーについての一般的なガイドを提供します。Pod レベルのセキュリティーに関する全般的な情報については、「SCC (Security Context Constraints) の管理」と SCC (Security Context Constraints) の概念に関するトピックを参照してください。OpenShift Container Platform の永続ボリューム (PV) フレームワークに関する全般的な情報については、永続ストレージの概念に関するトピックを参照してください。
永続ストレージにアクセスするには、クラスター管理者/ストレージ管理者とエンド開発者間の調整が必要です。クラスター管理者は、基礎となる物理ストレージを抽象化する PV を作成します。開発者は、容量などの一致条件に基づいて Pod と (必要に応じて) PV にバインドされる PVC を作成します。
同じプロジェクト内の複数の Persistent Volume Claim (永続ボリューム要求、PVC) を同じ PV にバインドできます。ただし、PVC を PV にバインドすると、最初の要求のプロジェクトの外部にある要求をその PV にバインドできなくなります。基礎となるストレージに複数のプロジェクトからアクセスする必要がある場合は、プロジェクトごとに独自の PV が必要です。これらの PV は同じ物理ストレージを参照できます。これに関連して、バインドされる PV はプロジェクトに結び付けられます。PV と PVC の詳細な例については、「WordPress and MySQL using NFS」を参照してください。
クラスター管理者が PV への Pod アクセスを許可するには、以下を行う必要があります。
- 実際のストレージに割り当てられるグループ ID またはユーザー ID を把握しておく
- SELinux に関する考慮事項を理解しておく
- これらの ID が Pod の要件に一致するプロジェクトまたは SCC に対して定義される正式な ID の範囲で許可されることを確認する
グループ ID、ユーザー ID および SELinux の値は、Pod 定義の SecurityContext
セクションで定義します。グループ ID は、Pod に対してグローバルであり、Pod で定義されるすべてのコンテナーに適用されます。ユーザー ID は同様にグローバルにすることも、コンテナーごとに固有にすることもできます。ボリュームへのアクセスは以下の 4 つのセクションで制御します。
24.16.2. SCC、デフォルト値および許可される範囲
SCC は、デフォルトのユーザー ID、fsGroup
ID、補助グループ ID、および SELinux ラベルが Pod に割り当てられるかどうかに影響します。また、Pod 定義 (またはイメージ) で指定される ID が許容可能な ID の範囲に対して検証されるかどうかにも影響します。検証が必要な場合で検証が失敗すると、Pod も失敗します。
SCC は、runAsUser
、supplementalGroups
、fsGroup
などのストラテジーを定義します。これらのストラテジーは Pod が承認されるかどうかを判断するのに役立ちます。RunAsAny に設定されるストラテジーの値は、Pod がそのストラテジーに関して必要なことを何でも実行できるということを実質的に宣言するものです。そのストラテジーに対する承認は省略され、そのストラテジーに基づいて生成される OpenShift Container Platform のデフォルト値はありません。したがって、生成されるコンテナーの ID と SELinux ラベルは、OpenShift Container Platform ポリシーではなく、コンテナーのデフォルトに基づいて割り当てられます。
以下に RunAsAny の簡単な概要を示します。
- Pod 定義 (またはイメージ) に定義されるすべての ID が許可されます。
- Pod 定義 (およびイメージ) に ID がない場合は、コンテナーによって ID が割り当てられます。Docker の場合、この ID は root (0) です。
- SELinux ラベルは定義されないため、Docker によって一意のラベルが割り当てられます。
このような理由により、ID 関連のストラテジーについて RunAsAny が設定された SCC は、通常の開発者がアクセスできないように保護する必要があります。一方、MustRunAs または MustRunAsRange に設定された SCC ストラテジーは、(ID 関連のストラテジーについての) ID 検証をトリガーします。その結果、Pod 定義またはイメージに値が直接指定されていない場合は、OpenShift Container Platform によってデフォルト値がコンテナーに割り当てられます。
RunAsAny FSGroup
ストラテジーが設定された SCC へのアクセスを許可すると、ユーザーがブロックデバイスにアクセスするのを防止することもできます。Pod では、ユーザーのブロックデバイスを引き継ぐために fsGroup
を指定する必要があります。通常、これを行うには、SCC FSGroup
ストラテジーを MustRunAs に設定します。ユーザーの Pod に RunAsAny FSGroup
ストラテジーが設定された SCC が割り当てられている場合、ユーザーが fsGroup
ストラテジーを各自で指定する必要があることに気づくまで、permission denied エラーが出される可能性があります。
SCC では、許可される ID (ユーザーまたはグループ) の範囲を定義できます。範囲チェックが必要な場合 (MustRunAs を使用する場合など) で、許容可能な範囲が SCC で定義されていない場合は、プロジェクトによって ID 範囲が決定されます。したがって、プロジェクトでは、許容可能な ID の範囲がサポートされます。ただし、SCC とは異なり、プロジェクトは runAsUser
などのストラテジーを定義しません。
許容可能な範囲を設定すると、コンテナー ID の境界を定義するだけでなく、範囲の最小値を対象の ID のデフォルト値にできるので役に立ちます。たとえば、SCC ID ストラテジーの値が MustRunAs で、ID 範囲の最小値が 100で、ID が Pod 定義に存在しない場合、100 がこの ID のデフォルト値になります。
Pod の受付プロセスの一環として、Pod で使用可能な SCC が (ほとんどの場合は優先順位の高い SCC から最も制限の厳しい SCC の順序で) 検査され、Pod の要求に最も一致する SCC が選択されます。SCC のストラテジータイプを RunAsAny に設定すると、制限が緩和されます。一方、MustRunAs タイプに設定すると、制限がより厳しくなります。これらすべてのストラテジーが評価されます。Pod に割り当てられた SCC を確認するには、oc get pod
コマンドを使用します。
# oc get pod <pod_name> -o yaml ... metadata: annotations: openshift.io/scc: nfs-scc 1 name: nfs-pod1 2 namespace: default 3 ...
- 1
- Pod が使用した SCC (この場合は、カスタム SCC) の名前。
- 2
- Pod の名前。
- 3
- プロジェクトの名前。OpenShift Container Platform では、「namespace」と「プロジェクト」は置き換え可能な用語として使用されています。詳細については、「Projects and Users」を参照してください。
Pod で一致した SCC をすぐに確認できない場合があります。そのため、上記のコマンドは、ライブコンテナーの UID、補助グループ、および SELinux のラベル変更を理解するのに非常に役立ちます。
ストラテジーが RunAsAny に設定された SCC では、そのストラテジーの特定の値を Pod 定義 (またはイメージ) に定義できます。これがユーザー ID (runAsUser
) に適用される場合、コンテナーが root として実行されないように SCC へのアクセスを制限することが推奨されます。
Pod が 制限付き SCC に一致することが多くあるため、これに伴うセキュリティーについて理解しておくことが重要です。制限付き SCC には以下の特性があります。
-
runAsUser
ストラテジーが MustRunAsRange に設定されているため、ユーザー ID が制限されます。これにより、ユーザー ID の検証が強制的に実行されます。 -
許容可能なユーザー ID の範囲が SCC で定義されないため (詳細については、
oc export scc restricted
を参照してください)、プロジェクトのopenshift.io/sa.scc.uid-range
範囲が範囲チェックとデフォルト ID に使用されます (必要な場合)。 -
デフォルトのユーザー ID は、ユーザー ID が Pod 定義で指定されておらず、一致する SCC の
runAsUser
が MustRunAsRange に設定されている場合に生成されます。 -
SELinux ラベルが必要です (
seLinuxContext
が MustRunAs に設定されているため)。プロジェクトのデフォルトの MCS ラベルが使用されます。 -
FSGroup
ストラテジーが MustRunAs に設定され、指定される最初の範囲の最小値を値に使用するように指示されているため、fsGroup
ID が単一の値に制限されます。 -
許容可能な
fsGroup
ID の範囲が SCC で定義されないため、プロジェクトのopenshift.io/sa.scc.supplemental-groups
の範囲 (またはユーザー ID に使用されるものと同じ範囲) の最小値が検証とデフォルト ID に使用されます (必要な場合)。 -
デフォルトの
fsGroup
ID は、fsGroup
ID が Pod で指定されておらず、一致する SCC のFSGroup
が MustRunAs に設定されている場合に生成されます。 -
範囲チェックが必要でないため、任意の補助グループ ID が許可されます。これは
supplementalGroups
ストラテジーが RunAsAny に設定されているためです。 - 実行中の Pod に対してデフォルトの補助グループは生成されません。上記の 2 つのストラテジーについて RunAsAny が設定されているためです。したがって、グループが Pod 定義 (またはイメージ) に定義されていない場合は、コンテナーには補助グループが事前に定義されません。
以下に、SCC とプロジェクトの相互関係をまとめた default プロジェクトとカスタム SCC (my-custom-scc) の例を示します。
$ oc get project default -o yaml 1 ... metadata: annotations: 2 openshift.io/sa.scc.mcs: s0:c1,c0 3 openshift.io/sa.scc.supplemental-groups: 1000000000/10000 4 openshift.io/sa.scc.uid-range: 1000000000/10000 5 $ oc get scc my-custom-scc -o yaml ... fsGroup: type: MustRunAs 6 ranges: - min: 5000 max: 6000 runAsUser: type: MustRunAsRange 7 uidRangeMin: 1000100000 uidRangeMax: 1000100999 seLinuxContext: 8 type: MustRunAs SELinuxOptions: 9 user: <selinux-user-name> role: ... type: ... level: ... supplementalGroups: type: MustRunAs 10 ranges: - min: 5000 max: 6000
- 1
- default はプロジェクトの名前です。
- 2
- デフォルト値は、対応する SCC 戦略が RunAsAny でない場合にのみ生成されます。
- 3
- Pod 定義または SCC で定義されていない場合の SELinux のデフォルト値です。
- 4
- 許容可能なグループ ID の範囲です。ID の検証は、SCC ストラテジーが RunAsAny の場合にのみ実行されます。複数の範囲をカンマで区切って指定できます。サポートされている形式についてはこちらを参照してください。
- 5
- <4> と同じですが、ユーザー ID に使用されます。また、ユーザー ID の単一の範囲のみがサポートされます。
- 6 10
- MustRunAs は、グループ ID の範囲チェックを実施して、コンテナーのグループのデフォルトを指定します。この SCC の定義に基づく場合、デフォルトは 5000 になります (最小の ID 値)。範囲が SCC から省略される場合、デフォルトは 1000000000 になります (プロジェクトから派生します)。サポートされている別のタイプ RunAsAny では、範囲チェックを実行しないため、いずれのグループ ID も許可され、デフォルトグループは生成されません。
- 7
- MustRunAsRange は、ユーザー ID の範囲チェックを実施して、UID のデフォルトを指定します。この SCC の定義に基づく場合、デフォルトの UID は 1000100000 になります (最小値)。最小範囲と最大範囲が SCC から省略される場合、デフォルトのユーザー ID は 1000000000 になります (プロジェクトから派生します)。これ以外には MustRunAsNonRoot と RunAsAny のタイプがサポートされます。許可される ID の範囲は、ターゲットのストレージに必要ないずれのユーザー ID も含めるように定義することができます。
- 8
- MustRunAs に設定した場合は、コンテナーは SCC の SELinux オプション、またはプロジェクトに定義される MCS のデフォルトを使用して作成されます。RunAsAny というタイプは、SELinux コンテキストが不要であることや、Pod に定義されていない場合はコンテナーに設定されないことを示します。
- 9
- SELinux のユーザー名、ロール名、タイプ、およびラベルは、ここで定義できます。
2 つの形式が許可される範囲にサポートされています。
-
M/N
。M
は開始 ID でN
はカウントです。したがって、範囲はM
からM+N-1
(これ自体を含む) までになります。 -
M-N
。M
は同じく開始 ID でN
は終了 ID です。デフォルトのグループ ID が最初の範囲の開始 ID になります (このプロジェクトでは1000000000
desu )。SCC で最小のグループ ID が定義されていない場合は、プロジェクトのデフォルトの ID が適用されます。
24.16.3. 補助グループ
補助グループの操作にあたっては、事前に「SCC、デフォルト、許可される範囲」の説明をお読みください。
補助グループは Linux の正規グループです。Linux で実行されるプロセスには、UID、GID、および 1 つ以上の補助グループがあります。これらの属性はコンテナーのメインプロセスで設定されます。supplementalGroups
ID は、通常は NFS や GlusterFS などの共有ストレージへのアクセスを制御する場合に使用されます。一方、fsGroup は Ceph RBD や iSCSI などのブロックストレージへのアクセスを制御する場合に使用されます。
OpenShift Container Platform の共有ストレージプラグインは、マウントの POSIX パーミッションとターゲットストレージのパーミッションが一致するようにボリュームをマウントします。たとえば、ターゲットストレージの所有者 ID が 1234 で、そのグループ ID が 5678 の場合、ホストノードのマウントとコンテナーのマウントはそれらの同じ ID を持ちます。したがって、ボリュームにアクセスするためにはコンテナーのメインプロセスがこれらの ID の一方または両方と一致する必要があります。
たとえば、以下の NFS エクスポートについて見てみましょう。
OpenShift Container Platform ノード側:
showmount
では、NFS サーバーの rpcbind
および rpc.mount
が使用するポートへのアクセスが必要です。
# showmount -e <nfs-server-ip-or-hostname> Export list for f21-nfs.vm: /opt/nfs *
NFS サーバー側:
# cat /etc/exports /opt/nfs *(rw,sync,root_squash) ... # ls -lZ /opt/nfs -d drwx------. 1000100001 5555 unconfined_u:object_r:usr_t:s0 /opt/nfs
/opt/nfs/ エクスポートには UID 1000100001 とグループ 5555 でアクセスすることができます。通常、コンテナーは root として実行しないようにする必要があります。そのため、この NFS の例では、UID 1000100001 として実行されないコンテナーやグループ 5555 のメンバーでないコンテナーは、NFS エクスポートにアクセスできません。
多くの場合、Pod と一致する SCC では特定のユーザー ID の指定は許可されません。そのため、Pod へのストレージアクセスを許可する場合には、補助グループを使用する方法はより柔軟な方法として使用できます。たとえば、前述のエクスポートへの NFS アクセスを許可する場合は、グループ 5555 を Pod 定義に定義できます。
apiVersion: v1 kind: Pod ... spec: containers: - name: ... volumeMounts: - name: nfs 1 mountPath: /usr/share/... 2 securityContext: 3 supplementalGroups: [5555] 4 volumes: - name: nfs 5 nfs: server: <nfs_server_ip_or_host> path: /opt/nfs 6
- 1
- ボリュームマウントの名前。
volumes
セクションの名前と一致する必要があります。 - 2
- コンテナーで表示される NFS エクスポートのパス。
- 3
- Pod のグローバルセキュリティーコンテキスト。Pod 内部のすべてのコンテナーに適用されます。コンテナーではそれぞれ独自の
securityContext
を定義することもできますが、グループ ID は Pod に対してグローバルであり、個々のコンテナーに対して定義することはできません。 - 4
- 補助グループ (ID の配列) は 5555 に設定しています。これで、エクスポートへのグループアクセスが許可されます。
- 5
- ボリュームの名前。
volumeMounts
セクションの名前と一致する必要があります。 - 6
- NFS サーバー上の実際の NFS エクスポートのパス。
前述の Pod にあるすべてのコンテナー (一致する SCC またはプロジェクトでグループ 5555 を許可することを前提とします) は、グループ 5555 のメンバーとなり、コンテナーのユーザー ID に関係なくボリュームにアクセスできます。ただし、ここでの前提条件に留意してください。場合によっては、SCC が許可されるグループ ID の範囲を定義されておらず、代わりにグループ ID の検証が必要になることがあります (supplementalGroups
を MustRunAs に設定した結果など)。ただし、制限付き SCC の場合はこれと異なります。プロジェクトがこの NFS エクスポートにアクセスするようにカスタマイズされていない限り、通常プロジェクトが 5555 というグループ ID を許可することはありません。したがって、このシナリオでは、前述の Pod の 5555 というグループ ID は SCC またはプロジェクトの許可されたグループ ID の範囲内にないために Pod は失敗します。
補助グループとカスタム SCC
前述の例にあるような状況に対応するため、以下のようカスタム SCC を作成することができます。
- 最小と最大のグループ ID を定義する。
- ID の範囲チェックを実施する。
- グループ ID 5555 を許可する。
多くの場合、定義済みの SCC を修正したり、定義済みプロジェクトで許可される ID の範囲を変更したりするよりも、新規の SCC を作成する方が適切です。
新規 SCC を作成するには、既存の SCC をエクスポートし、新規の SCC の要件を満たすように YAML ファイルをカスタマイズするのが最も簡単な方法です。たとえば、以下を実行します。
制限付き SCC を新規 SCC のテンプレートとして使用します。
$ oc export scc restricted > new-scc.yaml
- 必要な仕様に合うように new-scc.yaml ファイルを編集します。
新規 SCC を作成します。
$ oc create -f new-scc.yaml
oc edit scc
コマンドを使用して、インスタンス化された SCC を修正することができます。
以下の例は nfs-scc という名前の新規 SCC の一部です。
$ oc export scc nfs-scc allowHostDirVolumePlugin: false 1 ... kind: SecurityContextConstraints metadata: ... name: nfs-scc 2 priority: 9 3 ... supplementalGroups: type: MustRunAs 4 ranges: - min: 5000 5 max: 6000 ...
- 1
allow
ブール値は制限付き SCC の場合と同じです。- 2
- 新規 SCC の名前。
- 3
- 数値が大きいほど優先順位が高くなります。Nil の場合や省略した場合は優先順位が最も低くなります。優先順位が高い SCC は優先順位が低い SCC より前に並べ替えられるため、新規 Pod と一致する確率が高くなります。
- 4
supplementalGroups
はストラテジーであり、MustRunAs に設定されています。つまり、グループ ID のチェックが必要になります。- 5
- 複数の範囲を使用することができます。ここで許可されるグループ ID の範囲は 5000 ~ 5999 で、デフォルトの補助グループは 5000 です。
前述の Pod をこの新規 SCC に対して実行すると (当然ですが Pod が新規 SCC に一致することを前提とします)、Pod が開始されます。これは、Pod 定義で指定したグループ 5555 がカスタム SCC によって許可されるようになったためです。
24.16.4. fsGroup
補助グループの操作にあたっては、事前に「SCC、デフォルト、許可される範囲」の説明をお読みください。
fsGroup
は Pod の「ファイルシステムグループ」の ID を定義するもので、コンテナーの補助グループに追加されます。supplementalGroups
の ID は共有ストレージに適用されますが、fsGroup
の ID はブロックストレージに使用されます。
ブロックストレージ (Ceph RBD、iSCSI、各種クラウドストレージなど) は通常、ブロックストレージボリュームを直接に、または PVC を使用して要求した単一 Pod に専用のものとして設定されます。共有ストレージとは異なり、ブロックストレージは Pod によって引き継がれます。つまり、Pod 定義 (またはイメージ) で指定されたユーザー ID とグループ ID が実際の物理ブロックデバイスに適用されます。通常、ブロックストレージは共有されません。
以下の fsGroup
の定義は Pod 定義の一部分です。
kind: Pod ... spec: containers: - name: ... securityContext: 1 fsGroup: 5555 2 ...
supplementalGroups
と同様に、前述の Pod にあるすべてのコンテナー (一致する SCC またはプロジェクトでグループ 5555 を許可することを前提とします) は、グループ 5555 のメンバーとなり、コンテナーのユーザー ID に関係なくブロックボリュームにアクセスできます。Pod が制限付き SCC に一致し、その fsGroup
ストラテジーが MustRunAs である場合、Pod の実行は失敗します。しかし、SCC の fsGroup
ストラテジーを RunAsAny に設定した場合は、任意の fsGroup
ID (5555 を含む) が許可されます。SCC の fsGroup
ストラテジーを RunAsAny に設定して、fsGroup
ID を指定しない場合は、ブロックストレージの「引き継ぎ」は行われず、Pod へのパーミッションが拒否される可能性があります。
fsGroups とカスタム SCC
前述の例にあるような状況に対応するため、以下のようにカスタム SCC を作成することができます。
- 最小と最大のグループ ID を定義する。
- ID の範囲チェックを実施する。
- グループ ID 5555 を許可する。
定義済みの SCC を修正したり、定義済みプロジェクトで許可される ID の範囲を変更したりするよりも、新規の SCC を作成する方が適切です。
以下の新規 SCC の定義の一部について見てみましょう。
# oc export scc new-scc ... kind: SecurityContextConstraints ... fsGroup: type: MustRunAs 1 ranges: 2 - max: 6000 min: 5000 3 ...
- 1
- MustRunAs ではグループ ID の範囲チェックをトリガーします。一方、RunAsAny では範囲チェックは必要ありません。
- 2
- 許可されるグループ ID の範囲は 5000 ~ 5999 (これら自体を含む) です。複数の範囲がサポートされていますが、1 つしか使用していません。ここで許可されるグループ ID の範囲は 5000 ~ 5999 で、デフォルトの
fsGroup
は 5000 です。 - 3
- 最小値 (または範囲全体) を SCC から省略することができます。その場合、範囲のチェックとデフォルト値の生成はプロジェクトの
openshift.io/sa.scc.supplemental-groups
の範囲に従います。fsGroup
とsupplementalGroups
ではプロジェクト内の同じグループフィールドが使用されます。fsGroup
に別の範囲が存在する訳ではありません。
前述の Pod をこの新規 SCC に対して実行すると (当然ですが Pod が新しい SCC に一致することを前提とします)、Pod が開始されます。これは、Pod 定義で指定したグループ 5555 がカスタム SCC によって許可されているためです。また、Pod でブロックデバイスの「引き継ぎ」が行われます。そのため、ブロックストレージを Pod の外部のプロセスから表示する場合、そのグループ ID は実際には 5555 になります。
以下は、ブロックの所有権をサポートしているボリュームの例です。
- AWS Elastic Block Store
- OpenStack Cinder
- Ceph RBD
- GCE Persistent Disk
- iSCSI
- emptyDir
- gitRepo
この一覧にはすべてが網羅されている訳ではありません。
24.16.5. ユーザー ID
補助グループの操作にあたっては、事前に「SCC、デフォルト、許可される範囲」の説明をお読みください。
ユーザー ID はコンテナーイメージまたは Pod 定義で定義できます。Pod 定義では、1 つのユーザー ID をすべてのコンテナーに対してグローバルに定義するか、個々のコンテナーに固有のものとして定義するか、またはその両方として定義できます。以下の Pod 定義の一部ではユーザー ID を指定しています。
spec: containers: - name: ... securityContext: runAsUser: 1000100001
1000100001 はコンテナー固有の ID であり、エクスポートの所有者 ID と一致します。NFS エクスポートの所有者 ID が 54321 である場合は、その番号が Pod 定義で使用されます。コンテナー定義の外部で securityContext
を指定すると、ID は Pod 内のすべてのコンテナーに対してグローバルになります。
グループ ID と同じように、SCC やプロジェクトで設定されているポリシーに従ってユーザー ID を検証することもできます。SCC の runAsUser
ストラテジーを RunAsAny に設定した場合は、Pod 定義またはイメージで定義されているすべてのユーザー ID が許可されます。
これは、0 (root) の UID も許可されることを意味します。
代わりに runAsUser
ストラテジーを MustRunAsRange に設定した場合は、指定したユーザー ID について、許可される ID の範囲にあるかどうかが検証されます。Pod でユーザー ID を指定しない場合は、デフォルト ID が許可されるユーザー ID の範囲の最小値に設定されます。
先の NFS の例に戻って、コンテナーでその UID を 1000100001 に設定する必要があります (上記の Pod の例を参照してください)。デフォルトプロジェクトと制限付き SCC を想定した場合、Pod で要求した 1000100001 というユーザー ID は許可されず、したがって Pod は失敗します。Pod が失敗するのは以下の理由によります。
- Pod が独自のユーザー ID として 1000100001 を要求している。
-
使用可能なすべての SCC が独自の
runAsUser
ストラテジーとして MustRunAsRange を使用しており、そのため UID の範囲チェックが要求される。 - 1000100001 が SCC にもプロジェクトのユーザー ID 範囲にも含まれていない。
この状況に対応するには、適切なユーザー ID 範囲を指定して新規 SCC を作成します。また、新規プロジェクトを適切なユーザー ID 範囲を定義して作成することもできます。さらに、以下のような推奨されない他のオプションがあります。
- 最小および最大のユーザー ID 範囲に 1000100001 を組み込むように 制限付き SCC を変更できます。ただし、これは定義済みの SCC の変更をできる限り避ける必要があるため推奨されません。
-
RunAsAny を
runAsUser
の値に使用できるように 制限付き SCC を変更できます。これにより、ID 範囲のチェックを省略できます。この方法ではコンテナーが root として実行される可能性があるため、この方法を使用しないことを「強く」推奨します。 - ユーザー ID 1000100001 を許可するように デフォルトプロジェクトの UID 範囲を変更できます。通常、この方法も推奨できません。ユーザー ID に単一範囲しか指定できず、範囲が変更された場合に他の Pod が実行されなくなる可能性があるためです。
ユーザー ID とカスタム SCC
定義済みの SCC を変更することは可能な限り避ける必要があります。組織のセキュリティー上のニーズに合ったカスタム SCC を作成するか、または必要なユーザー ID をサポートする新規プロジェクトを作成することを推奨します。
前述の例にあるような状況に対応するため、以下のようにカスタム SCC を作成することができます。
- 最小と最大のユーザー ID を定義する。
- UID の範囲チェックを引き続き実施する。
- 1000100001 という UID を許可する。
例を以下に示します。
$ oc export scc nfs-scc allowHostDirVolumePlugin: false 1 ... kind: SecurityContextConstraints metadata: ... name: nfs-scc 2 priority: 9 3 requiredDropCapabilities: null runAsUser: type: MustRunAsRange 4 uidRangeMax: 1000100001 5 uidRangeMin: 1000100001 ...
これで、先の例の Pod 定義に runAsUser: 1000100001
が表示され、Pod が新規の nfs-scc と一致し、UID 1000100001 で実行できるようになります。
24.16.6. SELinux オプション
特権付き SCC を除くすべての定義済み SCC では、seLinuxContext
を MustRunAs に設定します。そのため、Pod の要件と一致する可能性が高い SCC の場合、Pod での SELinux ポリシーの使用を強制的に実行します。Pod で使用される SELinux ポリシーは、その Pod 自体やイメージ、SCC、またはプロジェクト (デフォルトを指定する) で定義できます。
SELinux のラベルは Pod の securityContext.seLinuxOptions
セクションで定義でき、user
、role
、type
、および level
を使用できます。
このトピックでは、レベルと MCS ラベルを置き換え可能な用語として使用します。
... securityContext: 1 seLinuxOptions: level: "s0:c123,c456" 2 ...
以下の例は SCC とデフォルトプロジェクトからの抜粋です。
$ oc export scc scc-name ... seLinuxContext: type: MustRunAs 1 # oc export project default ... metadata: annotations: openshift.io/sa.scc.mcs: s0:c1,c0 2 ...
特権付き SCC を除くすべての定義済み SCC では、seLinuxContext
を MustRunAs に設定します。これにより、Pod での MCS ラベルの使用が強制的に実行されます。MCS ラベルは、Pod 定義やイメージで定義するか、またはデフォルトとして指定されます。
SCC によって、SELinux ラベルを必要とするかどうかが決まります。また、SCC でデフォルトラベルを指定できます。seLinuxContext
ストラテジーを MustRunAs に設定していて、Pod (またはイメージ) がラベルを定義していない場合は、OpenShift Container Platform は SCC 自体またはプロジェクトから選択されるラベルにデフォルト設定されます。
seLinuxContext
を RunAsAnyに設定した場合は、デフォルトラベルは提供されず、コンテナーによって最終的なラベルが決められます。Docker の場合、コンテナーでは一意の MCS ラベルが使用されますが、これが既存のストレージマウントのラベル付けに一致する可能性はほとんどありません。SELinux 管理をサポートしているボリュームについては、指定されるラベルからアクセスできるようにラベルの再設定がなされ、ラベルの排他性によってはそのラベルのみがアクセスできるようになります。
この場合、特権なしコンテナーについては以下の 2 つが関係します。
-
ボリュームには、特権なしのコンテナーからのアクセス可能なタイプが指定されます。このタイプは、通常は Red Hat Enterprise Linux (RHEL) バージョン 7.5 以降の
container_file_t
になります。このタイプはボリュームをコンテナーコンテキストとして処理します。以前の RHEL バージョンの RHEL 7.4、7.3 などでは、ボリュームにsvirt_sandbox_file_t
タイプが指定されます。 -
level
を指定した場合は、指定される MCS ラベルを使用してボュームのラベルが設定されます。
Pod からボリュームにアクセスできるようにするためには、Pod で両方のボリュームカテゴリーを持つ必要があります。たとえば、s0:c1,c2 を持つ Pod は、s0:c1,c2 のボリュームにアクセスでき、s0 のボリュームにはすべての Pod からアクセスできるようにします。
Pod で承認が失敗する場合、またはパーミッションエラーが原因でストレージのマウントが失敗している場合は、SELinux の実施による干渉が生じている可能性があります。これについては、たとえば以下を実行してチェックできます。
# ausearch -m avc --start recent
これは、ログファイルに AVC (Access Vector Cache) のエラーがないかどうかを検査します。
24.17. セレクターとラベルによるボリュームのバインディング
24.17.1. 概要
ここでは、selector 属性と label 属性を使用して Persistent Volume Claim (永続ボリューム要求、PVC) を永続ボリューム (PV) にバインドするための必要な手順について説明します。セレクターとラベルを実装することで、通常のユーザーは、クラスター管理者が定義する識別子を使用して、プロビジョニングされたストレージをターゲットに設定することができます。
24.17.2. 必要になる状況
静的にプロビジョニングされるストレージの場合、永続ストレージを必要とする開発者は、PVC をデプロイしてバインドするためにいくつかの PV の識別属性を把握しておく必要がありますが、その際、問題となる状況がいくつか生じます。通常のユーザーは、PVC のデプロイでも PV の値の指定においても、クラスター管理者に問い合わせをする必要が生じる場合があります。PV 属性だけでは、ストレージボリュームの用途も、ボリュームをグループ化する方法も確認できないためです。
selector 属性と label 属性を使用すると、ユーザーが意識せずに済むように PV の詳細を抽象化できると同時に、分かりやすくカスタマイズ可能なタグを使用してボリュームを識別する手段をクラスター管理者に提供できます。セレクターとラベルによるバインディングの方法を使用することで、ユーザーは管理者によって定義されているラベルのみを確認することが必要になります。
セレクターとラベルの機能は、現時点では静的にプロビジョニングされるストレージの場合にのみ使用できます。現時点では、動的にプロビジョニングされるストレージ用には実装されていません。
24.17.3. デプロイメント
このセクションでは、PVC の定義方法とデプロイ方法を説明します。
24.17.3.1. 前提条件
- 実行中の OpenShift Container Platform 3.3 以降のクラスター
- サポート対象のストレージプロバイダーによって提供されているボリューム
- cluster-admin ロールのバインディングを持つユーザー
24.17.3.2. 永続ボリュームと要求の定義
cluser-admin ユーザーとして、PV を定義します。この例では GlusterFS ボリュームを使用します。プロバイダーの設定については、該当するストレージプロバイダーを参照してください。
例24.9 ラベルのある永続ボリューム
apiVersion: v1 kind: PersistentVolume metadata: name: gluster-volume labels: 1 volume-type: ssd aws-availability-zone: us-east-1 spec: capacity: storage: 2Gi accessModes: - ReadWriteMany glusterfs: endpoints: glusterfs-cluster path: myVol1 readOnly: false persistentVolumeReclaimPolicy: Recycle
- 1
- セレクターが「すべての」 PV のラベルと一致する PVC がバインドされます (PV が使用可能であることを前提とします)。
PVC を定義します。
例24.10 セレクターのある Persistent Volume Claim (永続ボリューム要求)
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: gluster-claim spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi selector: 1 matchLabels: 2 volume-type: ssd aws-availability-zone: us-east-1
24.17.3.3. 永続ボリュームと要求のデプロイ
cluster-admin ユーザーとして、永続ボリュームを作成します。
例24.11 永続ボリュームの作成
# oc create -f gluster-pv.yaml persistentVolume "gluster-volume" created # oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE gluster-volume map[] 2147483648 RWX Available 2s
PV が作成されると、セレクターがその「すべての」ラベルと一致するユーザーであれば PVC を作成できます。
例24.12 Persistent Volume Claim (永続ボリューム要求) の作成
# oc create -f gluster-pvc.yaml persistentVolumeClaim "gluster-claim" created # oc get pvc NAME LABELS STATUS VOLUME gluster-claim Bound gluster-volume
24.18. コントローラー管理の割り当ておよび割り当て解除
24.18.1. 概要
OpenShift Container Platform 3.4 の時点では、ノードセット自体による各自のボリュームの割り当て/割り当て解除操作の管理のままにするのではなく、管理者がクラスターのマスターで実行されるコントローラーを有効にして、ノードセットに代わってボリュームの割り当て/割り当て解除操作を管理することができます。
コントローラー管理の割り当ておよび割り当て解除を有効にすることには、以下のメリットがあります。
- ノードが失われた場合でも、そのノードに割り当てられていたボリュームの割り当て解除をコントローラーによって実行でき、これを別の場所で再び割り当てることができます。
- 割り当て/割り当て解除に必要な認証情報をすべてのノードで用意する必要がないため、セキュリティーが強化されます。
OpenShift Container Platform 3.6 の時点では、コントローラーで管理される割り当て/割り当て解除はデフォルトの設定になっています。
24.18.2. 割り当て/割り当て解除の管理元の判別
ノード自体にアノテーション volumes.kubernetes.io/controller-managed-attach-detach
が設定されている場合、そのノードの割り当て/割り当て解除操作はコントローラーによって管理されます。コントローラーは、すべてのノードでこのアノテーションの有無を自動的に検査し、その有無に応じて動作します。したがって、ユーザーがノードでこのアノテーションの有無を調べることで、コントローラーが管理する割り当て/割り当て解除がそのノードで有効にされているかどうかを判別することができます。
さらに、ノードでコントローラー管理の割り当て/割り当て解除が選択されていることを確認するには、ノードのログで以下の行を検索します。
Setting node annotation to enable volume controller attach/detach
この行が見つからない場合は、以下の行が代わりにログに含まれているはずです。
Controller attach/detach is disabled for this node; Kubelet will attach and detach volumes
コントローラーの端末から、コントローラーが特定ノードの割り当て/割り当て解除操作を管理しているかどうかを確認するには、まずロギングレベルを少なくとも 4
に設定する必要があります。次に、以下の行を見つけます。
processVolumesInUse for node <node_hostname>
ログの表示方法とロギングレベルの設定方法については、「ロギングレベルの設定」を参照してください。
24.18.3. コントローラー管理の割り当て/割り当て解除を有効にするノードの設定
コントローラー管理の割り当て/割り当て解除を有効にするには、個々のノードで独自の割り当て/割り当て解除をオプトインし、無効にするように設定します。編集対象のノード設定ファイルについての詳細は、「ノード設定ファイル」を参照してください。このファイルには、以下の行を追加します。
kubeletArguments: enable-controller-attach-detach: - "true"
ノードを設定したら、設定を有効にするためにノードを再起動する必要があります。
24.19. 永続ボリュームスナップショット
24.19.1. 概要
永続ボリュームスナップショットはテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。これらの機能は、近々発表予定の製品機能をリリースに先駆けてご提供することにより、お客様は機能性をテストし、開発プロセス中にフィードバックをお寄せいただくことができます。
Red Hat のテクノロジープレビュー機能のサポートについての詳細は、https://access.redhat.com/support/offerings/techpreview/ を参照してください。
ストレージシステムの多くは、データを損失から保護するために永続ボリューム (PV) の「スナップショット」を作成する機能を備えています。外部のスナップショットコントローラーおよびプロビジョナーは、この機能を OpenShift Container Platform クラスターで使用して OpenShift Container Platform API を使用してボリュームスナップショットを扱う方法を提供しています。
本書では、OpenShift Container Platform におけるボリュームスナップショットのサポートの現状について説明しています。PV、Persistent Volume Claim (永続ボリューム要求、PVC)、および動的プロビジョニングについて理解しておくことを推奨されます。
24.19.2. 機能
-
PersistentVolumeClaim
にバインドされるPersistentVolume
のスナップショットの作成 -
既存の
VolumeSnapshots
の一覧表示 -
既存の
VolumeSnapshot
の削除 -
既存の
VolumeSnapshot
からのPersistentVolume
の新規作成 サポートされている
PersistentVolume
のタイプ:- AWS Elastic Block Store (EBS)
- Google Compute Engine (GCE) Persistent Disk (PD)
24.19.3. インストールと設定
外部のスナップショットコントローラーおよびプロビジョナーは、ボリュームスナップショットの機能を提供する外部コンポーネントです。これらの外部コンポーネントはクラスターで実行されます。コントローラーは、ボリュームスナップショットの作成、削除、および関連イベントのレポートを行います。プロビジョナーは、ボリュームスナップショットから新規の PersistentVolumes
を作成します。詳細は、「スナップショットの作成」および「スナップショットの復元」を参照してください。
24.19.3.1. 外部のコントローラーおよびプロビジョナーの起動
外部のコントローラーおよびプロビジョナーサービスはコンテナーイメージとして配布され、OpenShift Container Platform クラスターで通常どおり実行できます。また、コントローラーおよびプロビジョナーの RPM バージョンもあります。
API オブジェクトを管理しているコンテナーを許可するには、以下のようにして、必要なロールベースアクセス制御 (RBAC) ルールを管理者が設定する必要があります。
ServiceAccount
とClusterRole
を以下のように作成します。apiVersion: v1 kind: ServiceAccount metadata: name: snapshot-controller-runner kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: snapshot-controller-role rules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["list", "watch", "create", "update", "patch"] - apiGroups: ["apiextensions.k8s.io"] resources: ["customresourcedefinitions"] verbs: ["create", "list", "watch", "delete"] - apiGroups: ["volumesnapshot.external-storage.k8s.io"] resources: ["volumesnapshots"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] - apiGroups: ["volumesnapshot.external-storage.k8s.io"] resources: ["volumesnapshotdatas"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
ClusterRoleBinding
を使用して、以下のようにルールをバインドします。apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: snapshot-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: snapshot-controller-role subjects: - kind: ServiceAccount name: snapshot-controller-runner namespace: default
外部のコントローラーおよびプロビジョナーを Amazon Web Services (AWS) にデプロイしている場合、それらはアクセスキーを使用して認証できる必要があります。認証情報を Pod に提供するために、管理者が以下のように新規のシークレットを作成します。
apiVersion: v1 kind: Secret metadata: name: awskeys type: Opaque data: access-key-id: <base64 encoded AWS_ACCESS_KEY_ID> secret-access-key: <base64 encoded AWS_SECRET_ACCESS_KEY>
AWS における外部のコントローラーおよびプロビジョナーコンテナーのデプロイメント (どちらの Pod コンテナーもシークレットを使用して AWS のクラウドプロバイダー API にアクセスします):
kind: Deployment apiVersion: extensions/v1beta1 metadata: name: snapshot-controller spec: replicas: 1 strategy: type: Recreate template: metadata: labels: app: snapshot-controller spec: serviceAccountName: snapshot-controller-runner containers: - name: snapshot-controller image: "registry.access.redhat.com/openshift3/snapshot-controller:latest" imagePullPolicy: "IfNotPresent" args: ["-cloudprovider", "aws"] env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: awskeys key: access-key-id - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: awskeys key: secret-access-key - name: snapshot-provisioner image: "registry.access.redhat.com/openshift3/snapshot-provisioner:latest" imagePullPolicy: "IfNotPresent" args: ["-cloudprovider", "aws"] env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: awskeys key: access-key-id - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: awskeys key: secret-access-key
GCE の場合、GCE のクラウドプロバイダー API にアクセスするためにシークレットを使用する必要はありません。管理者は以下のようにデプロイメントに進むことができます。
kind: Deployment apiVersion: extensions/v1beta1 metadata: name: snapshot-controller spec: replicas: 1 strategy: type: Recreate template: metadata: labels: app: snapshot-controller spec: serviceAccountName: snapshot-controller-runner containers: - name: snapshot-controller image: "registry.access.redhat.com/openshift3/snapshot-controller:latest" imagePullPolicy: "IfNotPresent" args: ["-cloudprovider", "gce"] - name: snapshot-provisioner image: "registry.access.redhat.com/openshift3/snapshot-provisioner:latest" imagePullPolicy: "IfNotPresent" args: ["-cloudprovider", "gce"]
24.19.3.2. スナップショットユーザーの管理
クラスターの設定によっては、管理者以外のユーザーが API サーバーで VolumeSnapshot
オブジェクトを操作できるようにする必要があります。これは、特定のユーザーまたはグループにバインドされる ClusterRole
を作成することで実行できます。
たとえば、ユーザー「alice」がクラスター内のスナップショットを操作する必要があるとします。クラスター管理者は以下の手順を実行します。
新規の
ClusterRole
を定義します。apiVersion: v1 kind: ClusterRole metadata: name: volumesnapshot-admin rules: - apiGroups: - "volumesnapshot.external-storage.k8s.io" attributeRestrictions: null resources: - volumesnapshots verbs: - create - delete - deletecollection - get - list - patch - update - watch
ClusterRole
バインドオブジェクトを作成してクラスターロールをユーザー「alice」にバインドします。apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: volumesnapshot-admin roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: volumesnapshot-admin subjects: - kind: User name: alice
これは API アクセス設定の一例にすぎません。VolumeSnapshot
オブジェクトの動作は他の OpenShift Container Platform API オブジェクトと同様です。API RBAC の管理についての詳細は、API アクセス制御のドキュメントを参照してください。
24.19.4. ボリュームスナップショットとボリュームスナップショットデータのライフサイクル
24.19.4.1. Persistent Volume Claim (永続ボリューム要求) と永続ボリューム
PersistentVolumeClaim
は PersistentVolume
にバインドされます。PersistentVolume
のタイプは、スナップショットがサポートするいずれかの永続ボリュームタイプである必要があります。
24.19.4.1.1. スナップショットプロモーター
StorageClass
を作成するには、以下を実行します。
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: snapshot-promoter provisioner: volumesnapshot.external-storage.k8s.io/snapshot-promoter
この StorageClass
は、先に作成した VolumeSnapshot
から PersistentVolume
を復元する場合に必要です。
24.19.4.2. スナップショットの作成
PV のスナップショットを作成するには、新しい VolumeSnapshot
オブジェクトを以下のように作成します。
apiVersion: volumesnapshot.external-storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: snapshot-demo spec: persistentVolumeClaimName: ebs-pvc
persistentVolumeClaimName
は、PersistentVolume
にバインドされる PersistentVolumeClaim
の名前です。この特定 PV のスナップショットが作成されます。
次に、VolumeSnapshot
に基づく VolumeSnapshotData
オブジェクトが自動的に作成されます。VolumeSnapshot
と VolumeSnapshotData
の関係は PersistentVolumeClaim
と PersistentVolume
の関係に似ています。
PV のタイプによっては、反映される VolumeSnapshot
の状態に応じ、操作が複数の段階にわたる場合があります。
-
新規
VolumeSnapshot
オブジェクトが作成されます。 -
コントローラーによってスナップショット操作が開始されます。スナップショット対象の
PersistentVolume
をフリーズし、アプリケーションを一時停止する必要が生じる場合があります。 -
ストレージシステムによるスナップショットの作成が完了し (スナップショットが「切り取られ」)、スナップショット対象の
PersistentVolume
が通常の操作に戻ります。スナップショット自体の準備はまだできていません。ここでの状態はPending
タイプで状態の値はTrue
です。実際のスナップショットを表すVolumeSnapshotData
オブジェクトが新たに作成されます。 -
新規スナップショットの作成が完成し、使用できる状態になります。ここでの状態は
Ready
タイプで、状態の値はTrue
です。
データの整合性の確保 (Pod/アプリケーションの停止、キャッシュのフラッシュ、ファイルシステムのフリーズなど) はユーザーの責任で行う必要があります。
エラーの場合は、VolumeSnapshot
の状態が Error
状態に追加されます。
VolumeSnapshot
の状態を表示するには、以下を実行します。
$ oc get volumesnapshot -o yaml
状態が以下のように表示されます。
apiVersion: volumesnapshot.external-storage.k8s.io/v1 kind: VolumeSnapshot metadata: clusterName: "" creationTimestamp: 2017-09-19T13:58:28Z generation: 0 labels: Timestamp: "1505829508178510973" name: snapshot-demo namespace: default resourceVersion: "780" selfLink: /apis/volumesnapshot.external-storage.k8s.io/v1/namespaces/default/volumesnapshots/snapshot-demo uid: 9cc5da57-9d42-11e7-9b25-90b11c132b3f spec: persistentVolumeClaimName: ebs-pvc snapshotDataName: k8s-volume-snapshot-9cc8813e-9d42-11e7-8bed-90b11c132b3f status: conditions: - lastTransitionTime: null message: Snapshot created successfully reason: "" status: "True" type: Ready creationTimestamp: null
24.19.4.3. スナップショットの復元
VolumeSnapshot
から PV を復元するには、以下のように PVC を作成します。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: snapshot-pv-provisioning-demo annotations: snapshot.alpha.kubernetes.io/snapshot: snapshot-demo spec: storageClassName: snapshot-promoter
annotations
: snapshot.alpha.kubernetes.io/snapshot
は、復元する VolumeSnapshot
の名前です。 storageClassName
: StorageClass
はVolumeSnapshot
を復元するために管理者によって作成されます。
新規の PersistentVolume
が作成されて PersistentVolumeClaim
にバインドされます。PV のタイプによっては処理に数分の時間がかかることがあります。
24.19.4.4. スナップショットの削除
snapshot-demo
を削除するには、以下を実行します。
$ oc delete volumesnapshot/snapshot-demo
VolumeSnapshot
にバインドされている VolumeSnapshotData
が自動的に削除されます。
第25章 永続ストレージの例
25.1. 概要
以下のセクションでは、一般的なストレージのユースケースを定義するための総合的なな手順について詳しく説明します。以下の例では、永続ボリュームとそのセキュリティーの管理だけでなく、システムのユーザーがボリュームに対する要求を行う方法についても取り上げます。
25.3. Ceph RBD を使用した詳細例
25.3.1. 概要
このトピックでは、既存の Ceph クラスターを OpenShift Container Platform の永続ストアとして使用する詳細な例を紹介します。ここでは、作業用の Ceph クラスターがすでに設定されていることを前提とします。まだ設定されていない場合は、Red Hat Ceph Storage の概要について参照してください。
「Ceph RADOS ブロックデバイスを使用した永続ストレージ」では、永続ボリューム (PV)、Persistent Volume Claim (永続ボリューム要求、PVC)、永続ストレージとしての Ceph RBD の使用について説明しています。
oc …
コマンドはすべて OpenShift Container Platform のマスターホストで実行されます。
25.3.2. ceph-common パッケージのインストール
ceph-common ライブラリーは、すべてのスケジュール可能な OpenShift Container Platform ノードにインストールする必要があります。
OpenShift Container Platform のオールインワンホストは、Pod のワークロードを実行するために使用されることは多くありません。したがって、これはスケジュール可能なノードに含まれません。
# yum install -y ceph-common
25.3.3. Ceph シークレットの作成
ceph auth get-key
コマンドを Ceph の MON ノードで実行すると、client.admin ユーザーのキー値が以下のように表示されます。
例25.5 Ceph のシークレットの定義
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret
data:
key: QVFBOFF2SlZheUJQRVJBQWgvS2cwT1laQUhPQno3akZwekxxdGc9PQ== 1
- 1
- この base64 キーは、Ceph の MON ノードの 1 つで
ceph auth get-key client.admin | base64
コマンドを使用して生成されたものであり、出力をコピーし、これをシークレットキーの値として貼り付けています。
シークレット定義を ceph-secret.yaml などのファイルに保存し、シークレットを作成します。
$ oc create -f ceph-secret.yaml secret "ceph-secret" created
シークレットが作成されたことを確認します。
# oc get secret ceph-secret NAME TYPE DATA AGE ceph-secret Opaque 1 23d
25.3.4. 永続ボリュームの作成
次に、OpenShift Container Platform で PV オブジェクトを作成する前に、永続ボリュームファイルを定義します。
例25.6 Ceph RBD を使用した永続ボリュームオブジェクトの定義
apiVersion: v1 kind: PersistentVolume metadata: name: ceph-pv 1 spec: capacity: storage: 2Gi 2 accessModes: - ReadWriteOnce 3 rbd: 4 monitors: 5 - 192.168.122.133:6789 pool: rbd image: ceph-image user: admin secretRef: name: ceph-secret 6 fsType: ext4 7 readOnly: false persistentVolumeReclaimPolicy: Recycle
- 1
- PV の名前。Pod 定義で参照されたり、各種の
oc
ボリュームコマンドで表示されたりします。 - 2
- このボリュームに割り当てられるストレージの量。
- 3
accessModes
は、PV と PVC を一致させるためのラベルとして使用します。現時点で、これらはいずれの形態のアクセス制御も定義しません。ブロックストレージはすべて、単一ユーザーに対して定義されます (非共有ストレージ)。- 4
- 使用するボリュームタイプを定義します。この例では rbd プラグインを定義しています。
- 5
- Ceph モニターの IP アドレスとポートの配列です。
- 6
- 先に定義した Ceph のシークレットです。OpenShift Container Platform から Ceph サーバーへのセキュアな接続を作成するのに使用します。
- 7
- Ceph RBD ブロックデバイスにマウントされるファイルシステムタイプです。
PV の定義を ceph-pv.yaml などのファイルに保存し、永続ボリュームを作成します。
# oc create -f ceph-pv.yaml persistentvolume "ceph-pv" created
永続ボリュームが作成されたことを確認します。
# oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE ceph-pv <none> 2147483648 RWO Available 2s
25.3.5. Persistent Volume Claim (永続ボリューム要求) の作成
Persistent Volume Claim (永続ボリューム要求、PVC) では、必要なアクセスモードとストレージ容量を指定します。現時点では、これら 2 つの属性のみに基づいて PVC が 1 つの PV にバインドされます。PV が PVC にバインドされると、その PV は基本的に当該 PVC のプロジェクトに結び付けられ、別の PVC にバインドすることはできません。PV と PVC には 1 対 1 のマッピングが存在します。ただし、同じプロジェクト内の複数の Pod が同じ PVC を使用することは可能です。
例25.7 PVC オブジェクト定義
PVC の定義を ceph-claim.yaml などのファイルに保存し、以下のように PVC を作成します。
# oc create -f ceph-claim.yaml
persistentvolumeclaim "ceph-claim" created
#and verify the PVC was created and bound to the expected PV:
# oc get pvc
NAME LABELS STATUS VOLUME CAPACITY ACCESSMODES AGE
ceph-claim <none> Bound ceph-pv 1Gi RWX 21s
1
- 1
- 要求が ceph-pv PV にバインドされています。
25.3.6. Pod の作成
Pod 定義ファイルまたはテンプレートファイルを使用して Pod を定義できます。以下は、1 つのコンテナーを作成し、Ceph RBD ボリュームを読み書きアクセス用にマウントする Pod 仕様です。
例25.8 Pod オブジェクトの定義
apiVersion: v1 kind: Pod metadata: name: ceph-pod1 1 spec: containers: - name: ceph-busybox image: busybox 2 command: ["sleep", "60000"] volumeMounts: - name: ceph-vol1 3 mountPath: /usr/share/busybox 4 readOnly: false volumes: - name: ceph-vol1 5 persistentVolumeClaim: claimName: ceph-claim 6
Pod 定義を ceph-pod1.yaml などのファイルに保存し、以下のように Pod を作成します。
# oc create -f ceph-pod1.yaml
pod "ceph-pod1" created
#verify pod was created
# oc get pod
NAME READY STATUS RESTARTS AGE
ceph-pod1 1/1 Running 0 2m
1
- 1
- しばらくすると、Pod が Running 状態になります。
25.3.7. グループ ID と所有者 ID の定義 (オプション)
Ceph RBD などのブロックストレージを使用する場合、物理ブロックストレージは Pod の管理対象になります。Pod で定義されたグループ ID は、コンテナー内の Ceph RBD マウントと実際のストレージ自体の両方のグループ ID になります。そのため、通常はグループ ID を Pod 仕様に定義する必要はありません。ただし、グループ ID が必要な場合は、以下の Pod 定義の例に示すように fsGroup
を使用して定義することができます。
25.3.8. ceph-user-secret をプロジェクトのデフォルトとして設定する方法
すべてのプロジェクトで永続ストレージを使用できるようにする場合は、デフォルトのプロジェクトテンプレートを修正する必要があります。デフォルトプロジェクトテンプレートの修正についての詳細は、「デフォルトプロジェクトテンプレートの修正」を参照してください。これをデフォルトプロジェクトテンプレートに追加することで、プロジェクトの作成アクセス権を持つすべてのユーザーが Ceph クラスターにアクセスできるようになります。
例25.10 デフォルトプロジェクトの例
...
apiVersion: v1
kind: Template
metadata:
creationTimestamp: null
name: project-request
objects:
- apiVersion: v1
kind: Project
metadata:
annotations:
openshift.io/description: ${PROJECT_DESCRIPTION}
openshift.io/display-name: ${PROJECT_DISPLAYNAME}
openshift.io/requester: ${PROJECT_REQUESTING_USER}
creationTimestamp: null
name: ${PROJECT_NAME}
spec: {}
status: {}
- apiVersion: v1
kind: Secret
metadata:
name: ceph-user-secret
data:
key: yoursupersecretbase64keygoeshere 1
type:
kubernetes.io/rbd
...
- 1
- 各自のスーパーシークレット Ceph ユーザーキーをここに base64 形式で記述します。「Ceph のシークレットの作成」を参照してください。
25.4. 動的プロビジョニングでの Ceph RBD の使用
25.4.1. 概要
このトピックでは、既存の Ceph クラスターを OpenShift Container Platform の永続ストレージとして使用する詳細な例を紹介します。ここでは、作業用の Ceph クラスターがすでに設定されていることを前提とします。まだ設定されていない場合は、Red Hat Ceph Storage の概要について参照してください。
「Ceph RADOS ブロックデバイスを使用した永続ストレージ」では、永続ボリューム (PV)、Persistent Volume Claim (永続ボリューム要求、PVC)、永続ストレージとしての Ceph RADOS ブロックデバイス (RBD) の使用方法について説明しています。
-
OpenShift Container Platform のマスターホストで、全
oc
コマンドを実行します。 - OpenShift Container Platform のオールインワンホストは、Pod のワークロードを実行するために使用されることは多くありません。したがって、これはスケジュール可能なノードに含まれません。
25.4.2. 動的ボリューム用プールの作成
Install the latest ceph-common package:
yum install -y ceph-common
注記ceph-common
ライブラリーは、all schedulable
OpenShift Container Platform ノードにインストールする必要があります。管理者または MON ノードによって、以下のように動的ボリューム用の新規プールが作成されます。
$ ceph osd pool create kube 1024 $ ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=kube' -o ceph.client.kube.keyring
注記RBD のデフォルトプールを使用することも可能ですが、このオプションは推奨されません。
25.4.3. 動的な永続ストレージでの既存の Ceph クラスターの使用
動的な永続ストレージに既存の Ceph クラスターを使用するには、以下を実行します。
client.admin 向けに base64 でエンコードされたキーを作成します。
$ ceph auth get client.admin
Ceph シークレット定義例
apiVersion: v1 kind: Secret metadata: name: ceph-secret namespace: kube-system data: key: QVFBOFF2SlZheUJQRVJBQWgvS2cwT1laQUhPQno3akZwekxxdGc9PQ== 1 type: kubernetes.io/rbd 2
client.admin 用に Ceph シークレットを作成します。
$ oc create -f ceph-secret.yaml secret "ceph-secret" created
シークレットが作成されたことを確認します。
$ oc get secret ceph-secret NAME TYPE DATA AGE ceph-secret kubernetes.io/rbd 1 5d
ストレージクラスを作成します。
$ oc create -f ceph-storageclass.yaml storageclass "dynamic" created
Ceph ストレージクラスの例
apiVersion: storage.k8s.io/v1beta1 kind: StorageClass metadata: name: dynamic annotations: storageclass.beta.kubernetes.io/is-default-class: "true" provisioner: kubernetes.io/rbd parameters: monitors: 192.168.1.11:6789,192.168.1.12:6789,192.168.1.13:6789 1 adminId: admin 2 adminSecretName: ceph-secret 3 adminSecretNamespace: kube-system 4 pool: kube 5 userId: kube 6 userSecretName: ceph-user-secret 7
- 1
- Ceph が監視する IP アドレスのコンマ区切りの一覧。この値は必須です。
- 2
- Ceph クライアント ID。プール内にイメージを作成する権限があります。デフォルトは
admin
です。 - 3
adminId
のシークレット名。この値は必須です。設定するシークレットにはkubernetes.io/rbd
が含まれる必要があります。- 4
adminSecret
の namespace。デフォルトはdefault
です。- 5
- Ceph RBD プール。デフォルトは
rbd
ですが、この値は推奨されません。 - 6
- Ceph RBD イメージのマッピングに使用される Ceph クライアント ID。デフォルトは
adminId
のシークレット名と同じです。 - 7
- Ceph RBD イメージをマッピングするための
userId
の Ceph シークレット名。PVC と同じ namespace に存在する必要があります。Ceph シークレットが新規プロジェクトのデフォルトとして設定されていない限り、このパラメーターの値を指定する必要があります。
ストレージクラスが作成されたことを確認します。
$ oc get storageclasses NAME TYPE dynamic (default) kubernetes.io/rbd
PVC オブジェクト定義を作成します。
PVC オブジェクト定義例
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: ceph-claim-dynamic spec: accessModes: 1 - ReadWriteOnce resources: requests: storage: 2Gi 2
PVC を作成します。
$ oc create -f ceph-pvc.yaml persistentvolumeclaim "ceph-claim-dynamic" created
PVC が作成されていて、予想される PV にバインドされていることを確認します。
$ oc get pvc NAME STATUS VOLUME CAPACITY ACCESSMODES AGE ceph-claim Bound pvc-f548d663-3cac-11e7-9937-0024e8650c7a 2Gi RWO 1m
Pod オブジェクト定義を以下のように作成します。
Pod オブジェクトの定義例
apiVersion: v1 kind: Pod metadata: name: ceph-pod1 1 spec: containers: - name: ceph-busybox image: busybox 2 command: ["sleep", "60000"] volumeMounts: - name: ceph-vol1 3 mountPath: /usr/share/busybox 4 readOnly: false volumes: - name: ceph-vol1 persistentVolumeClaim: claimName: ceph-claim 5
Pod を作成します。
$ oc create -f ceph-pod1.yaml pod "ceph-pod1" created
Pod が作成されていることを確認します。
$ oc get pod NAME READY STATUS RESTARTS AGE ceph-pod1 1/1 Running 0 2m
しばらくすると、Pod のステータスが Running
に変わります。
25.4.4. ceph-user-secret をプロジェクトのデフォルトとして設定する方法
全プロジェクトで永続ストレージを使用できるようにするには、デフォルトのプロジェクトテンプレートを変更する必要があります。これをデフォルトのプロジェクトテンプレートに追加すると、プロジェクト作成の権限があるユーザーはすべて Ceph クラスターにアクセスできるようになります。詳細情報は、「デフォルトのプロジェクトテンプレート変更」を参照してください。
デフォルトプロジェクトの例
...
apiVersion: v1
kind: Template
metadata:
creationTimestamp: null
name: project-request
objects:
- apiVersion: v1
kind: Project
metadata:
annotations:
openshift.io/description: ${PROJECT_DESCRIPTION}
openshift.io/display-name: ${PROJECT_DISPLAYNAME}
openshift.io/requester: ${PROJECT_REQUESTING_USER}
creationTimestamp: null
name: ${PROJECT_NAME}
spec: {}
status: {}
- apiVersion: v1
kind: Secret
metadata:
name: ceph-user-secret
data:
key: QVFCbEV4OVpmaGJtQ0JBQW55d2Z0NHZtcS96cE42SW1JVUQvekE9PQ== 1
type:
kubernetes.io/rbd
...
- 1
- base64 形式で Ceph のユーザーキーをここに配置します。
25.5. GlusterFS を使用する詳細例
25.5.1. 概要
このトピックでは、既存の Container-Native Storage、Container-Ready Storage、またはスタンドアロンの Red Hat Gluster Storage クラスターを OpenShift Container Platform の永続ストレージとして使用する詳細例を紹介します。ここでは作業用の Red Hat Gluster Storage クラスターがすでに設定されていることを前提とします。Container-Native Storage または Container-Ready Storage のインストールについてのヘルプは、「Red Hat Gluster Storage を使用する永続ストレージ」を参照してください。スタンドアロンの Red Hat Gluster Storage の場合については、『Red Hat Gluster Storage Administration Guide』を参照してください。
GlusterFS ボリュームを動的にプロビジョニングする方法の詳細例については、「GlusterFS を動的プロビジョニングに使用する詳細例」を参照してください。
oc
コマンドはすべて OpenShift Container Platform のマスターホストで実行されます。
25.5.2. 前提条件
GlusterFS ボリュームにアクセスするには、すべてのスケジュール可能なノードで mount.glusterfs
コマンドを利用できる必要があります。RPM ベースのシステムの場合は、glusterfs-fuse パッケージがインストールされている必要があります。
# yum install glusterfs-fuse
このパッケージはすべての RHEL システムにインストールされています。ただし、Red Hat Gluster Storage の最新バージョンにアップデートすることを推奨します。そのためには、以下の RPM リポジトリーを有効にする必要があります。
# subscription-manager repos --enable=rh-gluster-3-client-for-rhel-7-server-rpms
glusterfs-fuse がノードにすでにインストールされている場合、最新バージョンがインストールされていることを確認します。
# yum update glusterfs-fuse
デフォルトでは、SELinux は Pod からリモート Red Hat Gluster Storage サーバーへの書き込みを許可しません。SELinux が有効な状態で Red Hat Gluster Storage ボリュームへの書き込みを有効にするには、GlusterFS を実行する各ノードで以下のコマンドを実行します。
$ sudo setsebool -P virt_sandbox_use_fusefs on 1
$ sudo setsebool -P virt_use_fusefs on
- 1
-P
オプションを使用すると、再起動した後もブール値が永続化されます。
virt_sandbox_use_fusefs
ブール値は、docker-selinux パッケージによって定義されます。このブール値が定義されていないというエラーが表示される場合は、このパッケージがインストールされていることを確認してください。
Atomic Host を使用している場合に、Atomic Host をアップグレードすると、SELinux のブール値が消去されるので、Atomic Host をアップグレードする場合には、これらのブール値を設定し直す必要があります。
25.5.3. 静的プロビジョニング
-
静的プロビジョニングを有効にするには、最初に GlusterFS ボリュームを作成します。
gluster
コマンドラインインターフェースを使用してこれを行う方法については、『Red Hat Gluster Storage Administration Guide』を参照してください。また、heketi-cli
を使用してこれを行う方法については、heketi プロジェクトサイトを参照してください。この例では、ボリュームにmyVol1
という名前を付けます。 gluster-endpoints.yaml
で以下のサービスとエンドポイントを定義します。--- apiVersion: v1 kind: Service metadata: name: glusterfs-cluster 1 spec: ports: - port: 1 --- apiVersion: v1 kind: Endpoints metadata: name: glusterfs-cluster 2 subsets: - addresses: - ip: 192.168.122.221 3 ports: - port: 1 4 - addresses: - ip: 192.168.122.222 5 ports: - port: 1 6 - addresses: - ip: 192.168.122.223 7 ports: - port: 1 8
OpenShift Container Platform マスターホストからサービスとエンドポイントを作成します。
$ oc create -f gluster-endpoints.yaml service "glusterfs-cluster" created endpoints "glusterfs-cluster" created
サービスとエンドポイントが作成されたことを確認します。
$ oc get services NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE glusterfs-cluster 172.30.205.34 <none> 1/TCP <none> 44s $ oc get endpoints NAME ENDPOINTS AGE docker-registry 10.1.0.3:5000 4h glusterfs-cluster 192.168.122.221:1,192.168.122.222:1,192.168.122.223:1 11s kubernetes 172.16.35.3:8443 4d
注記エンドポイントはプロジェクトごとに一意です。GlusterFS にアクセスする各プロジェクトには独自のエンドポイントが必要です。
ボリュームにアクセスするには、ボリューム上のファイルシステムにアクセスできるユーザー ID (UID) またはグループ ID (GID) でコンテナーを実行する必要があります。この情報は以下の方法で取得できます。
$ mkdir -p /mnt/glusterfs/myVol1 $ mount -t glusterfs 192.168.122.221:/myVol1 /mnt/glusterfs/myVol1 $ ls -lnZ /mnt/glusterfs/ drwxrwx---. 592 590 system_u:object_r:fusefs_t:s0 myVol1 1 2
gluster-pv.yaml
で以下の PersistentVolume (PV) を定義します。apiVersion: v1 kind: PersistentVolume metadata: name: gluster-default-volume 1 annotations: pv.beta.kubernetes.io/gid: "590" 2 spec: capacity: storage: 2Gi 3 accessModes: 4 - ReadWriteMany glusterfs: endpoints: glusterfs-cluster 5 path: myVol1 6 readOnly: false persistentVolumeReclaimPolicy: Retain
OpenShift Container Platform マスターホストから PV を作成します。
$ oc create -f gluster-pv.yaml
PV が作成されたことを確認します。
$ oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE gluster-default-volume <none> 2147483648 RWX Available 2s
gluster-claim.yaml
で、新規 PV にバインドする PersistentVolumeClaim (PVC) を作成します。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: gluster-claim 1 spec: accessModes: - ReadWriteMany 2 resources: requests: storage: 1Gi 3
OpenShift Container Platform マスターホストから PVC を作成します。
$ oc create -f gluster-claim.yaml
PV と PVC がバインドされていることを確認します。
$ oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE gluster-pv <none> 1Gi RWX Available gluster-claim 37s $ oc get pvc NAME LABELS STATUS VOLUME CAPACITY ACCESSMODES AGE gluster-claim <none> Bound gluster-pv 1Gi RWX 24s
PVC はプロジェクトごとに一意です。GlusterFS ボリュームにアクセスする各プロジェクトには独自の PVC が必要です。PV は単一のプロジェクトにバインドされないため、複数のプロジェクトにまたがる PVC が同じ PV を参照する場合があります。
25.5.4. ストレージの使用
ここまでの時点で、PVC にバインドされる GlusterFS ボリュームを動的に作成しましたので、この PVC を Pod で利用できるようになりました。
Pod オブジェクト定義を以下のように作成します。
apiVersion: v1 kind: Pod metadata: name: hello-openshift-pod labels: name: hello-openshift-pod spec: containers: - name: hello-openshift-pod image: openshift/hello-openshift ports: - name: web containerPort: 80 volumeMounts: - name: gluster-vol1 mountPath: /usr/share/nginx/html readOnly: false volumes: - name: gluster-vol1 persistentVolumeClaim: claimName: gluster1 1
- 1
- 先の手順で作成した PVC の名前。
OpenShift Container Platform マスターホストから、以下のように Pod を作成します。
# oc create -f hello-openshift-pod.yaml pod "hello-openshift-pod" created
Pod を表示します。イメージがまだ存在していない場合はダウンロードする必要があるために数分の時間がかかります。
# oc get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE hello-openshift-pod 1/1 Running 0 9m 10.38.0.0 node1
コンテナーへの
oc exec
を実行し、index.html ファイルを Pod のmountPath
定義内に作成します。$ oc exec -ti hello-openshift-pod /bin/sh $ cd /usr/share/nginx/html $ echo 'Hello OpenShift!!!' > index.html $ ls index.html $ exit
ここで、Pod の URL に対して
curl
を実行します。# curl http://10.38.0.0 Hello OpenShift!!!
Pod を削除してから再作成し、これが出現するまで待機します。
# oc delete pod hello-openshift-pod pod "hello-openshift-pod" deleted # oc create -f hello-openshift-pod.yaml pod "hello-openshift-pod" created # oc get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE hello-openshift-pod 1/1 Running 0 9m 10.37.0.0 node1
もう一度 Pod に対して
curl
を実行します。データは前と同じになりますが、Pod の IP アドレスは変更されている可能性があることに注意してください。# curl http://10.37.0.0 Hello OpenShift!!!
以下の操作をいずれかのノードで実行して、index.html ファイルが GlusterFS ストレージに書き込まれていることを確認します。
$ mount | grep heketi /dev/mapper/VolGroup00-LogVol00 on /var/lib/heketi type xfs (rw,relatime,seclabel,attr2,inode64,noquota) /dev/mapper/vg_f92e09091f6b20ab12b02a2513e4ed90-brick_1e730a5462c352835055018e1874e578 on /var/lib/heketi/mounts/vg_f92e09091f6b20ab12b02a2513e4ed90/brick_1e730a5462c352835055018e1874e578 type xfs (rw,noatime,seclabel,nouuid,attr2,inode64,logbsize=256k,sunit=512,swidth=512,noquota) /dev/mapper/vg_f92e09091f6b20ab12b02a2513e4ed90-brick_d8c06e606ff4cc29ccb9d018c73ee292 on /var/lib/heketi/mounts/vg_f92e09091f6b20ab12b02a2513e4ed90/brick_d8c06e606ff4cc29ccb9d018c73ee292 type xfs (rw,noatime,seclabel,nouuid,attr2,inode64,logbsize=256k,sunit=512,swidth=512,noquota) $ cd /var/lib/heketi/mounts/vg_f92e09091f6b20ab12b02a2513e4ed90/brick_d8c06e606ff4cc29ccb9d018c73ee292/brick $ ls index.html $ cat index.html Hello OpenShift!!!
25.6. GlusterFS を動的プロビジョニングに使用する詳細例
25.6.1. 概要
このトピックでは、既存の Container-Native Storage、Container-Ready Storage、またはスタンドアロンの Red Hat Gluster Storage クラスターを OpenShift Container Platform の動的永続ストレージとして使用する詳細例を紹介します。ここでは作業用の Red Hat Gluster Storage クラスターがすでに設定されていることを前提とします。Container-Native Storage または Container-Ready Storage のインストールについてのヘルプは、「Red Hat Gluster Storage を使用する永続ストレージ」を参照してください。スタンドアロンの Red Hat Gluster Storage の場合については、『Red Hat Gluster Storage Administration Guide』を参照してください。
oc
コマンドはすべて OpenShift Container Platform のマスターホストで実行されます。
25.6.2. 前提条件
GlusterFS ボリュームにアクセスするには、すべてのスケジュール可能なノードで mount.glusterfs
コマンドを利用できる必要があります。RPM ベースのシステムの場合は、glusterfs-fuse パッケージがインストールされている必要があります。
# yum install glusterfs-fuse
このパッケージはすべての RHEL システムにインストールされています。ただし、Red Hat Gluster Storage の最新バージョンにアップデートすることを推奨します。そのためには、以下の RPM リポジトリーを有効にする必要があります。
# subscription-manager repos --enable=rh-gluster-3-client-for-rhel-7-server-rpms
glusterfs-fuse がノードにすでにインストールされている場合、最新バージョンがインストールされていることを確認します。
# yum update glusterfs-fuse
デフォルトでは、SELinux は Pod からリモート Red Hat Gluster Storage サーバーへの書き込みを許可しません。SELinux が有効な状態で Red Hat Gluster Storage ボリュームへの書き込みを有効にするには、GlusterFS を実行する各ノードで以下のコマンドを実行します。
$ sudo setsebool -P virt_sandbox_use_fusefs on 1
$ sudo setsebool -P virt_use_fusefs on
- 1
-P
オプションを使用すると、再起動した後もブール値が永続化されます。
virt_sandbox_use_fusefs
ブール値は、docker-selinux パッケージによって定義されます。このブール値が定義されていないというエラーが表示される場合は、このパッケージがインストールされていることを確認してください。
Atomic Host を使用している場合に、Atomic Host をアップグレードすると、SELinux のブール値が消去されるので、Atomic Host をアップグレードする場合には、これらのブール値を設定し直す必要があります。
25.6.3. 動的プロビジョニング
動的プロビジョニングを有効にするには、最初に
StorageClass
オブジェクト定義を作成します。以下の定義は、OpenShift Container Platform でこの例を使用するために必要な最小要件に基づいています。その他のパラメーターと仕様定義については、「動的プロビジョニングとストレージクラスの作成」を参照してください。kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: glusterfs provisioner: kubernetes.io/glusterfs parameters: resturl: "http://10.42.0.0:8080" 1 restauthenabled: "false" 2
OpenShift Container Platform マスターホストから StorageClass を作成します。
# oc create -f gluster-storage-class.yaml storageclass "glusterfs" created
新たに作成される StorageClass を使用して PVC を作成します。以下は例になります。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: gluster1 spec: accessModes: - ReadWriteMany resources: requests: storage: 30Gi storageClassName: glusterfs
OpenShift Container Platform マスターホストから PVC を作成します。
# oc create -f glusterfs-dyn-pvc.yaml persistentvolumeclaim "gluster1" created
PVC を表示し、ボリュームが動的に作成され、PVC にバインドされていることを確認します。
# oc get pvc NAME STATUS VOLUME CAPACITY ACCESSMODES STORAGECLASS AGE gluster1 Bound pvc-78852230-d8e2-11e6-a3fa-0800279cf26f 30Gi RWX gluster-dyn 42s
25.6.4. ストレージの使用
ここまでの時点で、PVC にバインドされる GlusterFS ボリュームを動的に作成しましたので、この PVC を Pod で利用できるようになりました。
Pod オブジェクト定義を以下のように作成します。
apiVersion: v1 kind: Pod metadata: name: hello-openshift-pod labels: name: hello-openshift-pod spec: containers: - name: hello-openshift-pod image: openshift/hello-openshift ports: - name: web containerPort: 80 volumeMounts: - name: gluster-vol1 mountPath: /usr/share/nginx/html readOnly: false volumes: - name: gluster-vol1 persistentVolumeClaim: claimName: gluster1 1
- 1
- 先の手順で作成した PVC の名前。
OpenShift Container Platform マスターホストから、以下のように Pod を作成します。
# oc create -f hello-openshift-pod.yaml pod "hello-openshift-pod" created
Pod を表示します。イメージがまだ存在していない場合はダウンロードする必要があるために数分の時間がかかります。
# oc get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE hello-openshift-pod 1/1 Running 0 9m 10.38.0.0 node1
コンテナーへの
oc exec
を実行し、index.html ファイルを Pod のmountPath
定義内に作成します。$ oc exec -ti hello-openshift-pod /bin/sh $ cd /usr/share/nginx/html $ echo 'Hello OpenShift!!!' > index.html $ ls index.html $ exit
ここで、Pod の URL に対して
curl
を実行します。# curl http://10.38.0.0 Hello OpenShift!!!
Pod を削除してから再作成し、これが出現するまで待機します。
# oc delete pod hello-openshift-pod pod "hello-openshift-pod" deleted # oc create -f hello-openshift-pod.yaml pod "hello-openshift-pod" created # oc get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE hello-openshift-pod 1/1 Running 0 9m 10.37.0.0 node1
もう一度 Pod に対して
curl
を実行します。データは前と同じになりますが、Pod の IP アドレスは変更されている可能性があることに注意してください。# curl http://10.37.0.0 Hello OpenShift!!!
以下の操作をいずれかのノードで実行して、index.html ファイルが GlusterFS ストレージに書き込まれていることを確認します。
$ mount | grep heketi /dev/mapper/VolGroup00-LogVol00 on /var/lib/heketi type xfs (rw,relatime,seclabel,attr2,inode64,noquota) /dev/mapper/vg_f92e09091f6b20ab12b02a2513e4ed90-brick_1e730a5462c352835055018e1874e578 on /var/lib/heketi/mounts/vg_f92e09091f6b20ab12b02a2513e4ed90/brick_1e730a5462c352835055018e1874e578 type xfs (rw,noatime,seclabel,nouuid,attr2,inode64,logbsize=256k,sunit=512,swidth=512,noquota) /dev/mapper/vg_f92e09091f6b20ab12b02a2513e4ed90-brick_d8c06e606ff4cc29ccb9d018c73ee292 on /var/lib/heketi/mounts/vg_f92e09091f6b20ab12b02a2513e4ed90/brick_d8c06e606ff4cc29ccb9d018c73ee292 type xfs (rw,noatime,seclabel,nouuid,attr2,inode64,logbsize=256k,sunit=512,swidth=512,noquota) $ cd /var/lib/heketi/mounts/vg_f92e09091f6b20ab12b02a2513e4ed90/brick_d8c06e606ff4cc29ccb9d018c73ee292/brick $ ls index.html $ cat index.html Hello OpenShift!!!
25.7. 特権付き Pod へのボリュームのマウント
25.7.1. 概要
永続ボリュームは、特権付き SCC (Security Context Constraint) が割り当てられた Pod にマウントすることができます。
このトピックでは、特権付き Pod へのボリュームのマウントのユースケースの例として GlusterFS を使用していますが、これはいずれの サポート対象ストレージプラグインを使用するケースにも適用できます。
25.7.2. 前提条件
- 既存の Gluster ボリューム。
- すべてのホストにインストールされている glusterfs-fuse。
GlusterFS の定義:
- エンドポイントとサービス: gluster-endpoints-service.yaml および gluster-endpoints.yaml
- 永続ボリューム: gluster-pv.yaml
- Persistent Volume Claim (永続ボリューム要求): gluster-pvc.yaml
- 特権付き Pod: gluster-S3-pod.yaml
-
cluster-admin ロールのバインディングを持つユーザー。このガイドでは、このユーザーを
admin
と呼んでいます。
25.7.3. 永続ボリュームの作成
PersistentVolume を作成すると、プロジェクトに関係なく、ユーザーがストレージにアクセスできるようになります。
admin として、サービス、エンドポイントオブジェクトおよび永続ボリュームを作成します。
$ oc create -f gluster-endpoints-service.yaml $ oc create -f gluster-endpoints.yaml $ oc create -f gluster-pv.yaml
オブジェクトが作成されたことを以下のように確認します。
$ oc get svc NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE gluster-cluster 172.30.151.58 <none> 1/TCP <none> 24s
$ oc get ep NAME ENDPOINTS AGE gluster-cluster 192.168.59.102:1,192.168.59.103:1 2m
$ oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE gluster-default-volume <none> 2Gi RWX Available 2d
25.7.4. 通常ユーザーの作成
通常ユーザーを以下のように 特権付き SCC (または SCC へのアクセスのあるグループ) に追加すると、当該ユーザーは特権付き Pod を実行できるようになります。
admin として、ユーザーを SCC に追加します。
$ oc adm policy add-scc-to-user privileged <username>
通常ユーザーとしてログインします。
$ oc login -u <username> -p <password>
次に、新規プロジェクトを作成します。
$ oc new-project <project_name>
25.7.5. Persistent Volume Claim (永続ボリューム要求) の作成
通常ユーザーとして、ボリュームにアクセスするための PersistentVolumeClaim を作成します。
$ oc create -f gluster-pvc.yaml -n <project_name>
要求にアクセスするための Pod を定義します。
例25.11 Pod 定義
apiVersion: v1 id: gluster-S3-pvc kind: Pod metadata: name: gluster-nginx-priv spec: containers: - name: gluster-nginx-priv image: fedora/nginx volumeMounts: - mountPath: /mnt/gluster 1 name: gluster-volume-claim securityContext: privileged: true volumes: - name: gluster-volume-claim persistentVolumeClaim: claimName: gluster-claim 2
Pod を作成するとマウントディレクトリーが作成され、ボリュームがそのマウントポイントに割り当てられます。
通常ユーザーとして、以下のように定義から Pod を作成します。
$ oc create -f gluster-S3-pod.yaml
Pod が正常に作成されたことを確認します。
$ oc get pods NAME READY STATUS RESTARTS AGE gluster-S3-pod 1/1 Running 0 36m
Pod が作成されるまでに数分の時間がかかることがあります。
25.7.6. 設定の検証
25.7.6.1. Pod の SCC の確認
Pod 設定をエクスポートします。
$ oc export pod <pod_name>
出力を確認します。
openshift.io/scc
の値がprivileged
であることを確認します。例25.12 スニペットのエクスポート
metadata: annotations: openshift.io/scc: privileged
25.7.6.2. マウントの検証
Pod にアクセスし、ボリュームがマウントされていることを確認します。
$ oc rsh <pod_name> [root@gluster-S3-pvc /]# mount
Gluster ボリュームの出力結果を確認します。
例25.13 ボリュームマウント
192.168.59.102:gv0 on /mnt/gluster type fuse.gluster (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)
25.8. 統合 OpenShift Container レジストリーから GlusterFS への切り替え
25.8.1. 概要
このトピックでは、GlusterFS ボリュームを統合 OpenShift Container レジストリーに割り当てる方法を説明します。この操作は、Container-Native Storage、Container-Ready Storage、またはスタンドアロンの Red Hat Gluster Storage のいずれかで実行できます。ここでは、レジストリーがすでに起動されていて、ボリュームが作成済みであることを前提とします。
25.8.2. 前提条件
- ストレージを設定せずにデプロイされている既存の レジストリー。
- 既存の GlusterFS ボリューム。
- すべてのスケジュール可能なノードにインストールされている glusterfs-fuse。
cluster-admin ロールのバインディングを持つユーザー。
- このガイドでは、このユーザーを admin と呼んでいます。
oc
コマンドはすべてマスターノードで admin ユーザーとして実行されます。
25.8.3. GlusterFS PersistentVolumeClaim の手動プロビジョニング
-
静的プロビジョニングを有効にするには、最初に GlusterFS ボリュームを作成します。
gluster
コマンドラインインターフェースを使用してこれを行う方法については、『Red Hat Gluster Storage Administration Guide』を参照してください。また、heketi-cli
を使用してこれを行う方法については、heketi プロジェクトサイトを参照してください。この例では、ボリュームにmyVol1
という名前を付けます。 gluster-endpoints.yaml
で以下のサービスとエンドポイントを定義します。--- apiVersion: v1 kind: Service metadata: name: glusterfs-cluster 1 spec: ports: - port: 1 --- apiVersion: v1 kind: Endpoints metadata: name: glusterfs-cluster 2 subsets: - addresses: - ip: 192.168.122.221 3 ports: - port: 1 4 - addresses: - ip: 192.168.122.222 5 ports: - port: 1 6 - addresses: - ip: 192.168.122.223 7 ports: - port: 1 8
OpenShift Container Platform マスターホストからサービスとエンドポイントを作成します。
$ oc create -f gluster-endpoints.yaml service "glusterfs-cluster" created endpoints "glusterfs-cluster" created
サービスとエンドポイントが作成されたことを確認します。
$ oc get services NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE glusterfs-cluster 172.30.205.34 <none> 1/TCP <none> 44s $ oc get endpoints NAME ENDPOINTS AGE docker-registry 10.1.0.3:5000 4h glusterfs-cluster 192.168.122.221:1,192.168.122.222:1,192.168.122.223:1 11s kubernetes 172.16.35.3:8443 4d
注記エンドポイントはプロジェクトごとに一意です。GlusterFS にアクセスする各プロジェクトには独自のエンドポイントが必要です。
ボリュームにアクセスするには、ボリューム上のファイルシステムにアクセスできるユーザー ID (UID) またはグループ ID (GID) でコンテナーを実行する必要があります。この情報は以下の方法で取得できます。
$ mkdir -p /mnt/glusterfs/myVol1 $ mount -t glusterfs 192.168.122.221:/myVol1 /mnt/glusterfs/myVol1 $ ls -lnZ /mnt/glusterfs/ drwxrwx---. 592 590 system_u:object_r:fusefs_t:s0 myVol1 1 2
gluster-pv.yaml
で以下の PersistentVolume (PV) を定義します。apiVersion: v1 kind: PersistentVolume metadata: name: gluster-default-volume 1 annotations: pv.beta.kubernetes.io/gid: "590" 2 spec: capacity: storage: 2Gi 3 accessModes: 4 - ReadWriteMany glusterfs: endpoints: glusterfs-cluster 5 path: myVol1 6 readOnly: false persistentVolumeReclaimPolicy: Retain
OpenShift Container Platform マスターホストから PV を作成します。
$ oc create -f gluster-pv.yaml
PV が作成されたことを確認します。
$ oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE gluster-default-volume <none> 2147483648 RWX Available 2s
gluster-claim.yaml
で、新規 PV にバインドする PersistentVolumeClaim (PVC) を作成します。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: gluster-claim 1 spec: accessModes: - ReadWriteMany 2 resources: requests: storage: 1Gi 3
OpenShift Container Platform マスターホストから PVC を作成します。
$ oc create -f gluster-claim.yaml
PV と PVC がバインドされていることを確認します。
$ oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE gluster-pv <none> 1Gi RWX Available gluster-claim 37s $ oc get pvc NAME LABELS STATUS VOLUME CAPACITY ACCESSMODES AGE gluster-claim <none> Bound gluster-pv 1Gi RWX 24s
PVC はプロジェクトごとに一意です。GlusterFS ボリュームにアクセスする各プロジェクトには独自の PVC が必要です。PV は単一のプロジェクトにバインドされないため、複数のプロジェクトにまたがる PVC が同じ PV を参照する場合があります。
25.8.4. PersistentVolumeClaim のレジストリーへの割り当て
次に進む前に、docker-registry サービスが実行中であることを確認します。
$ oc get svc NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE docker-registry 172.30.167.194 <none> 5000/TCP docker-registry=default 18m
docker-registry サービス、またはそれに関連付けられている Pod のいずれかが実行されていない場合は、レジストリーの設定手順を再度参照してトラブルシューティングを行ってから次に進んでください。
次に、PVC を割り当てます。
$ oc volume deploymentconfigs/docker-registry --add --name=registry-storage -t pvc \ --claim-name=gluster-claim --overwrite
OpenShift Container レジストリーの使用についての詳細は、「レジストリーのセットアップ」を参照してください。
25.9. ラベルによる永続ボリュームのバインド
25.9.1. 概要
このトピックでは、PV でラベルを定義して PVC 内でセレクターを一致させることで Persistent Volume Claim (永続ボリューム要求、PVC) を永続ボリューム (PV) にバインドする詳細例を紹介します。この機能はすべてのストレージオプションで使用できます。ここでは、OpenShift Container Platform クラスターに永続ストレージリソースが含まれていて、それらのリソースを PVC によるバインディングに使用できることを前提としています。
ラベルとセレクターに関する注記
ラベルは OpenShift Container Platform の機能であり、ユーザー定義のタグ (キーと値のペア) をオブジェクトの仕様の一部としてサポートします。その主な目的は、オブジェクト間で同一ラベルを定義してオブジェクトを任意にグループ化できるようにすることです。定義したラベルをセレクターでターゲットとして指定すると、指定のラベル値を持つすべてのオブジェクトが一致します。この機能により、PVC を PV にバインドすることができます。ラベルについての詳細は、「Pods and Services」を参照してください。
この例では、変更された GlusterFS の PV および PVC 仕様を使用しています。ただし、実装したセレクターとラベルはすべてのストレージオプションで汎用的に使用できます。使用しているボリュームプロバイダーの独自の設定については、「関連するストレージオプション」を参照してください。
25.9.1.1. 前提条件
以下があることを前提とします。
- 少なくとも 1 つのマスターと 1 つのノードがある既存の OpenShift Container Platform クラスター
- 少なくとも 1 つのサポート対象ストレージボリューム
- cluster-admin 権限を持つユーザー
25.9.2. 仕様の定義
ここでの仕様は GlusterFS に合わせてカスタマイズされています。使用しているボリュームプロバイダーの独自の設定については、「関連するストレージオプション」を参照してください。
25.9.2.1. ラベルのある永続ボリューム
例25.14 glusterfs-pv.yaml
apiVersion: v1 kind: PersistentVolume metadata: name: gluster-volume labels: 1 storage-tier: gold aws-availability-zone: us-east-1 spec: capacity: storage: 2Gi accessModes: - ReadWriteMany glusterfs: endpoints: glusterfs-cluster 2 path: myVol1 readOnly: false persistentVolumeReclaimPolicy: Retain
25.9.2.2. セレクターのある Persistent Volume Claim (永続ボリューム要求)
selector スタンザのある要求 (以下の例を参照してください) は、事前にバインドされていない既存の非要求の PV との一致を試みます。PVC セレクターがあるため、PV の容量は無視されます。ただし、accessModes は一致条件において考慮されます。
要求はその selector スタンザに含まれるすべてのキーと値のペアに一致する必要がある、ということに注意してください。要求に一致する PV がない場合、PVC はバインドされない (保留中の) ままになります。PV はその後に作成され、要求によってラベルの一致の有無が自動的にチェックされます。
例25.15 glusterfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gluster-claim
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
selector: 1
matchLabels:
storage-tier: gold
aws-availability-zone: us-east-1
- 1
- selector スタンザでは、この要求と一致させるために PV で必要なすべてのラベルを定義します。
25.9.2.3. ボリュームエンドポイント
PV を Gluster ボリュームに割り当てるには、オブジェクトを作成する前にエンドポイントを設定する必要があります。
例25.16 glusterfs-ep.yaml
apiVersion: v1 kind: Endpoints metadata: name: glusterfs-cluster subsets: - addresses: - ip: 192.168.122.221 ports: - port: 1 - addresses: - ip: 192.168.122.222 ports: - port: 1
25.9.2.4. PV、PVC、およびエンドポイントのデプロイ
この例では、oc
コマンドを cluster-admin 権限のあるユーザーとして実行します。実稼働環境では、クラスタークライアントが PVC の定義と作成を行うことなどが予想されます。
# oc create -f glusterfs-ep.yaml endpoints "glusterfs-cluster" created # oc create -f glusterfs-pv.yaml persistentvolume "gluster-volume" created # oc create -f glusterfs-pvc.yaml persistentvolumeclaim "gluster-claim" created
最後に、PV と PVC が正常にバインドされていることを確認します。
# oc get pv,pvc NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE gluster-volume 2Gi RWX Bound gfs-trial/gluster-claim 7s NAME STATUS VOLUME CAPACITY ACCESSMODES AGE gluster-claim Bound gluster-volume 2Gi RWX 7s
PVC はプロジェクトに対してローカルですが、PV はクラスター全体にわたるグローバルリソースです。開発者および管理者以外のユーザーは、使用可能な PV のすべて (またはいずれか) にアクセスできない場合があります。
25.10. ストレージクラスを使用した動的プロビジョニング
25.10.1. 概要
この例では、StorageClass のさまざまな設定と Google Cloud Platform Compute Engine (GCE) を使用した動的プロビジョニングについて、いくつかのシナリオを紹介します。これらの例では、Kubernetes、GCE、および永続ディスクについて理解していること、また OpenShift Container Platform がインストールされていて GCE を使用できるよう適切に設定されていることを前提とします。
25.10.2. シナリオ 1: 2 種類の StorageClass を持つ基本的な動的プロビジョニング
StorageClass を使用すると、ストレージのレベルや使用状況を区別し、記述することができます。この例では、cluster-admin
または storage-admin
が GCE で 2 つの異なるストレージのクラスを設定します。
-
slow
: 低コストで効率的なシーケンシャルデータの操作に最適化されている (低速読み取り/書き込み) -
fast
: 高速なランダム IOPS と持続的スループットに最適化されている (高速読み取り/書き込み)
これらの StorageClass を作成することで、cluster-admin
または storage-admin
はユーザーに対して、StorageClass の特定のレベルまたはサービスについての要求の作成を許可することができます。
例25.17 StorageClass 低速オブジェクトの定義
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: slow 1 provisioner: kubernetes.io/gce-pd 2 parameters: type: pd-standard 3 zone: us-east1-d 4
例25.18 StorageClass 高速オブジェクトの定義
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: fast provisioner: kubernetes.io/gce-pd parameters: type: pd-ssd zone: us-east1-d
cluster-admin
または storage-admin
として、両方の定義を YAML ファイル (slow-gce.yaml
と fast-gce.yaml
など) に保存します。次に StorageClass を作成します。
# oc create -f slow-gce.yaml storageclass "slow" created # oc create -f fast-gce.yaml storageclass "fast" created # oc get storageclass NAME TYPE fast kubernetes.io/gce-pd slow kubernetes.io/gce-pd
cluster-admin
ユーザーまたは storage-admin
ユーザーは、適切な StorageClass 名を適切なユーザー、グループ、およびプロジェクトに送る必要があります。
通常ユーザーとして、以下のように新規プロジェクトを作成します。
# oc new-project rh-eng
要求の YAML 定義を作成し、これをファイル (pvc-fast.yaml
) に保存します。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-engineering spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: fast
oc create
コマンドを使用して要求を追加します。
# oc create -f pvc-fast.yaml persistentvolumeclaim "pvc-engineering" created
要求がバインドされているかどうかをチェックします。
# oc get pvc NAME STATUS VOLUME CAPACITY ACCESSMODES AGE pvc-engineering Bound pvc-e9b4fef7-8bf7-11e6-9962-42010af00004 10Gi RWX 2m
この要求は rh-eng プロジェクトで作成され、バインドされているため、同じプロジェクトのいずれのユーザーにも共有できます。
cluster-admin
ユーザーまたは storage-admin
ユーザーとして、最近動的にプロビジョニングした永続ボリューム (PV) を表示します。
# oc get pv NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE pvc-e9b4fef7-8bf7-11e6-9962-42010af00004 10Gi RWX Delete Bound rh-eng/pvc-engineering 5m
動的にプロビジョニングされたすべてのボリュームについて、RECLAIMPOLICY がデフォルトで Delete になっていることに注意してください。これは、ボリュームが要求がシステムに存在している間存続することを意味します。要求を削除するとボリュームも削除され、ボリュームのすべてのデータが失われます。
最後に GCE コンソールをチェックします。新規のディスクが作成され、使用できる状態になります。
kubernetes-dynamic-pvc-e9b4fef7-8bf7-11e6-9962-42010af00004 SSD persistent disk 10 GB us-east1-d
これで、Pod で Persistent Volume Claim (永続ボリューム要求) を参照し、ボリュームの使用を開始することができます。
25.10.3. シナリオ 2: クラスターにおけるデフォルトの StorageClass の動作を有効にする方法
この例では、cluster-admin
または storage-admin
により、StorageClass を要求に暗黙的に指定していない他のすべてのユーザーおよびプロジェクトについてデフォルトのストレージクラスが有効になります。この方法は、特化した StorageClass をクラスター全体に設定し、伝達することなしに cluster-admin
または storage-admin
がストレージボリュームを容易に管理できるようにする場合に役に立ちます。
以下の例は 「シナリオ 1: 2 種類の StorageClass を持つ基本的な動的プロビジョニング」 を基づいて作成されています。cluster-admin
または storage-admin
は、デフォルトの StorageClass として指定するための別の StorageClass を作成します。
例25.19 デフォルトの StorageClass オブジェクトの定義
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: generic 1 annotations: storageclass.kubernetes.io/is-default-class: "true" 2 provisioner: kubernetes.io/gce-pd parameters: type: pd-standard zone: us-east1-d
cluster-admin
または storage-admin
として、この定義を YAML ファイル (generic-gce.yaml
) に保存し、StorageClass を作成します。
# oc create -f generic-gce.yaml storageclass "generic" created # oc get storageclass NAME TYPE generic kubernetes.io/gce-pd fast kubernetes.io/gce-pd slow kubernetes.io/gce-pd
通常ユーザーとして、StorageClass の要件なしに新規の要求定義を作成し、これをファイル (generic-pvc.yaml
) に保存します。
例25.20 デフォルトのストレージ要求オブジェクトの定義
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-engineering2 spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi
以下のように実行し、要求がバインドされていることをチェックします。
# oc create -f generic-pvc.yaml
persistentvolumeclaim "pvc-engineering2" created
3s
# oc get pvc
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
pvc-engineering Bound pvc-e9b4fef7-8bf7-11e6-9962-42010af00004 10Gi RWX 41m
pvc-engineering2 Bound pvc-a9f70544-8bfd-11e6-9962-42010af00004 5Gi RWX 7s 1
- 1
pvc-engineering2
は、デフォルトで、動的にプロビジョニングされたボリュームにバインドされます。
cluster-admin
または storage-admin
として、ここまでに定義した永続ボリュームを表示します。
# oc get pv NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE pvc-a9f70544-8bfd-11e6-9962-42010af00004 5Gi RWX Delete Bound rh-eng/pvc-engineering2 5m 1 pvc-ba4612ce-8b4d-11e6-9962-42010af00004 5Gi RWO Delete Bound mytest/gce-dyn-claim1 21h pvc-e9b4fef7-8bf7-11e6-9962-42010af00004 10Gi RWX Delete Bound rh-eng/pvc-engineering 46m 2
GCE を使用して (動的にプロビジョニングされるのではなく) 手動でプロビジョニングされるディスクを作成します。次に、新規の GCE ディスク (pv-manual-gce.yaml
) に接続する永続ボリュームを作成します。
例25.21 手動の PV オブジェクトの定義
apiVersion: v1 kind: PersistentVolume metadata: name: pv-manual-gce spec: capacity: storage: 35Gi accessModes: - ReadWriteMany gcePersistentDisk: readOnly: false pdName: the-newly-created-gce-PD fsType: ext4
オブジェクト定義ファイルを実行します。
# oc create -f pv-manual-gce.yaml
ここでもう一度 PV を表示します。pv-manual-gce
ボリュームが Available になっていることに留意してください。
# oc get pv NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE pv-manual-gce 35Gi RWX Retain Available 4s pvc-a9f70544-8bfd-11e6-9962-42010af00004 5Gi RWX Delete Bound rh-eng/pvc-engineering2 12m pvc-ba4612ce-8b4d-11e6-9962-42010af00004 5Gi RWO Delete Bound mytest/gce-dyn-claim1 21h pvc-e9b4fef7-8bf7-11e6-9962-42010af00004 10Gi RWX Delete Bound rh-eng/pvc-engineering 53m
今度は generic-pvc.yaml
PVC 定義と同一の別の要求を作成しますが、名前を変更し、ストレージクラス名は設定しません。
例25.22 要求オブジェクトの定義
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-engineering3 spec: accessModes: - ReadWriteMany resources: requests: storage: 15Gi
このインスタンスではデフォルトの StorageClass が有効になっているため、手動で作成された PV は要求のリクエストに対応せず、ユーザーは新たに動的にプロビジョニングされた永続ボリュームを受け取ることになります。
# oc get pvc NAME STATUS VOLUME CAPACITY ACCESSMODES AGE pvc-engineering Bound pvc-e9b4fef7-8bf7-11e6-9962-42010af00004 10Gi RWX 1h pvc-engineering2 Bound pvc-a9f70544-8bfd-11e6-9962-42010af00004 5Gi RWX 19m pvc-engineering3 Bound pvc-6fa8e73b-8c00-11e6-9962-42010af00004 15Gi RWX 6s
デフォルトの StorageClass がこのシステムで有効になっているため、手動で作成された永続ボリュームを前述の要求によってバインドし、動的にプロビジョニングされた新規ボリュームがバインドされないようにするには、PV をデフォルトの StorageClass で作成しておく必要があります。
デフォルトの StorageClass がこのシステムで有効になっているため、手動で作成された永続ボリュームを前述の要求によってバインドし、動的にプロビジョニングされた新規ボリュームをバインドしないようにするためには、PV をデフォルトの StorageClass で作成しておく必要があります。
これを解決するには、cluster-admin
ユーザーまたは storage-admin
ユーザーは、別の GCE ディスクを作成するか、または必要に応じて最初の手動の PV を削除し、StorageClass 名を割り当てる PV オブジェクト定義 (pv-manual-gce2.yaml
) を使用することのみが必要になります。
例25.23 デフォルトの StorageClass 名を持つ手動 PV の仕様
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-manual-gce2
spec:
capacity:
storage: 35Gi
accessModes:
- ReadWriteMany
gcePersistentDisk:
readOnly: false
pdName: the-newly-created-gce-PD
fsType: ext4
storageClassName: generic 1
- 1
- 先に作成した汎用 の StorageClass の名前。
オブジェクト定義ファイルを実行します。
# oc create -f pv-manual-gce2.yaml
PV を一覧表示します。
# oc get pv NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE pv-manual-gce 35Gi RWX Retain Available 4s 1 pv-manual-gce2 35Gi RWX Retain Bound rh-eng/pvc-engineering3 4s 2 pvc-a9f70544-8bfd-11e6-9962-42010af00004 5Gi RWX Delete Bound rh-eng/pvc-engineering2 12m pvc-ba4612ce-8b4d-11e6-9962-42010af00004 5Gi RWO Delete Bound mytest/gce-dyn-claim1 21h pvc-e9b4fef7-8bf7-11e6-9962-42010af00004 10Gi RWX Delete Bound rh-eng/pvc-engineering 53m
動的にプロビジョニングされたすべてのボリュームの RECLAIMPOLICY がデフォルトで Delete である点に注目してください。PV に動的にバインドされた PVC が削除されると、GCE ボリュームが削除され、すべてのデータが消失します。ただし、手動で作成された PV の RECLAIMPOLICY はデフォルトで Retain です。
25.11. 既存のレガシーストレージに対するストレージクラスの使用
25.11.1. 概要
この例では、レガシーデータボリュームが存在し、cluster-admin
または storage-admin
がそのボリュームを特定のプロジェクトで使用できるようにする必要があります。StorageClass を使用すると、他のユーザーおよびプロジェクトがこのボリュームへのアクセスを要求から取得する可能性が低くなります。これは、要求には完全一致する StorageClass 名の値が必要になるためです。また、ここでは動的なプロビジョニングも無効にしています。この例では以下の要件を満たしていることを前提としています。
- OpenShift Container Platform、GCE、および永続ディスクについてある程度理解している。
- OpenShift Container Platform が GCE を使用するように適切に設定されている。
25.11.1.1. シナリオ 1: レガシーデータを含む既存の永続ボリュームに StorageClass をリンクさせる
cluster-admin
または storage-admin
として、過去の財務データ用の StorageClass を定義し、作成します。
例25.24 StorageClass の finance-history オブジェクトの定義
この定義を YAML ファイル (finance-history-storageclass.yaml
) に保存して、StorageClass を作成します。
# oc create -f finance-history-storageclass.yaml storageclass "finance-history" created # oc get storageclass NAME TYPE finance-history no-provisioning
cluster-admin
ユーザーまたは storage-admin
ユーザーは、適切な StorageClass 名を適切なユーザー、グループ、およびプロジェクトに送る必要があります。
StorageClass が存在します。cluster-admin
または storage-admin
は StorageClass で使用するための永続ボリューム (PV) を作成することができます。(動的にプロビジョニングされない) GCE および新しい GCE ディスク (gce-pv.yaml
) に接続される永続ボリュームを使用して、手動でプロビジョニングされたディスクを作成します。
例25.25 財務履歴の PV オブジェクト
apiVersion: v1 kind: PersistentVolume metadata: name: pv-finance-history spec: capacity: storage: 35Gi accessModes: - ReadWriteMany gcePersistentDisk: readOnly: false pdName: the-existing-PD-volume-name-that-contains-the-valuable-data 1 fsType: ext4 storageClassName: finance-history 2
cluster-admin
または storage-admin
として、PV を作成し、これを表示します。
# oc create -f gce-pv.yaml persistentvolume "pv-finance-history" created # oc get pv NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE pv-finance-history 35Gi RWX Retain Available 2d
pv-finance-history
が Available で、いつでも利用可能であることに留意してください。
ユーザーとして、Persistent Volume Claim (永続ボリューム要求、PVC) を YAML ファイルとして作成し、以下のように適切な StorageClass 名を指定します。
例25.26 finance-history オブジェクト定義の要求
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-finance-history
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
storageClassName: finance-history 1
- 1
- StorageClass 名。完全一致している必要があります。そうでない場合には、削除されるか、または名前が一致する別の StorageClass が作成されるまで要求が非バインドの状態になります。
PVC と PV を作成および表示して、バインドされているか確認します。
# oc create -f pvc-finance-history.yaml persistentvolumeclaim "pvc-finance-history" created # oc get pvc NAME STATUS VOLUME CAPACITY ACCESSMODES AGE pvc-finance-history Bound pv-finance-history 35Gi RWX 9m # oc get pv (cluster/storage-admin) NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE pv-finance-history 35Gi RWX Retain Bound default/pvc-finance-history 5m
同じクラスター内の StorageClass を、レガシーデータ (動的プロビジョニングなし) および動的プロビジョニングの両方に対して使用することができます。
25.12. Azure Blob Storage での統合 Docker レジストリーの設定
25.12.1. 概要
このトピックでは、Microsoft Azure Blob Storage で OpenShift 統合 Docker レジストリー を設定する方法を説明します。
25.12.2. 作業を開始する前に
- Microsoft Azure Portal、Microsoft Azure CLI、または Microsoft Azure Storage Explorer を使用してストレージコンテナーを作成します。ストレージアカウント名、ストレージアカウントキー、および コンテナー名をメモしてください。
- デプロイされていない場合は、統合 Docker レジストリーをデプロイします。
25.12.3. レジストリー設定の上書き
新規レジストリー Pod を作成し、古い Pod と自動的に置き換えるには、以下の手順を実行します。
registryconfig.yaml という名前の新規レジストリー設定ファイルを作成して、以下の情報を追加します。
version: 0.1 log: level: debug http: addr: :5000 storage: cache: blobdescriptor: inmemory delete: enabled: true azure: 1 accountname: azureblobacc accountkey: azureblobacckey container: azureblobname realm: core.windows.net 2 auth: openshift: realm: openshift middleware: registry: - name: openshift repository: - name: openshift options: acceptschema2: false pullthrough: true enforcequota: false projectcachettl: 1m blobrepositorycachettl: 10m storage: - name: openshift
新規レジストリー設定を作成します。
$ oc create secret generic registry-config --from-file=config.yaml=registryconfig.yaml
シークレットを追加します。
$ oc volume dc/docker-registry --add --type=secret \ --secret-name=registry-config -m /etc/docker/registry/
REGISTRY_CONFIGURATION_PATH
環境変数を設定します。$ oc set env dc/docker-registry \ REGISTRY_CONFIGURATION_PATH=/etc/docker/registry/config.yaml
レジストリー設定をすでに作成している場合は、以下の手順を実行します。
シークレットを削除します。
$ oc secretレジストリ設定を削除する
新規レジストリー設定を作成します。
$ oc create secret generic registry-config --from-file=config.yaml=registryconfig.yaml
新規ロールアウトを開始して設定を更新します。
$ oc rollout latest docker-registry
第26章 HTTP プロキシーの使用
26.1. 概要
実稼働環境では、インターネットへの直接アクセスを拒否し、代わりに HTTP または HTTPS プロキシーを使用することができます。これらのプロキシーを使用するように OpenShift Container Platform を設定することは、設定ファイルまたは JSON ファイルで標準的な環境変数を設定するのと同じくらい簡単に実行できます。この設定は、通常インストール (Advanced installation) 時に実行するか、またはインストール後に行うことができます。
プロキシー設定はクラスター内の各ホストで同じである必要があります。したがって、プロキシーの設定やその変更を行う場合は、各 OpenShift Container Platform ホスト上のファイルを更新して同じ値にする必要があります。その後はクラスター内の各ホストで OpenShift Container Platform サービスを再起動する必要があります。
NO_PROXY
、HTTP_PROXY
、および HTTPS_PROXY
環境変数は各ホストの /etc/sysconfig/atomic-openshift-master-api または /etc/sysconfig/atomic-openshift-master-controllers ファイルと /etc/sysconfig/atomic-openshift-node ファイルにあります。
26.2. NO_PROXY の設定
NO_PROXY
環境変数は、OpenShift Container Platform のすべてのコンポーネントと、OpenShift Container Platform によって管理されるすべての IP アドレスを一覧表示します。
CIDR を許可する OpenShift サービスでは、以下のように NO_PROXY
にホスト、IP アドレス、または IP 範囲 (CIDR 形式) のカンマ区切りの一覧を指定できます。
- マスターホストの場合
- ノードホスト名
- マスター IP またはホスト名
- etcd ホストの IP アドレス
- ノードホストの場合
- マスター IP またはホスト名
- Docker サービスの場合
- レジストリーのサービス IP とホスト名
-
レジストリーサービス URL
docker-registry.default.svc.cluster.local
- レジストリールートホスト名 (作成されている場合)
Docker を使用している場合は、Docker はホスト、ドメイン拡張子、または IP アドレスのカンマ区切りの一覧を受け入れますが、CIDR 形式の IP 範囲は受け入れません。CIDR 形式の IP 範囲を受け入れるのは OpenShift サービスのみです。`no_proxy' 変数には、プロキシーを使用すべきでないドメイン拡張子のカンマ区切りの一覧を含める必要があります。
たとえば、no_proxy
が .school.edu
に設定されている場合は、特定の学校からドキュメントを取得するためにプロキシーが使用されることはありません。
NO_PROXY
には、master-config.yaml ファイルにあるように、SDN ネットワークとサービス IP アドレスも含まれています。
/etc/origin/master/master-config.yaml
networkConfig: clusterNetworks: - cidr: 10.1.0.0/16 hostSubnetLength: 9 serviceNetworkCIDR: 172.30.0.0/16
OpenShift Container Platform では、ドメインサフィックスに付加するワイルドカードとして *
を使用できません。たとえば、以下は受け入れられます。
NO_PROXY=.example.com
しかし、以下の場合は受け入れられません。
NO_PROXY=*.example.com
NO_PROXY
で許可されるワイルドカードは *
1 文字だけです。このワイルドカードはすべてのホストに一致し、プロキシーを効果的に無効にします。
この一覧にある名前はそれぞれ、ホスト名をサフィックスとして含むドメインまたはホスト名自体のいずれかと一致します。
ノードを拡張するときは、ホスト名の一覧ではなくドメイン名を使用してください。
たとえば、example.com は example.com、example.com:80、および www.example.com と一致します。
26.3. ホストでのプロキシーの設定
OpenShift Container Platform 制御ファイルのプロキシー環境変数を編集します。クラスター内のすべてのファイルが正しいことを確認してください。
HTTP_PROXY=http://<user>:<password>@<ip_addr>:<port>/ HTTPS_PROXY=https://<user>:<password>@<ip_addr>:<port>/ NO_PROXY=master.hostname.example.com,10.1.0.0/16,172.30.0.0/16 1
- 1
- ホスト名と CIDR をサポートします。SDN ネットワークとサービスの IP 範囲
10.1.0.0/16,172.30.0.0/16
がデフォルトで含まれている必要があります。
必要に応じてマスターホストまたはノードホストを再起動します。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers # systemctl restart atomic-openshift-node
マルチマスターインストールの場合
# systemctl restart atomic-openshift-master-controllers # systemctl restart atomic-openshift-master-api
26.4. Ansible を使用したホストでのプロキシー設定
通常インストール (Advanced installation) の実行時に、インベントリーファイルで設定可能な openshift_no_proxy
、openshift_http_proxy
、および openshift_https_proxy
パラメーターを使用して NO_PROXY
、HTTP_PROXY
、および HTTPS_PROXY
環境変数を設定することができます。
Ansible を使用したプロキシー設定例
# Global Proxy Configuration # These options configure HTTP_PROXY, HTTPS_PROXY, and NOPROXY environment # variables for docker and master services. openshift_http_proxy=http://<user>:<password>@<ip_addr>:<port> openshift_https_proxy=https://<user>:<password>@<ip_addr>:<port> openshift_no_proxy='.hosts.example.com,some-host.com' # # Most environments do not require a proxy between OpenShift masters, nodes, and # etcd hosts. So automatically add those host names to the openshift_no_proxy list. # If all of your hosts share a common domain you may wish to disable this and # specify that domain above. # openshift_generate_no_proxy_hosts=True
Ansible パラメーターを使用してビルド用に設定できるその他のプロキシー設定があります。たとえば、以下の通りです。
openshift_builddefaults_git_http_proxy
パラメーターと openshift_builddefaults_git_https_proxy
パラメーターを使用すると、Git クローン作成のためにプロキシーを使用することができます。
openshift_builddefaults_http_proxy
パラメーターと openshift_builddefaults_https_proxy
パラメーターは、Docker ビルドストラテジーとカスタムビルドストラテジーのプロセスで環境変数を利用可能にできます。
26.5. Docker pull のプロキシー設定
OpenShift Container Platform のノードホストは Docker レジストリーに対してプッシュ操作とプル操作を実行する必要があります。ノードがアクセスするためにプロキシーを必要としないレジストリーの場合は、以下の項目を指定した NO_PROXY
パラメーターを含めてください。
- レジストリーのホスト名
- レジストリーサービスの IP アドレス
- サービス名
これにより、外部の HTTP プロキシーをオプションのままにして、そのレジストリーをブラックリストに入れることができます。
以下を実行して、レジストリーサービスの IP アドレス
docker_registy_ip
を取得します。$ oc describe svc/docker-registry -n default Name: docker-registry Namespace: default Labels: docker-registry=default Selector: docker-registry=default Type: ClusterIP IP: 172.30.163.183 1 Port: 5000-tcp 5000/TCP Endpoints: 10.1.0.40:5000 Session Affinity: ClientIP No events.
- 1
- レジストリーサービスの IP です。
/etc/sysconfig/docker ファイルを編集し、シェル形式の
NO_PROXY
変数を追加して、<docker_registry_ip>
を直前の手順で取得した IP アドレスに置き換えます。HTTP_PROXY=http://<user>:<password>@<ip_addr>:<port>/ HTTPS_PROXY=https://<user>:<password>@<ip_addr>:<port>/ NO_PROXY=master.hostname.example.com,<docker_registry_ip>,docker-registry.default.svc.cluster.local
Docker サービスを再起動します。
# systemctl restart docker
26.6. プロキシーの背後での Maven の使用
プロキシーで Maven を使用するには、HTTP_PROXY_NONPROXYHOSTS
変数を使用する必要があります。
Maven をプロキシーの背後に設定する手順などを含めた Red Hat JBoss Enterprise Application Platform 向けの OpenShift Container Platform 環境の設定に関する詳細については 、「Red Hat JBoss Enterprise Application Platform for OpenShift」を参照してください。
26.7. S2I ビルドでのプロキシーの設定
S2I ビルドはさまざまな場所から依存関係を取得します。.s2i/environment ファイルを使用して単純なシェル変数を指定することができます。それに応じて OpenShift Container Platform はビルドイメージの参照時に応答します。
以下は、サンプル値を指定したサポート対象のプロキシー環境変数です。
HTTP_PROXY=http://USERNAME:PASSWORD@10.0.1.1:8080/ HTTPS_PROXY=https://USERNAME:PASSWORD@10.0.0.1:8080/ NO_PROXY=master.hostname.example.com
26.8. デフォルトテンプレートでのプロキシーの設定
OpenShift Container Platform でデフォルトで利用可能なテンプレートサンプルには、HTTP プロキシーの設定が含まれていません。これらのテンプレートに基づく既存のアプリケーションについては、アプリケーションのビルド設定の source
セクションを変更して、以下のプロキシー設定を追加します。
... source: type: Git git: uri: https://github.com/openshift/ruby-hello-world httpProxy: http://proxy.example.com httpsProxy: https://proxy.example.com noProxy: somedomain.com, otherdomain.com ...
これは、Git クローン作成用にプロキシーを使用するプロセスと似ています。
26.9. Pod でのプロキシー環境変数の設定
デプロイメント設定の templates.spec.containers
スタンザで NO_PROXY
、HTTP_PROXY
、および HTTPS_PROXY
環境変数を設定して、プロキシー接続情報を渡すことができます。実行時の Pod のプロキシー設定についても同じことを実行できます。
... containers: - env: - name: "HTTP_PROXY" value: "http://<user>:<password>@<ip_addr>:<port>" ...
oc set env
コマンドを使用して、既存のデプロイメント設定を新規の環境変数で更新することもできます。
$ oc set env dc/frontend HTTP_PROXY=http://<user>:<password>@<ip_addr>:<port>
OpenShift Container Platform インスタンスで ConfigChange トリガーを設定している場合は、変更が自動的に行われます。そうでない場合は、変更が反映されるようにアプリケーションを手動で再デプロイしてください。
26.10. Git リポジトリーのアクセス
プロキシーの使用によってのみ Git リポジトリーにアクセスできる場合は、使用するプロキシーを BuildConfig
の source
セクションで定義できます。HTTP プロキシーと HTTPS プロキシーの両方を使用するように設定できます。どちらのフィールドもオプションです。NoProxy フィールドを使用して、プロキシーを実行しないドメインを指定することもできます。
これを機能させるために、ソース URI では HTTP プロトコルまたは HTTPS プロトコルを使用する必要があります。
source: git: uri: "https://github.com/openshift/ruby-hello-world" httpProxy: http://proxy.example.com httpsProxy: https://proxy.example.com noProxy: somedomain.com, otherdomain.com
第27章 グローバルビルドのデフォルトと上書きの設定
27.1. 概要
開発者はプロジェクト内の特定のビルド設定において、Git クローン作成のためのプロキシー設定などの設定を定義することができます。開発者に特定の設定をそれぞれのビルド設定で定義するように要求するのではなく、管理者が受付制御プラグインを使用して、すべてのビルドでこの設定を自動的に使用するグローバルビルドのデフォルトと上書きを設定することができます。
これらのプラグインから取得した設定は、ビルドプロセス時に使用されるだけで、ビルド設定やビルド自体で設定されません。プラグインでの設定を使用することで、管理者はグローバル設定をいつでも変更することができ、既存のビルド設定またはビルドから実行されたビルドに、新規設定が割り当てられます。
-
BuildDefaults
受付制御プラグインを使用すると、管理者は Git HTTP や HTTPS プロキシーなどの設定についてのグローバルなデフォルトと、デフォルトの環境変数を設定することができます。これらのデフォルトによって、特定のビルド用に設定された値が上書きされることはありません。ただし、それらの値がビルド定義に存在しない場合は、デフォルト値に設定されます。 BuildOverrides
受付制御プラグインを使用すると、管理者はビルドに保存されている値に関係なく、ビルドの設定を上書きできます。現時点では、このプラグインには、ビルド時にレジストリーからのローカルイメージが強制的に更新されるように、ビルドストラテジーのforcePull
フラグを上書きするサポートがあります。更新することで、ユーザーはプル可能なイメージでしかビルドできないようにします。このプラグインは、イメージラベルセットが全ビルドイメージに適用されるように設定することも可能です。BuildOverrides
の受付制御プラグインと上書き可能な値の設定に関する情報は、「グローバルビルドの上書きの手動設定」を参照してください。
デフォルトのノードセレクターおよび、BuildDefaults
または BuildOverride
受付プラグインは以下のように連携されます。
-
マスター設定ファイルの
projectConfig.defaultNodeSelector
フィールドに定義されているデフォルトのプロジェクトノードセレクターは、指定のnodeSelector
値なしに、全プロジェクトに作成済みの Pod に適用されます。これらの設定は、BuildDefaults
またはBuildOverride
ノードセレクターが設定されていないクラスターで、nodeSelector="null"
が指定されているビルドに適用されます。 -
nodeSelector="null"
パラメーターがビルド設定に設定されている場合のみ、クラスター全体のデフォルトのビルドノードセレクターadmissionConfig.pluginConfig.BuildDefaults.configuration.nodeSelector
が適用されます。nodeSelector=null
はデフォルト設定です。 デフォルトのプロジェクトまたはクラスター全体のノードセレクターの場合には、デフォルト設定がビルドのノードセレクターに AND として追加されます。このビルドのノードセレクターは、
BuildDefaults
またはBuildOverride
受付プラグインで設定されます。これらの設定は、BuildOverrides
ノードセレクターとプロジェクトのデフォルトノードセレクターの条件を満たすノードに対してのみ、ビルドがスケジューリングされるという意味です。注記RunOnceDuration プラグインを使用することで、ビルド Pod の実行時間のハード制限を定義できます。
27.2. グローバルビルドのデフォルトの設定
グローバルビルドのデフォルトは以下の 2 通りの方法で設定できます。
27.2.1. Ansible を使用したグローバルビルドのデフォルトの設定
通常インストール (Advanced installation) の実行時に、インベントリーファイルで設定可能な 以下のパラメーターを使用して BuildDefaults
プラグインを設定することができます。
-
openshift_builddefaults_http_proxy
-
openshift_builddefaults_https_proxy
-
openshift_builddefaults_no_proxy
-
openshift_builddefaults_git_http_proxy
-
openshift_builddefaults_git_https_proxy
-
openshift_builddefaults_git_no_proxy
-
openshift_builddefaults_image_labels
-
openshift_builddefaults_nodeselectors
-
openshift_builddefaults_annotations
-
openshift_builddefaults_resources_requests_cpu
-
openshift_builddefaults_resources_requests_memory
-
openshift_builddefaults_resources_limits_cpu
-
openshift_builddefaults_resources_limits_memory
例27.1 Ansible を使用したビルドのデフォルトの設定例
# These options configure the BuildDefaults admission controller which injects # configuration into Builds. Proxy related values will default to the global proxy # config values. You only need to set these if they differ from the global proxy settings. openshift_builddefaults_http_proxy=http://USER:PASSWORD@HOST:PORT openshift_builddefaults_https_proxy=https://USER:PASSWORD@HOST:PORT openshift_builddefaults_no_proxy=mycorp.com openshift_builddefaults_git_http_proxy=http://USER:PASSWORD@HOST:PORT openshift_builddefaults_git_https_proxy=https://USER:PASSWORD@HOST:PORT openshift_builddefaults_git_no_proxy=mycorp.com openshift_builddefaults_image_labels=[{'name':'imagelabelname1','value':'imagelabelvalue1'}] openshift_builddefaults_nodeselectors={'nodelabel1':'nodelabelvalue1'} openshift_builddefaults_annotations={'annotationkey1':'annotationvalue1'} openshift_builddefaults_resources_requests_cpu=100m openshift_builddefaults_resources_requests_memory=256Mi openshift_builddefaults_resources_limits_cpu=1000m openshift_builddefaults_resources_limits_memory=512Mi # Or you may optionally define your own build defaults configuration serialized as json #openshift_builddefaults_json='{"BuildDefaults":{"configuration":{"apiVersion":"v1","env":[{"name":"HTTP_PROXY","value":"http://proxy.example.com.redhat.com:3128"},{"name":"NO_PROXY","value":"ose3-master.example.com"}],"gitHTTPProxy":"http://proxy.example.com:3128","gitNoProxy":"ose3-master.example.com","kind":"BuildDefaultsConfig"}}}'
27.2.2. グローバルビルドのデフォルトの手動設定
BuildDefaults
プラグインを設定するには、以下の手順を実行します。
マスターノードの /etc/origin/master/master-config.yaml ファイルにプラグインの設定を追加します。
admissionConfig: pluginConfig: BuildDefaults: configuration: apiVersion: v1 kind: BuildDefaultsConfig gitHTTPProxy: http://my.proxy:8080 1 gitHTTPSProxy: https://my.proxy:8443 2 gitNoProxy: somedomain.com, otherdomain.com 3 env: - name: HTTP_PROXY 4 value: http://my.proxy:8080 - name: HTTPS_PROXY 5 value: https://my.proxy:8443 - name: BUILD_LOGLEVEL 6 value: 4 - name: CUSTOM_VAR 7 value: custom_value imageLabels: - name: url 8 value: https://containers.example.org - name: vendor value: ExampleCorp Ltd. nodeSelector: 9 key1: value1 key2: value2 annotations: 10 key1: value1 key2: value2 resources: 11 requests: cpu: "100m" memory: "256Mi" limits: cpu: "100m" memory: "256Mi"
- 1
- Git リポジトリーからソースコードのクローンを作成する場合に使用する HTTP プロキシーを設定します。
- 2
- Git リポジトリーからソースコードのクローンを作成する場合に使用する HTTPS プロキシーを設定します。
- 3
- プロキシーを実行しないドメインの一覧を設定します。
- 4
- ビルド時に使用する HTTP プロキシーを設定するデフォルトの環境変数。この環境変数は、アセンブルおよびビルドの段階で依存関係をダウンロードするために使用できます。
- 5
- ビルド時に使用する HTTPS プロキシーを設定するデフォルトの環境変数。この環境変数は、アセンブルおよびビルドの段階で依存関係をダウンロードするために使用できます。
- 6
- ビルド時にビルドのログレベルを設定するデフォルトの環境変数。
- 7
- すべてのビルドに追加されるその他のデフォルトの環境変数。
- 8
- すべてのイメージビルドに適用されるラベル。このラベルは
BuildConfig
で上書きできます。 - 9
- ビルド Pod は
key1=value2
およびkey2=value2
のラベルが付いたノード上でのみ実行されます。ユーザーは、これらの値が無視される場合に、ビルドに対して異なるnodeSelectors
セットを定義することができます。 - 10
- ビルド Pod にはこれらのアノテーションが追加されます。
- 11
BuildConfig
に関連リソースが定義されていない場合は、デフォルトのリソースをビルド Pod に設定します。
変更を有効にするために、マスターサービスを再起動します。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers
27.3. グローバルビルドの上書きの設定
グローバルビルドの上書きは以下の 2 通りの方法で設定できます。
27.3.1. Ansible を使用したグローバルビルドの上書きの設定
通常インストール (Advanced installation) の実行時に、インベントリーファイルで設定可能な以下のパラメーターを使用して BuildOverrides
プラグインを設定できます。
-
openshift_buildoverrides_force_pull
-
openshift_buildoverrides_image_labels
-
openshift_buildoverrides_nodeselectors
-
openshift_buildoverrides_annotations
-
openshift_buildoverrides_tolerations
例27.2 Ansible を使用したビルドの上書きの設定例
# These options configure the BuildOverrides admission controller which injects # configuration into Builds. openshift_buildoverrides_force_pull=true openshift_buildoverrides_image_labels=[{'name':'imagelabelname1','value':'imagelabelvalue1'}] openshift_buildoverrides_nodeselectors={'nodelabel1':'nodelabelvalue1'} openshift_buildoverrides_annotations={'annotationkey1':'annotationvalue1'} openshift_buildoverrides_tolerations=[{'key':'mykey1','value':'myvalue1','effect':'NoSchedule','operator':'Equal'}] # Or you may optionally define your own build overrides configuration serialized as json #openshift_buildoverrides_json='{"BuildOverrides":{"configuration":{"apiVersion":"v1","kind":"BuildOverridesConfig","forcePull":"true","tolerations":[{'key':'mykey1','value':'myvalue1','effect':'NoSchedule','operator':'Equal'}]}}}'
27.3.2. グローバルビルドの上書きの手動設定
BuildOverrides
プラグインを設定するには、以下の手順を実行します。
マスターの /etc/origin/master/master-config.yaml ファイルにプラグインの設定を追加します。
admissionConfig: pluginConfig: BuildOverrides: configuration: apiVersion: v1 kind: BuildOverridesConfig forcePull: true 1 imageLabels: - name: distribution-scope 2 value: private nodeSelector: 3 key1: value1 key2: value2 annotations: 4 key1: value1 key2: value2 tolerations: 5 - key: mykey1 value: myvalue1 effect: NoSchedule operator: Equal - key: mykey2 value: myvalue2 effect: NoExecute operator: Equal
- 1
- ビルドの開始前に、すべてのビルドがビルダーイメージとソースイメージをプルするよう強制的に実行します。
- 2
- すべてのイメージビルドに適用される追加のラベル。ここで定義されたラベルは
BuildConfig
で定義されたラベルよりも優先されます。 - 3
- ビルド Pod は
key1=value2
およびkey2=value2
のラベルが付けられたノード上でのみ実行されます。ユーザーはキー/値のラベルを追加定義して、ビルドが実行されるノードのセットをさらに制限することができます。ただし、ノードには少なくともこれらのラベルを付ける必要があります。 - 4
- ビルド Pod にはこれらのアノテーションが追加されます。
- 5
- ビルド Pod にある既存の容認はここに一覧されている値で上書きされます。
変更を有効にするために、マスターサービスを再起動します。
# systemctl restart atomic-openshift-master-api atomic-openshift-master-controllers
第28章 Pipeline 実行の設定
28.1. 概要
ユーザーが Pipeline ビルドストラテジーを使用して初めてビルド設定を作成する際に、OpenShift Container Platform は jenkins-ephemeral
という名前のテンプレートを openshift
namespace で検索し、ユーザーのプロジェクト内でそれをインスタンス化します。OpenShift Container Platform に同梱される jenkins-ephemeral
テンプレートは、インスタンス化の実行時に以下を作成します。
- OpenShift Container Platform の公式の Jenkins イメージを使用した Jenkins のデプロイメント設定
- Jenkins デプロイメントにアクセスするためのサービスとルート
- 新規の Jenkins サービスアカウント
- サービスアカウントにプロジェクトへの編集アクセスを付与する RoleBinding
クラスター管理者は、組み込みテンプレートのコンテンツの変更、またはクラスターを異なるテンプレート場所にポイントするためのクラスター設定の編集によって作成されるものを制御できます。
デフォルトテンプレートのコンテンツを変更するには、以下を実行します。
$ oc edit template jenkins-ephemeral -n openshift
Jenkins 用に永続ストレージを使用する jenkins-persistent
テンプレートなどの異なるテンプレートを使用するには、以下をマスター設定ファイルに追加します。
jenkinsPipelineConfig: autoProvisionEnabled: true 1 templateNamespace: openshift 2 templateName: jenkins-persistent 3 serviceName: jenkins-persistent-svc 4 parameters: 5 key1: value1 key2: value2
Pipeline ビルド設定の作成時に、OpenShift Container Platform は serviceName
に一致するサービスを検索します。つまり、serviceName
はプロジェクト内で一意であるように選択される必要があります。サービスが見つからない場合、OpenShift Container Platform は jenkinsPipelineConfig
テンプレートをインスタンス化します。この方法が適さない場合 (たとえば、OpenShift Container Platform の外部にある Jenkins サーバーを使用する場合)、ユーザーのロールに応じていくつかのことを実行できます。
-
クラスター管理者の場合は、単に
autoProvisionEnabled
をfalse
に設定します。これにより、クラスター全体で自動プロビジョニングが無効にされます。 -
非特権ユーザーである場合は、OpenShift Container Platform で使用するサービスを作成する必要があります。サービス名は
jenkinsPipelineConfig
のserviceName
のクラスター設定値と一致している必要があります。デフォルト値はjenkins
です。プロジェクトの外部で Jenkins サーバーを実行しているために自動プロビジョニングを無効にしている場合は、この新規サービスを既存の Jenkins サーバーにポイントすることが推奨されます。「外部サービスの統合」を参照してください。
後者のオプションは、選択したプロジェクト内でのみ自動プロビジョニングを無効にするためにも使用できます。
28.2. OpenShift Jenkins Client プラグイン
OpenShift Jenkins Client プラグインは、OpenShift API Server との高度な対話を実現するために、読み取り可能かつ簡潔で、包括的で Fluent (流れるような) な Jenkins パイプライン構文を提供することを目的とした Jenkins プラグインです。このプラグインは、スクリプトを実行しているノードで使用できる必要がある OpenShift コマンドラインツール (oc
) を活用します。
プラグインのインストールと設定の詳細については、以下のリンクから公式ドキュメントを参照し、確認してください。
このプラグインの使用に関する情報を必要としている開発者の場合は、「OpenShift Pipeline の概要」を参照してください。
28.3. OpenShift Jenkins の同期プラグイン
この Jenkins プラグインは、OpenShift BuildConfig および Build オブジェクトと Jenkins ジョブおよびビルドとの同期を維持します。
OpenShift Jenkins 同期プラグインは以下を実行します。
- Jenkins での動的なジョブ/実行の作成。
- ImageStreams、ImageStreamTag、または ConfigMap からのスレーブ Pod テンプレートの動的作成。
- 環境変数の挿入。
- OpenShift Web コンソールでの Pipeline の可視化。
- Jenkins Git プラグインとの統合。これにより、OpenShift ビルドから Jenkins Git プラグインにコミット情報が渡されます。
このプラグインの詳細については、以下を参照してください。
第29章 ルートのタイムアウトの設定
OpenShift Container Platform のインストールとルーターのデプロイ後、Service Level Availability (SLA) で必要とされるように、低タイムアウトが必要なサービスやバックエンドでの処理速度が遅いケースで高タイムアウトが必要なサービスがある場合は、既存のルートに対してデフォルトのタイムアウトを設定することができます。
oc annotate
コマンドを使用して、ルートにタイムアウトを追加します。
# oc annotate route <route_name> \ --overwrite haproxy.router.openshift.io/timeout=<timeout><time_unit>
たとえば、myroute
という名前のルートに 2 秒のタイムアウトを設定するには以下のようにします。
# oc annotate route myroute --overwrite haproxy.router.openshift.io/timeout=2s
サポートされる時間単位は、マイクロ秒 (us)、ミリ秒 (ms)、秒 (s)、分 (m)、時間 (h)、または日 (d) です。
第30章 ネイティブのコンテナールーティングの設定
30.1. ネットワークの概要
一般的なネットワーク設定を以下に示します。
- 11.11.0.0/16 はコンテナーネットワークです。
- 11.11.x.0/24 サブネットは各ノード用に予約済みで、Docker Linux ブリッジに割り当てられています。
- 各ノードには 11.11.0.0/16 の範囲内にある (ローカルサブネットを除く) あらゆるものに到達するために使用するルーターへのルートがあります。
- ルーターには各ノードのルートがあるため、適切なノードにポイントできます。
- ネットワークトポロジーが変更されない限り、新規ノードが追加されても既存のノードを変更する必要はありません。
- IP 転送が各ノードで有効になっています。
以下の図はこのトピックで説明されているコンテナーのネットワーク設定を示しています。2 つのネットワークインターフェースカードを搭載したルーターとして機能する 1 つの Linux ノード、2 つのスイッチ、およびこれらのスイッチに接続された 3 つのノードを使用しています。
30.2. ネイティブのコンテナールーティングの設定
既存のスイッチとルーター、Linux のカーネルネットワークスタックを使用してコンテナーネットワークを設定できます。
ネットワーク管理者は、新規ノードがクラスターに追加される際に、ルーターを変更するか、ルーターを変更するスクリプトを作成する必要があります。
このプロセスを変化させて、あらゆるタイプのルーターで使用することができます。
30.3. コンテナーネットワーク用のノードのセットアップ
未使用の 11.11.x.0/24 サブネット IP アドレスをノードの Linux ブリッジに割り当てます。
# brctl addbr lbr0 # ip addr add 11.11.1.1/24 dev lbr0 # ip link set dev lbr0 up
新規ブリッジを使用するように Docker 起動スクリプトを変更します。デフォルトでは、起動スクリプトは
/etc/sysconfig/docker
ファイルです。# docker -d -b lbr0 --other-options
11.11.0.0/16 ネットワークのルーターへのルートを追加します。
# ip route add 11.11.0.0/16 via 192.168.2.2 dev p3p1
ノードで IP 転送を有効にします。
# sysctl -w net.ipv4.ip_forward=1
30.4. コンテナーネットワーク用のルーターのセットアップ
以下の手順は、複数の NIC を搭載した Linux ボックスがルーターとして使用されていることを前提としています。必要に応じて手順を変更して、特定のルーターに対応する構文を使用してください。
ルーターで IP 転送を有効にします。
# sysctl -w net.ipv4.ip_forward=1
クラスターに追加された各ノードのルートを追加します。
# ip route add <node_subnet> via <node_ip_address> dev <interface through which node is L2 accessible> # ip route add 11.11.1.0/24 via 192.168.2.1 dev p3p1 # ip route add 11.11.2.0/24 via 192.168.3.3 dev p3p2 # ip route add 11.11.3.0/24 via 192.168.3.4 dev p3p2
第31章 エッジロードバランサーからのルーティング
31.1. 概要
OpenShift Container Platform クラスター内の Pod は、クラスターネットワーク上の IP アドレスを介してのみ到達可能です。エッジロードバランサーを使用することで、ネットワーク外部からのトラフィックを受け取り、OpenShift Container Platform クラスター内の Pod にトラフィックをプロキシーすることができます。ロードバランサーがクラスターネットワークに含まれていない場合は、内部クラスターネットワークがエッジロードバランサーからアクセスできないため、ルーティングが困難になります。
OpenShift Container Platform クラスターがクラスターネットワークソリューションとして OpenShift Container Platform SDN を使用している場合にこの問題を解決するには、Pod へのネットワークアクセスを以下の 2 つの方法で確保することができます。
31.2. ロードバランサーの SDN への追加
可能な場合は、ネットワークプラグインとして OpenShift SDN を使用するロードバランサー自体で OpenShift Container Platform ノードインスタンスを実行します。これにより、エッジマシンは独自の Open vSwitch ブリッジを取得し、このブリッジは、クラスターにある Pod とノードへのアクセスを提供するために SDN によって自動的に設定されます。ルーティングテーブル は、Pod が作成および削除される際に SDN によって動的に設定されるため、ルーティングソフトウェアは Pod に到達することができます。
Pod がロードバランサー自体に設定されないように、ロードバランサーマシンに スケジュール対象外ノードというマークを付けます。
$ oc adm manage-node <load_balancer_hostname> --schedulable=false
ロードバランサーがコンテナーとしてパッケージ化されている場合は、OpenShift Container Platform との統合が簡単になります。ロードバランサーをホストポートが公開されている状態の Pod として実行します。OpenShift Container Platform で事前にパッケージ化された HAProxy ルーターはこの方法で実行されます。
31.3. Ramp ノードを使用したトンネルの確立
前述のソリューションを使用できない場合もあります。たとえば、F5® は互換性のないカスタム Linux カーネルとディストリビューションを使用するため、F5 BIG-IP® ホストは OpenShift Container Platform ノードインスタンスまたは OpenShift Container Platform SDN を実行できません。
代わりに、F5 BIG-IP® を有効にして Pod に到達できるようにするために、クラスターネットワーク内の既存のノードを Ramp ノード として選択し、F5 BIG-IP® ホストと指定された Ramp ノード間でトンネルを確立することができます。Ramp ノードは通常の OpenShift Container Platform ノードであるため、Ramp ノードには、トラフィックをクラスターネットワーク内のノードにある Pod にルーティングするための設定が必要になります。そのため、Ramp ノードは F5 BIG-IP® ホストがクラスターネットワーク全体にアクセスする際に使用するゲートウェイのロールを引き継ぎます。
以下は、F5 BIG-IP® ホストと指定された Ramp ノード間で ipip トンネルを確立する例です。
On the F5 BIG-IP® host:
以下の変数を設定します。
# F5_IP=10.3.89.66 1 # RAMP_IP=10.3.89.89 2 # TUNNEL_IP1=10.3.91.216 3 # CLUSTER_NETWORK=10.128.0.0/14 4
古い route、self、tunnel および SNAT pool を削除します。
# tmsh delete net route $CLUSTER_NETWORK || true # tmsh delete net self SDN || true # tmsh delete net tunnels tunnel SDN || true # tmsh delete ltm snatpool SDN_snatpool || true
新規の tunnel、self、route および SNAT pool を作成し、この SNAT pool を仮想サーバーで使用します。
# tmsh create net tunnels tunnel SDN \ \{ description "OpenShift SDN" local-address \ $F5_IP profile ipip remote-address $RAMP_IP \} # tmsh create net self SDN \{ address \ ${TUNNEL_IP1}/24 allow-service all vlan SDN \} # tmsh create net route $CLUSTER_NETWORK interface SDN # tmsh create ltm snatpool SDN_snatpool members add { $TUNNEL_IP1 } # tmsh modify ltm virtual ose-vserver source-address-translation { type snat pool SDN_snatpool } # tmsh modify ltm virtual https-ose-vserver source-address-translation { type snat pool SDN_snatpool }
Ramp ノード:
以下で、永続性のない設定が作成されます。つまり、ramp ノードまたは openvswitch サービスを再起動すると、この設定はなくなります。
以下の変数を設定します。
# F5_IP=10.3.89.66 # TUNNEL_IP1=10.3.91.216 # TUNNEL_IP2=10.3.91.217 1 # CLUSTER_NETWORK=10.128.0.0/14 2
古いトンネルを削除します。
# ip tunnel del tun1 || true
適切な L2 接続インターフェース (たとえば、eth0) を使用して、Ramp ノードで ipip トンネルを作成します。
# ip tunnel add tun1 mode ipip \ remote $F5_IP dev eth0 # ip addr add $TUNNEL_IP2 dev tun1 # ip link set tun1 up # ip route add $TUNNEL_IP1 dev tun1 # ping -c 5 $TUNNEL_IP1
SDN サブネットの未使用の IP を使用してトンネル IP を SNAT します。
# source /run/openshift-sdn/config.env # tap1=$(ip -o -4 addr list tun0 | awk '{print $4}' | cut -d/ -f1 | head -n 1) # subaddr=$(echo ${OPENSHIFT_SDN_TAP1_ADDR:-"$tap1"} | cut -d "." -f 1,2,3) # export RAMP_SDN_IP=${subaddr}.254
この
RAMP_SDN_IP
を追加のアドレスとして tun0 (ローカル SDN のゲートウェイ) に割り当てます。# ip addr add ${RAMP_SDN_IP} dev tun0
SNAT の OVS ルールを変更します。
# ipflowopts="cookie=0x999,ip" # arpflowopts="cookie=0x999, table=0, arp" # # ovs-ofctl -O OpenFlow13 add-flow br0 \ "${ipflowopts},nw_src=${TUNNEL_IP1},actions=mod_nw_src:${RAMP_SDN_IP},resubmit(,0)" # ovs-ofctl -O OpenFlow13 add-flow br0 \ "${ipflowopts},nw_dst=${RAMP_SDN_IP},actions=mod_nw_dst:${TUNNEL_IP1},resubmit(,0)" # ovs-ofctl -O OpenFlow13 add-flow br0 \ "${arpflowopts}, arp_tpa=${RAMP_SDN_IP}, actions=output:2" # ovs-ofctl -O OpenFlow13 add-flow br0 \ "${arpflowopts}, priority=200, in_port=2, arp_spa=${RAMP_SDN_IP}, arp_tpa=${CLUSTER_NETWORK}, actions=goto_table:30" # ovs-ofctl -O OpenFlow13 add-flow br0 \ "arp, table=5, priority=300, arp_tpa=${RAMP_SDN_IP}, actions=output:2" # ovs-ofctl -O OpenFlow13 add-flow br0 \ "ip,table=5,priority=300,nw_dst=${RAMP_SDN_IP},actions=output:2" # ovs-ofctl -O OpenFlow13 add-flow br0 "${ipflowopts},nw_dst=${TUNNEL_IP1},actions=output:2"
高可用性を実現するように Ramp ノードを設定する予定がない場合は、必要に応じて、Ramp ノードをスケジュール対象外としてマークします。以下のセクションに従う予定や、高可用性を備えた Ramp ノードを作成する予定がある場合は、この手順を省略してください。
$ oc adm manage-node <ramp_node_hostname> --schedulable=false
F5 ルータープラグインは F5 BIG-IP® と統合します。
31.3.1. 高可用性を備えた Ramp ノードの設定
keepalived を内部で使用する OpenShift Container Platform の ipfailover 機能を使用することで、F5 BIG-IP® の観点から Ramp ノードの高可用性を確保することができます。これを実行するには、まず同じ L2 サブネット上の 2 つのノード (たとえば、ramp-node-1 および ramp-node-2) を起動します。
次に、仮想 IP ( VIP) を使用するために未割り当ての IP アドレスを同じサブネット内から選択します。この IP アドレスは、F5 BIG-IP® でトンネルを設定するときに使用する RAMP_IP
変数として設定されます。
たとえば、Ramp ノードに対して使用するサブネットは 10.20.30.0/24 とし、10.20.30.2 を ramp-node-1 に、10.20.30.3 を ramp-node-2 に割り当てているとします。VIP については、同じ 10.20.30.0/24 サブネットから未割り当てのアドレスを選択します (例: 10.20.30.4)。次に、ipfailover を設定するために、両方のノードに f5rampnode などのラベルでマークを付けします。
$ oc label node ramp-node-1 f5rampnode=true $ oc label node ramp-node-2 f5rampnode=true
ipfailover ドキュメントで説明されているのと同様に、ここでサービスアカウントを作成し、そのアカウントを特権付き SCC に追加する必要があります。最初に、f5ipfailover サービスアカウントを作成します。
$ oc create serviceaccount f5ipfailover -n default
次に、f5ipfailover サービスを特権付き SCC に追加できます。default namespace の f5ipfailover を特権付き SCC に追加するには、以下を実行します。
$ oc adm policy add-scc-to-user privileged system:serviceaccount:default:f5ipfailover
最後に、選択した VIP (RAMP_IP
変数) と f5ipfailover サービスアカウントを使用して、先に設定した f5rampnode ラベルを使用して VIP を 2 つのノードに割り当て、ipfailover を設定します。
# RAMP_IP=10.20.30.4
# IFNAME=eth0 1
# oc adm ipfailover <name-tag> \
--virtual-ips=$RAMP_IP \
--interface=$IFNAME \
--watch-port=0 \
--replicas=2 \
--service-account=f5ipfailover \
--selector='f5rampnode=true'
- 1
RAMP_IP
を設定する必要があるインターフェース。
上記の設定を行うと、現在 VIP が割り当てられている Ramp ノードホストで障害が発生した場合に VIP (RAMP_IP
変数) が自動的に再割り当てされます。
第32章 コンテナーログの集計
32.1. 概要
OpenShift Container Platform のクラスター管理者として、EFK スタックをデプロイして各種の OpenShift Container Platform サービスのログを集計できます。アプリケーション開発者は、表示アクセス権を持つプロジェクトのログを表示することができます。EFK スタックは、複数のコンテナーまたは削除された Pod からのものであっても、ホストとアプリケーションからログを集計します。
EFK スタックは ELK スタックの変更バージョンであり、以下で構成されています。
- Elasticsearch (ES): すべてのログが格納されるオブジェクトストア。
- Fluentd: ノードからログを収集し、そのログを Elasticsearch に送ります。
- Kibana: Elasticsearch の Web UI。
クラスターにデプロイされると、スタックはすべてのノードおよびプロジェクトのログを Elasticsearch に集計し、ログを表示するために Kibana UI を提供します。クラスター管理者はすべてのログを表示できますが、アプリケーション開発者は表示権限を持つプロジェクトのログのみを表示できます。スタックのコンポーネントは安全な通信を実行します。
「Docker コンテナーログの管理」では、コンテナーログを管理し、ノードディスクが満杯になることを阻止するための json-file
ロギングドライバーオプションの使用について説明しています。
32.2. デプロイ前の設定
- Ansible Playbook は集計されたロギングをデプロイおよびアップグレードするために利用できます。通常インストール (Advanced installation)と設定 のセクションに精通しておくようにしてください。このセクションでは、Ansible を使用する準備に必要な情報と設定に関する情報を提供します。EFK スタックの各種の領域を設定するために、パラメーターが Ansible インベントリーファイルに追加されています。
- サイジングのガイドラインを確認して、デプロイメントの最適な設定方法を判断してください。
- クラスターのルーターをデプロイしていることを確認します。
- Elasticsearch に必要なストレージがあることを確認します。各 Elasticsearch レプリカに独自のストレージボリュームが必要であることに注意してください。詳細については、「Elasticsearch 」を参照してください。
プロジェクトを選択します。デプロイされたら、EFK スタックは OpenShift Container Platform クラスター内のすべてのプロジェクトのログを収集します。このセクションの例では、デフォルトのプロジェクトロギング を使用しています。プロジェクトがまだ存在していない場合は、Ansible Playbook によってプロジェクトが作成されます。プロジェクトに対してノードセレクターを指定する場合にのみ、プロジェクトを作成する必要があります。そうしない場合は、
openshift-logging
ロールによってプロジェクトが作成されます。$ oc adm new-project logging --node-selector="" $ oc project logging
注記Fluentd はクラスター全体にデプロイする必要があり、セレクターによって Fluentd がデプロイされる場所が制限されるため、プロジェクトには空のノードセレクターを指定することをお勧めします。コンポーネントの配置を制御するには、コンポーネントごとにノードセレクターを指定して、デプロイメント設定に適用する必要があります。
32.3. ロギング Ansible 変数の指定
EFK デプロイメントのパラメーターをインベントリーホストファイルに指定して、デフォルトを上書きすることができます。パラメーターを選択する前に、「Elasticsearch」と「Fluentd」のセクションを参照してください。
デフォルトでは、Elasticsearch サービスはクラスターのノード間での TCP 通信にポート 9300 を使用します。
パラメーター | 説明 |
---|---|
|
ロギングコンポーネントイメージのプレフィックス。たとえば、プレフィックスを registry.access.redhat.com/openshift3/ に設定すると registry.access.redhat.com/openshift3/logging-fluentd:latest が作成されます。 |
|
ロギングコンポーネントイメージのバージョン。たとえば、バージョンを v3.9 に設定すると registry.access.redhat.com/openshift3/logging-fluentd:v3.9 が作成されます。 |
|
|
|
Kubernetes マスターの URL。これは公開されている必要はありませんが、クラスター内からアクセスできる必要があります (例: https://<PRIVATE-MASTER-URL>:8443)。 |
|
Kubernetes マスターの公開された URL。これは、Kibana プロキシーによる認証のリダイレクトに使用されます (例: https://<CONSOLE-PUBLIC-URL-MASTER>:8443)。 |
|
集計されたロギングがデプロイされる namespace。 |
|
ロギングをインストールする場合は |
|
通常のアンインストールでは、再インストール中の予期せぬデータ損失を防ぐために PVC が維持されます。Ansible Playbook が完全かつ不可逆的にすべてのロギング永続データ (PVC を含む) を確実に削除するようにするには、 |
|
|
|
イベントルーターのロギングイメージのプレフィックス。デフォルトでは |
|
ロギングイベントルーターのイメージバージョン。デフォルトでは 'openshift_logging_image_version' に設定されています。 |
|
イベントルーターのシンク (受信側) を選択します。 |
|
Pod が到達するノードを選択するためのラベルのマップ ( |
|
デフォルトでは '1' に設定されます。 |
|
イベントルーターに割り当てる最小 CPU 量。デフォルトでは '100m' に設定されます。 |
|
イベントルーター Pod のメモリー制限。デフォルトでは '128Mi' に設定されます。 |
|
eventrouter がデプロイされる project。デフォルトでは 'default' に設定されます。 重要
プロジェクトを |
|
認証済みレジストリーからコンポーネントイメージをプルするために使用される既存のプルシークレットの名前を指定します。 |
|
ログレコードを削除するために Curator が使用するデフォルトの最小期間 (日単位)。 |
|
Curator が実行される時刻 (時間)。 |
|
Curator が実行される時刻 (分)。 |
|
実行時間を割り出すために Curator が使用するタイムゾーン。タイムゾーンは、 |
|
Curator のスクリプトログレベル。 |
|
Curator プロセスのログレベル。 |
|
Curator に割り当てる CPU 量。 |
|
Curator に割り当てるメモリー量。 |
|
Curator インスタンスをデプロイできるターゲットのノードを指定するノードセレクター。 |
|
|
|
|
|
Kibana に到達する Web クライアントの外部ホスト名。 |
|
Kibana に割り当てる CPU 量。 |
|
Kibana に割り当てるメモリー量。 |
|
|
|
Kibana プロキシーに割り当てる CPU 量。 |
|
Kibana プロキシーに割り当てるメモリー量。 |
|
Kibana を拡張して達成するレプリカ数。 |
|
Kibana インスタンスをデプロイできるターゲットのノードを指定するノードセレクター。 |
|
{"ELASTICSEARCH_REQUESTTIMEOUT":"30000"} など、Kibana デプロイメント設定に追加する環境変数のマッピング。 |
|
Kibana ルートの作成時に使用する公開されているキー。 |
|
Kibana ルートの作成時にキーに一致する証明書。 |
|
オプション。キーに添付する CA と、Kibana ルートの作成時に使用される証明書。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ルートと TLS サーバーの証明書に使用する外部向けホスト名。デフォルトでは
たとえば、 |
|
Elasticsearch が外部 TLS サーバー証明書に使用する証明書の場所。デフォルトは、生成される証明書になります。 |
|
Elasticsearch が外部 TLS サーバー証明書に使用するキーの場所。デフォルトは、生成されるキーになります。 |
|
Elasticsearch が外部 TLS サーバーに使用する CA 証明書の場所。デフォルトは内部 CA です。 |
|
|
|
ルートと TLS サーバー証明書に使用する外部向けホスト名。デフォルトでは
たとえば、 |
|
Elasticsearch が外部 TLS サーバー証明書に使用する証明書の場所。デフォルトは、生成される証明書になります。 |
|
Elasticsearch が外部 TLS サーバー証明書に使用するキーの場所。デフォルトは、生成されるキーになります。 |
|
Elasticsearch が外部 TLS サーバーに使用する CA 証明書の場所。デフォルトは内部 CA です。 |
|
Fluentd インスタンスをデプロイできるターゲットのノードを指定するノードセレクター。Fluentd を実行する必要があるノード (通常はすべて) には、Fluentd が実行およびログ収集できるようになる前に、このラベルを付ける必要があります。
インストール後に Aggregated Logging クラスターを拡張する際に、 インストールの一環として、Fluentd ノードセレクターのラベルを永続化されたノードラベルの一覧に追加することをお勧めします。 |
|
Fluentd Pod の CPU 上限。 |
|
Fluentd Pod のメモリー上限。 |
|
最初の起動時に Fluentd がジャーナルの先頭から読み取る必要がある場合は、 |
|
Fluentd をデプロイするためにラベルを付ける必要があるノードの一覧。デフォルトでは、全ノードに ['--all'] のラベルを付けます。null 値は |
|
|
|
監査ログファイルの場所。デフォルトは |
|
監査ログファイルの Fluentd |
|
Fluentd がログを送信する必要がある ES サービスの名前。 |
|
Fluentd がログを送信する必要がある ES サービスのポート。 |
|
Fluentd が |
|
Fluentd が |
|
Fluentd が |
|
デプロイする Elasticsearch レプリカ。冗長性を実現するには 3 つ以上のレプリカが必要です。 |
|
ES クラスターの CPU 量の上限。 |
|
Elasticsearch インスタンスごとに予約する RAM 容量。512 M 以上である必要があります。使用可能なサフィックスは G、g、M、m です。 |
|
すべての新規インデックスのプライマリーシャードごとのレプリカシャード数。デフォルトは '0' に設定されています。実稼働環境のクラスターに対しては、 |
|
ES で作成される新規インデックスごとのプライマリシャード数。デフォルトは '1' に設定されます。 |
|
特定の PV を選択するために PVC に追加されるキー/値のマップ。 |
|
バッキングストレージを動的にプロビジョニングするには、パラメーターの値を |
|
デフォルト以外のストレージクラスを使用するには、 |
|
Elasticsearch インスタンスごとに作成する Persistent Volume Claim (永続ボリューム要求) のサイズ (例: 100 G)。省略する場合は、PVC が作成されず、代わりに一時ボリュームが使用されます。 |
|
Elasticsearch インスタンスのストレージとして使用される Persistent Volume Claim (永続ボリューム要求) の名前のプレフィックス。logging-es-1 のように、インスタンスごとに数字が付加されます。まだ存在していない場合は、サイズ
|
|
リカバリーを試みる前に ES が待機する時間。 |
|
Elasticsearch ストレージボリュームにアクセスするための補助グループ ID の数。バッキングボリュームはこのグループ ID によるアクセスを許可する必要があります。 |
|
Elasticsearch インスタンスをデプロイできるターゲットのノードを判断するマップとして指定されているノードセレクター。このノードセレクターは、Elasticsearch インスタンスの実行用に予約または最適化されているノードにこれらのインスタンスを配置するために使用することができます。たとえば、セレクターは |
|
cluster-reader ロールに操作ログの読み取りが許可されている場合は |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Elasticsearch インスタンスをデプロイできるターゲットのノードを指定するノードセレクター。このノードセレクターは、Elasticsearch インスタンスの実行用に予約または最適化されているノード上にこれらのインスタンスを配置するために使用できます。たとえば、セレクターは |
|
デフォルト値
値 |
|
Kibana インスタンスをデプロイできるターゲットのノードを指定するノードセレクター。 |
|
Curator インスタンスをデプロイできるターゲットのノードを指定するノードセレクター。 |
カスタム証明書
デプロイメントプロセスで生成されるものを利用する代わりに、以下のインベントリー変数を使用してカスタム証明書を指定できます。カスタム証明書は、ユーザーのブラウザーと Kibana 間の通信を暗号化し、保護するために使用されます。これらが指定されない場合は、セキュリティー関連のファイルが生成されます。
ファイル名 | 説明 |
---|---|
|
Kibana サーバーのブラウザー向けの証明書。 |
|
ブラウザー向けの Kibana 証明書で使用されるキー。 |
|
ブラウザー向けの Kibana 証明書用に使用される CA ファイルへの制御ノード上の絶対パス。 |
|
Ops Kibana サーバーのブラウザー向け証明書。 |
|
ブラウザー向けの Ops Kibana 証明書で使用されるキー。 |
|
ブラウザー向けの Ops Kibana 証明書用に使用される CA ファイルへの制御ノード上の絶対パス。 |
32.4. EFK スタックのデプロイ
EFK スタックは Ansible Playbook を使用して EFK コンポーネントにデプロイされます。デフォルトのインベントリーファイルを使用して、デフォルトの OpenShift Ansible の場所から Playbook を実行します。
$ ansible-playbook [-i </path/to/inventory>] \ /usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml
Playbook を実行すると、スタックをサポートするために必要なすべてのリソース (シークレット、ServiceAccount、DeploymentConfig など) がデプロイされます。Playbook はスタックが実行されるまでコンポーネント Pod のデプロイを待機します。待機手順が失敗しても、デプロイメントは成功する可能性があります。つまり、レジストリーからコンポーネントイメージを取得できる場合があります。これには数分の時間がかかる可能性があります。以下を使用してプロセスを確認できます。
$ oc get pods -w
最終的に Pod のステータスは Running になります。関連イベントの取得によるデプロイメント時の Pod のステータスを確認するには、以下を実行します。
$ oc describe pods/<pod_name>
Pod の実行に失敗したら、ログを確認してください。
$ oc logs -f <pod_name>
32.5. デプロイメントの概要と調整
このセクションでは、デプロイされたコンポーネントに対して行うことができる調整について説明します。
32.5.1. Ops クラスター
default、openshift、および openshift-infra プロジェクトのログが自動的に集計され、Kibana インターフェースで .operations 項目にグループ化されます。
EFK スタックをデプロイしたプロジェクト (ここでは logging) は .operations に集計 されず、その ID の下に表示されます。
インベントリーファイルで openshift_logging_use_ops
を true に設定した場合、Fluentd はメインの Elasticsearch クラスターと操作ログ用に予約された別のクラスター間でログを分割するように設定されます。この操作ログはノードシステムログおよびプロジェクト default、openshift、openshift-infra として定義されています。したがって、操作ログのインデックス化、アクセス、管理を行うために個別の Elasticsearch クラスター、個別の Kibana、および個別の Curator がデプロイされます。これらのデプロイメントは、-ops
を含む名前によって区別されます。このオプションを有効にする場合は、これらの個別のデプロイメントに留意してください。-ops
が含まれるという名前の変更はありますが、以下の説明の大部分が操作クラスターにも適用されます (存在する場合)。
32.5.2. Elasticsearch
高可用性環境には、それぞれが別のホスト上にある Elasticsearch のレプリカが少なくとも 3 つ必要です。Elasticsearch レプリカには各自のストレージが必要ですが、OpenShift Container Platform のデプロイメント設定ではすべての Pod 間でストレージボリュームを共有します。そのため、拡張時には、EFK デプロイヤーによって Elasticsearch の各レプリカに各自のデプロイメント設定が行われます。
インベントリーファイルで openshift_logging_es_cluster_size
を変更し、ロギング Playbook を再実行することで、作成後にクラスターを拡張することができます。追加のクラスタリングパラメーターは変更可能で、「 ロギング Ansible 変数の指定」で説明されています。
以下に示すようにストレージおよびネットワークの場所を選択する際の留意事項については、Elastic のドキュメントを参照してください。
すべての Elasticsearch デプロイメントの表示
現在の Elasticsearch デプロイメントをすべて表示するには、以下を実行します。
$ oc get dc --selector logging-infra=elasticsearch
ノードセレクター
Elasticsearch は大量のリソースを使用する可能性があるため、クラスターのすべてのメンバーでは、メンバー同士およびリモートストレージとのネットワーク接続の待機時間を短く設定する必要があります。待機時間を短く設定するには、ノードセレクターを使用してインスタンスを専用ノード、つまりクラスター内の専用リージョンに指定します。
ノードセレクターを設定するには、インベントリーファイルで openshift_logging_es_nodeselector
設定オプションを指定します。これはすべての Elasticsearch デプロイメントに適用されます。そのため、ノードセレクターを個別化する必要がある場合は、デプロイメント後に各デプロイメント設定を手動で編集する必要があります。ノードセレクターは Python と互換性のある dict (辞書) として指定されます。たとえば、{"node-type":"infra", "region":"east"}
のようになります。
永続的な Elasticsearch ストレージ
デフォルトでは、openshift_logging
Ansible ロールは Pod のすべてのデータが再起動時に消失する一時デプロイメントを作成します。実稼働環境での使用では、Elasticsearch デプロイメント設定ごとに永続ストレージボリュームを指定します。デプロイ前に必要な Persistent Volume Claim (永続ボリューム要求) を作成するか、またはそれらを独自に作成されるようにできます。PVC には openshift_logging_es_pvc_prefix
設定 (デフォルトでは logging-es-
) と一致する名前を付ける必要があります。各 PVC 名には連番が追加され、logging-es-1
、logging-es-2
などのようになります。デプロイメントに必要な PVC がすでに存在する場合は、その PVC が使用されます。PVC が存在せず、openshift_logging_es_pvc_size
が指定されている場合は、そのサイズ要求を使用して PVC が作成されます。
Lucene は NFS でサポートされていないファイルシステムの動作に依存するため、NFS ストレージをボリュームまたは永続ボリュームとして (または Gluster などの NAS を介して) 使用することは Elasticsearch ストレージではサポートされません。その場合、データ破損やその他の問題が発生する可能性があります。NFS ストレージが要件である場合は、大規模なファイルをボリュームに配置してストレージデバイスとして使用し、1 つのホスト上でそれをローカルにマウントすることができます。たとえば、NFS ストレージボリュームが /nfs/storage にマウントされている場合は、以下のようになります。
$ truncate -s 1T /nfs/storage/elasticsearch-1 $ mkfs.xfs /nfs/storage/elasticsearch-1 $ mount -o loop /nfs/storage/elasticsearch-1 /usr/local/es-storage $ chown 1000:1000 /usr/local/es-storage
次に、以下で説明するように /usr/local/es-storage をホストマウントとして使用します。異なるバッキングファイルをそれぞれの Elasticsearch レプリカのストレージとして使用します。
このループバックはノード上で、OpenShift Container Platform の外部から手動で保守する必要があります。コンテナー内から保守することはできません。
各ノードホスト上のローカルディスクボリューム (利用可能な場合) を Elasticsearch レプリカのストレージとして使用することができます。これを実行するには、以下のような準備が必要です。
関連するサービスアカウントに、ローカルボリュームをマウントし、編集する権限を指定する必要があります。
$ oc adm policy add-scc-to-user privileged \ system:serviceaccount:logging:aggregated-logging-elasticsearch 1
- 1
- ロギング Playbook を実行する際に、以前に作成したプロジェクトを使用します (例: logging)。
それぞれの Elasticsearch レプリカの定義にパッチを適用し、その権限を要求する必要があります。以下に例を示します (Ops クラスターの場合は
--selector component=es-ops
に変更)。$ for dc in $(oc get deploymentconfig --selector component=es -o name); do oc scale $dc --replicas=0 oc patch $dc \ -p '{"spec":{"template":{"spec":{"containers":[{"name":"elasticsearch","securityContext":{"privileged": true}}]}}}}' done
Elasticsearch レプリカは、ローカルストレージを使用するために適切なノード上に配置する必要があります。また、適切なノードが一定期間ダウンしている場合であっても、移動させてはなりません。この場合は、管理者がストレージを割り当てたノードに対して一意のノードセレクターを各 Elasticsearch レプリカに提供する必要があります。ノードセレクターを設定するには、各 Elasticsearch デプロイメント設定を編集し、nodeSelector セクションを追加または編集して、必要な各ノードに対して適用した一意のラベルを指定します。
apiVersion: v1 kind: DeploymentConfig spec: template: spec: nodeSelector: logging-es-node: "1" 1
- 1
- このラベル (この場合は
logging-es-node=1
) が付与されている単一のノードを持つレプリカを、ラベルによって一意に識別する必要があります。oc label
コマンドを使用して、必要に応じてノードにラベルを適用してください。
代わりに
oc patch
コマンドを使用して、ノードセレクターの適用を自動化することもできます。$ oc patch dc/logging-es-<suffix> \ -p '{"spec":{"template":{"spec":{"nodeSelector":{"logging-es-node":"1"}}}}}'
これらの手順を実行すると、この例 (ストレージが各ノードの同じパスにマウントされていることを前提とします) のように、ローカルホストのマウントを各レプリカに適用できます (Ops クラスターの場合は
--selector component=es-ops
に変更します)。$ for dc in $(oc get deploymentconfig --selector component=es -o name); do oc set volume $dc \ --add --overwrite --name=elasticsearch-storage \ --type=hostPath --path=/usr/local/es-storage oc rollout latest $dc oc scale $dc --replicas=1 done
Elasticsearch のスケールの変更
クラスターで使用される Elasticsearch インスタンスの数を増やす必要がある場合、このタスクは永続ボリュームの特性や、データの保存やクラスターのリカバリーに関する Elasticsearch の設定方法により、Elasticsearch デプロイメント設定の拡張ほど簡単に実行できません。また、拡張時には各 Elasticsearch クラスターノードのデプロイメント設定を作成する必要があります。
Elasticsearch のスケールを変更する最も簡単な方法は、前述のようにインベントリーホストファイルを変更し、ロギング Playbook を再実行することです。デプロイメント用に永続ストレージが提供されていると仮定すると、この方法によって混乱が生じることはないはずです。
新しい openshift_logging_es_cluster_size
の値が、クラスターにある現在の Elasticsearch のノード数 (スケールアップした後) より大きい場合のみ、ロギング Playbook を使用して Elasticsearch クラスターのサイズを調節できます。
カスタマイズを維持する必要があるなどの理由で再インストールを希望しない場合は、デプロイヤーによって提供されるテンプレートを使用して、新規の Elasticsearch デプロイメント設定をクラスターに追加することができます。ただし、これにはより複雑な手順が必要になります。
ルートとしての Elasticsearch の公開
デフォルトでは、OpenShift の集計ロギングでデプロイされた Elasticsearch はロギングクラスターの外部からアクセスできません。データにアクセスする必要があるツールに対しては、Elasticsearch への外部アクセスのルートを有効にすることができます。
OpenShift トークンを使用して Elasticsearch にアクセスできます。また、サーバー証明書を作成する際に (Kibana と同様に)、外部の Elasticsearch および Elasticsearch Ops ホスト名を指定することができます。
re-encrypt ルートとして Elasticsearch にアクセスするには、以下の変数を定義します。
openshift_logging_es_allow_external=True openshift_logging_es_hostname=elasticsearch.example.com
以下の Ansible Playbook を実行します。
$ ansible-playbook [-i </path/to/inventory>] \ /usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml
Elasticsearch にリモートでログインするには、要求に 3 つの HTTP ヘッダーが含まれている必要があります。
Authorization: Bearer $token X-Proxy-Remote-User: $username X-Forwarded-For: $ip_address
ログにアクセスできるようになるには、プロジェクトへのアクセスが必要です。以下は例になります。
$ oc login <user1> $ oc new-project <user1project> $ oc new-app <httpd-example>
要求内で使用するこの ServiceAccount のトークンを取得する必要があります。
$ token=$(oc whoami -t)
以前に設定したトークンを使用して、公開ルート経由で Elasticsearch にアクセスできる必要があります。
$ curl -k -H "Authorization: Bearer $token" -H "X-Proxy-Remote-User: $(oc whoami)" -H "X-Forwarded-For: 127.0.0.1" https://es.example.test/project.my-project.*/_search?q=level:err | python -mjson.tool
32.5.3. Fluentd
Fluentd はノードラベルセレクターに従ってレプリカをデプロイする DeamonSet としてデプロイされます。ノードラベルセレクターはインベントリーパラメーター openshift_logging_fluentd_nodeselector
を使用して指定することができ、デフォルトは logging-infra-fluentd
です。OpenShift クラスターのインストールの一環として、Fluentd ノードセレクターを永続化されたノードラベル の一覧に追加することが推奨されます。
Fluentd は journald
をシステムログソースとして使用します。これらは、オペレーティングシステム、コンテナーランタイム、および OpenShift からのログメッセージです。
OpenShift Container Platform 3.9 のクリーンインストールではデフォルトのログドライバーとして json-file
を使用します。ただし、OpenShift Container Platform 3.7 からアップグレードされた環境では既存の journald
ログドライバーの設定が維持されます。json-file
ログドライバーを使用することが推奨されます。既存のログドライバー設定を json-file
に変更する手順については、「集計されたロギングドライバーの変更」を参照してください。
外部ログアグリゲーターにログを送信するための Fluentd の設定
secure-forward
プラグインを使用して、デフォルトの Elasticsearch ではなく外部のログアグリゲーターにログのコピーを送信するように Fluentd を設定することができます。ここから、ローカルでホストされている Fluentd によるログレコードの処理後に、さらなるログの処理が可能です。
ロギングデプロイメントでは、外部アグリゲーターを設定するための secure-forward.conf
セクションが Fluentd configmap に用意されています。
<store> @type secure_forward self_hostname pod-${HOSTNAME} shared_key thisisasharedkey secure yes enable_strict_verification yes ca_cert_path /etc/fluent/keys/your_ca_cert ca_private_key_path /etc/fluent/keys/your_private_key ca_private_key_passphrase passphrase <server> host ose1.example.com port 24284 </server> <server> host ose2.example.com port 24284 standby </server> <server> host ose3.example.com port 24284 standby </server> </store>
oc edit
コマンドを使用して更新できます。
$ oc edit configmap/logging-fluentd
secure-forward.conf
で使用される証明書を Fluentd Pod にマウントされる既存のシークレットに追加することができます。your_ca_cert
と your_private_key
の値は configmap/logging-fluentd
の secure-forward.conf
で指定されている値と一致している必要があります。
$ oc patch secrets/logging-fluentd --type=json \ --patch "[{'op':'add','path':'/data/your_ca_cert','value':'$(base64 /path/to/your_ca_cert.pem)'}]" $ oc patch secrets/logging-fluentd --type=json \ --patch "[{'op':'add','path':'/data/your_private_key','value':'$(base64 /path/to/your_private_key.pem)'}]"
your_private_key
は、汎用名に置き換えます。これは、JSON パスへのリンクで、お使いのホストシステムのパスではありません。
外部アグリゲーターを設定する際は、Fluentd からのメッセージを安全に受信できる必要があります。
外部アグリゲーターが別の Fluentd サーバーである場合、fluent-plugin-secure-forward
プラグインがインストールされていて、それによって提供される入力プラグインを使用する必要があります。
<source> @type secure_forward self_hostname ${HOSTNAME} bind 0.0.0.0 port 24284 shared_key thisisasharedkey secure yes cert_path /path/for/certificate/cert.pem private_key_path /path/for/certificate/key.pem private_key_passphrase secret_foo_bar_baz </source>
fluent-plugin-secure-forward
プラグインの設定方法に関する説明はこちらを参照してください。
Fluentd から API サーバーへの接続数の削減
mux
はテクノロジープレビュー機能です。テクノロジープレビュー機能は Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。これらの機能は、近々発表予定の製品機能をリリースに先駆けてご提供することにより、お客様は機能性をテストし、開発プロセス中にフィードバックをお寄せいただくことができます。
Red Hat のテクノロジープレビュー機能のサポートについての詳細は、https://access.redhat.com/support/offerings/techpreview/ を参照してください。
mux
は Secure Forward のリスナーサービスです。
パラメーター | 説明 |
---|---|
|
デフォルトは |
|
|
|
デフォルトは |
|
デフォルトは |
|
24284 |
|
500M |
|
1Gi |
|
デフォルトは |
|
デフォルト値は空であり、外部の |
Fluentd でのログのスロットリング
特に冗長なプロジェクトについては、管理者は処理される前の Fluentd によるログの読み取り速度を減速することができます。
スロットリングは設定されたプロジェクトのログ集計が遅れる一因になる可能性があります。Fluentd が追い付く前に Pod が削除された場合、ログエントリーが消失する可能性があります。
Systemd ジャーナルをログソースとして使用している場合、スロットリングは機能しません。スロットリングの実装は、各プロジェクトの個々のログファイルの読み取りを調整できる機能によって決まります。ジャーナルからの読み取り時に、単一のログソースしか存在せず、ログファイルは存在しないと、ファイルベースのスロットリングは利用できません。Fluentd プロセスに読み込まれるログエントリーを制限する方法はありません。
Fluentd に対して制限する必要があるプロジェクトを指示するには、デプロイメント後に ConfigMap のスロットル設定を編集します。
$ oc edit configmap/logging-fluentd
throttle-config.yaml キーの形式は、プロジェクト名と、各ノードでのログの読み取りに必要な速度が含まれる YAML ファイルです。デフォルトはノードごとに一度に 1,000 行です。以下に例を示します。
- プロジェクト
project-name: read_lines_limit: 50 second-project-name: read_lines_limit: 100
- ロギング
logging: read_lines_limit: 500 test-project: read_lines_limit: 10 .operations: read_lines_limit: 100
EFK スタックのいずれかの部分を変更する場合は (具体的には Elasticsearch または Fluentd)、まず Elasicsearch をゼロにスケールダウンして、他のノードと一致しないように Fluentd を調整する必要があります。次に、変更を行って、Elasicsearch と Fluentd のスケールを元に戻します。
Elasicsearch をゼロに調整するには、以下を実行します。
$ oc scale --replicas=0 dc/<ELASTICSEARCH_DC>
デーモンセット設定の nodeSelector がゼロに一致するように変更します。
Fluentd ノードセレクターを取得します。
$ oc get ds logging-fluentd -o yaml |grep -A 1 Selector nodeSelector: logging-infra-fluentd: "true"
oc patch
コマンドを使用して、deamonset の nodeSelector を変更します。
$ oc patch ds logging-fluentd -p '{"spec":{"template":{"spec":{"nodeSelector":{"nonexistlabel":"true"}}}}}'
Fluentd ノードセレクターを取得します。
$ oc get ds logging-fluentd -o yaml |grep -A 1 Selector nodeSelector: "nonexistlabel: "true"
Elastcsearch のサイズをゼロから元に戻します。
$ oc scale --replicas=# dc/<ELASTICSEARCH_DC>
deamonset 設定の nodeSelector を変更して logging-infra-fluentd: "true" に戻します。
oc patch
コマンドを使用して、deamonset の nodeSelector を変更します。
oc patch ds logging-fluentd -p '{"spec":{"template":{"spec":{"nodeSelector":{"logging-infra-fluentd":"true"}}}}}'
32.5.4. Kibana
OpenShift Container Platform の Web コンソールから Kibana コンソールにアクセスするには、マスター webconsole-config configmap ファイルに loggingPublicURL
パラメーターを追加し、Kibana コンソールの URL (kibana-hostname
パラメーター) を指定します。値は HTTPS URL である必要があります。
... clusterInfo: ... loggingPublicURL: "https://kibana.example.com" ...
loggingPublicURL
パラメーターを設定すると、OpenShift Container Platform Web コンソールの Browse → Pods → <pod_name> → Logs タブに View Archive ボタンが作成されます。このボタンは Kibana コンソールにリンクします。
通常通り Kiabana デプロイメントを拡張して冗長性を実現できます。
$ oc scale dc/logging-kibana --replicas=2
ロギング Playbook の複数の実行にわたってスケールを維持するには、インベントリーファイルの openshift_logging_kibana_replica_count
を必ず更新してください。
openshift_logging_kibana_hostname
変数によって指定されたサイトにアクセスすることで、ユーザーインターフェースを確認できます。
Kibana に関する詳細については、Kibana のドキュメントを参照してください。
Kibana Visualize
Kibana Visualize を使用すると、視覚化機能やダッシュボードを作成してコンテナーを監視できます。また Pod ログにより、管理者ユーザー (cluster-admin
または cluster-reader
) はデプロイメント、namespace、Pod、およびコンテナーごとにログを表示することができます。
Kibana Visualize は Elasticsearch および ES-OPS Pod 内に存在し、それらの Pod 内で実行する必要があります。ダッシュボードとその他の Kibana UI オブジェクトを読み込むには、まずはダッシュボードに追加するユーザーとして Kibana にログインしてから、ログアウトする必要があります。これにより、以下の手順で使用するユーザーごとの必要な設定が作成されます。次に、以下を実行します。
$ oc exec <$espod> -- es_load_kibana_ui_objects <user-name>
ここで、$espod
はいずれかの Elasticsearch Pod の名前です。
32.5.5. Curator
Curator を利用することで、管理者はスケジュールされた Elasticsearch のメンテナンス操作を設定し、プロジェクトごとに自動的に実行することができます。これは、設定に基づいてアクションを毎日実行するようにスケジュール設定されています。Elasticsearch クラスターごとに 1 つの Curator Pod のみを使用することが推奨されます。Curator は以下の構造を持つ YAML 設定ファイルで設定されます。
$PROJECT_NAME: $ACTION: $UNIT: $VALUE $PROJECT_NAME: $ACTION: $UNIT: $VALUE ...
利用可能なパラメーターを以下に示します。
変数名 | 説明 |
---|---|
|
プロジェクトの実際の名前 (myapp-devel など)。OpenShift Container Platform の操作ログについては、名前 |
|
実行するアクション。現在許可されているのは |
|
|
|
単位数を示す整数。 |
|
|
|
(数値) Curator ジョブを実行する時刻 (時、24 時間形式)。 |
|
(数値) Curator ジョブを実行する時刻 (分)。 |
|
(文字列) tzselect(8) または timedatectl(1) 形式での文字列。デフォルトのタイムゾーンは UTC です。 |
|
プロジェクト名に一致する正規表現の一覧。 |
|
適切にエスケープされた有効な正規表現パターン。一重引用符で囲まれています。 |
たとえば、以下のように Curator を設定します。
-
1 day
を経過した myapp-dev プロジェクトのインデックスを削除する -
1 week
を経過した myapp-qe プロジェクトのインデックスを削除する -
8 weeks
を経過したoperations ログを削除する -
31 days
を経過したその他すべてのプロジェクトのインデックスを削除する - 毎日午前 0 時に Curator ジョブを実行する
以下を使用します。
config.yaml: | myapp-dev: delete: days: 1 myapp-qe: delete: weeks: 1 .operations: delete: weeks: 8 .defaults: delete: days: 31 runhour: 0 runminute: 0 timezone: America/New_York .regex: - pattern: '^project\..+\-dev\..*$' delete: days: 15 - pattern: '^project\..+\-test\..*$' delete: days: 30
month
を操作の $UNIT
として使用する場合、Curator は今月の当日ではなく、今月の最初の日からカウントを開始します。たとえば、今日が 4 月 15 日であり、現時点で 2 カ月を経過したインデックスを削除する場合 (delete: months: 2)、Curator は 2 月 15 日より古い日付のインデックスを削除するのではなく、2 月 1 日より古いインデックスを削除します。つまり、今月の最初の日付まで遡り、次にその日付から丸 2 カ月遡ります。Curator で厳密な指定を行うための最適な方法として、日数で指定することができます (例: delete: days: 30
)。
32.5.5.1. Curator 設定の作成
openshift_logging
Ansible ロールは、Curator が設定の読み取りに使用する ConfigMap を提供します。この ConfigMap を編集するか、または置き換えることで、Curator を再設定することができます。現時点で、Ops および非 Ops 両方の Curator インスタンスを設定するために logging-curator
ConfigMap が使用されています。.operations
設定はすべてアプリケーションログ設定と同じ場所にあります。
提供された ConfigMap を編集して Curator インスタンスを設定するには、以下を実行します。
$ oc edit configmap/logging-curator
提供された ConfigMap を置換するには、以下を実行します。
$ create /path/to/mycuratorconfig.yaml $ oc create configmap logging-curator -o yaml \ --from-file=config.yaml=/path/to/mycuratorconfig.yaml | \ oc replace -f -
変更を行った後に、Curator を再デプロイします。
$ oc rollout latest dc/logging-curator $ oc rollout latest dc/logging-curator-ops
32.6. クリーンアップ
デプロイメント中に生成されたものをすべて削除します。
$ ansible-playbook [-i </path/to/inventory>] \ /usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml \ -e openshift_logging_install_logging=False
32.7. Kibana のトラブルシューティング
OpenShift Container Platform で Kibana コンソールを使用することで発生する可能性がある問題は簡単に解決できますが、この場合役に立つエラーメッセージは表示されません。OpenShift Container Platform に Kibana をデプロイする際に問題が発生した場合は、以下のトラブルシューティングセクションを確認してください。
ログインループ
Kibana コンソールの OAuth2 プロキシーはマスターホストの OAuth2 サーバーとシークレットを共有する必要があります。シークレットが両方のサーバーで同一でない場合はログインループが発生する可能性があり、Kibana のログインページに継続的にリダイレクトされます。
この問題を修正するには、現在の OAuthClient を削除し、openshift-ansible
を使用して openshift_logging
ロールを再実行します。
$ oc delete oauthclient/kibana-proxy $ ansible-playbook [-i </path/to/inventory>] \ /usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml
コンソール表示時の不明なエラー
Kibana コンソールにアクセスしようとする際に、以下のブラウザーエラーが表示される場合があります。
{"error":"invalid_request","error_description":"The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed."}
このエラーは、OAuth2 クライアントとサーバー間の不一致が原因で発生します。ログイン後にサーバーが安全にリダイレクトできるように、クライアントのリターンアドレスがホワイトリストで指定されている必要があります。
この問題を修正するには、OAuthClient エントリーを置き換えます。
$ oc delete oauthclient/kibana-proxy $ ansible-playbook [-i </path/to/inventory>] \ /usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml
問題が解決しない場合は、OAuth クライアントに一覧表示されている URL の Kibana にアクセスしていることを確認してください。この問題は、転送先ポート (標準の 443 HTTPS ポートではなく 1443 など) の URL にアクセスすることで発生する可能性があります。OAuth クライアントを編集することで、サーバーのホワイトリストを調整できます。
$ oc edit oauthclient/kibana-proxy
コンソール表示時の 503 エラー
Kibana コンソールを表示する時にプロキシーエラーが発生する場合は、2 つの問題のうちのいずれかが原因である可能性があります。
1 つ目の問題は、Kibana が Pod を認識していない可能性があります。Elasticsearch の起動が遅い場合、Kibana はそれに到達しようとしてタイムアウトする場合があります。関連サービスにエンドポイントがあるかどうか確認してください。
$ oc describe service logging-kibana Name: logging-kibana [...] Endpoints: <none>
Kibana Pod が実行中である場合、エンドポイントが一覧表示されます。実行中でない場合は、Kibana Pod とデプロイメントの状態を確認してください。デプロイメントをスケールダウンして、再び元に戻さなければならない場合があります。
考えられる 2 つ目の問題として、Kibana サービスにアクセスするためのルートがマスクされている場合に発生する可能性があります。これは、あるプロジェクトでテストデプロイメントを実行し、次に最初のデプロイメントを完全に削除することなく別のプロジェクトでデプロイした場合に発生する可能性があります。複数のルートが同じ宛先に送信される場合、デフォルトルーターは最初に作成されたルートにのみルーティングします。問題が発生するルートをチェックして、そのルートが複数の場所で定義されているかどうかを確認してください。
$ oc get route --all-namespaces --selector logging-infra=support
F-5 ロードバランサーと有効にされた X-Forwarded-For
X-Forwarded-For
が有効にされた Kibana の前に F-5 ロードバランサーの使用を試みる場合、Elasticsearch Searchguard
プラグインが Kibana からの接続を適切に受け取ることができないという問題が発生する可能性があります。
Kibana のエラーメッセージの例
Kibana: Unknown error while connecting to Elasticsearch Error: Unknown error while connecting to Elasticsearch Error: UnknownHostException[No trusted proxies]
余分なヘッダーを無視するように Searchguard を設定するには、以下の手順を実行します。
- すべての Fluentd Pod をスケールダウンします。
- Fluentd Pod の終了後に Elasticsearch をスケールダウンします。
searchguard.http.xforwardedfor.header: DUMMY
を Elasticsearch の設定セクションに追加します。$ oc edit configmap/logging-elasticsearch 1
- 1
- この方法では、Elasticsearch の設定が ConfigMap に含まれている必要があります。
- Elasticsearch を拡張して元に戻します。
- すべての Fluentd Pod を拡張します。
32.8. 外部 Elasticsearch インスタンスへのログの送信
Fluentd は、Elasticsearch デプロイメント設定の ES_HOST
、ES_PORT
、OPS_HOST
、および OPS_PORT
環境変数の値にログを送信します。アプリケーションログは ES_HOST
の宛先に、操作ログは OPS_HOST
の宛先に送信されます。
AWS Elasticsearch インスタンスへのログの直接送信はサポートされていません。Fluentd Secure Forward を使用して、fluent-plugin-aws-elasticsearch-service
プラグインで設定した制御対象の Fluentd のインスタンスにログを送信してください。
ログを特定の Elasticsearch インスタンスに送信するには、デプロイメント設定を編集して、上記の変数の値を必要なインスタンスに置き換えます。
$ oc edit dc/<deployment_configuration>
外部 Elasticsearch インスタンスにアプリケーションログと操作ログの両方を含めるには、ES_HOST
と OPS_HOST
を同じ宛先に設定して、ES_PORT
と OPS_PORT
にも同一の値があるようにします。
外部でホストされている Elasticsearch インスタンスが TLS を使用していない場合、_CLIENT_CERT
、_CLIENT_KEY
、_CA
変数を空になるように更新します。TLS を使用していてもそれが Mutual TLS ではない場合は、_CLIENT_CERT
と _CLIENT_KEY
変数を空になるように更新し、logging-fluentd シークレットについて、Elasticsearch インスタンスと通信するための適切な _CA
値でパッチを適用するか再作成します。指定された Elasticsearch インスタンスと同様に Mutual TLS を使用している場合、logging-fluentd シークレットについて、クライアントキー、クライアント証明書、CA を使ってパッチを適用するか再作成します。
指定された Kibana と Elasticsearch イメージを使用していない場合、同じマルチテナント機能は利用できず、データは特定のプロジェクトへのユーザーアクセスによる制限を受けません。
32.9. 外部 syslog サーバーへのログの送信
fluent-plugin-remote-syslog
プラグインをホストで使用して、ログを外部 syslog サーバーに送信します。
環境変数を logging-fluentd
または logging-mux
デプロイメント設定で設定します。
- name: REMOTE_SYSLOG_HOST 1
value: host1
- name: REMOTE_SYSLOG_HOST_BACKUP
value: host2
- name: REMOTE_SYSLOG_PORT_BACKUP
value: 5555
- 1
- 必要なリモート syslog ホスト。各ホストで必須です。
これによって 2 つの宛先が作成されます。host1
の syslog サーバーはデフォルトポート 514
でメッセージを受信し、host2
は同じメッセージをポート 5555
で受信します。
または、独自のカスタム fluent.conf を logging-fluentd
または logging-mux
ConfigMap に設定できます。
Fluentd 環境変数
パラメーター | 説明 |
---|---|
|
デフォルトは |
|
(必須) リモート syslog サーバーのホスト名または IP アドレス。 |
|
接続先のポート番号。デフォルトは |
|
syslog の重大度を設定します。デフォルトは |
|
syslog ファシリティーを設定します。デフォルトは |
|
デフォルトは |
|
タグからプレフィックスを削除します。デフォルトは |
|
これが指定されている場合、このフィールドをキーとして使用してレコードを検索し、syslog メッセージにタグを設定します。 |
|
これが指定されている場合、このフィールドをキーとして使用してレコードを検索し、syslog メッセージにペイロードを設定します。 |
この実装は安全ではないため、接続にスヌーピングがないことを保証できる環境でのみ使用してください。
Fluentd ロギング Ansible 変数
パラメーター | 説明 |
---|---|
|
デフォルトは |
|
リモート syslog サーバーのホスト名または IP アドレス。必須です。 |
|
接続先のポート番号。デフォルトは |
|
syslog の重大度を設定します。デフォルトは |
|
syslog ファシリティーを設定します。デフォルトは |
|
デフォルトは |
|
タグからプレフィックスを削除します。デフォルトは |
|
文字列が指定された場合、このフィールドをキーとして使用してレコードを検索し、syslog メッセージにタグを設定します。 |
|
文字列が指定された場合、このフィールドをキーとして使用してレコードを検索し、syslog メッセージにペイロードを設定します。 |
Mux ロギング Ansible 変数
パラメーター | 説明 |
---|---|
|
デフォルトは |
|
リモート syslog サーバーのホスト名または IP アドレス。必須です。 |
|
接続先のポート番号。デフォルトは |
|
syslog の重大度を設定します。デフォルトは |
|
syslog ファシリティーを設定します。デフォルトは |
|
デフォルトは |
|
タグからプレフィックスを削除します。デフォルトは |
|
文字列が指定された場合、このフィールドをキーとして使用してレコードを検索し、syslog メッセージにタグを設定します。 |
|
文字列が指定された場合、このフィールドをキーとして使用してレコードを検索し、syslog メッセージにペイロードを設定します。 |
32.10. Elasticsearch 管理操作の実行
Elasticsearch と通信して管理操作を実行するのに使用する管理者の証明書、キー、CA は、logging-elasticsearch シークレット内にあります。
これらが EFK インストールにあるかどうかを確認するには、以下のコマンドを実行します。
$ oc describe secret logging-elasticsearch
これらがない場合は、「手動でのアップグレード方法」を参照して、最新バージョンを使用していることをまず確認してください。
- メンテナンスを実行しようとしているクラスター内にある Elasticsearch Pod に接続します。
Pod をクラスター内で検索するには、以下のいずれかのコマンドを使用します。
$ oc get pods -l component=es -o name | head -1 $ oc get pods -l component=es-ops -o name | head -1
Pod に接続します。
$ oc rsh <your_Elasticsearch_pod>
Elasticsearch コンテナーに接続すると、インデックス API のマニュアルに従い、シークレットからマウントされた証明書を使用して Elasticsearch と通信することができます。
Fluentd では、インデックス形式 project.{project_name}.{project_uuid}.YYYY.MM.DD を使用してログを Elasticsearch に送信します。ここで、YYYY.MM.DD はログレコードの日付です。
たとえば uuid が 3b3594fa-2ccd-11e6-acb7-0eb6b35eaee3 の logging プロジェクトから 2016 年 6 月 15 日以降のすべてのログを削除するには、以下のコマンドを実行します。
$ curl --key /etc/elasticsearch/secret/admin-key \ --cert /etc/elasticsearch/secret/admin-cert \ --cacert /etc/elasticsearch/secret/admin-ca -XDELETE \ "https://localhost:9200/project.logging.3b3594fa-2ccd-11e6-acb7-0eb6b35eaee3.2016.06.15"
32.11. 集計されたロギングのドライバーの変更
集計されたロギングについては、json-file
ログドライバーの使用を推奨します。
json-file
ドライバーを使用する場合は、Docker バージョン docker-1.12.6-55.gitc4618fb.el7_4 now 以降を使用していることを確認してください。
Fluentd では、/etc/docker/daemon.json ファイルおよび /etc/sysconfig/docker ファイルをチェックして、Docker が使用しているドライバーを判別します。
docker info
コマンドを使用すると、Docker が使用しているドライバーを確認できます。
# docker info | grep Logging Logging Driver: journald
json-file
に変更するには、以下の手順に従います。
/etc/sysconfig/docker ファイルまたは /etc/docker/daemon.json ファイルのいずれかを変更します。
例を以下に示します。
# cat /etc/sysconfig/docker OPTIONS=' --selinux-enabled --log-driver=json-file --log-opt max-size=1M --log-opt max-file=3 --signature-verification=False' cat /etc/docker/daemon.json { "log-driver": "json-file", "log-opts": { "max-size": "1M", "max-file": "1" } }
Docker サービスを再起動します。
systemctl restart docker
Fluentd を再起動します。
警告13 以上のノードで一度に Fluentd を再起動すると、Kubernetes スケジューラーに大きな負荷が生成されます。以下の手順に従って Fluentd を再起動する場合は、細心の注意を払ってください。
Fluentd を再起動する方法は 2 つあります。1 つのノードまたはノードセット上で Fluentd を再起動するか、またはすべてのノードで Fluentd を再起動できます。
以下の手順は、1 つのノードまたはノードセット上で Fluentd を再起動する方法を示しています。
Fluentd が実行しているノードの一覧を表示します。
$ oc get nodes -l logging-infra-fluentd=true
各ノードについて、ラベルを削除して Fluentd をオフにします。
$ oc label node $node logging-infra-fluentd-
Fluentd がオフになっていることを確認します。
$ oc get pods -l component=fluentd
各ノードについて Fluentd を再起動します。
$ oc label node $node logging-infra-fluentd=true
以下の手順は、すべてのノード上で Fluentd を再起動する方法を示しています。
すべてのノードで Fluentd をオフにします。
$ oc label node -l logging-infra-fluentd=true --overwrite logging-infra-fluentd=false
Fluentd がオフになっていることを確認します。
$ oc get pods -l component=fluentd
すべてのノードで Fluentd を再起動します。
$ oc label node -l logging-infra-fluentd=false --overwrite logging-infra-fluentd=true
Fluentd がオンになっていることを確認します。
$ oc get pods -l component=fluentd
32.12. Elasticsearch の手動ロールアウト
OpenShift Container Platform 3.7 では Aggregated Logging スタックで Elasticsearch Deployment Config オブジェクトが更新され、Config Change Trigger が除外されました。このため、dc
を変更しても自動ロールアウトは実行されなくなります。これは、ES クラスターで意図しない再起動を回避するものでしたが、クラスターメンバーの再起動時にシャードのリバランスが過剰に発生しまう可能性があります。
このセクションでは、ローリング再起動とフル再起動の 2 つの再起動手順を説明します。ローリング再起動はダウンタイムを発生させずに Elasticsearch クラスターに適切な変更を適用し (3 つのマスターが設定されている場合)、フル再起動は既存データを損なわずに大規模な変更を安全に適用します。
32.12.1. Elasticsearch ローリングクラスター再起動の実行
以下のいずれかの変更を行う場合は、ローリング再起動を推奨します。
- Elasticsearch Pod の実行で再起動が必要なノード
- logging-elasticsearch configmap
- logging-es-* デプロイメント設定
- 新規イメージのデプロイメントまたはアップグレード
これは今後推奨される再起動ポリシーになります。
openshift_logging_use_ops
が True
に設定される場合、ES クラスターへのアクションを ops クラスターに対して繰り返す必要があります。
ノードを意図的に停止する際のシャードのバランシングを防止します。
$ oc exec -c elasticsearch <any_es_pod_in_the_cluster> -- curl -s --cacert /etc/elasticsearch/secret/admin-ca \ --cert /etc/elasticsearch/secret/admin-cert \ --key /etc/elasticsearch/secret/admin-key \ -XPUT 'https://localhost:9200/_cluster/settings' \ -d '{ "transient": { "cluster.routing.allocation.enable" : "none" } }'
完了したら、ES クラスターの各
dc
についてoc rollout latest
を実行して、最新バージョンのdc
オブジェクトをデプロイします。$ oc rollout latest <dc_name>
新しい Pod がデプロイされます。Pod に 2 つのコンテナーが準備できたら、以下の
dc
に進むことができます。クラスターのすべての「dc」がロールアウトされたら、シャードバランシングを再度有効にします。
$ oc exec -c elasticsearch <any_es_pod_in_the_cluster> -- curl -s --cacert /etc/elasticsearch/secret/admin-ca \ --cert /etc/elasticsearch/secret/admin-cert \ --key /etc/elasticsearch/secret/admin-key \ -XPUT 'https://localhost:9200/_cluster/settings' \ -d '{ "transient": { "cluster.routing.allocation.enable" : "all" } }'
32.12.2. Elasticsearch フルクラスター再起動の実行
Elasticsearch のメジャーバージョンの変更など、変更プロセス中にデータ整合性が損なわれる危険性がある変更の場合は、フル再起動を推奨します。
openshift_logging_use_ops
が True
に設定される場合、ES クラスターへのアクションを ops クラスターに対して繰り返す必要があります。
logging-es-ops
サービスに変更を行う場合は、パッチとして代わりにコンポーネント "es-ops-blocked" および "es-ops" を使用します。
ES クラスターが停止しているときに、ES クラスターへのすべての外部通信を無効にします。以下のコマンドを実行して、非クラスターロギングサービス (
logging-es
やlogging-es-ops
など) を編集して、ES Pod に一致しないようにします。$ oc patch svc/logging-es -p '{"spec":{"selector":{"component":"es-blocked","provider":"openshift"}}}'
シャードの同期フラッシュを実行して、シャットダウン前のディスクへの書き込みを待機している保留中の操作がないようにします。
$ oc exec -c elasticsearch <any_es_pod_in_the_cluster> -- curl -s --cacert /etc/elasticsearch/secret/admin-ca \ --cert /etc/elasticsearch/secret/admin-cert \ --key /etc/elasticsearch/secret/admin-key \ -XPOST 'https://localhost:9200/_flush/synced'
ノードを意図的に停止する際のシャードのバランシングを防止します。
$ oc exec -c elasticsearch <any_es_pod_in_the_cluster> -- curl -s --cacert /etc/elasticsearch/secret/admin-ca \ --cert /etc/elasticsearch/secret/admin-cert \ --key /etc/elasticsearch/secret/admin-key \ -XPUT 'https://localhost:9200/_cluster/settings' \ -d '{ "transient": { "cluster.routing.allocation.enable" : "none" } }'
完了したら、ES クラスターの各
dc
についてoc rollout latest
を実行して、最新バージョンのdc
オブジェクトをデプロイします。$ oc rollout latest <dc_name>
新しい Pod がデプロイされます。Pod に 2 つのコンテナーが準備できたら、以下の
dc
に進むことができます。再起動が完了したら、ES クラスターへのすべての外部通信を有効にします。以下のコマンドを再度実行して、非クラスターロギングサービス (
logging-es
やlogging-es-ops
など) を編集して、ES Pod に一致するようにします。$ oc patch svc/logging-es -p '{"spec":{"selector":{"component":"es","provider":"openshift"}}}'
第33章 集計ロギングのサイジングに関するガイドライン
33.1. 概要
Elasticsearch、Fluentd、Kibana (EFK) スタックは、OpenShift Container Platform インストール内部で実行されるノードとアプリケーションからログを集計します。デプロイされると、Fluentd を使用して、すべてのノード、プロジェクト、Pod からのイベントログを Elasticsearch (ES) に集計します。また、Kibana Web UI が一元化されており、ユーザーと管理者は集計されたデータを使用して、多彩な視覚化機能およびダッシュボードを作成できます。
Fluentd 一括アップロードにより JSON 形式でインデックスにログが記録されてから、Elasticsearch により検索要求が該当のシャードに転送されます。
33.2. インストール
集計ロギングスタックを OpenShift Container Platform にインストールする一般的な手順は、「コンテナーログの集計」に記載されています。インストールガイドを参照する際にいくつかの重要な事項に留意してください。
ロギング Pod をクラスター上に均等に分散させるため、空のノードセレクターを使用する必要があります。
$ oc adm new-project logging --node-selector=""
これは、後で実行されるノードのラベリングと共に、ロギングプロジェクトへの Pod 配置を制御します。これでロギングプロジェクトを作成できます。
$ oc project logging
Elasticsearch (ES) は、ノード障害に対する回復性を確保するために、少なくとも 3 つのクラスターサイズでデプロイする必要があります。これは openshift_logging_es_cluster_size
パラメーターをインベントリーホストファイルに設定することで指定されます。
パラメーターの詳細の一覧については、「Ansible 変数」を参照してください。
既存の Kibana インストールがない場合は、kibana.example.com を openshift_logging_kibana_hostname
への値として使用します。
イメージがレジストリーからすでに取得されているかどうかや、クラスターのサイズによっては、インストールに時間がかかる場合があります。
logging namespace 内部で、oc get all
を実行してデプロイメントを確認できます。
$ oc get all NAME REVISION REPLICAS TRIGGERED BY logging-curator 1 1 logging-es-6cvk237t 1 1 logging-es-e5x4t4ai 1 1 logging-es-xmwvnorv 1 1 logging-kibana 1 1 NAME DESIRED CURRENT AGE logging-curator-1 1 1 3d logging-es-6cvk237t-1 1 1 3d logging-es-e5x4t4ai-1 1 1 3d logging-es-xmwvnorv-1 1 1 3d logging-kibana-1 1 1 3d NAME HOST/PORT PATH SERVICE TERMINATION LABELS logging-kibana kibana.example.com logging-kibana reencrypt component=support,logging-infra=support,provider=openshift logging-kibana-ops kibana-ops.example.com logging-kibana-ops reencrypt component=support,logging-infra=support,provider=openshift NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE logging-es 172.24.155.177 <none> 9200/TCP 3d logging-es-cluster None <none> 9300/TCP 3d logging-es-ops 172.27.197.57 <none> 9200/TCP 3d logging-es-ops-cluster None <none> 9300/TCP 3d logging-kibana 172.27.224.55 <none> 443/TCP 3d logging-kibana-ops 172.25.117.77 <none> 443/TCP 3d NAME READY STATUS RESTARTS AGE logging-curator-1-6s7wy 1/1 Running 0 3d logging-deployer-un6ut 0/1 Completed 0 3d logging-es-6cvk237t-1-cnpw3 1/1 Running 0 3d logging-es-e5x4t4ai-1-v933h 1/1 Running 0 3d logging-es-xmwvnorv-1-adr5x 1/1 Running 0 3d logging-fluentd-156xn 1/1 Running 0 3d logging-fluentd-40biz 1/1 Running 0 3d logging-fluentd-8k847 1/1 Running 0 3d
最終的には以下のようなセットアップになります。
$ oc get pods -o wide NAME READY STATUS RESTARTS AGE NODE logging-curator-1-6s7wy 1/1 Running 0 3d ip-172-31-24-239.us-west-2.compute.internal logging-deployer-un6ut 0/1 Completed 0 3d ip-172-31-6-152.us-west-2.compute.internal logging-es-6cvk237t-1-cnpw3 1/1 Running 0 3d ip-172-31-24-238.us-west-2.compute.internal logging-es-e5x4t4ai-1-v933h 1/1 Running 0 3d ip-172-31-24-235.us-west-2.compute.internal logging-es-xmwvnorv-1-adr5x 1/1 Running 0 3d ip-172-31-24-233.us-west-2.compute.internal logging-fluentd-156xn 1/1 Running 0 3d ip-172-31-24-241.us-west-2.compute.internal logging-fluentd-40biz 1/1 Running 0 3d ip-172-31-24-236.us-west-2.compute.internal logging-fluentd-8k847 1/1 Running 0 3d ip-172-31-24-237.us-west-2.compute.internal logging-fluentd-9a3qx 1/1 Running 0 3d ip-172-31-24-231.us-west-2.compute.internal logging-fluentd-abvgj 1/1 Running 0 3d ip-172-31-24-228.us-west-2.compute.internal logging-fluentd-bh74n 1/1 Running 0 3d ip-172-31-24-238.us-west-2.compute.internal ... ...
各 ES インスタンスに割り当てられる RAM の容量はデフォルトで 8 GB です。openshift_logging_es_memory_limit
は openshift-ansible ホストインベントリーファイルで使用されるパラメーターです。この値の半分が個々の elasticsearch Pod java プロセスのヒープサイズに渡されることに注意してください。
EFK のインストールの詳細はこちらを参照してください。
33.2.1. 大規模クラスター
ノードが 100 以上ある場合、最初に docker pull registry.access.redhat.com/openshift3/logging-fluentd:v3.9
からロギングイメージを事前にプルすることを推奨します。ロギングインフラストラクチャー Pod (Elasticsearch、Kibana、Curator) をデプロイしたら、以下の例のようにノードのラベリングを一度に 20 ノード単位で実行します。
単純なループを使用します。
$ while read node; do oc label nodes $node logging-infra-fluentd=true; done < 20_fluentd.lst
以下の方法も有効です。
$ oc label nodes 10.10.0.{100..119} logging-infra-fluentd=true
ノードをグループ化してラベリングすると、OpenShift ロギングで DaemonSet が一定のペースで使用されるので、イメージレジストリーなどの共有リソース上の競合を回避できます。
「CrashLoopBackOff | ImagePullFailed | Error」の問題が発生していないかを確認します。診断用のコマンドとしては、oc logs <pod>
、oc describe pod <pod>
、oc get event
を利用できます。
33.3. Systemd-journald と rsyslog
レート制限
Red Hat Enterprise Linux (RHEL) 7 では、systemd-journald.socket ユニットはブートプロセスで/dev/log を作成し、入力を systemd-journald.service に渡します。すべての syslog() 呼び出しはジャーナルに移ります。
Rsyslog は imjournal モジュールをジャーナルファイルのデフォルトの入力モードとして使用します。このトピックの詳細については、「Interaction of rsyslog and journal」を参照してください。
簡易テストハーネスを開発して、logger をクラスターノード上で使用し、システムログ内にさまざまなレートでさまざまなサイズのエントリーを記録しました。systemd-219-19.el7.x86_64
を搭載したデフォルトの Red Hat Enterprise Linux (RHEL) 7 インストールにおける所定のロギングレート (毎秒約 40 行) によるテストシミュレーションで、デフォルトのレート制限 rsyslogd
に達しました。これらの制限を調整した後、ローカルジャーナルファイルが破損したため、エントリーの journald への書き込みが停止しました。この問題は以降のバージョンの systemd で解決されています。
スケールアップ
プロジェクトをスケールアップすると、デフォルトのロギング環境で調整が必要になる場合があります。systemd-219-22.el7.x86_64 に更新した後、以下を実行します。
$IMUXSockRateLimitInterval 0 $IMJournalRatelimitInterval 0
上記の行を /etc/rsyslog.conf に追加します。
# Disable rate limiting RateLimitInterval=1s RateLimitBurst=10000 Storage=volatile Compress=no MaxRetentionSec=30s
また、上記を /etc/systemd/journald.conf に追加します。
ここで、サービスを再起動します。
$ systemctl restart systemd-journald.service $ systemctl restart rsyslog.service
これらの設定は、一括アップロードのバースト性を担う設定です。
レート制限を削除した後、システムロギングデーモンの CPU 使用率が高くなることがあります。以前はスロットルされていた可能性のあるメッセージが処理されるためです。
Rsyslog (ratelimit.interval、ratelimit.burst を参照してください) はジャーナルからのエントリー読み出しを 300 秒に 10,000 メッセージに制限するよう設定されます。経験則として、rsyslog レート制限を systemd-journald レート制限に調節しておくことを推奨します。
33.4. EFK ロギングのスケールアップ
必要なスケールを最初のデプロイメントで指定しなかった場合、影響を最小限に抑えてクラスターを調整するには、更新したパラメーター値 openshift_logging_es_cluster_size
でインベントリーファイルを更新してから、Ansible ロギング Playbook を再度実行します。詳細については、「Elasticsearch 管理操作の実行」のセクションを参照してください。
33.5. ストレージに関する考慮事項
Elasticsearch インデックスはシャードとそれに対応するレプリカシャードのコレクションです。これにより ES は高可用性を内部に実装しているので、ハードウェアベースのミラーリング RAID のバリアントを使用する必要はほとんどありません。RAID 0 を使用して全体的なディスクパフォーマンスを向上することは可能です。
それぞれの検索要求は、インデックス内のそれぞれのシャードのコピーに一致する必要があります。各 ES インスタンスには独自のストレージが必要ですが、OpenShift Container Platform デプロイメントで提供できるのはすべての Pod で共有されるボリュームだけです。したがって、Elasticsearch は単一ノードで実装しないでください。
永続ボリュームを各 Elasticsearch デプロイメント設定に追加して、レプリカシャードごとに 1 つのボリュームを割り当てます。これは、OpenShift Container Platform では多くの場合、Persistent Volume Claim (永続ボリューム要求) によって実行されます。
- シャードあたり 1 ボリューム
- レプリカシャードあたり 1 ボリューム
PVC の名前は openshift_logging_es_pvc_prefix 設定に基づいて指定する必要があります。詳細は「永続的な Elasticsearch ストレージ」を参照してください。
以下に示すのは、OpenShift Container Platform 集計ロギングの容量計画のガイドラインです (サンプルシナリオ)。
前提条件:
- アプリケーション: Apache
- 1 行あたりのバイト数: 256
- アプリケーションでの 1 秒あたりのロード行数: 1
- 生テキストデータ → JSON
ベースライン (1 分あたり 256 文字 → 15 KB/分)
ロギングインフラ Pod | ストレージスループット |
---|---|
3 es 1 kibana 1 curator 1 fluentd |
6 Pod の合計: 90000 x 86400 = 7.7 GB/日 |
3 es 1 kibana 1 curator 11 fluentd |
16 Pod の合計: 225000 x 86400 = 24.0 GB/日 |
3 es 1 kibana 1 curator 20 fluentd |
25 Pod の合計: 225000 x 86400 = 32.4 GB/日 |
ロギング環境に必要なロギングスループットおよびディスク容量の合計を計算するには、お使いのアプリケーションに関する知識が必要です。たとえば、アプリケーションが平均して 1 秒あたり 10 行、1 行あたり 256 バイトをロギングする場合、アプリケーションごとのスループットとディスク容量は以下のように計算されます。
(bytes-per-line * (lines-per-second) = 2560 bytes per app per second (2560) * (number-of-pods-per-node,100) = 256,000 bytes per second per node 256k * (number-of-nodes) = total logging throughput per cluster
Fluentd では systemd journal および /var/lib/docker/containers/ からのログを Elasticsearch に送信します。詳細はこちらを参照してください。
最適なパフォーマンスを得るには、ローカルの SSD ドライブの使用を推奨します。Red Hat Enterprise Linux (RHEL) 7 では、SATA ディスク以外のすべてのブロックデバイスについては deadline IO スケジューラーがデフォルトです。SATA ディスクについては、デフォルトの IO スケジューラーは cfq になります。
ES 用のストレージのサイジングは、インデックスの最適化方法よって大きく変わります。このため、必要なデータ量とアプリケーションログデータの集計方法を事前に検討しておく必要があります。一部の Elasticsearch ユーザーは、絶対的なストレージ使用率をおよそ 50% に維持し、常に 70% 未満にする必要があることを確認しています。これは、大規模なマージ操作時に Elasticsearch が応答しなくなるのを回避するのに役立ちます。
第34章 クラスターメトリクスの有効化
34.1. 概要
kubelet はメトリクスを公開しますが、これは Heapster によって収集され、バックエンドに保存されます。
OpenShift Container Platform 管理者は、すべてのコンテナーとコンポーネントから収集したクラスターのメトリクスを 1 つのユーザーインターフェースで表示できます。これらのメトリクスは、Horizontal Pod Autoscaler によるスケーリングのタイミングと方法の決定にも使用されます。
このトピックでは、Hawkular Metric をメトリクスエンジンとして使用した例について説明します。このエンジンはデータを Cassandra データベースに永続的に保存します。これが設定されると、CPU、メモリー、ネットワークベースのメトリクスを OpenShift Container Platform Web コンソールから表示できるようになり、Horizontal Pod Autoscaler で使用できるようになります。
Heapster はマスターサーバーからすべてのノードの一覧を取得して、/stats
エンドポイントから各ノードへ個別に通信します。ここから、Heapster は CPU、メモリー、ネットワーク使用状況のメトリクスを収集して、Hawkular Metrics にエクスポートします。
kubelet で利用できるストレージボリュームメトリクスは、/stats
エンドポイントからは利用できません。ただし、/metrics
エンドポイントからは利用できます。詳細は、Prometheus 経由の OpenShift Container Platform メトリクスについて参照してください。
Web コンソールで個々の Pod を参照すると、メモリーと CPU に個別のスパークラインチャートが表示されます。表示される時間範囲は選択可能で、これらのチャートは 30 秒ごとに自動更新されます。Pod に複数のコンテナーがある場合は、メトリクスを表示する特定のコンテナーを選択します。
リソース制限がプロジェクトに定義されている場合、各 Pod のドーナツチャートも表示できます。ドーナツチャートはリソース制限に対する使用量を示します。たとえば、145 Available of 200 MiB
は、ドーナツチャートでは 55 MiB Used
と表示されます。
34.2. 作業を開始する前に
Ansible Playbook はクラスターメトリクスのデプロイとアップグレードに使用できます。通常インストール (Advanced installation) のセクションに精通しておくようにしてください。Ansible を使用するための予備知識や、設定に関する情報が記載されています。クラスターメトリクスのさまざまな領域を設定するためのパラメーターが Ansible インベントリーファイルに追加されています。
以下に示すセクションでは、デフォルト値を変更するために Ansible インベントリーファイルに追加できる各種の領域とパラメーターを説明します。
34.3. メトリクスプロジェクト
自動スケールを機能させるには、クラスターメトリクスのコンポーネントを openshift-infra プロジェクトにデプロイする必要があります。とくに Horizontal Pod Autoscaler はこのプロジェクトを使用して Heapster サービスを検出し、それをメトリクスの取得に使用します。メトリクスプロジェクトは、openshift_metrics_project
をインベントリーファイルに追加することで変更できます。
34.4. メトリクスデータストレージ
メトリクスデータは、永続ストレージまたは一時的な Pod ボリュームのいずれかに保存できます。
34.4.1. 永続ストレージ
OpenShift Container Platform クラスターメトリクスを永続ストレージと共に実行すると、メトリクスは永続ボリュームに保存され、再起動または再作成される Pod を維持できます。これは、メトリクスデータをデータ損失から保護する必要がある場合に適しています。実稼働環境では、メトリクス Pod に永続ストレージを設定することを強く推奨します。
Cassandra ストレージのサイズ要件は Pod 数に依存します。セットアップで十分なサイズ要件を確保し、ディスクが一杯にならないように使用状況を監視するのは、管理者の責任です。永続ボリューム要求のサイズは openshift_metrics_cassandra_pvc_size
ansible variable で指定され、デフォルトは 10 GB に設定されています。
動的にプロビジョニングされた永続ボリュームを使用する場合は、インベントリーファイルで openshift_metrics_cassandra_storage_type
変数を dynamic
に設定します。
34.4.2. クラスターメトリクスの容量計画
openshift_metrics
Ansible ロールを実行した後、oc get pods
の出力は以下のようになります。
# oc get pods -n openshift-infra NAME READY STATUS RESTARTS AGE hawkular-cassandra-1-l5y4g 1/1 Running 0 17h hawkular-metrics-1t9so 1/1 Running 0 17h heapster-febru 1/1 Running 0 17h
OpenShift Container Platform メトリクスは Cassandra データベースを使用して保存されます。このデータベースはopenshift_metrics_cassandra_limits_memory: 2G
の設定でデプロイされます。この値は Cassandra の開始スクリプトで決定される空きメモリー容量に応じてさらに調整できます。この値はほとんどの OpenShift Container Platform メトリクスインストールに対応しますが、クラスターメトリクスをデプロイする前に、環境変数を使用して MAX_HEAP_SIZE
と ヒープの新しい生成サイズ HEAP_NEWSIZE
を Cassandra Dockerfile で変更できます。
デフォルトで、メトリクスデータは 7 日間保存されます。7 日が経過すると、Cassandra は最も古いメトリクスデータのパージを開始します。削除された Pod とプロジェクトのメトリクスデータは自動的にはパージされません。7 日を超えたデータのみが削除されます。
例34.1 10 のノードと 1000 の Pod による累積データ
10 のノードと 1000 の Pod を含むテストシナリオでは、24 時間で 2.5 GB のメトリクスデータが累積されました。このため、このシナリオでのメトリクスデータの容量計画の計算式は以下のようになります。
(((2.5 × 109) ÷ 1000) ÷ 24) ÷ 106 = ~0.125 MB/hour per pod.
例34.2 120 のノードと 10000 の Pod による累積データ
120 のノードと 10000 の Pod を含むテストシナリオでは、24 時間で 25 GB のメトリクスデータが累積されました。このため、このシナリオにおけるメトリクスデータの容量計画の計算式は以下のようになります。
(((11.410 × 109) ÷ 1000) ÷ 24) ÷ 106 = 0.475 MB/hour
1000 の Pod | 10000 の Pod | |
---|---|---|
24 時間で累積される Cassandra ストレージデータ (デフォルトのメトリクスパラメーター) |
2.5 GB |
11.4 GB |
openshift_metrics_duration
の 7 日間および openshift_metrics_resolution
の 30 秒間というデフォルト値を維持する場合、Cassandra Pod の週次のストレージ要件は以下のようになります。
1000 の Pod | 10000 の Pod | |
---|---|---|
7 日間で累積される Cassandra ストレージデータ (デフォルトのメトリクスパラメーター) |
20 GB |
90 GB |
先の表では、予期せずモニタリングされた Pod 使用量のバッファーとして、予期されたストレージ容量に対して予備の 10% が追加されています。
Cassandra の永続化ボリュームに十分な空き容量がなくなると、データ損失が発生します。
クラスターメトリクスを永続ストレージと共に使用するには、永続ボリュームに ReadWriteOnce アクセスモードが設定されていることを確認します。このモードがアクティブではない場合、Persistent Volume Claim (永続ボリューム要求) は永続ボリュームを特定できず、Cassandra の開始に失敗します。
永続ストレージをメトリックコンポーネントと併用するには、十分なサイズの永続ボリュームがあることを確認します。Persistent Volume Claim (永続ボリューム要求) の作成は OpenShift Ansible openshift_metrics
ロールによって処理されます。
OpenShift Container Platform メトリクスは、動的にプロビジョニングされた永続ボリュームもサポートします。この機能を OpenShift Container Platform メトリクスで使用するには、openshift_metrics_cassandra_storage_type
の値を dynamic
に設定する必要があります。EBS、GCE、Cinder ストレージバックエンドを使用すると永続ボリュームを動的にプロビジョニングできます。
パフォーマンスの設定とクラスターメトリクス Pod のスケーリングについては、「Scaling Cluster Metrics」のトピックを参照してください。
ノード数 | Pod 数 | Cassandra ストレージの増加率 | 1 日あたりの Cassandra ストレージの増加量 | 1 週間あたりの Cassandra ストレージの増加量 |
---|---|---|---|---|
210 |
10500 |
1 時間あたり 500 MB |
15 GB |
75 GB |
990 |
11000 |
1 時間あたり 1 GB |
30 GB |
210 GB |
上記の計算では、ストレージ要件が計算値を超過しないようにするためのオーバーヘッドとして、予期されたサイズのおよそ 20% が追加されています。
METRICS_DURATION
と METRICS_RESOLUTION
の値がデフォルト (それぞれ 7
日間と 15
秒間) に維持されている場合、1 週間の Cassandra ストレージサイズ要件を上記の値に設定することを問題なく計画できるでしょう。
OpenShift Container Platform メトリクスは、メトリクスデータのデータストアとして Cassandra データベースを使用するので、メトリクス設定のプロセスで USE_PERSISTANT_STORAGE=true
に設定した場合には、NFS でネットワークストレージの上層に PV
がデフォルトで配置されます。ただし、Cassandra ドキュメントにあるように、ネットワークストレージと、Cassandra を組み合わせて使用することは推奨していません。
既知の問題と制限
テストの結果として、heapster
メトリクスコンポーネントは最大 25,000 の Pod を処理できることが確認されています。Pod 数がこの数を超過すると、Heapster のメトリクス処理が遅くなり始め、メトリクスグラフが表示されなくなる可能性があります。Heapster がメトリクスを収集できる Pod 数を増加する作業と、メトリクスを収集する代替ソリューションのアップストリーム開発が進められています。
34.4.3. 非永続ストレージ
OpenShift Container Platform クラスターメトリクスを非永続ストレージと共に実行すると、Pod の削除時に、保存されていたすべてのメトリクスが削除されます。クラスターメトリクスは非永続データで実行する方がはるかに容易ですが、非永続データで実行すると永続的なデータが損失するリスクが伴います。ただし、メトリクスはコンテナーが再起動されても存続します。
非永続ストレージを使用するためには、インベントリーファイルで openshift_metrics_cassandra_storage_type
変数を emptyDir
に設定する必要があります。
非永続ストレージを使用している場合、メトリクスデータは、Cassandra Pod が実行されるノード上の /var/lib/origin/openshift.local.volumes/pods に書き込まれます。/var にメトリクスを保存するために十分な空き容量があることを確認してください。
34.5. メトリクス Ansible ロール
OpenShift Container Platform の Ansible openshift_metrics
ロールは、Configuring Ansible インベントリーファイルにある変数を使用して、すべてのメトリクスコンポーネントを設定し、デプロイします。
34.5.1. メトリクス Ansible 変数の指定
OpenShift Ansible に含まれる openshift_metrics
ロールはクラスターメトリクスをデプロイするタスクを定義します。以下は、上書きが必要な場合にインベントリーファイルに追加できるロール変数の一覧です。
変数 | 説明 |
---|---|
|
|
|
コンポーネントをデプロイした後にメトリクスクラスターを起動します。 |
|
コンポーネントイメージのプレフィックス。 |
|
コンポーネントイメージのバージョン。たとえば、 |
|
再起動を試行する前に Hawkular Metrics および Heapster が起動するまでの時間 (秒単位)。 |
|
メトリクスがパージされるまで保管される日数。 |
|
メトリクスが収集される頻度。数値と時間を示す識別子である秒 (s)、分 (m)、時間 (h) で定義されます。 |
|
Cassandra に作成される Persistent Volume Claim (永続ボリューム要求) のプレフィックス。プレフィックスには 1 から始まる連番が付加されます。 |
|
各 Cassandra ノードの Persistent Volume Claim (永続ボリューム要求) のサイズ。 |
|
明示的にストレージクラスを設定する場合には、 |
|
|
|
メトリクススタックの Cassandra ノードの数。この値は Cassandra レプリケーションコントローラーの数を指定します。 |
|
Cassandra Pod のメモリー制限。たとえば、値 |
|
Cassandra Pod の CPU 制限。値 |
|
Cassandra Pod について要求するメモリー量。値 |
|
Cassandra Pod の CPU 要求。値 |
|
Cassandra に使用される補助ストレージグループ。 |
|
必要な既存のノードセレクターを設定して、Pod が特定のラベルを持つノードに配置されるようにします。たとえば、 |
|
Hawkular 証明書に署名するための認証局 (CA) ファイル (オプション)。 |
|
Hawkular メトリクスへのルートを再暗号化するために使用される証明書ファイル。証明書にはルートに使用されるホスト名を含める必要があります。これが指定されない場合、デフォルトのルーター証明書が使用されます。 |
|
Hawkular 証明書で使用されるキーファイル。 |
|
Hawkular Pod を制限するためのメモリー量。値 |
|
Hawkular Pod の CPU 制限。値 |
|
Hawkular メトリクスのレプリカの数。 |
|
Hawkular Pod について要求するメモリー量。値 |
|
Hawkular Pod の CPU 要求。値 |
|
必要な既存のノードセレクターを設定して、Pod が特定のラベルを持つノードに配置されるようにします。たとえば、 |
|
許可する CN のカンマ区切りの一覧。デフォルトで、OpenShift サービスプロキシーが接続できるように設定されます。Horizontal Pod Autoscaling を適切に機能させるには、上書きする際に |
|
Heapster Pod を制限するメモリー量。値 |
|
Heapster Pod の CPU 制限。値 |
|
Heapster Pod について要求するメモリー量。値 |
|
Heapster Pod の CPU 要求。値 |
|
Heapster のみをデプロイします。Hawkular Metrics や Cassandra コンポーネントはデプロイされません。 |
|
必要な既存のノードセレクターを設定して、Pod が特定のラベルを持つノードに配置されるようにします。たとえば、 |
|
Hawkular OpenShift Agent (HOSA) をインストールするには |
|
Hawkular Metrics ルートのホスト名を使用するので、 |
OpenShift Container Platform 上での Hawkular OpenShift Container Platform Agent はテクノロジープレビュー機能のみです。テクノロジープレビュー機能は Red Hat の実稼働サービスレベルアグリーメント (SLA) ではサポートされておらず、機能的にも完全でない可能性があります。また、Red Hat はテクノロジープレビュー機能を実稼働環境での使用することを推奨していません。この機能を使用することで、今後発売される製品の機能に対して早期アクセスが可能となるため、お客様は機能をテストしたり、開発プロセス中にフィードバックを提供することができます。
Red Hat のテクノロジープレビュー機能のサポートについての詳細は、https://access.redhat.com/support/offerings/techpreview/ を参照してください。
要求と制限を指定する方法の詳細については、「コンピュートリソース」を参照してください。
Cassandra で永続ストレージを使用している場合、openshift_metrics_cassandra_pvc_size
変数を使用してクラスターに十分なディスクサイズを設定することは管理者の責任です。また、管理者はディスクが一杯にならないようにディスク使用量を監視する必要もあります。
Cassandra の永続化ボリュームの領域が不足するとデータが損失します。
その他のすべての変数はオプションで、詳細なカスタマイズが可能です。たとえば、Kubernetes マスターを https://kubernetes.default.svc:443
で使用できないカスタムインストールでは、代わりに openshift_metrics_master_url
パラメーターを使用して値を指定できます。特定のバージョンのメトリクスコンポーネントをデプロイするには、openshift_metrics_image_version
変数を変更します。
latest を openshift_metrics_image_version で使用しないことを強く推奨します。latest バージョンは使用できる最新のバージョンに対応し、現在実行している OpenShift Container Platform で機能しない新しいバージョンが導入された場合に問題が発生します。
34.5.2. シークレットの使用
OpenShift Container Platform Ansible openshift_metrics
ロールは、コンポーネント間で使用する自己署名証明書を自動生成し、re-encrypt ルートを生成して Hawkular Metrics サービスを公開します。このルートによって Web コンソールで Hawkular Metrics サービスにアクセスできます。
Web コンソールを実行するブラウザーがこのルート経由の接続を信頼するには、ルートの証明書を信頼する必要があります。これは、信頼された認証局によって署名されたユーザー固有の証明書を提供することで実行できます。openshift_metrics
ロールによって、ユーザー固有の証明書を指定でき、この証明書がルートの作成時に使用されます。
ユーザー固有の証明書を提供しない場合、ルーターのデフォルト証明書が使用されます。
34.5.2.1. ユーザー固有の証明書の提供
ユーザー固有の証明書を提供し、re-encrypt ルートで使用するには、openshift_metrics_hawkular_cert
、openshift_metrics_hawkular_key
、openshift_metrics_hawkular_ca
変数をインベントリーファイルで設定します。
hawkular-metrics.pem
値には .pem 形式の証明書を含める必要があります。この pem ファイルに hawkular-metrics-ca.cert
シークレット経由で署名した認証局の証明書を提供することも必要です。
詳細については、re-encrypt ルートに関するマニュアルを参照してください。
34.6. メトリックコンポーネントのデプロイ
すべてのメトリックコンポーネントのデプロイと設定は OpenShift Container Platform Ansible で処理されるので、すべてを 1 つのステップでデプロイできます。
以下の例では、デフォルトパラメーターを使用して、メトリクスのデプロイ時に永続ストレージを使用する場合の方法と使用しない場合の方法を示しています。
Ansible Playbook を実行するホストには、ホストあたり 75MiB 以上の空きメモリーがインベントリーで必要になります。
アップストリームの Kubernetes ルールに応じて、eth0
のデフォルトインターフェースでのみメトリクスを収集できます。
例34.3 永続ストレージを使用するデプロイ
以下のコマンドでは、Hawkular Metrics ルートを hawkular-metrics.example.com を使用し、永続ストレージを使用してデプロイされるように設定します。
十分な容量を備えた永続ボリュームを用意してください。
$ ansible-playbook [-i </path/to/inventory>] <OPENSHIFT_ANSIBLE_DIR>/playbooks/openshift-metrics/config.yml \ -e openshift_metrics_install_metrics=True \ -e openshift_metrics_hawkular_hostname=hawkular-metrics.example.com \ -e openshift_metrics_cassandra_storage_type=pv
例34.4 永続ストレージを使用しないデプロイ
以下のコマンドでは、Hawkular Metrics ルートを hawkular-metrics.example.com を使用し、永続ストレージを使用しないでデプロイするように設定します。
$ ansible-playbook [-i </path/to/inventory>] <OPENSHIFT_ANSIBLE_DIR>/playbooks/openshift-metrics/config.yml \ -e openshift_metrics_install_metrics=True \ -e openshift_metrics_hawkular_hostname=hawkular-metrics.example.com
これは永続ストレージを使用しないでデプロイされるため、メトリックデータが損失する可能性があります。
34.6.1. メトリクスの診断
メトリクススタックの状態の評価に使用できるメトリクス用の診断があります。メトリクスの診断を実行するには、以下のコマンドを実行します。
$ oc adm diagnostics MetricsApiProxy
34.7. メトリクスのパブリック URL の設定
OpenShift Container Platform Web コンソールは、Hawkular Metrics サービスから受信したデータを使用してグラフを表示します。Hawkular Metrics サービスにアクセスする URL は、マスター webconsole-config configmap ファイルでmetricsPublicURL
オプションを使用して設定する必要があります。この URL は メトリクスコンポーネントのデプロイメント時に使用される openshift_metrics_hawkular_hostname
インベントリー変数で作成されるルートに対応します。
openshift_metrics_hawkular_hostname
はコンソールにアクセスするブラウザーで解決できる必要があります。
たとえば、openshift_metrics_hawkular_hostname
が hawkular-metrics.example.com
に対応する場合、webconsole-config configmap ファイルに以下の変更を行う必要があります。
clusterInfo: ... metricsPublicURL: "https://hawkular-metrics.example.com/hawkular/metrics"
webconsole-config configmap ファイルを更新し、保存した後に、OpenShift Container Platform インスタンスを再起動する必要があります。
OpenShift Container Platform サーバーが再び稼働すると、メトリクスが Pod 概要のページに表示されます。
自己署名証明書を使用している場合、Hawkular Metrics サービスはコンソールとは別のホスト名でホストされ、別の証明書を使用することに注意してください。場合によっては、ブラウザータブを明示的に開いて metricsPublicURL
に指定される値を直接参照して、この証明書を受け入れる必要があります。
これを回避するには、お使いのブラウザーで許可されるように設定された証明書を使用します。
34.8. Hawkular Metrics への直接アクセス
メトリクスに直接アクセスし、これを管理するには、Hawkular Metrics API を使用します。
API から Hawkular Metrics にアクセスした場合は、読み取り操作しか実行できません。メトリクスの書き込みはデフォルトで無効にされています。個々のユーザーがメトリクスの書き込みも実行できるようにするには、openshift_metrics_hawkular_user_write_access
変数を true に設定する必要があります。
ただし、デフォルトの設定を使用して Heapster からのみメトリクスを入力ことを推奨します。書き込みアクセスが有効になると、どのユーザーもメトリクスをシステムに書き込めるようになり、これがパフォーマンスに影響を及ぼし、Cassandra のディスク使用量が予期せずに増加する可能性があります。
Hawkular Metrics のマニュアルでは、API の使用方法を説明していますが、OpenShift Container Platform で使用するように設定されたバージョンの Hawkular Metrics とは処理方法に多少の違いがあります。
34.8.1. OpenShift Container Platform プロジェクトと Hawkular テナント
Hawkular Metrics はマルチテナントアプリケーションで、OpenShift Container Platform 内のプロジェクトが Hawkular Metrics 内のテナントに対応するように設定されます。
このため、MyProject という名前のプロジェクトのメトリクスにアクセスする場合は、Hawkular-Tenant ヘッダーを MyProject に設定する必要があります。
また、_system という名前の特殊なテナントもあり、これにはシステムレベルのメトリクスが含まれています。これにアクセスするには、cluster-reader または cluster-admin レベルの権限が必要です。
34.8.2. 承認
Hawkular Metrics サービスは、ユーザーを OpenShift Container Platform に対して認証し、ユーザーがアクセスしようとしているプロジェクトに対するアクセスを持つかどうかを判別します。
Hawkular Metrics はクライアントからベアラートークンを受け取り、SubjectAccessReview を使用して、OpenShift Container Platform サーバーでトークンを検証します。ユーザーがプロジェクトに対する適切な読み取り権限を持つ場合、ユーザーはこのプロジェクトのメトリクスを読み取ることができます。_system テナントについては、このテナントからの読み取りを要求するユーザーには、cluster-reader パーミッションがなければなりません。
Hawkular Metrics API にアクセスする場合、ベアラートークンは Authorization ヘッダーに渡す必要があります。
34.9. OpenShift Container Platform クラスターメトリクス Pod のスケーリング
クラスターメトリクス機能のスケーリングに関する情報は、『Scaling and Performance Guide』に記載されています。
34.10. 集計されるロギングとの統合
Hawkular Alert は Aggregated Logging の Elasticsearch に接続して、ログイベントに応答できるようにする必要があります。デフォルトで、Hawkular は起動時にデフォルトの場所にある Elasticsearch を見つけようとします (namespace logging
、Pod logging-es
)。Aggregated Logging が Hawkular の後にインストールされた場合、新規 Elasticsearch サーバーを認識できるようにするには Hawkular Metrics Pod の再起動が必要になる場合があります。統合が適切に設定されていない場合は、これについて以下のようなメッセージが出され、Hawkular ブートログに明示的に記録されます。
Failed to import the logging certificate into the store. Continuing, but the logging integration might fail.
または、以下が表示されます。
Could not get the logging secret! Status code: 000. The Hawkular Alerts integration with Logging might not work properly.
この機能はバージョン 3.7.0 以降で使用できます。以下のようなエントリーのログをチェックして、ロギングを利用できるかどうか確認します。
Retrieving the Logging's CA and adding to the trust store, if Logging is available.
34.11. クリーンアップ
OpenShift Container Platform Ansible openshift_metrics
ロールによってデプロイされたものはすべて、以下の手順を実行して削除できます。
$ ansible-playbook [-i </path/to/inventory>] <OPENSHIFT_ANSIBLE_DIR>/playbooks/openshift-metrics/config.yml \ -e openshift_metrics_install_metrics=False
34.12. OpenShift Container Platform 上の Prometheus
Prometheus はスタンドアロンでオープンソースシステムの、モニタリングおよびアラートツールキットです。Prometheus を使用すると、OpenShift Container Platform システムリソースのメトリクスとアラートを視覚化できます。
OpenShift Container Platform 上での Prometheus はテクノロジープレビュー機能です。テクノロジープレビュー機能は Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。これらの機能は、近々発表予定の製品機能をリリースに先駆けてご提供することにより、お客様は機能性をテストし、開発プロセス中にフィードバックをお寄せいただくことができます。
Red Hat のテクノロジープレビュー機能のサポートについての詳細は、https://access.redhat.com/support/offerings/techpreview/ を参照してください。
34.12.1. Prometheus ロール変数の設定
Prometheus ロールは以下を作成します。
-
openshift-metrics
namespace -
Prometheus
clusterrolebinding
およびサービスアカウント - OAuth プロキシーの背後の Prometheus、Alertmanager および Alert Buffer をステートフルセットとして備えた Prometheus Pod
-
Prometheus と
prometheus-alerts
ConfigMaps - Prometheus と Prometheus Alerts サービスおよび直接ルート
Prometheus デプロイメントはデフォルトで有効にされます。openshift_prometheus_state
を absent
に設定してこれをアンインストールします。以下は例になります。
# openshift_prometheus_state=absent
以下のロール変数を設定して、Prometheus をインストールし、設定します。
変数 | 説明 |
---|---|
|
デフォルト値は |
|
コンポーネントがデプロイされるプロジェクト namespace。デフォルトは |
|
Prometheus がデプロイされるノードのセレクターです。デフォルトは |
|
Prometheus の PV を作成するために設定します。例: |
|
Alertmanager の PV を作成するために設定します。例: |
|
Alert Buffer の PV を作成するために設定します。例: |
|
Prometheus の PVC を作成するために設定します。例: |
|
Alertmanager の PVC を作成するために設定します。例: |
|
Alert Buffer の PVC を作成するために設定します。例: |
|
追加の Prometheus ルールファイル。デフォルトで |
34.12.2. Ansible インストーラーを使用した Prometheus のデプロイ
Ansible Playbook を実行するホストには、ホストあたり 75MiB 以上の空きメモリーがインベントリーで必要になります。
Ansible インストーラーは、Prometheus をデプロイするデフォルトの方法です。
Playbook を実行します。
$ ansible-playbook -vvv -i ${INVENTORY_FILE} playbooks/openshift-prometheus/config.yml
node-role.kubernetes.io/infra=true
のラベルの付いたノードがあることを確認します。このラベルは openshift_prometheus_node_selector
のデフォルト値です。他のノードセレクターを使用する必要がある場合は、「ノードセレクターを使用したデプロイ」を参照してください。
34.12.2.1. Prometheus をデプロイする他の方法
ノードセレクターを使用したデプロイ
Prometheus をデプロイするノードにラベルを付けます。
# oc adm label node/$NODE ${KEY}=${VALUE}
Ansible とコンテナーリソースを使って Prometheus をデプロイします。
# Set node selector for prometheus openshift_prometheus_node_selector={"${KEY}":"${VALUE}"}
Playbook を実行します。
$ ansible-playbook -vvv -i ${INVENTORY_FILE} playbooks/openshift-prometheus/config.yml
デフォルト以外の namespace を使用したデプロイ
namespace を特定します。
# Set non-default openshift_prometheus_namespace openshift_prometheus_namespace=${USER_PROJECT}
Playbook を実行します。
$ ansible-playbook -vvv -i ${INVENTORY_FILE} playbooks/openshift-prometheus/config.yml
34.12.2.2. Prometheus Web UI へのアクセス
Prometheus サーバーは localhost:9090
で Web UI を自動的に公開します。Prometheus Web UI にはview
ロールでアクセスできます。
34.12.2.3. Prometheus での OpenShift Container Platform の設定
Prometheus のストレージ関連の変数
Prometheus の各コンポーネント (Prometheus、Alertmanager、Alert Buffer、OAuth プロキシーを含む) を使用して、対応するロール変数を設定して PV 要求を設定できます。以下は例になります。
openshift_prometheus_storage_type: pvc openshift_prometheus_alertmanager_pvc_name: alertmanager openshift_prometheus_alertbuffer_pvc_size: 10G openshift_prometheus_pvc_access_modes: [ReadWriteOnce]
Prometheus アラートルールファイル変数
追加のルール変数へのパスを設定すると、アラートルールを含む外部ファイルを追加できます。
openshift_prometheus_additional_rules_file: <PATH>
ファイルは、Prometheus アラートルールの形式に準拠する必要があります。以下の例では、クラスターノードの 1 つがダウンしている時にアラートを送信するルールを設定しています。
groups:
- name: example-rules
interval: 30s # defaults to global interval
rules:
- alert: Node Down
expr: up{job="kubernetes-nodes"} == 0
for: 10m 1
annotations:
miqTarget: "ContainerNode"
severity: "HIGH"
message: "{{ '{{' }}{{ '$labels.instance' }}{{ '}}' }} is down"
- 1
- オプションの
for
の値は、この要素に関するアラートを送信する前に Prometheus が待機する時間を指定します。たとえば、10m
に設定すると、Prometheus は、この問題が発生してからアラートを送信するまで 10 分待ちます。
リソース制限を制御する Prometheus 変数
Prometheus の各コンポーネント (Prometheus、Alertmanager、Alert Buffer、OAuth プロキシーを含む) を使用して、対応するロール変数を設定することで、CPU、メモリー制限および要求を指定できます。以下は例になります。
openshift_prometheus_alertmanager_limits_memory: 1Gi openshift_prometheus_oauth_proxy_cpu_requests: 100m
詳細については、「OpenShift Prometheus」を参照してください。
openshift_metrics_project: openshift-infra
がインストールされると、メトリクスは http://${POD_IP}:7575/metrics
エンドポイントから収集できるようになります。
34.12.3. Prometheus 経由の OpenShift Container Platform メトリクス
システムの状態は、システムが出力するメトリクスによって測定できます。このセクションでは、ストレージサブシステムおよびクラスターの健全性を識別する現行のメトリクスと提案されているメトリクスについて説明します。
34.12.3.1. 現行のメトリクス
このセクションでは、現時点の Kubernetes のストレージサブシステムから出力されるメトリクスについて説明します。
クラウドプロバイダー API 呼び出しメトリクス
このメトリクスは、すべての cloudprovider API 呼び出しの成功と失敗の時刻と回数を報告します。これらのメトリクスには aws_attach_time
と aws_detach_time
が含まれています。出力されるメトリクスのタイプはヒストグラムであるため、Prometheus はこれらのメトリクスについての合計、カウント、バケットメトリクスも生成します。
GCE からの cloudprovider メトリクスの概要のサンプル:
cloudprovider_gce_api_request_duration_seconds { request = "instance_list"} cloudprovider_gce_api_request_duration_seconds { request = "disk_insert"} cloudprovider_gce_api_request_duration_seconds { request = "disk_delete"} cloudprovider_gce_api_request_duration_seconds { request = "attach_disk"} cloudprovider_gce_api_request_duration_seconds { request = "detach_disk"} cloudprovider_gce_api_request_duration_seconds { request = "list_disk"}
AWS からの cloudprovider メトリクスの概要のサンプル:
cloudprovider_aws_api_request_duration_seconds { request = "attach_volume"} cloudprovider_aws_api_request_duration_seconds { request = "detach_volume"} cloudprovider_aws_api_request_duration_seconds { request = "create_tags"} cloudprovider_aws_api_request_duration_seconds { request = "create_volume"} cloudprovider_aws_api_request_duration_seconds { request = "delete_volume"} cloudprovider_aws_api_request_duration_seconds { request = "describe_instance"} cloudprovider_aws_api_request_duration_seconds { request = "describe_volume"}
詳細は、「Cloud Provider (specifically GCE and AWS) metrics for Storage API calls」を参照してください。
ボリューム操作のメトリクス
これらのメトリクスは、ストレージ操作が開始されてからの所要時間を報告します。これらのメトリクスはプラグインレベルで操作時間を追跡しますが、goroutine
の実行時間や内部キューからピックアップされる操作にかかった時間は除外されます。これらのメトリクスのタイプはヒストグラムです。
ボリューム操作メトリクスの概要のサンプル
storage_operation_duration_seconds { volume_plugin = "aws-ebs", operation_name = "volume_attach" } storage_operation_duration_seconds { volume_plugin = "aws-ebs", operation_name = "volume_detach" } storage_operation_duration_seconds { volume_plugin = "glusterfs", operation_name = "volume_provision" } storage_operation_duration_seconds { volume_plugin = "gce-pd", operation_name = "volume_delete" } storage_operation_duration_seconds { volume_plugin = "vsphere", operation_name = "volume_mount" } storage_operation_duration_seconds { volume_plugin = "iscsi" , operation_name = "volume_unmount" } storage_operation_duration_seconds { volume_plugin = "aws-ebs", operation_name = "unmount_device" } storage_operation_duration_seconds { volume_plugin = "cinder" , operation_name = "verify_volumes_are_attached" } storage_operation_duration_seconds { volume_plugin = "<n/a>" , operation_name = "verify_volumes_are_attached_per_node" }
詳細は、「Volume operation metrics」を参照してください。
ボリューム統計メトリクス
これらのメトリクスは通常、PVC の使用状況の統計を報告します (空き領域に対する使用中の領域など)。出力されるメトリクスのタイプはゲージです。
メトリクス | 種別 | ラベル/タグ |
---|---|---|
volume_stats_capacityBytes |
ゲージ |
namespace,persistentvolumeclaim,persistentvolume= |
volume_stats_usedBytes |
ゲージ |
namespace=<persistentvolumeclaim-namespace> persistentvolumeclaim=<persistentvolumeclaim-name> persistentvolume=<persistentvolume-name> |
volume_stats_availableBytes |
ゲージ |
namespace=<persistentvolumeclaim-namespace> persistentvolumeclaim=<persistentvolumeclaim-name> persistentvolume= |
volume_stats_InodesFree |
ゲージ |
namespace=<persistentvolumeclaim-namespace> persistentvolumeclaim=<persistentvolumeclaim-name> persistentvolume=<persistentvolume-name> |
volume_stats_Inodes |
ゲージ |
namespace=<persistentvolumeclaim-namespace> persistentvolumeclaim=<persistentvolumeclaim-name> persistentvolume=<persistentvolume-name> |
volume_stats_InodesUsed |
ゲージ |
namespace=<persistentvolumeclaim-namespace> persistentvolumeclaim=<persistentvolumeclaim-name> persistentvolume=<persistentvolume-name> |
34.12.4. Prometheus のアンデプロイ
Prometheus をアンデプロイするには、以下のコマンドを実行します。
$ ansible-playbook -vvv -i ${INVENTORY_FILE} playbooks/openshift-prometheus/config.yml -e openshift_prometheus_state=absent
第35章 Web コンソールのカスタマイズ
35.1. 概要
管理者は拡張機能を使用して Web コンソールをカスタマイズできます。拡張機能でスクリプトを実行すると、Web コンソールを読み込む際にカスタムスタイルシートを読み込むことができます。拡張スクリプトによって、Web コンソールのデフォルト動作を上書きし、必要に応じてカスタマイズできます。
たとえば、拡張スクリプトを使用して、自社独自のブランディングを追加したり、自社固有の機能を追加したりすることができます。この使用例として一般的なのは、さまざまな環境のリブランディングやホワイトラベリングです。同じ拡張コードを使用しながら、Web コンソールを変更する設定を指定できます。
Web コンソールのスタイルや動作に対して、以下に記載されていないような広範な変更を実行するには注意が必要です。スクリプトやスタイルシートを追加することはできますが、大幅にカスタマイズすると、今後のバージョンで Web コンソールのマークアップや動作が変更された場合に、アップグレード時に再作業が必要になる可能性があります。
35.2. 拡張スクリプトとスタイルシートの読み込み
OpenShift Container Platform 3.9 では、拡張スクリプトとスタイルシートは、URL がブラウザーからアクセス可能であれば、任意の https://
URL でホストできます。ファイルは、パブリックにアクセスできるルートを使用してプラットフォーム上の Pod からや OpenShift Container Platform 外部の別のサーバー上の Pod からホストできます。
スクリプトとスタイルシートを追加するには、openshift-web-console
namespace で webconsole-config
ConfigMap を編集します。Web コンソール設定は ConfigMap の webconsole-config.yaml
キーにあります。
$ oc edit configmap/webconsole-config -n openshift-web-console
スクリプトを追加するには、extensions.scriptURLs
プロパティーを更新します。値は URL の配列です。
スタイルシートを追加するには、extensions.stylesheetURLs
プロパティーを更新します。値は URL の配列です。
extensions.stylesheetURLs
設定の例
apiVersion: v1 kind: ConfigMap data: webconsole-config.yaml: | apiVersion: webconsole.config.openshift.io/v1 extensions: scriptURLs: - https://example.com/scripts/menu-customization.js - https://example.com/scripts/nav-customization.js stylesheetURLs: - https://example.com/styles/logo.css - https://example.com/styles/custom-styles.css [...]
ConfigMap を保存した後、Web コンソールコンテナーは数分以内に新規の拡張ファイルについて自動的に更新されます。
スクリプトとスタイルシートは正しいコンテンツタイプで提供する必要があります。そうしないと、それらはブラウザーで実行されません。スクリプトは Content-Type: application/javascript
、スタイルシートは Content-Type: text/css
で提供する必要があります。
最良の実践例として、拡張スクリプトを Immediately Invoked Function Expression (IIFE) でラップすることができます。これにより、Web コンソールや他の拡張で使用される名前と競合するグローバル変数を作成することを防ぐことができます。以下は例になります。
(function() { // Put your extension code here... }());
以降のセクションの例では、Web コンソールをカスタマイズする一般的な方法を示します。
拡張の他の例については、GitHub の OpenShift Origin リポジトリーを参照してください。
35.2.1. 拡張プロパティーの設定
特定の拡張について環境ごとに異なるテキストを使用する場合、Web コンソール設定で環境を定義し、同じ拡張スクリプトを環境全体で使用できます。
拡張プロパティーを追加するには、openshift-web-console
namespace で webconsole-config
ConfigMap を 編集します。Web コンソール設定は ConfigMap の webconsole-config.yaml
キーにあります。
$ oc edit configmap/webconsole-config -n openshift-web-console
extensions.properties
の値を更新します。これはキーと値のペアのマップです。
apiVersion: v1 kind: ConfigMap data: webconsole-config.yaml: | apiVersion: webconsole.config.openshift.io/v1 extensions: [...] properties: doc_url: https://docs.openshift.com key1: value1 key2: value2 [...]
これによって、以下のコードが実行された場合と同様に、拡張からアクセスできるグローバル変数が生成されます。
window.OPENSHIFT_EXTENSION_PROPERTIES = { doc_url: "https://docs.openshift.com", key1: "value1", key2: "value2" }
35.3. 外部ロギングソリューションの拡張オプション
OpenShift Container Platform 3.6 には、OpenShift Container Platform の EFK ロギングスタックを使用しなくても外部ロギングソリューションにリンクできる拡張オプションがあります。
'use strict'; angular.module("mylinkextensions", ['openshiftConsole']) .run(function(extensionRegistry) { extensionRegistry.add('log-links', _.spread(function(resource, options) { return { type: 'dom', node: '<span><a href="https://extension-point.example.com">' + resource.metadata.name + '</a><span class="action-divider">|</span></span>' }; })); }); hawtioPluginLoader.addModule("mylinkextensions");
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.4. ガイド付きツアーのカスタマイズと無効化
ユーザーの特定ブラウザーへの初回ログイン時に、ガイド付きツアーが表示されます。新規ユーザーに対して auto_launch
を有効にできます。
window.OPENSHIFT_CONSTANTS.GUIDED_TOURS.landing_page_tour.auto_launch = true;
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.5. ドキュメントリンクのカスタマイズ
ランディングページのドキュメントリンクはカスタマイズできます。window.OPENSHIFT_CONSTANTS.CATALOG_HELP_RESOURCES
はタイトルと href
を含むオブジェクトの配列で、これらはリンクに変換されます。この配列を完全に上書きしたり、追加のリンクをプッシュまたはポップしたり、既存のリンクの属性を変更したりすることができます。以下は例になります。
window.OPENSHIFT_CONSTANTS.CATALOG_HELP_RESOURCES.push({ title: 'Blog', href: 'https://blog.openshift.com' });
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.6. ロゴのカスタマイズ
以下のスタイルでは、Web コンソールヘッダーのロゴを変更します。
#header-logo { background-image: url("https://www.example.com/images/logo.png"); width: 190px; height: 20px; }
example.com URL を実際のイメージへの URL に置換して、幅と高さを調整します。理想的な高さは 20px です。
「拡張スクリプトとスタイルシートの読み込み」で説明されているスタイルシートを追加します。
35.7. メンバーシップのホワイトリストのカスタマイズ
メンバーシップページのデフォルトのホワイトリストには、admin
、basic-user
、edit
などのクラスターロールのサブセットだけでなく、プロジェクト内に定義されているカスタムロールが表示されます。
たとえば、ホワイトリストに、独自のカスタムのクラスターロールセットを追加します。
window.OPENSHIFT_CONSTANTS.MEMBERSHIP_WHITELIST = [ "admin", "basic-user", "edit", "system:deployer", "system:image-builder", "system:image-puller", "system:image-pusher", "view", "custom-role-1", "custom-role-2" ];
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.8. ドキュメントへのリンクの変更
Web コンソールのさまざまなセクションに、外部ドキュメントへのリンクが表示されます。以下の例では、ドキュメントへの指定された 2 つのリンクの URL を変更します。
window.OPENSHIFT_CONSTANTS.HELP['get_started_cli'] = "https://example.com/doc1.html"; window.OPENSHIFT_CONSTANTS.HELP['basic_cli_operations'] = "https://example.com/doc2.html";
または、すべてのドキュメントリンクのベース URL を変更できます。
この例では、デフォルトのヘルプ URL https://example.com/docs/welcome/index.html
が作成されます。
window.OPENSHIFT_CONSTANTS.HELP_BASE_URL = "https://example.com/docs/"; 1
- 1
- パスの末尾は
/
にする必要があります。
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.9. CLI をダウンロードするリンクの追加または変更
Web コンソールの About ページには、コマンドラインインターフェース (CLI) ツールのダウンロードリンクがあります。これらのリンクはリンクテキストと URL の両方を提供して設定でき、それらをファイルパッケージに直接ポイントさせるか、または実際のパッケージを指す外部ページにポイントさせることを選択できます。
ダウンロードできるパッケージを直接ポイントするには、以下を実行します。ここでリンクテキストはパッケージプラットフォームになります。
window.OPENSHIFT_CONSTANTS.CLI = { "Linux (32 bits)": "https://<cdn>/openshift-client-tools-linux-32bit.tar.gz", "Linux (64 bits)": "https://<cdn>/openshift-client-tools-linux-64bit.tar.gz", "Windows": "https://<cdn>/openshift-client-tools-windows.zip", "Mac OS X": "https://<cdn>/openshift-client-tools-mac.zip" };
または、実際のダウンロードパッケージにリンクするページをポイントするには、以下を実行します。ここでは、Latest Release をリンクテキストに指定しています。
window.OPENSHIFT_CONSTANTS.CLI = { "Latest Release": "https://<cdn>/openshift-client-tools/latest.html" };
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.9.1. About ページのカスタマイズ
Web コンソールの About ページをカスタマイズするには、以下の手順に従います。
以下のような拡張を作成します。
angular .module('aboutPageExtension', ['openshiftConsole']) .config(function($routeProvider) { $routeProvider .when('/about', { templateUrl: 'https://example.com/extensions/about/about.html', controller: 'AboutController' }); } ); hawtioPluginLoader.addModule('aboutPageExtension');
カスタムテンプレートを作成します。
使用している OpenShift Container Platform リリースの about.html のバージョンから開始します。テンプレート内には 2 つの angular スコープ変数、
version.master.openshift
およびversion.master.kubernetes
があります。Web コンソールの適切な Cross-Origin Resource Sharing (CORS) 応答ヘッダーを持つ URL でテンプレートをホストします。
-
Web コンソールドメインからの要求を許可するように
Access-Control-Allow-Origin
応答を設定します。 -
GET
を含めるようにAccess-Control-Allow-Methods
を設定します。 -
Content-Type
を含めるようにAccess-Control-Allow-Headers
を設定します。
-
Web コンソールドメインからの要求を許可するように
または、AngularJS $templateCache を使用すると、テンプレートを JavaScript に直接含めることができます。
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.11. 主要アプリケーションの設定
Web コンソールのランディングページカタログには、主要アプリケーションへのリンクの (オプションの) 一覧があります。これらはページ上部近くに表示され、アイコン、タイトル、簡単な説明およびリンクを指定できます。
// Add featured applications to the top of the catalog. window.OPENSHIFT_CONSTANTS.SAAS_OFFERINGS = [{ title: "Dashboard", // The text label icon: "fa fa-dashboard", // The icon you want to appear url: "http://example.com/dashboard", // Where to go when this item is clicked description: "Open application dashboard." // Short description }, { title: "System Status", icon: "fa fa-heartbeat", url: "http://example.com/status", description: "View system alerts and outages." }, { title: "Manage Account", icon: "pficon pficon-user", url: "http://example.com/account", description: "Update email address or password." }];
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.12. カタログカテゴリーの設定
カタログカテゴリーは、Web コンソールカタログのランディングページ内の項目の表示を整理します。各カテゴリーには 1 つ以上のサブカテゴリーがあります。一致するサブカテゴリータグに含まれるタグがある場合、ビルダーイメージ、テンプレート、またはサービスがサブカテゴリーにグループ化されます。また、1 つの項目を複数のサブカテゴリーに表示することができます。カテゴリーとサブカテゴリーは、1 つ以上の項目がある場合にのみ表示されます。
カタログカテゴリーに大幅なカスタマイズを実行すると、ユーザーエクスペリエンスに影響することがあるので、十分に注意して行ってください。既存のカテゴリー項目を変更した場合、今後のアップグレードでこのカスタマイズを更新することが必要になる可能性があります。
// Find the Languages category. var category = _.find(window.OPENSHIFT_CONSTANTS.SERVICE_CATALOG_CATEGORIES, { id: 'languages' }); // Add Go as a new subcategory under Languages. category.subCategories.splice(2,0,{ // Insert at the third spot. // Required. Must be unique. id: "go", // Required. label: "Go", // Optional. If specified, defines a unique icon for this item. icon: "icon-go-gopher", // Required. Items matching any tag will appear in this subcategory. tags: [ "go", "golang" ] }); // Add a Featured category as the first category tab. window.OPENSHIFT_CONSTANTS.SERVICE_CATALOG_CATEGORIES.unshift({ // Required. Must be unique. id: "featured", // Required label: "Featured", subCategories: [ { // Required. Must be unique. id: "go", // Required. label: "Go", // Optional. If specified, defines a unique icon for this item. icon: "icon-go-gopher", // Required. Items matching any tag will appear in this subcategory. tags: [ "go", "golang" ] }, { // Required. Must be unique. id: "jenkins", // Required. label: "Jenkins", // Optional. If specified, defines a unique icon for this item. icon: "icon-jenkins", // Required. Items matching any tag will appear in this subcategory. tags: [ "jenkins" ] } ] });
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.13. クォータ通知メッセージの設定
ユーザーがクォータに達すると、クォータ通知が通知ドロワーに追加されます。カスタムクォータ通知メッセージ (クォータリソースタイプ別) を通知に追加できます。以下は例になります。
Your project is over quota. It is using 200% of 2 cores CPU (Limit). Upgrade to <a href='https://www.openshift.com'>OpenShift Online Pro</a> if you need additional resources.
通知の「Upgrade to…」の部分はカスタムメッセージで、追加リソースへのリンクなどの HTML を指定できます。
クォータメッセージは HTML マークアップなので、特殊文字はすべて HTML 向けに正しくエスケープする必要があります。
window.OPENSHIFT_CONSTANTS.QUOTA_NOTIFICATION_MESSAGE
プロパティーを拡張スクリプトに設定して、各リソースについてメッセージをカスタマイズします。
// Set custom notification messages per quota type/key window.OPENSHIFT_CONSTANTS.QUOTA_NOTIFICATION_MESSAGE = { 'pods': 'Upgrade to <a href="https://www.openshift.com">OpenShift Online Pro</a> if you need additional resources.', 'limits.memory': 'Upgrade to <a href="https://www.openshift.com">OpenShift Online Pro</a> if you need additional resources.' };
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.14. Create From URL namespace ホワイトリストの設定
Create from URL は、明示的に OPENSHIFT_CONSTANTS.CREATE_FROM_URL_WHITELIST
に指定される namespace からのイメージストリームまたはテンプレートとのみ機能します。namespace をホワイトリストに追加するには、以下の手順に従います。
openshift
はデフォルトでホワイトリストに含まれています。これは削除しないでください。
// Add a namespace containing the image streams and/or templates window.OPENSHIFT_CONSTANTS.CREATE_FROM_URL_WHITELIST.push( 'shared-stuff' );
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.15. Copy Login コマンドの無効化
Web コンソールではユーザーは、現在のアクセストークンなどのログインコマンドをユーザーメニューおよび Command Line Tools ページからクリップボードにコピーできます。この機能は、ユーザーのアクセストークンがコピーされたコマンドに含まれないように変更することができます。
// Do not copy the user's access token in the copy login command. window.OPENSHIFT_CONSTANTS.DISABLE_COPY_LOGIN_COMMAND = true;
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.15.1. ワイルドカードルートの有効化
ワイルドカードルートをルーターで有効にした場合、Web コンソールでもワイルドカードルートを有効にできます。これによりユーザーはルートを作成するときに、*.example.com
などのアスタリスクで始まるホスト名を入力できます。ワイルドカードルートを有効にするには、以下を実行します。
window.OPENSHIFT_CONSTANTS.DISABLE_WILDCARD_ROUTES = false;
「拡張スクリプトとスタイルシートの読み込み」で説明されているようにスクリプトを追加します。
35.16. ログインページのカスタマイズ
Web コンソールのログインページおよびログインプロバイダー選択ページも変更できます。以下のコマンドを実行して、変更可能なテンプレートを作成します。
$ oc adm create-login-template > login-template.html $ oc adm create-provider-selection-template > provider-selection-template.html
ファイルを編集して、スタイルを変更するか、または内容を追加します。ただし、波括弧内の必須パラメーターを削除しないよう注意してください。
カスタムログインページまたはプロバイダー選択ページを使用するには、以下のオプションをマスター設定ファイルに設定します。
oauthConfig: ... templates: login: /path/to/login-template.html providerSelection: /path/to/provider-selection-template.html
相対パスは、マスター設定ファイルを基準にして解決されます。この設定を変更したらサーバーを再起動する必要があります。
複数のログインプロバイダーが設定されている場合、または master-config.yaml ファイルの alwaysShowProviderSelection
オプションが true に設定されている場合、OpenShift Container Platform へのユーザーのトークンが期限切れになるたびに、このカスタムページが他のタスクに進む前にユーザーに表示されます。
35.16.1. 使用例
サービス利用規約情報はカスタムログインページを使用して作成できます。このようなページは、GitHub や Google などのサードパーティーログインプロバイダーを使用している場合にも、ユーザーが信頼し、予想できるブランドのページを提示して、その後にユーザーを認証プロバイダーにリダイレクトする際に役立ちます。
35.17. OAuth エラーページのカスタマイズ
認証中にエラーが発生した場合に表示されるページを変更できます。
以下のコマンドを実行して、変更可能なテンプレートを作成します。
$ oc adm create-error-template > error-template.html
ファイルを編集して、スタイルを変更するか、または内容を追加します。
テンプレートで
Error
変数およびErrorCode
変数を使用できます。カスタムエラーページを使用するには、以下のオプションをマスター設定ファイルに設定します。oauthConfig: ... templates: error: /path/to/error-template.html
相対パスは、マスター設定ファイルを基準にして解決されます。
- この設定を変更したらサーバーを再起動する必要があります。
35.18. ログアウト URL の変更
webconsole-config
ConfigMap の clusterInfo.logoutPublicURL
パラメーターを変更すると、コンソールをログアウトしたときにコンソールユーザーに表示される場所を変更できます。
$ oc edit configmap/webconsole-config -n openshift-web-console
以下の例では、ログアウト URL を https://www.example.com/logout
に変更しています。
apiVersion: v1 kind: ConfigMap data: webconsole-config.yaml: | apiVersion: webconsole.config.openshift.io/v1 clusterInfo: [...] logoutPublicURL: "https://www.example.com/logout" [...]
これは、要求ヘッダーおよび OAuth または OpenID アイデンティティープロバイダーで認証する場合に便利です。この場合、外部 URL にアクセスしてシングルサインオンセッションを破棄する必要があるからです。
35.19. Ansible による Web コンソールカスタマイズの設定
通常インストール (Advanced installation) の実行中に、Web コンソールへの多数の変更を以下のパラメーターを使用して設定できます。これらのパラメーターはインベントリーファイルで設定可能です。
Ansible による Web コンソールカスタマイズの例
# Configure `clusterInfo.logoutPublicURL` in the web console configuration # See: https://docs.openshift.com/enterprise/latest/install_config/web_console_customization.html#changing-the-logout-url #openshift_master_logout_url=https://example.com/logout # Configure extension scripts for web console customization # See: https://docs.openshift.com/enterprise/latest/install_config/web_console_customization.html#loading-custom-scripts-and-stylesheets #openshift_web_console_extension_script_urls=['https://example.com/scripts/menu-customization.js','https://example.com/scripts/nav-customization.js'] # Configure extension stylesheets for web console customization # See: https://docs.openshift.com/enterprise/latest/install_config/web_console_customization.html#loading-custom-scripts-and-stylesheets #openshift_web_console_extension_stylesheet_urls=['https://example.com/styles/logo.css','https://example.com/styles/custom-styles.css'] # Configure a custom login template in the master config # See: https://docs.openshift.com/enterprise/latest/install_config/web_console_customization.html#customizing-the-login-page #openshift_master_oauth_templates={'login': '/path/to/login-template.html'} # Configure `clusterInfo.metricsPublicURL` in the web console configuration for cluster metrics. Ansible is also able to configure metrics for you. # See: https://docs.openshift.com/enterprise/latest/install_config/cluster_metrics.html #openshift_master_metrics_public_url=https://hawkular-metrics.example.com/hawkular/metrics # Configure `clusterInfo.loggingPublicURL` in the web console configuration for aggregate logging. Ansible is also able to install logging for you. # See: https://docs.openshift.com/enterprise/latest/install_config/aggregate_logging.html #openshift_master_logging_public_url=https://kibana.example.com
35.20. Web コンソール URL ポートおよび証明書の変更
ユーザーが Web コンソール URL にアクセスする際にカスタム証明書が提供されるようにするには、証明書および URL を master-config.yaml ファイルの namedCertificates
セクションに追加します。詳細は、「Web コンソールまたは CLI のカスタム証明書の設定」を参照してください。
Web コンソールのリダイレクト URL を設定または変更するには、openshift-web-console oauthclient
を変更します。
$ oc edit oauthclient openshift-web-console
ユーザーが適切にリダイレクトされるようにするには、openshift-web-console configmap
の PublicUrls
を更新します。
$ oc edit configmap/webconsole-config -n openshift-web-console
次に、consolePublicURL
の値を更新します。
第36章 外部永続ボリュームプロビジョナーのデプロイ
36.1. 概要
OpenShift Container Platform の AWS EFS の外部プロビジョナーはテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) ではサポートされていません。これらは、機能的に完全でない可能性があり、Red Hat では実稼働環境での使用を推奨していません。これらの機能は、近々発表予定の製品機能をリリースに先駆けてご提供することにより、お客様に機能性をテストし、開発プロセス中にフィードバックをお寄せいただくことができます。Red Hat のテクノロジープレビュー機能のサポートについての詳細は、「Red Hat テクノロジプレビュー機能のサポート範囲」を参照してください。
外部プロビジョナーは、特定のストレージプロバイダーの動的プロビジョニングを可能にするアプリケーションです。外部プロビジョナーは、OpenShift Container Platform が提供するプロビジョナープラグインと共に実行でき、StorageClass オブジェクトの設定と同じ方法で設定されます。この方法は、「動的プロビジョニングとストレージクラスの作成」のセクションで説明しています。これらのプロビジョナーは外部プロビジョナーであるため、OpenShift Container Platform とは独立してデプロイし、更新できます。
36.2. 作業を開始する前に
外部プロビジョナーのデプロイとアップグレードには、Ansible Playbook も使用できます。
「クラスターメトリクスの設定」と「クラスターロギングの設定」のセクションに十分に理解してから、先に進むようにしてください。
36.2.1. 外部プロビジョナーの Ansible ロール
OpenShift Ansible openshift_provisioners
ロールは Ansible インベントリーファイルからの変数を使用して、外部プロビジョナーを設定し、デプロイします。それぞれの install
変数を true
に上書きして、インストールするプロビジョナーを指定する必要があります。
36.2.2. 外部プロビジョナーの Ansible 変数
以下は、install
変数が true
で、すべてのプロビジョナーに適用されるロール変数の一覧です。
変数 | 説明 |
---|---|
|
|
|
コンポーネントイメージのプレフィックス。たとえば |
|
コンポーネントイメージのバージョン。たとえば |
|
プロビジョナーのデプロイ先のプロジェクト。デフォルトは |
36.2.3. AWS EFS プロビジョナーの Ansible 変数
AWS EFS プロビジョナーは、所定の EFS ファイルシステムのディレクトリーに動的に作成されたディレクトリーを基盤とする NFS PV を動的にプロビジョニングします。AWS EFS プロビジョナー Ansible 変数を設定するには、以下の要件を満たす必要があります。
- AmazonElasticFileSystemReadOnlyAccess ポリシー (またはこれ以上) を割り当てられた IAM ユーザー。
- クラスターリージョン内の EFS ファイルシステム。
- 任意のノード (クラスターのリージョン内の任意のゾーン) がファイルシステムの DNS 名で EFS ファイルシステムをマウントできる、マウントターゲットとセキュリティーグループ。
変数 | 説明 |
---|---|
|
EFS ファイルシステムのファイルシステム ID。例: |
|
EFS ファイルシステムの Amazon EC2 リージョン |
|
IAM ユーザーの AWS アクセスキー (指定された EFS ファイルシステムが存在するかチェックする) |
|
IAM ユーザーの AWS シークレットアクセスキー (指定された EFS ファイルシステムが存在するかチェックする) |
変数 | 説明 |
---|---|
|
|
|
EFS ファイルシステム内のディレクトリーのパスで、ここで EFS プロビジョナーがディレクトリーを作成して、作成する各 PV をサポートします。これは存在している必要があり、EFS プロビジョナーでマウントできる必要があります。デフォルトは |
|
StorageClass で指定する |
|
Pod が配置されるノードを選択するラベルのマップ。例: |
|
EFS ファイルシステムへの書き込みパーミッションのために必要な場合の、Pod に指定する補助グループ。デフォルトは |
36.3. プロビジョナーのデプロイ
OpenShift Ansible 変数で指定される設定に従って、すべてのプロビジョナーを同時にデプロイすることも、プロビジョナーを 1 つずつデプロイすることもできます。以下の例では、指定されたプロビジョナーをデプロイして、対応する StorageClass を作成し、設定する方法を示します。
36.3.1. AWS EFS プロビジョナーのデプロイ
以下のコマンドは、EFS ボリューム内のディレクトリーを /data/persistentvolumes
に設定します。このディレクトリーはファイルシステム内に存在している必要があり、プロビジョナー Pod によってマウントや書き込みができる必要があります。
$ ansible-playbook -v -i <inventory_file> \ /usr/share/ansible/openshift-ansible/playbooks/openshift-provisioners/config.yml \ -e openshift_provisioners_install_provisioners=True \ -e openshift_provisioners_efs=True \ -e openshift_provisioners_efs_fsid=fs-47a2c22e \ -e openshift_provisioners_efs_region=us-west-2 \ -e openshift_provisioners_efs_aws_access_key_id=AKIAIOSFODNN7EXAMPLE \ -e openshift_provisioners_efs_aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY \ -e openshift_provisioners_efs_path=/data/persistentvolumes
36.3.1.1. AWS EFS オブジェクト定義
aws-efs-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1beta1 metadata: name: slow provisioner: openshift.org/aws-efs 1 parameters: gidMin: "40000" 2 gidMax: "50000" 3
動的にプロビジョニングされた各ボリュームに対応する NFS ディレクトリーには、gidMin
から gidMax
の範囲に一意の GID 所有者が割り当てられます。指定されない場合、デフォルトで gidMin
は2000
、gidMax
は 2147483647
になります。要求によってプロビジョニングされるボリュームを使用するすべての Pod は、必要な GID を補助グループとして自動的に実行され、ボリュームの読み取り/書き込みができます。補助グループを持たない (かつルートとして実行されていない) 他のマウンターは、ボリュームの読み取り/書き込みはできません。補助グループを使用して NFS アクセスを管理する方法については、「グループ ID」セクションの NFS ボリュームセキュリティーのトピックを参照してください。
36.4. クリーンアップ
以下のコマンドを実行すると、OpenShift Ansible openshift_provisioners
ロールによってデプロイされたものをすべて削除できます。
$ ansible-playbook -v -i <inventory_file> \ /usr/share/ansible/openshift-ansible/playbooks/openshift-provisioners/config.yml \ -e openshift_provisioners_install_provisioners=False
Legal Notice
Copyright © 2024 Red Hat, Inc.
OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).
Modified versions must remove all Red Hat trademarks.
Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.
Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.