6.6. 서비스에서 바인딩 데이터 노출
애플리케이션 개발자는 워크로드를 빌드하고 연결하기 위해 백업 서비스에 액세스해야 합니다. 각 서비스 공급자마다 시크릿에 액세스하여 워크로드에 사용할 수 있는 다른 방법이 필요하기 때문에 백업 서비스에 워크로드를 연결하는 것은 항상 문제가 됩니다.
서비스 바인딩 Operator를 사용하면 애플리케이션 개발자가 바인딩 연결을 구성하는 수동 프로시저 없이 운영자 관리 지원 서비스와 함께 워크로드를 쉽게 바인딩할 수 있습니다. Service Binding Operator에서 백업 서비스를 생성하는 Operator 공급자 또는 사용자로 바인딩 데이터를 제공하려면 Service Binding Operator에서 자동으로 감지할 바인딩 데이터를 노출해야 합니다. 그런 다음 Service Binding Operator는 백업 서비스에서 바인딩 데이터를 자동으로 수집하고 해당 데이터를 워크로드에 공유하여 일관되고 예측 가능한 환경을 제공합니다.
6.6.1. 바인딩 데이터를 노출하는 방법
이 섹션에서는 바인딩 데이터를 노출하는 데 사용할 수 있는 방법에 대해 설명합니다.
워크로드 요구 사항과 환경을 파악하고 이해하고 제공된 서비스와 함께 어떻게 작동하는지 확인하십시오.
바인딩 데이터는 다음과 같은 상황에서 노출됩니다.
백업 서비스는 프로비저닝된 서비스 리소스로 사용할 수 있습니다.
연결하려는 서비스는 서비스 바인딩 사양을 준수합니다. 필요한 모든 바인딩 데이터 값을 사용하여
Secret
리소스를 생성하고 백업 서비스 CR(사용자 정의 리소스)에서 참조해야 합니다. 모든 바인딩 데이터 값의 탐지는 자동입니다.백업 서비스는 프로비저닝된 서비스 리소스로 사용할 수 없습니다.
백업 서비스에서 바인딩 데이터를 노출해야 합니다. 워크로드 요구 사항 및 환경에 따라 다음 방법 중 하나를 선택하여 바인딩 데이터를 노출할 수 있습니다.
- 직접 보안 참조
- CRD(사용자 정의 리소스 정의) 또는 CR 주석을 통해 바인딩 데이터 선언
- 보유 리소스를 통한 바인딩 데이터 검색
6.6.1.1. 프로비저닝된 서비스
프로비저닝된 서비스는 백업 서비스 CR의 .status.binding.name
필드에 배치된 Secret
리소스에 대한 참조가 포함된 백업 서비스 CR을 나타냅니다.
Operator 공급자 또는 백업 서비스를 생성하는 사용자는 이 방법을 사용하여 Secret
리소스를 생성하고 백업 서비스 CR의 .status.binding.name
섹션에서 참조하는 Service Binding 사양을 준수할 수 있습니다. 이 시크릿
리소스는 워크로드가 백업 서비스에 연결하는 데 필요한 모든 바인딩 데이터 값을 제공해야 합니다.
다음 예제에서는 CR에서 참조하는 백업 서비스 및 Secret
리소스를 나타내는 AccountService
CR을 보여줍니다.
예: AccountService
CR
apiVersion: example.com/v1alpha1 kind: AccountService name: prod-account-service spec: ... status: binding: name: hippo-pguser-hippo
예: 참조된 시크릿
리소스
apiVersion: v1 kind: Secret metadata: name: hippo-pguser-hippo data: password: "<password>" user: "<username>" ...
서비스 바인딩 리소스를 생성할 때 다음과 같이 ServiceBinding
사양의 AccountService
리소스에 대한 세부 정보를 직접 지정할 수 있습니다.
예: ServiceBinding
리소스
apiVersion: binding.operators.coreos.com/v1alpha1 kind: ServiceBinding metadata: name: account-service spec: ... services: - group: "example.com" version: v1alpha1 kind: AccountService name: prod-account-service application: name: spring-petclinic group: apps version: v1 resource: deployments
예: ServiceBinding
리소스 사양 API
apiVersion: servicebinding.io/v1beta1 kind: ServiceBinding metadata: name: account-service spec: ... service: apiVersion: example.com/v1alpha1 kind: AccountService name: prod-account-service workload: apiVersion: apps/v1 kind: Deployment name: spring-petclinic
이 메서드는 모든 키를 hippo-pguser-hippo
참조된 Secret
리소스의 모든 키를 워크로드에 프로젝션할 바인딩 데이터로 노출합니다.
6.6.1.2. 직접 보안 참조
필요한 모든 바인딩 데이터 값을 Service Binding 정의에서 참조할 수 있는 시크릿
리소스에서 사용할 수 있는 경우 이 메서드를 사용할 수 있습니다. 이 방법에서 ServiceBinding
리소스는 서비스에 연결하기 위해 Secret
리소스를 직접 참조합니다. Secret
리소스의 모든 키는 바인딩 데이터로 노출됩니다.
예: binding.operators.coreos.com
API를 사용한 사양
apiVersion: binding.operators.coreos.com/v1alpha1 kind: ServiceBinding metadata: name: account-service spec: ... services: - group: "" version: v1 kind: Secret name: hippo-pguser-hippo
예: servicebinding.io
API와 호환되는 사양
apiVersion: servicebinding.io/v1beta1 kind: ServiceBinding metadata: name: account-service spec: ... service: apiVersion: v1 kind: Secret name: hippo-pguser-hippo
6.6.1.3. CRD 또는 CR 주석을 통해 바인딩 데이터 선언
이 방법을 사용하여 지원 서비스의 리소스에 주석을 달아 특정 주석과 바인딩 데이터를 노출할 수 있습니다. metadata
섹션에 주석을 추가하면 지원 서비스의 CR 및 CRD가 변경됩니다. Service Binding Operator는 CR 및 CRD에 추가된 주석을 감지한 다음 주석을 기반으로 추출된 값으로 Secret
리소스를 생성합니다.
다음 예제에서는 metadata
섹션에 추가된 주석과 리소스에서 참조된 ConfigMap
오브젝트를 보여줍니다.
예: CR 주석에 정의된 Secret
오브젝트에서 바인딩 데이터 노출
apiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster metadata: name: hippo namespace: my-petclinic annotations: service.binding: 'path={.metadata.name}-pguser-{.metadata.name},objectType=Secret' ...
이전 예제에서는 hippo-pguser-hippo
로 확인되는 {.metadata.name}-pguser-{.metadata.name}
템플릿에 시크릿 이름의 이름을 배치합니다. 템플릿에 여러 JSONPath 표현식을 포함할 수 있습니다.
예: 리소스에서 참조된 Secret
오브젝트
apiVersion: v1 kind: Secret metadata: name: hippo-pguser-hippo data: password: "<password>" user: "<username>"
예: CR 주석에 정의된 ConfigMap
오브젝트에서 바인딩 데이터 노출
apiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster metadata: name: hippo namespace: my-petclinic annotations: service.binding: 'path={.metadata.name}-config,objectType=ConfigMap' ...
이전 예제에서는 hippo-config
로 확인되는 {.metadata.name}-config
템플릿에 구성 맵의 이름을 배치합니다. 템플릿에 여러 JSONPath 표현식을 포함할 수 있습니다.
예: 리소스에서 참조된 ConfigMap
오브젝트
apiVersion: v1 kind: ConfigMap metadata: name: hippo-config data: db_timeout: "10s" user: "hippo"
6.6.1.4. 보유 리소스를 통한 바인딩 데이터 검색
백업 서비스에서 바인딩 데이터를 감지하는 데 사용할 수 있는 경로, 서비스, 구성 맵 또는 시크릿과 같은 Kubernetes 리소스를 하나 이상 보유하는 경우 이 방법을 사용할 수 있습니다. 이 방법에서 Service Binding Operator는 백업 서비스 CR이 소유한 리소스의 바인딩 데이터를 탐지합니다.
다음 예제에서는 ServiceBinding
CR에서 detectBindingResources
API 옵션을 true
로 설정하는 방법을 보여줍니다.
예제
apiVersion: binding.operators.coreos.com/v1alpha1 kind: ServiceBinding metadata: name: spring-petclinic-detect-all namespace: my-petclinic spec: detectBindingResources: true services: - group: postgres-operator.crunchydata.com version: v1beta1 kind: PostgresCluster name: hippo application: name: spring-petclinic group: apps version: v1 resource: deployments
이전 예에서 PostgresCluster
사용자 정의 서비스 리소스는 경로, 서비스, 구성 맵 또는 시크릿과 같은 Kubernetes 리소스를 하나 이상 소유하고 있습니다.
Service Binding Operator는 각 보유 리소스에 노출된 바인딩 데이터를 자동으로 탐지합니다.
6.6.2. 데이터 모델
주석에 사용되는 데이터 모델은 특정 규칙을 따릅니다.
서비스 바인딩 주석에는 다음 규칙을 사용해야 합니다.
service.binding(/<NAME>)?: "<VALUE>|(path=<JSONPATH_TEMPLATE>(,objectType=<OBJECT_TYPE>)?(,elementType=<ELEMENT_TYPE>)?(,sourceKey=<SOURCE_KEY>)?(,sourceValue=<SOURCE_VALUE>)?)"
다음과 같습니다.
|
바인딩 값이 노출될 이름을 지정합니다. |
|
|
데이터 모델은 경로에
허용되는 값 및 의미에 대한 세부 정보를 제공합니다. ,elementType
,objectType
,sourceKey
, sourceValue
매개변수.
매개변수 | 설명 | 기본값 |
---|---|---|
| curly braces {}로 묶은 JSONPath 표현식을 구성하는 JSONPath 템플릿. | 해당 없음 |
|
|
|
|
|
|
|
바인딩 데이터를 수집할 때 바인딩 보안에 추가할 참고:
| 해당 없음 |
|
맵의 슬라이스에 키를 지정합니다. 참고:
| 해당 없음 |
sourceKey
및 sourceValue
매개변수는 path
매개변수에 표시된 요소가 ConfigMap
또는 Secret
리소스를 참조하는 경우에만 적용할 수 있습니다.
6.6.3. 주석 매핑을 선택적으로 설정
주석에 선택적 필드가 있을 수 있습니다. 예를 들어 서비스 끝점에 인증이 필요하지 않은 경우 자격 증명의 경로가 존재하지 않을 수 있습니다. 이러한 경우 주석은 주석의 대상 경로에 존재하지 않을 수 있습니다. 결과적으로 Service Binding Operator는 기본적으로 오류를 생성합니다.
서비스 공급자로서 주석 매핑이 필요한지 여부를 나타내기 위해 서비스를 활성화할 때 주석에서 선택적
플래그 값을 설정할 수 있습니다. Service Binding Operator는 대상 경로를 사용할 수 있는 경우에만 주석 매핑을 제공합니다. 대상 경로를 사용할 수 없는 경우 Service Binding Operator는 선택적 매핑을 건너뛰고 오류를 throw하지 않고 기존 매핑의 예상을 계속합니다.
절차
주석에서 필드를 선택적으로 만들려면
선택적
플래그 값을true
로 설정합니다.예제
apiVersion: apps.example.org/v1beta1 kind: Database metadata: name: my-db namespace: my-petclinic annotations: service.binding/username: path={.spec.name},optional=true ...
-
선택적
플래그 값을false
로 설정하고 Service Binding Operator에서 대상 경로를 찾을 수 없는 경우 Operator에서 주석 매핑에 실패합니다. -
선택적 플래그에
값이 설정되지 않은 경우 Service Binding Operator는 기본적으로 값을false
로 간주하고 주석 매핑에 실패합니다.
6.6.4. RBAC 요구 사항
Service Binding Operator를 사용하여 백업 서비스 바인딩 데이터를 공개하려면 특정 RBAC(역할 기반 액세스 제어) 권한이 필요합니다. backing 서비스 리소스에 대한 RBAC 권한을 부여하려면 ClusterRole
리소스의 rules
필드 아래에 특정 동사를 지정합니다. 이러한 규칙을
정의할 때 Service Binding Operator에서 클러스터 전체의 백업 서비스 리소스의 바인딩 데이터를 읽을 수 있습니다. 사용자가 데이터를 읽거나 애플리케이션 리소스를 수정할 수 있는 권한이 없는 경우 Service Binding Operator에서 해당 사용자가 애플리케이션에 서비스를 바인딩하는 것을 방지할 수 있습니다. RBAC 요구 사항을 준수하면 사용자에게 불필요한 권한 상승을 방지하고 무단 서비스 또는 애플리케이션에 대한 액세스를 방지할 수 있습니다.
Service Binding Operator는 전용 서비스 계정을 사용하여 Kubernetes API에 대한 요청을 수행합니다. 기본적으로 이 계정에는 다음 표준 Kubernetes 또는 OpenShift 오브젝트가 표시되는 둘 다 워크로드에 서비스를 바인딩할 수 있는 권한이 있습니다.
-
배포
-
DaemonSets
-
ReplicaSets
-
StatefulSets
-
DeploymentConfigs
Operator 서비스 계정은 집계된 클러스터 역할에 바인딩되어 Operator 공급자 또는 클러스터 관리자가 사용자 정의 서비스 리소스를 워크로드에 바인딩할 수 있습니다. ClusterRole
내에서 필요한 권한을 부여하려면 servicebinding.io/controller
플래그를 사용하여 레이블을 지정하고 플래그 값을 true
로 설정합니다. 다음 예제에서는 Service Binding Operator가 Crunchy PostgreSQL Operator의 CR(사용자 정의 리소스)을 가져오고
,보고
, 나열
하는 방법을 보여줍니다.
예: Crunchy PostgreSQL Operator에서 프로비저닝한 PostgreSQL 데이터베이스 인스턴스에 바인딩 활성화
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: postgrescluster-reader labels: servicebinding.io/controller: "true" rules: - apiGroups: - postgres-operator.crunchydata.com resources: - postgresclusters verbs: - get - watch - list ...
이 클러스터 역할은 백업 서비스 Operator를 설치하는 동안 배포할 수 있습니다.
6.6.5. exposable 바인딩 데이터 범주
Service Binding Operator를 사용하면 지원 서비스 리소스 및 CRD(사용자 정의 리소스 정의)에서 바인딩 데이터 값을 노출할 수 있습니다.
이 섹션에서는 exposable 바인딩 데이터의 다양한 카테고리를 사용할 수 있는 방법을 보여주는 예제를 제공합니다. 작업 환경 및 요구 사항에 맞게 이러한 예제를 수정해야 합니다.
6.6.5.1. 리소스에서 문자열 노출
다음 예제에서는 사용자 이름으로 PostgresCluster
CR(사용자 정의 리소스)의 metadata.name
필드에서 문자열을 노출하는 방법을 보여줍니다.
예제
apiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster metadata: name: hippo namespace: my-petclinic annotations: service.binding/username: path={.metadata.name} ...
6.6.5.2. 상수 값을 바인딩 항목으로 노출
다음 예제에서는 PostgresCluster
사용자 정의 리소스(CR)에서 상수 값을 노출하는 방법을 보여줍니다.
예: 상수 값 노출
apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PostgresCluster
metadata:
name: hippo
namespace: my-petclinic
annotations:
"service.binding/type": "postgresql" 1
- 1
postgresql
값을 사용하여 공개할 바인딩유형입니다
.
6.6.5.3. 리소스에서 참조하는 전체 구성 맵 또는 시크릿 노출
다음 예제에서는 주석을 통해 전체 시크릿을 노출하는 방법을 보여줍니다.
예: 주석을 통해 전체 시크릿 노출
apiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster metadata: name: hippo namespace: my-petclinic annotations: service.binding: 'path={.metadata.name}-pguser-{.metadata.name},objectType=Secret'
예: 백업 서비스 리소스에서 참조된 시크릿
apiVersion: v1 kind: Secret metadata: name: hippo-pguser-hippo data: password: "<password>" user: "<username>"
6.6.5.4. 리소스에서 참조되는 구성 맵 또는 시크릿에서 특정 항목 노출
다음 예제에서는 주석을 통해 구성 맵에서 특정 항목을 노출하는 방법을 보여줍니다.
예: 주석을 통해 구성 맵에서 항목 노출
apiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster metadata: name: hippo namespace: my-petclinic annotations: service.binding: 'path={.metadata.name}-config,objectType=ConfigMap,sourceKey=user'
예: 백업 서비스 리소스에서 참조된 구성 맵
바인딩 데이터에 이름이 db_timeout
이고 값이 10s
인 키가 있어야 합니다.
apiVersion: v1 kind: ConfigMap metadata: name: hippo-config data: db_timeout: "10s" user: "hippo"
6.6.5.5. 리소스 정의 값 노출
다음 예제에서는 주석을 통해 리소스 정의 값을 노출하는 방법을 보여줍니다.
예: 주석을 통해 리소스 정의 값 노출
apiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster metadata: name: hippo namespace: my-petclinic annotations: service.binding/username: path={.metadata.name} ...
6.6.5.6. 각 항목에서 키와 값을 사용하여 컬렉션의 항목 노출
다음 예제에서는 각 항목에서 주석을 통해 키 및 값이 있는 컬렉션 항목을 노출하는 방법을 보여줍니다.
예: 주석을 통해 컬렉션 항목 노출
apiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster metadata: name: hippo namespace: my-petclinic annotations: "service.binding/uri": "path={.status.connections},elementType=sliceOfMaps,sourceKey=type,sourceValue=url" spec: ... status: connections: - type: primary url: primary.example.com - type: secondary url: secondary.example.com - type: '404' url: black-hole.example.com
다음 예제에서는 주석에 있는 컬렉션의 이전 항목이 바인딩된 애플리케이션에 예상되는 방법을 보여줍니다.
예: 데이터 파일 바인딩
/bindings/<binding-name>/uri_primary => primary.example.com /bindings/<binding-name>/uri_secondary => secondary.example.com /bindings/<binding-name>/uri_404 => black-hole.example.com
예: 백업 서비스 리소스의 설정
status: connections: - type: primary url: primary.example.com - type: secondary url: secondary.example.com - type: '404' url: black-hole.example.com
위 예제에서는 기본
,보조
등과 같은 키를 사용하여 모든 값을 프로젝트를 수행하는 데 도움이 됩니다.
6.6.5.7. 항목당 하나의 키로 컬렉션의 항목 노출
다음 예제에서는 주석을 통해 항목당 하나의 키가 있는 컬렉션의 항목을 노출하는 방법을 보여줍니다.
예: 주석을 통해 컬렉션의 항목 노출
apiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster metadata: name: hippo namespace: my-petclinic annotations: "service.binding/tags": "path={.spec.tags},elementType=sliceOfStrings" spec: tags: - knowledge - is - power
다음 예제에서는 주석에서 컬렉션의 이전 항목이 바인딩된 애플리케이션에 예상되는 방법을 보여줍니다.
예: 데이터 파일 바인딩
/bindings/<binding-name>/tags_0 => knowledge /bindings/<binding-name>/tags_1 => is /bindings/<binding-name>/tags_2 => power
예: 백업 서비스 리소스의 설정
spec: tags: - knowledge - is - power
6.6.5.8. 항목 값당 하나의 키를 사용하여 컬렉션 항목의 값 노출
다음 예제에서는 주석을 통해 항목 값당 하나의 키가 있는 컬렉션 항목의 값을 노출하는 방법을 보여줍니다.
예: 주석을 통해 컬렉션 항목 값 노출
apiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster metadata: name: hippo namespace: my-petclinic annotations: "service.binding/url": "path={.spec.connections},elementType=sliceOfStrings,sourceValue=url" spec: connections: - type: primary url: primary.example.com - type: secondary url: secondary.example.com - type: '404' url: black-hole.example.com
다음 예제에서는 주석의 컬렉션 이전 값이 바인딩된 애플리케이션에 예상되는 방법을 보여줍니다.
예: 데이터 파일 바인딩
/bindings/<binding-name>/url_0 => primary.example.com /bindings/<binding-name>/url_1 => secondary.example.com /bindings/<binding-name>/url_2 => black-hole.example.com