Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

第15章 Pod の Preset (プリセット) を使用した情報の Pod への挿入

15.1. 概要

Pod の Preset は、ユーザーが指定する情報を Pod の作成時に Pod に挿入するオブジェクトです。

重要

OpenShift Container Platform 3.7 の時点で、Pod の Preset はサポートされなくなりました。

挿入可能な Pod の Preset オブジェクトを使用します。

すべての情報を 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.yamlPod 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: {}

1
settings.k8s.io/v1alpha1 API を指定します。
2
Pod の Preset の名前です。この名前は Pod のアノテーションで使用されます。
3
Pod 仕様のラベルに一致するラベルセレクターです。
4 5
コンテナーに渡す環境変数を作成します。
6
ConfigMap を Pod 仕様に追加します。
7
シークレットオブジェクトを Pod 仕様に追加します。
8
外部ストレージボリュームをコンテナー内にマウントするかどうかを指定します。
9
コンテナーが利用できるストレージボリュームを定義します。

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: {}

1
Pod 仕様が変更を禁止するように設定されていない場合に、Pod の Preset が挿入されたことを示すアノテーションが追加されます。
2
ボリュームマウントが Pod に追加されます。
3
環境変数が Pod に追加されます。
4
ConfigMap およびシークレットオブジェクトが Pod に追加されます。
5
ボリュームマウントが Pod に追加されます。

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 を作成します。

  1. 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
  2. Pod を作成します。

    $ oc create -f pod.yaml
  3. 作成後に 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: {}
    1 2 3
    アノテーションが含まれており、コンテナーのストレージおよび環境変数が挿入されています。

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: {}
    1 2
    複数の Pod の Preset が挿入されたことを示すアノテーションです。

15.4. Pod の Preset の削除

以下のコマンドを使用して Pod の Preset を削除できます。

$ oc delete podpreset <name>

以下に例を示します。

$ oc delete podpreset allow-database

podpreset "allow-database" deleted