Kubernetes에서 배타적 잠금을 만드는 방법

10792 단어 kubernetes
Klock: 독점 잠금 프라이머

Kubernetes 클러스터에서 실행 중인 애플리케이션이 있습니다. 목표는 이 응용 프로그램을 모든 수정으로부터 보호하는 것입니다.
이러한 수정이 미리 정의된 액터에서 오는 경우는 예외입니다.

설치 요구 사항



시작하려면 Kind 클러스터와 Klock을 설정하겠습니다. 이미 Kind 을(를) 설치했다고 가정합니다.
이제 클러스터를 만들고 모든 요구 사항을 설치해 보겠습니다.
  • 클러스터 생성: kind create cluster
  • cert-manager 설치: kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.2/cert-manager.yaml
  • Klock 설치:

  • helm repo add rnemet https://rnemet.dev/helm-charts
    helm repo update
    helm install klock rnemet/klock
    

    설정 시나리오



    내 애플리케이션에는 하나의 Pod와 하나의 ConfigMap이 있습니다. 기본적으로 Klock은 배포, 포드, 비밀 및 ConfigMap 잠금을 지원합니다. 그래서 나는 거기에 덮여있다.

    애플리케이션, 하나의 Pod 및 하나의 ConfigMap을 배포해 보겠습니다.

    kubectl run my-pod --image nginx --labels aura=red
    kubectl create configmap my-cm --from-literal nikola=tesla
    kubectl label cm my-cm aura=red
    


    Pod를 하나 더 추가합니다.

    kubectl run other-pod --image nginx
    


    기본 네임스페이스에 무엇이 있는지 확인합니다.

    ❯ kubectl get pods,cm
    NAME            READY   STATUS    RESTARTS   AGE
    pod/my-pod      1/1     Running   0          5m52s
    pod/other-pod   1/1     Running   0          112s
    
    NAME                         DATA   AGE
    configmap/kube-root-ca.crt   1      18m
    configmap/my-cm              1      4m20s
    


    우리의 응용 프로그램은 다음과 같습니다.

    ❯ kubectl get pod,cm -A --selector aura=red
    NAMESPACE   NAME         READY   STATUS    RESTARTS   AGE
    default     pod/my-pod   1/1     Running   0          7m2s
    
    NAMESPACE   NAME              DATA   AGE
    default     configmap/my-cm   1      5m30s
    


    소위 운영자가 애플리케이션을 관리하는 데 사용할 하나의 서비스 계정(SA)을 추가해 보겠습니다.

    kubectl create serviceaccount jonny-op
    


    jonny-op을 사용하여 포드를 나열하려는 경우:

    ❯ kubectl run operator  --image roffe/kubectl --overrides='{"apiVersion":"v1","spec":{"serviceAccount":"jonny-op"}}' -it --restart Never -- /bin/sh -c "kubectl -n default get pods"
    No resources found.
    Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:jonny-op" cannot list resource "pods" in API group "" in the namespace "default"
    pod default/operator terminated (Error)
    


    여기에서는 가짜 연산자를 사용하여 기본 네임스페이스의 모든 포드를 나열하려고 합니다. 운영자가 SA jonny-op로 실행하면 포드를 나열할 수 없습니다. 우리의 응용 프로그램은 어떻습니까?

    kubectl delete pod operator
    ❯ kubectl run operator  --image roffe/kubectl --overrides='{"apiVersion":"v1","spec":{"serviceAccount":"jonny-op"}}' -it --restart Never -- /bin/sh -c "kubectl get pod,cm  --selector aura=red"
    No resources found.
    Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:jonny-op" cannot list resource "pods" in API group "" in the namespace "default"
    Error from server (Forbidden): configmaps is forbidden: User "system:serviceaccount:default:jonny-op" cannot list resource "configmaps" in API group "" in the namespace "default"
    pod default/operator terminated (Error)
    


    Doh... Role 및 RoleBinding을 생성하여 이 문제를 해결해 보겠습니다.

    kubectl create role app-op --verb list --verb get --verb create --verb update --verb delete --verb patch --resource pods --resource cm
    kubectl create rolebinding jonny-app --role app-op --serviceaccount default:jonny-op
    


    그리고 확인:

    ❯ kubectl delete pod operator
    pod "operator" deleted
    ❯ kubectl run operator  --image roffe/kubectl --overrides='{"apiVersion":"v1","spec":{"serviceAccount":"jonny-op"}}' -it --restart Never -- /bin/sh -c "kubectl get pod,cm  --selector aura=red"
    If you don't see a command prompt, try pressing enter.
    NAME         READY     STATUS    RESTARTS   AGE
    pod/my-pod   1/1       Running   0          26m
    
    NAME              DATA      AGE
    configmap/my-cm   1         25m
    


    알림: 운영자 포드는 업데이트할 수 없기 때문에 매번 삭제해야 합니다. Pod로 연산자를 시뮬레이트합니다.

    시나리오 실행



    나, 외부 행위자는 Pod my-pod와 ConfigMap my-cm을 모두 수정할 수 있습니다. 글쎄요, 저는 클러스터를 만들었고 이 경우에는 관리자이므로 자연스러운 일입니다.
    표시된 대로 SA jonny-op 또는 연산자를 사용하여 워크로드를 실행하는 기본 네임스페이스에서 동일한 작업을 수행할 수 있습니다. 하지만 내 목표는 정당하고 오직 jonny_op
    할 수있어. 그리고 내 응용 프로그램에만 해당됩니다.

    내 애플리케이션의 모든 리소스는 aura=red 레이블로 그룹화됩니다. 이제 잠금을 생성해 보겠습니다.

    kubectl apply -f - <<EOF
    apiVersion: klock.rnemet.dev/v1
    kind: Lock
    metadata:
      name: lockred
    spec:
      operations:
        - UPDATE
        - DELETE
      matcher:
        aura: red
      exclusive:
        name: jonny-op
    EOF
    


    이제 Pod my-pod를 업데이트해 보겠습니다.

    ❯ kubectl label pod my-pod aura=blue --overwrite
    Error from server (denied, there is a lock: map[aura:red]): admission webhook "klocks.rnemet.dev" denied the request: denied, there is a lock: map[aura:red]
    


    알겠습니다... Pod other-pod는 어떻습니까?

    ❯ kubectl label pod other-pod aura=blue --overwrite
    pod/other-pod labeled
    


    따라서 나는 관리자로서 aura:red 로 레이블이 지정되지 않은 Pod에 label(UPDATE) 을 지정할 수 있습니다. SA jonny-op은 어떻습니까?

    ❯ kubectl run operator  --image roffe/kubectl --overrides='{"apiVersion":"v1","spec":{"serviceAccount":"jonny-op"}}' -it --restart Never -- /bin/sh -c "kubectl label pod my-pod here=was-jonny"
    pod/my-pod labeled
    ❯ k get pods --show-labels
    NAME        READY   STATUS      RESTARTS   AGE   LABELS
    my-pod      1/1     Running     0          91m   aura=red,here=was-jonny
    operator    0/1     Completed   0          25s   run=operator
    other-pod   1/1     Running     0          87m   aura=blue,run=other-pod
    


    ConfigMap my-cm은 어떻습니까?

    ❯ kubectl label cm my-cm admin=was-here
    Error from server (denied, there is a lock: map[aura:red]): admission webhook "klocks.rnemet.dev" denied the request: denied, there is a lock: map[aura:red]
    ❯ k delete pods operator
    pod "operator" deleted
    ❯ kubectl run operator  --image roffe/kubectl --overrides='{"apiVersion":"v1","spec":{"serviceAccount":"jonny-op"}}' -it --restart Never -- /bin/sh -c "kubectl label cm my-cm here=was-jonny"
    configmap/my-cm labeled
    ❯ kubectl get cm --show-labels
    NAME               DATA   AGE    LABELS
    kube-root-ca.crt   1      108m   <none>
    my-cm              1      94m    aura=red,here=was-jonny
    


    같은. 그래서 SA jonny-op이 함께 작동할 수 있는 동안 클러스터의 다른 행위자로부터 내 애플리케이션을 보호할 수 있었습니다.

    결론



    이것이 더 수동적인 예일지라도 Klock을 사용하여 Kubernetes에서 배타적 잠금을 만드는 것이 가능함을 보여줍니다.

    좋은 웹페이지 즐겨찾기