Kubernetes에서 배타적 잠금을 만드는 방법
10792 단어 kubernetes
Kubernetes 클러스터에서 실행 중인 애플리케이션이 있습니다. 목표는 이 응용 프로그램을 모든 수정으로부터 보호하는 것입니다.
이러한 수정이 미리 정의된 액터에서 오는 경우는 예외입니다.
설치 요구 사항
시작하려면 Kind 클러스터와 Klock을 설정하겠습니다. 이미 Kind 을(를) 설치했다고 가정합니다.
이제 클러스터를 만들고 모든 요구 사항을 설치해 보겠습니다.
kind create cluster
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.2/cert-manager.yaml
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에서 배타적 잠금을 만드는 것이 가능함을 보여줍니다.
Reference
이 문제에 관하여(Kubernetes에서 배타적 잠금을 만드는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/madmaxx/how-to-make-exclusive-locks-in-kubernetes-23if텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)