4.8. 비 클러스터 관리자가 Operator를 설치하도록 허용
클러스터 관리자는 Operator 그룹을 사용하여 일반 사용자가 Operator 를 설치할 수 있도록 허용할 수 있습니다.
추가 리소스
4.8.1. Operator 설치 정책 이해
Operator를 실행하는 데 광범위한 권한이 필요할 수 있으며 필요한 권한이 버전에 따라 다를 수 있습니다. OLM(Operator Lifecycle Manager)은 cluster-admin
권한으로 실행됩니다. 기본적으로 Operator 작성자는 CSV(클러스터 서비스 버전)에서 권한 세트를 지정할 수 있으며 OLM은 이를 Operator에 부여합니다.
Operator가 클러스터 범위 권한을 달성할 수 없고 사용자가 OLM을 사용하여 권한을 에스컬레이션할 수 없도록 클러스터 관리자는 클러스터에 추가되기 전에 Operator를 수동으로 감사할 수 있습니다. 클러스터 관리자에게는 서비스 계정을 사용하여 Operator를 설치 또는 업그레이드하는 동안 수행할 수 있는 작업을 결정하고 제한하는 툴도 제공됩니다.
클러스터 관리자는 일련의 권한이 부여된 서비스 계정과 Operator group을 연결할 수 있습니다. 서비스 계정은 RBAC(역할 기반 액세스 제어) 규칙을 사용하여 사전 정의된 범위 내에서만 실행되도록 Operator에 정책을 설정합니다. 결과적으로 Operator는 해당 규칙에서 명시적으로 허용하지 않는 작업을 수행할 수 없습니다.
Operator 그룹을 사용하면 충분한 권한이 있는 사용자는 범위가 제한된 Operator를 설치할 수 있습니다. 결과적으로 더 많은 사용자가 더 많은 Operator 프레임워크 툴을 안전하게 사용할 수 있어 Operator를 사용하여 애플리케이션을 빌드할 수 있는 풍부한 환경을 제공할 수 있습니다.
Subscription
오브젝트에 대한 RBAC(역할 기반 액세스 제어)는 네임스페이스에서 edit
또는 admin
역할이 있는 모든 사용자에게 자동으로 부여됩니다. 그러나 OperatorGroup
오브젝트에 RBAC가 존재하지 않습니다. 이 경우 일반 사용자가 Operator를 설치하지 못하도록 합니다. Operator group을 사전 설치하는 것은 효과적으로 설치 권한을 부여하는 것입니다.
Operator 그룹을 서비스 계정과 연결할 때 다음 사항에 유의하십시오.
-
APIService
및CustomResourceDefinition
리소스는 항상cluster-admin
역할을 사용하여 OLM에 의해 생성됩니다. Operator group과 연결된 서비스 계정에는 이러한 리소스를 작성할 수 있는 권한을 부여해서는 안 됩니다. - 이제 Operator group에 연결된 모든 Operator의 권한이 지정된 서비스 계정에 부여된 권한으로 제한됩니다. Operator에서 서비스 계정 범위를 벗어나는 권한을 요청하면 클러스터 관리자가 문제를 해결하고 해결할 수 있도록 적절한 오류와 함께 설치에 실패합니다.
4.8.1.1. 설치 시나리오
Operator를 클러스터에서 설치하거나 업그레이드할 수 있는지 결정하는 경우 OLM(Operator Lifecycle Manager)은 다음 시나리오를 고려합니다.
- 클러스터 관리자가 새 Operator group을 생성하고 서비스 계정을 지정합니다. 이 Operator group과 연결된 모든 Operator가 설치되고 서비스 계정에 부여된 권한에 따라 실행됩니다.
- 클러스터 관리자가 새 Operator group을 생성하고 서비스 계정을 지정하지 않습니다. OpenShift Container Platform은 이전 버전과의 호환성을 유지하므로 기본 동작은 그대로 유지되면서 Operator 설치 및 업그레이드가 허용됩니다.
- 서비스 계정을 지정하지 않는 기존 Operator group의 경우 기본 동작은 그대로 유지되면서 Operator 설치 및 업그레이드가 허용됩니다.
- 클러스터 관리자가 기존 Operator group을 업데이트하고 서비스 계정을 지정합니다. OLM을 사용하면 현재 권한을 사용하여 기존 Operator를 계속 실행될 수 있습니다. 이러한 기존 Operator에서 업그레이드를 수행하면 기존 Operator가 새 Operator와 같이 서비스 계정에 부여된 권한에 따라 다시 설치되어 실행됩니다.
- 권한을 추가하거나 제거함으로써 Operator group에서 지정하는 서비스 계정이 변경되거나 기존 서비스 계정을 새 서비스 계정과 교체합니다. 기존 Operator에서 업그레이드를 수행하면 기존 Operator가 새 Operator와 같이 업데이트된 서비스 계정에 부여된 권한에 따라 다시 설치되어 실행됩니다.
- 클러스터 관리자는 Operator group에서 서비스 계정을 제거합니다. 기본 동작은 유지되고 Operator 설치 및 업그레이드는 허용됩니다.
4.8.1.2. 설치 워크플로
Operator group이 서비스 계정에 연결되고 Operator가 설치 또는 업그레이드되면 OLM(Operator Lifecycle Manager)에서 다음과 같은 워크플로를 사용합니다.
-
OLM에서 지정된
Subscription
오브젝트를 선택합니다. - OLM에서 이 서브스크립션에 연결된 Operator group을 가져옵니다.
- OLM에서 Operator group에 서비스 계정이 지정되었는지 확인합니다.
- OLM에서 서비스 계정에 대한 클라이언트 범위를 생성하고 범위가 지정된 클라이언트를 사용하여 Operator를 설치합니다. 이렇게 하면 Operator에서 요청한 모든 권한이 항상 Operator group 서비스 계정의 권한으로 제한됩니다.
- OLM은 CSV에 지정된 권한 세트를 사용하여 새 서비스 계정을 생성하고 Operator에 할당합니다. Operator는 할당된 서비스 계정으로 실행됩니다.
4.8.2. Operator 설치 범위 지정
OLM(Operator Lifecycle Manager)의 Operator 설치 및 업그레이드에 대한 범위 지정 규칙을 제공하려면 서비스 계정을 Operator group에 연결합니다.
클러스터 관리자는 다음 예제를 통해 일련의 Operator를 지정된 네임스페이스로 제한할 수 있습니다.
사전 요구 사항
-
cluster-admin
역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
OpenShift CLI(
oc
)가 설치되어 있습니다.
프로세스
새 네임스페이스를 생성합니다.
예 4.9.
Namespace
오브젝트를 생성하는 명령의 예$ cat <<EOF | oc create -f - apiVersion: v1 kind: Namespace metadata: name: scoped EOF
Operator를 제한할 권한을 할당합니다. 이를 위해서는 새로 생성된 지정된 네임스페이스에 새 서비스 계정, 관련 역할 및 역할 바인딩을 생성해야 합니다.
다음 명령을 실행하여 서비스 계정을 생성합니다.
예 4.10.
ServiceAccount
오브젝트를 생성하는 명령의 예$ cat <<EOF | oc create -f - apiVersion: v1 kind: ServiceAccount metadata: name: scoped namespace: scoped EOF
다음 명령을 실행하여 보안을 생성합니다.
예 4.11. 장기 API 토큰
Secret
오브젝트를 생성하는 명령의 예$ cat <<EOF | oc create -f - apiVersion: v1 kind: Secret type: kubernetes.io/service-account-token 1 metadata: name: scoped namespace: scoped annotations: kubernetes.io/service-account.name: scoped EOF
- 1
- 시크릿은 서비스 계정에서 사용하는 수명이 긴 API 토큰이어야 합니다.
다음 명령을 실행하여 역할을 생성합니다.
주의이 예에서 역할은 서비스 계정 권한을 부여하여 지정된 네임 스페이스에서 데모 목적으로만 모든 작업을 수행할 수 있습니다. 프로덕션 환경에서는 더 세분화된 권한 세트를 생성해야 합니다. 자세한 내용은 "Fine-grained permissions"를 참조하십시오.
예 4.12.
Role
및RoleBinding
오브젝트를 생성하는 명령의 예$ cat <<EOF | oc create -f - apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: scoped namespace: scoped rules: - apiGroups: ["*"] resources: ["*"] verbs: ["*"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: scoped-bindings namespace: scoped roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: scoped subjects: - kind: ServiceAccount name: scoped namespace: scoped EOF
다음 명령을 실행하여 지정된 네임스페이스에
OperatorGroup
오브젝트를 생성합니다. 이 Operator group은 지정된 네임스페이스를 대상으로 하여 테넌시가 제한되도록 합니다. 또한 Operator group에서는 사용자가 서비스 계정을 지정할 수 있습니다.예 4.13.
OperatorGroup
오브젝트를 생성하는 명령의 예$ cat <<EOF | oc create -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: scoped namespace: scoped spec: serviceAccountName: scoped 1 targetNamespaces: - scoped EOF
- 1
- 이전 단계에서 생성한 서비스 계정을 지정합니다. 지정된 네임스페이스에 설치된 Operator는 모두 이 Operator group 및 지정된 서비스 계정에 연결됩니다.
지정된 네임스페이스에
Subscription
오브젝트를 생성하여 Operator를 설치합니다.예 4.14.
Subscription
오브젝트를 생성하는 명령의 예$ cat <<EOF | oc create -f - apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: openshift-cert-manager-operator namespace: scoped spec: channel: stable-v1 name: openshift-cert-manager-operator source: <catalog_source_name> 1 sourceNamespace: <catalog_source_namespace> 2 EOF
Operator group에 연결된 모든 Operator의 권한이 지정된 서비스 계정에 부여된 권한으로 제한됩니다. Operator에서 서비스 계정 외부에 있는 권한을 요청하는 경우 설치가 실패하고 관련 오류가 표시됩니다.
4.8.2.1. 세분화된 권한
OLM(Operator Lifecycle Manager)은 Operator group에 지정된 서비스 계정을 사용하여 설치 중인 Operator와 관련하여 다음 리소스를 생성하거나 업데이트합니다.
-
ClusterServiceVersion
-
서브스크립션
-
Secret
-
ServiceAccount
-
Service
-
ClusterRole
및ClusterRoleBinding
-
Role
및RoleBinding
Operator를 지정된 네임스페이스로 제한하려면 클러스터 관리자가 서비스 계정에 다음 권한을 부여하여 시작하면 됩니다.
다음 역할은 일반적인 예이며 특정 Operator를 기반으로 추가 규칙이 필요할 수 있습니다.
kind: Role rules: - apiGroups: ["operators.coreos.com"] resources: ["subscriptions", "clusterserviceversions"] verbs: ["get", "create", "update", "patch"] - apiGroups: [""] resources: ["services", "serviceaccounts"] verbs: ["get", "create", "update", "patch"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["roles", "rolebindings"] verbs: ["get", "create", "update", "patch"] - apiGroups: ["apps"] 1 resources: ["deployments"] verbs: ["list", "watch", "get", "create", "update", "patch", "delete"] - apiGroups: [""] 2 resources: ["pods"] verbs: ["list", "watch", "get", "create", "update", "patch", "delete"]
또한 Operator에서 가져오기 보안을 지정하는 경우 다음 권한도 추가해야 합니다.
kind: ClusterRole 1
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
---
kind: Role
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["create", "update", "patch"]
- 1
- OLM 네임스페이스에서 보안을 가져오는 데 필요합니다.
4.8.3. Operator 카탈로그 액세스 제어
글로벌 카탈로그 네임스페이스 openshift-marketplace
에 Operator 카탈로그가 생성되면 카탈로그의 Operator가 모든 네임스페이스에 클러스터 전체에서 사용할 수 있습니다. 다른 네임스페이스에 생성된 카탈로그는 카탈로그의 동일한 네임스페이스에서만 Operator를 사용할 수 있도록 합니다.
비 클러스터 관리자 사용자가 Operator 설치 권한을 위임한 클러스터에서 클러스터 관리자는 해당 사용자가 설치할 수 있는 Operator 집합을 추가로 제어하거나 제한하려고 할 수 있습니다. 이 작업은 다음 작업을 통해 수행할 수 있습니다.
- 기본 글로벌 카탈로그를 모두 비활성화합니다.
- 관련 Operator 그룹이 사전 설치된 동일한 네임스페이스에서 사용자 정의 큐레이션 카탈로그를 활성화합니다.
4.8.4. 권한 장애 문제 해결
권한 부족으로 인해 Operator 설치가 실패하는 경우 다음 절차를 사용하여 오류를 확인합니다.
프로세스
Subscription
오브젝트를 검토합니다. 해당 상태에는 Operator에 필요한[Cluster]Role[Binding]
오브젝트를 생성하는InstallPlan
오브젝트를 가리키는 오브젝트 참조installPlanRef
가 있습니다.apiVersion: operators.coreos.com/v1 kind: Subscription metadata: name: etcd namespace: scoped status: installPlanRef: apiVersion: operators.coreos.com/v1 kind: InstallPlan name: install-4plp8 namespace: scoped resourceVersion: "117359" uid: 2c1df80e-afea-11e9-bce3-5254009c9c23
InstallPlan
오브젝트의 상태에 오류가 있는지 확인합니다.apiVersion: operators.coreos.com/v1 kind: InstallPlan status: conditions: - lastTransitionTime: "2019-07-26T21:13:10Z" lastUpdateTime: "2019-07-26T21:13:10Z" message: 'error creating clusterrole etcdoperator.v0.9.4-clusterwide-dsfx4: clusterroles.rbac.authorization.k8s.io is forbidden: User "system:serviceaccount:scoped:scoped" cannot create resource "clusterroles" in API group "rbac.authorization.k8s.io" at the cluster scope' reason: InstallComponentFailed status: "False" type: Installed phase: Failed
오류 메시지에는 다음이 표시됩니다.
-
리소스의 API 그룹을 포함하여 생성할 수 없는 리소스 유형. 이 경우
rbac.authorization.k8s.io
그룹의clusterroles
입니다. - 리소스의 이름.
-
오류 유형
is forbidden
은 사용자에게 작업을 수행할 수 있는 권한이 충분하지 않음을 나타냅니다. - 리소스를 생성하거나 업데이트하려고 시도한 사용자의 이름. 이 경우 Operator group에 지정된 서비스 계정을 나타냅니다.
작업 범위:
cluster scope
여부사용자는 서비스 계정에 누락된 권한을 추가한 다음 다시 수행할 수 있습니다.
참고OLM(Operator Lifecycle Manager)은 현재 첫 번째 시도에서 전체 오류 목록을 제공하지 않습니다.
-
리소스의 API 그룹을 포함하여 생성할 수 없는 리소스 유형. 이 경우