Closed ByeongHunKim closed 1 month ago
Dynamic Admission Control Docs
먼저 성호님이 주셨던 링크에 있는 설명을 첨부하자면 아래와 같은데, 이렇게 이해하면 편할 것 같다
예를 들어, 어떤 사람이 미술 전시관을 관람한다고 생각해 봅시다. 그 사람은 전시관 입구에서 신원확인(Authentication)을 받은 후 표 검사를 통해 입장할 수 있는 허가(Authorization)를 받습니다. 그렇다고 해서 그 사람이 전시품을 마음대로 만지거나 훼손할 수 있는 것은 아니기에 전시장에서 전시품을 만지는 행동을 제한(validating admission control) 받거나 목소리를 낮추도록(mutating admission control) 요구 받습니다. 이것이 Admission Control입니다. 관리자의 정책에 따라 세부적인 작업을 제한하거나 변경 시키는 것입니다.
쿠버네티스의 많은 컴포넌트들이 그렇듯이 Admission Control도 Webhook으로 사용자에게 API가 열려 있습니다. 쿠버네티스가 정의한 인터페이스만 잘 맞춘다면 사용자는 자신만의 Admission Controller를 구현할 수 있습니다. 쿠버네티스에서는 이것을 Dynamic Admission Controller 라고 부르고 크게 MutatingWebhook과 ValidatingWebhook으로 나뉩니다.
kubectl get mutatingwebhookconfigurations
# output
# NAME WEBHOOKS AGE
# istio-sidecar-injector 4 112d
$kubectl label namespace <namespace name> istio-injection=enabled
명령어로 네임스페이스에 istio-injection=enabled
레이블을 추가하는 것은 Istio의 Mutating Admission Controller가 동작하도록 트리거하는 역할을 한다kubectl get mutatingwebhookconfigurations istio-sidecar-injector -o jsonpath='{.webhooks[2]}' | yq -P
namespace.sidecar-injector.istio.io
의 namespaceSelector 부분이다namespaceSelector:
matchExpressions:
- key: istio-injection
operator: In
values:
- enabled
- key: istio-injection
operator: In
values:
- enabled
Question / 질문 내용
Istio sidecar injection 되는 상세 과정
Context / 상황 설명
해당 네임스페이스에 'istio-injection=enabled' 라벨이 추가된 이후에 어떤 동작 원리로 sidecar container가 주입되는 지 이해하지 못하였습니다
What I've Tried / 시도한 방법 질문에 대한 답을 찾기 위해 시도해본 방법이 있다면 설명해주세요
유튜브 링크
Resources / 관련 자료 질문과 관련된 문서, 링크, 코드 등이 있다면 여기에 첨부해주세요
Additional context / 추가 사항 기타 추가적인 정보나 생각이 있다면 여기에 작성해주세요
이 명령을 실행하면 즉시 'default' 네임스페이스에 'istio-injection=enabled' 라벨이 추가됩니다 하지만 이 시점에서는 MutatingWebhookConfiguration이 직접적으로 실행되지 않습니다
MutatingWebhookConfiguration은 새로운 Pod가 해당 네임스페이스에 생성될 때 실행됩니다 즉, 라벨링 이후에 새로운 Pod가 생성될 때 Istio 사이드카 주입이 이루어집니다
이미 실행 중인 Pod들은 이 변경의 영향을 받지 않습니다 기존 Pod에 Istio 사이드카를 주입하려면 해당 Pod를 재시작해야 합니다(
$kubectl rollout restart deployment
)Pod 생성 요청이 Kubernetes API 서버로 전송됩니다 API 서버는 MutatingWebhookConfiguration을 확인하고, 설정된 조건(이 경우 'istio-injection=enabled' 라벨)과 일치하는지 확인합니다 조건이 일치하면, API 서버는 istio-sidecar-injector 웹훅을 호출합니다 웹훅은 Pod 스펙을 수정하여 Istio 사이드카 컨테이너를 추가합니다 수정된 Pod 스펙이 다시 API 서버로 전달되고, 최종적으로 이 수정된 스펙으로 Pod가 생성됩니다