Kubernetes의 잠금

6166 단어 kubernetes

문제



Kubernetes와 같은 이벤트 기반 시스템에서는 RBAC를 사용하여 리소스에 대한 액세스를 제한할 수 있습니다. RBAC는 특정 리소스에 대한 필수 또는 배타적 잠금을 실행하도록 설계되지 않았습니다. 불가능하지는 않지만 복잡하고 오류가 발생하기 쉽다는 것을 알았습니다.

때때로 나는 원한다:
  • daily-report라는 이름의 CronJob이 상수입니다. 아무도 삭제하거나 업데이트할 수 없습니다.
  • 워크로드payroll는 UIDaa-dd-f445-d-55-d가 있는 행위자만 수정할 수 있으며 다른 사람은 수정할 수 없습니다.
  • 레이블이 site: for-fun인 모든 리소스를 업데이트할 수 있지만 삭제할 수는 없습니다.

  • 해결책



    RBAC를 사용하면 요구 사항을 부분적으로 충족할 수 있지만 여전히 운영자, 다른 자동화 도구 등을 사용하는 팀에서 작업할 때 항상 문제가 발생할 수 있습니다.

    다른 옵션은 ValidatingAdmissionWebhook 입니다. 특정 리소스에 액세스할 수 있는 사람과 액세스할 수 없는 사람을 나타내는 데 사용할 수 있습니다. 인증이나 권한 부여에 관한 것이 아니라 Kubernetes에서 해당 부분을 수행합니다. 액세스에 관한 것입니다.
    세분화된 액세스

    솔루션으로 Klock



    Klock은 위의 문제를 맞추기 위한 간단한 구현입니다. 필수 및 배타적 잠금을 허용하는 CRD를 추가합니다. 보호할 리소스를 일치시키는 것은 레이블을 일치시켜 수행됩니다. 뿐만 아니라 어떤 작업을 제한해야 하는지.

    ValidatingAdmissionWebhook 구성



    ValidatingAdmissionWebhook(VAW)가 적용되는 리소스는 VAW 구성에서 수행됩니다.

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    metadata:
      annotations:
        cert-manager.io/inject-ca-from: klock-system/klock-serving-cert
      name: klock-validating-webhook-configuration
    webhooks:
    - admissionReviewVersions:
      - v1
      clientConfig:
        service:
          name: klock-webhook-service
          namespace: klock-system
          path: /validate-all
      failurePolicy: Fail
      name: klocks.rnemet.dev
      rules:
      - apiGroups:
        - '*'
        apiVersions:
        - '*'
        operations:
        - DELETE
        - UPDATE
        resources:
        - pods
        - deployments
        - secrets
        - configmaps
      sideEffects: None
    


    위의 구성에서 UPDATE 또는 DELETE가 포드, 배포, 비밀 또는 구성 맵에서 실행될 때마다 모든 api 그룹 및 모든 버전에 대해 읽을 수 있으며 VAW에 먼저 확인하도록 요청할 수 있습니다.

    필수 잠금



    예를 참조하십시오:

    apiVersion: klock.rnemet.dev/v1
    kind: Lock
    metadata:
      name: lock-red-blue
      namespace: yellow
    spec:
      operations:
        - DELETE
      matcher:
        aura: blue
    


    이제 VAW에 위의 구성Lock이 있는 경우 동일한 네임스페이스의 모든 포드, 배포, 비밀 및 구성 맵에 유효합니다. 레이블이 aura: red 인 포드, 배포, 비밀 또는 configmap의 삭제를 거부합니다.

    독점 잠금




    apiVersion: klock.rnemet.dev/v1
    kind: Lock
    metadata:
      name: lockred
    spec:
      operations:
        - UPDATE
        - DELETE
      matcher:
        aura: red
      exclusive:
        name: johny
    


    배타적 잠금operations을 사용하면 이 예에서 이름이 johny 인 액터를 제외하고 모두 금지됩니다. 따라서 위와 동일하게 Lock 에 대해 johny 를 무시합니다.

    결론



    Klock을 확인하고 더 자세히 살펴볼 수 있습니다. 더 많은 예는 /tests/를 참조하십시오.

    좋은 웹페이지 즐겨찾기