Red Hat Training
A Red Hat training course is available for OpenShift Container Platform
10.7.6. オブジェクトフィールドの公開
テンプレートの作成者は、テンプレートに含まれる特定のオブジェクトのフィールドを公開すべきかどうかを指定できます。テンプレートサービスのブローカーは、ConfigMap、Secret、Service、Route オブジェクトに公開されたフィールドを認識し、ユーザーがブローカーでバックされているサービスをバンドした場合に公開されたフィールドの値を返します。
オブジェクトのフィールドを 1 つまたは複数公開するには、テンプレート内のオブジェクトに、接頭辞が template.openshift.io/expose- または template.openshift.io/base64-expose- のアノテーションを追加します。
各アノテーションキーは、bind 応答のキーになるように、接頭辞が削除されてパススルーされます。
各アノテーションの値は Kubernetes JSONPath 式 の値であり、バインド時に解決され、bind 応答で返される値が含まれるオブジェクトフィールドを指定します。
Bind 応答のキー/値のペアは、環境変数として、システムの他の場所で使用できます。そのため、アノテーションキーで接頭辞を取り除いた値を有効な環境変数名として使用することが推奨されます。先頭に A-Z、a-z またはアンダースコアを指定して、その後に、ゼロか、他の文字 A-Z、a-z、0-9 またはアンダースコアを指定してください。
template.openshift.io/expose- アノテーションを使用して、文字列としてフィールドの値を返します。これは、任意のバイナリーデータを処理しないものの、便利な方法です。バイナリーデータを返す場合には、バイナリーデータを返す前にデータのエンコードに base64b を使用するのではなく、template.openshift.io/base64-expose- アノテーションを使用します。
バックスラッシュでエスケープしない限り、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"
}
}