개요
- 사이트
- 외부 비밀 관리 시스템을 통합하는 Kubernetes operator
- AWS Secrets Manager
- HashiCorp Vault
- Google Secrets Manager
- Azure Key Vault
- IBM Cloud Secrets Manager
- CyberArk Conjur
- Pulumi ESC
- …
- 외부 API에서 Kubernetes로 Secret을 동기화
- operator는 외부 API에서 정보를 읽고 자동으로 값을 Kubernetes Secret에 주입
- Secret의 수명 주기를 저장하고 관리하는 외부 API에 대한 사용자 친화적인 추상화를 제공
- SecretStore, ExternalSecret, ClusterSecretStore, ClusterExternalSecret, PushSecret
설치
- helm
helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets --create-namespace --namespace external-secrets
예제
ClusterSecretStore에서 사용할 서비스어카운트 생성
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: secret-store
namespace: external-secrets
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secret-store
rules:
- apiGroups: [""]
resources:
- secrets
verbs:
- get
- list
- watch
- apiGroups:
- authorization.k8s.io
resources:
- selfsubjectrulesreviews
verbs:
- create
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: secret-store
namespace: external-secrets
subjects:
- kind: ServiceAccount
name: secret-store
namespace: external-secrets
roleRef:
kind: ClusterRole
name: secret-store
apiGroup: rbac.authorization.k8s.io
source 네임스페이스에 대한 ClusterSecretStore 생성
---
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: source
namespace: destination
spec:
provider:
kubernetes:
remoteNamespace: source
server:
caProvider:
type: ConfigMap
name: kube-root-ca.crt
namespace: external-secrets
key: ca.crt
auth:
serviceAccount:
name: secret-store
namespace: external-secrets
source 시크릿 생성
---
apiVersion: v1
kind: Secret
metadata:
name: source-01
namespace: source
data:
data-01: YWFh
data-02: YmJi
data-03: Y2Nj
type: Opaque
---
apiVersion: v1
kind: Secret
metadata:
name: source-02
namespace: source
data:
data-01: YWFh
data-02: YmJi
data-03: Y2Nj
type: Opaque
source 네임스페이스의 source-01 시트릿의 data-01을 destination 네임스페이스의 destination-01 시크릿에 1분마다 갱신하는 ExternalSecret 생성
---
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: source-01
namespace: destination
spec:
refreshInterval: 1m
secretStoreRef:
kind: ClusterSecretStore
name: source
target:
name: destination-01
template:
type: Opaque
data:
- secretKey: data-01
remoteRef:
key: source-01
property: data-01
source 네임스페이스의 source-01/source-02 시트릿을 destination 네임스페이스의 destination-02 시크릿에 1분마다 갱신하는 ExternalSecret 생성
---
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: source-01-02
namespace: destination
spec:
refreshInterval: 1m
secretStoreRef:
kind: ClusterSecretStore
name: source
target:
name: destination-02
dataFrom:
- find:
name:
regexp: "source-01"
- find:
name:
regexp: "source-02"