5.8. Service Binding Operator를 사용한 워크로드 바인딩
애플리케이션 개발자는 바인딩 보안을 사용하여 워크로드를 하나 이상의 백업 서비스에 바인딩해야 합니다. 이 비밀은 워크로드에서 사용할 정보를 저장하기 위해 생성됩니다.
예를 들어 연결하려는 서비스가 바인딩 데이터를 이미 노출하고 있다고 가정합니다. 이 경우 ServiceBinding
CR(사용자 정의 리소스)과 함께 사용할 워크로드가 필요합니다. 워크로드는 이 ServiceBinding
CR을 사용하여 바인딩할 서비스의 세부 정보와 함께 바인딩 요청을 보냅니다.
ServiceBinding
CR의 예
apiVersion: binding.operators.coreos.com/v1alpha1 kind: ServiceBinding metadata: name: spring-petclinic-pgcluster namespace: my-petclinic spec: services: 1 - group: postgres-operator.crunchydata.com version: v1beta1 kind: PostgresCluster name: hippo application: 2 name: spring-petclinic group: apps version: v1 resource: deployments
이전 예제와 같이 ConfigMap
또는 Secret
자체를 서비스 리소스로 직접 사용하여 바인딩 데이터 소스로 사용할 수도 있습니다.
5.8.1. 네이밍 전략
이름 지정 전략은 binding.operators.coreos.com
API 그룹에만 사용할 수 있습니다.
이름 지정 전략에서는 Go 템플릿을 사용하여 서비스 바인딩 요청을 통해 사용자 지정 바인딩 이름을 정의하는 데 도움이 됩니다. 네이밍 전략은 ServiceBinding
CR(사용자 정의 리소스)의 매핑을 포함한 모든 속성에 적용됩니다.
백업 서비스는 바인딩 이름을 파일 또는 환경 변수로 워크로드에 프로젝트합니다. 워크로드에 특정 형식의 예상 바인딩 이름이 필요하지만 지원 서비스에서 예상하는 바인딩 이름은 해당 형식으로 사용할 수 없는 경우 네이밍 전략을 사용하여 바인딩 이름을 변경할 수 있습니다.
사전 정의된 후 처리 기능
워크로드의 기대치 또는 요구 사항에 따라 명명 전략을 사용하는 동안, 모든 조합에서 사전 정의된 다음 사후 처리 기능을 사용하여 문자 문자열을 변환할 수 있습니다.
-
upper
: 문자 문자열을 대문자 또는 대문자로 변환합니다. -
lower
: 문자 문자열을 소문자로 변환합니다. -
title
: 특정 사소한 단어를 제외하고 각 단어의 첫 번째 문자가 대문자로 지정된 문자 문자열을 변환합니다.
사전 정의된 명명 전략
주석을 통해 선언된 바인딩 이름은 다음과 같은 사전 정의된 명명 전략에 따라 예상되기 전에 이름 변경에 대해 처리됩니다.
none
: 적용할 때 바인딩 이름은 변경되지 않습니다.예제
템플릿 컴파일 후 바인딩 이름은
{{ .name }}
양식을 사용합니다.host: hippo-pgbouncer port: 5432
upper
:namingStrategy
가 정의되지 않은 경우 적용됩니다. 적용되면 바인딩 name 키의 모든 문자 문자열을 대문자 또는 대문자로 변환합니다.예제
템플릿 컴파일 후 바인딩 이름은
{{ .service.kind | upper}}_{{ .name | upper }}
양식을 사용합니다.DATABASE_HOST: hippo-pgbouncer DATABASE_PORT: 5432
워크로드에 다른 형식이 필요한 경우 사용자 지정 명명 전략을 정의하고 접두사와 구분자를 사용하여 바인딩 이름을 변경할 수 있습니다(예:
PORT_DATABASE
).
-
바인딩 이름이 파일로 예상되면 기본적으로 사전 정의된
none
명명 전략이 적용되고 바인딩 이름은 변경되지 않습니다. -
바인딩 이름이 환경 변수로 예상되고
namingStrategy
가 정의되지 않은 경우 기본적으로 사전 정의된대문자
명명 전략이 적용됩니다. - 사용자 지정 바인딩 이름과 사전 정의된 사후 처리 기능의 다양한 조합을 사용하여 사용자 지정 명명 전략을 정의하여 사전 정의된 명명 전략을 재정의할 수 있습니다.
5.8.2. 고급 바인딩 옵션
고급 바인딩 옵션은 binding.operators.coreos.com
API 그룹에만 사용할 수 있습니다.
5.8.2.1. 워크로드로 예상하기 전에 바인딩 이름 변경
ServiceBinding
CR(사용자 정의 리소스)의 .spec.namingStrategy 속성에서 바인딩 이름을 변경하는 규칙을 지정할 수 있습니다. 예를 들어 PostgreSQL 데이터베이스에 연결된 Spring PetClinic 샘플 애플리케이션을 살펴보겠습니다. 이 경우 PostgreSQL 데이터베이스 서비스는 데이터베이스의 호스트 및 포트 필드를 노출하여 바인딩에 사용합니다. Spring PetClinic 샘플 애플리케이션은 바인딩 이름을 통해 노출된 바인딩 데이터에 액세스할 수 있습니다.
예: ServiceBinding
CR의 Spring PetClinic 샘플 애플리케이션
... application: name: spring-petclinic group: apps version: v1 resource: deployments ...
예: ServiceBinding
CR의 PostgreSQL 데이터베이스 서비스
... services: - group: postgres-operator.crunchydata.com version: v1beta1 kind: PostgresCluster name: hippo ...
namingStrategy
가 정의되지 않고 바인딩 이름이 환경 변수로 예상되면 백업 서비스의 host: hippo-pgbouncer
값이 다음 예와 같이 표시됩니다.
예제
DATABASE_HOST: hippo-pgbouncer
다음과 같습니다.
|
|
| 바인딩 이름을 지정합니다. |
POSTGRESQL_{{ .service.kind | upper }}_{{ .name | upper }}_ENV
명명 전략을 적용하면 다음 예와 같이 서비스 바인딩 요청에 의해 준비된 사용자 지정 바인딩 이름 목록이 표시됩니다.
예제
POSTGRESQL_DATABASE_HOST_ENV: hippo-pgbouncer POSTGRESQL_DATABASE_PORT_ENV: 5432
다음 항목은 POSTGRESQL_{{ .service.kind | upper }}_{{ .name | upper }}_ENV
명명 전략에 정의된 표현식을 설명합니다.
-
.name
: 백업 서비스에서 노출하는 바인딩 이름을 나타냅니다. 이전 예에서 바인딩 이름은HOST
및PORT
입니다. -
.service.kind
: 네이밍 전략으로 바인딩 이름이 변경된 서비스 리소스를 나타냅니다. -
upper
: Go 템플릿 문자열을 컴파일하는 동안 문자 문자열을 처리하는 데 사용되는 문자열입니다. -
POSTGRESQL
: 사용자 정의 바인딩 이름의 접두사입니다. -
ENV
: 사용자 정의 바인딩 이름의 접미사입니다.
이전 예제와 마찬가지로 namingStrategy
에서 문자열 템플릿을 정의하여 서비스 바인딩 요청에서 바인딩 이름의 각 키를 준비하는 방법을 정의할 수 있습니다.
5.8.2.2. 사용자 정의 바인딩 데이터 구성
애플리케이션 개발자는 다음과 같은 상황에서 사용자 정의 바인딩 데이터를 작성할 수 있습니다.
- 백업 서비스는 바인딩 데이터를 노출하지 않습니다.
- 노출된 값은 워크로드에서 예상한 대로 필요한 형식으로 사용할 수 없습니다.
예를 들어 지원 서비스 CR에서 호스트, 포트 및 데이터베이스 사용자를 바인딩 데이터로 노출하지만 워크로드에서 바인딩 데이터를 연결 문자열로 사용해야 하는 경우를 고려해 보십시오. 백업 서비스를 나타내는 Kubernetes 리소스에서 속성을 사용하여 사용자 지정 바인딩 데이터를 구성할 수 있습니다.
예제
apiVersion: binding.operators.coreos.com/v1alpha1 kind: ServiceBinding metadata: name: spring-petclinic-pgcluster namespace: my-petclinic spec: services: - group: postgres-operator.crunchydata.com version: v1beta1 kind: PostgresCluster name: hippo 1 id: postgresDB 2 - group: "" version: v1 kind: Secret name: hippo-pguser-hippo id: postgresSecret application: name: spring-petclinic group: apps version: v1 resource: deployments mappings: ## From the database service - name: JDBC_URL value: 'jdbc:postgresql://{{ .postgresDB.metadata.annotations.proxy }}:{{ .postgresDB.spec.port }}/{{ .postgresDB.metadata.name }}' ## From both the services! - name: CREDENTIALS value: '{{ .postgresDB.metadata.name }}{{ translationService.postgresSecret.data.password }}' ## Generate JSON - name: DB_JSON 3 value: {{ json .postgresDB.status }} 4
5.8.3. PodSpec과 호환되지 않는 보조 워크로드 바인딩
서비스 바인딩의 일반적인 시나리오에는 백업 서비스, 워크로드(배포) 및 Service Binding Operator를 구성하는 작업이 포함됩니다. PodSpec과 호환되지 않고 기본 워크로드(배포)와 Service Binding Operator 간에 있는 보조 워크로드(애플리케이션 Operator일 수도 있음)가 포함된 시나리오를 고려하십시오.
이러한 보조 워크로드 리소스의 경우 컨테이너 경로의 위치는 임의적입니다. 서비스 바인딩의 경우 CR의 보조 워크로드가 PodSpec과 호환되지 않는 경우 컨테이너 경로의 위치를 지정해야 합니다. 이렇게 하면 프로젝트가 Pod 내에 바인딩 데이터를 원하지 않는 경우와 같이 ServiceBinding
CR(사용자 정의 리소스)의 보조 워크로드에 지정된 컨테이너 경로에 바인딩 데이터를 바인딩합니다.
Service Binding Operator는 컨테이너 경로 또는 시크릿 경로의 값을 구성하고 사용자 정의 위치에서 이러한 경로를 바인딩하는 옵션을 제공합니다. 이 옵션은 바인딩 데이터가 환경 변수로 예상되는 경우에만 binding.operators.coreos.com
API 그룹에만 사용할 수 있습니다.
5.8.3.1. 컨테이너 경로의 사용자 정의 위치 구성
PodSpec과 호환되지 않으며 spec.containers 경로에 컨테이너가 있는 보조 워크로드 CR을 고려하십시오.
예: 보조 워크로드 CR
apiVersion: "operator.sbo.com/v1" kind: SecondaryWorkload metadata: name: secondary-workload spec: containers: - name: hello-world image: quay.io/baijum/secondary-workload:latest ports: - containerPort: 8080
프로세스
ServiceBinding
CR에 값을 지정하고 이 경로를spec.application.bindingPath.containersPath
사용자 지정 위치에 바인딩하여spec.containers
경로를 구성합니다.예: 사용자 정의 위치에
spec.containers
경로가 있는ServiceBinding
CRapiVersion: binding.operators.coreos.com/v1alpha1 kind: ServiceBinding metadata: name: spring-petclinic-pgcluster spec: services: - group: postgres-operator.crunchydata.com version: v1beta1 kind: PostgresCluster name: hippo id: postgresDB - group: "" version: v1 kind: Secret name: hippo-pguser-hippo id: postgresSecret application: 1 name: spring-petclinic group: apps version: v1 resource: deployments application: 2 name: secondary-workload group: operator.sbo.com version: v1 resource: secondaryworkloads bindingPath: containersPath: spec.containers 3
컨테이너 경로의 위치를 지정하면 Service Binding Operator는 바인딩 데이터를 생성합니다. 이 데이터는 ServiceBinding
CR의 보조 워크로드에 지정된 컨테이너 경로에서 사용할 수 있게 됩니다.
다음 예제에서는 envFrom
및 secretRef
필드가 있는 spec.containers
경로를 보여줍니다.
예: envFrom
및 secretRef
필드가 있는 보조 워크로드 CR
apiVersion: "operator.sbo.com/v1" kind: SecondaryWorkload metadata: name: secondary-workload spec: containers: - env: 1 - name: ServiceBindingOperatorChangeTriggerEnvVar value: "31793" envFrom: - secretRef: name: secret-resource-name 2 image: quay.io/baijum/secondary-workload:latest name: hello-world ports: - containerPort: 8080 resources: {}
5.8.3.2. 보안 경로의 사용자 정의 위치 구성
spec.secret 경로의 보안만 있는 PodSpec과 호환되지 않는 보조 워크로드 CR을 고려해 보십시오.
예: 보조 워크로드 CR
apiVersion: "operator.sbo.com/v1" kind: SecondaryWorkload metadata: name: secondary-workload spec: secret: ""
프로세스
ServiceBinding
CR에 값을 지정하고spec.application.bindingPath.secretPath
사용자 지정 위치에서 이 경로를 바인딩하여spec.secret
경로를 구성합니다.예: 사용자 정의 위치에
spec.secret
경로가 있는ServiceBinding
CRapiVersion: binding.operators.coreos.com/v1alpha1 kind: ServiceBinding metadata: name: spring-petclinic-pgcluster spec: ... application: 1 name: secondary-workload group: operator.sbo.com version: v1 resource: secondaryworkloads bindingPath: secretPath: spec.secret 2 ...
보안 경로의 위치를 지정하면 Service Binding Operator에서 바인딩 데이터를 생성합니다. 이 데이터는 ServiceBinding
CR의 보조 워크로드에 지정된 보안 경로에 제공됩니다.
다음 예제에서는 binding-request
값이 있는 spec.secret
경로를 보여줍니다.
예: binding-request
값이 있는 보조 워크로드 CR
...
apiVersion: "operator.sbo.com/v1"
kind: SecondaryWorkload
metadata:
name: secondary-workload
spec:
secret: binding-request-72ddc0c540ab3a290e138726940591debf14c581 1
...
- 1
- Service Binding Operator에서 생성한
Secret
리소스의 고유 이름입니다.
5.8.4. 백업 서비스에서 워크로드 바인딩 해제
oc
툴을 사용하여 백업 서비스에서 워크로드를 바인딩 해제할 수 있습니다.
백업 서비스에서 워크로드를 바인딩 해제하려면 연결된
ServiceBinding
CR(사용자 정의 리소스)을 삭제합니다.$ oc delete ServiceBinding <.metadata.name>
예제
$ oc delete ServiceBinding spring-petclinic-pgcluster
다음과 같습니다.
spring-petclinic-pgcluster
ServiceBinding
CR의 이름을 지정합니다.