8.7. テンプレートの作成

アプリケーションの全オブジェクトを簡単に再作成するために、新規テンプレートを定義できます。テンプレートでは、作成するオブジェクトと、これらのオブジェクトの作成をガイドするメタデータを定義します。

以下は、単純なテンプレートオブジェクト定義 (YAML) の例です。

apiVersion: v1
kind: Template
metadata:
  name: redis-template
  annotations:
    description: "Description"
    iconClass: "icon-redis"
    tags: "database,nosql"
objects:
- apiVersion: v1
  kind: Pod
  metadata:
    name: redis-master
  spec:
    containers:
    - env:
      - name: REDIS_PASSWORD
        value: ${REDIS_PASSWORD}
      image: dockerfile/redis
      name: master
      ports:
      - containerPort: 6379
        protocol: TCP
parameters:
- description: Password used for Redis authentication
  from: '[A-Z0-9]{8}'
  generate: expression
  name: REDIS_PASSWORD
labels:
  redis: master

8.7.1. テンプレート記述の作成

テンプレートの記述により、テンプレートの内容に関する情報を提供でき、Web コンソールでの検索時に役立ちます。テンプレート名以外のメタデータは任意ですが、使用できると便利です。メタデータには、一般的な説明などの情報以外にタグのセットも含まれます。便利なタグにはテンプレートで使用する言語名などがあります (例: javaphpruby)。

以下は、テンプレート記述メタデータの例です。

kind: Template
apiVersion: v1
metadata:
  name: cakephp-mysql-example 1
  annotations:
    openshift.io/display-name: "CakePHP MySQL Example (Ephemeral)" 2
    description: >-
      An example CakePHP application with a MySQL database. For more information
      about using this template, including OpenShift considerations, see
      https://github.com/sclorg/cakephp-ex/blob/master/README.md.


      WARNING: Any data stored will be lost upon pod destruction. Only use this
      template for testing." 3
    openshift.io/long-description: >-
      This template defines resources needed to develop a CakePHP application,
      including a build configuration, application DeploymentConfig, and
      database DeploymentConfig.  The database is stored in
      non-persistent storage, so this configuration should be used for
      experimental purposes only. 4
    tags: "quickstart,php,cakephp" 5
    iconClass: icon-php 6
    openshift.io/provider-display-name: "Red Hat, Inc." 7
    openshift.io/documentation-url: "https://github.com/sclorg/cakephp-ex" 8
    openshift.io/support-url: "https://access.redhat.com" 9
message: "Your admin credentials are ${ADMIN_USERNAME}:${ADMIN_PASSWORD}" 10
1
テンプレートの一意の名前。
2
ユーザーインターフェースで利用できるように、ユーザーに分かりやすく、簡単な名前。
3
テンプレートの説明。デプロイされる内容、デプロイ前に知っておく必要のある注意点をユーザーが理解できるように詳細を追加します。README ファイルなど、追加情報へのリンクも追加できます。パラグラフを作成するには、改行を追加できます。
4
追加の説明。たとえば、サービスカタログに表示されます。
5
検索およびグループ化を実行するためにテンプレートに関連付けられるタグ。これを指定されるカタログカテゴリーのいずれかに組み込むタグを追加します。コンソールの定数ファイルの CATALOG_CATEGORIESid および categoryAliases を参照してください。カテゴリーはクラスター全体に対してカスタマイズすることもできます。
6
Web コンソールでテンプレートと一緒に表示されるアイコン。可能な場合は、既存のロゴアイコンから選択します。また、FontAwesome からもアイコンを使用できます。または、テンプレートを使用する OpenShift Container Platform クラスターに CSS カスタマイズを追加できるので、CSS カスタマイズ経由でアイコンを提供します。存在するアイコンクラスを指定するようにしてください。 指定しないと、汎用アイコンにフォールバックできなくなります。
7
テンプレートを提供する人または組織の名前
8
テンプレートに関する他のドキュメントを参照する URL
9
テンプレートに関するサポートを取得できる URL
10
テンプレートがインスタンス化された時に表示される説明メッセージ。このフィールドで、新規作成されたリソースの使用方法をユーザーに通知します。生成された認証情報や他のパラメーターを出力に追加できるように、メッセージの表示前にパラメーターの置換が行われます。ユーザーが従うべき次の手順が記載されたドキュメントへのリンクを追加してください。

8.7.2. テンプレートラベルの作成

テンプレートにはラベルのセットを追加できます。これらのラベルは、テンプレートがインスタンス化される時に作成されるオブジェクトごとに追加します。このようにラベルを定義すると、特定のテンプレートから作成された全オブジェクトの検索、管理が簡単になります。

以下は、テンプレートオブジェクトのラベルの例です。

kind: "Template"
apiVersion: "v1"
...
labels:
  template: "cakephp-mysql-example" 1
  app: "${NAME}" 2
1
このテンプレートから作成する全オブジェクトに適用されるラベル
2
パラメーター化されたラベル。このラベルは、このテンプレートを基に作成された全オブジェクトに適用されます。パラメーターは、ラベルキーおよび値の両方で拡張されます。

8.7.3. テンプレートパラメーターの作成

パラメーターにより、テンプレートがインスタンス化される時に値を生成するか、ユーザーが値を指定できるようになります。パラメーターが参照されると、値が置換されます。参照は、オブジェクト一覧フィールドであればどこでも定義できます。これは、無作為にパスワードを作成したり、テンプレートのカスタマイズに必要なユーザー固有の値やホスト名を指定したりできるので便利です。パラメーターは、2 種類の方法で参照可能です。

  • 文字列の値として、テンプレートの文字列フィールドに ${PARAMETER_NAME} の形式で配置する
  • json/yaml の値として、テンプレートのフィールドに ${{PARAMETER_NAME}} の形式で配置する

${PARAMETER_NAME} 構文を使用すると、複数のパラメーター参照を 1 つのフィールドに統合でき、"http://${PARAMETER_1}${PARAMETER_2}" などのように、参照を固定データ内に埋め込むことができます。どちらのパラメーター値も置換されて、引用された文字列が最終的な値になります。

${{PARAMETER_NAME}} 構文のみを使用する場合は、単一のパラメーター参照のみが許可され、先頭文字や終了文字は使用できません。結果の値は、置換後に結果が有効な json オブジェクトの場合は引用されません。結果が有効な json 値でない場合に、結果の値は引用され、標準の文字列として処理されます。

単一のパラメーターは、テンプレート内で複数回参照でき、1 つのテンプレート内で両方の置換構文を使用して参照することができます。

デフォルト値を指定でき、ユーザーが別の値を指定していない場合に使用されます。

以下は、明示的な値をデフォルト値として設定する例です。

parameters:
  - name: USERNAME
    description: "The user name for Joe"
    value: joe

パラメーター値は、パラメーター定義に指定したルールを基に生成することも可能です。 以下は、パラメーター値の生成例です。

parameters:
  - name: PASSWORD
    description: "The random user password"
    generate: expression
    from: "[a-zA-Z0-9]{12}"

上記の例では、処理後に、英字の大文字、小文字、数字すべてを含む 12 文字長のパスワードが無作為に作成されます。

利用可能な構文は、完全な正規表現構文ではありません。ただし、\w\d、および \a 修飾子を使用できます。

  • [\w]{10} は、10 桁の英字、数字、およびアンダースコアを生成します。これは PCRE 標準に準拠し、[a-zA-Z0-9_]{10} に相当します。
  • [\d]{10} は 10 桁の数字を生成します。これは [0-9]{10} に相当します。
  • [\a]{10} は 10 桁の英字を生成します。これは [a-zA-Z]{10} に相当します。

以下は、パラメーター定義と参照を含む完全なテンプレートの例です。

kind: Template
apiVersion: v1
metadata:
  name: my-template
objects:
  - kind: BuildConfig
    apiVersion: v1
    metadata:
      name: cakephp-mysql-example
      annotations:
        description: Defines how to build the application
    spec:
      source:
        type: Git
        git:
          uri: "${SOURCE_REPOSITORY_URL}" 1
          ref: "${SOURCE_REPOSITORY_REF}"
        contextDir: "${CONTEXT_DIR}"
  - kind: DeploymentConfig
    apiVersion: v1
    metadata:
      name: frontend
    spec:
      replicas: "${{REPLICA_COUNT}}" 2
parameters:
  - name: SOURCE_REPOSITORY_URL 3
    displayName: Source Repository URL 4
    description: The URL of the repository with your application source code 5
    value: https://github.com/sclorg/cakephp-ex.git 6
    required: true 7
  - name: GITHUB_WEBHOOK_SECRET
    description: A secret string used to configure the GitHub webhook
    generate: expression 8
    from: "[a-zA-Z0-9]{40}" 9
  - name: REPLICA_COUNT
    description: Number of replicas to run
    value: "2"
    required: true
message: "... The GitHub webhook secret is ${GITHUB_WEBHOOK_SECRET} ..." 10
1
この値は、テンプレートがインスタンス化された時点で SOURCE_REPOSITORY_URL パラメーターに置き換えられます。
2
この値は、テンプレートがインスタンス化された時点で、REPLICA_COUNT パラメーターの引用なしの値に置き換えられます。
3
パラメーター名。この値は、テンプレート内でパラメーターを参照するのに使用します。
4
分かりやすいパラメーターの名前。これは、ユーザーに表示されます。
5
パラメーターの説明。期待値に対する制約など、パラメーターの目的を詳細にわたり説明します。説明には、コンソールのテキスト標準に従い、完結した文章を使用するようにしてください。表示名と同じ内容を使用しないでください。
6
テンプレートをインスタンス化する時に、ユーザーにより値が上書きされない場合に使用されるパラメーターのデフォルト値。パスワードなどのデフォルト値の使用を避けるようにしてください。 シークレットと組み合わせた生成パラメーターを使用するようにしてください。
7
このパラメーターが必須であることを示します。つまり、ユーザーは空の値で上書きできません。パラメーターでデフォルト値または生成値が指定されていない場合には、ユーザーは値を指定する必要があります。
8
値が生成されるパラメーター
9
ジェネレーターへの入力。この場合、ジェネレーターは、大文字、小文字を含む 40 桁の英数字の値を生成します。
10
パラメーターはテンプレートメッセージに含めることができます。これにより、生成された値がユーザーに通知されます。

8.7.4. テンプレートオブジェクト一覧の作成

テンプレートの主な部分は、テンプレートがインスタンス化される時に作成されるオブジェクトの一覧です。これには、BuildConfigDeploymentConfigService など、有効な API オブジェクトを使用できます。オブジェクトはここで定義された通りに作成され、パラメーターの値は作成前に置換されます。これらのオブジェクトの定義では、以前に定義したパラメーターを参照できます。

以下は、オブジェクト一覧の例です。

kind: "Template"
apiVersion: "v1"
metadata:
  name: my-template
objects:
  - kind: "Service" 1
    apiVersion: "v1"
    metadata:
      name: "cakephp-mysql-example"
      annotations:
        description: "Exposes and load balances the application pods"
    spec:
      ports:
        - name: "web"
          port: 8080
          targetPort: 8080
      selector:
        name: "cakephp-mysql-example"
1
Service の定義。 このテンプレートにより作成されます。
注記

オブジェクト定義のメタデータに namespace フィールドの固定値が含まれる場合、フィールドはテンプレートのインスタンス化の際に定義から取り除かれます。namespace フィールドにパラメーター参照が含まれる場合には、通常のパラメーター置換が行われ、パラメーターの置換による値の解決が実行された namespace で、オブジェクトが作成されます。 この場合、ユーザーは対象の namespace でオブジェクトを作成するパーミッションがあることが前提になります。

8.7.5. テンプレートをバインド可能としてマーキングする

テンプレートサービスブローカーは、認識されているテンプレートオブジェクトごとに、カタログ内にサービスを 1 つ公開します。デフォルトでは、これらのサービスはそれぞれ「バインド可能」として公開され、エンドユーザーがプロビジョニングしたサービスに対してバインドできるようにします。

手順

テンプレートの作成者は、エンドユーザーが指定テンプレートからプロビジョニングされたサービスに対してバインディングすることを防ぐことができます。

  • template.openshift.io/bindable: "false" のアノテーションをテンプレートに追加して、エンドユーザーが指定のテンプレートからプロビジョニングされるサービスをバインドできないようにできます。

8.7.6. テンプレートオブジェクトフィールドの公開

テンプレートの作成者は、テンプレートに含まれる特定のオブジェクトのフィールドを公開すべきかどうかを指定できます。テンプレートサービスブローカーは、ConfigMap、Secret、Service、Route オブジェクトに公開されたフィールドを認識し、ユーザーがブローカーでサポートされているサービスをバインドする際に公開されたフィールドの値を返します。

オブジェクトのフィールドを 1 つまたは複数公開するには、テンプレート内のオブジェクトに、プレフィックスが template.openshift.io/expose- または template.openshift.io/base64-expose- のアノテーションを追加します。

各アノテーションキーは、bind 応答のキーになるように、プレフィックスが削除されてパススルーされます。

各アノテーションの値は Kubernetes JSONPath 式の値であり、バインド時に解決され、bind 応答で返される値が含まれるオブジェクトフィールドを指定します。

注記

Bind 応答のキー/値のペアは、環境変数として、システムの他の場所で使用できます。そのため、アノテーションキーでプレフィックスを取り除いた値を有効な環境変数名として使用することが推奨されます。先頭にA-Za-z または _ を指定して、その後に、ゼロか、他の文字 A-Za-z0-9 または _ を指定してください。

注記

バックスラッシュでエスケープしない限り、Kubernetes の JSONPath 実装は表現内のどの場所に使用されていても、.@ などはメタ文字として解釈します。そのため、たとえば、my.key という名前の ConfigMap のデータを参照するには、JSONPath 式は {.data['my\.key']} とする必要があります。JSONPath 式が YAML でどのように記述されているかによって、"{.data['my\\.key']}" などのように、追加でバックスラッシュが必要になる場合があります。

以下は、公開されるさまざまなオブジェクトのフィールドの例です。

kind: Template
apiVersion: v1
metadata:
  name: my-template
objects:
- kind: ConfigMap
  apiVersion: v1
  metadata:
    name: my-template-config
    annotations:
      template.openshift.io/expose-username: "{.data['my\\.username']}"
  data:
    my.username: foo
- kind: Secret
  apiVersion: v1
  metadata:
    name: my-template-config-secret
    annotations:
      template.openshift.io/base64-expose-password: "{.data['password']}"
  stringData:
    password: bar
- kind: Service
  apiVersion: v1
  metadata:
    name: my-template-service
    annotations:
      template.openshift.io/expose-service_ip_port: "{.spec.clusterIP}:{.spec.ports[?(.name==\"web\")].port}"
  spec:
    ports:
    - name: "web"
      port: 8080
- kind: Route
  apiVersion: v1
  metadata:
    name: my-template-route
    annotations:
      template.openshift.io/expose-uri: "http://{.spec.host}{.spec.path}"
  spec:
    path: mypath

上記の部分的なテンプレートでの bind 操作に対する応答例は以下のようになります。

{
  "credentials": {
    "username": "foo",
    "password": "YmFy",
    "service_ip_port": "172.30.12.34:8080",
    "uri": "http://route-test.router.default.svc.cluster.local/mypath"
  }
}

手順

  • template.openshift.io/expose- アノテーションを使用して、値を文字列として返します。これは、任意のバイナリーデータを処理しないものの、便利な方法です。
  • バイナリーデータを返す必要がある場合、template.openshift.io/base64-expose- アノテーションを使用して、データが返される前にデータを base64 でエンコードします。

8.7.7. テンプレートの準備ができるまで待機する

テンプレートの作成者は、テンプレート内の特定のオブジェクトがサービスカタログ、Template Service Broker または TemplateInstance API によるテンプレートのインスタンス化が完了したとされるまで待機する必要があるかを指定できます。

この機能を使用するには、テンプレート内の BuildBuildConfigDeploymentDeploymentConfigJob または StatefulSet のオブジェクト 1 つ以上に、次のアノテーションでマークを付けてください。

"template.alpha.openshift.io/wait-for-ready": "true"

テンプレートのインスタンス化は、アノテーションのマークが付けられたすべてのオブジェクトが準備できたと報告されるまで、完了しません。同様に、アノテーションが付けられたオブジェクトが失敗したと報告されるか、固定タイムアウトである 1 時間以内にテンプレートの準備が整わなかった場合に、テンプレートのインスタンス化は失敗します。

インスタンス化の目的で、各オブジェクトの種類の準備状態および失敗は以下のように定義されます。

種類準備状態 (Readines)失敗 (Failure)

Build

オブジェクトが Complete (完了) フェーズを報告する

オブジェクトが Canceled (キャンセル)、Error (エラー)、または Failed (失敗) を報告する

BuildConfig

関連付けられた最新のビルドオブジェクトが Complete (完了) フェーズを報告する

関連付けられた最新のビルドオブジェクトが Canceled (キャンセル)、Error (エラー)、または Failed (失敗) を報告する

Deployment

オブジェクトが新しい ReplicaSet やデプロイメントが利用可能であることを報告する (これはオブジェクトに定義された readiness プローブに従います)

オブジェクトで、Progressing (進捗中) の状態が false であると報告される

DeploymentConfig

オブジェクトが新しい ReplicaController やデプロイメントが利用可能であると報告する (これはオブジェクトに定義された readiness プローブに従います)

オブジェクトで、Progressing (進捗中) の状態が false であると報告される

Job

オブジェクトが完了 (completion) を報告する

オブジェクトが 1 つ以上の失敗が発生したことを報告する

StatefulSet

オブジェクトがすべてのレプリカが準備状態にあることを報告する (これはオブジェクトに定義された readiness プローブに従います)

該当なし

以下は、テンプレートサンプルを一部抜粋したものです。この例では、wait-for-ready アノテーションが使用されています。他のサンプルは、OpenShift クイックスタートテンプレートにあります。

kind: Template
apiVersion: v1
metadata:
  name: my-template
objects:
- kind: BuildConfig
  apiVersion: v1
  metadata:
    name: ...
    annotations:
      # wait-for-ready used on BuildConfig ensures that template instantiation
      # will fail immediately if build fails
      template.alpha.openshift.io/wait-for-ready: "true"
  spec:
    ...
- kind: DeploymentConfig
  apiVersion: v1
  metadata:
    name: ...
    annotations:
      template.alpha.openshift.io/wait-for-ready: "true"
  spec:
    ...
- kind: Service
  apiVersion: v1
  metadata:
    name: ...
  spec:
    ...

その他の推奨事項

  • アプリケーションにスムーズに実行するのに十分なリソースが提供されるようにメモリー、CPU、およびストレージのデフォルトサイズを設定します。
  • latest タグが複数のメジャーバージョンで使用されている場合には、イメージからこのタグを参照しないようにします。新規イメージがそのタグにプッシュされると、実行中のアプリケーションが破損してしまう可能性があります。
  • 適切なテンプレートの場合、テンプレートのデプロイ後に変更する必要なしに、ビルドおよびデプロイが正常に行われます。

8.7.8. 既存オブジェクトからのテンプレートの作成

テンプレートをゼロから作成するのではなく、プロジェクトから既存のオブジェクトを YAML 形式でエクスポートして、パラメーターを追加したり、テンプレート形式としてカスタマイズしたりして、YAML 形式を変更することもできます。

手順

  1. オブジェクトを YAML 形式でプロジェクトにエクスポートします。

    $ oc get -o yaml --export all > <yaml_filename>

    all ではなく、特定のリソースタイプや複数のリソースを置き換えることも可能です。他の例については、oc get -h を実行してください。

    以下は、oc get --export all に含まれるオブジェクトタイプです。

    • BuildConfig
    • Build
    • DeploymentConfig
    • ImageStream
    • Pod
    • ReplicationController
    • Route
    • Service