<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Kubernetes DD on mungOps</title>
    <link>https://mungops.github.io/devops/kubernetes/deepdive/</link>
    <description>Recent content in Kubernetes DD on mungOps</description>
    <generator>Hugo</generator>
    <language>en</language>
    <atom:link href="https://mungops.github.io/devops/kubernetes/deepdive/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>API Server DD</title>
      <link>https://mungops.github.io/devops/kubernetes/deepdive/k8s00/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mungops.github.io/devops/kubernetes/deepdive/k8s00/</guid>
      <description>&lt;div class=&#34;hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code&#34;&gt;&#xA;&#xA;&lt;div&gt;&lt;pre&gt;&lt;code&gt;Kubernetes API Server 통신 구조 (Verb 중심)&#xA;&#xA;아래는 kube-apiserver 기준으로 각 주요 컴포넌트가 어떤 Kubernetes API Verb를 사용하는지 정리한 구조입니다.&#xA;&#xA;그라파나에서 트레이싱할 때 핵심 메트릭은 보통 다음입니다.&#xA;&#xA;verb&#xA;resource&#xA;subresource&#xA;useragent&#xA;component&#xA;code&#xA;scope&#xA;namespace&#xA;&#xA;특히 아래 metric/log source를 많이 사용합니다.&#xA;&#xA;apiserver_request_total&#xA;apiserver_request_duration_seconds&#xA;Audit Logs&#xA;APIServer tracing (otel)&#xA;etcd request metrics&#xA;전체 구조도&#xA;                                      &amp;#43;-------------------&amp;#43;&#xA;                                      |   kubectl / CI    |&#xA;                                      |  humans / bots    |&#xA;                                      &amp;#43;---------&amp;#43;---------&amp;#43;&#xA;                                                |&#xA;                                                | GET/LIST/WATCH&#xA;                                                | CREATE/UPDATE/PATCH/DELETE&#xA;                                                v&#xA;&amp;#43;----------------------------------------------------------------------------------&amp;#43;&#xA;|                              kube-apiserver                                      |&#xA;|----------------------------------------------------------------------------------|&#xA;| Authentication → Authorization → Admission → Validation → etcd                  |&#xA;&amp;#43;----------------------------------------------------------------------------------&amp;#43;&#xA;        ^                ^                    ^                     ^&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;&amp;#43;-------&amp;#43;----&amp;#43;   &amp;#43;-------&amp;#43;------&amp;#43;   &amp;#43;---------&amp;#43;------&amp;#43;   &amp;#43;---------&amp;#43;--------&amp;#43;&#xA;| kubelet    |   | controller   |   | scheduler       |   | cloud-controller |&#xA;|             |   | manager      |   |                 |   | manager          |&#xA;&amp;#43;-------&amp;#43;----&amp;#43;   &amp;#43;-------&amp;#43;------&amp;#43;   &amp;#43;---------&amp;#43;------&amp;#43;   &amp;#43;---------&amp;#43;--------&amp;#43;&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        |                |                    |                     |&#xA;        &amp;#43;----------------&amp;#43;--------------------&amp;#43;---------------------&amp;#43;&#xA;                                 |&#xA;                                 |&#xA;                                 v&#xA;                              &amp;#43;------&amp;#43;&#xA;                              | etcd |&#xA;                              &amp;#43;------&amp;#43;&#xA;컴포넌트별 Verb 흐름&#xA;1. kubelet ↔ kube-apiserver&#xA;kubelet → apiserver&#xA;kubelet&#xA;   |&#xA;   &amp;#43;--&amp;gt; WATCH Pods&#xA;   &amp;#43;--&amp;gt; WATCH ConfigMaps&#xA;   &amp;#43;--&amp;gt; WATCH Secrets&#xA;   &amp;#43;--&amp;gt; WATCH RuntimeClasses&#xA;   &amp;#43;--&amp;gt; GET Node&#xA;   &amp;#43;--&amp;gt; PATCH Node/status&#xA;   &amp;#43;--&amp;gt; UPDATE Node/status&#xA;   &amp;#43;--&amp;gt; CREATE Event&#xA;   &amp;#43;--&amp;gt; PATCH Lease&#xA;   &amp;#43;--&amp;gt; GET CSR&#xA;   &amp;#43;--&amp;gt; CREATE CSR&#xA;핵심 Verb&#xA;Resource&#x9;Verb&#x9;목적&#xA;pods&#x9;WATCH&#x9;스케줄된 Pod 감지&#xA;configmaps&#x9;WATCH&#x9;설정 동기화&#xA;secrets&#x9;WATCH&#x9;Secret 동기화&#xA;nodes/status&#x9;PATCH/UPDATE&#x9;노드 상태 보고&#xA;leases&#x9;PATCH&#x9;heartbeat&#xA;events&#x9;CREATE&#x9;이벤트 기록&#xA;certificatesigningrequests&#x9;CREATE&#x9;kubelet 인증서&#xA;2. kube-controller-manager ↔ kube-apiserver&#xA;&#xA;컨트롤러별로 매우 많음.&#xA;&#xA;대표 흐름:&#xA;&#xA;controller-manager&#xA;   |&#xA;   &amp;#43;--&amp;gt; WATCH *&#xA;   &amp;#43;--&amp;gt; LIST *&#xA;   &amp;#43;--&amp;gt; UPDATE status&#xA;   &amp;#43;--&amp;gt; PATCH objects&#xA;   &amp;#43;--&amp;gt; CREATE Pods&#xA;   &amp;#43;--&amp;gt; DELETE Pods&#xA;   &amp;#43;--&amp;gt; UPDATE finalizers&#xA;주요 Controller별 Verb&#xA;Controller&#x9;주요 Verb&#xA;Deployment Controller&#x9;WATCH ReplicaSets, PATCH Deployments&#xA;ReplicaSet Controller&#x9;LIST Pods, CREATE Pods, DELETE Pods&#xA;Node Controller&#x9;WATCH Nodes, PATCH Nodes&#xA;Job Controller&#x9;CREATE Pods, DELETE Pods&#xA;ServiceAccount Controller&#x9;CREATE Secrets&#xA;EndpointSlice Controller&#x9;WATCH Services/Pods, UPDATE EndpointSlices&#xA;3. kube-scheduler ↔ kube-apiserver&#xA;scheduler&#xA;   |&#xA;   &amp;#43;--&amp;gt; WATCH Pods&#xA;   &amp;#43;--&amp;gt; WATCH Nodes&#xA;   &amp;#43;--&amp;gt; WATCH PVC/PV&#xA;   &amp;#43;--&amp;gt; WATCH CSINodes&#xA;   &amp;#43;--&amp;gt; PATCH Pod/binding&#xA;   &amp;#43;--&amp;gt; UPDATE Pod&#xA;핵심 Verb&#xA;Resource&#x9;Verb&#xA;pods&#x9;WATCH&#xA;nodes&#x9;WATCH&#xA;pods/binding&#x9;CREATE&#xA;pods/status&#x9;UPDATE&#xA;events&#x9;CREATE&#xA;&#xA;스케줄러는 실제로 binding subresource를 사용합니다.&#xA;&#xA;4. cloud-controller-manager ↔ kube-apiserver&#xA;cloud-controller-manager&#xA;   |&#xA;   &amp;#43;--&amp;gt; WATCH Nodes&#xA;   &amp;#43;--&amp;gt; UPDATE Nodes&#xA;   &amp;#43;--&amp;gt; WATCH Services&#xA;   &amp;#43;--&amp;gt; UPDATE Services/status&#xA;   &amp;#43;--&amp;gt; CREATE Events&#xA;대표 Verb&#xA;Resource&#x9;Verb&#xA;services/status&#x9;UPDATE&#xA;nodes&#x9;PATCH&#xA;routes&#x9;CREATE&#xA;events&#x9;CREATE&#xA;5. kubectl ↔ kube-apiserver&#xA;kubectl&#xA;   |&#xA;   &amp;#43;--&amp;gt; GET&#xA;   &amp;#43;--&amp;gt; LIST&#xA;   &amp;#43;--&amp;gt; WATCH&#xA;   &amp;#43;--&amp;gt; CREATE&#xA;   &amp;#43;--&amp;gt; APPLY(PATCH)&#xA;   &amp;#43;--&amp;gt; DELETE&#xA;   &amp;#43;--&amp;gt; PATCH&#xA;   &amp;#43;--&amp;gt; REPLACE(PUT)&#xA;6. Operators / Controllers (client-go)&#xA;&#xA;대부분 동일 패턴:&#xA;&#xA;Reflector:&#xA;   LIST&#xA;   WATCH&#xA;&#xA;Reconciler:&#xA;   GET&#xA;   PATCH&#xA;   UPDATE&#xA;   CREATE&#xA;   DELETE&#xA;&#xA;controller-runtime 기반이면 거의 동일합니다.&#xA;&#xA;Verb 기준 전체 맵&#xA;WATCH&#xA; ├─ kubelet&#xA; ├─ scheduler&#xA; ├─ controller-manager&#xA; ├─ operators&#xA; └─ kubectl&#xA;&#xA;LIST&#xA; ├─ scheduler&#xA; ├─ controllers&#xA; ├─ operators&#xA; └─ kubectl&#xA;&#xA;GET&#xA; ├─ kubelet&#xA; ├─ kubectl&#xA; ├─ operators&#xA; └─ controllers&#xA;&#xA;CREATE&#xA; ├─ controllers (pods/events)&#xA; ├─ scheduler (binding)&#xA; ├─ kubelet (events/csr)&#xA; ├─ kubectl&#xA; └─ operators&#xA;&#xA;PATCH&#xA; ├─ kubelet (node status/lease)&#xA; ├─ scheduler&#xA; ├─ controllers&#xA; ├─ operators&#xA; └─ kubectl apply&#xA;&#xA;UPDATE&#xA; ├─ controllers&#xA; ├─ kubelet&#xA; ├─ scheduler&#xA; └─ cloud-controller-manager&#xA;&#xA;DELETE&#xA; ├─ controllers&#xA; ├─ kubectl&#xA; └─ operators&#xA;Grafana / Prometheus 에서 가장 중요한 메트릭&#xA;APIServer Request Count&#xA;sum by (verb,resource) (&#xA;  rate(apiserver_request_total[5m])&#xA;)&#xA;컴포넌트별 Verb&#xA;sum by (verb,useragent) (&#xA;  rate(apiserver_request_total[5m])&#xA;)&#xA;WATCH 폭증 확인&#xA;sum by (resource) (&#xA;  rate(apiserver_request_total{verb=&amp;#34;WATCH&amp;#34;}[5m])&#xA;)&#xA;kubelet PATCH storm&#xA;sum by (node) (&#xA;  rate(apiserver_request_total{&#xA;    verb=&amp;#34;PATCH&amp;#34;,&#xA;    resource=&amp;#34;nodes&amp;#34;&#xA;  }[5m])&#xA;)&#xA;실무적으로 중요한 포인트&#xA;WATCH 는 Long-lived connection&#xA;&#xA;실제로는:&#xA;&#xA;LIST → WATCH&#xA;&#xA;패턴입니다.&#xA;&#xA;client-go reflector는 거의 항상:&#xA;&#xA;LIST initial state&#xA;WATCH incremental updates&#xA;&#xA;로 동작합니다.&#xA;&#xA;PATCH vs UPDATE&#xA;&#xA;Kubernetes 내부 컴포넌트는 대부분:&#xA;&#xA;PATCH&#xA;Status PATCH&#xA;Server Side Apply&#xA;&#xA;를 선호합니다.&#xA;&#xA;UPDATE(PUT) 는 상대적으로 적습니다.&#xA;&#xA;실제 가장 많은 Verb&#xA;&#xA;대규모 클러스터 기준:&#xA;&#xA;1. WATCH&#xA;2. LIST&#xA;3. PATCH&#xA;4. GET&#xA;5. CREATE&#xA;&#xA;순으로 많습니다.&#xA;&#xA;Audit Log 기준 실제 흐름 예시&#xA;kube-scheduler&#xA;WATCH pods&#xA;GET nodes&#xA;CREATE pods/binding&#xA;PATCH pods/status&#xA;CREATE events&#xA;kubelet&#xA;WATCH pods&#xA;WATCH secrets&#xA;PATCH nodes/status&#xA;PATCH leases&#xA;CREATE events&#xA;Grafana 추천 차원(dimensions)&#xA;&#xA;아래 label 조합이 가장 유용합니다.&#xA;&#xA;label&#x9;이유&#xA;verb&#x9;API 유형&#xA;resource&#x9;병목 리소스&#xA;subresource&#x9;status/binding 구분&#xA;code&#x9;실패율&#xA;component&#x9;어느 컴포넌트인지&#xA;useragent&#x9;client-go 구분&#xA;scope&#x9;cluster/ns&#xA;group&#x9;CRD 구분&#xA;특히 중요한 userAgent&#xA;&#xA;대표 예시:&#xA;&#xA;kubelet/v1.xx&#xA;kube-scheduler/v1.xx&#xA;kube-controller-manager/v1.xx&#xA;kubectl/v1.xx&#xA;external-secrets/vx&#xA;argocd-application-controller&#xA;helm&#xA;추천 Grafana 패널&#xA;1. Verb Heatmap&#xA;sum by (verb,resource)(&#xA; rate(apiserver_request_total[5m])&#xA;)&#xA;2. Slow Requests&#xA;histogram_quantile(&#xA;  0.99,&#xA;  sum by (verb,resource,le)(&#xA;    rate(apiserver_request_duration_seconds_bucket[5m])&#xA;  )&#xA;)&#xA;3. WATCH saturation&#xA;sum(&#xA;  apiserver_longrunning_requests&#xA;)&#xA;최종적으로 기억할 핵심&#xA;&#xA;쿠버네티스는 거의 모든 컴포넌트가:&#xA;&#xA;LIST → WATCH → RECONCILE → PATCH/UPDATE&#xA;&#xA;패턴으로 움직입니다.&#xA;&#xA;즉:&#xA;&#xA;Observe (LIST/WATCH)&#xA;→ Decide&#xA;→ Act (PATCH/UPDATE/CREATE/DELETE)&#xA;&#xA;가 Kubernetes control loop의 본질입니다.&#xA;&#xA;kube-apiserver 내부 파이프라인 상세 구조&#xA;&#xA;kube-apiserver 는 단순 REST API 서버가 아닙니다.&#xA;&#xA;실제로는:&#xA;&#xA;API Gateway&#xA;&amp;#43; Authentication Proxy&#xA;&amp;#43; Authorization Engine&#xA;&amp;#43; Admission Pipeline&#xA;&amp;#43; Object Validation Engine&#xA;&amp;#43; Distributed Watch Broker&#xA;&amp;#43; Consistency Layer&#xA;&amp;#43; Storage Abstraction&#xA;&#xA;가 합쳐진 구조입니다.&#xA;&#xA;전체 Request Lifecycle&#xA;&#xA;가장 중요한 전체 흐름부터 보면:&#xA;&#xA;Client&#xA;  |&#xA;  | HTTPS Request&#xA;  v&#xA;&amp;#43;-------------------------------------------------------------&amp;#43;&#xA;|                     kube-apiserver                          |&#xA;|-------------------------------------------------------------|&#xA;| 1. Authentication                                            |&#xA;| 2. Authorization                                             |&#xA;| 3. Mutating Admission                                        |&#xA;| 4. Validation / Schema / Defaulting                          |&#xA;| 5. Validating Admission                                      |&#xA;| 6. Storage Layer (etcd)                                      |&#xA;| 7. Watch Cache Fanout                                        |&#xA;&amp;#43;-------------------------------------------------------------&amp;#43;&#xA;  |&#xA;  v&#xA;etcd&#xA;내부 구조 상세&#xA;                      ┌──────────────────────────────┐&#xA;                      │        HTTP Server           │&#xA;                      │  (go-restful / net/http)     │&#xA;                      └─────────────┬────────────────┘&#xA;                                    │&#xA;                                    v&#xA;                     ┌──────────────────────────────┐&#xA;                     │        Authentication        │&#xA;                     │------------------------------│&#xA;                     │ x509                         │&#xA;                     │ Bearer Token                 │&#xA;                     │ ServiceAccount JWT           │&#xA;                     │ OIDC                         │&#xA;                     │ Webhook                      │&#xA;                     └─────────────┬────────────────┘&#xA;                                   │ user.Info&#xA;                                   v&#xA;                     ┌──────────────────────────────┐&#xA;                     │        Authorization         │&#xA;                     │------------------------------│&#xA;                     │ RBAC                         │&#xA;                     │ Node Authorizer              │&#xA;                     │ Webhook                      │&#xA;                     │ ABAC (legacy)                │&#xA;                     └─────────────┬────────────────┘&#xA;                                   │ allow/deny&#xA;                                   v&#xA;                     ┌──────────────────────────────┐&#xA;                     │      Admission Chain         │&#xA;                     │------------------------------│&#xA;                     │ MutatingAdmissionWebhook     │&#xA;                     │ ResourceQuota                │&#xA;                     │ PodSecurity                  │&#xA;                     │ LimitRanger                  │&#xA;                     │ ValidatingWebhook            │&#xA;                     └─────────────┬────────────────┘&#xA;                                   │ mutated object&#xA;                                   v&#xA;                     ┌──────────────────────────────┐&#xA;                     │ Validation / Defaulting      │&#xA;                     │------------------------------│&#xA;                     │ OpenAPI Schema               │&#xA;                     │ CRD Schema                   │&#xA;                     │ Strategic Merge              │&#xA;                     │ Server Side Apply            │&#xA;                     └─────────────┬────────────────┘&#xA;                                   │ validated object&#xA;                                   v&#xA;                     ┌──────────────────────────────┐&#xA;                     │      API REST Storage        │&#xA;                     │------------------------------│&#xA;                     │ RESTStrategy                 │&#xA;                     │ Generic Registry             │&#xA;                     │ Storage.Interface            │&#xA;                     └─────────────┬────────────────┘&#xA;                                   │&#xA;                                   v&#xA;                     ┌──────────────────────────────┐&#xA;                     │         Watch Cache          │&#xA;                     │------------------------------│&#xA;                     │ Cacher                       │&#xA;                     │ Reflector                    │&#xA;                     │ DeltaFIFO                    │&#xA;                     │ Watch Broadcaster            │&#xA;                     └─────────────┬────────────────┘&#xA;                                   │&#xA;                                   v&#xA;                     ┌──────────────────────────────┐&#xA;                     │            etcd              │&#xA;                     └──────────────────────────────┘&#xA;1. Authentication (AuthN)&#xA;역할&#xA;&amp;#34;누구인가?&amp;#34;&#xA;&#xA;를 확인.&#xA;&#xA;지원 방식&#xA;x509 Client Cert&#xA;CN=kubelet-node1&#xA;O=system:nodes&#xA;kubelet&#xA;controller-manager&#xA;scheduler&#xA;&#xA;가 주로 사용.&#xA;&#xA;Bearer Token&#xA;Authorization: Bearer eyJhbGc...&#xA;kubectl&#xA;operators&#xA;CI/CD&#xA;ServiceAccount JWT&#xA;&#xA;Pod 내부:&#xA;&#xA;/var/run/secrets/kubernetes.io/serviceaccount/token&#xA;OIDC&#xA;&#xA;예:&#xA;&#xA;Dex&#xA;Okta&#xA;Keycloak&#xA;Entra ID&#xA;Webhook Authenticator&#xA;&#xA;외부 auth server 위임.&#xA;&#xA;AuthN 결과&#xA;&#xA;최종적으로:&#xA;&#xA;user.Info&#xA;&#xA;생성.&#xA;&#xA;예:&#xA;&#xA;username: system:serviceaccount:argo:argocd&#xA;groups:&#xA;- system:serviceaccounts&#xA;- system:authenticated&#xA;2. Authorization (AuthZ)&#xA;역할&#xA;&amp;#34;무엇을 할 수 있는가?&amp;#34;&#xA;&#xA;판단.&#xA;&#xA;RBAC&#xA;&#xA;가장 핵심.&#xA;&#xA;예:&#xA;&#xA;verbs:&#xA;- get&#xA;- list&#xA;- watch&#xA;resources:&#xA;- pods&#xA;Node Authorizer&#xA;&#xA;kubelet 전용 특수 Authorizer.&#xA;&#xA;예:&#xA;&#xA;node-1 kubelet&#xA;→ 자기 node pod만 조회 가능&#xA;Webhook Authorizer&#xA;&#xA;OPA/Gatekeeper 같은 외부 시스템 위임.&#xA;&#xA;여기서 평가되는 것&#xA;user&#xA;verb&#xA;resource&#xA;namespace&#xA;subresource&#xA;apiGroup&#xA;resourceName&#xA;예시&#xA;system:serviceaccount:default:app&#xA;PATCH deployments.apps&#xA;namespace=prod&#xA;&#xA;RBAC 룰과 매칭.&#xA;&#xA;3. Admission Chain&#xA;&#xA;여기가 Kubernetes의 핵심 중 하나.&#xA;&#xA;역할&#xA;&amp;#34;요청 객체를 수정/거부&amp;#34;&#xA;순서&#xA;Mutating Admission&#xA;    ↓&#xA;Validation&#xA;    ↓&#xA;Validating Admission&#xA;Mutating Admission&#xA;&#xA;객체 수정 가능.&#xA;&#xA;예:&#xA;&#xA;Istio Sidecar Injection&#xA;Pod 생성&#xA;→ Envoy sidecar 자동 추가&#xA;Defaulting&#xA;imagePullPolicy: IfNotPresent&#xA;&#xA;자동 추가.&#xA;&#xA;대표 Mutating Plugins&#xA;Plugin&#x9;역할&#xA;MutatingAdmissionWebhook&#x9;custom webhook&#xA;ServiceAccount&#x9;token mount&#xA;DefaultStorageClass&#x9;storageclass default&#xA;RuntimeClass&#x9;runtime inject&#xA;Validation&#xA;&#xA;객체 구조 검사.&#xA;&#xA;OpenAPI Validation&#xA;replicas: &amp;#34;abc&amp;#34;&#xA;&#xA;거부.&#xA;&#xA;CRD Schema Validation&#xA;openAPIV3Schema&#xA;&#xA;기반 검증.&#xA;&#xA;Validating Admission&#xA;&#xA;수정 불가.&#xA;&#xA;허용/거부만 가능.&#xA;&#xA;예시&#xA;Pod Security Admission&#xA;privileged: true&#xA;&#xA;차단.&#xA;&#xA;Gatekeeper/Kyverno&#xA;&#xA;정책 강제.&#xA;&#xA;예:&#xA;&#xA;latest tag 금지&#xA;4. Mutation&#xA;&#xA;실제로는 Admission과 SSA 내부에서 수행.&#xA;&#xA;Strategic Merge Patch&#xA;containers:&#xA;- name: app&#xA;&#xA;기준 merge.&#xA;&#xA;Server Side Apply&#xA;&#xA;field ownership 추적.&#xA;&#xA;managedFields&#xA;&#xA;생성.&#xA;&#xA;핵심&#xA;&#xA;SSA는 apiserver 내부에서:&#xA;&#xA;3-way merge&#xA;&#xA;수행.&#xA;&#xA;5. API Aggregation&#xA;&#xA;엄청 중요.&#xA;&#xA;Kubernetes API를 확장 가능하게 함.&#xA;&#xA;구조&#xA;kubectl&#xA;   |&#xA;   v&#xA;kube-apiserver&#xA;   |&#xA;   &amp;#43;--&amp;gt; core API&#xA;   |&#xA;   &amp;#43;--&amp;gt; aggregated API server&#xA;예시&#xA;API&#x9;실제 서버&#xA;metrics.k8s.io&#x9;metrics-server&#xA;custom.metrics.k8s.io&#x9;prometheus-adapter&#xA;apiextensions.k8s.io&#x9;CRD API&#xA;APIService&#xA;kind: APIService&#xA;&#xA;로 연결.&#xA;&#xA;흐름&#xA;kubectl top pod&#xA;   ↓&#xA;apiserver aggregation layer&#xA;   ↓&#xA;metrics-server&#xA;6. Watch Cache&#xA;&#xA;대규모 클러스터 핵심.&#xA;&#xA;문제&#xA;&#xA;etcd 직접 LIST/WATCH 하면:&#xA;&#xA;etcd overload&#xA;&#xA;발생.&#xA;&#xA;해결&#xA;&#xA;apiserver 내부 cacher 사용.&#xA;&#xA;구조&#xA;etcd&#xA;  ↑&#xA;storage watcher&#xA;  ↑&#xA;watch cache&#xA;  ↑&#xA;client watchers&#xA;역할&#xA;LIST 최적화&#xA;LIST pod&#xA;→ cache memory 응답&#xA;WATCH fanout&#xA;1 etcd watch&#xA;→ 10,000 client watches&#xA;핵심 컴포넌트&#xA;Component&#x9;역할&#xA;Cacher&#x9;object cache&#xA;WatchBroadcaster&#x9;watch fanout&#xA;Reflector&#x9;backend sync&#xA;DeltaFIFO&#x9;event queue&#xA;Watch Event 흐름&#xA;Pod changed&#xA;   ↓&#xA;etcd revision update&#xA;   ↓&#xA;storage watcher&#xA;   ↓&#xA;watch cache update&#xA;   ↓&#xA;broadcast&#xA;   ↓&#xA;kubelet/controller/operator&#xA;왜 WATCH가 중요한가&#xA;&#xA;Kubernetes control loop는 거의 모두:&#xA;&#xA;WATCH → reconcile&#xA;&#xA;기반.&#xA;&#xA;Polling 아님.&#xA;&#xA;실제 성능 병목&#xA;&#xA;대규모 환경에서는 보통:&#xA;&#xA;병목&#x9;원인&#xA;LIST storm&#x9;controller restart&#xA;WATCH fanout&#x9;watcher 너무 많음&#xA;Large CRD&#x9;huge object&#xA;PATCH storm&#x9;status update flood&#xA;Admission latency&#x9;webhook 느림&#xA;etcd quorum latency&#x9;disk/network&#xA;실무적으로 가장 위험한 것&#xA;Admission Webhook&#xA;&#xA;엄청 자주 장애 원인.&#xA;&#xA;왜냐면:&#xA;&#xA;모든 API write path blocking&#xA;&#xA;이기 때문.&#xA;&#xA;예시&#xA;kubectl apply&#xA;   ↓&#xA;mutating webhook timeout&#xA;   ↓&#xA;entire cluster API latency 증가&#xA;그래서 반드시 봐야 하는 메트릭&#xA;Admission latency&#xA;histogram_quantile(&#xA;  0.99,&#xA;  sum by (name,le)(&#xA;    rate(apiserver_admission_controller_admission_duration_seconds_bucket[5m])&#xA;  )&#xA;)&#xA;Watch Cache Metrics&#xA;apiserver_watch_cache_events_dispatched_total&#xA;Request Volume&#xA;sum by (verb,resource,useragent)(&#xA;  rate(apiserver_request_total[5m])&#xA;)&#xA;최종 핵심&#xA;&#xA;kube-apiserver는 사실상:&#xA;&#xA;Kubernetes Distributed Kernel&#xA;&#xA;에 가깝습니다.&#xA;&#xA;단순 REST 서버가 아니라:&#xA;&#xA;Identity&#xA;&amp;#43; Policy&#xA;&amp;#43; Mutation&#xA;&amp;#43; Validation&#xA;&amp;#43; Event Distribution&#xA;&amp;#43; State Consistency&#xA;&amp;#43; API Federation&#xA;&#xA;를 모두 담당합니다.&#xA;&#xA;&amp;#43;-------------------------------------------------------------&amp;#43;&#xA;|                     kube-apiserver                          |&#xA;|-------------------------------------------------------------|&#xA;| 1. Authentication                                            |&#xA;| 2. Authorization                                             |&#xA;| 3. Mutating Admission                                        |&#xA;| 4. Validation / Schema / Defaulting                          |&#xA;| 5. Validating Admission                                      |&#xA;| 6. Storage Layer (etcd)                                      |&#xA;| 7. Watch Cache Fanout                                        |&#xA;&amp;#43;-------------------------------------------------------------&amp;#43;&#xA;&#xA;이 부분을 표로 정리해 줘 어떤 역할인지&#xA;단계&#x9;컴포넌트&#x9;역할&#x9;입력&#x9;출력&#x9;실패 시&#x9;대표 구현/플러그인&#x9;주요 Verb 영향&#xA;1&#x9;Authentication&#x9;요청 주체 식별 (누구인가)&#x9;TLS cert, Bearer Token, JWT, OIDC&#x9;user.Info&#x9;401 Unauthorized&#x9;x509, ServiceAccount JWT, OIDC, Webhook Authenticator&#x9;모든 verb&#xA;2&#x9;Authorization&#x9;요청 권한 확인 (무엇을 할 수 있는가)&#x9;user, verb, resource, namespace&#x9;allow / deny&#x9;403 Forbidden&#x9;RBAC, Node Authorizer, Webhook Authorizer&#x9;GET/LIST/WATCH/CREATE/PATCH 등&#xA;3&#x9;Mutating Admission&#x9;요청 객체 수정/주입&#x9;API object&#x9;mutated object&#x9;reject / timeout&#x9;MutatingWebhook, Istio Injection, DefaultStorageClass&#x9;CREATE, UPDATE, PATCH&#xA;4&#x9;Validation / Schema / Defaulting&#x9;객체 구조 및 schema 검증&#x9;mutated object&#x9;validated object&#x9;422 Unprocessable Entity&#x9;OpenAPI Validation, CRD Schema, SSA merge&#x9;CREATE, UPDATE, PATCH&#xA;5&#x9;Validating Admission&#x9;정책 기반 허용/거부&#x9;validated object&#x9;final accepted object&#x9;reject / timeout&#x9;ValidatingWebhook, PodSecurity, Kyverno, Gatekeeper&#x9;CREATE, UPDATE, DELETE&#xA;6&#x9;Storage Layer (etcd)&#x9;상태 영속화 및 revision 관리&#x9;final object&#x9;persisted state&#x9;etcd timeout/quorum failure&#x9;storage backend, storage.Interface&#x9;모든 write path&#xA;7&#x9;Watch Cache Fanout&#x9;변경 이벤트 브로드캐스트&#x9;etcd change stream&#x9;watch events&#x9;stale cache / lag&#x9;Cacher, WatchBroadcaster, Reflector&#x9;WATCH&#xA;단계별 실제 흐름 예시&#xA;kubectl apply -f deploy.yaml&#xA;1. Authentication&#xA;   &amp;#34;admin 사용자인가?&amp;#34;&#xA;&#xA;2. Authorization&#xA;   &amp;#34;deployments.apps PATCH 권한 있는가?&amp;#34;&#xA;&#xA;3. Mutating Admission&#xA;   &amp;#34;sidecar inject&amp;#34;&#xA;   &amp;#34;default 값 추가&amp;#34;&#xA;&#xA;4. Validation&#xA;   &amp;#34;schema 맞는가?&amp;#34;&#xA;   &amp;#34;field type 정상인가?&amp;#34;&#xA;&#xA;5. Validating Admission&#xA;   &amp;#34;보안 정책 위반 없는가?&amp;#34;&#xA;&#xA;6. Storage Layer&#xA;   &amp;#34;etcd 저장&amp;#34;&#xA;&#xA;7. Watch Cache Fanout&#xA;   &amp;#34;controller/scheduler/kubelet 에 변경 이벤트 전파&amp;#34;&#xA;각 단계의 목적을 한 줄로 요약&#xA;단계&#x9;본질&#xA;Authentication&#x9;신원 확인&#xA;Authorization&#x9;권한 확인&#xA;Mutating Admission&#x9;객체 변경&#xA;Validation&#x9;객체 검증&#xA;Validating Admission&#x9;정책 검사&#xA;Storage&#x9;상태 저장&#xA;Watch Cache&#x9;이벤트 전파&#xA;컴포넌트 관점으로 보면&#xA;Client Request&#xA;    ↓&#xA;[Identity Layer]&#xA;    Authentication&#xA;    Authorization&#xA;&#xA;[Policy Layer]&#xA;    Mutating Admission&#xA;    Validation&#xA;    Validating Admission&#xA;&#xA;[Persistence Layer]&#xA;    Storage(etcd)&#xA;&#xA;[Event Distribution Layer]&#xA;    Watch Cache&#xA;Grafana/Tracing 관점에서 중요한 메트릭&#xA;단계&#x9;핵심 메트릭&#xA;Authentication&#x9;apiserver_request_total{code=&amp;#34;401&amp;#34;}&#xA;Authorization&#x9;apiserver_request_total{code=&amp;#34;403&amp;#34;}&#xA;Admission&#x9;apiserver_admission_*&#xA;Validation&#x9;apiserver_request_total{code=&amp;#34;422&amp;#34;}&#xA;Storage&#x9;etcd_request_duration_seconds_*&#xA;Watch Cache&#x9;apiserver_watch_cache_*&#xA;실제 latency가 가장 많이 발생하는 구간&#xA;&#xA;대규모 클러스터 기준:&#xA;&#xA;순위&#x9;병목&#xA;1&#x9;Admission Webhook&#xA;2&#x9;etcd quorum write&#xA;3&#x9;LIST serialization&#xA;4&#x9;Watch fanout&#xA;5&#x9;CRD conversion webhook&#xA;Write 요청 기준 실제 call stack&#xA;HTTP Request&#xA;  ↓&#xA;AuthN&#xA;  ↓&#xA;AuthZ&#xA;  ↓&#xA;Mutating Admission&#xA;  ↓&#xA;Defaulting&#xA;  ↓&#xA;Validation&#xA;  ↓&#xA;Validating Admission&#xA;  ↓&#xA;FieldManager(SSA)&#xA;  ↓&#xA;etcd write&#xA;  ↓&#xA;watch notification&#xA;Read 요청은 다름&#xA;GET/LIST&#xA;HTTP Request&#xA;  ↓&#xA;AuthN&#xA;  ↓&#xA;AuthZ&#xA;  ↓&#xA;Watch Cache / Storage&#xA;  ↓&#xA;Response&#xA;&#xA;Admission 안 탐.&#xA;&#xA;WATCH는 더 특수함&#xA;WATCH request&#xA;   ↓&#xA;AuthN/AuthZ&#xA;   ↓&#xA;Watch registration&#xA;   ↓&#xA;Long-running stream&#xA;   ↓&#xA;Cache fanout&#xA;&#xA;즉:&#xA;&#xA;WATCH = persistent streaming connection&#xA;&#xA;입니다.&#xA;&#xA;Kubernetes 핵심 철학&#xA;&#xA;이 전체 구조는 사실상:&#xA;&#xA;desired state database&#xA;&amp;#43; policy engine&#xA;&amp;#43; event streaming platform&#xA;&#xA;구조입니다.&#xA;&#xA;그래서 kube-apiserver는:&#xA;&#xA;REST API 서버&#xA;&#xA;보다:&#xA;&#xA;Distributed Control Plane Gateway&#xA;&#xA;에 더 가깝습니다.&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;Kubernetes &amp;#43; Distributed Storage &amp;#43; Distributed Compute&#xA;&#xA;복합 시스템입니다.&#xA;&#xA;특히:&#xA;&#xA;Spark&#xA;Polaris&#xA;MinIO&#xA;대규모 WATCH/LIST&#xA;huge CRDs&#xA;massive object IO&#xA;long-running batch&#xA;shuffle traffic&#xA;&#xA;조합은 일반 SaaS Kubernetes와 병목 포인트가 완전히 다릅니다.&#xA;&#xA;우선 현재 규모 해석&#xA;&#xA;대략:&#xA;&#xA;영역&#x9;규모&#xA;Compute Nodes&#x9;~150&#xA;Storage Nodes&#x9;~90&#xA;Total Nodes&#x9;~240&#xA;Workload 특성&#x9;batch &amp;#43; streaming &amp;#43; object IO&#xA;주요 병목&#x9;API fanout / DNS / CNI / IO / etcd&#xA;&#xA;이 정도면 이미:&#xA;&#xA;&amp;#34;Medium-Large Scale Kubernetes&amp;#34;&#xA;&#xA;영역입니다.&#xA;&#xA;특히 Spark가 들어가면:&#xA;&#xA;Pod churn rate&#xA;&#xA;가 매우 중요해집니다.&#xA;&#xA;당신 환경에서 반드시 추가해야 하는 Deep Monitoring&#xA;1. APIServer Deep Tracing&#xA;&#xA;일반 메트릭 말고:&#xA;&#xA;request lifecycle tracing&#xA;&#xA;까지 봐야 함.&#xA;&#xA;반드시 수집&#xA;Metric&#x9;이유&#xA;apiserver_request_duration_seconds&#x9;전체 latency&#xA;apiserver_response_sizes&#x9;huge object&#xA;apiserver_watch_cache_*&#x9;cache saturation&#xA;apiserver_current_inflight_requests&#x9;throttling&#xA;apiserver_flowcontrol_*&#x9;APF starvation&#xA;apiserver_storage_*&#x9;etcd storage latency&#xA;매우 중요&#xA;API Priority &amp;amp; Fairness (APF)&#xA;&#xA;Spark cluster는 burst가 심함.&#xA;&#xA;예:&#xA;&#xA;1000 pod create/sec&#xA;&#xA;가능.&#xA;&#xA;그러면:&#xA;&#xA;controller-manager starvation&#xA;&#xA;발생 가능.&#xA;&#xA;반드시 봐야 함:&#xA;&#xA;apiserver_flowcontrol_current_executing_requests&#xA;2. WATCH Fanout Analysis&#xA;&#xA;이 환경에서 매우 중요.&#xA;&#xA;Spark executor 폭증 시:&#xA;&#xA;WATCH explosion&#xA;&#xA;발생.&#xA;&#xA;봐야 하는 것&#xA;userAgent 기반&#xA;sum by (useragent,verb)(&#xA;  rate(apiserver_request_total{verb=&amp;#34;WATCH&amp;#34;}[5m])&#xA;)&#xA;핵심 원인 분석&#xA;원인&#x9;증상&#xA;operator bug&#x9;LIST storm&#xA;spark executor churn&#x9;pod watch flood&#xA;informer resync&#x9;API spike&#xA;bad CRD design&#x9;huge watch payload&#xA;3. etcd Deep Visibility&#xA;&#xA;이건 매우 중요.&#xA;&#xA;대규모 datalake cluster는:&#xA;&#xA;etcd tail latency&#xA;&#xA;가 control-plane 전체에 영향 줌.&#xA;&#xA;반드시 봐야 하는 것&#xA;Metric&#x9;의미&#xA;etcd_disk_wal_fsync_duration_seconds&#x9;WAL latency&#xA;etcd_network_peer_round_trip_time_seconds&#x9;raft RTT&#xA;etcd_mvcc_db_total_size_in_bytes&#x9;DB bloat&#xA;etcd_mvcc_compaction_pause_duration_milliseconds&#x9;compaction stall&#xA;grpc_server_handled_total&#x9;gRPC overload&#xA;매우 중요&#xA;WAL fsync latency&#xA;histogram_quantile(&#xA;  0.99,&#xA;  rate(etcd_disk_wal_fsync_duration_seconds_bucket[5m])&#xA;)&#xA;&#xA;10ms 넘기 시작하면 위험 신호.&#xA;&#xA;4. Admission Webhook Latency&#xA;&#xA;Spark workload는 Pod 생성 폭증이 있음.&#xA;&#xA;그러면:&#xA;&#xA;admission webhook latency amplification&#xA;&#xA;발생.&#xA;&#xA;실제 위험&#xA;1 webhook = 50ms&#xA;1000 pod create&#xA;= cluster-wide API stall&#xA;반드시 수집&#xA;apiserver_admission_controller_admission_duration_seconds&#xA;5. Scheduler Internal Metrics&#xA;&#xA;Spark는 scheduler 압박 심함.&#xA;&#xA;봐야 하는 것&#xA;Metric&#x9;의미&#xA;scheduler_pending_pods&#x9;scheduling backlog&#xA;scheduler_e2e_scheduling_duration_seconds&#x9;end-to-end latency&#xA;scheduler_framework_extension_point_duration_seconds&#x9;plugin bottleneck&#xA;특히 중요&#xA;scheduling latency&#xA;Spark executor startup latency&#xA;&#xA;와 직접 연결됨.&#xA;&#xA;6. Kubelet Pressure Deep Dive&#xA;&#xA;Spark executor churn 때문에 kubelet pressure가 핵심.&#xA;&#xA;반드시 봐야 하는 것&#xA;Metric&#x9;의미&#xA;pod worker latency&#x9;pod lifecycle delay&#xA;pleg relist duration&#x9;runtime sync&#xA;runtime operations&#x9;CRI latency&#xA;image pull duration&#x9;executor startup&#xA;cgroup manager latency&#x9;cpu pressure&#xA;매우 중요&#xA;PLEG&#xA;Pod Lifecycle Event Generator&#xA;&#xA;느려지면 kubelet 장애 전조.&#xA;&#xA;7. CNI / Network Plane&#xA;&#xA;Datalake는:&#xA;&#xA;east-west traffic monster&#xA;&#xA;임.&#xA;&#xA;특히:&#xA;&#xA;shuffle&#xA;MinIO replication&#xA;Spark executor traffic&#xA;봐야 하는 것&#xA;Metric&#x9;의미&#xA;conntrack usage&#x9;NAT exhaustion&#xA;drops/retransmits&#x9;packet loss&#xA;CNI allocation latency&#x9;pod startup&#xA;TCP RTT&#x9;shuffle latency&#xA;MTU fragmentation&#x9;throughput collapse&#xA;매우 중요&#xA;conntrack saturation&#xA;node_nf_conntrack_entries / node_nf_conntrack_entries_limit&#xA;8. MinIO-Specific Deep Monitoring&#xA;&#xA;이건 매우 중요.&#xA;&#xA;MinIO는 사실상 storage backend.&#xA;&#xA;봐야 하는 것&#xA;Metric&#x9;의미&#xA;drive latency&#x9;disk bottleneck&#xA;healing operations&#x9;degraded set&#xA;erasure coding rebuild&#x9;IO storm&#xA;object PUT/GET latency&#x9;app impact&#xA;network throughput&#x9;replication pressure&#xA;매우 중요&#xA;MinIO healing&#xA;&#xA;healing은 cluster 전체 IO를 죽일 수 있음.&#xA;&#xA;9. Spark-Specific Control Plane Metrics&#xA;&#xA;이 환경 핵심.&#xA;&#xA;봐야 하는 것&#xA;Metric&#x9;의미&#xA;executor startup latency&#x9;pod scheduling&#xA;executor churn&#x9;API pressure&#xA;shuffle spill&#x9;disk pressure&#xA;dynamic allocation oscillation&#x9;cluster instability&#xA;failed executors&#x9;node/network issues&#xA;매우 중요&#xA;executor churn rate&#xA;&#xA;높으면:&#xA;&#xA;API server death spiral&#xA;&#xA;유발 가능.&#xA;&#xA;10. Object Size Monitoring (중요)&#xA;&#xA;대규모 cluster는:&#xA;&#xA;huge object syndrome&#xA;&#xA;발생.&#xA;&#xA;특히 위험&#xA;리소스&#x9;위험&#xA;ConfigMap&#x9;huge spark config&#xA;CRD Status&#x9;gigantic status&#xA;EndpointSlice&#x9;massive endpoints&#xA;봐야 하는 것&#xA;apiserver_response_sizes&#xA;당신 환경에서 실제 가장 위험한 것들&#xA;위험도 TOP 10&#xA;위험&#x9;영향&#xA;WATCH explosion&#x9;API saturation&#xA;Spark pod churn&#x9;scheduler overload&#xA;etcd WAL latency&#x9;cluster-wide slowdown&#xA;admission webhook latency&#x9;API stall&#xA;conntrack exhaustion&#x9;random network failure&#xA;kubelet PLEG stalls&#x9;node NotReady&#xA;huge CRD objects&#x9;apiserver memory blowup&#xA;MinIO healing storms&#x9;IO collapse&#xA;DNS saturation&#x9;executor failures&#xA;EndpointSlice explosion&#x9;kube-proxy overload&#xA;추천 아키텍처&#xA;&#xA;당신 규모면:&#xA;&#xA;Prometheus&#xA; &amp;#43; Thanos&#xA; &amp;#43; Loki&#xA; &amp;#43; Tempo&#xA; &amp;#43; Pyroscope&#xA;&#xA;거의 필수급.&#xA;&#xA;반드시 추천&#xA;eBPF Observability&#xA;&#xA;이 환경은 eBPF 가치 큼.&#xA;&#xA;추천:&#xA;&#xA;Tool&#x9;용도&#xA;Cilium Hubble&#x9;network flow&#xA;Pixie&#x9;K8s tracing&#xA;Parca/Pyroscope&#x9;profiling&#xA;Inspektor Gadget&#x9;kernel insight&#xA;최종적으로 가장 중요한 것&#xA;&#xA;당신 환경은:&#xA;&#xA;CPU/Memory monitoring&#xA;&#xA;단계는 이미 지났습니다.&#xA;&#xA;실제 중요한 건:&#xA;&#xA;Control Plane Dynamics&#xA;&amp;#43;&#xA;Event Flow&#xA;&amp;#43;&#xA;Watch Behavior&#xA;&amp;#43;&#xA;Storage Latency&#xA;&amp;#43;&#xA;Pod Churn&#xA;&amp;#43;&#xA;Network Saturation&#xA;&#xA;입니다.&#xA;&#xA;즉:&#xA;&#xA;&amp;#34;Kubernetes distributed systems observability&amp;#34;&#xA;&#xA;관점으로 가야 합니다.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0&#34;&gt;&#xA;  &lt;button&#xA;    class=&#34;hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50&#34;&#xA;    title=&#34;Copy code&#34;&#xA;  &gt;&#xA;    &lt;div class=&#34;copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4&#34;&gt;&lt;/div&gt;&#xA;    &lt;div class=&#34;success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4&#34;&gt;&lt;/div&gt;&#xA;  &lt;/button&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
    </item>
  </channel>
</rss>
