第15章 Pod の Preset (プリセット) を使用した情報の Pod への挿入
15.1. 概要
Pod の Preset は、ユーザーが指定する情報を Pod の作成時に Pod に挿入するオブジェクトです。
OpenShift Container Platform 3.7 の時点で、Pod の Preset はサポートされなくなりました。
挿入可能な Pod の Preset オブジェクトを使用します。
- シークレットオブジェクト
-
ConfigMap
オブジェクト - ストレージボリューム
- コンテナーボリュームのマウント
- 環境変数
すべての情報を Pod に追加する場合には、開発者は Pod ラベルが PodPreset のラベルセレクターに一致することだけ確認してください。Pod の「ラベル」は、「ラベルセレクター」が一致する Pod Preset オブジェクト 1 つまたは複数に Pod を関連付けます。
Pod の Preset を使用すると、開発者は Pod が使用するサービスについての詳細を知らなくても Pod をプロビジョニングできます。管理者は、開発者による Pod のデプロイを阻むことなくサービスの設定項目を開発者に対して非表示にできます。たとえば、管理者はシークレットでデータベースの名前、ユーザー名、およびパスワードを提供し、環境変数でデータベースポートを提供する Pod の Preset を作成できます。Pod の開発者はすべての情報を Pod に組み込むために使用するラベルのみを把握している必要があります。さらに開発者も Pod の Preset を作成して同じタスクを実行することができます。たとえば開発者は、環境変数を複数 Pod に自動的に挿入する Preset を作成できます。
Pod の Preset が Pod に適用されると、OpenShift Container Platform は Pod 仕様を変更し、挿入可能なデータを追加し、Pod の Preset で変更されたことを示すアノテーションを Pod 仕様に付けます。アノテーションの形式は以下のようになります。
podpreset.admission.kubernetes.io/<pod-preset name>: `resource version`
クラスターで Pod の Preset を使用するには、以下を実行します。
- 管理者は /etc/origin/master/master-config.yaml で Pod Preset 受付コントローラープラグインを有効にする必要があります。
-
Pod の Preset の作成者は Pod の Preset で API タイプ
settings.k8s.io/v1alpha1/podpreset
を有効にし、挿入可能な情報を Pod の Preset に追加する必要があります。
Pod の作成時にエラーが生じる場合は、Pod の Preset から挿入されたリソースなしに Pod が作成されている場合です。
Pod 仕様で podpreset.admission.kubernetes.io/exclude: "true"
パラメーターを使用することで、Pod の Preset の変更があっても特定の Pod が変更されないようにすることができます。以下の Pod 仕様の例を参照してください。
Pod の Preset 機能は、「サービスカタログ」がインストールされている場合にのみ利用できます。
Pod の Preset オブジェクトの例
kind: PodPreset apiVersion: settings.k8s.io/v1alpha1 1 metadata: name: allow-database 2 spec: selector: matchLabels: role: frontend 3 env: - name: DB_PORT 4 value: "6379" 5 envFrom: - configMapRef: 6 name: etcd-env-config - secretKeyRef: 7 name: test-secret volumeMounts: 8 - mountPath: /cache name: cache-volume volumes: 9 - name: cache-volume emptyDir: {}
Pod 仕様の例
apiVersion: v1
kind: Pod
metadata:
name: website
labels:
app: website
role: frontend 1
spec:
containers:
- name: website
image: ecorp/website
ports:
- containerPort: 80
- 1
- Pod の Preset のラベルセレクターに一致するラベルです。
Pod の Preset 適用後の Pod 仕様の例
apiVersion: v1 kind: Pod metadata: name: website labels: app: website role: frontend annotations: podpreset.admission.kubernetes.io/allow-database: "resource version" 1 spec: containers: - name: website image: ecorp/website volumeMounts: 2 - mountPath: /cache name: cache-volume ports: - containerPort: 80 env: 3 - name: DB_PORT value: "6379" envFrom: 4 - configMapRef: name: etcd-env-config - secretKeyRef: name: test-secret volumes: 5 - name: cache-volume emptyDir: {}
Pod を Pod の Preset から除外する Pod 仕様の例
apiVersion: v1
kind: Pod
metadata:
name: no-podpreset
labels:
app: website
role: frontend
annotations:
podpreset.admission.kubernetes.io/exclude: "true" 1
spec:
containers:
- name: hello-pod
image: docker.io/ocpqe/hello-pod
- 1
- Pod の Preset 機能がこの Pod を挿入できないようにするにはこのパラメーターを追加します。
15.2. Pod の Preset の作成
以下の例は、Pod の Preset を作成し、使用する方法を示しています。
- 受付コントローラーの追加
- 管理者は /etc/origin/master/master-config.yaml ファイルをチェックして Pod の Preset 受付コントローラープラグインがあることを確認します。受付コントローラーがない場合、以下を使用してプラグインを追加します。
admissionConfig: pluginConfig: PodPreset: configuration: kind: DefaultAdmissionConfig apiVersion: v1 disable: false
次に OpenShift Container Platform サービスを再起動します。
# master-restart api # master-restart controllers
- Pod の Preset の作成
-
管理者または開発者は、
settings.k8s.io/v1alpha1
API、挿入する情報および Pod に一致するラベルセレクターを使用して Pod の Preset を作成します。
kind: PodPreset apiVersion: settings.k8s.io/v1alpha1 metadata: name: allow-database spec: selector: matchLabels: role: frontend env: - name: DB_PORT value: "6379" volumeMounts: - mountPath: /cache name: cache-volume volumes: - name: cache-volume emptyDir: {}
- Pod の作成
開発者は Pod の Preset のラベルセレクターに一致するラベルを使って Pod を作成します。
Pod の Preset のラベルセレクターに一致するラベルで標準的な Pod 仕様を作成します。
apiVersion: v1 kind: Pod metadata: name: website labels: app: website role: frontend spec: containers: - name: website image: ecorp/website ports: - containerPort: 80
Pod を作成します。
$ oc create -f pod.yaml
作成後に Pod 仕様をチェックします。
$ oc get pod website -o yaml apiVersion: v1 kind: Pod metadata: name: website labels: app: website role: frontend annotations: podpreset.admission.kubernetes.io/allow-database: "resource version" 1 spec: containers: - name: website image: ecorp/website volumeMounts: 2 - mountPath: /cache name: cache-volume ports: - containerPort: 80 env: 3 - name: DB_PORT value: "6379" volumes: - name: cache-volume emptyDir: {}
15.3. 複数の Pod の Preset の使用
複数の Pod 挿入ポリシーを挿入するために複数の Pod の Preset を使用することができます。
- Pod の Preset 受付コントローラープラグインが有効にされていることを確認します。
環境変数、マウントポイントおよび/またはストレージボリュームを使用して、以下のような Pod の Preset を作成します。
kind: PodPreset apiVersion: settings.k8s.io/v1alpha1 metadata: name: allow-database spec: selector: matchLabels: role: frontend 1 env: - name: DB_PORT value: "6379" volumeMounts: - mountPath: /cache name: cache-volume volumes: - name: cache-volume emptyDir: {}
- 1
- Pod ラベルに一致するラベルセレクターです。
以下のように 2 つ目の Pod の Preset を作成します。
kind: PodPreset apiVersion: settings.k8s.io/v1alpha1 metadata: name: proxy spec: selector: matchLabels: role: frontend 1 volumeMounts: - mountPath: /etc/proxy/configs name: proxy-volume volumes: - name: proxy-volume emptyDir: {}
- 1
- Pod ラベルに一致するラベルセレクターです。
標準的な Pod 仕様を作成します。
apiVersion: v1 kind: Pod metadata: name: website labels: app: website role: frontend 1 spec: containers: - name: website image: ecorp/website ports: - containerPort: 80
- 1
- Pod の Preset ラベルセレクターのいずれにも一致するラベルです。
Pod を作成します。
$ oc create -f pod.yaml
作成後に Pod 仕様をチェックします。
apiVersion: v1 kind: Pod metadata: name: website labels: app: website role: frontend annotations: podpreset.admission.kubernetes.io/allow-database: "resource version" 1 podpreset.admission.kubernetes.io/proxy: "resource version" 2 spec: containers: - name: website image: ecorp/website volumeMounts: - mountPath: /cache name: cache-volume - mountPath: /etc/proxy/configs name: proxy-volume ports: - containerPort: 80 env: - name: DB_PORT value: "6379" volumes: - name: cache-volume emptyDir: {} - name: proxy-volume emptyDir: {}
15.4. Pod の Preset の削除
以下のコマンドを使用して Pod の Preset を削除できます。
$ oc delete podpreset <name>
以下に例を示します。
$ oc delete podpreset allow-database podpreset "allow-database" deleted