1 minute read

개요

  • 사이트
  • 외부 비밀 관리 시스템을 통합하는 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


API


Provider


설치

  • 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"