<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>구름엔지니어만들기</title>
    <link>https://minha0220.tistory.com/</link>
    <description>☁️⚙️ ️☁️</description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 01:23:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>miracle21</managingEditor>
    <image>
      <title>구름엔지니어만들기</title>
      <url>https://tistory1.daumcdn.net/tistory/6128196/attach/6d7545e3254744b88c9500536fb84dea</url>
      <link>https://minha0220.tistory.com</link>
    </image>
    <item>
      <title>[Datadog] Recovery 알람 제거 방법</title>
      <link>https://minha0220.tistory.com/225</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Datadog monitor 로 알람을 추가할 때 &quot;경고&quot;나 &quot;위험&quot; 알람은 받지만 복구 알림은 받고싶지 않은 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알람 메세지를 조건별로 분리하면 복구 알림은 제외하고 온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위험 알람 예시:&lt;/p&gt;
&lt;pre id=&quot;code_1775706299506&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{#is_alert}}
[ALERT] 문제 발생
@slack-channel
{{/is_alert}}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경고 알람 예시:&lt;/p&gt;
&lt;pre id=&quot;code_1775706314590&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{#is_warning}}
[WARN] 경고 상태
@slack-channel
{{/is_warning}}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 복구 알림을 받아도 상관이 없다면 알람받을 채널을 분리하지 않으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1775706379489&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{#is_alert}}
[ALERT] 문제 발생
{{/is_alert}}

{{#is_warning}}
[WARN] 경고 상태
{{/is_warning}}

@slack-channel&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모니터링/Datadog</category>
      <category>datadog</category>
      <category>datadog monitoring</category>
      <category>데이터독 알람</category>
      <author>miracle21</author>
      <guid isPermaLink="true">https://minha0220.tistory.com/225</guid>
      <comments>https://minha0220.tistory.com/225#entry225comment</comments>
      <pubDate>Thu, 9 Apr 2026 12:46:33 +0900</pubDate>
    </item>
    <item>
      <title>[Prometheus] GPU 서버에 HPA 설정 방법</title>
      <link>https://minha0220.tistory.com/224</link>
      <description>&lt;h2 id=&quot;1.-목적&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3&quot; data-local-id=&quot;e71d541f9dc6&quot; data-ke-size=&quot;size26&quot;&gt;1. 목적&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;115b1f0d0e60&quot; data-renderer-start-pos=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;GPU 사용률 기반 Pod AutoScaling을 구현하기 위해 메트릭 수집 및 모니터링 도구로 Prometheus와 Grafana를 선택했다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;115b1f0d0e60&quot; data-renderer-start-pos=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;단, 특정 GPU 서비스만 사용하기 위해서 namespace와 nodepool 설정이 추가적으로 들어간다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;115b1f0d0e60&quot; data-renderer-start-pos=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;2.-구성&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;46&quot; data-local-id=&quot;e37da1160692&quot; data-ke-size=&quot;size26&quot;&gt;2. 구성&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;bd61fe42a387&quot; data-renderer-start-pos=&quot;53&quot; data-ke-size=&quot;size16&quot;&gt;GPU 메트릭을 수집하기 위한 Prometheus를 Kubernetes 환경에 구성하는 방식은 크게 2가지가 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-local-id=&quot;dd4c1d13-0ba8-4c67-a98d-5635d90e7d04&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;kube-prometheus-stack&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Standalone Prometheus (Operator 미사용, 직접 prometheus.yml 관리)&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;d9564bd17bcf&quot; data-renderer-start-pos=&quot;208&quot; data-ke-size=&quot;size16&quot;&gt;수동 설정이 필요한 Standalone과 달리, kube-prometheus-stack은 지표 수집을 자동화할 수 있어서 &lt;b&gt;kube-prometheus-stack &lt;/b&gt;방식을 선택했다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;d9564bd17bcf&quot; data-renderer-start-pos=&quot;208&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1775017670344&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# kube-prometheus-stack 워크플로우
[GPU]
   &amp;darr;
[NVIDIA Driver + DCGM]              # 메트릭 추출
   &amp;darr;
dcgm-exporter (DaemonSet)           # 메트릭을 http 엔드포인트로 노출
   &amp;darr;
Service (ClusterIP)                 # 개별 exporter Pod에 대한 고정 접근 지점(IP) 제공
   &amp;darr;
ServiceMonitor (CRD)                # Prometheus에 수집할 대상을 지정
   &amp;darr;
Prometheus (Operator 관리)           # 메트릭 수집, 저장, PromQL 조회
   &amp;darr;
Prometheus Adapter                  # 데이터를 K8s Custom Metrics API 규격으로 변환
   &amp;darr;
Grafana / Alertmanager / HPA        # 시각화, 알림, 오토스케일에 활용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;
&lt;div data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-ssr-placeholder=&quot;7voiQ:EfLS5:z8NN7:qz-Pe:OP-5u-0&quot; data-local-id=&quot;71301321ce94&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;1bc124fbbc27&quot; data-renderer-start-pos=&quot;809&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;3.-기본-동작-구축&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;811&quot; data-local-id=&quot;66229ab84156&quot; data-ke-size=&quot;size26&quot;&gt;3. 기본 동작 구축&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id=&quot;3-1.-Helm-repository-구성&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;824&quot; data-local-id=&quot;1b6bdbe75c58&quot; data-ke-size=&quot;size23&quot;&gt;3-1. Helm repository 구성&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;d09910abd082&quot; data-renderer-start-pos=&quot;849&quot; data-ke-size=&quot;size16&quot;&gt;NVIDIA 및 Prometheus 차트를 배포한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-local-id=&quot;942537f2-2ca8-4675-99cf-39f552b92902&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;nvidia&lt;/b&gt;: GPU 메트릭 추출 도구인 DCGM Exporter 제공&lt;/li&gt;
&lt;li&gt;&lt;b&gt;prometheus-community&lt;/b&gt;: 메트릭 수집(Prometheus), 변환(Adapter) 도구 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;
&lt;div data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1775017690999&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;helm repo add nvidia https://nvidia.github.io/gpu-operator
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;436fb41d3d76&quot; data-renderer-start-pos=&quot;1204&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;3-2.-NVIDIA-DCGM-Exporter-설치&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1206&quot; data-local-id=&quot;df4f57829651&quot; data-ke-size=&quot;size23&quot;&gt;3-2. NVIDIA DCGM Exporter 설치&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;666926282826&quot; data-renderer-start-pos=&quot;1236&quot; data-ke-size=&quot;size16&quot;&gt;노드에서 &lt;b&gt;GPU 사용량 지표(DCGM_FI_DEV_GPU_UTIL)&lt;/b&gt;를 추출한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;f433ee032d1d&quot; data-renderer-start-pos=&quot;2455&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;f433ee032d1d&quot; data-renderer-start-pos=&quot;2455&quot; data-ke-size=&quot;size16&quot;&gt;특정 namespace만 사용하는 nodepool에 대한 메트릭만 수집하기 위해서 nodeSelector 에 따로 명시를 했다.&lt;/p&gt;
&lt;pre id=&quot;code_1775017852737&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# gpu-operator.yaml
driver:
  enabled: false

toolkit:
  enabled: false

devicePlugin:
  enabled: false

gfd:
  enabled: false

dcgmExporter:
  serviceMonitor:
    enabled: true
    additionalLabels:
      release: &amp;lt;서비스명&amp;gt;-prometheus

dcgm:
  nodeSelector:
    nodepool: &amp;lt;노드풀명&amp;gt;

operator:
  nodeSelector:
    nodepool: &amp;lt;노드풀명&amp;gt;

validator:
  nodeSelector:
    nodepool: &amp;lt;노드풀명&amp;gt;

node-feature-discovery:
  master:
    nodeSelector:
      nodepool: &amp;lt;노드풀명&amp;gt;
  gc:
    nodeSelector:
      nodepool: &amp;lt;노드풀명&amp;gt;
  worker:
    nodeSelector:
      nodepool: &amp;lt;노드풀명&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1775017952189&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;helm upgrade --install &amp;lt;서비스명&amp;gt;-dcgm nvidia/gpu-operator -n &amp;lt;네임스페이스&amp;gt; -f gpu-operator.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;
&lt;div data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-ssr-placeholder=&quot;7voiQ:EfLS5:z8NN7:qz-Pe:OP-5u-3&quot; data-local-id=&quot;7186c7503b09&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;985eaad8b730&quot; data-renderer-start-pos=&quot;3251&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;985eaad8b730&quot; data-renderer-start-pos=&quot;3251&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;3-3.-Prometheus-Stack-설치&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3253&quot; data-local-id=&quot;d4c3233e36c3&quot; data-ke-size=&quot;size23&quot;&gt;3-3. Prometheus Stack 설치&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;6160b2d8e485&quot; data-renderer-start-pos=&quot;3279&quot; data-ke-size=&quot;size16&quot;&gt;수집된 데이터를 저장하고 쿼리할 수 있는 환경을 구축한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;
&lt;div data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-ssr-placeholder=&quot;7voiQ:EfLS5:z8NN7:qz-Pe:OP-5u-6&quot; data-local-id=&quot;d01ff20060a9&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1775018121510&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# prometheus-stack.yaml 
grafana:
  enabled: true

alertmanager:
  enabled: false

prometheus:
  prometheusSpec:
    serviceMonitorSelectorNilUsesHelmValues: false
    nodeSelector:
      nodepool: &amp;lt;노드풀명&amp;gt;

prometheusOperator:
  nodeSelector:
    nodepool: &amp;lt;노드풀명&amp;gt;

kube-state-metrics:
  nodeSelector:
    nodepool: &amp;lt;노드풀명&amp;gt;

prometheus-node-exporter:
  nodeSelector:
    nodepool: &amp;lt;노드풀명&amp;gt;

prometheusOperator:
  admissionWebhooks:
    patch:
      nodeSelector:
        nodepool: &amp;lt;노드풀명&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;2e4f691f9155&quot; data-renderer-start-pos=&quot;5018&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-local-id=&quot;6b81045ea787&quot; data-indent-level=&quot;1&quot;&gt;
&lt;li&gt;grafana.enabled: 그라파나를 사용하는 경우에는 true, 사용하지 않는 경우에는 false.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1775018174191&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;helm upgrade --install &amp;lt;서비스명&amp;gt;-prometheus prometheus-community/kube-prometheus-stack -n &amp;lt;서비스 네임스페이스&amp;gt; -f prometheus-stack.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;2e4f691f9155&quot; data-renderer-start-pos=&quot;5018&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;3-4.-Prometheus-Adapter-설정-및-설치&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5020&quot; data-local-id=&quot;dd8c206702cf&quot; data-ke-size=&quot;size23&quot;&gt;3-4. Prometheus Adapter 설정 및 설치&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;76551e5a6bac&quot; data-renderer-start-pos=&quot;5053&quot; data-ke-size=&quot;size16&quot;&gt;Prometheus Adapter 설정 파일을 생성(prometheus-adapter.yaml)한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;76551e5a6bac&quot; data-renderer-start-pos=&quot;5053&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;
&lt;div data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-ssr-placeholder=&quot;7voiQ:EfLS5:z8NN7:qz-Pe:OP-5u-8&quot; data-local-id=&quot;5008138f1828&quot;&gt;
&lt;pre id=&quot;code_1775018554444&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;prometheus:
  url: http://&amp;lt;prometheus-service-name&amp;gt;.&amp;lt;namespace&amp;gt;.svc.cluster.local
  port: 9090

nodeSelector:
  nodepool: &amp;lt;서비스 노드풀명&amp;gt;

rules:
  custom:
    - seriesQuery: 'DCGM_FI_DEV_GPU_UTIL{exported_pod!=&quot;&quot;}'
      resources:
        overrides:
          exported_namespace: {resource: &quot;namespace&quot;}
          exported_pod: {resource: &quot;pod&quot;}
      name:
        matches: &quot;DCGM_FI_DEV_GPU_UTIL&quot;
        as: &quot;gpu_utilization&quot;
      metricsQuery: 'sum(&amp;lt;&amp;lt;.Series&amp;gt;&amp;gt;{&amp;lt;&amp;lt;.LabelMatchers&amp;gt;&amp;gt;}) by (&amp;lt;&amp;lt;.GroupBy&amp;gt;&amp;gt;)'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-local-id=&quot;6b81045ea787&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;url: &amp;lt;prometheus-service-name&amp;gt;는 Helm 배포 시 생성된 Prometheus Service 이름 참고(예: &amp;lt;release-name&amp;gt;-kube-prom-prometheus)&lt;/li&gt;
&lt;li&gt;seriesQuery: 'exported_pod' 라벨이 있는 DCGM 메트릭만 필터링하여 데이터 처리 효율 증가&lt;/li&gt;
&lt;li&gt;resources.overrides: Prometheus의 라벨(exported_pod)을 K8s의 리소스(pod)로 매핑하여 HPA가 타겟을 인식하게 함&lt;/li&gt;
&lt;li&gt;metricsQuery: sum(...) by (pod)를 통해 포드별 사용률을 합산하여 정확한 개별 부하 측정&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;186315960674&quot; data-renderer-start-pos=&quot;5870&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;fdc9fab20a58&quot; data-renderer-start-pos=&quot;5872&quot; data-ke-size=&quot;size16&quot;&gt;Prometheus Adapter 를 설치해서, Prometheus에 저장된 지표를 Kubernetes API 서버가 이해할 수 있는 custom.metrics.k8s.io 형식으로 변환해 제공한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;
&lt;div data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-ssr-placeholder=&quot;7voiQ:EfLS5:z8NN7:qz-Pe:OP-5u-9&quot; data-local-id=&quot;b3f103897411&quot;&gt;
&lt;pre id=&quot;code_1775019043860&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;helm upgrade --install prometheus-adapter prometheus-community/prometheus-adapter -n &amp;lt;서비스 네임스페이스&amp;gt; -f prometheus-adapter.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;ea3fb64f8b1c&quot; data-renderer-start-pos=&quot;6142&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;ae976c8956c4&quot; data-renderer-start-pos=&quot;6144&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;3-5.-HPA-리소스-생성&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;6146&quot; data-local-id=&quot;a64fcd7ac2b6&quot; data-ke-size=&quot;size23&quot;&gt;3-5. HPA 리소스 생성&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;f417468283f6&quot; data-renderer-start-pos=&quot;6163&quot; data-ke-size=&quot;size16&quot;&gt;HPA 파일 생성(hpa.yaml)&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;
&lt;div data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-ssr-placeholder=&quot;7voiQ:EfLS5:z8NN7:qz-Pe:OP-5u-10&quot; data-local-id=&quot;678a0b508cbf&quot;&gt;
&lt;pre id=&quot;code_1775019166336&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-&amp;lt;서비스명&amp;gt;
  namespace: &amp;lt;서비스 네임스페이스&amp;gt;
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: &amp;lt;서비스 deployment명&amp;gt;
  minReplicas: 1
  maxReplicas: 2
  metrics:
  - type: Pods
    pods:
      metric:
        name: gpu_utilization
      target:
        type: AverageValue
        averageValue: &quot;60&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-local-id=&quot;39aec54ef55c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;type: Pods / AverageValue: GPU는 K8s 표준 자원이 아니므로 %비율(Utilization) 대신 Prometheus가 주는 0~100 사이의 '값' 자체를 기준으로 삼음&lt;/li&gt;
&lt;li&gt;averageValue: &quot;60&quot;: GPU 평균 사용률이 60% 이상인 경우 Scale-out.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;036b6f6623b2&quot; data-renderer-start-pos=&quot;6940&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;3-6.-검증&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;6942&quot; data-local-id=&quot;68fa0f7966d5&quot; data-ke-size=&quot;size23&quot;&gt;3-6. 검증&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;1bd1666e5986&quot; data-renderer-start-pos=&quot;6951&quot; data-ke-size=&quot;size16&quot;&gt;Custom Metrics API 지표를 확인하여 Prometheus Adapter가 데이터를 정상 변환 중인지 확인한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;
&lt;div data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-ssr-placeholder=&quot;7voiQ:EfLS5:z8NN7:qz-Pe:OP-5u-11&quot; data-local-id=&quot;4ec49222-1bac-4f29-9177-58bafb1195c4&quot;&gt;
&lt;pre id=&quot;code_1775019357625&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get --raw &quot;/apis/custom.metrics.k8s.io/v1beta1/namespaces/&amp;lt;서비스 네임스페이스&amp;gt;/pods/*/gpu_utilization&quot; | jq&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-ssr-placeholder=&quot;7voiQ:EfLS5:z8NN7:qz-Pe:OP-5u-11&quot; data-local-id=&quot;4ec49222-1bac-4f29-9177-58bafb1195c4&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;91cd35a2ccc7&quot; data-renderer-start-pos=&quot;7132&quot; data-ke-size=&quot;size16&quot;&gt;위 명령 실행 시 숫자가 포함된 JSON 결과가 출력되어야 한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-ssr-placeholder=&quot;Eb7Gh:EfLS5:z8NN7:qz-Pe:OP-5u-0&quot; data-media-vc-wrapper=&quot;true&quot; data-renderer-start-pos=&quot;7170&quot; data-vc=&quot;media-single&quot; data-node-type=&quot;mediaSingle&quot; data-width-type=&quot;pixel&quot; data-width=&quot;560&quot; data-layout=&quot;center&quot;&gt;
&lt;div&gt;
&lt;div data-context-id=&quot;1982332978&quot; data-ssr-placeholder-ignored=&quot;&quot; data-local-id=&quot;4ba9d008864f&quot; data-renderer-start-pos=&quot;7171&quot; data-alt=&quot;image-20260226-081058.png&quot; data-file-mime-type=&quot;image/png&quot; data-file-size=&quot;23258&quot; data-file-name=&quot;image-20260226-081058.png&quot; data-collection=&quot;contentId-1982332978&quot; data-id=&quot;2e668839-23f9-48d5-93fb-0478875b3b81&quot; data-height=&quot;453&quot; data-width=&quot;560&quot; data-node-type=&quot;media&quot; data-type=&quot;file&quot;&gt;
&lt;div id=&quot;newFileExperienceWrapper&quot; data-ssr-placeholder-ignored=&quot;&quot; data-media-vc-wrapper=&quot;true&quot; data-testid=&quot;media-card-view&quot;&gt;
&lt;div data-test-progress=&quot;1&quot; data-test-media-name=&quot;image-20260226-081058.png&quot; data-ssr-placeholder-ignored=&quot;&quot; data-cursor=&quot;pointer&quot; data-test-source=&quot;ssr-server&quot; data-test-status=&quot;complete&quot; data-testid=&quot;media-file-card-view&quot;&gt;
&lt;div data-ssr-placeholder-ignored=&quot;&quot; data-testid=&quot;ImageRendererWrapper&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zPsFS/dJMcaco3MOG/AyyfBZffyWOkKsBOTVpkz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zPsFS/dJMcaco3MOG/AyyfBZffyWOkKsBOTVpkz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zPsFS/dJMcaco3MOG/AyyfBZffyWOkKsBOTVpkz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzPsFS%2FdJMcaco3MOG%2FAyyfBZffyWOkKsBOTVpkz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;517&quot; height=&quot;426&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;98d4a883f498&quot; data-renderer-start-pos=&quot;7173&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;a7d18c1afee9&quot; data-renderer-start-pos=&quot;7175&quot; data-ke-size=&quot;size16&quot;&gt;HPA 상태를 확인한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;
&lt;div data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-ssr-placeholder=&quot;7voiQ:EfLS5:z8NN7:qz-Pe:OP-5u-12&quot; data-local-id=&quot;9ef72c81-d5bf-4203-9d02-78d2429d12d6&quot;&gt;
&lt;pre id=&quot;code_1775019874266&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get hpa -n &amp;lt;서비스 네임스페이스&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH6HOX/dJMcaiphAyj/MAEk9YTtBoKyauOMUnMP50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH6HOX/dJMcaiphAyj/MAEk9YTtBoKyauOMUnMP50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH6HOX/dJMcaiphAyj/MAEk9YTtBoKyauOMUnMP50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH6HOX%2FdJMcaiphAyj%2FMAEk9YTtBoKyauOMUnMP50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1262&quot; height=&quot;74&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-ssr-placeholder=&quot;Eb7Gh:EfLS5:z8NN7:qz-Pe:OP-5u-1&quot; data-media-vc-wrapper=&quot;true&quot; data-renderer-start-pos=&quot;7225&quot; data-vc=&quot;media-single&quot; data-node-type=&quot;mediaSingle&quot; data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot;&gt;
&lt;div&gt;
&lt;div data-context-id=&quot;1982332978&quot; data-ssr-placeholder-ignored=&quot;&quot; data-local-id=&quot;47d3203fbd37&quot; data-renderer-start-pos=&quot;7226&quot; data-alt=&quot;image-20260226-081156.png&quot; data-file-mime-type=&quot;image/png&quot; data-file-size=&quot;7162&quot; data-file-name=&quot;image-20260226-081156.png&quot; data-collection=&quot;contentId-1982332978&quot; data-id=&quot;95e124a8-3668-4849-971d-7e0a2dd01ea4&quot; data-height=&quot;75&quot; data-width=&quot;1136&quot; data-node-type=&quot;media&quot; data-type=&quot;file&quot;&gt;
&lt;div id=&quot;newFileExperienceWrapper&quot; data-ssr-placeholder-ignored=&quot;&quot; data-media-vc-wrapper=&quot;true&quot; data-testid=&quot;media-card-view&quot;&gt;
&lt;div data-test-progress=&quot;1&quot; data-test-media-name=&quot;image-20260226-081156.png&quot; data-ssr-placeholder-ignored=&quot;&quot; data-cursor=&quot;pointer&quot; data-test-source=&quot;ssr-server&quot; data-test-status=&quot;complete&quot; data-testid=&quot;media-file-card-view&quot;&gt;
&lt;div data-ssr-placeholder-ignored=&quot;&quot; data-testid=&quot;ImageRendererWrapper&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;74042822e41d&quot; data-renderer-start-pos=&quot;7228&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;74042822e41d&quot; data-renderer-start-pos=&quot;7228&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모니터링/Prometheus&amp;amp;Grafana</category>
      <category>GPU 메트릭</category>
      <category>GPU 모니터링</category>
      <category>Grafana</category>
      <category>Prometheus</category>
      <author>miracle21</author>
      <guid isPermaLink="true">https://minha0220.tistory.com/224</guid>
      <comments>https://minha0220.tistory.com/224#entry224comment</comments>
      <pubDate>Wed, 1 Apr 2026 14:20:35 +0900</pubDate>
    </item>
    <item>
      <title>Locust와 gRPC 연동 문제 해결(DEADLINE_EXCEEDED)</title>
      <link>https://minha0220.tistory.com/223</link>
      <description>&lt;div style=&quot;line-height: 1.8; color: #333;&quot;&gt;
&lt;h2 style=&quot;font-size: 1.5em; margin-top: 30px; border-bottom: 1px solid #333; padding-bottom: 5px;&quot; data-ke-size=&quot;size26&quot;&gt;1. 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Locust를 사용하여 gRPC 서비스에 대한 부하테스트 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pod 구성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Locust Pod&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;locustfile.py 를 통해 gRPC 호출하는 클라이언트&lt;/li&gt;
&lt;li&gt;my-service pod와 동일한 namespace와 image 사용&lt;/li&gt;
&lt;li&gt;사용된 yaml: locust-deployment.yaml, locust-configmap.yaml&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;gRPC 서버&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청을 받는 대상 (my-service pod)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 상황&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;현상:&lt;/b&gt; Locust Pod에서 locustfile.py로 직접 gRPC 호출 시 DEADLINE_EXCEEDED 에러 발생(클라이언트 측 타임아웃).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특이점:&lt;/b&gt; Locust pod 내에서 my-service.py 스크립트는 정상 동작하나, locustfile.py는 서버 측에 로그조차 남기지 못함.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;makefile&quot; style=&quot;background: #f4f4f4; padding: 15px; overflow-x: auto;&quot;&gt;&lt;code&gt;gRPC Recognize: &amp;lt;_MultiThreadedRendezvous of RPC that terminated with:
status = StatusCode.DEADLINE_EXCEEDED
details = &quot;Deadline Exceeded&quot;
debug_error_string = &quot;UNKNOWN:Error received from peer {grpc_message:&quot;Deadline Exceeded&quot;, grpc_status:4, ...}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;font-size: 1.5em; margin-top: 40px; border-bottom: 1px solid #333; padding-bottom: 5px;&quot; data-ke-size=&quot;size26&quot;&gt;2. 원인 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;br /&gt;Locust(Gevent 기반)와 gRPC Python 라이브러리 간의 동시성 모델 비호환성으로 인한 충돌.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Gevent 환경에서는 모든 I/O가 Gevent 이벤트 루프에 통합되어야 함.&lt;/li&gt;
&lt;li&gt;gRPC Python은 자체 스레드를 사용하므로 Gevent와 충돌이 발생하여 요청이 서버까지 도달하지 않음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Locust vs gRPC Python 동작 비교&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;width: 100%; border-collapse: collapse; margin: 10px 0;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;border-bottom: 2px solid #333;&quot;&gt;
&lt;th style=&quot;padding: 10px; text-align: left;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;padding: 10px; text-align: left;&quot;&gt;Locust (Gevent 기반)&lt;/th&gt;
&lt;th style=&quot;padding: 10px; text-align: left;&quot;&gt;gRPC Python (스레드 기반)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody style=&quot;border-bottom: 1px solid #ddd;&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border-bottom: 1px solid #eee;&quot;&gt;동시성 모델&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border-bottom: 1px solid #eee;&quot;&gt;Gevent 라이브러리 기반&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border-bottom: 1px solid #eee;&quot;&gt;스레드 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border-bottom: 1px solid #eee;&quot;&gt;작업 단위&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border-bottom: 1px solid #eee;&quot;&gt;Greenlet (코루틴)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border-bottom: 1px solid #eee;&quot;&gt;스레드 (Thread)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border-bottom: 1px solid #eee;&quot;&gt;동작 방식&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border-bottom: 1px solid #eee;&quot;&gt;비동기적 (작업 교차 수행)&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border-bottom: 1px solid #eee;&quot;&gt;동기적 (동시 실행)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 10px; border-bottom: 1px solid #eee;&quot;&gt;I/O 처리&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border-bottom: 1px solid #eee;&quot;&gt;Gevent가 전체 관리&lt;/td&gt;
&lt;td style=&quot;padding: 10px; border-bottom: 1px solid #eee;&quot;&gt;gRPC 내부 스레드가 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;font-size: 1.5em; margin-top: 40px; border-bottom: 1px solid #333; padding-bottom: 5px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;3. 해결 방안&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 1. gRPC 호출을 subprocess로 분리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Locust 태스크 내에서 gRPC 호출을 직접 수행하지 않고, 정상 동작하는 별도의 스크립트를 subprocess로 실행.&lt;/p&gt;
&lt;pre class=&quot;python&quot; style=&quot;background: #f4f4f4; padding: 15px; overflow-x: auto;&quot;&gt;&lt;code&gt;@task
def recognize_audio(self):
    import subprocess
    result = subprocess.run(
        [&quot;python&quot;, &quot;/app/my-service.py&quot;, GRPC_HOST, AUDIO_FILE_PATH],
        capture_output=True, text=True
    )&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-top: 25px;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-top: 25px;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 2. grpc.experimental.gevent.init_gevent() 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gRPC 채널 생성 전 호출하여 Gevent 루프와 호환되도록 설정.&lt;/p&gt;
&lt;pre class=&quot;css&quot; style=&quot;background: #f4f4f4; padding: 15px; overflow-x: auto;&quot;&gt;&lt;code&gt;import grpc.experimental.gevent
grpc.experimental.gevent.init_gevent()&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;font-size: 1.5em; margin-top: 40px; border-bottom: 1px solid #333; padding-bottom: 5px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;4. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Locust(Gevent)와 gRPC Python(스레드) 모델의 충돌이 원인이므로, 호출 로직을 별도 프로세스로 분리하거나 호환성 패치(init_gevent)를 적용하여 독립적인 네트워크 I/O 환경을 확보해야 함.&lt;/p&gt;
&lt;/div&gt;</description>
      <category>Linux/기타</category>
      <category>DEADLINE_EXCEEDED</category>
      <category>gRPC</category>
      <category>locust</category>
      <author>miracle21</author>
      <guid isPermaLink="true">https://minha0220.tistory.com/223</guid>
      <comments>https://minha0220.tistory.com/223#entry223comment</comments>
      <pubDate>Sun, 1 Feb 2026 17:15:49 +0900</pubDate>
    </item>
    <item>
      <title>[kubernetes] 무중단배포 예시(readinessProbe)</title>
      <link>https://minha0220.tistory.com/222</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;전체 코드&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1765442537839&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: service-deployment
  namespace: ns-service
spec:
  replicas: 20
  selector:
    matchLabels:
      app: service
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 100%
      maxUnavailable: 0
  template:
    spec:
      containers:
      - name: service
        image: &amp;lt;image_name&amp;gt;
        ports:
        - containerPort: 8080
          protocol: TCP
        readinessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 60
          failureThreshold: 30&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;무중단 배포를 위해 추가한 부분&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. strategy.rollingUpdate 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1765442786938&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 100%
      maxUnavailable: 0&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;113&quot; data-start=&quot;36&quot;&gt;&lt;b&gt;maxSurge&lt;/b&gt;: 업데이트 중 기존 Replica 수보다 &lt;b&gt;추가로 생성 가능한 Pod의 최대 수(또는 비율)&lt;/b&gt;을 지정&lt;/li&gt;
&lt;li data-is-last-node=&quot;&quot; data-end=&quot;198&quot; data-start=&quot;114&quot;&gt;&lt;b&gt;maxUnavailable&lt;/b&gt;: 업데이트 중 &lt;b&gt;서비스 불가(Pod NotReady) 상태로 허용되는 최대 Pod 수(또는 비율)&lt;/b&gt;를 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;maxSurge를 100%로 한 이유는, 20대의 pod가 하나씩 올라가고 내려가는 시간이 비효율적이라고 판단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어차피 서비스가 완전히 올라가지 않으면 기존 pod 가 내려가지 않도록 &lt;b&gt;maxUnavailable&lt;/b&gt; 를 0으로 설정했기에, 한 번에 모든 pod가 올라오도록 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. spec.containers.readinessProbe 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1765442758730&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        readinessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 60
          failureThreshold: 30&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;99&quot; data-start=&quot;39&quot;&gt;&lt;b&gt;tcpSocket.port&lt;/b&gt;: 지정한 포트(예: 8080)로 TCP 연결이 가능한지 확인&lt;/li&gt;
&lt;li data-end=&quot;177&quot; data-start=&quot;100&quot;&gt;&lt;b&gt;initialDelaySeconds&lt;/b&gt;: 컨테이너 시작 후 첫 Readiness 체크를 시작하기 전까지 기다리는 시간&lt;/li&gt;
&lt;li data-end=&quot;237&quot; data-start=&quot;178&quot;&gt;&lt;b&gt;periodSeconds&lt;/b&gt;: Readiness Probe를 주기적으로 실행하는 간격&lt;/li&gt;
&lt;li data-is-last-node=&quot;&quot; data-end=&quot;315&quot; data-start=&quot;238&quot;&gt;&lt;b&gt;failureThreshold&lt;/b&gt;: Probe가 연속으로 실패할 경우, 이 횟수 이상이면 Pod를 NotReady로 판단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;readinessProbe&lt;/b&gt;는 &lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;컨테이너가 사용자 트래픽을 받을 준비가 되었는지 확인한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;컨테이너가 정상적으로 실행 중인지 확인하는&lt;b&gt; livenessProbe&lt;/b&gt;랑 &lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;컨테이너 상태를 확인하는 방식이 다르다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;livenessProbe&amp;nbsp;&lt;/b&gt;없이 &lt;b&gt;readinessProbe&lt;/b&gt;만 쓴 이유는, 반드시 신규 pod가 health check 가 되어야 예전 pod 가 내려가야 했기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 시작 10초 후부터 60초 간격으로 8080 포트 TCP 연결을 확인하며, 30번 연속 실패 시 Pod 를 NotReady 로 판단하도록 했다. 서비스가 정상적으로 올라가는데 10~20분 정도 소요가 되기에 간격을 크게 접았다.&lt;/p&gt;</description>
      <category>Health check</category>
      <category>Kubernetes</category>
      <category>무중단 배포</category>
      <author>miracle21</author>
      <guid isPermaLink="true">https://minha0220.tistory.com/222</guid>
      <comments>https://minha0220.tistory.com/222#entry222comment</comments>
      <pubDate>Sun, 4 Jan 2026 18:56:05 +0900</pubDate>
    </item>
    <item>
      <title>AWS Domain과 EKS Service DNS 간의 요청 응답 속도 비교</title>
      <link>https://minha0220.tistory.com/221</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;207&quot; data-start=&quot;97&quot; data-ke-size=&quot;size16&quot;&gt;EKS 내부 서비스 간 통신 방식을 비교하기 위해 &lt;b&gt;AWS Domain(ALB 경유)&lt;/b&gt; 방식과 &lt;b&gt;EKS Service DNS(ClusterIP)&lt;/b&gt; 방식을 대상으로 성능 테스트를 진행했다.&lt;/p&gt;
&lt;p data-end=&quot;207&quot; data-start=&quot;97&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;292&quot; data-start=&quot;209&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로 &lt;b&gt;클러스터 외부(ALB)로 나가는 것보다 내부 DNS(Service) 경로가 더 빠를 것&lt;/b&gt;이라고 예상할 수 있지만, 실제 결과는 반대였다.&lt;/p&gt;
&lt;p data-end=&quot;292&quot; data-start=&quot;209&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;292&quot; data-start=&quot;209&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-testid=&quot;table-container&quot; data-layout=&quot;custom&quot;&gt;
&lt;div data-vc=&quot;table-node-wrapper&quot; data-table-width=&quot;760&quot; data-table-local-id=&quot;6eeec3fc-117a-45ef-83df-fe074043ac14&quot; data-autosize=&quot;false&quot; data-layout=&quot;default&quot; data-number-column=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; aria-hidden=&quot;false&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-layout=&quot;default&quot; data-table-width=&quot;760&quot; data-number-column=&quot;false&quot; data-testid=&quot;renderer-table&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.1628%;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.7674%;&quot;&gt;&lt;b&gt;테스트 유저 수&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.6977%;&quot;&gt;&lt;b&gt;테스트 시간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.4884%;&quot;&gt;&lt;b&gt;총 요청 수&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.8837%;&quot;&gt;&lt;b&gt;요청률 (req/s) &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 11.1628%;&quot; data-colwidth=&quot;61&quot;&gt;&lt;span&gt;ALB&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 24.7674%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;20&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 20.6977%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;120초&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 18.4884%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;228&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 24.8837%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;1.90&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 11.1628%;&quot; data-colwidth=&quot;61&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #c9372c;&quot; data-text-custom-color=&quot;#ff5630&quot; data-renderer-mark=&quot;true&quot;&gt;ALB&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 24.7674%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #c9372c;&quot; data-text-custom-color=&quot;#ff5630&quot; data-renderer-mark=&quot;true&quot;&gt;20&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 20.6977%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #c9372c;&quot; data-text-custom-color=&quot;#ff5630&quot; data-renderer-mark=&quot;true&quot;&gt;120초&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 18.4884%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #c9372c;&quot; data-text-custom-color=&quot;#ff5630&quot; data-renderer-mark=&quot;true&quot;&gt;229&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 24.8837%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #c9372c;&quot; data-text-custom-color=&quot;#ff5630&quot; data-renderer-mark=&quot;true&quot;&gt;1.92&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 11.1628%;&quot; data-colwidth=&quot;61&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #357de8;&quot; data-text-custom-color=&quot;#4c9aff&quot; data-renderer-mark=&quot;true&quot;&gt;DNS&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 24.7674%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #357de8;&quot; data-text-custom-color=&quot;#4c9aff&quot; data-renderer-mark=&quot;true&quot;&gt;20&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 20.6977%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #357de8;&quot; data-text-custom-color=&quot;#4c9aff&quot; data-renderer-mark=&quot;true&quot;&gt;120초&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 18.4884%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #357de8;&quot; data-text-custom-color=&quot;#4c9aff&quot; data-renderer-mark=&quot;true&quot;&gt;218&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 24.8837%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #357de8;&quot; data-text-custom-color=&quot;#4c9aff&quot; data-renderer-mark=&quot;true&quot;&gt;1.84&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 11.1628%;&quot; data-colwidth=&quot;61&quot;&gt;&lt;span&gt;DNS&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 24.7674%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;20&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 20.6977%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;120초&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 18.4884%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;219&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 24.8837%;&quot; data-colwidth=&quot;99&quot;&gt;&lt;span&gt;1.83&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div data-vc=&quot;table-sticky-scrollbar-container&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 평균 응답 시간&lt;/b&gt;&lt;br /&gt;EKS&amp;nbsp;Service&amp;nbsp;DNS는&amp;nbsp;ALB&amp;nbsp;대비&amp;nbsp;약&amp;nbsp;380~500ms&amp;nbsp;느림 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2) 최대 응답 시간(Max)&lt;/b&gt;&lt;br /&gt;EKS&amp;nbsp;DNS&amp;nbsp;경로는&amp;nbsp;ALB&amp;nbsp;대비&amp;nbsp;최대&amp;nbsp;3,000ms&amp;nbsp;이상&amp;nbsp;지연&amp;nbsp;발생 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3) 요청 처리량(req/s)&lt;/b&gt;&lt;br /&gt;EKS&amp;nbsp;DNS:&amp;nbsp;1.83&amp;nbsp;~&amp;nbsp;1.84&amp;nbsp;req/s &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 결과를 분석해보면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;588&quot; data-start=&quot;548&quot;&gt;ALB가 &lt;b&gt;응답 속도&amp;middot;안정성 모두에서 더 우수한 성능&lt;/b&gt;을 보였다.&lt;/li&gt;
&lt;li data-end=&quot;672&quot; data-start=&quot;589&quot;&gt;최대 응답 시간(Max) 차이가 큰 것으로 보아, &lt;b&gt;레이지 요청 처리나 내부 네트워크 큐잉에서 더 큰 지연&lt;/b&gt;이 발생한 것으로 추정된다.&lt;/li&gt;
&lt;li data-end=&quot;781&quot; data-start=&quot;673&quot;&gt;EKS DNS는 클러스터 내부 DNS 라우팅을 거치며, 이 과정에서 &lt;b&gt;추가적인 네트워크 홉과 큐잉 지연이 발생&lt;/b&gt;할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로는 &lt;b&gt;EKS 내부 서비스 간 통신에서 단순히 내부 DNS가 더 빠를 것이라고 기대하기 어려웠다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;오히려 &lt;b&gt;ALB(도메인 경유)&lt;/b&gt; 방식이 응답 속도와 안정성 모두에서 더 우수하게 나타났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 서비스 환경마다 네트워크 구조와 트래픽 패턴이 다를 수 있으므로, &lt;b&gt;실제 환경에서 직접 테스트를 통해 최적의 통신 방식을 검증하는 것이 중요하다&lt;/b&gt;는 점을 느낄 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;항목&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ALB&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt; EKS DNS &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;네트워크 경로&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;VPC 내부 ENI를 통해 서비스 파드에 직접 연결&lt;/td&gt;
&lt;td&gt;CoreDNS &amp;rarr; 서비스 IP &amp;rarr; kube-proxy &amp;rarr; 파드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;요청 분산 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;AWS ALB의 최적화된 로드 밸런싱&lt;/td&gt;
&lt;td&gt;iptables 기반 Round-Robin(kube-proxy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;병목 및 큐잉 가능성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;CoreDNS, iptables, 큐잉 등 병목 및 레이턴시 증가 가능성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;최대 응답 시간 차이&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;비교적 낮게 유지 (레이지 요청 영향 적음)&lt;/td&gt;
&lt;td&gt;레이지 요청 및 경로 지연 영향으로 Max latency 증가 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;응답 속도 및 안정성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;전반적으로 빠르고 안정적, 지연 최소화&lt;/td&gt;
&lt;td&gt;내부 DNS 라우팅 영향으로 ALB 대비 느리고 변동성 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MSA/쿠버네티스</category>
      <category>AWS</category>
      <category>DNS</category>
      <category>Kubernetes</category>
      <category>응답 속도 비교</category>
      <author>miracle21</author>
      <guid isPermaLink="true">https://minha0220.tistory.com/221</guid>
      <comments>https://minha0220.tistory.com/221#entry221comment</comments>
      <pubDate>Thu, 11 Dec 2025 17:34:39 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] RBAC 설정</title>
      <link>https://minha0220.tistory.com/220</link>
      <description>&lt;h2 id=&quot;개념&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3&quot; data-local-id=&quot;98331f77-8345-481f-967e-836d04e84783&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개념&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;73c9de42-290d-4c70-b835-5722e420b5d9&quot; data-renderer-start-pos=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;K8s(Kubernetes)는 &lt;b&gt;RBAC(Role-Based Access Control)&lt;/b&gt;을 통해 &lt;b&gt;사용자(User)&lt;/b&gt; 또는 &lt;b&gt;서비스 계정(ServiceAccount)&lt;/b&gt;에 리소스 접근 권한을 부여한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;3cb596e7-6313-4acf-b2d1-abf4915b0cf4&quot; data-renderer-start-pos=&quot;115&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;권한-구성&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;117&quot; data-local-id=&quot;2d03b269-05d6-4d5c-8934-bc2dcb0d2b00&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;권한 구성&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;3a3ee64e-a70f-431e-8b71-d230dc455074&quot; data-renderer-start-pos=&quot;124&quot; data-ke-size=&quot;size16&quot;&gt;K8s 권한은 아래 3가지 원칙으로 구성한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-local-id=&quot;09f0fdda-a622-4d6e-ad5e-2ccd70f8bd57&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;최소 권한 원칙(Principle of Least Privilege) 적용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-local-id=&quot;46aa5078-baa8-40aa-b3b7-369e47f4d040&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;필요 최소한의 권한만 부여&lt;/li&gt;
&lt;li&gt;모든 권한을 admin으로 주지 않도록 주의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;네임스페이스별 격리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-local-id=&quot;d73083d7-7c73-4d9c-9e56-5a427decea67&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;프로젝트나 서비스별로 네임스페이스를 분리하고 Role/RoleBinding으로 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서비스 계정 사용 권장&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-local-id=&quot;cda57ed8-7d19-4203-b383-9073ae251307&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;사람 계정(User) 보다는 서비스 계정(ServiceAccount)으로 권한 부여&lt;/li&gt;
&lt;li&gt;Pod가 권한을 사용해야 하는 경우 서비스 계정 연동&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;468019fe-9f03-4cba-a9fc-1223e3ad4029&quot; data-renderer-start-pos=&quot;413&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;eb4c48a1-938d-4dbc-ac9c-987f14a0616d&quot; data-renderer-start-pos=&quot;415&quot; data-ke-size=&quot;size16&quot;&gt;구성 원칙에 따라 네임스페이스 또는 클러스터 단위로 설정이 가능하다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;eb4c48a1-938d-4dbc-ac9c-987f14a0616d&quot; data-renderer-start-pos=&quot;415&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1.-네임스페이스-단위로-권한-부여&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;455&quot; data-local-id=&quot;85ca01df-c3c1-42c0-a9c0-580c29698ee2&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 네임스페이스 단위로 권한 부여&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-local-id=&quot;4f28b917-4f62-4f36-bb80-63b2ca420c59&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;적용 범위:&lt;/b&gt; 특정 네임스페이스 내부 리소스에만 권한을 부여&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 목적:&lt;/b&gt; 팀별 권한 분리, 환경별 접근 제한&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 리소스 예시:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-local-id=&quot;76c37a20-af2a-49fc-8fbf-e053ea0d0305&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Pods, Services, ConfigMaps, Secrets, Deployments, StatefulSets 등 &lt;u data-renderer-mark=&quot;true&quot;&gt;네임스페이스 단위 리소스&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 오브젝트:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-local-id=&quot;8f27e0d3-7416-489d-8f1a-ea3ed7a5caad&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;Role&lt;/b&gt;: 특정 네임스페이스 내 리소스에 대한 권한을 &lt;u data-renderer-mark=&quot;true&quot;&gt;정의&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RoleBinding&lt;/b&gt;: Role을 사용자/서비스 계정에 &lt;u data-renderer-mark=&quot;true&quot;&gt;연결&lt;/u&gt; (네임스페이스 단위)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 사례:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-local-id=&quot;44bc9f36-b7a1-4fd3-8dd7-0ffbb2294f8c&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;개발팀에게 dev 네임스페이스 내 Pods와 ConfigMaps를 수정할 권한만 부여&lt;/li&gt;
&lt;li&gt;QA팀에게 qa 네임스페이스 내만 접근 가능하도록 제한&lt;/li&gt;
&lt;li&gt;서비스 계정별 세밀한 권한 제어 가능 (예: 특정 애플리케이션만 ConfigMap 읽기 권한)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;2.-클러스터-단위로-권한-부여&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;894&quot; data-local-id=&quot;f87b0fd9-377b-4e8c-ac28-885d086279a7&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 클러스터 단위로 권한 부여&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-local-id=&quot;d8a265a4-5ae5-41fd-aaac-7a753ae59fd3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;적용 범위:&lt;/b&gt; 클러스터 전체 또는 여러 네임스페이스에 걸친 권한 부여&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 목적:&lt;/b&gt; 클러스터 관리, 모니터링/로깅, 전체 리소스 접근이 필요한 서비스 계정 설정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 리소스 예시:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-local-id=&quot;e4ca7f8f-e656-402e-b1b9-16445e63796c&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Nodes, PersistentVolumes, Namespaces, ClusterRoles 와 같은 &lt;u data-renderer-mark=&quot;true&quot;&gt;클러스터 단위 리소스&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;네임스페이스 포함 가능: 모든 네임스페이스의 Pods, Deployments 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 오브젝트:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-local-id=&quot;99a7d4c7-c52d-4be7-a3be-9e38766b0b08&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;ClusterRole&lt;/b&gt;: 클러스터 전체 리소스 또는 특정 네임스페이스 포함 권한을 &lt;u data-renderer-mark=&quot;true&quot;&gt;정의&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ClusterRoleBinding&lt;/b&gt;: ClusterRole을 사용자/서비스 계정에 &lt;u data-renderer-mark=&quot;true&quot;&gt;연결&lt;/u&gt; (클러스터 단위)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 사례:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-local-id=&quot;0092da93-c2bc-48e9-8b81-7ab90bc3bb16&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;클러스터 관리자가 모든 네임스페이스에서 리소스를 생성/삭제/조회 가능하도록 설정&lt;/li&gt;
&lt;li&gt;모니터링 툴(prometheus 등)이 모든 네임스페이스의 Pod 상태를 조회하도록 설정&lt;/li&gt;
&lt;li&gt;CSI 드라이버가 모든 PersistentVolume을 관리할 수 있도록 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1431&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;Helm-차트로-필요한-권한-확인하는-방법&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1433&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Helm 차트로 필요한 권한 확인하는 방법&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1764746137346&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ helm template &amp;lt;release&amp;gt; &amp;lt;chart.tgz&amp;gt; -f &amp;lt;values.yaml&amp;gt; -n &amp;lt;namespace&amp;gt; &amp;gt; &amp;lt;output.yaml&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;helm template&lt;/b&gt; : Helm Chart를 실제 클러스터에 적용하지 않고 YAML로 렌더링&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;lt;release&amp;gt; :&lt;/b&gt; 임의로 지정하는 release 이름&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;lt;chart.tgz&amp;gt; :&lt;/b&gt; 렌더링할 Helm Chart 패키지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;-f &amp;lt;values.yaml&amp;gt; :&lt;/b&gt; 기본값을 덮어쓸 사용자 지정 values 파일&lt;/li&gt;
&lt;li&gt;&lt;b&gt;-n &amp;lt;namespace&amp;gt; :&lt;/b&gt; 리소스 네임스페이스 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1760&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1762&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre id=&quot;code_1764746161999&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ helm template test krypton-4.16.0-gl1302195.tgz -f QA/zlm-MYS.yaml -n ns-krypton &amp;gt; test.yaml
$ cat test.yaml | grep -E &quot;kind:|apiVersion:&quot;

apiVersion: v1
kind: Secret
apiVersion: v1
kind: Secret
kind: ConfigMap
apiVersion: v1
kind: ConfigMap
apiVersion: v1
apiVersion: v1
kind: PersistentVolume
apiVersion: v1
kind: PersistentVolumeClaim
apiVersion: v1
kind: Service
apiVersion: apps/v1
kind: Deployment&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; secret, configmap, pv, pvc, service, deployment 관련 권한 필요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2382&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;권한-설정-예시&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2384&quot; data-local-id=&quot;4ddab7c9-22d1-4a83-9aa1-215134e1de95&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;권한 설정 예시&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p id=&quot;1.-Role-&amp;amp;-RoleBinding&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2394&quot; data-local-id=&quot;6a6f26e9-e4d8-4478-9c6f-8d08309be224&quot; data-ke-size=&quot;size18&quot;&gt;1. Role &amp;amp; RoleBinding&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2394&quot; data-local-id=&quot;6a6f26e9-e4d8-4478-9c6f-8d08309be224&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;d44f4a50-4cc0-4488-8a34-e994a50eb4d1&quot; data-renderer-start-pos=&quot;2417&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Role 생성 &lt;/b&gt;&amp;rarr; ns-infra 네임스페이스에서 Pod를 &lt;b&gt;조회, 생성, 삭제&lt;/b&gt;할 수 있는 권한 정의&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-local-id=&quot;5c13ccac-ca4b-44c3-bfcf-50b82dad5892&quot;&gt;
&lt;pre id=&quot;code_1764746227978&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: ns-infra
  name: pod-manager
rules:
  - apiGroups: [&quot;&quot;]
    resources: [&quot;pods&quot;]                                       # 파드
    verbs: [&quot;get&quot;, &quot;list&quot;, &quot;watch&quot;, &quot;create&quot;, &quot;delete&quot;]       # 조회, 생성, 삭제&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2749&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2749&quot; data-ke-size=&quot;size16&quot;&gt;+ Role 을 생성하지 않고 기본 ClusterRole을 사용해도 된다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 ClusterRole&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 119px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.8254%; height: 17px;&quot;&gt;&lt;b&gt;권한 수준&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2845%; height: 17px;&quot;&gt;&lt;b&gt;ClusterRole&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.7668%; height: 17px;&quot;&gt;&lt;b&gt;범위&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.1233%; height: 17px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.8254%; height: 17px;&quot;&gt;&lt;b&gt;최상위&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2845%; height: 17px;&quot;&gt;cluster-admin&lt;/td&gt;
&lt;td style=&quot;width: 13.7668%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;클러스터&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.1233%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;모든 리소스, 모든 네임스페이스, 모든 동작 가능. 사실상 루트 권한.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.8254%; height: 17px;&quot;&gt;&lt;b&gt;네임스페이스 관리 가능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2845%; height: 17px;&quot;&gt;admin&lt;/td&gt;
&lt;td style=&quot;width: 13.7668%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;네임스페이스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.1233%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;네임스페이스 내 대부분의 리소스 관리 가능(배포, 서비스, 시크릿 등). RoleBinding 생성 가능. 단, 네임스페이스 외 리소스에는 권한 없음.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.8254%; height: 17px;&quot;&gt;&lt;b&gt;읽기/쓰기 제한&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2845%; height: 17px;&quot;&gt;edit&lt;/td&gt;
&lt;td style=&quot;width: 13.7668%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;네임스페이스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.1233%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;네임스페이스 내 대부분 리소스 생성/수정 가능. RoleBinding 생성은 불가.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.8254%; height: 17px;&quot;&gt;&lt;b&gt;읽기 &lt;b&gt;전용&lt;/b&gt; &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2845%; height: 17px;&quot;&gt;view&lt;/td&gt;
&lt;td style=&quot;width: 13.7668%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;네임스페이스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.1233%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;리소스 조회 가능(&lt;/span&gt;get&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;, &lt;/span&gt;list&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;, &lt;/span&gt;watch&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;). 생성/수정/삭제 불가.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.8254%; height: 17px;&quot;&gt;&lt;b&gt;시스템용 최소 권한&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2845%; height: 17px;&quot;&gt;system:discovery&lt;/td&gt;
&lt;td style=&quot;width: 13.7668%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;클러스터&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.1233%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;API 리소스 조회 가능. (&lt;/span&gt;kubectl api-resources&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt; 등에서 사용)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.8254%; height: 17px;&quot;&gt;&lt;b&gt;시스템용 제한 권한&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2845%; height: 17px;&quot;&gt;system:basic-user&lt;/td&gt;
&lt;td style=&quot;width: 13.7668%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;네임스페이스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.1233%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;로그인한 사용자에게 기본 조회 권한 제공&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2749&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2749&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;b7017193-6072-4be0-8520-2a0180ad8fd3&quot; data-renderer-start-pos=&quot;3359&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RoleBinding 생성 &lt;/b&gt;&amp;rarr; 네임스페이스 ns-infra 내 서비스 계정 infra-sa에 Pod 관리 권한 부여&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-local-id=&quot;1fe79012-acd5-4584-baef-66ad63641dd0&quot;&gt;
&lt;pre id=&quot;code_1764915200610&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-manager-binding
  namespace: ns-infra
roleRef:
  kind: Role
  name: pod-manager                          # ClusterRole 이름
  apiGroup: rbac.authorization.k8s.io
subjects:
  - kind: ServiceAccount                     # ServiceAccount 에 권한 부여
    name: infra-sa
    namespace: ns-infra                      # ServiceAccount는 namespace 명시 필요&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-local-id=&quot;1fe79012-acd5-4584-baef-66ad63641dd0&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;43d724c5-368b-4450-901a-f28eed2497cd&quot; data-renderer-start-pos=&quot;3845&quot; data-ke-size=&quot;size16&quot;&gt;+기본 ClusterRole을 사용하는 경우에는 ,roleRef.name에 ClusterRole 이름을 적으면 된다. (예: admin)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3923&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;2.-ClusterRole-&amp;amp;-ClusterRoleBinding&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3925&quot; data-local-id=&quot;01d6cc2c-00eb-4a4d-9b5f-b3a30e7b63df&quot; data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;ClusterRole &lt;/b&gt;&amp;amp; &lt;b&gt;ClusterRoleBinding &lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;c93eb397-86d0-4429-ba4d-e6f74efef40d&quot; data-renderer-start-pos=&quot;3963&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ClusterRole 생성&lt;/b&gt; &amp;rarr; 클러스터 전체에서 pods, services, nodes를 읽기 전용 권한 부여&lt;/p&gt;
&lt;pre id=&quot;code_1764915214221&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole                                 # 클러스터 전체 권한 정의
metadata:
  name: read-only-cluster
rules:
  - apiGroups: [&quot;&quot;]
    resources: [&quot;pods&quot;, &quot;services&quot;, &quot;nodes&quot;]
    verbs: [&quot;get&quot;, &quot;list&quot;, &quot;watch&quot;]                # 읽기 전용&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;5fc8c636-224d-4c35-a62e-ee61390ca7c3&quot; data-renderer-start-pos=&quot;4302&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;3cd19442-c4c3-4d2e-b437-0044aa1eff21&quot; data-renderer-start-pos=&quot;4304&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;3cd19442-c4c3-4d2e-b437-0044aa1eff21&quot; data-renderer-start-pos=&quot;4304&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ClusterRoleBinding 생성 &lt;/b&gt; &amp;rarr; 1번에서 만든 ClusterRole을 특정 사용자에게 부여&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-local-id=&quot;3de89ae8-3f73-4c55-8028-a89118709dfc&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1764915224196&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding                            # 클러스터 전체 권한 부여
metadata:
  name: read-only-cluster-binding
roleRef:
  kind: ClusterRole
  name: read-only-cluster                            # ClusterRole 이름
  apiGroup: rbac.authorization.k8s.io
subjects:
  - kind: User                                       # 사용자에게 권한 부여
    name: jane.doe@example.com
    apiGroup: rbac.authorization.k8s.io&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;4804&quot; data-local-id=&quot;16398db4-c7e5-4542-a7f5-6d75e3ec20a2&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;테스트&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;4804&quot; data-local-id=&quot;16398db4-c7e5-4542-a7f5-6d75e3ec20a2&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;테스트&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;517bbd9f-6a09-4af7-92c0-51c012654736&quot; data-renderer-start-pos=&quot;4809&quot; data-ke-size=&quot;size16&quot;&gt;배포 후 kubectl auth can-i 명령어로 &lt;b&gt;특정 사용자/서비스 계정이 특정 리소스에 대해 특정 작업을 수행&lt;/b&gt;할 수 있는지 확인한다.&lt;/p&gt;
&lt;pre id=&quot;code_1764915262890&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ kubectl auth can-i &amp;lt;verb&amp;gt; &amp;lt;resource&amp;gt; [--namespace=&amp;lt;namespace&amp;gt;] [--as=&amp;lt;user&amp;gt;] [--list]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-indent-level=&quot;1&quot; data-local-id=&quot;ab184d7a-e2dd-4066-8883-778084ead5c5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&amp;lt;verb&amp;gt;&lt;/b&gt;: 수행할 동작
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-local-id=&quot;d395011e-7caa-4f0d-8294-c15743bfa411&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예: get, list, watch, create, update, delete&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;lt;resource&amp;gt;&lt;/b&gt;: 리소스 종류
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-local-id=&quot;00e7617a-0987-4af2-bc6e-41fc1f360697&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예: pods, deployments, configmaps&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;--namespace:&lt;/b&gt; 네임스페이스 단위 권한 확인 시 지정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;--as:&lt;/b&gt; 다른 사용자/서비스 계정 권한으로 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;--list&lt;/b&gt;: 해당 사용자/서비스 계정이 수행할 수 있는 모든 작업을 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;07adc94d-3ca5-48cb-b4d7-d4a21fb0d50d&quot; data-renderer-start-pos=&quot;5225&quot; data-ke-size=&quot;size16&quot;&gt;특정 네임스페이스에 대한 모든 권한을 확인하는 방법:&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-local-id=&quot;370a5dff-373c-4959-b974-9d4e1533d15f&quot;&gt;
&lt;pre id=&quot;code_1764915305512&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ kubectl auth can-i --list --namespace=&amp;lt;네임스페이스&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;78e55764-778f-4fb8-b4ce-a974146f02bb&quot; data-renderer-start-pos=&quot;5306&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-local-id=&quot;384fa10c-64c6-4325-be97-d39e380f53d3&quot; data-renderer-start-pos=&quot;5308&quot; data-ke-size=&quot;size16&quot;&gt;결과 예시:&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-width=&quot;760&quot; data-has-width=&quot;true&quot; data-mode=&quot;wide&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot; data-local-id=&quot;9edac8f1-b0c9-41a8-9ad8-2bcf9c58d10e&quot;&gt;
&lt;pre id=&quot;code_1764915311932&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Resources           Non-Resource URLs     Resource Names     Verbs
-----               -----------------     --------------     -----
pods                []                    []                  [get list watch create delete]
deployments.apps    []                    []                  [get list watch create update patch delete]
configmaps          []                    []                  [get list watch create update delete]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-testid=&quot;table-container&quot; data-layout=&quot;custom&quot;&gt;
&lt;div data-vc=&quot;table-node-wrapper&quot; data-table-width=&quot;760&quot; data-table-local-id=&quot;48cd51ac-fefa-4605-b056-868371ec0e64&quot; data-autosize=&quot;false&quot; data-layout=&quot;default&quot; data-number-column=&quot;false&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 89px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 21.3954%; height: 21px;&quot;&gt;&lt;b&gt;컬럼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 78.6046%; height: 21px;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3954%; height: 17px;&quot;&gt;&lt;b&gt;Resources&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 78.6046%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;권한이 적용되는 리소스 종류 (&lt;/span&gt;pods&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;, &lt;/span&gt;deployments.apps&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt; 등)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3954%; height: 17px;&quot;&gt;&lt;b&gt;Non-Resource URLs&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 78.6046%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;API 서버 경로(URL) 권한.&lt;br /&gt;(예: &lt;/span&gt;/healthz&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;, &lt;/span&gt;/metrics)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3954%; height: 17px;&quot;&gt;&lt;b&gt;Resource Names&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 78.6046%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;특정 리소스 이름에만 적용되는 권한. 비워두면 네임스페이스 내 모든 리소스 대상&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3954%; height: 17px;&quot;&gt;&lt;b&gt;Verbs&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 78.6046%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;허용되는 동작.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;(예: &lt;/span&gt;get&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;, &lt;/span&gt;list&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;, &lt;/span&gt;watch&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;, &lt;/span&gt;create&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;, &lt;/span&gt;update&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;, &lt;/span&gt;delete&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;, &lt;/span&gt;patch&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;, &lt;/span&gt;*&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;(모든동작허용))&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MSA/쿠버네티스</category>
      <category>Kubernetes</category>
      <category>RBAC</category>
      <author>miracle21</author>
      <guid isPermaLink="true">https://minha0220.tistory.com/220</guid>
      <comments>https://minha0220.tistory.com/220#entry220comment</comments>
      <pubDate>Fri, 5 Dec 2025 15:16:34 +0900</pubDate>
    </item>
    <item>
      <title>[Signoz] Signoz 란?</title>
      <link>https://minha0220.tistory.com/219</link>
      <description>&lt;h2 id=&quot;1.-Signoz의-소개-및-차별점&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;5&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;개요&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;40&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Signoz는 &lt;b&gt;하나의 플랫폼&lt;/b&gt;에서 &lt;b&gt;애플리케이션의 성능 모니터링(APM)과 로그, 트레이스를 통합&lt;/b&gt;하여 관찰 가능성을 제공하는 도구다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;40&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;40&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;복잡한 MSA(MicroService Architecture) 환경에서&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;40&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1. &lt;b&gt;분리된 모니터링 툴&lt;/b&gt;로 인해 &lt;b&gt;근본 원인 분석 지연.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;40&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2. &lt;b&gt;높은 상용 SaaS 비용&lt;/b&gt;과 &lt;b&gt;벤더 종속성&lt;/b&gt; 문제 발생.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;40&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;에 대한 해결책으로, 이러한 &lt;b&gt;파편화된 관측 환경을 통합&lt;/b&gt;하고 &lt;b&gt;성능 및 비용 효율성&lt;/b&gt;을 높이기 위해 만들어졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;265&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;265&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; SigNoz는 &lt;b&gt;OpenTelemetry 네이티브 설계&lt;/b&gt;, &lt;b&gt;ClickHouse 기반 단일 저장소&lt;/b&gt;를 기존 도구들의 차별점으로 삼는다.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-testid=&quot;table-container&quot; data-layout=&quot;custom&quot;&gt;
&lt;div data-vc=&quot;table-node-wrapper&quot; data-table-width=&quot;760&quot; data-table-local-id=&quot;27943ce6-4324-4317-9a2d-458471cf8137&quot; data-autosize=&quot;false&quot; data-layout=&quot;default&quot; data-number-column=&quot;false&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 100px;&quot; border=&quot;1&quot; data-layout=&quot;default&quot; data-table-width=&quot;760&quot; data-number-column=&quot;false&quot; data-testid=&quot;renderer-table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-cell-background=&quot;#efefef&quot; data-colwidth=&quot;119&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-cell-background=&quot;#efefef&quot; data-colwidth=&quot;306&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;SigNoz&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-cell-background=&quot;#efefef&quot; data-colwidth=&quot;332&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;기존 도구 (Prometheus/Jaeger/Loki 조합)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;119&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;OTel 네이티브&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;306&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;처음부터 내장 (벤더 종속성 제로)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;332&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;OTel 통합 모델을 중심으로 구축되지 않음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;119&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;통합 플랫폼&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;306&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;메트릭 + 트레이스 + 로그 (단일 UI/저장소)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;332&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;개별 도구 및 분리된 저장소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;119&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;데이터베이스&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;306&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;ClickHouse (컬럼형 OLAP)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;332&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Elasticsearch, Prometheus, Loki 등 이질적 저장소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;119&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;상관관계&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;306&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;신호 간 네이티브 연결 (원클릭 전환)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; data-colwidth=&quot;332&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;수동 연결 필요 / 제한적&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-vc=&quot;table-sticky-scrollbar-container&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1) OpenTelemetry 네이티브 설계: 벤더 종속성 제로&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OTel 표준 기반이라 독점 에이전트가 필요 없음&lt;/li&gt;
&lt;li&gt;계측(Instrumentation)은 한 번만 하면 되고, 백엔드는 Datadog 등 OTel 지원 백엔드로 쉽게 갈아탈 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) ClickHouse: 성능 &amp;amp; 비용 혁신&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Elasticsearch 대비 로그 수집 속도 2.5배, 집계 쿼리 13배 빠름&lt;br /&gt;컬럼형 저장 방식이라 압축률이 높고 스토리지 비용이 낮음&lt;br /&gt;고카디널리티 데이터도 효율적으로 처리함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 통합 관측성 &amp;amp; 상관관계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메트릭/트레이스/로그가 모두 ClickHouse 하나에 저장됨&lt;/li&gt;
&lt;li&gt;메트릭에서 이상 징후 확인 &amp;rarr; 원클릭으로 해당 시간대의 트레이스 &amp;rarr; 관련 로그로 이어지는 흐름이 자연스러움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4)&amp;nbsp;비용&amp;nbsp;모델&amp;nbsp;및&amp;nbsp;경제성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라이선스 비용이 없어서 상용 SaaS 대비 확실히 저렴함&lt;/li&gt;
&lt;li&gt;단, ClickHouse를 직접 운영해야 하므로 운영 복잡성이 생김&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;2.-SigNoz-구성요소&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1782&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;SigNoz 구성요소&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h4 id=&quot;1.-APM-(Application-Performance-Monitoring)&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1798&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. APM (Application Performance Monitoring)&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1843&quot; data-ke-size=&quot;size16&quot;&gt;APM은 애플리케이션의 성능 문제를 감지, 진단하고 사용자 경험을 보장하기 위한 모든 활동이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1843&quot; data-ke-size=&quot;size16&quot;&gt;현대의 APM은 단순한 Health check를 넘어서, '왜 느린가?', '어떤 사용자가 영향을 받았는가?'를 추적하며, &lt;b&gt;관측 가능성(Observability)의 3요소&lt;/b&gt;를 기반으로 한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-testid=&quot;table-container&quot; data-layout=&quot;custom&quot;&gt;
&lt;div data-vc=&quot;table-node-wrapper&quot; data-table-width=&quot;760&quot; data-table-local-id=&quot;4c0299ea-6c2d-420a-b813-628d663560f7&quot; data-autosize=&quot;false&quot; data-layout=&quot;default&quot; data-number-column=&quot;false&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-vc=&quot;table-sticky-scrollbar-container&quot;&gt;
&lt;div data-number-column=&quot;false&quot; data-layout=&quot;default&quot; data-autosize=&quot;false&quot; data-table-local-id=&quot;4c0299ea-6c2d-420a-b813-628d663560f7&quot; data-table-width=&quot;760&quot; data-vc=&quot;table-node-wrapper&quot;&gt;
&lt;div data-vc=&quot;table-node-wrapper&quot; data-table-width=&quot;760&quot; data-table-local-id=&quot;27943ce6-4324-4317-9a2d-458471cf8137&quot; data-autosize=&quot;false&quot; data-layout=&quot;default&quot; data-number-column=&quot;false&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 75.5814%; height: 97px;&quot; border=&quot;1&quot; data-layout=&quot;default&quot; data-table-width=&quot;760&quot; data-number-column=&quot;false&quot; data-testid=&quot;renderer-table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left; height: 21px; width: 10.6475%;&quot; data-cell-background=&quot;#efefef&quot; data-colwidth=&quot;119&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #292a2e; text-align: start;&quot;&gt;신호&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left; height: 21px; width: 14.3489%;&quot; data-cell-background=&quot;#efefef&quot; data-colwidth=&quot;306&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #292a2e; text-align: start;&quot;&gt;역할&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left; height: 21px; width: 50.585%;&quot; data-cell-background=&quot;#efefef&quot; data-colwidth=&quot;332&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #292a2e; text-align: start;&quot;&gt;문제 해결&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; height: 16px; width: 10.6475%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;119&quot;&gt;&lt;b&gt;Metrics&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 16px; width: 14.3489%;&quot; data-colwidth=&quot;306&quot;&gt;&lt;span style=&quot;color: #292a2e; text-align: start;&quot;&gt;징후 감지&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 16px; width: 50.585%;&quot; data-colwidth=&quot;332&quot;&gt;&lt;b&gt;언제&lt;/b&gt;&lt;span style=&quot;color: #292a2e; text-align: left;&quot;&gt;&amp;nbsp;문제가 발생했는가? (ex. CPU 90%)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; height: 20px; width: 10.6475%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;119&quot;&gt;&lt;b&gt;Traces&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px; width: 14.3489%;&quot; data-colwidth=&quot;306&quot;&gt;&lt;span style=&quot;color: #292a2e; text-align: start;&quot;&gt;위치 식별&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px; width: 50.585%;&quot; data-colwidth=&quot;332&quot;&gt;&lt;b&gt;어디서&lt;/b&gt;&lt;span style=&quot;color: #292a2e; text-align: left;&quot;&gt;&amp;nbsp;병목이 발생했는가? (ex. A-&amp;gt;B 호출 5초)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; height: 20px; width: 10.6475%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;119&quot;&gt;&lt;b&gt;Logs&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px; width: 14.3489%;&quot; data-colwidth=&quot;306&quot;&gt;&lt;span style=&quot;color: #292a2e; text-align: start;&quot;&gt;원인 파악&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px; width: 50.585%;&quot; data-colwidth=&quot;332&quot;&gt;&lt;b&gt;왜&lt;/b&gt;&lt;span style=&quot;color: #292a2e; text-align: left;&quot;&gt;&amp;nbsp;문제가 발생했는가? (ex. NullPointerException)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-vc=&quot;table-sticky-scrollbar-container&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2205&quot; data-ke-size=&quot;size16&quot;&gt;APM 툴은 이 세 가지 데이터를 수집하고, 서로 유기적으로 연관시켜 문제 해결 시간을 단축시킨다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2263&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;2.-OTel-(OpenTelemetry)&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2266&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. OTel (OpenTelemetry)&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2291&quot; data-ke-size=&quot;size16&quot;&gt;OpenTelemetry(OTel)는 로그, 메트릭, 트레이스 데이터를 &lt;b&gt;생성, 수집, 전송하는 방식을 표준화&lt;/b&gt;하는 오픈소스 프레임워크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목적:&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-indent-level=&quot;2&quot;&gt;
&lt;li&gt;벤더 종속성(Vendor Lock-in) 해결&lt;/li&gt;
&lt;li&gt;OTel 표준에 맞춰 &lt;b&gt;한 번만 계측(Instrumentation)&lt;/b&gt;하면, 백엔드를 SigNoz, Datadog, Jaeger 등 원하는 툴로 자유롭게 변경 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 구성 요소:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;API &amp;amp; SDK:&lt;/b&gt; 애플리케이션 코드에 설치되어 데이터를 생성하는 라이브러리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Collector:&lt;/b&gt; 모든 데이터를 수신하는 &lt;b&gt;관문(Gateway).&lt;/b&gt;&amp;nbsp;데이터 필터링, 가공, 샘플링 후 백엔드로 전송.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OTLP:&lt;/b&gt; OTel 컴포넌트 간 표준 통신 프로토콜.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2694&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;3.-ClickHouse&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2697&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. ClickHouse&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2712&quot; data-ke-size=&quot;size16&quot;&gt;ClickHouse는 &lt;b&gt;실시간 분석(OLAP)&lt;/b&gt;을 위해 설계된 &lt;b&gt;오픈소스 컬럼 기반(Columnar) DBMS다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;2712&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;역할:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수십억 건의 행을 몇 초 만에 처리하는 압도적인 성능으로 APM 데이터(로그, 메트릭, 트레이스)를 저장하고 실시간 집계/분석한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 차이점 (저장 방식):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;RDBMS (MySQL 등):&lt;/b&gt; &lt;b&gt;행(Row) 기반&lt;/b&gt;. 트랜잭션(OLTP) 처리에 최적화. (예: 사용자 ID 1001의 모든 정보)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ClickHouse:&lt;/b&gt; &lt;b&gt;열(Column) 기반&lt;/b&gt;. 분석(OLAP)에 최적화. (예: 모든 사용자의 '응답 시간' 열만 읽음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컬럼 기반의 장점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;속도:&lt;/b&gt; 분석에 필요한 열만 읽어 디스크 I/O를 획기적으로 줄입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비용:&lt;/b&gt; 동일 타입 데이터가 연속 저장되어 압축률이 매우 높아(Elasticsearch 대비) 스토리지 비용이 절감됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-number-column=&quot;false&quot; data-layout=&quot;default&quot; data-autosize=&quot;false&quot; data-table-local-id=&quot;4c0299ea-6c2d-420a-b813-628d663560f7&quot; data-table-width=&quot;760&quot; data-vc=&quot;table-node-wrapper&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-vc=&quot;table-sticky-scrollbar-container&quot;&gt;
&lt;div data-vc=&quot;table-node-wrapper&quot; data-table-width=&quot;760&quot; data-table-local-id=&quot;4c0299ea-6c2d-420a-b813-628d663560f7&quot; data-autosize=&quot;false&quot; data-layout=&quot;default&quot; data-number-column=&quot;false&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div data-vc=&quot;table-sticky-scrollbar-container&quot;&gt;
&lt;div data-number-column=&quot;false&quot; data-layout=&quot;default&quot; data-autosize=&quot;false&quot; data-table-local-id=&quot;4c0299ea-6c2d-420a-b813-628d663560f7&quot; data-table-width=&quot;760&quot; data-vc=&quot;table-node-wrapper&quot;&gt;
&lt;div data-vc=&quot;table-node-wrapper&quot; data-table-width=&quot;760&quot; data-table-local-id=&quot;27943ce6-4324-4317-9a2d-458471cf8137&quot; data-autosize=&quot;false&quot; data-layout=&quot;default&quot; data-number-column=&quot;false&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 84.534%; height: 77px;&quot; border=&quot;1&quot; data-layout=&quot;default&quot; data-table-width=&quot;760&quot; data-number-column=&quot;false&quot; data-testid=&quot;renderer-table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left; height: 21px; width: 15.4167%;&quot; data-cell-background=&quot;#efefef&quot; data-colwidth=&quot;119&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #292a2e; text-align: start;&quot;&gt;신호&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left; height: 21px; width: 17.272%;&quot; data-cell-background=&quot;#efefef&quot; data-colwidth=&quot;306&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #292a2e; text-align: start;&quot;&gt;역할&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left; height: 21px; width: 54.7388%;&quot; data-cell-background=&quot;#efefef&quot; data-colwidth=&quot;332&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #292a2e; text-align: start;&quot;&gt;문제 해결&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; height: 16px; width: 15.4167%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;119&quot;&gt;&lt;b&gt;Metrics&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 16px; width: 17.272%;&quot; data-colwidth=&quot;306&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;징후 감지&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 16px; width: 54.7388%;&quot; data-colwidth=&quot;332&quot;&gt;&lt;b&gt;언제&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;문제가 발생했는가? (ex. CPU 90%)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; height: 20px; width: 15.4167%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;119&quot;&gt;&lt;b&gt;Traces&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px; width: 17.272%;&quot; data-colwidth=&quot;306&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;위치 식별&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px; width: 54.7388%;&quot; data-colwidth=&quot;332&quot;&gt;&lt;b&gt;어디서&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;병목이 발생했는가? (ex. A-&amp;gt;B 호출 5초)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; height: 20px; width: 15.4167%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;119&quot;&gt;&lt;b&gt;Logs&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px; width: 17.272%;&quot; data-colwidth=&quot;306&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;원인 파악&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; height: 20px; width: 54.7388%;&quot; data-colwidth=&quot;332&quot;&gt;&lt;b&gt;왜&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;문제가 발생했는가? (ex. NullPointerException)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터베이스 구조 유형 비교 ▼&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-pm-slice=&quot;1 1 [&amp;quot;expand&amp;quot;,{&amp;quot;title&amp;quot;:&amp;quot;데이터베이스 구조 유형 비교&amp;quot;,&amp;quot;__expanded&amp;quot;:true,&amp;quot;localId&amp;quot;:null}]&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;데이터베이스 구조 유형 비교&lt;/b&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 [&amp;quot;expand&amp;quot;,{&amp;quot;title&amp;quot;:&amp;quot;데이터베이스 구조 유형 비교&amp;quot;,&amp;quot;__expanded&amp;quot;:true,&amp;quot;localId&amp;quot;:null}]&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구조&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;대표 시스템&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;저장 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;기능&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;컬럼 기반 저장소 (Columnar)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;ClickHouse \(OLAP)&lt;/td&gt;
&lt;td&gt;데이터를 열(Column) 단위로 저장&lt;/td&gt;
&lt;td&gt;대규모 데이터 분석/집계(GROUP BY, SUM), 높은 데이터 압축률&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;행 기반 저장소 (Row-Oriented)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;MySQL, PostgreSQL (OLTP)&lt;/td&gt;
&lt;td&gt;데이터를 행(Row) 단위로 저장&lt;/td&gt;
&lt;td&gt;트랜잭션 처리(OLTP), 빠른 데이터 삽입/수정, 정형화된 데이터 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;역 인덱스 구조&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Elasticsearch&lt;/td&gt;
&lt;td&gt;문서의 단어를 추출하여 &quot;단어 &amp;rarr; 문서 목록&quot; 형태로 색인&lt;/td&gt;
&lt;td&gt;전문(Full-text) 검색, 텍스트 기반 필터링 및 로그 탐색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;키-값 저장소 (Key-Value)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Redis, DynamoDB&lt;/td&gt;
&lt;td&gt;데이터 고유 키와 값(Key-Value) 쌍으로 저장&lt;/td&gt;
&lt;td&gt;매우 빠른 읽기/쓰기, 캐싱, 세션 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;문서 저장소 (Document)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;MongoDB, Couchbase&lt;/td&gt;
&lt;td&gt;데이터를 JSON 형태의 문서로 저장&lt;/td&gt;
&lt;td&gt;구조가 유연(스키마리스), 복잡한 계층 구조 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;그래프 저장소 (Graph)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Neo4j&lt;/td&gt;
&lt;td&gt;데이터를 노드와 에지(관계) 형태로 저장&lt;/td&gt;
&lt;td&gt;복잡한 관계 및 연결 패턴 분석, 소셜 네트워크, 추천 시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;시계열 저장소 (Time-Series)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Prometheus, InfluxDB&lt;/td&gt;
&lt;td&gt;데이터를 시간 순서대로 저장하고 인덱싱&lt;/td&gt;
&lt;td&gt;시간 기반 추세 분석, 지속적으로 발생하는 메트릭 데이터 기록/집계&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div data-vc=&quot;table-node-wrapper&quot; data-table-width=&quot;760&quot; data-table-local-id=&quot;4c0299ea-6c2d-420a-b813-628d663560f7&quot; data-autosize=&quot;false&quot; data-layout=&quot;default&quot; data-number-column=&quot;false&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;3.- ️-시스템-아키텍처-및-워크플로우&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3127&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;시스템 아키텍처 및 워크플로우&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #505258;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3152&quot; data-ke-size=&quot;size16&quot;&gt;SigNoz는 OTel 표준을 기반으로 &lt;b&gt;데이터를 수집, 처리, 저장, 시각화&lt;/b&gt;한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3152&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;3200&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[애플리케이션 (OTel SDK)] &amp;rarr; [SigNoz Collector] &amp;rarr; [ClickHouse] &amp;rarr; [SigNoz Backend] &amp;rarr; [Web UI]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1515&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XPdfa/dJMcagw7joC/40ZKhtwU4vGLvSCnbap6pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XPdfa/dJMcagw7joC/40ZKhtwU4vGLvSCnbap6pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XPdfa/dJMcagw7joC/40ZKhtwU4vGLvSCnbap6pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXPdfa%2FdJMcagw7joC%2F40ZKhtwU4vGLvSCnbap6pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1515&quot; height=&quot;673&quot; data-origin-width=&quot;1515&quot; data-origin-height=&quot;673&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;265&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #292a2e; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-layout=&quot;default&quot; data-table-width=&quot;760&quot; data-number-column=&quot;false&quot; data-testid=&quot;renderer-table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; width: 13.6047%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;117&quot;&gt;&lt;span&gt;&lt;b&gt;단계&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left; width: 20.6977%;&quot; data-cell-background=&quot;#efefef&quot; data-colwidth=&quot;210&quot;&gt;&lt;span&gt;&lt;b&gt;구성 요소&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; text-align: left; width: 65.6977%;&quot; data-cell-background=&quot;#efefef&quot; data-colwidth=&quot;431&quot;&gt;&lt;span&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; width: 13.6047%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;117&quot;&gt;&lt;span&gt;&lt;b&gt;데이터 생성&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 20.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;210&quot;&gt;&lt;b&gt;&lt;span&gt;App (OTel SDK)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 65.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;431&quot;&gt;&lt;span&gt;애플리케이션 내에서 Metrics, Traces, Logs 데이터를 OTLP 표준으로 생성 및 전송.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; width: 13.6047%;&quot;&gt;&lt;span&gt;&lt;b&gt;데이터 수집&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 20.6977%;&quot;&gt;&lt;span&gt;&lt;b&gt;OTEL Agent&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 65.6977%;&quot;&gt;&lt;span&gt;생성된 데이터를 가장 가까운 &lt;b&gt;OTEL Collector (Agent 모드)&lt;/b&gt;로 내보냄.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; width: 13.6047%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;117&quot;&gt;&lt;span&gt;&lt;b&gt;수집 및 처리&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 20.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;210&quot;&gt;&lt;b&gt;&lt;span&gt;OTel Collector&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 65.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;431&quot;&gt;&lt;span&gt;(관문 역할) 데이터 수신, 필터링, &lt;b&gt;샘플링(비용 제어)&lt;/b&gt;, 일괄 처리(Batching) 수행.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; width: 13.6047%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;117&quot;&gt;&lt;span&gt;&lt;b&gt;데이터 저장&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 20.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;210&quot;&gt;&lt;b&gt;&lt;span&gt;ClickHouse&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 65.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;431&quot;&gt;&lt;span&gt;Collector로부터 받은 &lt;b&gt;모든 데이터(M/T/L)를 단일 저장소&lt;/b&gt;에 컬럼 기반으로 저장.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; width: 13.6047%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;117&quot;&gt;&lt;span&gt;&lt;b&gt;클러스터 관리&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 20.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;210&quot;&gt;&lt;b&gt;&lt;span&gt;Zookeeper&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 65.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;431&quot;&gt;&lt;span&gt;(HA 구성 시) ClickHouse 클러스터의 분산 구성 및 데이터 복제 일관성을 관리.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; width: 13.6047%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;117&quot;&gt;&lt;span&gt;&lt;b&gt;조회 및 시각화&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 20.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;210&quot;&gt;&lt;b&gt;&lt;span&gt;Query Service&lt;br /&gt;(Backend)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 65.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;431&quot;&gt;&lt;span&gt;ClickHouse에서 데이터를 조회하여 API로 제공.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; width: 13.6047%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;117&quot;&gt;&lt;span&gt;&lt;b&gt;경고 및 알림&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 20.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;210&quot;&gt;&lt;b&gt;&lt;span&gt;Alert Manager&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 65.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;431&quot;&gt;&lt;span&gt;임계값 초과 시 알림 생성 (Slack, Email 연동).&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f0f1f2; text-align: left; width: 13.6047%;&quot; data-cell-background=&quot;#f4f5f7&quot; data-colwidth=&quot;117&quot;&gt;&lt;span&gt;&lt;b&gt;사용자&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 20.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;210&quot;&gt;&lt;b&gt;&lt;span&gt;Web UI (Frontend)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: left; width: 65.6977%;&quot; data-cell-background=&quot;#ffffff&quot; data-colwidth=&quot;431&quot;&gt;&lt;span&gt;API 데이터를 받아 대시보드로 시각화.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;265&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;265&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;265&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;265&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;265&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;265&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MSA/APM</category>
      <category>apm</category>
      <category>signoz</category>
      <author>miracle21</author>
      <guid isPermaLink="true">https://minha0220.tistory.com/219</guid>
      <comments>https://minha0220.tistory.com/219#entry219comment</comments>
      <pubDate>Mon, 17 Nov 2025 10:54:48 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Java 프로젝트를 Docker 이미지로 빌드하기</title>
      <link>https://minha0220.tistory.com/218</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS EC2로 운영중이던 java 서비스를 EKS 로 전환해야하는 일이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Maven 등의 빌드 도구가 필요한 java 서비스는 도커 이미지로 빌드하고 실행 환경을 만들면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 환경과 서비스 실행 환경을 분리할 수가 있어서, Maven, JDK, 빌드 캐시 등의 불필요한 산출물들이 남지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1760318653410&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1단계: 빌드 환경 (Maven)
FROM maven:3.8.6-amazoncorretto-8 AS builder
WORKDIR /build
COPY service /build
RUN mvn clean package

# 2단계: 실행 환경 (Amazon Linux)
FROM amazonlinux:2 AS base
RUN yum update -y &amp;amp;&amp;amp; \
    yum install -y java-1.8.0-openjdk &amp;amp;&amp;amp; \
    yum clean all

# 3단계: 빌드 결과물만 복사해서 실행
COPY --from=builder /build/target/*.jar /app/app.jar
WORKDIR /app
CMD [&quot;java&quot;, &quot;-jar&quot;, &quot;app.jar&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드처럼 첫 이미지는 빌드용 환경을 만들어서 jar 파일 빌드를 하고(AWS 환경에 최적화된 amazoncorretto 선택)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 이미지는 실제 실행환경으로 사용할 베이스 이미지를 만들어서 빌드한 파일만 복사할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MSA/도커</category>
      <category>java 이미지 빌드</category>
      <author>miracle21</author>
      <guid isPermaLink="true">https://minha0220.tistory.com/218</guid>
      <comments>https://minha0220.tistory.com/218#entry218comment</comments>
      <pubDate>Mon, 13 Oct 2025 10:41:09 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] Fluentbit 로그 수집 방법(Sidecar vs DaemonSet)</title>
      <link>https://minha0220.tistory.com/217</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;EKS에서 fluentbit를 sidecar로 띄울때와 daemonset으로 띄울때의 설정을 다르게 줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sidecar는 pod name을 바로 가져올 수 있지만, daemonset 은 기본적으로 노드 이름을 가져와서 설정을 따로 더 해줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;[sidecar] fluentbit-configmap.yaml&lt;/h4&gt;
&lt;pre id=&quot;code_1753059520167&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentbit-config
  namespace: ns-app
data:
  fluent-bit.conf: |
    [SERVICE]
        Flush                     1
        Grace                     30
        Log_Level                 trace
        Daemon                    off

    [INPUT]
        Name                tail
        Log_Level           trace
        Path                /app.log
        Tag                 ${POD_NAME}
        Skip_Long_Lines     Off
        Refresh_Interval    10
        Read_from_Head      True
        DB                  /app.db

    [OUTPUT]
        Name                cloudwatch_logs
        Match               *
        region              ap-northeast-2
        log_group_name      /app
        log_stream_prefix   log-
        auto_create_group   true
        log_key             log

    [FILTER]
        Name                aws
        Match               ${POD_NAME}
        imds_version        v1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;[daemonset] fluentbit-configmap.yaml&lt;/h4&gt;
&lt;pre id=&quot;code_1753059602034&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentbit-config
  namespace: ns-app
data:
  fluent-bit.conf: |
    [SERVICE]
        Flush                     1
        Grace                     30
        Log_Level                 trace
        Daemon                    off

    [INPUT]
        Name                tail
        Log_Level           trace
        Path                /app.log
        Tag                 *
        Skip_Long_Lines     Off
        Refresh_Interval    10
        Read_from_Head      True
        DB                  /app.db

    [OUTPUT]
        Name                cloudwatch_logs
        Match               *
        region              ap-northeast-2
        log_group_name      /app
        log_stream_name     ${kubernetes['pod_name']}
        log_stream_prefix   log-
        auto_create_group   true
        log_key             log

    [FILTER]
        Name                aws
        Match               *
        imds_version        v1

    [FILTER]
        Name                kubernetes
        Match               *
        Kube_URL            https://kubernetes.default.svc:443&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deployment는 sidecar나 daemonset이나 차이가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, &lt;b&gt;볼륨 설정은 sidecar는 emptydir 로, daemonset은 hostpath&lt;/b&gt; 로 해야한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-5-mini&quot; data-message-id=&quot;1f96f5e3-0c1a-43e7-bd1d-74d728156aac&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;208&quot; data-start=&quot;0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;98&quot; data-start=&quot;0&quot;&gt;&lt;b&gt;DaemonSet&lt;/b&gt;: 노드 로그를 수집하려면 Pod가 호스트 파일 시스템에 접근해야 하므로 &lt;b&gt;hostpath&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;를 사용해야 함(&lt;b&gt;emptydir&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt; 불가)&lt;/li&gt;
&lt;li data-is-last-node=&quot;&quot; data-end=&quot;208&quot; data-start=&quot;99&quot;&gt;&lt;b&gt;Sidecar&lt;/b&gt;: Pod 내부 로그를 수집하기 때문에&amp;nbsp; &lt;b&gt;emptydir&lt;/b&gt;을&amp;nbsp;공유해서 로그를 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ &amp;nbsp;${kubernetes['pod_name']} 으로 pod 이름을 가져오려면 RBAC 설정을 해야하는것 같다. 권한이 없어서 임시로 로그 이름에 pod 이름이 아예 추가가 되도록 설정하고, 로그파일 이름을 로그스트림 이름으로 가져가도록 했다. Daemonset 설정에서 어떤게 불필요한 코드인지 검증해보고 싶은데 기회가 되면 다시 수정할 예정이다.&lt;/p&gt;
&lt;pre id=&quot;code_1768467245748&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;host_name=$(hostname -f)
logfile=&quot;/logs/${host_name}-$(date +'%Y%m%d%H').log&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>MSA/쿠버네티스</category>
      <category>eks fluentbit</category>
      <category>fluentbit</category>
      <category>fluentbit daemonset</category>
      <category>fluentbit sidecar</category>
      <author>miracle21</author>
      <guid isPermaLink="true">https://minha0220.tistory.com/217</guid>
      <comments>https://minha0220.tistory.com/217#entry217comment</comments>
      <pubDate>Tue, 16 Sep 2025 16:20:56 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] HPA 설정 커스터마이징(hpa behavior)</title>
      <link>https://minha0220.tistory.com/216</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;HPA(Horizontal Pod Autoscale)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU나 메모리 사용률을 기준으로 자동으로 파드 수를 조절할 수 있게 해주는 기능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;autoscaling/v1 과 autoscaling/v2 가 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;autoscaling/v1 는 기본적인 CPU와 메모리 사용률 기준으로만 세팅이 가능하고 별다른 커스텀이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다양한 메트릭 종류&lt;/b&gt; 및 스케일 인/아웃의 &lt;b&gt;속도&lt;/b&gt;, &lt;b&gt;빈도&lt;/b&gt;, &lt;b&gt;조건&lt;/b&gt;에 대한 세밀한 조정이 필요하다면 v2를 사용해야한다&lt;b&gt;.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 88.023%; height: 127px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.7718%; text-align: center; height: 21px;&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;항목&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.3376%; text-align: center; height: 21px;&quot;&gt;&lt;b&gt; autoscaling/v1 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 52.4109%; text-align: center; height: 21px;&quot;&gt;&lt;b&gt; autoscaling/v2&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 85px;&quot;&gt;
&lt;td style=&quot;width: 18.7718%; text-align: center; height: 85px;&quot;&gt;&lt;b&gt;지원 메트릭 종류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.3376%; text-align: center; height: 85px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: center;&quot;&gt;리소스&lt;span&gt; &lt;/span&gt;&lt;/span&gt;(CPU, 메모리)&lt;/td&gt;
&lt;td style=&quot;width: 52.4109%; text-align: center; height: 85px;&quot;&gt;리소스 (CPU, 메모리) &lt;br /&gt;external 메트릭 (ALB 요청 수 등 클러스터 외부 메트릭)&lt;span&gt;&lt;br /&gt;&lt;/span&gt;object 메트릭 (클러스터 내부 메트릭)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.7718%; text-align: center; height: 21px;&quot;&gt;&lt;b&gt;여러 메트릭 동시 지원&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.3376%; text-align: center; height: 21px;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;width: 52.4109%; text-align: center; height: 21px;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;autoscaling/v2&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1186&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v2는 다양한 메트릭을 지원하지만, 기본으로 제공하는 CPU와 Memory 외에는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;promethus나 datadog같은 메트릭 수집 도구&lt;/b&gt;가 있어야 사용 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, Datadog으로 AWS target group에 대한 request 수 대비 pod 스케일아웃/인을 하려면&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;timeseries 개수 대비 비용이 발생하므로 비용적인 측면도 고려해야한다.&lt;br /&gt;(2&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;개의 target group에 대한 request 수를 수집하려면 timeseries 가 2개로 계산됨)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-ke-size=&quot;size20&quot; data-renderer-start-pos=&quot;1275&quot;&gt;&lt;b&gt;&lt;span&gt;기본 Scale In, Scale Out 동작 원리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같이 커스텀이 들어가지 않은 일반적인 HPA의 경우&lt;/p&gt;
&lt;pre id=&quot;code_1754554363136&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-test
  namespace: ns-test
spec:
  maxReplicas: 80
  minReplicas: 40
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-deployment
  targetCPUUtilizationPercentage: 70&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1754554410575&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-test
  namespace: ns-test
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-deployment
  minReplicas: 2
  maxReplicas: 4
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;스케일인/아웃은 기본 동작을 따른다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-layout=&quot;custom&quot; data-testid=&quot;table-container&quot;&gt;
&lt;div data-number-column=&quot;false&quot; data-layout=&quot;default&quot; data-autosize=&quot;false&quot; data-table-local-id=&quot;e698cc00-6a36-4ed9-9640-67ab510afa78&quot; data-table-width=&quot;760&quot; data-vc=&quot;table-node-wrapper&quot;&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 88.023%; height: 127px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; text-align: center;&quot;&gt;&lt;b&gt;scaleUp&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; text-align: center;&quot;&gt;&lt;b&gt;scaleDown&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center;&quot;&gt;&lt;b&gt;적용 대기 시간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;없음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;300초(5분)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center;&quot;&gt;&lt;b&gt;감소/증가량 제한&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;없음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center;&quot;&gt;&lt;b&gt;평가 주기&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;약 15초&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;약 15초&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;autoscaling/v2&quot; style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1186&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&amp;nbsp;Scale&amp;nbsp;out&lt;/b&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1754554478254&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;desiredReplicas(목표 파드 수) = 현재 파드 수 &amp;times; 현재 리소스 사용률 &amp;divide; 목표 사용률&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;현재&amp;nbsp;CPU&amp;nbsp;사용률이&amp;nbsp;150%고,&amp;nbsp;CPU&amp;nbsp;사용률이&amp;nbsp;50%가&amp;nbsp;넘는&amp;nbsp;경우&amp;nbsp;스케일&amp;nbsp;아웃되도록&amp;nbsp;설정했다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;현재 파드수가 5라면,&lt;/p&gt;
&lt;pre id=&quot;code_1754554497695&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;5 &amp;times; 150 &amp;divide; 50 = 15&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;15대로&amp;nbsp;증가하게&amp;nbsp;된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;즉, 스케일아웃은 기본적으로 5분 동안의 desiredReplicas 중에서, 가장 큰 값으로 파드 수를 감소시킨다.&lt;br /&gt;(예: 5분간 desiredReplicas 가 5~8개를 왔다갔다 한다면 그 중에서 가장 큰 값인 8대로 감소)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Scale in&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1754554515065&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;desiredReplicas(목표 파드 수) = 현재 파드 수 &amp;times; 현재 평균 리소스 사용률 &amp;divide; 목표 사용률&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;현재&amp;nbsp;평균&amp;nbsp;CPU&amp;nbsp;사용률이&amp;nbsp;35%고,&amp;nbsp;CPU&amp;nbsp;사용률&amp;nbsp;기준이&amp;nbsp;70%인&amp;nbsp;경우,&amp;nbsp;현재&amp;nbsp;파드수가&amp;nbsp;10이라면, &lt;/p&gt;
&lt;pre id=&quot;code_1754554525535&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;10 &amp;times; 35 / 70 = 5&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;파드&amp;nbsp;5대로&amp;nbsp;줄어든다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;기본적으로&amp;nbsp;&lt;b&gt;5분&lt;/b&gt;간&amp;nbsp;리소스가&amp;nbsp;지속적으로&amp;nbsp;낮아야&amp;nbsp;스케일인이&amp;nbsp;된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;스케일인&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;은 기본적으로 15초마다 메트릭을 확인해서 desiredReplicas 에 맞는 파드 수로 증가시킨다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;(예: 체크할 때 당시의 desiredReplicas 에 맞게 증가)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-testid=&quot;table-container&quot; data-layout=&quot;custom&quot;&gt;
&lt;div data-vc=&quot;table-node-wrapper&quot; data-table-width=&quot;760&quot; data-table-local-id=&quot;e698cc00-6a36-4ed9-9640-67ab510afa78&quot; data-autosize=&quot;false&quot; data-layout=&quot;default&quot; data-number-column=&quot;false&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;세부적인 설정 커스터마이징&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot;&gt;v2 기준 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;behavior 필드로 스케일 업/다운의 속도를 제어할 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;br /&gt;&lt;br /&gt;예를들어, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;1. test-deployment 의 cpu 평균 사용률 70% 초과 시 스케일 아웃&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;2. test-deployment&amp;nbsp;의&amp;nbsp;memory&amp;nbsp;평균&amp;nbsp;사용률&amp;nbsp;70%&amp;nbsp;초과&amp;nbsp;시&amp;nbsp;스케일&amp;nbsp;아웃&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;하는 HPA가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1754554840553&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa
  namespace: ns-test
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-deployment
  minReplicas: 10
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 70&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;br /&gt;&lt;br /&gt;여기서 스케일인/아웃 속도&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;빈도&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;조건&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;에 대한&lt;span&gt; &lt;/span&gt;&lt;/span&gt;설정 추가를 할수있다(behavior 필드 추가).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1754554898970&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa
  namespace: ns-test
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-deployment
  minReplicas: 10
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 70
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 300       # 5분간 리소스 초과를 유지해야 스케일업
      policies:
        - type: Percent
          value: 50                         # 한 번에 현재 파드 수의 50% 증가 가능
          periodSeconds: 60                 # 60초마다 한 번 적용
        - type: Pods
          value: 4                          # 한 번에 최대 4개 증가
          periodSeconds: 60                 # 60초마다 한 번 적용
      selectPolicy: Max                     # Percent와 Pods 중 더 큰 쪽 적용
    scaleDown:
      stabilizationWindowSeconds: 600       # 10분 동안 기준 이하 유지돼야 스케일인
      policies:
        - type: Percent
          value: 25                         # 한 번에 25% 이하로만 감소
          periodSeconds: 60                 # 60초에 한 번 평가&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: left;&quot; data-renderer-start-pos=&quot;1275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MSA/쿠버네티스</category>
      <category>HPA</category>
      <category>오토스케일링</category>
      <author>miracle21</author>
      <guid isPermaLink="true">https://minha0220.tistory.com/216</guid>
      <comments>https://minha0220.tistory.com/216#entry216comment</comments>
      <pubDate>Thu, 7 Aug 2025 17:24:45 +0900</pubDate>
    </item>
  </channel>
</rss>