3.6. 入力シークレットおよび config map
入力シークレットおよび config map のコンテンツがビルドの出力コンテナーイメージに表示されないようにするには、Docker build と source-to-image build ストラテジーでビルドボリュームを使用します。
シナリオによっては、ビルド操作で、依存するリソースにアクセスするための認証情報や他の設定データが必要になる場合がありますが、この情報をソースコントロールに配置するのは適切ではありません。この場合は、入力シークレットおよび入力 config map を定義することができます。
たとえば、Maven を使用して Java アプリケーションをビルドする場合、プライベートキーを使用してアクセスされる Maven Central または JCenter のプライベートミラーをセットアップできます。そのプライベートミラーからライブラリーをダウンロードするには、以下を指定する必要があります。
-
ミラーの URL および接続の設定が含まれる
settings.xmlファイル。 -
~/.ssh/id_rsaなどの、設定ファイルで参照されるプライベートキー。
セキュリティー上の理由により、認証情報はアプリケーションイメージで公開しないでください。
以下の例は Java アプリケーションを説明していますが、/etc/ssl/certs ディレクトリー、API キーまたはトークン、ラインセンスファイルなどに SSL 証明書を追加する場合に同じ方法を使用できます。
3.6.1. シークレットの概要 リンクのコピーリンクがクリップボードにコピーされました!
Secret オブジェクトタイプはパスワード、OpenShift Container Platform クライアント設定ファイル、dockercfg ファイル、プライベートソースリポジトリーの認証情報などの機密情報を保持するメカニズムを提供します。シークレットは機密内容を Pod から切り離します。シークレットはボリュームプラグインを使用してコンテナーにマウントすることも、システムが Pod の代わりにシークレットを使用して各種アクションを実行することもできます。
YAML シークレットオブジェクト定義
- 1
- シークレットにキー名および値の構造を示しています。
- 2
dataフィールドでキーに使用できる形式は、Kubernetes identifiers glossary のDNS_SUBDOMAIN値のガイドラインに従う必要があります。- 3
dataマップのキーに関連付けられる値は base64 でエンコーディングされている必要があります。- 4
stringDataマップのエントリーが base64 に変換され、このエントリーは自動的にdataマップに移動します。このフィールドは書き込み専用です。値はdataフィールドによってのみ返されます。- 5
stringDataマップのキーに関連付けられた値は単純なテキスト文字列で構成されます。
3.6.1.1. シークレットのプロパティー リンクのコピーリンクがクリップボードにコピーされました!
キーのプロパティーには以下が含まれます。
- シークレットデータはその定義とは別に参照できます。
- シークレットデータのボリュームは一時ファイルストレージ機能 (tmpfs) でサポートされ、ノードで保存されることはありません。
- シークレットデータは namespace 内で共有できます。
3.6.1.2. シークレットの種類 リンクのコピーリンクがクリップボードにコピーされました!
type フィールドの値で、シークレットのキー名と値の構造を指定します。このタイプを使用して、シークレットオブジェクトにユーザー名とキーの配置を実行できます。検証の必要がない場合には、デフォルト設定の opaque タイプを使用してください。
以下のタイプから 1 つ指定して、サーバー側で最小限の検証をトリガーし、シークレットデータに固有のキー名が存在することを確認します。
-
kubernetes.io/service-account-token。サービスアカウントトークンを使用します。 -
kubernetes.io/dockercfg.必須の Docker 認証には.dockercfgファイルを使用します。 -
kubernetes.io/dockerconfigjson.必須の Docker 認証には.docker/config.jsonファイルを使用します。 -
kubernetes.io/basic-auth.Basic 認証で使用します。 -
kubernetes.io/ssh-auth.SSH キー認証で使用します。 -
kubernetes.io/tls.TLS 認証局で使用します。
検証の必要がない場合には type= Opaque と指定します。これは、シークレットがキー名または値の規則に準拠しないという意味です。opaque シークレットでは、任意の値を含む、体系化されていない key:value ペアも利用できます。
example.com/my-secret-type などの他の任意のタイプを指定できます。これらのタイプはサーバー側では実行されませんが、シークレットの作成者がその種類のキー/値の要件に従う意図があることを示します。
3.6.1.3. シークレットの更新 リンクのコピーリンクがクリップボードにコピーされました!
シークレットの値を変更する場合、すでに実行されている Pod で使用される値は動的に変更されません。シークレットを変更するには、元の Pod を削除してから新規の Pod を作成する必要があります (同じ PodSpec を使用する場合があります)。
シークレットの更新は、新規コンテナーイメージのデプロイと同じワークフローで実行されます。kubectl rolling-update コマンドを使用できます。
シークレットの resourceVersion 値は参照時に指定されません。したがって、シークレットが Pod の起動と同じタイミングで更新される場合、Pod に使用されるシークレットのバージョンは定義されません。
現時点で、Pod の作成時に使用されるシークレットオブジェクトのリソースバージョンを確認することはできません。コントローラーが古い resourceVersion を使用して Pod を再起動できるように、Pod がこの情報を報告できるようにすることが予定されています。それまでは既存シークレットのデータを更新せずに別の名前で新規のシークレットを作成します。
3.6.2. シークレットの作成 リンクのコピーリンクがクリップボードにコピーされました!
シークレットに依存する Pod を作成する前に、シークレットを作成する必要があります。
シークレットの作成時に以下を実行します。
- シークレットデータでシークレットオブジェクトを作成します。
- Pod のサービスアカウントをシークレットの参照を許可するように更新します。
-
シークレットを環境変数またはファイルとして使用する Pod を作成します (
secretボリュームを使用)。
手順
JSON または YAML ファイルからシークレットオブジェクトを作成するには、次のコマンドを入力します。
oc create -f <filename>
$ oc create -f <filename>Copy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、ローカルの
.docker/config.jsonファイルからシークレットを作成できます。oc create secret generic dockerhub \ --from-file=.dockerconfigjson=<path/to/.docker/config.json> \ --type=kubernetes.io/dockerconfigjson$ oc create secret generic dockerhub \ --from-file=.dockerconfigjson=<path/to/.docker/config.json> \ --type=kubernetes.io/dockerconfigjsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドにより、
dockerhubという名前のシークレットの JSON 仕様が生成され、オブジェクトが作成されます。YAML の不透明なシークレットオブジェクトの定義
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- opaque シークレットを指定します。
Docker 設定の JSON ファイルシークレットオブジェクトの定義
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6.3. シークレットの使用 リンクのコピーリンクがクリップボードにコピーされました!
シークレットの作成後に、Pod を作成してシークレットを参照し、ログを取得し、Pod を削除することができます。
手順
次のコマンドを入力して、シークレットを参照する Pod を作成します。
oc create -f <your_yaml_file>.yaml
$ oc create -f <your_yaml_file>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを入力してログを取得します。
oc logs secret-example-pod
$ oc logs secret-example-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを入力して Pod を削除します。
oc delete pod secret-example-pod
$ oc delete pod secret-example-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6.4. 入力シークレットおよび config map の追加 リンクのコピーリンクがクリップボードにコピーされました!
認証情報およびその他の設定データをソース管理に配置せずにビルドに提供するには、入力シークレットおよび入力 config map を定義します。
シナリオによっては、ビルド操作で、依存するリソースにアクセスするための認証情報や他の設定データが必要になる場合があります。この情報をソース管理に配置せずに利用可能にするには、入力シークレットおよび入力 config map を定義します。
手順
既存の BuildConfig オブジェクトに入力シークレットおよび/または config map を追加するには、以下を行います。
ConfigMapオブジェクトが存在しない場合は、次のコマンドを入力して作成します。oc create configmap settings-mvn \ --from-file=settings.xml=<path/to/settings.xml>$ oc create configmap settings-mvn \ --from-file=settings.xml=<path/to/settings.xml>Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、
settings-mvnという名前の新しい config map が作成されます。これには、settings.xmlファイルのプレーンテキストのコンテンツが含まれます。ヒントまたは、以下の YAML を適用して config map を作成できます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Secretオブジェクトが存在しない場合は、次のコマンドを入力して作成します。oc create secret generic secret-mvn \ --from-file=ssh-privatekey=<path/to/.ssh/id_rsa> \ --type=kubernetes.io/ssh-auth$ oc create secret generic secret-mvn \ --from-file=ssh-privatekey=<path/to/.ssh/id_rsa> \ --type=kubernetes.io/ssh-authCopy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、
secret-mvnという名前の新規シークレットが作成されます。これには、id_rsaプライベートキーの base64 でエンコードされたコンテンツが含まれます。ヒントまたは、以下の YAML を適用して入力シークレットを作成できます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow config map およびシークレットを既存の
BuildConfigオブジェクトのsourceセクションに追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow シークレットおよび config map を新規の
BuildConfigオブジェクトに追加するには、以下のコマンドを実行します。oc new-build \ openshift/wildfly-101-centos7~https://github.com/wildfly/quickstart.git \ --context-dir helloworld --build-secret “secret-mvn” \ --build-config-map "settings-mvn"$ oc new-build \ openshift/wildfly-101-centos7~https://github.com/wildfly/quickstart.git \ --context-dir helloworld --build-secret “secret-mvn” \ --build-config-map "settings-mvn"Copy to Clipboard Copied! Toggle word wrap Toggle overflow ビルド中に、ビルドプロセスは、
settings.xmlファイルとid_rsaファイルをソースコードが配置されているディレクトリーにコピーします。OpenShift Container Platform S2I ビルダーイメージでは、これはイメージの作業ディレクトリーで、DockerfileのWORKDIRの指示を使用して設定されます。別のディレクトリーを指定するには、destinationDirを定義に追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを入力して、新しい
BuildConfigオブジェクトを作成するときに、宛先ディレクトリーを指定することもできます。oc new-build \ openshift/wildfly-101-centos7~https://github.com/wildfly/quickstart.git \ --context-dir helloworld --build-secret “secret-mvn:.ssh” \ --build-config-map "settings-mvn:.m2"$ oc new-build \ openshift/wildfly-101-centos7~https://github.com/wildfly/quickstart.git \ --context-dir helloworld --build-secret “secret-mvn:.ssh” \ --build-config-map "settings-mvn:.m2"Copy to Clipboard Copied! Toggle word wrap Toggle overflow いずれの場合も、
settings.xmlファイルがビルド環境の./.m2ディレクトリーに追加され、id_rsaキーは./.sshディレクトリーに追加されます。
3.6.5. Source-to-Image ストラテジー リンクのコピーリンクがクリップボードにコピーされました!
Source ストラテジーを使用すると、定義された入力シークレットはすべて、適切な destinationDir にコピーされます。destinationDir を空にすると、シークレットはビルダーイメージの作業ディレクトリーに配置されます。
destinationDir が相対パスの場合に同じルールが使用されます。シークレットは、イメージの作業ディレクトリーに相対的なパスに配置されます。destinationDir パスの最終ディレクトリーは、ビルダーイメージにない場合に作成されます。destinationDir の先行するすべてのディレクトリーは存在している必要があり、そうでない場合にはエラーが生じます。
入力シークレットは全ユーザーに書き込み権限が割り当てられた状態で追加され (0666 のパーミッション)、assemble スクリプトの実行後には、サイズが 0 になるように切り捨てられます。つまり、シークレットファイルは作成されたイメージ内に存在しますが、セキュリティーの理由で空になります。
入力 config map は、assemble スクリプトの実行後に切り捨てられません。
3.6.6. Docker ストラテジー リンクのコピーリンクがクリップボードにコピーされました!
docker ストラテジーを使用すると、Dockerfile で ADD および COPY の命令 を使用してコンテナーイメージに定義されたすべての入力シークレットを追加できます。
シークレットの destinationDir を指定しない場合は、ファイルは、Dockerfile が配置されているのと同じディレクトリーにコピーされます。相対パスを destinationDir として指定する場合は、シークレットは、Dockerfile の場所と相対的なディレクトリーにコピーされます。これにより、ビルド時に使用するコンテキストディレクトリーの一部として、Docker ビルド操作でシークレットファイルが利用できるようになります。
シークレットおよび config map データを参照する Dockerfile の例
通常はシークレットがイメージから実行するコンテナーに置かれないように、入力シークレットを最終的なアプリケーションイメージから削除します。ただし、シークレットは追加される階層のイメージ自体に存在します。この削除は、Dockerfile の一部として組み込まれます。
入力シークレットおよび config map のコンテンツがビルド出力コンテナーイメージに表示されないようにして、この削除プロセスを完全に回避するには、代わりに Docker ビルドストラテジーで ビルドボリュームを使用 します。
3.6.7. カスタムストラテジー リンクのコピーリンクがクリップボードにコピーされました!
Custom ストラテジーを使用する場合、定義された入力シークレットおよび config map はすべて、/var/run/secrets/openshift.io/build ディレクトリー内のビルダーコンテナーで入手できます。カスタムのビルドイメージは、これらのシークレットおよび config map を適切に使用する必要があります。Custom ストラテジーでは、Custom ストラテジーのオプションで説明されているようにシークレットを定義できます。
既存のストラテジーのシークレットと入力シークレットには違いはありません。ただし、ビルダーイメージはこれらを区別し、ビルドのユースケースに基づいてこれらを異なる方法で使用する場合があります。
入力シークレットは常に /var/run/secrets/openshift.io/build ディレクトリーにマウントされます。そうでない場合には、ビルダーが完全なビルドオブジェクトを含む $BUILD 環境変数を解析できます。
レジストリーのプルシークレットが namespace とノードの両方に存在する場合、ビルドがデフォルトで namespace でのプルシークレットの使用に設定されます。