<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>JUST WRITE</title>
    <link>https://developnote-blog.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 17 Jun 2026 06:25:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>천재보단범재</managingEditor>
    <image>
      <title>JUST WRITE</title>
      <url>https://tistory1.daumcdn.net/tistory/4909988/attach/3e62a284a3904ef4b6b4c40e0a91abef</url>
      <link>https://developnote-blog.tistory.com</link>
    </image>
    <item>
      <title>[Azure] AKS에 Grafana 모니터링 구축하기</title>
      <link>https://developnote-blog.tistory.com/222</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TQKju/dJMcaffbShy/KiYVnO3MR81NzBdWwbjxr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TQKju/dJMcaffbShy/KiYVnO3MR81NzBdWwbjxr0/img.png&quot; data-alt=&quot;Hubble 기반 네트워크 관측성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TQKju/dJMcaffbShy/KiYVnO3MR81NzBdWwbjxr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTQKju%2FdJMcaffbShy%2FKiYVnO3MR81NzBdWwbjxr0%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;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Hubble 기반 네트워크 관측성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AKS에 Grafana 모니터링 구축하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;저번 포스팅에서 Terraform을 이용해서 Azure에 AKS를 구축하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775984105584&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Terraform] Azure AKS 클러스터 한번에 구축하기&quot; data-og-description=&quot;Terrafrom으로 AKS 클러스터 구축TL;DRAzure VM에서 Terraform을 사용해 AKS 클러스터 + ACR을 한 번에 프로비저닝 하는 방법을 정리CNI는 eBPF 기반 Cilium, 디스크는 비용/성능 모두 유리한 Ephemeral 선택Terraform i&quot; data-og-host=&quot;developnote-blog.tistory.com&quot; data-og-source-url=&quot;https://developnote-blog.tistory.com/221&quot; data-og-url=&quot;https://developnote-blog.tistory.com/221&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4h3Mw/dJMb8ZvCEHH/05NUvHqrNQCOpQckgY6QA0/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/BL3vQ/dJMb8XkgyDy/IVzUj55tVWKxNWTgFeo721/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/fH6fL/dJMb8PGxjQN/cErvb19Rvl7c14QDok7BV1/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450&quot;&gt;&lt;a href=&quot;https://developnote-blog.tistory.com/221&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developnote-blog.tistory.com/221&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4h3Mw/dJMb8ZvCEHH/05NUvHqrNQCOpQckgY6QA0/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/BL3vQ/dJMb8XkgyDy/IVzUj55tVWKxNWTgFeo721/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/fH6fL/dJMb8PGxjQN/cErvb19Rvl7c14QDok7BV1/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Terraform] Azure AKS 클러스터 한번에 구축하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Terrafrom으로 AKS 클러스터 구축TL;DRAzure VM에서 Terraform을 사용해 AKS 클러스터 + ACR을 한 번에 프로비저닝 하는 방법을 정리CNI는 eBPF 기반 Cilium, 디스크는 비용/성능 모두 유리한 Ephemeral 선택Terraform i&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developnote-blog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;구축하고 운영하다 보니 쉽게 AKS를 모니터링할 수 없을까 고민되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;특히 네트워크 관련 문제는 kubectl logs로는 찾기가 힘들었습니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AKS 내 서비스 간 연결 문제&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;특정 Pod에서 타임 아웃 에러 문제가 네트워크 문제일 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;NetworkPolicy를 적용했는데 의도치 않게 트래픽이 막힐 때&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Cilium의 Hubble과 Grafana을 통해 네트워크 트래픽을 시각화하려고&lt;/b&gt;&lt;/span&gt; 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;TL;DR&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AKS에 ACNS를 활성화해 &lt;b&gt;Hubble 기반 네트워크 관측성&lt;/b&gt; 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Azure Managed Grafana&lt;/b&gt;를 Terraform으로 프로비저닝&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Grafana 대시보드에서 네트워크 대시보드(DNS, Packet loss, Pod flow 등) 확인&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;전체 아키텍처&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1775984665373&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[AKS Cluster]
  Cilium CNI + ACNS 활성화
       │
       │ eBPF로 모든 네트워크 패킷 추적
       ▼
[Hubble Relay]
  모든 노드의 네트워크 흐름을 수집/집계
       │
       │ Prometheus 메트릭 형식으로 노출
       ▼
[ama-metrics]
  메트릭을 스크래핑해서 Azure Monitor로 전송
       │
       │ 메트릭 저장
       ▼
[Azure Monitor Workspace]
  Prometheus 메트릭 저장소
       │
       │ 데이터 조회
       ▼
[Azure Managed Grafana]
  대시보드 시각화 (DNS, Drops, Pod Flows 등)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위와 같은 아키텍처로 구성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대신 그전에 아래와 같은 사전환경이 구성되어야 합니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terraform으로 AKS가 구축된 상태&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;network_data_plane = &quot;cilium&quot;으로 Cilium CNI 사용 중&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Azure CLI 및 kubectl 설치 완료&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ACNS 활성화&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AKS에 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;ACNS(&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Advanced Container Networking Services)를 활성화&lt;/b&gt;&lt;/span&gt;해야 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;ACNS는 네트워크 관측성과 보안 기능을 묶은 번들입니다.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfMlFG/dJMcaiQrdu6/POmFkAZQjkz4nxNTBhyJMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfMlFG/dJMcaiQrdu6/POmFkAZQjkz4nxNTBhyJMk/img.png&quot; data-alt=&quot;ACNS&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfMlFG/dJMcaiQrdu6/POmFkAZQjkz4nxNTBhyJMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfMlFG%2FdJMcaiQrdu6%2FPOmFkAZQjkz4nxNTBhyJMk%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;600&quot; height=&quot;374&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ACNS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ACNS를 활성화하면 AKS가 자동으로 Hubble Proxy Pod를 클러스터에 배포합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Hubble&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그럼 Hubble이 뭘까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Cilium 프로젝트에서 만든 오픈소스 네트워크 관측성 도구&lt;/b&gt;&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Hubble은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;eBPF를 통해서 네트워크 데이터를 수집&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;eBPF는 Linux 커널 안에서 코드를 실행하는 기술&lt;/b&gt;&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;덕분에 애플리케이션을 수정하지 않고도 커널에 지나가는 모든 패킷을 수집할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brA2YH/dJMcahjLGJa/M5KR21NYEsE002CpfnkcaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brA2YH/dJMcahjLGJa/M5KR21NYEsE002CpfnkcaK/img.png&quot; data-alt=&quot;eBPF&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brA2YH/dJMcahjLGJa/M5KR21NYEsE002CpfnkcaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrA2YH%2FdJMcahjLGJa%2FM5KR21NYEsE002CpfnkcaK%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;600&quot; height=&quot;309&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;eBPF&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;kube-proxy는 유저공간과 커널을 오가며 iptables를 거쳐야 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;eBPF는 커널 안에서 바로 처리하므로 오버헤드 없이 바로 트래픽을 관찰&lt;/b&gt;&lt;/span&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ACNS를 활성화하면 AKS 각 노드 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Cilium agent에서 Hubble이 동작&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Hubble Relay에서 모든 노드의 Hubble 인스턴스에서 데이터를 수집해 하나로 집계합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775986279195&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Node 1                Node 2                Node 3
┌─────────────┐      ┌─────────────┐      ┌─────────────┐
│ Cilium Agent│      │ Cilium Agent│      │ Cilium Agent│
│  + Hubble   │      │  + Hubble   │      │  + Hubble   │
└─────────────┘      └─────────────┘      └─────────────┘
  │                         │                     │
  └─────────────────────────┴─────────────────────┘
                            │
                            ▼
                     [Hubble Relay]
                    클러스터 전체 트래픽을
                      한 곳에서 집계&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terraform으로 AKS를 구성한다는 가정하에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;main.tf내 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;network_profile 블록에 advanced_networking을 추가&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775986566591&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;azurerm_kubernetes_cluster&quot; &quot;aks&quot; {
  # ... 기존 설정 ...

  network_profile {
    network_plugin      = &quot;azure&quot;
    network_plugin_mode = &quot;overlay&quot;
    network_data_plane  = &quot;cilium&quot;

    # ACNS 활성화 - Hubble 관측성 + 보안 기능
    advanced_networking {
      observability_enabled = true
      security_enabled      = true
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 55px;&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: 18px;&quot;&gt;
&lt;td style=&quot;width: 41.744186%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;옵션&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 58.255814%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 41.744186%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;observability_enabled&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 58.255814%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Hubble 기반 네트워크 흐름 관측성 활성화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 41.744186%; height: 19px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;security_enabled&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 58.255814%; height: 19px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;FQDN 필터링 등 L7 보안 정책 활성화&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Resource Provider 등록&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terraform에서 Azure Monitor와 Grafana를 생성하기 위해서 사전작업이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 서비스의 Provider가 등록되어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 Azure CLI 명령어로 등록할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775986826467&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;az provider register --namespace Microsoft.Monitor
az provider register --namespace Microsoft.Dashboard

# 등록 확인 (Registered 상태까지 1~2분 소요)
az provider show --namespace Microsoft.Monitor --query registrationState
az provider show --namespace Microsoft.Dashboard --query registrationState&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Azure Monitor, Grafana 생성&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Terraform으로 Azure Monitor와 Grafana를 생성&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;단, AKS와 Azure Monitor 연동은 따로 Azure CLI로 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;azurerm provider가 이 연동을 Terraform에서 직접 지원하지 않기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;main.tf&lt;/b&gt;에서 아래 리소스를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775987179735&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Azure Monitor Workspace (Prometheus 메트릭 저장소)
resource &quot;azurerm_monitor_workspace&quot; &quot;monitor&quot; {
  name                = var.monitor_name
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
}

# Azure Managed Grafana
resource &quot;azurerm_dashboard_grafana&quot; &quot;grafana&quot; {
  name                  = var.grafana_name
  resource_group_name   = azurerm_resource_group.rg.name
  location              = azurerm_resource_group.rg.location
  grafana_major_version = 11

  azure_monitor_workspace_integrations {
    resource_id = azurerm_monitor_workspace.monitor.id
  }
}&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;variables.tf에도 아래와 같이 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775987221554&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;variable &quot;monitor_name&quot; {
  default = &quot;myAKSMonitor&quot;
}

variable &quot;grafana_name&quot; {
  description = &quot;Grafana 인스턴스 이름 (전 세계 유니크)&quot;
  type        = string
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333; text-align: start;&quot;&gt;terraform.tfvars에도 아래와 같이 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775987251322&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;monitor_name = &quot;myAKSMonitor&quot;
grafana_name = &quot;myUniqueGrafanaName&quot;   # 전 세계 유니크한 이름으로 변경&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이후 terraform apply 명령어도 Azure Monitor와 Grafana를 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Azure Monitror Metrics Addon 활성화&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terraform으로 Azure Monitor와 AKS를 연동합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 단계에서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;ama-metrics Pod들이 클러스터에 배포&lt;/b&gt;&lt;/span&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;aks-preview가 설치되어 있다면 --enable-azure-monitor-metrics 옵션과 충돌해,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Unsupported or missing identit type 에러가 발생합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;명령어 실행 전에 aks-preview를 삭제해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775987668903&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# aks-preview 확장 제거
az extension remove --name aks-preview

# Monitor, Grafana 리소스 ID를 변수에 저장
MONITOR_ID=$(az resource show \
  --resource-group myRG \
  --name ${AKSMonitor이름} \
  --resource-type &quot;Microsoft.Monitor/accounts&quot; \
  --query id --output tsv)

GRAFANA_ID=$(az grafana show \
  --name ${Grafana이름} \
  --resource-group ${리소스그룹이름} \
  --query id --output tsv)

# AKS에 Azure Monitor Metrics Addon 활성화
az aks update \
  --name myAKS \
  --resource-group ${리소스그룹이름} \
  --enable-azure-monitor-metrics \
  --azure-monitor-workspace-resource-id $MONITOR_ID \
  --grafana-resource-id $GRAFANA_ID&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v1gv9/dJMcaiC0CUx/TdMLGcqhMQePNfmHAyMTwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v1gv9/dJMcaiC0CUx/TdMLGcqhMQePNfmHAyMTwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v1gv9/dJMcaiC0CUx/TdMLGcqhMQePNfmHAyMTwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv1gv9%2FdJMcaiC0CUx%2FTdMLGcqhMQePNfmHAyMTwk%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;880&quot; height=&quot;584&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;완료되면 아래 Pod들이 자동 배포됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 108px;&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: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.720931%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Pod&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.279069%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.720931%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ama-metrics&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.279069%; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 핵심 Metric 수집기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- Prometheus 형식으로 클러스터 Metric을 스크래핑해서 Azure Monitor로 전송&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.720931%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ama-metrics-ksm&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.279069%; height: 18px;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;- Kube state 수집기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;- &lt;span style=&quot;text-align: start;&quot;&gt;Deployment, Pod, Node 등 K8s 오브젝트 상태 메트릭 수집&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.720931%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ama-metrics-node&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.279069%; height: 18px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;- 각 노드에 DaemonSet으로 배포. &lt;br /&gt;- 노드별 CPU, 메모리, 디스크, 네트워크 메트릭 수집&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.720931%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ama-metrics-operator-targets&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.279069%; height: 18px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;- 수집 대상(scrape target)을 관리. &lt;br /&gt;- PodMonitor, ServiceMonitor CRD를 감시해서 수집 대상 목록 업데이트&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.720931%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ama-logs&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 66.279069%; height: 18px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;- 메트릭이 아닌 로그 수집 담당. &lt;br /&gt;- Pod 로그, K8s 이벤트를 Log Analytics Workspace로 전송&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;
&lt;pre id=&quot;code_1776564594839&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ kubectl get pods -n kube-system | grep ama-
ama-logs-748pz                                   3/3     Running     0               7m56s
ama-logs-8jf5z                                   3/3     Running     0               7m56s
ama-logs-gr5wf                                   3/3     Running     0               7m56s
ama-logs-rs-5798c7dbd9-qjrz5                     2/2     Running     0               7m56s
ama-metrics-b7bff497d-dx5z5                      2/2     Running     0               5m32s
ama-metrics-b7bff497d-z8bd5                      2/2     Running     0               5m32s
ama-metrics-ksm-5d4998cdcd-n4rsn                 1/1     Running     0               5m32s
ama-metrics-node-8tfvw                           2/2     Running     0               5m32s
ama-metrics-node-h6lqh                           2/2     Running     0               5m32s
ama-metrics-node-snkpt                           2/2     Running     0               5m32s
ama-metrics-operator-targets-55cb47c96c-4rd5q    2/2     Running     3 (3m47s ago)   5m32s&lt;/code&gt;&lt;/pre&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Hubble 메트릭 활성화&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;ama-metrics Pod가 떴다고 해서 Hubble 네트워크 메트릭이 바로 수집되진 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Hubble 메트릭은 기본적으로&amp;nbsp;비활성화&amp;nbsp;상태&lt;/b&gt;&lt;/span&gt;거든요.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;Hubble은 클러스터의 모든 네트워크 흐름을 추적하기 때문에 메트릭 양이 매우 많습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;대규모 클러스터에서는 Azure Monitor &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;비용이 커져서 필요한 경우에만 켜도록 설계&lt;/b&gt;&lt;/span&gt;되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;Azure에서 공식으로 제공하는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;ama-metrics-settings-configmap.yaml &amp;nbsp;&lt;/b&gt;&lt;b&gt;템플릿을 적용하면 활성화&lt;/b&gt;&lt;/span&gt; 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776564915539&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -o ama-metrics-settings.yaml https://raw.githubusercontent.com/Azure/prometheus-collector/main/otelcollector/configmaps/ama-metrics-settings-configmap.yaml

$ sed -i 's/networkobservabilityHubble = &quot;&quot;/networkobservabilityHubble = &quot;hubble.*&quot;/' ama-metrics-settings.yaml


$ grep networkobservabilityHubble ama-metrics-settings.yaml
    networkobservabilityHubble = true
    networkobservabilityHubble = &quot;hubble.*&quot;
    networkobservabilityHubble = &quot;30s&quot;

$ kubectl apply -f ama-metrics-settings.yaml -n kube-system
configmap/ama-metrics-settings-configmap created

$ kubectl rollout restart deployment ama-metrics -n kube-system
deployment.apps/ama-metrics restarted

$ kubectl rollout restart deployment ama-metrics-ksm -n kube-system
deployment.apps/ama-metrics-ksm restarted&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;networkobservabilityHubble = &quot;&quot;을 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;networkobservabilityHubble = &quot;hubble.*&quot;로 변경&lt;/b&gt;&lt;/span&gt;하면 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;hubble_로 시작하는 모든 메트릭이 수집됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Grafana 접근 권한 설정&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Grafana 웹 화면에 접속하려면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;두 가지 권한을 별도로 설정&lt;/b&gt;&lt;/span&gt;해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&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: 18px;&quot;&gt;
&lt;td style=&quot;width: 43.837209%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;대상&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 56.162791%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 43.837209%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;본인 Azure 계정&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 56.162791%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Grafana 웹 화면에 접속하기 위한 권한&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 43.837209%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Grafana 자체&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 56.162791%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Grafana가 Azure Monitor 데이터를 읽기 위한 권한&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/40oFs/dJMcahD5QeC/1sVquai9GC2YIL4c8GcUj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/40oFs/dJMcahD5QeC/1sVquai9GC2YIL4c8GcUj0/img.png&quot; data-alt=&quot;Grafana 웹 화면에 접속에 권한이 필요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/40oFs/dJMcahD5QeC/1sVquai9GC2YIL4c8GcUj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F40oFs%2FdJMcahD5QeC%2F1sVquai9GC2YIL4c8GcUj0%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;1024&quot; height=&quot;215&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Grafana 웹 화면에 접속에 권한이 필요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;첫 번째는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Azure 본인 계정에 Grafana Admin 권한을 부여&lt;/b&gt;&lt;/span&gt;해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 Azure CLI로 쉽게 권한을 부여할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776565462523&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ az role assignment create \
  --assignee $(az ad signed-in-user show --query id --output tsv) \
  --role &quot;Grafana Admin&quot; \
  --scope $(az grafana show \
    --name myUniqueGrafanaName \
    --resource-group myRG \
    --query id --output tsv)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;두 번째는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Grafana Managed Identity에 Monitor 권한을 부여&lt;/b&gt;&lt;/span&gt;해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Grafana에서 Azure Monitor 데이터를 읽으려면 Grafana 자체에 Managed Identity가 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS1kUa/dJMcacivUsM/JhkO22dHJdlC4QmA0JHWK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS1kUa/dJMcacivUsM/JhkO22dHJdlC4QmA0JHWK1/img.png&quot; data-alt=&quot;Grafana가 Azure Monitor 데이터를 읽기 위한 권한이 필요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS1kUa/dJMcacivUsM/JhkO22dHJdlC4QmA0JHWK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS1kUa%2FdJMcacivUsM%2FJhkO22dHJdlC4QmA0JHWK1%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;1024&quot; height=&quot;707&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Grafana가 Azure Monitor 데이터를 읽기 위한 권한이 필요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chxvvL/dJMcad2Jypg/qJw7m8gsfCzuNElwDLAyh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chxvvL/dJMcad2Jypg/qJw7m8gsfCzuNElwDLAyh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chxvvL/dJMcad2Jypg/qJw7m8gsfCzuNElwDLAyh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchxvvL%2FdJMcad2Jypg%2FqJw7m8gsfCzuNElwDLAyh0%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;1024&quot; height=&quot;238&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;Azure Portal에서 Managed Identity 활성화해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;아래 참고 사진처럼 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Azure Portal에서 [Grafana 인스턴스] &lt;b&gt;&amp;rarr;&lt;/b&gt; [설정] &lt;b&gt;&amp;rarr;&lt;/b&gt;&amp;nbsp;[ID]&lt;/b&gt;&lt;/span&gt; 페이지에 들어갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;&lt;b&gt;시스템 할당됨 탭에서 상태를 켬&lt;/b&gt;으로 저장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;그리고 &lt;b&gt;개체(주체) ID를 확인&lt;/b&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJNYPi/dJMcahRDvnE/GrO5z7NP37k1O0zQ4aL0nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJNYPi/dJMcahRDvnE/GrO5z7NP37k1O0zQ4aL0nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJNYPi/dJMcahRDvnE/GrO5z7NP37k1O0zQ4aL0nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJNYPi%2FdJMcahRDvnE%2FGrO5z7NP37k1O0zQ4aL0nk%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;362&quot; height=&quot;513&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;위에서 확인한 개체(주체) ID를 가지고 아래 Azure CLI를 통해서 Azure Monitor 권한을 부여합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776566244061&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GRAFANA_IDENTITY=&quot;&amp;lt;화면에서 확인한 Object ID&amp;gt;&quot;

MONITOR_ID=$(az resource show \
  --resource-group myRG \
  --name myAKSMonitor \
  --resource-type &quot;Microsoft.Monitor/accounts&quot; \
  --query id --output tsv)

az role assignment create \
  --assignee $GRAFANA_IDENTITY \
  --role &quot;Monitoring Data Reader&quot; \
  --scope $MONITOR_ID&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고 아래 명령어로 대시보드 엔드포인트를 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776566439439&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Grafana 엔드포인트 확인
az grafana show \
  --name myUniqueGrafanaName \
  --resource-group myRG \
  --query &quot;properties.endpoint&quot; \
  --output tsv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Grafana 접속 후 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;[&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Dashboards] &amp;rarr; [Azure Managed Prometheus]&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;폴더에 관련 대시보드들이 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아래와 같은 대시보드를 확인할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 198px;&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: 18px;&quot;&gt;
&lt;td style=&quot;width: 27.441861%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대시보드&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.139535%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;역할&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.418604%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;필요 상황&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 27.441861%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Networking/Clusters&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.139535%; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;노드 레벨 네트워크 메트릭을 클러스터 전체 관점에서 보여줌&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.418604%; height: 18px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;갑자기 클러스터 전체 응답이 느려졌는데 어느 노드가 문제인지 모를 때, 또는 특정 노드에 트래픽이 집중되는 것 같을 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 27.441861%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #efefef; color: #333333; text-align: center;&quot;&gt;Networking/DNS(Cluster)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.139535%; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;클러스터 전체 DNS 쿼리 수, 실패율, 응답 시간&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.418604%; height: 18px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;서비스 간 연결이 간헐적으로 실패하거나 응답이 느릴 때. 애플리케이션 레벨 문제인지 DNS 레벨 문제인지 먼저 구분하고 싶을 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 27.441861%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #efefef; color: #333333; text-align: center;&quot;&gt;Networking/DNS(Workload)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.139535%; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;워크로드(Deployments, Daemonsets)별 DNS 메트릭&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.418604%; height: 18px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;DNS 문제가 특정 서비스에서만 발생하는 것 같을 때. 어떤 워크로드가 DNS 쿼리를 과도하게 발생시키는지, 또는 특정 서비스가 DNS 응답을 못 받고 있는지 파악하고 싶을 때&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 27.441861%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #efefef; color: #333333; text-align: center;&quot;&gt;Networking/Drops(Workload)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.139535%; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;워크로드별 패킷 드롭, 인바운드/아웃바운드 드롭&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.418604%; height: 18px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;서비스 간 통신이 불안정하거나 타임아웃이 자주 발생할 때. NetworkPolicy를 새로 적용했는데 의도치 않게 트래픽을 차단하고 있는 건 아닌지 확인하고 싶을 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 72px;&quot;&gt;
&lt;td style=&quot;width: 27.441861%; text-align: center; height: 72px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #efefef; color: #333333; text-align: center;&quot;&gt;Networking/Pod Flows(Namespace)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.139535%; height: 72px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Namespace별 L4, L7 트래픽 흐름&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.418604%; height: 72px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;네임스페이스 간 트래픽 격리가 제대로 되고 있는지 확인하고 싶을 때. 특정 네임스페이스에서 예상치 못한 외부 통신이 발생하는지 파악하고 싶을 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;width: 27.441861%; text-align: center; height: 36px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #efefef; color: #333333; text-align: center;&quot;&gt;Networking/Pod Flows(Workload)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.139535%; height: 36px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;특정 Pod/Deployments 인바운드/아웃바운드 트래픽 흐름&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.418604%; height: 36px;&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;신규 서비스를 배포한 후 트래픽이 예상대로 흐르는지 검증하고 싶을 때. 특정 Pod가 어디와 통신하고 있는지 추적하고 싶을 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;정리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;AKS 클러스터의 네트워크 트래픽을 Grafana 대시보드에서 모니터링할 수 있도록 세팅하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt; Hubble이 eBPF로 수집한 데이터가 Azure Monitor를 거쳐 Grafana까지의 파이프라인&lt;/b&gt;&lt;/span&gt;을 구성해 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;특히, 패킷 드롭 대시보드는 NetworkPolicy 이슈를 디버깅할 때, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;Pod Flows 대시보드는 신규 서비스 배포 후 트래픽 흐름을 검증할 때 실무에서 바로 유용하게 쓸 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333;&quot;&gt;다음에는 AKS가 아닌 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;직접 구축한 k8s 클러스터에 Hubble 모니터링 체계를 구축해 보겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[참고자료]&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;figure id=&quot;og_1775985359860&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Advanced Container Networking Services for Azure Kubernetes Service (AKS) Overview - Azure Kubernetes Service&quot; data-og-description=&quot;Learn about Advanced Container Networking Services for Azure Kubernetes Service (AKS), including features like Container Network Observability and Container Network Security.&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/en-us/azure/aks/advanced-container-networking-services-overview&quot; data-og-url=&quot;https://learn.microsoft.com/en-us/azure/aks/advanced-container-networking-services-overview&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iuPqx/dJMb8XkgyHU/ynvKkyYqnmW81KdMQSD6V1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bvbI4G/dJMb84p9RmY/T6ybWHxQFn5Mlc4Is5sI51/img.png?width=1171&amp;amp;height=730&amp;amp;face=0_0_1171_730&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/azure/aks/advanced-container-networking-services-overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/en-us/azure/aks/advanced-container-networking-services-overview&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iuPqx/dJMb8XkgyHU/ynvKkyYqnmW81KdMQSD6V1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bvbI4G/dJMb84p9RmY/T6ybWHxQFn5Mlc4Is5sI51/img.png?width=1171&amp;amp;height=730&amp;amp;face=0_0_1171_730');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Advanced Container Networking Services for Azure Kubernetes Service (AKS) Overview - Azure Kubernetes Service&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn about Advanced Container Networking Services for Azure Kubernetes Service (AKS), including features like Container Network Observability and Container Network Security.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1775985375733&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - cilium/hubble: Hubble - Network, Service &amp;amp; Security Observability for Kubernetes using eBPF&quot; data-og-description=&quot;Hubble - Network, Service &amp;amp; Security Observability for Kubernetes using eBPF - cilium/hubble&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/cilium/hubble&quot; data-og-url=&quot;https://github.com/cilium/hubble&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kocnU/dJMb8XR6Sig/lvqkVDsfw5ZRa3IccSBJU1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cy4fs8/dJMb8VNwBmM/5ewUoGf2xfyb6cbJbagl0K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cHNTYs/dJMb8WMqMTv/kya8fXCUTNGJpgr1Ht0Xnk/img.png?width=1944&amp;amp;height=1500&amp;amp;face=0_0_1944_1500&quot;&gt;&lt;a href=&quot;https://github.com/cilium/hubble&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/cilium/hubble&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kocnU/dJMb8XR6Sig/lvqkVDsfw5ZRa3IccSBJU1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cy4fs8/dJMb8VNwBmM/5ewUoGf2xfyb6cbJbagl0K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cHNTYs/dJMb8WMqMTv/kya8fXCUTNGJpgr1Ht0Xnk/img.png?width=1944&amp;amp;height=1500&amp;amp;face=0_0_1944_1500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - cilium/hubble: Hubble - Network, Service &amp;amp; Security Observability for Kubernetes using eBPF&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Hubble - Network, Service &amp;amp; Security Observability for Kubernetes using eBPF - cilium/hubble&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1775987824100&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Customize scraping of Prometheus metrics in Azure Monitor using ConfigMap - Azure Monitor&quot; data-og-description=&quot;Customize metrics scraping for a Kubernetes cluster with the metrics add-on in Azure Monitor.&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/en-us/azure/azure-monitor/containers/prometheus-metrics-scrape-configuration&quot; data-og-url=&quot;https://learn.microsoft.com/en-us/azure/azure-monitor/containers/prometheus-metrics-scrape-configuration&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bXMYaF/dJMb8RRS4UW/OsrMLtpNf9jP7brPVJoh90/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/azure/azure-monitor/containers/prometheus-metrics-scrape-configuration&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/en-us/azure/azure-monitor/containers/prometheus-metrics-scrape-configuration&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bXMYaF/dJMb8RRS4UW/OsrMLtpNf9jP7brPVJoh90/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Customize scraping of Prometheus metrics in Azure Monitor using ConfigMap - Azure Monitor&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Customize metrics scraping for a Kubernetes cluster with the metrics add-on in Azure Monitor.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1776564841199&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - Azure/prometheus-collector&quot; data-og-description=&quot;Contribute to Azure/prometheus-collector development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Azure/prometheus-collector&quot; data-og-url=&quot;https://github.com/Azure/prometheus-collector&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bn85D8/dJMb83SkKof/4jfVGtn2AiksVMe1iAsekk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/OjRqR/dJMb887aHNk/8tlFeZFDkPOhwLprmJG9Ik/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/Azure/prometheus-collector&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Azure/prometheus-collector&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bn85D8/dJMb83SkKof/4jfVGtn2AiksVMe1iAsekk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/OjRqR/dJMb887aHNk/8tlFeZFDkPOhwLprmJG9Ik/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - Azure/prometheus-collector&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to Azure/prometheus-collector development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Cloud</category>
      <category>AKS</category>
      <category>AZURE</category>
      <category>cilium</category>
      <category>dns</category>
      <category>eBPF</category>
      <category>grafana</category>
      <category>hubble</category>
      <category>prometheus</category>
      <author>천재보단범재</author>
      <guid isPermaLink="true">https://developnote-blog.tistory.com/222</guid>
      <comments>https://developnote-blog.tistory.com/222#entry222comment</comments>
      <pubDate>Sun, 12 Apr 2026 18:00:42 +0900</pubDate>
    </item>
    <item>
      <title>[Terraform] Azure AKS 클러스터 한번에 구축하기</title>
      <link>https://developnote-blog.tistory.com/221</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k1gQh/dJMcabcsjiV/ydXmvtBmHKvvQ3WZEcxVxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k1gQh/dJMcabcsjiV/ydXmvtBmHKvvQ3WZEcxVxk/img.png&quot; data-alt=&quot;Terraform을 통한 IaC 구성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k1gQh/dJMcabcsjiV/ydXmvtBmHKvvQ3WZEcxVxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk1gQh%2FdJMcabcsjiV%2FydXmvtBmHKvvQ3WZEcxVxk%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;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Terraform을 통한 IaC 구성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terrafrom으로 AKS 클러스터 구축&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;TL;DR&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Azure VM에서 &lt;b&gt;Terraform을 사용&lt;/b&gt;해 &lt;b&gt;AKS 클러스터 + ACR을 한 번에 프로비저닝 하는&lt;/b&gt; 방법을 정리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;CNI는 eBPF 기반 &lt;b&gt;Cilium&lt;/b&gt;, 디스크는 비용/성능 모두 유리한 &lt;b&gt;Ephemeral&lt;/b&gt; 선택&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Terraform init -&amp;gt; plan -&amp;gt; apply 세 단계로 한 번에 AKS 클러스터 구축&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;회사에서 Azure를 경험할 수 있는 업무가 생겨서 AKS를 구축하기로 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이전에 Terraform으로 EKS도 쉽게 구축한 경험이 있어서,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번에도 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Terraform을 이용해 AKS를 한 번에 구축&lt;/b&gt;&lt;/span&gt;하기로 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1774167555474&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Terraform] AWS EKS 한 번에 올리기(1) - VPC 구성&quot; data-og-description=&quot;AWS EKS 한 번에 올리기(1)이전에 Terraform을 통해서 Kubernetes 클러스터를 한 번에 구성한 적이 있습니다.AWS EC2 인스턴스를 여러 개 생성해서 클러스터를 구성하였습니다.&amp;nbsp;명령어 한 번에 Kubernetes 설&quot; data-og-host=&quot;developnote-blog.tistory.com&quot; data-og-source-url=&quot;https://developnote-blog.tistory.com/213&quot; data-og-url=&quot;https://developnote-blog.tistory.com/213&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IqQDV/dJMb86O069R/JdmN7YblBUbKh0h9KS6C4k/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/sCWuv/dJMb82MCpAn/d4T2MkJ9ekljR1P8Pw7Yek/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/6JD1a/dJMb83kseEG/QjLkbKloK8wHurrBRxaki0/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450&quot;&gt;&lt;a href=&quot;https://developnote-blog.tistory.com/213&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developnote-blog.tistory.com/213&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IqQDV/dJMb86O069R/JdmN7YblBUbKh0h9KS6C4k/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/sCWuv/dJMb82MCpAn/d4T2MkJ9ekljR1P8Pw7Yek/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/6JD1a/dJMb83kseEG/QjLkbKloK8wHurrBRxaki0/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Terraform] AWS EKS 한 번에 올리기(1) - VPC 구성&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AWS EKS 한 번에 올리기(1)이전에 Terraform을 통해서 Kubernetes 클러스터를 한 번에 구성한 적이 있습니다.AWS EC2 인스턴스를 여러 개 생성해서 클러스터를 구성하였습니다.&amp;nbsp;명령어 한 번에 Kubernetes 설&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developnote-blog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AKS를 Terraform으로 구축하는 이유는 크게 세 가지입니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;재현 가능성&lt;/b&gt; -&amp;gt; 코드로 작성하면 동일한 환경을 언제든지 만들 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;변경 이력 관리&lt;/b&gt; -&amp;gt; 인프라 변경사항을 Git으로 관리할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;멀티 클라우드 지원&lt;/b&gt; -&amp;gt; Azure뿐만 아니라 AWS, GCP 등 대부분의 클라우드를 동일한 문법으로 지원합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;전체 아키텍처&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래와 같이 Terraform으로 Azure내 AKS와 ACR를 구축하기로 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774167919072&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;├── Resource Group (myRG)
│     ├── ACR ──────────────────────────┐
│     │   (프라이빗 컨테이너 레지스트리)    │
│     │                                  │ AcrPull 권한
│     └── AKS Cluster                   │
│           ├── Control Plane ◀── Azure 관리
│           └── Worker Node &amp;times; 3 ────────┘
│                 ├── Node 1 (Standard_D8s_v3)
│                 ├── Node 2 (Standard_D8s_v3)
│                 └── Node 3 (Standard_D8s_v3)
│                       └── Cilium CNI (eBPF)
│
└── Terraform State (.tfstate, 로컬 저장)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ACR(Azure Container Registry)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;ACR은 Azure에서 제공하는 Private 컨테이너 이미지 레지스트리&lt;/b&gt;&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Docker Hub와 동일한 역할을 하지만 외부에 공개되지 않는 Private 저장소입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AKS Pod 생성 시 ACR에서 이미지를 pull 해서 컨테이너를 생성하려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;사내 서비스 이미지를 외부에 공개하지 않고&lt;/b&gt;&lt;/span&gt; Azure 내부 네트워크에서만 접근할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ACR과 AKS와 같은 리전에 있으면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Azure 내부 네트워크를 통해 이루어져 훨씬 빠릅니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;AKS(Azure Kubernetes Service)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;AKS는 Azure에서 제공하는 관리형 Kubernetes 서비스&lt;/b&gt;&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Kubernetes의 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Control Plane을 Azure가 직접 관리해 줍니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AKS의 구조는 크게 두 계층으로 나눠집니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Control Plane&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;API 서버, 스케줄러, etcd(상태 저장소), Controller Manager로 구성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Azure가 전담 관리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Worker Node&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;실제 Pod이 생성되는 VM&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 구성에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Standard_D8s_v3 VM 3대&lt;/b&gt;&lt;/span&gt;로 구성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기본 세팅&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Azure에서 Koreacentral 리전에 Terraform을 실행할 VM을 생성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;가장 기본적인 스펙으로 Ubuntu 기반 VM을 생성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efCJFp/dJMcab4BSVL/1F43mgSKmIE7bNHcuVI2r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efCJFp/dJMcab4BSVL/1F43mgSKmIE7bNHcuVI2r1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efCJFp/dJMcab4BSVL/1F43mgSKmIE7bNHcuVI2r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefCJFp%2FdJMcab4BSVL%2F1F43mgSKmIE7bNHcuVI2r1%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;800&quot; height=&quot;212&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terraform으로 AKS 구축하기에 앞서 필요한 도구들을 VM에 설치합니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Azure CLI&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terraform&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;kubectl&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1774169504600&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. 패키지 업데이트
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y

# 2. Azure CLI 설치
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

# 3. Terraform 설치
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo &quot;deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main&quot; | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update &amp;amp;&amp;amp; sudo apt install terraform -y

# 4. kubectl 설치
curl -LO &quot;https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl&quot;
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

$ az version
{
  &quot;azure-cli&quot;: &quot;2.84.0&quot;,
  &quot;azure-cli-core&quot;: &quot;2.84.0&quot;,
  &quot;azure-cli-telemetry&quot;: &quot;1.1.0&quot;,
  &quot;extensions&quot;: {}
}

$ terraform version
Terraform v1.14.7
on linux_amd64

$ kubectl version --client
Client Version: v1.35.3
Kustomize Version: v5.7.1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위의 명령어들을 통해 필요한 도구 설치가 끝났습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Azure 로그인&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 Terraform을 통해 AKS 설치할 Azure 계정에 로그인합니다. Azure CLI를 통해 로그인합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;--user-device-code 옵션을 주면 URL과 인증코드를 알려줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://login.microsoft.com/device&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;https://login.microsoft.com/device로&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt; 들어가서 인증 코드 입력 후 Azure 로그인&lt;/b&gt;&lt;/span&gt;을 하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그럼 아래와 같이 로그인되고 계정 정보를 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774169782177&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ az login --use-device-code
To sign in, use a web browser to open the page https://login.microsoft.com/device and enter the code ****** to authenticate.

# 웹브라우저에서 코드 입력 후 로그인 확인
Retrieving tenants and subscriptions for the selection...

[Tenant and subscription selection]

No     Subscription name    Subscription ID                       Tenant
-----  -------------------  ------------------------------------  ------------
[1] *  ******               ********-****-****-****-************  ******

The default is marked with an *; the default tenant is '******' and subscription is '******' (********-****-****-****-************).

Select a subscription and tenant (Type a number or Enter for no changes):

Tenant: ******
Subscription: ****** (********-****-****-****-************)

[Announcements]
With the new Azure CLI login experience, you can select the subscription you want to use more easily. Learn more about it and its configuration at https://go.microsoft.com/fwlink/?linkid=2271236

If you encounter any problem, please open an issue at https://aka.ms/azclibug

[Warning] The login output has been updated. Please be aware that it no longer displays the full list of available subscriptions by default.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고 Resource Provider을 등록합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Azure에서 제공하는 서비스는 Resource Provider라는 단위로 관리&lt;/b&gt;&lt;/span&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Azure 구독에서 특정 서비스를 처음 사용하려면 해당 Resource Provider가 구독에 등록돼야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774169983860&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 필요한 Provider만 직접 등록
az provider register --namespace Microsoft.ContainerService
az provider register --namespace Microsoft.ContainerRegistry
az provider register --namespace Microsoft.Compute
az provider register --namespace Microsoft.Network

# 등록 확인 (Registered 상태인지 확인)
az provider show --namespace Microsoft.ContainerService --query registrationState
az provider show --namespace Microsoft.ContainerRegistry --query registrationState&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terraform은 기본적으로 terraform apply 실행 시 필요한 Resource Provider를 자동으로 등록합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그러나 자동 등록 과정이 완료될 때까지 대기하면서 지연되는 현상이 발견되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;필요한 Provider를 직접 수동으로 등록하고 main.tf에 Provider 자동 등록을 비활성&lt;/b&gt;&lt;/span&gt;하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774170243650&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource_provider_registration = &quot;none&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terraform 파일 작성&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;총 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;4가지를 파일을 작성&lt;/b&gt;&lt;/span&gt;하며, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;같은 path에 위치&lt;/b&gt;&lt;/span&gt;시킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 162px;&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: 18px;&quot;&gt;
&lt;td style=&quot;width: 40.232558%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;파일&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.767442%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;역할&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;width: 40.232558%; text-align: center; height: 36px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;main.tf&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.767442%; text-align: left; height: 36px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 실제 Azure 리소스를 정의하는 핵심 파일&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 어떤 리소스를 만들지 선언&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;width: 40.232558%; text-align: center; height: 36px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;variables.tf&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.767442%; text-align: left; height: 36px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- main.tf에서 사용할 변수를 선언하는 파일&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 파일, 변수명, 타입, 기본값, 설명을 정의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;width: 40.232558%; text-align: center; height: 36px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;terraform.tfvars&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.767442%; text-align: left; height: 36px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- variables.tf에서 선언한 변수의 실제 값을 지정하는 파일&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 환경마다 다르게 관리할때 유용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;width: 40.232558%; text-align: center; height: 36px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ouputs.tf&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.767442%; text-align: left; height: 36px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- terraform apply 완료 후 터미널에 출력할 값 정의&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- ACR 주소 등&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;main.tf&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;main.tf는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;실제로 생성할 Azure 리소스를 선언하는 핵심 파일&lt;/b&gt;&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;주요 항목은 아래와 같습니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;terraform 블록&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terraform 자체 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;사용할 Terraform 최소 버전과 Azure Provider 버전 고정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;provider &quot;azurerm&quot; 블록&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Azure 인증하고 연결하는 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;resource_provider-registration = &quot;non&quot;으로 Resource Provider 자동 등록 비활성화&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;azurerm_resource_group&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Azure 모든 리소스는 Resource Group에 속해야 하는데 AKS, ACR이 해당 Resource Group에 속함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;azurerm_container_registry&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Private 이미지 저장소인 ACR 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;sku = &quot;Standard&quot;는 운영 환경에 적합한 100GB 스토리지 제공&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;azurerm_kubernetes_cluster&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;주요 항목인 AKS 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;default_node_pool&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- Worker 노드 구성&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- vm_size -&amp;gt; 노드 스펙&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- node_count -&amp;gt; 노드 수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;os_disk_type = &quot;Ephemeral&quot;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- VM 로컬 SSD를 디스크로 사용&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- Managed 디스크보다 빠름&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;network_plugin = &quot;azure&quot;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- Cilium 사용을 위한 CNI 기반 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;network_plugin_mode = &quot;overlay&quot;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- Pod IP를 VNetIP와 분리&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- IP 고갈 문제를 방지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;network_data_plane = &quot;cilium&quot;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- eBPF 기반 고성능 네트워킹&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- kube-proxy 없이 동작해 Latency 감소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;identity = &quot;SystemAssigned&quot;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- Managed Identity tkdyd&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- Azure 리소스 접근 시 별도 Secret 없이 인증 가능&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;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;azurerm_role_assignment&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AKS가 ACR에서 이미지 pull할 수 있도록 권한 부여&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1774172223376&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform {
  required_version = &quot;&amp;gt;= 1.5.0&quot;
  required_providers {
    azurerm = {
      source  = &quot;hashicorp/azurerm&quot;
      version = &quot;~&amp;gt; 4.0&quot;
    }
  }
}

provider &quot;azurerm&quot; {
  features {}
  resource_provider_registrations = &quot;none&quot;
}

resource &quot;azurerm_resource_group&quot; &quot;rg&quot; {
  name     = var.resource_group_name
  location = var.location
}

resource &quot;azurerm_container_registry&quot; &quot;acr&quot; {
  name                = var.acr_name
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  sku                 = &quot;Standard&quot;
}

resource &quot;azurerm_kubernetes_cluster&quot; &quot;aks&quot; {
  name                = var.aks_name
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  dns_prefix          = var.aks_name

  default_node_pool {
    name            = &quot;default&quot;
    node_count      = var.aks_node_count
    vm_size         = var.aks_node_vm_size
    os_disk_size_gb = 128
    os_disk_type    = &quot;Ephemeral&quot;
  }

  network_profile {
    network_plugin      = &quot;azure&quot;
    network_plugin_mode = &quot;overlay&quot;
    network_data_plane  = &quot;cilium&quot;
  }

  identity {
    type = &quot;SystemAssigned&quot;
  }

  automatic_upgrade_channel = &quot;patch&quot;
  node_os_upgrade_channel   = &quot;NodeImage&quot;
  sku_tier                  = &quot;Standard&quot;
}

resource &quot;azurerm_role_assignment&quot; &quot;aks_acr_pull&quot; {
  principal_id                     = azurerm_kubernetes_cluster.aks.kubelet_identity[0].object_id
  role_definition_name             = &quot;AcrPull&quot;
  scope                            = azurerm_container_registry.acr.id
  skip_service_principal_aad_check = true
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AKS에서 사용할 수 있는 CNI는 kubenet, Azure CNI, Cillium 등 여러 가지가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번에 Cilium을 선택한 이유는 아래와 같습니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;eBPF(extended Berkeley Packet Filter) 기반 고성능 네트워킹&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;보통 kube-proxy를 통해 iptables 규칙을 거치지만 Cilium은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;eBPF를 사용해 커널 레벨에서 직접 패킷을 처리&lt;/b&gt;&lt;/span&gt;해 Latency가 감소합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;강력한 Network Policy&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기본은 L3/L4 레벨만 제어하지만 Cilium은 HTTP, gRPC 같은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;L7 레벨까지 트래픽 제어가 가능&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Hubble을 통한 관측성&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Cilium에 내장된 Hubble을 활성화하면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;서비스 간 트래픽 흐름 실시간 시각화가 가능&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AKS 노드의 디스크는 &lt;b&gt;Managed와 Ephemeral&lt;/b&gt; 두 가지 방식이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번에는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;속도가 빠른 Ephemeral 디스크를 사용&lt;/b&gt;&lt;/span&gt;하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;두 디스크의 차이점은 아래와 같습니다.&lt;/span&gt;&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;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;항목&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Managed&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Ephemeral&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;저장 위치&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Azure Storage&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;VM 로컬 SSD&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;I/O 속도&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;보통&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;빠름&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;추가 비용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;있음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;없음(VM 비용에 포함0&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;노드 삭제 시&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;디스크 유지&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;디스크 함께 삭제&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;variables.tf&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1774172993587&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;variable &quot;resource_group_name&quot; {
  default = &quot;****&quot;
}

variable &quot;location&quot; {
  default = &quot;koreacentral&quot;
}

variable &quot;acr_name&quot; {
  description = &quot;ACR 이름 (전 세계 유니크)&quot;
  type        = string
}

variable &quot;aks_name&quot; {
  default = &quot;****&quot;
}

variable &quot;aks_node_count&quot; {
  default = 3
}

variable &quot;aks_node_vm_size&quot; {
  default = &quot;Standard_D8s_v3&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;outputs.tf&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1774173029739&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output &quot;acr_login_server&quot; {
  value = azurerm_container_registry.acr.login_server
}

output &quot;kube_config_command&quot; {
  value = &quot;az aks get-credentials --resource-group ${var.resource_group_name} --name ${var.aks_name}&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;terraform.tfvars&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1774173083937&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource_group_name = &quot;****&quot;
location            = &quot;koreacentral&quot;
acr_name            = &quot;*****&quot;
aks_name            = &quot;*****&quot;
aks_node_count      = 3
aks_node_vm_size    = &quot;Standard_D8s_v3&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terraform 실행&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 준비가 완료되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terraform은 인프라를 적용하기까지 아래 3단계 명령어를 순서대로 실행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 72px;&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: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.147286%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;명령어&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.51938%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;역할&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.147286%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;terraform init&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.51938%; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Provider 플로그인 다운로드 및 초기화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.147286%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;terraform plan&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.51938%; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 상태와 코드를 비교해 변경사항 미리보기, 실제 인프라 영향 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.147286%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;terraform apply&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.51938%; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;plan 결과를 실제 Azure에 적용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;terraform init&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1774173266087&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/azurerm versions matching &quot;~&amp;gt; ****&quot;...
- Installing hashicorp/azurerm v****...
- Installed hashicorp/azurerm v**** (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run &quot;terraform init&quot; in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running &quot;terraform plan&quot; to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;terraform plan&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1774173315401&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following
symbols:
  + create

Terraform will perform the following actions:

  # azurerm_container_registry.acr will be created
  + resource &quot;azurerm_container_registry&quot; &quot;acr&quot; {
      + admin_enabled                 = false
      + admin_password                = (sensitive value)
      + admin_username                = (known after apply)
      + data_endpoint_host_names      = (known after apply)
      + encryption                    = (known after apply)
...
...
...
Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run &quot;terraform
apply&quot; now.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;terraform apply&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Do you want to perform these actions? 메시지가 나오면 yes를 입력하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774173377003&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ terraform apply

Do you want to perform these actions?


Outputs:
acr_login_server    = &quot;xxxxxx.azurecr.io&quot;
kube_config_command = &quot;az aks get-credentials --resource-group myRG --name *****&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx2CfP/dJMcabcslyr/TW2Jn3v4hbBUv5CbaxEk91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx2CfP/dJMcabcslyr/TW2Jn3v4hbBUv5CbaxEk91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx2CfP/dJMcabcslyr/TW2Jn3v4hbBUv5CbaxEk91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx2CfP%2FdJMcabcslyr%2FTW2Jn3v4hbBUv5CbaxEk91%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;700&quot; height=&quot;445&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;kubectl 설정 및 자동 완성&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 AKS에 kubectl로 접근할 수 있도록 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774173542638&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# kubeconfig 설정
az aks get-credentials --resource-group myRG --name myAKS

# kubectl 자동완성 설정
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl &amp;gt; /dev/null
sudo apt install bash-completion -y

# alias 설정
echo 'alias k=kubectl' &amp;gt;&amp;gt; ~/.bashrc
echo 'complete -o default -F __start_kubectl k' &amp;gt;&amp;gt; ~/.bashrc

# 적용
exec bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;설정 후 kubectl 명령어로 AKS 클러스터를 확인합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774173577995&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ k get no
NAME                              STATUS   ROLES    AGE     VERSION
aks-default-41983717-vmss000000   Ready    &amp;lt;none&amp;gt;   8m1s    v1.33.7
aks-default-41983717-vmss000001   Ready    &amp;lt;none&amp;gt;   7m49s   v1.33.7
aks-default-41983717-vmss000002   Ready    &amp;lt;none&amp;gt;   7m56s   v1.33.7&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Terraform으로 활용해서 ACR과 AKS를 구축&lt;/b&gt;&lt;/span&gt;하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;코드 한번만 잘 설정하면 손쉽게 AKS를 구축할 수 있어 인프라 관리에 꼭 필요하다는 생각이 들었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음 포스팅에서는 구축한 AKS를 살펴보고 ACR에 있는 이미지를 pull 받는 것을 정리하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;[참고자료]&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;figure id=&quot;og_1774173826213&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Azure의 Terraform 설명서 - 문서, 샘플, 참조 및 리소스 - Terraform&quot; data-og-description=&quot;Terraform을 사용하여 Azure에서 가상 머신 및 기타 인프라를 안정적으로 프로비전하는 방법을 알아봅니다.&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/ko-kr/azure/developer/terraform/&quot; data-og-url=&quot;https://learn.microsoft.com/ko-kr/azure/developer/terraform/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EZQNu/dJMb8XkeF7N/nh5kzvE12gk9oonlrUgAO0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/azure/developer/terraform/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/ko-kr/azure/developer/terraform/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EZQNu/dJMb8XkeF7N/nh5kzvE12gk9oonlrUgAO0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Azure의 Terraform 설명서 - 문서, 샘플, 참조 및 리소스 - Terraform&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Terraform을 사용하여 Azure에서 가상 머신 및 기타 인프라를 안정적으로 프로비전하는 방법을 알아봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1774173843652&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Terraform Registry&quot; data-og-description=&quot;&quot; data-og-host=&quot;registry.terraform.io&quot; data-og-source-url=&quot;https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs&quot; data-og-url=&quot;https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Terraform Registry&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;registry.terraform.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Cloud</category>
      <category>ACR</category>
      <category>AKS</category>
      <category>AZURE</category>
      <category>cilium</category>
      <category>CNI</category>
      <category>ephemeral</category>
      <category>hubble</category>
      <category>kubernetes</category>
      <category>Terraform</category>
      <author>천재보단범재</author>
      <guid isPermaLink="true">https://developnote-blog.tistory.com/221</guid>
      <comments>https://developnote-blog.tistory.com/221#entry221comment</comments>
      <pubDate>Sun, 22 Mar 2026 17:28:35 +0900</pubDate>
    </item>
    <item>
      <title>[Talos] 도커 하나면 쿠버네티스 설치가 가능하다고?!</title>
      <link>https://developnote-blog.tistory.com/220</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VDDxG/dJMcaaD9eHi/0rjogTGTW6lkeZqiNARTg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VDDxG/dJMcaaD9eHi/0rjogTGTW6lkeZqiNARTg1/img.png&quot; data-alt=&quot;Talos로 Kubernetes 설치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VDDxG/dJMcaaD9eHi/0rjogTGTW6lkeZqiNARTg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVDDxG%2FdJMcaaD9eHi%2F0rjogTGTW6lkeZqiNARTg1%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;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Talos로 Kubernetes 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Talos로 Kubernetes 설치&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;회사에서 솔루션을 개발하게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;개발하기 앞서 필요한 여러 가지 서비스를 설치해야 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;MySQL, Clickhouse, Minio와 같은 스토리지와 외부 서비스를 구축해야 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;처음에는 docker-compose로 관리했지만 서비스가 많아지면서 관리가 너무 힘들었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Kubernetes를 도입하고 싶었지만 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;클라우드 k8s 도입 비용이 없었고 GPU 서버 1대만 있는 상황&lt;/b&gt;&lt;/span&gt;이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그러던 중 &lt;b&gt;&lt;a href=&quot;https://docs.siderolabs.com/talos/v1.12/overview/what-is-talos&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Talos Linux&lt;/a&gt;&lt;/b&gt;를 발견했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;What is Talos?&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMNLWz/dJMcaiIT1E1/8Mw2KEspRUaKxgAcrqcKT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMNLWz/dJMcaiIT1E1/8Mw2KEspRUaKxgAcrqcKT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMNLWz/dJMcaiIT1E1/8Mw2KEspRUaKxgAcrqcKT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMNLWz%2FdJMcaiIT1E1%2F8Mw2KEspRUaKxgAcrqcKT1%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;600&quot; height=&quot;315&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Talos&lt;/b&gt;는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Kubernetes 전용으로 설계된 Container 전용 OS&lt;/b&gt;&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;세가지 특징이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Container 전용 OS&lt;/b&gt;&lt;/span&gt; - SSH도 없고 shell도 없습니다. 다만 talosctl를 통해 관리할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;서버에 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;직접 파일 수정이 힘듭&lt;/b&gt;&lt;/span&gt;니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Docker &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Container로 Talos를 실행&lt;/b&gt;&lt;/span&gt;할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;GPU 서버가 1대밖에 없는 상황에서 Kubernetes 설치가 불가능해 보였지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Talos를 통해 Container 형태로 Kubernetes 클러스터를 구축하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;talosctl를 통한 설치&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Talos에서는 talosctl이라는 CLI Client를 제공합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;직접 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Talos Container를 건드는 것보다는 talosctl를 통해 관리&lt;/b&gt;&lt;/span&gt;하는 것이 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;설치 역시 talosctl로 설치가 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769937218867&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;talosctl cluster create \
  --name dev \
  --config-patch @patch.yaml \
  --workers=3 \
  --kubernetes-version=v1.34.2 \
  --exposed-ports 30080:30080/tcp \
  --skip-k8s-node-readiness-check&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위와 같은 명령어로 Talos를 통해 Kubernetes 클러스터 설치가 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;각 플래그의 의미는 아래 표로 정리하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 126px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style11&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Flag&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;설명&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;--name dev&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;Kubernetes 클러스터 명칭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;--config-patch @patch.yaml&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;추가 설정 파일 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;--workers=3&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;Worker 노드 갯수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;--kubernetes-version=v1.34.2&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;Kubernetes 버전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;--exposed-ports 30080:30080/tcp&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;Host에서 k8s 접근 포트 노출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;--skip-k8s-node-readiness-check&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: left;&quot;&gt;CNI 설치 전까지 NotReady가 정상이므로 대기 skip&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위에 보면 추가 설정 파일을 적용하고 readiness-check를 skip 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;따로 설정을 한 이유는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;해당 설정 없이 설치할 경우&amp;nbsp;CoreDNS가 Pending 상태&lt;/b&gt;&lt;/span&gt;가 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769937798157&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;alidating CIDR and reserving IPs
generating PKI and tokens
creating state directory in &quot;/home/***/.talos/clusters/llmops-dev&quot;
creating network dev
creating controlplane nodes
creating worker nodes
waiting for API
bootstrapping cluster
waiting for etcd to be healthy: OK
waiting for etcd members to be consistent across nodes: OK
waiting for etcd members to be control plane nodes: OK
waiting for apid to be ready: OK
waiting for all nodes memory sizes: OK
waiting for all nodes disk sizes: OK
waiting for no diagnostics: OK
waiting for kubelet to be healthy: OK
waiting for all nodes to finish boot sequence: OK
waiting for all k8s nodes to report: OK
waiting for all control plane static pods to be running: OK
waiting for all control plane components to be ready: OK

merging kubeconfig into &quot;/home/***/kube/config&quot;
renamed cluster &quot;dev&quot; -&amp;gt; &quot;dev-1&quot;
renamed auth info &quot;admin@dev&quot; -&amp;gt; &quot;admin@dev-1&quot;
renamed context &quot;admin@dev&quot; -&amp;gt; &quot;admin@dev-1&quot;
PROVISIONER           docker
NAME                  dev
NETWORK NAME          dev
NETWORK CIDR          10.5.0.0/24
NETWORK GATEWAY       10.5.0.1
NETWORK MTU           1500
KUBERNETES ENDPOINT   https://127.0.0.1:35531

NODES:

NAME                  TYPE           IP         CPU    RAM      DISK
/dev-controlplane-1   controlplane   10.5.0.2   2.00   2.1 GB   -
/dev-worker-1         worker         10.5.0.3   2.00   2.1 GB   -
/dev-worker-2         worker         10.5.0.4   2.00   2.1 GB   -
/dev-worker-3         worker         10.5.0.5   2.00   2.1 GB   -


$ kubectl get nodes
NAME                 STATUS     ROLES           AGE     VERSION
dev-controlplane-1   NotReady   control-plane   7m57s   v1.34.2
dev-worker-1         NotReady   &amp;lt;none&amp;gt;          7m57s   v1.34.2
dev-worker-2         NotReady   &amp;lt;none&amp;gt;          7m56s   v1.34.2
dev-worker-3         NotReady   &amp;lt;none&amp;gt;          7m56s   v1.34.2

$ kubectl get all -n kube-system
NAME                                                    READY   STATUS    RESTARTS        AGE
pod/coredns-6bb5667469-zmqmz                            0/1     Pending   0               7m26s
pod/coredns-6bb5667469-zrqjb                            0/1     Pending   0               7m26s
pod/kube-apiserver-llmops-dev-controlplane-1            1/1     Running   0               7m8s
pod/kube-controller-manager-llmops-dev-controlplane-1   1/1     Running   3 (7m56s ago)   7m8s
pod/kube-scheduler-llmops-dev-controlplane-1            1/1     Running   4 (7m42s ago)   7m8s

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.96.0.10   &amp;lt;none&amp;gt;        53/UDP,53/TCP,9153/TCP   7m33s

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns   0/2     2            0           7m33s

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-6bb5667469   2         2         0       7m26&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이유는 기본 설정에서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;CNI 제대로 설치가 되지 않았기 때문&lt;/b&gt;&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 이슈는 아래 Github 이슈에서도 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1769938013120&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;[1.8.0] coredns does not start with talosctl cluster create &amp;middot; Issue #9419 &amp;middot; siderolabs/talos&quot; data-og-description=&quot;Bug Report Description When creating a cluster with talosctl and docker, coredns does not start talosctl cluster create View logs talosctl cluster create validating CIDR and reserving IPs generatin...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/siderolabs/talos/issues/9419#issuecomment-2959533346&quot; data-og-url=&quot;https://github.com/siderolabs/talos/issues/9419&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gK5I9/dJMb9cBC9of/kIHGZqNFsPRMSDnip9bxj1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/izx1L/dJMb9dHi2NF/izFdk4ZhCqvY8Ua3xLvwiK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/siderolabs/talos/issues/9419#issuecomment-2959533346&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/siderolabs/talos/issues/9419#issuecomment-2959533346&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gK5I9/dJMb9cBC9of/kIHGZqNFsPRMSDnip9bxj1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/izx1L/dJMb9dHi2NF/izFdk4ZhCqvY8Ua3xLvwiK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[1.8.0] coredns does not start with talosctl cluster create &amp;middot; Issue #9419 &amp;middot; siderolabs/talos&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Bug Report Description When creating a cluster with talosctl and docker, coredns does not start talosctl cluster create View logs talosctl cluster create validating CIDR and reserving IPs generatin...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;별도로 CNI를 세팅하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Cilium 설치&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;CNI는 Kubernetes내 Pod에 네트워크 인터페이스를 부여하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Cilium을 helm으로 설치&lt;/b&gt;&lt;/span&gt;하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769940643356&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;helm repo add cilium https://helm.cilium.io/
helm pull cilium/cilium
tar zxvf cilium-1.18.4.tgz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;values-overrides.yaml을 따로 작성해서 만들었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;공식 talos 문서에도 Cilium CNI 설치에 관한 안내가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 문서를 참고해서 설치하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1769940744708&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Deploy Cilium CNI - Sidero Documentation&quot; data-og-description=&quot;In this guide you will learn how to set up Cilium CNI on Talos.&quot; data-og-host=&quot;docs.siderolabs.com&quot; data-og-source-url=&quot;https://docs.siderolabs.com/kubernetes-guides/cni/deploying-cilium&quot; data-og-url=&quot;https://docs.siderolabs.com/kubernetes-guides/cni/deploying-cilium&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cRMNRx/dJMb8YpQqmV/jw1SVWjSNogfzt08HNBnyK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/xX775/dJMb8Qehcxh/aMMLdUtIV2zf3RLYDYark0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://docs.siderolabs.com/kubernetes-guides/cni/deploying-cilium&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.siderolabs.com/kubernetes-guides/cni/deploying-cilium&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cRMNRx/dJMb8YpQqmV/jw1SVWjSNogfzt08HNBnyK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/xX775/dJMb8Qehcxh/aMMLdUtIV2zf3RLYDYark0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Deploy Cilium CNI - Sidero Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;In this guide you will learn how to set up Cilium CNI on Talos.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.siderolabs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1769940722925&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ipam:
  mode: &quot;kubernetes&quot;

kubeProxyReplacement: &quot;true&quot;

securityContext:
    capabilities:
      ciliumAgent: [&quot;CHOWN&quot;,&quot;KILL&quot;,&quot;NET_ADMIN&quot;,&quot;NET_RAW&quot;,&quot;IPC_LOCK&quot;,&quot;SYS_ADMIN&quot;,&quot;SYS_RESOURCE&quot;,&quot;DAC_OVERRIDE&quot;,&quot;FOWNER&quot;,&quot;SETGID&quot;,&quot;SETUID&quot;]
      cleanCiliumState: [&quot;NET_ADMIN&quot;,&quot;SYS_ADMIN&quot;,&quot;SYS_RESOURCE&quot;]

cgroup:
  autoMount:
    enabled: false
  hostRoot: /sys/fs/cgroup

k8sServiceHost: &quot;localhost&quot;
k8sServicePort: 7445&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;helm install를 통해 Cilium을 설치&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769940849762&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ helm install cilium -n kube-system -f values-override.yaml .
NAME: cilium
LAST DEPLOYED: Tue Nov 25 10:40:20 2025
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
DESCRIPTION: Install complete
TEST SUITE: None
NOTES:
You have successfully installed Cilium with Hubble.

Your release version is 1.18.4.

For any further help, visit https://docs.cilium.io/en/v1.18/gettinghelp


$ kubectl get nodes
NAME                 STATUS   ROLES           AGE   VERSION
dev-controlplane-1   Ready    control-plane   12m   v1.34.2
dev-worker-1         Ready    &amp;lt;none&amp;gt;          12m   v1.34.2
dev-worker-2         Ready    &amp;lt;none&amp;gt;          12m   v1.34.2
dev-worker-3         Ready    &amp;lt;none&amp;gt;          12m   v1.34.2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Cilium 설치 후 각 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Kubernetes 각 Node가 정상&lt;/b&gt;&lt;/span&gt;적인 상태인 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;CoreDNS도 Pending이 아닌 Running 상태&lt;/b&gt;&lt;/span&gt;인 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769940928232&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ kubetctl get all -n kube-system
NAME                                                    READY   STATUS    RESTARTS      AGE
pod/cilium-25cfl                                        1/1     Running   0             82s
pod/cilium-2ktjs                                        1/1     Running   0             82s
pod/cilium-dvjlr                                        1/1     Running   0             82s
pod/cilium-envoy-6wmh5                                  1/1     Running   0             82s
pod/cilium-envoy-lg6lq                                  1/1     Running   0             82s
pod/cilium-envoy-p7gcz                                  1/1     Running   0             82s
pod/cilium-envoy-t6h9t                                  1/1     Running   0             82s
pod/cilium-operator-6b565f556c-5xdrr                    1/1     Running   0             82s
pod/cilium-operator-6b565f556c-7fkcz                    1/1     Running   0             82s
pod/cilium-xtxzw                                        1/1     Running   0             82s
pod/coredns-6bb5667469-zmqmz                            1/1     Running   0             12m
pod/coredns-6bb5667469-zrqjb                            1/1     Running   0             12m
pod/kube-apiserver-llmops-dev-controlplane-1            1/1     Running   0             11m
pod/kube-controller-manager-llmops-dev-controlplane-1   1/1     Running   3 (12m ago)   11m
pod/kube-scheduler-llmops-dev-controlplane-1            1/1     Running   4 (12m ago)   11m

NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
service/cilium-envoy   ClusterIP   None             &amp;lt;none&amp;gt;        9964/TCP                 82s
service/hubble-peer    ClusterIP   10.105.165.190   &amp;lt;none&amp;gt;        443/TCP                  82s
service/kube-dns       ClusterIP   10.96.0.10       &amp;lt;none&amp;gt;        53/UDP,53/TCP,9153/TCP   12m

NAME                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/cilium         4         4         4       4            4           kubernetes.io/os=linux   82s
daemonset.apps/cilium-envoy   4         4         4       4            4           kubernetes.io/os=linux   82s

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/cilium-operator   2/2     2            2           82s
deployment.apps/coredns           2/2     2            2           12m

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/cilium-operator-6b565f556c   2         2         2       82s
replicaset.apps/coredns-6bb5667469           2         2         2       12m&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;kubeconfig 설정&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위에서 보면 kubectl로 Talos로 설치한 Kuberenetes에 접근이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;kubectl 사용을 위해 kubeconfig를 가져와야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;talosctl 명령어로 가져올 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769941512904&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# kubeconfig 파일을 현재 디렉토리로 추출
$ talosctl kubeconfig --nodes 127.0.0.1 dev

# 추출된 파일 확인
$ ls -la
-rw------- 1 user user 2281 11월 25 10:31 dev

# 내용 확인 (실제로는 certificate-authority-data 등 민감정보 포함)
$ cat llmops-dev
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: ***
    server: https://127.0.0.1:35531
  name: dev
...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기본적으로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;talosctl cluster create 실행 시 ~/. kubeconfig/config에 자동으로 merge 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;context 이름은 자동으로 admin@{cluster_name}으로 생성됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Storageclass 설치&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 Talos로 Kubernetes 설치를 완료하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Talos는 기본적으로 Storageclass를 제공하지 않으므로 직접 설치해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;rancher의 local-strorage-provisioner로 설치&lt;/b&gt;&lt;/span&gt;하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769941899365&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ wget https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.32/deploy/local-path-storage.yaml

# version -&amp;gt; v0.0.32 (25/11/25 기준)
apiVersion: v1
kind: Namespace
metadata:
  name: local-path-storage
  labels:
    pod-security.kubernetes.io/enforce: privileged #추가
    pod-security.kubernetes.io/audit: privileged # 추가
    pod-security.kubernetes.io/warn: privileged # 추가
...
...
...
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-path
  annotations:
    storageclass.kubernetes.io/is-default-class: &quot;true&quot; # 추가
provisioner: rancher.io/local-path
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
...
...
...
kind: ConfigMap
apiVersion: v1
metadata:
  name: local-path-config
  namespace: local-path-storage
data:
  config.json: |-
    {
            &quot;nodePathMap&quot;:[
            {
                    &quot;node&quot;:&quot;DEFAULT_PATH_FOR_NON_LISTED_NODES&quot;,
                    &quot;paths&quot;:[&quot;/var/lib/local-path-provisioner&quot;] # 수정
            }
            ]
    }
  setup: |-
    #!/bin/sh
    set -eu
    mkdir -m 0777 -p &quot;$VOL_DIR&quot;
  teardown: |-
    #!/bin/sh
    set -eu
    rm -rf &quot;$VOL_DIR&quot;
  helperPod.yaml: |-
    apiVersion: v1
    kind: Pod
    metadata:
      name: helper-pod
    spec:
      priorityClassName: system-node-critical
      tolerations:
        - key: node.kubernetes.io/disk-pressure
          operator: Exists
          effect: NoSchedule
      containers:
      - name: helper-pod
        image: busybox
        imagePullPolicy: IfNotPresent


$ kubectl apply -f local-path-storage.yaml
namespace/local-path-storage created
serviceaccount/local-path-provisioner-service-account created
role.rbac.authorization.k8s.io/local-path-provisioner-role created
clusterrole.rbac.authorization.k8s.io/local-path-provisioner-role created
rolebinding.rbac.authorization.k8s.io/local-path-provisioner-bind created
clusterrolebinding.rbac.authorization.k8s.io/local-path-provisioner-bind created
deployment.apps/local-path-provisioner created
storageclass.storage.k8s.io/local-path created
configmap/local-path-config created


$ kubectl get stroageclass
NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  48s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;설치는 간단합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;버전을 참고해서 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;local-path-provisioner의 yaml 파일을 다운로드하여 설치&lt;/span&gt;&lt;/b&gt;하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;근데 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Namespace에 Pod-security labels을 추가&lt;/b&gt;&lt;/span&gt;해줘야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 72px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style11&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Label&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;역할&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot; data-olk-copy-source=&quot;MessageBody&quot;&gt;pod-security.kubernetes.io/enforce: privileged&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 수준을 벗어나는 Pod은 생성 자체가 거부됨.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot; data-olk-copy-source=&quot;MessageBody&quot;&gt;pod-security.kubernetes.io/audit: privileged&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위반 시 감사 로그에 기록됨&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot; data-olk-copy-source=&quot;MessageBody&quot;&gt;pod-security.kubernetes.io/warn: privileged&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위반시 경고메시지를 표시함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;local-path-provisioner는 내부적으로 &lt;b&gt;호스트 파일 시스템에 직접 접근&lt;/b&gt;해서 볼륨을 생성합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이를 위해&amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;hostPath&amp;nbsp;볼륨과 특권 권한이 필요&lt;/b&gt;&lt;/span&gt;하는데, 기본 보안 정책 하에서는 이것이 막힙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;세 가지 label을 모두 privileged로 설정하면, 해당 Namespace에서 특권 Pod을 자유롭게 실행할 수 있습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Talos 공식문서에서도 local-path-provisioner 설치 내용을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1769942567959&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Local Storage - Sidero Documentation&quot; data-og-description=&quot;Using local storage for Kubernetes workloads.&quot; data-og-host=&quot;docs.siderolabs.com&quot; data-og-source-url=&quot;https://docs.siderolabs.com/kubernetes-guides/csi/local-storage&quot; data-og-url=&quot;https://docs.siderolabs.com/kubernetes-guides/csi/local-storage&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eYUzp/dJMb89x8ziI/sLuW6jWcj5ojYNuZJb51Vk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cCT4oO/dJMb87f1n38/OLTWR8zLzfcyK9eBD4feMk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://docs.siderolabs.com/kubernetes-guides/csi/local-storage&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.siderolabs.com/kubernetes-guides/csi/local-storage&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eYUzp/dJMb89x8ziI/sLuW6jWcj5ojYNuZJb51Vk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cCT4oO/dJMb87f1n38/OLTWR8zLzfcyK9eBD4feMk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Local Storage - Sidero Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Using local storage for Kubernetes workloads.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.siderolabs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Talos로 docker container형태로 Kubernetes를 설치하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;docker ps 명령어를 통해 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Kubernetes Node가 Container형태로 구성&lt;/b&gt;&lt;/span&gt;된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769942901797&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ docker ps
CONTAINER ID   IMAGE                                  COMMAND   CREATED        STATUS         NAMES
a1b2c3d4e5f6   ghcr.io/siderolabs/talos:v1.7.6       &quot;/init&quot;   2 min ago      Up 2 min       dev-controlplane-1
b2c3d4e5f6a7   ghcr.io/siderolabs/talos:v1.7.6       &quot;/init&quot;   2 min ago      Up 2 min       dev-worker-1
c3d4e5f6a7b8   ghcr.io/siderolabs/talos:v1.7.6       &quot;/init&quot;   2 min ago      Up 2 min       dev-worker-2
d4e5f6a7b8c9   ghcr.io/siderolabs/talos:v1.7.6       &quot;/init&quot;   2 min ago      Up 2 min       dev-worker-3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;서비스가 너무 많고 서버가 1대라면 docker-compse 말고 Talos를 고려해 보면 좋을 거 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Talos 덕분에 솔루션 개발을 위한 서비스 관리나 배포가 쉬울 거 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[참고자료]&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;figure id=&quot;og_1769935762636&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;What is Talos Linux? - Sidero Documentation&quot; data-og-description=&quot;Talos Linux is the best OS for Kubernetes.&quot; data-og-host=&quot;docs.siderolabs.com&quot; data-og-source-url=&quot;https://docs.siderolabs.com/talos/v1.12/overview/what-is-talos&quot; data-og-url=&quot;https://docs.siderolabs.com/talos/v1.12/overview/what-is-talos&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bzAIiW/dJMb89x8yOg/SbobHEUj5Tdo7LQ2QzcMz1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/g7Po3/dJMb8XkaqoL/MXYY55ydGEzFABYGTVIdD1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://docs.siderolabs.com/talos/v1.12/overview/what-is-talos&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.siderolabs.com/talos/v1.12/overview/what-is-talos&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bzAIiW/dJMb89x8yOg/SbobHEUj5Tdo7LQ2QzcMz1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/g7Po3/dJMb8XkaqoL/MXYY55ydGEzFABYGTVIdD1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;What is Talos Linux? - Sidero Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Talos Linux is the best OS for Kubernetes.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.siderolabs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1769938035069&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - siderolabs/talos: Talos Linux is a modern Linux distribution built for Kubernetes.&quot; data-og-description=&quot;Talos Linux is a modern Linux distribution built for Kubernetes. - siderolabs/talos&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/siderolabs/talos&quot; data-og-url=&quot;https://github.com/siderolabs/talos&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/6Ofrn/dJMb8ZvwqeQ/GSDQj5OrzW41cG2KPsk8N1/img.png?width=400&amp;amp;height=225&amp;amp;face=0_0_400_225,https://scrap.kakaocdn.net/dn/zu5db/dJMb8UHKcfz/itejGErwZUPyzrKmowNnmK/img.png?width=400&amp;amp;height=225&amp;amp;face=0_0_400_225&quot;&gt;&lt;a href=&quot;https://github.com/siderolabs/talos&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/siderolabs/talos&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/6Ofrn/dJMb8ZvwqeQ/GSDQj5OrzW41cG2KPsk8N1/img.png?width=400&amp;amp;height=225&amp;amp;face=0_0_400_225,https://scrap.kakaocdn.net/dn/zu5db/dJMb8UHKcfz/itejGErwZUPyzrKmowNnmK/img.png?width=400&amp;amp;height=225&amp;amp;face=0_0_400_225');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - siderolabs/talos: Talos Linux is a modern Linux distribution built for Kubernetes.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Talos Linux is a modern Linux distribution built for Kubernetes. - siderolabs/talos&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.cilium.io/en/stable/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.cilium.io/en/stable/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1769941748957&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - rancher/local-path-provisioner: Dynamically provisioning persistent local storage with Kubernetes&quot; data-og-description=&quot;Dynamically provisioning persistent local storage with Kubernetes - rancher/local-path-provisioner&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/rancher/local-path-provisioner&quot; data-og-url=&quot;https://github.com/rancher/local-path-provisioner&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/M65fo/dJMb8QL61Nm/TKP3TZbY0ozABVkzNJnrKK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/nr8Oo/dJMb8XR0zCy/46eh5WKulgYNaEiOkGLJ91/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/rancher/local-path-provisioner&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/rancher/local-path-provisioner&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/M65fo/dJMb8QL61Nm/TKP3TZbY0ozABVkzNJnrKK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/nr8Oo/dJMb8XR0zCy/46eh5WKulgYNaEiOkGLJ91/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - rancher/local-path-provisioner: Dynamically provisioning persistent local storage with Kubernetes&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Dynamically provisioning persistent local storage with Kubernetes - rancher/local-path-provisioner&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;</description>
      <category>Infra/Kubernetes</category>
      <category>cilium</category>
      <category>CNI</category>
      <category>docker</category>
      <category>kubeconfig</category>
      <category>kuberntes</category>
      <category>local-path-provisioner</category>
      <category>rancher</category>
      <category>sidero</category>
      <category>Talos</category>
      <category>talosctl</category>
      <author>천재보단범재</author>
      <guid isPermaLink="true">https://developnote-blog.tistory.com/220</guid>
      <comments>https://developnote-blog.tistory.com/220#entry220comment</comments>
      <pubDate>Sun, 1 Feb 2026 18:05:52 +0900</pubDate>
    </item>
    <item>
      <title>[Embedding] Hybrid Search - Qdrant 구성</title>
      <link>https://developnote-blog.tistory.com/219</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAKRma/btsPgbdwaoa/ZJpXhkRwhWx8SJv1g9dqz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAKRma/btsPgbdwaoa/ZJpXhkRwhWx8SJv1g9dqz0/img.png&quot; data-alt=&quot;임베딩 Hybrid Search&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAKRma/btsPgbdwaoa/ZJpXhkRwhWx8SJv1g9dqz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAKRma%2FbtsPgbdwaoa%2FZJpXhkRwhWx8SJv1g9dqz0%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;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;임베딩 Hybrid Search&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Hybrid Search 구성&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;RAG와 LLM을 활용한 자동분류 서비스를 구성하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://milvus.io/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Milvus&lt;/a&gt;&lt;/b&gt;에 Dense 임베딩 값을 넣어서 RAG를 구성하였지만 성능이 좋지 않았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;성능 보완을 위해 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Dense 임베딩뿐만 아니라 Sparse 임베딩도 넣어서 성능을 보완&lt;/b&gt;&lt;/span&gt;해보려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Sparse 임베딩과 Dense 임베딩이 무엇인지는 아래 포스팅을 참고하시길 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;차이점 중심으로 비교해 보았습니다.&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1752297631952&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Embedding] Sparse vs Dense 임베딩&quot; data-og-description=&quot;Sparse vs Dense 임베딩프로젝트에 투입해서 RAG와 LLM을 활용한 자동 분류 서비스를 개발하였습니다.처음에는 다국어를 지원하는 paraphrase-multilingual-mpnet-base-v2 임베딩 모델로 임베딩을 생성해서Milvus&quot; data-og-host=&quot;developnote-blog.tistory.com&quot; data-og-source-url=&quot;https://developnote-blog.tistory.com/218&quot; data-og-url=&quot;https://developnote-blog.tistory.com/218&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/icsib/hyZjl4tK3B/8m6bxkvn5SCxOpD5PsKl0K/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/mLReb/hyZjwE4SEO/8QfUjABO5ErBihJOm36dOk/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/bumJQs/hyZjrwYZse/ksQgVawkC647C33EXSk4Qk/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450&quot;&gt;&lt;a href=&quot;https://developnote-blog.tistory.com/218&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developnote-blog.tistory.com/218&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/icsib/hyZjl4tK3B/8m6bxkvn5SCxOpD5PsKl0K/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/mLReb/hyZjwE4SEO/8QfUjABO5ErBihJOm36dOk/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/bumJQs/hyZjrwYZse/ksQgVawkC647C33EXSk4Qk/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Embedding] Sparse vs Dense 임베딩&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Sparse vs Dense 임베딩프로젝트에 투입해서 RAG와 LLM을 활용한 자동 분류 서비스를 개발하였습니다.처음에는 다국어를 지원하는 paraphrase-multilingual-mpnet-base-v2 임베딩 모델로 임베딩을 생성해서Milvus&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developnote-blog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Dense 임베딩과 Sparse 임베딩을 활용하려면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Hybrid Search 방식으로 유사 문서를 검색&lt;/b&gt;&lt;/span&gt;해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;두 가지 임베딩 활용을 위한 Hybrid Search 구성을 진행하려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Hybrid Search란?&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;저번 포스팅에서 Dense 임베딩과 Sparse 임베딩을 비교해 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2가지 임베딩 방식은 각각 장단점이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Dense 임베딩 -&amp;gt; &lt;/b&gt;의미적 유사성은 잘 찾지만, 정확한 키워드 매칭이 약함.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Sparse 임베딩 -&amp;gt;&lt;/b&gt; 키워드 매칭은 정확하지만, 동의어나 유의어 처리가 어려움.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Hybrid Search&lt;/b&gt;는 두 가지 임베딩 방식의 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;장점을 보완하기 위해 포괄적으로 검색&lt;/b&gt;&lt;/span&gt;하는 방식입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Hybrid Search의 작동 원리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #abb2bf; text-align: left;&quot;&gt;&lt;code&gt;사용자 질문: &quot;차량 구매 방법이 궁금해&quot;

1. Dense 검색 결과:
   - &quot;자동차 매입 절차 안내&quot; (점수: 0.85)
   - &quot;차량 구매 가이드&quot; (점수: 0.82)
   - &quot;자동차 선택 팁&quot; (점수: 0.78)

2. Sparse 검색 결과:
   - &quot;차량 구매 가이드&quot; (점수: 0.92)
   - &quot;구매 방법 총정리&quot; (점수: 0.88)
   - &quot;차량 관련 정보&quot; (점수: 0.85)

3. Hybrid 최종 결과 (가중평균):
   - &quot;차량 구매 가이드&quot; (Dense: 0.82, Sparse: 0.92 &amp;rarr; 최종: 0.87)
   - &quot;자동차 매입 절차 안내&quot; (Dense: 0.85, Sparse: 0.0 &amp;rarr; 최종: 0.60)
   - &quot;구매 방법 총정리&quot; (Dense: 0.0, Sparse: 0.88 &amp;rarr; 최종: 0.26)&lt;/code&gt;&lt;/pre&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위 예시처럼 Dense와 Sparse 임베딩에서 검색하는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;유사 문서를 종합적으로 판단&lt;/b&gt;&lt;/span&gt;해서 유사도를 검색합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래와 같은 장점을 보입니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;포괄적 검색 -&amp;gt;&lt;/b&gt;&amp;nbsp;키워드와 의미를 모두 고려&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;정확도 향상 -&amp;gt;&lt;/b&gt;&amp;nbsp;두 방식의 약점을 서로 보완&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;사용자 경험 개선 -&amp;gt;&lt;/b&gt;&amp;nbsp;어떤 방식으로 질문해도 적절한 결과&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;도메인 적응성 -&amp;gt;&lt;/b&gt;&amp;nbsp;일반적인 질문부터 전문적인 질문까지 대응&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;실제로 한번 Hybrid Search를 구성해 보면서 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;벡터 DB가 필요한데 기존에 Milvus를 사용했지만 이번 포스팅에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Qdrant로 진행&lt;/b&gt;&lt;/span&gt;해보려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Qdrant란?&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Qdrant&lt;/b&gt;는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Rust로 개발&lt;/b&gt;&lt;/span&gt;된 고성능 벡터 데이터베이스입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Qdrant는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;네이티브 Hybrid Search를 지원&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Docker 이미지를 제공해서 쉽게 로컬에서 구성&lt;/b&gt;&lt;/span&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이러한 이유를 빠르게 Hybrid Search에 대해 알 수 있어 Qdrant로 진행해보려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 밖에도 Qdrant에는 장점이 많습니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;네이티브 Hybrid Search 지원&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Rust로 개발되어 메모리 효율적&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Docker로 쉬운 구성 가능&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Qdrant Cloud 서비스 이용&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Python Client 제공&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;자체 Web UI 제공&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2116&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ohNCq/btsPfpYaQrx/tV7swItbKKKSq8Q8Sllv8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ohNCq/btsPfpYaQrx/tV7swItbKKKSq8Q8Sllv8K/img.png&quot; data-alt=&quot;Qdrant 아키텍처&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ohNCq/btsPfpYaQrx/tV7swItbKKKSq8Q8Sllv8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FohNCq%2FbtsPfpYaQrx%2FtV7swItbKKKSq8Q8Sllv8K%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;600&quot; height=&quot;340&quot; data-origin-width=&quot;2116&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Qdrant 아키텍처&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Qdrant 구성&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Qdrant는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;공식적으로 Docker 이미지를 제공&lt;/b&gt;&lt;/span&gt;하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;GPU에서 실행되는 이미지를 따로 제공&lt;/b&gt;&lt;/span&gt;하고 있으니 참고하시길 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 Docker를 통해서 Qdrant를 구성하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래와 같이 docker compose 파일을 구성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1752302834330&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3.8'
services:
  qdrant:
    image: qdrant/qdrant:v1.14.1
    ports:
      - &quot;6333:6333&quot;
      - &quot;6334:6334&quot;
    volumes:
      - /***/volumes/qdrant:/qdrant/storage:z
    environment:
      - QDRANT__SERVICE__HTTP_PORT=6333
      - QDRANT__SERVICE__GRPC_PORT=6334
      - QDRANT__LOG_LEVEL=INFO
      - RUST_LOG=qdrant=info    # Rust 로깅 레벨 설정
    restart: unless-stopped&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래와 같이 docker compose로 실행하면 로그를 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;http://localhost:6333/dashboard로 들어가면 Qdrant Web UI&lt;/b&gt;&lt;/span&gt;를 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1752302707111&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ docker compose up -d
$ docker ps
CONTAINER ID   IMAGE                   COMMAND             CREATED         STATUS         PORTS                              NAMES
fede6b49a583   qdrant/qdrant:v1.14.1   &quot;./entrypoint.sh&quot;   6 seconds ago   Up 5 seconds   0.0.0.0:6333-6334-&amp;gt;6333-6334/tcp   ai_test-qdrant-1

$ docker logs fede6b49a583
           _                 _
  __ _  __| |_ __ __ _ _ __ | |_
 / _` |/ _` | '__/ _` | '_ \| __|
| (_| | (_| | | | (_| | | | | |_
 \__, |\__,_|_|  \__,_|_| |_|\__|
    |_|

Version: 1.14.1, build: 530430fa
Access web UI at http://localhost:6333/dashboard

2025-07-12T06:44:15.928608Z  INFO storage::content_manager::consensus::persistent: Initializing new raft state at ./storage/raft_state.json
2025-07-12T06:44:15.971620Z  INFO qdrant: Distributed mode disabled
2025-07-12T06:44:15.971711Z  INFO qdrant: Telemetry reporting enabled, id: 3f6e77f1-b845-40bd-b911-54981f4ab3bf
2025-07-12T06:44:15.971822Z  INFO qdrant: Inference service is not configured.
2025-07-12T06:44:15.972711Z  INFO qdrant::actix: TLS disabled for REST API
2025-07-12T06:44:15.972812Z  INFO qdrant::actix: Qdrant HTTP listening on 6333
2025-07-12T06:44:15.972837Z  INFO actix_server::builder: starting 3 workers
2025-07-12T06:44:15.972841Z  INFO actix_server::server: Actix runtime found; starting in Actix runtime
2025-07-12T06:44:15.972864Z  INFO actix_server::server: starting service: &quot;actix-web-service-0.0.0.0:6333&quot;, workers: 3, listening on: 0.0.0.0:6333
2025-07-12T06:44:15.975946Z  INFO qdrant::tonic: Qdrant gRPC listening on 6334
2025-07-12T06:44:15.975997Z  INFO qdrant::tonic: TLS disabled for gRPC API&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;959&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZAXJX/btsPfg7U48H/IxSyzjxdkDv2cQY8A53l4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZAXJX/btsPfg7U48H/IxSyzjxdkDv2cQY8A53l4K/img.png&quot; data-alt=&quot;Qdrant WEB UI&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZAXJX/btsPfg7U48H/IxSyzjxdkDv2cQY8A53l4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZAXJX%2FbtsPfg7U48H%2FIxSyzjxdkDv2cQY8A53l4K%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;1258&quot; height=&quot;959&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Qdrant WEB UI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;fastembed&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;FastEmbed&lt;/b&gt;는 Qdrant에서 개발한&amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;경량화된 임베딩 생성 라이브러리&lt;/b&gt;&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;FastEmbed는 세 가지 장점이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;첫 번째 장점은 &lt;b&gt;경량화&lt;/b&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;ONNX Runtime을 활용하여 임베딩 모델을 경량화&lt;/b&gt;&lt;/span&gt;해서 사용할 수 있게 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; style=&quot;color: #abb2bf; text-align: left;&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 기존 방식 (Sentence Transformers)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('BAAI/bge-small-en-v1.5')
# &amp;rarr; PyTorch 의존성으로 인한 수GB 다운로드
# &amp;rarr; GPU 메모리 많이 사용

# FastEmbed 방식
from fastembed import TextEmbedding
model = TextEmbedding(&quot;BAAI/bge-small-en-v1.5&quot;)
# &amp;rarr; ONNX Runtime 사용으로 경량화
# &amp;rarr; CPU만으로도 실용적 성능&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;두 번째 장점은 &lt;b&gt;속도&lt;/b&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;ONNX Runtime을 사용해서 PyTorch보다는 빠르게 추론하여 임베딩&lt;/b&gt;&lt;/span&gt;을 생성할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고 메모리를 효율적으로 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;세 번째 장점은 &lt;b&gt;다양한 모델 지원&lt;/b&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Dense 임베딩, Sparse 임베딩뿐만 아니라 이미지 임베딩 모델도 지원&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 코드를 통해서 fastembed에서 지원하는 Dense 임베딩 모델을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;25년 7월 12일 기준 30개를 지원하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1752298402097&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from fastembed import TextEmbedding

supported_text_models = (
    pd.DataFrame(TextEmbedding.list_supported_models())
    .sort_values(&quot;size_in_GB&quot;)
    .drop(columns=[&quot;sources&quot;, &quot;model_file&quot;, &quot;additional_files&quot;])
    .reset_index(drop=True)
)
supported_text_models&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WsBBo/btsPfvwVOwm/JemrXRkuuxWKJdeW3eDbpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WsBBo/btsPfvwVOwm/JemrXRkuuxWKJdeW3eDbpk/img.png&quot; data-alt=&quot;fastembed에서 지원하는 TextEmbedding 모델&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WsBBo/btsPfvwVOwm/JemrXRkuuxWKJdeW3eDbpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWsBBo%2FbtsPfvwVOwm%2FJemrXRkuuxWKJdeW3eDbpk%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;700&quot; height=&quot;376&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;fastembed에서 지원하는 TextEmbedding 모델&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고 fastembed에서 지원하는 Spare 임베딩 모델도 지원을 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;25년 7월 12일 기준 5개를 지원하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1752298596763&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from fastembed import SparseTextEmbedding

supported_sparse_models = (
    pd.DataFrame(SparseTextEmbedding.list_supported_models())
    .sort_values(&quot;size_in_GB&quot;)
    .drop(columns=[&quot;sources&quot;, &quot;model_file&quot;, &quot;additional_files&quot;])
    .reset_index(drop=True)
)
supported_sparse_models&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qW20H/btsPfpw4B29/XgJUjkKfXE3uRwcghEcw91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qW20H/btsPfpw4B29/XgJUjkKfXE3uRwcghEcw91/img.png&quot; data-alt=&quot;fastembed에서 지원하는 SparseEmbedding 모델&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qW20H/btsPfpw4B29/XgJUjkKfXE3uRwcghEcw91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqW20H%2FbtsPfpw4B29%2FXgJUjkKfXE3uRwcghEcw91%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;931&quot; height=&quot;146&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;fastembed에서 지원하는 SparseEmbedding 모델&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서 Qdrant와 fastembed를 통해서 Hybrid Search를 구성해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;임베딩 생성 및 컬렉션 저장&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Dense 임베딩과 Sparse 임베딩을 생성해서 Qdrant에 저장해 보겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터는 파이썬 dataset 라이브러리에 있는 ms_macro 데이터셋으로 활용하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1752376506927&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from datasets import load_dataset

dataset = load_dataset(&quot;ms_marco&quot;, &quot;v1.1&quot;, split=&quot;train[:1000]&quot;)
df = pd.DataFrame(dataset)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOQ4kA/btsPfgAnkxh/32crhQDNMoPaAzqQ6yVM60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOQ4kA/btsPfgAnkxh/32crhQDNMoPaAzqQ6yVM60/img.png&quot; data-alt=&quot;dataset의 queries 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOQ4kA/btsPfgAnkxh/32crhQDNMoPaAzqQ6yVM60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOQ4kA%2FbtsPfgAnkxh%2F32crhQDNMoPaAzqQ6yVM60%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;641&quot; height=&quot;475&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dataset의 queries 데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 데이터에서 Dense 임베딩과 Sparse 임베딩을 만들어보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;fastembed 라이브러리로 각각 아래 모델들로 생성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1752376672640&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from fastembed import TextEmbedding, SparseTextEmbedding

dense_model = TextEmbedding('sentence-transformers/paraphrase-multilingual-mpnet-base-v2')
dense_embeddings = list(dense_model.embed(texts))

sparse_model = SparseTextEmbedding('Qdrant/bm25')
sparse_embeddings = list(sparse_model.embed(texts))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이렇게 생성한 임베딩들을 바탕으로 Qdrant에 컬렉션을 생성하고 저장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Qdrant는 파이썬 클라이언트를 제공해서 파이썬을 통해 쉽게 컬렉션을 생성하고 저장&lt;/b&gt;&lt;/span&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1752376807058&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance, SparseVectorParams, PointStruct, SparseVector

def setup_qdrant_hybrid(passages, dense_embeddings, sparse_embeddings):
    client = QdrantClient('localhost', port=6333)
    collection_name = 'hybrid_test'
    dense_dim = len(dense_embeddings[0])

    if client.collection_exists(collection_name):
        client.delete_collection(collection_name)
    
    # Create collection with both dense and sparse vector configurations
    client.create_collection(
        collection_name = collection_name,
        vectors_config = {
            &quot;dense&quot; : VectorParams(
                size=dense_dim,
                distance=Distance.COSINE
            )
        },
        sparse_vectors_config = {
            &quot;sparse&quot; : SparseVectorParams()
        }
    )
    
    # 데이터 삽입
    points = []
    for i, (passage, dense_emb, sparse_emb) in enumerate(zip(passages, dense_embeddings, sparse_embeddings)):
...
...
...
        point = PointStruct(
            id=i,
            vector={
                &quot;dense&quot;: dense_vector,
                &quot;sparse&quot;: sparse_vector
            },
            payload={&quot;text&quot;: passage}
        )
        points.append(point)
    
    client.upsert(collection_name, points)
    return client&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;저장 후 Qdrant WEB UI에서 저장된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;723&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxqP15/btsPgEmdaZd/CeUUh3on5WWL0JyViJFI50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxqP15/btsPgEmdaZd/CeUUh3on5WWL0JyViJFI50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxqP15/btsPgEmdaZd/CeUUh3on5WWL0JyViJFI50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxqP15%2FbtsPgEmdaZd%2FCeUUh3on5WWL0JyViJFI50%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;600&quot; height=&quot;334&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;723&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Hybrid Search&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Qdrant에 Dense 임베딩과 Sparse 임베딩을 넣었으면 이제 Hybrid Search를 해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;867&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MMn2Q/btsPfrhEg42/hrzDv1TRslD27WgQNZqAk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MMn2Q/btsPfrhEg42/hrzDv1TRslD27WgQNZqAk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MMn2Q/btsPfrhEg42/hrzDv1TRslD27WgQNZqAk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMMn2Q%2FbtsPfrhEg42%2FhrzDv1TRslD27WgQNZqAk1%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;600&quot; height=&quot;406&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;867&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Qdrant에는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;자체 내장 RRF를 가지고 있어서 query 변수에 RRF를 추가해 주면&lt;/b&gt;&lt;/span&gt; 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1752379437840&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;results = client.query_points(
    collection_name = collection_name,
    query=models.FusionQuery(
        fusion=models.Fusion.RRF  # Reciprocal Rank Fusion
    ),
    prefetch=[
        models.Prefetch(
            query=models.Document(text=query_text, model=&quot;sentence-transformers/paraphrase-multilingual-mpnet-base-v2&quot;),
            using=&quot;dense&quot;,
        ),
        models.Prefetch(
            query=models.Document(text=query_text, model=&quot;Qdrant/bm25&quot;),
            using=&quot;sparse&quot;,
        ),
    ],
    query_filter=None,
    limit=top_k,
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1가지 텍스트를 비교해 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Dense 임베딩으로만, Sparse 임베딩으로만, Hybrid Search를 했을 경우를 비교해 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;단순 비교라 정확하지 않지만 각각 score를 어떻게 내는지 비교해 볼 수 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1752379507097&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Comparing search methods for query: 'what is a diabetic'
================================================================================

  DENSE-ONLY SEARCH
------------------------------
Search time: 0.0322s
1. Score: 0.8025
   Text: what is a diabetic kidney...

2. Score: 0.4516
   Text: what does a metabolic acidosis need to reverse the condition...

3. Score: 0.3117
   Text: what is the discriminant of an equation...

4. Score: 0.2867
   Text: why conversion observed in body...

5. Score: 0.2716
   Text: diseases caused by clostridium...


  SPARSE-ONLY SEARCH
------------------------------
Search time: 0.0119s
1. Score: 2.8408
   Text: what is a diabetic kidney...


  HYBRID SEARCH
------------------------------
Search time: 0.0237s
1. Score: 1.0000
   Text: what is a diabetic kidney...

2. Score: 0.3333
   Text: what does a metabolic acidosis need to reverse the condition...

3. Score: 0.2500
   Text: what is the discriminant of an equation...

4. Score: 0.2000
   Text: why conversion observed in body...

5. Score: 0.1667
   Text: diseases caused by clostridium...


  PERFORMANCE SUMMARY
------------------------------
Dense search:  0.0322s
Sparse search: 0.0119s
Hybrid search: 0.0237s&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Vector DB인 Qdrant를 설치하고 거기에 Hybrid Search를 구현해 보았습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Qdrant에서 개발한 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;fastembed 라이브러리를 활용&lt;/b&gt;&lt;/span&gt;해서 Dense와 Sparse 임베딩을 생성해 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Qdrant에서 제공하는 네이티브 RRF를 이용&lt;/b&gt;&lt;/span&gt;하여 Hybrid Search를 해보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음에는 &lt;b&gt;RRF&lt;/b&gt;에 대해서 정리해 보면서 Hybrid Search에 대해서 좀 더 정리하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[참고사이트]&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;figure id=&quot;og_1752300301861&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Qdrant - Vector Database&quot; data-og-description=&quot;Qdrant is an Open-Source Vector Database and Vector Search Engine written in Rust. It provides fast and scalable vector similarity search service with convenient API.&quot; data-og-host=&quot;qdrant.tech&quot; data-og-source-url=&quot;https://qdrant.tech&quot; data-og-url=&quot;https://qdrant.tech/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cL0qvr/hyZjmvAwCB/BUT2ySjdM2gABVj5u5W071/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640&quot;&gt;&lt;a href=&quot;https://qdrant.tech&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://qdrant.tech&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cL0qvr/hyZjmvAwCB/BUT2ySjdM2gABVj5u5W071/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Qdrant - Vector Database&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Qdrant is an Open-Source Vector Database and Vector Search Engine written in Rust. It provides fast and scalable vector similarity search service with convenient API.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;qdrant.tech&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1752300312053&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - qdrant/fastembed: Fast, Accurate, Lightweight Python library to make State of the Art Embedding&quot; data-og-description=&quot;Fast, Accurate, Lightweight Python library to make State of the Art Embedding - qdrant/fastembed&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/qdrant/fastembed&quot; data-og-url=&quot;https://github.com/qdrant/fastembed&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMOGQr/hyZjexxsmn/mb4UkvBYrYRhtkkyiYs2G1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/TwcyQ/hyZjAU0Ycn/mWq6kkO2VweN1ORkwPokdK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/qdrant/fastembed&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/qdrant/fastembed&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMOGQr/hyZjexxsmn/mb4UkvBYrYRhtkkyiYs2G1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/TwcyQ/hyZjAU0Ycn/mWq6kkO2VweN1ORkwPokdK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - qdrant/fastembed: Fast, Accurate, Lightweight Python library to make State of the Art Embedding&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Fast, Accurate, Lightweight Python library to make State of the Art Embedding - qdrant/fastembed&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>AI</category>
      <category>dense embedding</category>
      <category>embedding</category>
      <category>fastembed</category>
      <category>hybrid search</category>
      <category>qdrant</category>
      <category>rrf</category>
      <category>sparse embedding</category>
      <category>vectordb</category>
      <author>천재보단범재</author>
      <guid isPermaLink="true">https://developnote-blog.tistory.com/219</guid>
      <comments>https://developnote-blog.tistory.com/219#entry219comment</comments>
      <pubDate>Sat, 12 Jul 2025 14:23:17 +0900</pubDate>
    </item>
    <item>
      <title>[Embedding] Sparse vs Dense 임베딩</title>
      <link>https://developnote-blog.tistory.com/218</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUubr9/btsO08nslGc/HUizEkVA0XwEvOz0899oQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUubr9/btsO08nslGc/HUizEkVA0XwEvOz0899oQ1/img.png&quot; data-alt=&quot;RAG 구성 시 임베딩 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUubr9/btsO08nslGc/HUizEkVA0XwEvOz0899oQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUubr9%2FbtsO08nslGc%2FHUizEkVA0XwEvOz0899oQ1%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;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RAG 구성 시 임베딩 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Sparse vs Dense 임베딩&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;프로젝트에 투입해서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;RAG와 LLM을 활용한 자동 분류 서비스&lt;/b&gt;&lt;/span&gt;를 개발하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;처음에는 다국어를 지원하는 &lt;a href=&quot;https://huggingface.co/sentence-transformers/paraphrase-multilingual-mpnet-base-v2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;paraphrase-multilingual-mpnet-base-v2&lt;/b&gt;&lt;/span&gt;&lt;/a&gt; 임베딩 모델로 임베딩을 생성해서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Milvus에 해당 임베딩을 저장하여 RAG를 구성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1751430332400&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[LLM] RAG와 LLM을 활용한 자동 분류(1) - VectorDB 구성하기&quot; data-og-description=&quot;VectorDB 구성하기좋은 기회로 사내에서 데이터를 카테고리별로 자동 분류하는 과제를 맡게 되었습니다.엔지니어이기 때문에 분류 서비스를 만들어 본 적은 없지만,이번 기회에 다양한 것들을 도&quot; data-og-host=&quot;developnote-blog.tistory.com&quot; data-og-source-url=&quot;https://developnote-blog.tistory.com/215&quot; data-og-url=&quot;https://developnote-blog.tistory.com/215&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/brxXJh/hyZf0Z93DO/Kux2iJojpvBwjRTM3avis1/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/5tHQZ/hyZfXI7BdV/BMI0sxAjUfTqnCoJQYr9Ok/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/XM5jy/hyZfsCrp76/ZjGStOd9CcVtdP9PHbsbw0/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450&quot;&gt;&lt;a href=&quot;https://developnote-blog.tistory.com/215&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developnote-blog.tistory.com/215&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/brxXJh/hyZf0Z93DO/Kux2iJojpvBwjRTM3avis1/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/5tHQZ/hyZfXI7BdV/BMI0sxAjUfTqnCoJQYr9Ok/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/XM5jy/hyZfsCrp76/ZjGStOd9CcVtdP9PHbsbw0/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[LLM] RAG와 LLM을 활용한 자동 분류(1) - VectorDB 구성하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;VectorDB 구성하기좋은 기회로 사내에서 데이터를 카테고리별로 자동 분류하는 과제를 맡게 되었습니다.엔지니어이기 때문에 분류 서비스를 만들어 본 적은 없지만,이번 기회에 다양한 것들을 도&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developnote-blog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;RAG만 구성하면 다 될 줄 알았지만 생각보다 검색 성능이 좋지 않았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;유사 문서의 검색 성능을 높이려면 어떻게 해야 할지 고민하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그러던 중 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Sparse와 Dense를 알게 되고 Hybrid Search&lt;/b&gt;&lt;/span&gt;를 알게되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Sparse와 Dense 임베딩을 서비스에 도입하여 유사 문서 검색 성능을 높이려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 Sparse와 Dense 임베딩을 비교해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;Embedding&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;임베딩은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;텍스트를 숫자 벡터, 숫자 배열로 변환하는 기술&lt;/b&gt;&lt;/span&gt;입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;텍스트끼리는 단순 비교가 힘들지만 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;벡터로 변환하면 의미적 유사도를 계산&lt;/b&gt;&lt;/span&gt;해서 비교할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;벡터로 바꾸면 코사인 유사도, 유클리드 거리 같은 수학 공식으로 계산할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxTKYS/btsO0iR77SB/NQ3xKvR7ugNfNxkXnCu421/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxTKYS/btsO0iR77SB/NQ3xKvR7ugNfNxkXnCu421/img.png&quot; data-alt=&quot;코사인 유사도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxTKYS/btsO0iR77SB/NQ3xKvR7ugNfNxkXnCu421/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxTKYS%2FbtsO0iR77SB%2FNQ3xKvR7ugNfNxkXnCu421%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;600&quot; height=&quot;151&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;코사인 유사도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGdB7F/btsO0blCkEo/cTUbvyNEkJYejLNLN7oQDk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGdB7F/btsO0blCkEo/cTUbvyNEkJYejLNLN7oQDk/img.jpg&quot; data-alt=&quot;유클리드 거리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGdB7F/btsO0blCkEo/cTUbvyNEkJYejLNLN7oQDk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGdB7F%2FbtsO0blCkEo%2FcTUbvyNEkJYejLNLN7oQDk%2Fimg.jpg&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;600&quot; height=&quot;400&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유클리드 거리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;임베딩하는 방식은 여러 가지가 있는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 Sparse와 Dense 2가지를 비교해보려고 합니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Sparse 임베딩&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Sparse는 영어 뜻대로 하면 &lt;b&gt;'드문드문 난'&lt;/b&gt;이란 뜻입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Sparse 임베딩 모델로 나온 벡터는 대부분 0 값이 들어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;단어의 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;인덱스 값만 1이고 나머지는 0&lt;/b&gt;&lt;/span&gt;으로 들어가 있기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대신 Sparse 임베딩으로 나온 벡터는 수천에서 수백만 개의 차원을 가지게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;1000개 단어로 구성된 것이면 1000개 차원을 가지는 벡터&lt;/b&gt;&lt;/span&gt;를 만듭니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대표적으로 원핫인코딩 방법이 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래는 pandas Dataframe에서 get_dummies를 통해 원핫인코딩을 한 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1751439317006&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
import numpy as np

# 문서 데이터 예시
documents = [
    &quot;자동차 구매 가이드&quot;,
    &quot;구매 방법 추천&quot;, 
    &quot;자동차 최고 추천&quot;,
    &quot;가이드 방법&quot;
]
all_words = []
for doc in documents:
    all_words.extend(doc.split())

# DataFrame 생성
df = pd.DataFrame({'words': all_words})

# One-Hot Encoding 적용
onehot_df = pd.get_dummies(df['words'])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/seaJ8/btsO0XAwWsm/l05UdDnYvqJWknuxBHlvIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/seaJ8/btsO0XAwWsm/l05UdDnYvqJWknuxBHlvIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/seaJ8/btsO0XAwWsm/l05UdDnYvqJWknuxBHlvIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FseaJ8%2FbtsO0XAwWsm%2Fl05UdDnYvqJWknuxBHlvIK%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;390&quot; height=&quot;295&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;고차원성 (High Dimensionality)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;수천에서 수백만 차원의 벡터 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;예: 1,000개 어휘 &amp;rarr; 1,000차원 벡터&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;지역성 (Locality)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;각 단어를 독립적으로 표현&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;단어 간 공유 정보나 겹치는 부분이 거의 없음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&quot;자동차&quot;와 &quot;차량&quot;을 완전히 다른 차원으로 처리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;해석 가능성 (Interpretability)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;각 차원이 명확한 의미를 가짐 (특정 단어의 존재/부재)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;어떤 단어가 문서 검색에 기여했는지 쉽게 파악 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;주요 기법&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;One-Hot Encoding (원핫인코딩)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Bag-of-Words (BoW)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;TF-IDF (Term Frequency-Inverse Document Frequency)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이러한 특징들이 있지만 단점이 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;단어에 대해서는 파악하기 좋지만 의미적인 정보는 알기가 쉽지 않습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;문맥에 대한 정보를 파악하기 힘듭니다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이런 단점을 보완할 Dense 임베딩이 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Dense 임베딩&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Dense는 영어 뜻대로 하면&amp;nbsp;&lt;b&gt;'밀집된'&lt;/b&gt;이란 뜻입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;뜻만 봐도 Sparse와 상반된 의미라는 것을 알 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Sparse와는 다르게 벡터가 0이 아닌 실수로 이루어져 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;데이터 포인트 간의 의미적인 관계&lt;/b&gt;&lt;/span&gt;를 알 수 있도록 벡터를 만듭니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;저차원성 (Low Dimensionality)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;보통 256 ~ 1024개 차원&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;분산 표현 (Distributed&amp;nbsp;Representations)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;각 차원이 특정 의미가 아닌 전체적으로 의미를 분산 저장&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;의미적 관계&lt;/span&gt; (Semantic&amp;nbsp;Relationships)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;데이터 포인트 간의 의미적 관계를 포착&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;주요 기법&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Word2Vec&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;GloVe (Global Vectors for Word Representation)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/1810.04805&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BERT&lt;/a&gt; (Bidirectional Encoder Representations from Transformers)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;paraphrase-multilingual-mpnet-base-v2도 BERT 기반 Dense 임베딩 모델입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2가지를 비교해보자면 아래와 같이 정리해볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 126px;&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: 18px;&quot;&gt;
&lt;td style=&quot;width: 22.984496%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.937984%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Sparse 임베딩&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.077519%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Dense 임베딩&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 22.984496%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;차원 수&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.937984%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;높음 (수만~수십만 차원)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.077519%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;낮음 (50~1,000 차원)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 22.984496%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;벡터 표현&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.937984%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;대부분 값이 0&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.077519%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;대부분 실수, &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;non-zero&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 22.984496%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;의미 정보&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.937984%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;제한적, 관계 포착 어려움&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.077519%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;풍부, 의미적&amp;middot;문법적 관계 인코딩&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 22.984496%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;해석 가능성&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.937984%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;높음 (각 차원이 특정 단어)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.077519%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;낮음 (추상적 표현)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 22.984496%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;계산 효율성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.937984%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;고차원으로 인해 비효율적&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.077519%; height: 18px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;효율적, 컴팩트한 표현&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;주요 모델&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Sparse 모델&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.263566%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;#&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.426355%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;방식&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.310078%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;임베딩 모델&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.263566%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.426355%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;BM25&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.310078%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;rank-bm25&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.263566%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.426355%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;TF-IDF&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.310078%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;scikit-learn&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.263566%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.426355%; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;SPLADE&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.310078%; text-align: center;&quot;&gt;&lt;a href=&quot;https://huggingface.co/naver/splade-cocondenser-ensembledistil&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;naver/splade-cocondenser-ensembledistil&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;Dense 모델&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 72px;&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: 18px;&quot;&gt;
&lt;td style=&quot;width: 14.728682%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;#&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.263566%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;임베딩 모델&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.007751%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;특징&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 14.728682%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.263566%; height: 18px; text-align: center;&quot;&gt;&lt;a href=&quot;https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;sentence-transformers/all-MiniLM-L6-v2&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.007751%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;가장 많이 사용, 384차원&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 14.728682%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.263566%; height: 18px; text-align: center;&quot;&gt;&lt;a href=&quot;https://huggingface.co/sentence-transformers/paraphrase-multilingual-mpnet-base-v2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;sentence-transformers/paraphrase-multilingual-mpnet-base-v2&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.007751%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다국어 지원&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 14.728682%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.263566%; height: 18px; text-align: center;&quot;&gt;&lt;a href=&quot;https://huggingface.co/BAAI/bge-large-en-v1.5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;BAAI/bge-large-en-v1.5&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.007751%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;최고 성능&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Sparse와 Dense 임베딩 방식을 정리해보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2가지 임베딩 방식 모두 특징을 가지고 있어 용도에 맞게 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;챗봇이나 Q&amp;amp;A에서는 의미 파악을 위해 Dense&lt;/b&gt;&lt;/span&gt;가 좋을 수가 있고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;전&lt;/b&gt;&lt;b&gt;문적인 용어를 많이 사용한는 곳이라면 단어 기반의 Sparse&lt;/b&gt;&lt;/span&gt;가 나을 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음 포스팅에서는 Dense로만 구성했던 것을 Sparse와 Dense 2가지 임베딩을 hybrid할지 정리해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[참고사이트]&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;figure id=&quot;og_1751430815727&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;sentence-transformers/paraphrase-multilingual-mpnet-base-v2 &amp;middot; Hugging Face&quot; data-og-description=&quot;sentence-transformers/paraphrase-multilingual-mpnet-base-v2 This is a sentence-transformers model: It maps sentences &amp;amp; paragraphs to a 768 dimensional dense vector space and can be used for tasks like clustering or semantic search. Usage (Sentence-Transfor&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/sentence-transformers/paraphrase-multilingual-mpnet-base-v2&quot; data-og-url=&quot;https://huggingface.co/sentence-transformers/paraphrase-multilingual-mpnet-base-v2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/crGqkG/hyZfuAfqT2/ANree9uzLEQgxwDdkE8fKK/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/cThKRs/hyZfVLiLbC/WxFmJItCfJgXBEdSvWZJb0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/sentence-transformers/paraphrase-multilingual-mpnet-base-v2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/sentence-transformers/paraphrase-multilingual-mpnet-base-v2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/crGqkG/hyZfuAfqT2/ANree9uzLEQgxwDdkE8fKK/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/cThKRs/hyZfVLiLbC/WxFmJItCfJgXBEdSvWZJb0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;sentence-transformers/paraphrase-multilingual-mpnet-base-v2 &amp;middot; Hugging Face&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;sentence-transformers/paraphrase-multilingual-mpnet-base-v2 This is a sentence-transformers model: It maps sentences &amp;amp; paragraphs to a 768 dimensional dense vector space and can be used for tasks like clustering or semantic search. Usage (Sentence-Transfor&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1751439678934&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Dense and Sparse Embeddings: A Comprehensive Overview&quot; data-og-description=&quot;Embeddings are a foundational concept in machine learning and natural language processing (NLP). They provide a way to represent data&amp;hellip;&quot; data-og-host=&quot;mlokhandwalas.medium.com&quot; data-og-source-url=&quot;https://mlokhandwalas.medium.com/dense-and-sparse-embeddings-a-comprehensive-overview-c5f6473ee9d0&quot; data-og-url=&quot;https://mlokhandwalas.medium.com/dense-and-sparse-embeddings-a-comprehensive-overview-c5f6473ee9d0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/u99Mu/hyZfyvVvCt/5QTgLd7cW4eYBMxUjsInK1/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/zkYEq/hyZfo09uTQ/xHsT9KxP0Ka6KJZzAjlYq0/img.png?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024,https://scrap.kakaocdn.net/dn/bll9E1/hyZfDYieAQ/celixYlh9x6M31SkHEgev0/img.jpg?width=1184&amp;amp;height=664&amp;amp;face=0_0_1184_664&quot;&gt;&lt;a href=&quot;https://mlokhandwalas.medium.com/dense-and-sparse-embeddings-a-comprehensive-overview-c5f6473ee9d0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mlokhandwalas.medium.com/dense-and-sparse-embeddings-a-comprehensive-overview-c5f6473ee9d0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/u99Mu/hyZfyvVvCt/5QTgLd7cW4eYBMxUjsInK1/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/zkYEq/hyZfo09uTQ/xHsT9KxP0Ka6KJZzAjlYq0/img.png?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024,https://scrap.kakaocdn.net/dn/bll9E1/hyZfDYieAQ/celixYlh9x6M31SkHEgev0/img.jpg?width=1184&amp;amp;height=664&amp;amp;face=0_0_1184_664');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Dense and Sparse Embeddings: A Comprehensive Overview&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Embeddings are a foundational concept in machine learning and natural language processing (NLP). They provide a way to represent data&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mlokhandwalas.medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>AI</category>
      <category>bm25</category>
      <category>dense</category>
      <category>embedding</category>
      <category>Rag</category>
      <category>sparse</category>
      <category>tf-idf</category>
      <category>Vector</category>
      <author>천재보단범재</author>
      <guid isPermaLink="true">https://developnote-blog.tistory.com/218</guid>
      <comments>https://developnote-blog.tistory.com/218#entry218comment</comments>
      <pubDate>Wed, 2 Jul 2025 13:23:13 +0900</pubDate>
    </item>
    <item>
      <title>[카이제곱검정(1)] 부서별 업무 환경이 질환에 영향을 미칠까?</title>
      <link>https://developnote-blog.tistory.com/217</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xnRW0/btsOLirBDUF/lgticknbMGke5WFPzM4061/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xnRW0/btsOLirBDUF/lgticknbMGke5WFPzM4061/img.png&quot; data-alt=&quot;카이제곱 검정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xnRW0/btsOLirBDUF/lgticknbMGke5WFPzM4061/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxnRW0%2FbtsOLirBDUF%2FlgticknbMGke5WFPzM4061%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;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카이제곱 검정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;부서별 업무 환경이 질환에 영향을 미칠까?&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;프로젝트에서 데이터 분석 업무를 맡게 되었습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;그중 하나가 직원 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;건강검진 데이터를 분석&lt;/b&gt;&lt;/span&gt;하는 것이었습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;개인 정보 보안 때문에 제한된 정보만으로 분석하게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;건강검진 데이터는 아래와 같은 형태로 되어 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&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: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;연령대&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;부서&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;고혈압&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;당뇨&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;빈혈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;20대&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;A 부서&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;50대&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;B 부서&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;D1&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;C2&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center; height: 18px;&quot;&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2022년부터 데이터를 관리하기 시작해서 3년 치 정도의 데이터만 엑셀로 관리되고 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;데이터는 총 700건 정도&lt;/b&gt;&lt;/span&gt;밖에 되지 않았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;작은 데이터 셋으로도 의미 있는 인사이트를 얻을 수 있을지 고민하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터를 보고 아래와 같은 궁금증이 생겼습니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;연령대가 높을수록 질병 발생률이 높을까?&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;부서별 업무 환경이 영향을 미칠까?&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이게 단순한 우연일까? 데이터로 증명할 수 없을까?&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;이러한 궁금증을 해결하기 위해서 생각한 것이 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;카이제곱 검정(&lt;span style=&quot;color: #202122; text-align: start;&quot;&gt;chi-squared test)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;이었습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;카이제곱 검정&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;카이제곱 검정은 두 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;범주형 변수 관계에 대해 분석&lt;/b&gt;&lt;/span&gt;하는 방법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1900년에 칼 피어슨이 처음으로 고안했다고 알려져 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;관찰 데이터(observed value)와 기대한 데이터가(expected value)의 차이&lt;/b&gt;&lt;/span&gt;가 우연인가에서 시작되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;카이제곱에서 카이(Chi)는 그리스 문자로 C에 해당하며 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Contingency(우연성)에서 유래&lt;/b&gt;&lt;/span&gt;된 것입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;아래 검정 통계량에서도 편차가 핵심입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nN0R1/btsOLDCeLZo/DTQK3418JFJFk0IHwqP6i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nN0R1/btsOLDCeLZo/DTQK3418JFJFk0IHwqP6i0/img.png&quot; data-alt=&quot;카이제곱 검정 통계량 공식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nN0R1/btsOLDCeLZo/DTQK3418JFJFk0IHwqP6i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnN0R1%2FbtsOLDCeLZo%2FDTQK3418JFJFk0IHwqP6i0%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;500&quot; height=&quot;284&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카이제곱 검정 통계량 공식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;카이제곱 검정은 크게 3가지 목적으로 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 72px;&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: 18px;&quot;&gt;
&lt;td style=&quot;width: 16.162791%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;목적&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.837209%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;예시&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;가설&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 16.162791%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;적합도 검정&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.837209%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;고혈압 정상이 전체 중이 70% 정도 나올 것인가?&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;귀무가설(H0) : 관찰 분포 = 기대분포&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대립가설(H1) : 관찰 분포 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;ne; 기대분포&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 16.162791%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;동질성 검정&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.837209%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;A부서와 B부서의 고혈압 정상 비율 분포가 같은가?&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;귀무가설(H0) : 집단1 분포 = 집단2 분포&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;대립가설(H1) : 집단1 분포&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;ne; 집단2 분포&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 16.162791%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;독립성 검정&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.837209%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;부서와 고혈압 상태가 서로 관련이 있는가?&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;귀무가설(H0) : 두 변수는 독립적&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대립가설(H1) : 두 변수는 의존적&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번에는 카이제곱 검정에서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;독립성 검정&lt;/b&gt;&lt;/span&gt;을 목적으로 진행하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;왜 카이제곱 검정인가?&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;카이제곱 검정으로 검진 데이터를 분석하는 이유는 3가지입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;첫 번째는 건강검진 데이터는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;범주형 데이터로 구성&lt;/b&gt;&lt;/span&gt;되어 있습니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;연령대 : 20대, 30대, 40대, 50대 (순서형 범주)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;부서 : A 부서, B 부서, C부서 ... (명목형 범주)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;검진 결과 : 아래 코드표 참고&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k0lb4/btsOLhTKylG/cGjJ1YXZG4CADKusKbSABk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k0lb4/btsOLhTKylG/cGjJ1YXZG4CADKusKbSABk/img.png&quot; data-alt=&quot;출처 https://www.hanaromf.com/program/prog07/prog07_03.jsp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k0lb4/btsOLhTKylG/cGjJ1YXZG4CADKusKbSABk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk0lb4%2FbtsOLhTKylG%2FcGjJ1YXZG4CADKusKbSABk%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;600&quot; height=&quot;264&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 https://www.hanaromf.com/program/prog07/prog07_03.jsp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;카이제곱 검정은 이러한 범주형 데이터의 관계를 분석할 때 사용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;두 번째는 카이제곱 검정의 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;독립성 검정&lt;/b&gt;&lt;/span&gt;을 통해 위에서 제기한 궁금증에 대해서 분석할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래와 같이 귀무가설과 대립가설을 세울 수 있습니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;귀무가설(H0) : 두 변수는 독립적 -&amp;gt; '부서와 고혈압은 관계없다'&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대립가설(H1) : 두 변수는 서로 의존 -&amp;gt; '부서 업무 환경에 따라 고혈압 발생률이 다르다'&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;마지막으로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;제한된 데이터의 규모&lt;/b&gt;&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;약 700건의 적은 데이터이기 때문에 예측 모델 설계는 힘들다고 판단하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;적은 데이터로도 해당 검정을 통해 해석하기 쉬운 결과가 나올 수 있다고 판단하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;분석 실시&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;분석 가설은 아래와 같이 설정하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;부서별 건강상태 차이 : 업무 환경에 따라 특정 질병 발생률이 다를 것이다&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터 구조&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터는 크게 3가지로 구분할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;부서명은 보안 상 알파벳으로 표시하였습니다.&lt;/span&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;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;연령대 -&amp;gt; &amp;nbsp;20대, 30대, 40대, 50대&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;부서 -&amp;gt; A 부서, B&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;부서&lt;/span&gt;, C&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 부서&lt;/span&gt;, D&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 부서, E&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;부서&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;검진 항목 별 코드&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;검진 항목 -&amp;gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;간장질환, 고혈압, 당뇨, 비만, 신장질환 등&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;정상 -&amp;gt; A&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;질환 의심 -&amp;gt; C, C1, C2&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000;&quot;&gt;질환 -&amp;gt; &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000;&quot;&gt;D1, &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000;&quot;&gt;D2&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000;&quot;&gt;데이터 전처리&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000;&quot;&gt;데이터 전처리는 크게 2가지로 나눠서 진행하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000;&quot;&gt;먼저 결측치를 제거하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000;&quot;&gt;부서나 검진항목에 대한 결과 데이터가 없을 경우 제거하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000;&quot;&gt;그리고 검진 항목을 크게 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;3가지 항목(정상, 질환의심, 질환)으로 범주화하였습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1750589183633&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd

df = pd.read_csv('./검진데이터.csv')

def categorize_level(code):
    if pd.isna(code) or code == 'U':
        return None  # 결측치/미분류는 제외
    elif code in ['A', 'A(B)']:
        return '정상'
    elif code in ['C', 'C1', 'C2', 'CN']:
        return '질환의심'
    elif code in ['D1', 'D2', 'DN']:
        return '질환'
    else:
        return None
        
df[disease_category] = df[disease].apply(categorize_level)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;카이제곱 검정 시행&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;카이제곱 검정 분석에는 교차표를 가지고 분석&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;교차표는 항목을 각각 행과 열로 배열하여 교차되는 항목에 대해 빈도를 나타낸 표입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음은 부서와 고혈압에 대한 교차표 예시입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1750589911487&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd

pd.crosstab(df['부서'], df['고혈압_category'])

          정상    질환의심   질환
A부서      180      20     50    
B부서       80     140     30
..
..
..&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터가 데이터프레임 형태면 pandas에서 제공하는 함수로 쉽게 교차표를 생성할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;scipy 라이브러리를 통해서 카이제곱 검정&lt;/b&gt;&lt;/span&gt;을 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1750590230438&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
from scipy.stats import chi2_contingency

contingency_table = pd.crosstab(df['부서'], df['고혈압_category'])

chi2_stat, p_value, dof, expected = chi2_contingency(contingency_table)

print(f&quot;카이제곱 통계량: {chi2_stat:.4f}&quot;)
print(f&quot;p-value: {p_value:.4f}&quot;)
print(f&quot;자유도: {dof}&quot;)

if p_value &amp;lt; 0.05:
    print(&quot;결과: 부서와 고혈압 간에 통계적으로 유의한 관계가 있습니다!&quot;)
else:
    print(&quot;결과: 부서와 고혈압 간에 유의한 관계를 찾을 수 없습니다.&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;scipy 라이브러리에서 chi2_contingency 함수를 통해서 카이제곱&amp;nbsp;검정을 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4개의 반환값을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;chi2_stat -&amp;gt;&lt;/b&gt; 검정통계량, 실제 데이터와 독립성 가정 간의 차이 크기&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;p_value -&amp;gt; &lt;/b&gt;우연히 발생할 확률, 보통 0.05보다 작으면 귀무가설을 기각하고 증명하려던 가설이 맞다고 볼 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;dof -&amp;gt; &lt;/b&gt;자유도, 교차표에서 자유롭게 변할 수 있는 셀의 개수&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;expected -&amp;gt; &lt;/b&gt;기대빈도 행렬, 립성 가정하에서의 이론적 빈도&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;p_value가 0.05보다 낮으면 귀무가설을 기각하고 두 변수가 상관있다고 판단&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;여기에서는 부서에 따라 고혈압 질환 비율이 다르다고 판단합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이렇게 검진항목별로 부서와 교차표를 생성해서 카이제곱 검정을 실시해 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;보안 상 결과를 올리지 않겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;결과&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;'부서별 업무 환경이 질환에 영향을 미칠까'라는 질문에 대한 답을 찾기 위해 카이제곱 검정을 하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;범주형 변수들 간의 관계를 독립성 검정을 진행하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;카이제곱 검정으로 부서와 검진항목별로 독립적인지 연관이 있는지 분석해 보았습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음 포스팅에서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;사후 분석을 통해서 더 깊이 분석해 보겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;카이제곱 검정으로 관계가 유의한 지를 보았다면 이제는 구체적으로 어떤 관계인지 분석해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[참고사이트]&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;figure id=&quot;og_1750590137789&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;chi2_contingency &amp;mdash; SciPy v1.15.3 Manual&quot; data-og-description=&quot;A two-way example (2 x 3): &amp;gt;&amp;gt;&amp;gt; import numpy as np &amp;gt;&amp;gt;&amp;gt; from scipy.stats import chi2_contingency &amp;gt;&amp;gt;&amp;gt; obs = np.array([[10, 10, 20], [20, 20, 20]]) &amp;gt;&amp;gt;&amp;gt; res = chi2_contingency(obs) &amp;gt;&amp;gt;&amp;gt; res.statistic 2.7777777777777777 &amp;gt;&amp;gt;&amp;gt; res.pvalue 0.24935220877729619 &amp;gt;&amp;gt;&amp;gt; res.&quot; data-og-host=&quot;docs.scipy.org&quot; data-og-source-url=&quot;https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2_contingency.html&quot; data-og-url=&quot;https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2_contingency.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2_contingency.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2_contingency.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;chi2_contingency &amp;mdash; SciPy v1.15.3 Manual&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A two-way example (2 x 3): &amp;gt;&amp;gt;&amp;gt; import numpy as np &amp;gt;&amp;gt;&amp;gt; from scipy.stats import chi2_contingency &amp;gt;&amp;gt;&amp;gt; obs = np.array([[10, 10, 20], [20, 20, 20]]) &amp;gt;&amp;gt;&amp;gt; res = chi2_contingency(obs) &amp;gt;&amp;gt;&amp;gt; res.statistic 2.7777777777777777 &amp;gt;&amp;gt;&amp;gt; res.pvalue 0.24935220877729619 &amp;gt;&amp;gt;&amp;gt; res.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.scipy.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Analysis</category>
      <category>chi-square test</category>
      <category>scipy</category>
      <category>교차표</category>
      <category>데이터분석</category>
      <category>카이제곱검정</category>
      <author>천재보단범재</author>
      <guid isPermaLink="true">https://developnote-blog.tistory.com/217</guid>
      <comments>https://developnote-blog.tistory.com/217#entry217comment</comments>
      <pubDate>Sun, 22 Jun 2025 18:46:04 +0900</pubDate>
    </item>
    <item>
      <title>[LLM] RAG와 LLM을 활용한 자동 분류(2) - Ollama 세팅하기</title>
      <link>https://developnote-blog.tistory.com/216</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rUH5N/btsLjt3cmcl/EKuv5z4YxUuh8NqpOrLyv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rUH5N/btsLjt3cmcl/EKuv5z4YxUuh8NqpOrLyv0/img.png&quot; data-alt=&quot;RAG와 LLM을 활용한 자동 분류(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rUH5N/btsLjt3cmcl/EKuv5z4YxUuh8NqpOrLyv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrUH5N%2FbtsLjt3cmcl%2FEKuv5z4YxUuh8NqpOrLyv0%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;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RAG와 LLM을 활용한 자동 분류(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Ollama 세팅하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터를 카테고리별로 자동 분류하는 과제를 진행하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;LLM과 RAG를 활용해서 자동 분류&lt;/span&gt;&lt;/b&gt;를 진행하려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;방식을 간단하게 나열해 보면 아래와 같습니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;학습에 쓰일&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;과거 데이터를 VectorDB에 저장&lt;/span&gt;한다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;서버에 OpenSource 기반의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;LLM을 설치&lt;/span&gt;한다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;분류를 진행하려는 데이터를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;VectorDB에서 유사한 데이터&lt;/span&gt;를 찾는다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;찾은 데이터를 기반으로 프롬프트를 구성&lt;/span&gt;해서 LLM에 어떤 카테고리에 해당하는지 물어본다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이전 포스팅에서 &lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333; text-align: start;&quot;&gt;VectorDB&lt;/span&gt; 설치에 관해 정리하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734143530349&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[LLM] RAG와 LLM을 활용한 자동 분류(1) - VectorDB 구성하기&quot; data-og-description=&quot;VectorDB 구성하기좋은 기회로 사내에서 데이터를 카테고리별로 자동 분류하는 과제를 맡게 되었습니다.엔지니어이기 때문에 분류 서비스를 만들어 본 적은 없지만,이번 기회에 다양한 것들을 도&quot; data-og-host=&quot;developnote-blog.tistory.com&quot; data-og-source-url=&quot;https://developnote-blog.tistory.com/215&quot; data-og-url=&quot;https://developnote-blog.tistory.com/215&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dA8Lod/hyXOpNdtIp/k2n6ImdbsvLkVSTkswz1P1/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/03jVB/hyXOekBTue/9Z0RgETra9Ys4hzYnpBrNK/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/F9hYs/hyXKpBlSKz/dixgUUzZWAD59IpErevsBK/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450&quot;&gt;&lt;a href=&quot;https://developnote-blog.tistory.com/215&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developnote-blog.tistory.com/215&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dA8Lod/hyXOpNdtIp/k2n6ImdbsvLkVSTkswz1P1/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/03jVB/hyXOekBTue/9Z0RgETra9Ys4hzYnpBrNK/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/F9hYs/hyXKpBlSKz/dixgUUzZWAD59IpErevsBK/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[LLM] RAG와 LLM을 활용한 자동 분류(1) - VectorDB 구성하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;VectorDB 구성하기좋은 기회로 사내에서 데이터를 카테고리별로 자동 분류하는 과제를 맡게 되었습니다.엔지니어이기 때문에 분류 서비스를 만들어 본 적은 없지만,이번 기회에 다양한 것들을 도&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developnote-blog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅은 2번째 포스팅으로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;오픈소스 기반의 LLM 설치&lt;/b&gt;&lt;/span&gt;를 정리하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;LLM 모델 선택&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;LLM(Large Language Model) 개발에 대규모 자본과 투자가 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이를 감당할 수 있는 것은 빅테크 기업뿐입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;LLM이 빠르게 독점화, 권력화 되어가고 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이크로소프트가 &lt;/span&gt;GPT-3 독점 라이선스를 획득한 경우도 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734144668818&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MS, 인공지능 GPT-3 독점 라이선스 획득 - 디지털투데이 (DigitalToday)&quot; data-og-description=&quot;[디지털투데이 추현우 기자] 마이크로소프트(MS)가 인공지능 개발사인 오픈AI(OpenAI)와 협력을 통해 첨단 AI 모델 'GPT-3' 독점 라이선스를 획득했다고 23일(현지시간) 발표했다. GPT-3는 오픈A...&quot; data-og-host=&quot;www.digitaltoday.co.kr&quot; data-og-source-url=&quot;https://www.digitaltoday.co.kr/news/articleView.html?idxno=248148&quot; data-og-url=&quot;https://www.digitaltoday.co.kr/news/articleView.html?idxno=248148&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bzf9RB/hyXKn4BB5x/xYIkUgGtNXjT1DjkhDDG81/img.jpg?width=600&amp;amp;height=338&amp;amp;face=292_90_457_270,https://scrap.kakaocdn.net/dn/becPRN/hyXOex9qKo/X19KekjaogEG4knPQ9dRH0/img.jpg?width=600&amp;amp;height=338&amp;amp;face=292_90_457_270&quot;&gt;&lt;a href=&quot;https://www.digitaltoday.co.kr/news/articleView.html?idxno=248148&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.digitaltoday.co.kr/news/articleView.html?idxno=248148&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bzf9RB/hyXKn4BB5x/xYIkUgGtNXjT1DjkhDDG81/img.jpg?width=600&amp;amp;height=338&amp;amp;face=292_90_457_270,https://scrap.kakaocdn.net/dn/becPRN/hyXOex9qKo/X19KekjaogEG4knPQ9dRH0/img.jpg?width=600&amp;amp;height=338&amp;amp;face=292_90_457_270');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MS, 인공지능 GPT-3 독점 라이선스 획득 - 디지털투데이 (DigitalToday)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[디지털투데이 추현우 기자] 마이크로소프트(MS)가 인공지능 개발사인 오픈AI(OpenAI)와 협력을 통해 첨단 AI 모델 'GPT-3' 독점 라이선스를 획득했다고 23일(현지시간) 발표했다. GPT-3는 오픈A...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.digitaltoday.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하지만 이에 맞서 &lt;b&gt;&lt;a href=&quot;https://huggingface.co/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;허깅페이스&lt;/a&gt; &lt;/b&gt;중심으로 많은 오픈소스 LLM이 나오고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 88px;&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: 17px;&quot;&gt;
&lt;td style=&quot;width: 24.186%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;LLM&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.814%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;설명&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 24.186%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt; Falcon&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.814%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; UAE의 TII가 개발했으며 적은 파라미터로도 뛰어난 성능을 보여주는 리소스 효율적인 모델 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 24.186%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;BLOOM&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.814%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 프랑스 주도로 개발된 다국어 지원에 특화된 모델로, 46개 자연어와 13개 프로그래밍 언어 지원 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 24.186%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;MPT&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.814%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; MosaicML이 개발한 모델로 긴 컨텍스트 처리에 강점이 있으며 32k 토큰 길이 지원 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 24.186%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt; Mistral &lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.814%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 프랑스 Mistral AI가 개발한 7B 크기의 컴팩트한 모델로 효율성과 성능의 균형이 뛰어남 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2112&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9RHj7/btsLjnIFt5S/PoatC8eAY3JAvUJ5qUufm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9RHj7/btsLjnIFt5S/PoatC8eAY3JAvUJ5qUufm0/img.png&quot; data-alt=&quot;BLOOM&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9RHj7/btsLjnIFt5S/PoatC8eAY3JAvUJ5qUufm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9RHj7%2FbtsLjnIFt5S%2FPoatC8eAY3JAvUJ5qUufm0%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;707&quot; height=&quot;218&quot; data-origin-width=&quot;2112&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;BLOOM&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;빅테크 기업 중 하나인 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Meta에서도 &lt;a style=&quot;background-color: #f6e199;&quot; href=&quot;https://www.llama.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;llama&lt;/a&gt;라는 LLM을 오픈소스로 공개&lt;/span&gt;&lt;/b&gt;하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 llama 3.3까지(24/12/14 기준) 공개하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다른 모델들에 비해 더 적은 파라미터로 높은 성능을 달성하여 효율적인 LLM으로도 유명합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;업데이트도 빠르고 라이선스 조건도 관대해서 다양한 파생모델이 존재합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VnYqF/btsLjKp1bM5/ZemDv4Lk9KpLMtKm5jdk8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VnYqF/btsLjKp1bM5/ZemDv4Lk9KpLMtKm5jdk8K/img.png&quot; data-alt=&quot;llama 3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VnYqF/btsLjKp1bM5/ZemDv4Lk9KpLMtKm5jdk8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVnYqF%2FbtsLjKp1bM5%2FZemDv4Lk9KpLMtKm5jdk8K%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;600&quot; height=&quot;303&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;llama 3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 과제에서는 우선적으로 llama 파생 모델을 사용하려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;서울과기대 MLP연구실에서 한국어-영어 시각-언어모델 Bllossom-Vision을 공개&lt;/span&gt;&lt;/b&gt;하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 모델은 llama 3.1 모델을 기반으로 만들어졌다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;한국어 기반의 내용을 토대로 카테고리를 분류를 할 예정이라 해당 모델을 최우선적으로 선택하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Ollama 설치&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;LLM을 쉽게 사용할 수 있도록 Ollama를 설치&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; Ollama는 로컬 환경에서 AI 모델을 쉽게 실행할 수 있게 해주는 오픈소스 플랫폼입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;간단하게 로컬 환경에서 LLM을 실행할 수 있고 CLI도 비교적 쉽습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다양한 오픈소스 LLM을 지원하며 REST API 형태로 LLM를 사용할 수 있게 해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;docker compose를 활용하여 Ollama를 설치&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;open-webui를 연결해서 WEB UI 형태로도 접근&lt;/b&gt;&lt;/span&gt;할 수 있게 세팅합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734146610136&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;services:
  ollama:
    volumes:
      - ./volumes/ollama:/root/.ollama
      - /usr/bin/nvidia-smi:/usr/bin/nvidia-smi
      - /usr/lib/x86_64-linux-gnu/libnvidia-ml.so:/usr/lib/x86_64-linux-gnu/libnvidia-ml.so
      - /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1:/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
    container_name: ollama
    pull_policy: always
    tty: true
    restart: unless-stopped
    image: ollama/ollama:0.4.7
    ports:
      - 7869:11434
    environment:
      - OLLAMA_KEEP_ALIVE=24h
    networks:
      - ollama-docker
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

  ollama-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: ollama-webui
    volumes:
      - ./volumes/ollama-webui:/app/backend/data
    depends_on:
      - ollama
    ports:
      - 8080:8080
    environment: # https://docs.openwebui.com/getting-started/env-configuration#default_models
      - OLLAMA_BASE_URLS=http://host.docker.internal:7869 #comma separated ollama hosts
      - ENV=dev
      - WEBUI_AUTH=False
      - WEBUI_NAME=valiantlynx AI
      - WEBUI_URL=http://localhost:8080
      - WEBUI_SECRET_KEY=t0p-s3cr3t
    extra_hosts:
      - host.docker.internal:host-gateway
    restart: unless-stopped
    networks:
      - ollama-docker

networks:
  ollama-docker:
    external: false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;docker compose up 명령어로 실행하면 2개의 컨테이너가 실행된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고 open-webui 포트로 WEB-UI를 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734147221035&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ docker ps
fd4bffde5661   ghcr.io/open-webui/open-webui:main         &quot;bash start.sh&quot;          9 days ago   Up 9 days (healthy)   0.0.0.0:8080-&amp;gt;8080/tcp, :::8080-&amp;gt;8080/tcp                                                  ollama-webui
310eb3c663a5   ollama/ollama:0.4.7                        &quot;/bin/ollama serve&quot;      9 days ago   Up 9 days             0.0.0.0:7869-&amp;gt;11434/tcp, [::]:7869-&amp;gt;11434/tcp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;715&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z53qi/btsLiL4vzYe/Iq1R8uro85ELbbjUdjvUlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z53qi/btsLiL4vzYe/Iq1R8uro85ELbbjUdjvUlk/img.png&quot; data-alt=&quot;openweb-ui&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z53qi/btsLiL4vzYe/Iq1R8uro85ELbbjUdjvUlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz53qi%2FbtsLiL4vzYe%2FIq1R8uro85ELbbjUdjvUlk%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;800&quot; height=&quot;302&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;715&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;openweb-ui&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ChatGPT와 비슷한 화면을 제공하기 때문에 사용하기 편리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;로컬에 다양한 모델을 다운받고 원하는 대로 모델을 선택해서 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z1wl6/btsLiCNzkIl/9B3QykMtN0k0hDLW5wThTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z1wl6/btsLiCNzkIl/9B3QykMtN0k0hDLW5wThTK/img.png&quot; data-alt=&quot;open-webui에서 모델 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z1wl6/btsLiCNzkIl/9B3QykMtN0k0hDLW5wThTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz1wl6%2FbtsLiCNzkIl%2F9B3QykMtN0k0hDLW5wThTK%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;600&quot; height=&quot;340&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;open-webui에서 모델 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;허깅페이스 모델 Ollama에서 사용하기&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Ollama에서 제공하는 모델을 사용하기 위해서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;CLI로 간단하게 다운로드&lt;/b&gt;&lt;/span&gt; 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734148550928&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ollama pull llama3.1:8b

# 다운로드한 모델 리스트 확인
$ ollama list
NAME                       ID              SIZE      MODIFIED
nomic-embed-text:latest    0a109f422b47    274 MB    9 days ago
mistral:7b                 f974a74358d6    4.1 GB    9 days ago
llama3.1:8b                46e0c10c039e    4.9 GB    9 days ago

# 실행중인 모델 확인
$ ollama ps
NAME           ID              SIZE      PROCESSOR    UNTIL
llama3.1:8b    46e0c10c039e    6.9 GB    100% GPU     24 hours from now&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Ollama CLI를 통해서 쉽게 사용할 수 있지만 Ollama에서 모든 모델을 제공하지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번에 사용하려고 하는 Bllossom-Vision 모델도 허깅페이스에 업로드되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다른 프레임워크인 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;vLLM에서도 사용가능하지만 이번 포스팅에서 Ollama에서 사용할 수 있도록 세팅&lt;/b&gt;&lt;/span&gt;하겠습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;llama.app을 통해 모델 변환&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Ollama의 Modelfile을 사용해서 바꾸는 방법도 있지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;llama.app을 통해서 Ollama에서 사용할 수 있도록 변환&lt;/b&gt;&lt;/span&gt;해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734149021497&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - ggerganov/llama.cpp: LLM inference in C/C++&quot; data-og-description=&quot;LLM inference in C/C++. Contribute to ggerganov/llama.cpp development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ggerganov/llama.cpp&quot; data-og-url=&quot;https://github.com/ggerganov/llama.cpp&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dgCybv/hyXKoPY3We/VZUbX1kWwbiTu3TwoNaspk/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/ycUZl/hyXOl472x3/xmVhnOGI3X8VbzXQNVWA41/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640&quot;&gt;&lt;a href=&quot;https://github.com/ggerganov/llama.cpp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ggerganov/llama.cpp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dgCybv/hyXKoPY3We/VZUbX1kWwbiTu3TwoNaspk/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/ycUZl/hyXOl472x3/xmVhnOGI3X8VbzXQNVWA41/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - ggerganov/llama.cpp: LLM inference in C/C++&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;LLM inference in C/C++. Contribute to ggerganov/llama.cpp development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;먼저 위 Github에서 소스를 다운로드합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;소스에 있는 requirements.txt 파일 기준으로 필요한 파이썬 패키지를 설치합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;추가적으로 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;허깅페이스에서 모델을 다운로드하기 위해 huggingface_hub 패키도 설치&lt;/span&gt;&lt;/b&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734149325904&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git clone https://github.com/ggerganov/llama.cpp.git
Cloning into 'llama.cpp'...
remote: Enumerating objects: 39659, done.
remote: Counting objects: 100% (9656/9656), done.
remote: Compressing objects: 100% (559/559), done.
remote: Total 39659 (delta 9404), reused 9109 (delta 9097), pack-reused 30003 (from 1)
Receiving objects: 100% (39659/39659), 62.67 MiB | 18.65 MiB/s, done.
Resolving deltas: 100% (28930/28930), done.

$ cd llama.cpp
$ pip install -r requirements.txt
$ pip install huggingface_hub&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 파이썬 코드를 통해서 원하는 Bllossom-Vision 모델을 다운로드하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734149716226&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mkdir bllossom

$ vi download.py

from huggingface_hub import snapshot_download

model_id=&quot;Bllossom/llama-3.1-Korean-Bllossom-Vision-8B&quot;
snapshot_download(repo_id=model_id, local_dir=&quot;bllossom&quot;, local_dir_use_symlinks=False, revision=&quot;main&quot;)

$ python download.py
.gitattributes: 100%|████████████████████████████████████████████████████████████████████| 1.52k/1.52k [00:00&amp;lt;00:00, 4.78MB/s]
generation_config.json: 100%|████████████████████████████████████████████████████████████████| 143/143 [00:00&amp;lt;00:00, 2.21MB/s]
README.md: 100%|██████████████████████████████████████████████████████████████████████████| 9.53k/9.53k [00:00&amp;lt;00:00, 124MB/s]
config.json: 100%|███████████████████████████████████████████████████████████████████████| 1.35k/1.35k [00:00&amp;lt;00:00, 23.0MB/s]
model.safetensors.index.json: 100%|██████████████████████████████████████████████████████| 70.2k/70.2k [00:00&amp;lt;00:00, 3.18MB/s]
preprocessor_config.json: 100%|██████████████████████████████████████████████████████████████| 702/702 [00:00&amp;lt;00:00, 12.7MB/s]
special_tokens_map.json: 100%|███████████████████████████████████████████████████████████████| 444/444 [00:00&amp;lt;00:00, 8.62MB/s]
tokenizer_config.json: 100%|█████████████████████████████████████████████████████████████| 51.7k/51.7k [00:00&amp;lt;00:00, 17.5MB/s]
tokenizer.json: 100%|████████████████████████████████████████████████████████████████████| 9.09M/9.09M [00:01&amp;lt;00:00, 7.17MB/s]
model-00004-of-00004.safetensors: 100%|██████████████████████████████████████████████████| 1.84G/1.84G [00:45&amp;lt;00:00, 40.4MB/s]
model-00001-of-00004.safetensors:   4%|██                                                 | 199M/4.95G [00:44&amp;lt;26:27, 2.99MB/s]
model-00001-of-00004.safetensors:  11%|█████▊                                             | 566M/4.95G [01:03&amp;lt;05:03, 14.4MB/s]
model-00002-of-00004.safetensors:  47%|███████████████████████▌                          | 2.32G/4.92G [01:04&amp;lt;01:03, 41.1MB/s]
model-00003-of-00004.safetensors:  18%|████████▉                                          | 881M/5.00G [00:44&amp;lt;07:26, 9.22MB/s]
model-00003-of-00004.safetensors:  31%|███████████████▌                                  | 1.55G/5.00G [01:04&amp;lt;01:16, 44.8MB/s]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다운로드가 완료되고 해당 폴더를 확인해 보면 16GB가 정도 되는 파일들이 존재합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그중에서도 safetensors 파일 용량을 확인해 보면 눈에 띄게 큰 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;모델이 safetensors 파일 형태로 저장&lt;/b&gt;&lt;/span&gt;되어 있습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734149987151&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bllossom &amp;amp; ls -alh
drwxrwxr-x  3 manager manager 4.0K Dec 14 04:15 .cache
-rw-rw-r--  1 manager manager 1.4K Dec 14 04:15 config.json
-rw-rw-r--  1 manager manager  143 Dec 14 04:15 generation_config.json
-rw-rw-r--  1 manager manager 1.5K Dec 14 04:15 .gitattributes
-rw-rw-r--  1 manager manager 4.7G Dec 14 04:18 model-00001-of-00004.safetensors
-rw-rw-r--  1 manager manager 4.6G Dec 14 04:17 model-00002-of-00004.safetensors
-rw-rw-r--  1 manager manager 4.7G Dec 14 04:18 model-00003-of-00004.safetensors
-rw-rw-r--  1 manager manager 1.8G Dec 14 04:16 model-00004-of-00004.safetensors
-rw-rw-r--  1 manager manager  69K Dec 14 04:15 model.safetensors.index.json
-rw-rw-r--  1 manager manager  702 Dec 14 04:15 preprocessor_config.json
-rw-rw-r--  1 manager manager 9.4K Dec 14 04:15 README.md
-rw-rw-r--  1 manager manager  444 Dec 14 04:15 special_tokens_map.json
-rw-rw-r--  1 manager manager  51K Dec 14 04:15 tokenizer_config.json
-rw-rw-r--  1 manager manager 8.7M Dec 14 04:15 tokenizer.json

$ du -h -d 1 .
68K     ./.cache
16G     .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;safetensors 파일을 gguf 파일 형태로 변환해줘야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;llama.app에서 제공하는 파일 convert_hf_to_gguf.py을 통해 변환해 줍니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래와 같은 에러가 발생하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;llconvert_hf_to_gguf.py는 현재 멀티모달 모델(이미지와 텍스트를 함께 처리하는 모델)을 지원하지 않는&lt;/b&gt;&lt;/span&gt; 것을 알았습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734151255487&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python convert_hf_to_gguf.py ./bllossom \
--outfile llama-3.1-Korean-Bllossom-Vision-8B.gguf

INFO:hf-to-gguf:Loading model: bllossom
ERROR:hf-to-gguf:Model LlavaNextForConditionalGeneration is not supported&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대신 한국 기업 올거나이즈에서 llama3 기반으로 만든 모델을 변환해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734151810659&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;한국어 실무 특화  '알파-인스트럭트' LLM 오픈소스 출시&quot; data-og-description=&quot;올거나이즈는 한국어 실무에 강한 알파-인스트럭트 LLM을 오픈소스로 출시했습니다. 라마3(Llama3) 기반의 8B 모델로 한국어 이해도가 높아 문서 생성 및 요약 등의 실무에 특화돼 있습니다. Logickor &quot; data-og-host=&quot;blog-ko.allganize.ai&quot; data-og-source-url=&quot;https://blog-ko.allganize.ai/alpha-instruct-llm/&quot; data-og-url=&quot;https://blog-ko.allganize.ai/alpha-instruct-llm/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4RKi0/hyXOnWaUFU/8sxM5utmazcLEpbikenXZ1/img.png?width=1200&amp;amp;height=950&amp;amp;face=0_0_1200_950,https://scrap.kakaocdn.net/dn/bqAifq/hyXOiAyJNw/M45XVrdcokCu28Xzim2pO0/img.png?width=1200&amp;amp;height=950&amp;amp;face=0_0_1200_950,https://scrap.kakaocdn.net/dn/Fmx70/hyXOlYmeIX/bCccJkuCklzm4D2uALzKPK/img.png?width=2000&amp;amp;height=1584&amp;amp;face=0_0_2000_1584&quot;&gt;&lt;a href=&quot;https://blog-ko.allganize.ai/alpha-instruct-llm/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog-ko.allganize.ai/alpha-instruct-llm/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4RKi0/hyXOnWaUFU/8sxM5utmazcLEpbikenXZ1/img.png?width=1200&amp;amp;height=950&amp;amp;face=0_0_1200_950,https://scrap.kakaocdn.net/dn/bqAifq/hyXOiAyJNw/M45XVrdcokCu28Xzim2pO0/img.png?width=1200&amp;amp;height=950&amp;amp;face=0_0_1200_950,https://scrap.kakaocdn.net/dn/Fmx70/hyXOlYmeIX/bCccJkuCklzm4D2uALzKPK/img.png?width=2000&amp;amp;height=1584&amp;amp;face=0_0_2000_1584');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;한국어 실무 특화 '알파-인스트럭트' LLM 오픈소스 출시&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;올거나이즈는 한국어 실무에 강한 알파-인스트럭트 LLM을 오픈소스로 출시했습니다. 라마3(Llama3) 기반의 8B 모델로 한국어 이해도가 높아 문서 생성 및 요약 등의 실무에 특화돼 있습니다. Logickor&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog-ko.allganize.ai&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1734151463763&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python download.py
/home/manager/.pyenv/versions/transfer-llm/lib/python3.10/site-packages/huggingface_hub/file_download.py:834: UserWarning: `local_dir_use_symlinks` parameter is deprecated and will be ignored. The process to download files to a local folder has been updated and do not rely on symlinks anymore. You only need to pass a destination folder as`local_dir`.
For more details, check out https://huggingface.co/docs/huggingface_hub/main/en/guides/download#download-files-to-local-folder.
  warnings.warn(
README.md: 100%|█████████████████████████████████████████████████████████████████████████| 5.82k/5.82k [00:00&amp;lt;00:00, 15.3MB/s]
.gitattributes: 100%|████████████████████████████████████████████████████████████████████| 1.52k/1.52k [00:00&amp;lt;00:00, 5.11MB/s]
config.json: 100%|███████████████████████████████████████████████████████████████████████████| 772/772 [00:00&amp;lt;00:00, 1.97MB/s]
generation_config.json: 100%|█████████████████████████████████████████████████████████████████| 121/121 [00:00&amp;lt;00:00, 398kB/s]
alpha-instruct.png: 100%|███████████████████████████████████████████████████████████████████| 116k/116k [00:00&amp;lt;00:00, 667kB/s]
model.safetensors.index.json: 100%|██████████████████████████████████████████████████████| 23.9k/23.9k [00:00&amp;lt;00:00, 15.3MB/s]
special_tokens_map.json: 100%|███████████████████████████████████████████████████████████████| 350/350 [00:00&amp;lt;00:00, 5.56MB/s]
tokenizer_config.json: 100%|█████████████████████████████████████████████████████████████| 51.0k/51.0k [00:00&amp;lt;00:00, 12.0MB/s]
tokenizer.json: 100%|████████████████████████████████████████████████████████████████████| 9.09M/9.09M [00:01&amp;lt;00:00, 7.56MB/s]
model-00004-of-00004.safetensors: 100%|██████████████████████████████████████████████████| 1.17G/1.17G [01:03&amp;lt;00:00, 18.4MB/s]
model-00003-of-00004.safetensors: 100%|██████████████████████████████████████████████████| 4.92G/4.92G [01:58&amp;lt;00:00, 41.6MB/s]
model-00002-of-00004.safetensors: 100%|██████████████████████████████████████████████████| 5.00G/5.00G [02:14&amp;lt;00:00, 37.1MB/s]
model-00001-of-00004.safetensors: 100%|██████████████████████████████████████████████████| 4.98G/4.98G [04:22&amp;lt;00:00, 18.9MB/s]
Fetching 13 files: 100%|██████████████████████████████████████████████████████████████████████| 13/13 [04:23&amp;lt;00:00, 20.27s/it]

$ cd allganize/

$ ll
total 15G
drwxrwxr-x  3 manager manager 4.0K Dec 14 04:39 .
drwxrwxr-x 26 manager manager 4.0K Dec 14 04:39 ..
-rw-rw-r--  1 manager manager 114K Dec 14 04:34 alpha-instruct.png
drwxrwxr-x  3 manager manager 4.0K Dec 14 04:34 .cache
-rw-rw-r--  1 manager manager  772 Dec 14 04:34 config.json
-rw-rw-r--  1 manager manager  121 Dec 14 04:34 generation_config.json
-rw-rw-r--  1 manager manager 1.5K Dec 14 04:34 .gitattributes
-rw-rw-r--  1 manager manager 4.7G Dec 14 04:39 model-00001-of-00004.safetensors
-rw-rw-r--  1 manager manager 4.7G Dec 14 04:36 model-00002-of-00004.safetensors
-rw-rw-r--  1 manager manager 4.6G Dec 14 04:36 model-00003-of-00004.safetensors
-rw-rw-r--  1 manager manager 1.1G Dec 14 04:35 model-00004-of-00004.safetensors
-rw-rw-r--  1 manager manager  24K Dec 14 04:34 model.safetensors.index.json
-rw-rw-r--  1 manager manager 5.7K Dec 14 04:34 README.md
-rw-rw-r--  1 manager manager  350 Dec 14 04:34 special_tokens_map.json
-rw-rw-r--  1 manager manager  50K Dec 14 04:34 tokenizer_config.json
-rw-rw-r--  1 manager manager 8.7M Dec 14 04:34 tokenizer.json

$ du -h -d 1 .
68K     ./.cache
15G     .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다운로드 받은 모델을 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;llama.app에서 제공하는 파일 convert_hf_to_gguf.py을 통해&amp;nbsp;변환&lt;/b&gt;&lt;/span&gt;해 줍니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;15GB 용량의 gguf 파일을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734151601731&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python convert_hf_to_gguf.py ./allganize \
--outfile allganize-llama-3-Alpha-Ko-8B-Instruct.gguf
INFO:hf-to-gguf:Loading model: allganize
INFO:gguf.gguf_writer:gguf: This GGUF file is for Little Endian only
INFO:hf-to-gguf:Exporting model...
INFO:hf-to-gguf:gguf: loading model weight map from 'model.safetensors.index.json'
INFO:hf-to-gguf:gguf: loading model part 'model-00001-of-00004.safetensors'
INFO:hf-to-gguf:token_embd.weight,           torch.bfloat16 --&amp;gt; F16, shape = {4096, 128256}
...
...
...
INFO:hf-to-gguf:Set model quantization version
INFO:gguf.gguf_writer:Writing the following files:
INFO:gguf.gguf_writer:allganize-llama-3-Alpha-Ko-8B-Instruct.gguf: n_tensors = 291, total_size = 16.1G
Writing: 100%|█████████████████████████████████████████████████████████████████████████| 16.1G/16.1G [00:44&amp;lt;00:00, 364Mbyte/s]
INFO:hf-to-gguf:Model successfully exported to allganize-llama-3-Alpha-Ko-8B-Instruct.gguf

$ ls -alh allganize-llama-3-Alpha-Ko-8B-Instruct.gguf
-rw-rw-r-- 1 manager manager 15G Dec 14 04:46 allganize-llama-3-Alpha-Ko-8B-Instruct.gguf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;gguf 파일 기준으로 Modelfile을 생성&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;생성한 Modelfile을 기준으로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;ollama create 명령어를 통해 Ollama에 모델을 로드&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;확인해보면 Ollama에서 모델을 사용할 수 있는것으로 보입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734152439435&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Modelfile 생성
$ echo &quot;from ./allganize-llama-3-Alpha-Ko-8B-Instruct.gguf&quot; &amp;gt; ./Modelfile
$ cat Modelfile
from ./allganize-llama-3-Alpha-Ko-8B-Instruct.gguf

$ ollama create allganize-llama-3-Alpha-Ko-8B-Instruct -f ./Modelfile
transferring model data 100%
using existing layer sha256:eccccd32404b0a2a9021c8060a5cc6917446b7dae2a9c86694b51ac338a0e4cd
using autodetected template llama3-instruct
using existing layer sha256:56bb8bd477a519ffa694fc449c2413c6f0e1d3b1c88fa7e3c9d88d3ae49d4dcb
creating new layer sha256:4ff5f8289df199e76dfc9c3d0d9bc44624a351b1122a69beab262513d20e18e7
writing manifest
success

$ ollama list
NAME                                             ID              SIZE      MODIFIED
allganize-llama-3-Alpha-Ko-8B-Instruct:latest    ee863455b97f    16 GB     12 seconds ago
nomic-embed-text:latest                          0a109f422b47    274 MB    9 days ago
mistral:7b                                       f974a74358d6    4.1 GB    9 days ago
llama3.1:8b                                      46e0c10c039e    4.9 GB    9 days ago&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333; text-align: start;&quot;&gt; Bllossom-Vision 모델 세팅&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이후 찾아보니 4bit 양자화 모델은 Ollama에서 바로 활용할 수 있어서 다운로드해보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Ollama에서 서울과기대에서 만든 Bllossom 모델을 사용하려면 해당 모델을 사용하시면 될거 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734151347082&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M &amp;middot; Hugging Face&quot; data-og-description=&quot;Update! [2024.06.18] 사전학습량을 250GB까지 늘린 Bllossom ELO모델로 업데이트 되었습니다. 다만 단어확장은 하지 않았습니다. 기존 단어확장된 long-context 모델을 활용하고 싶으신분은 개인연락주세요! &quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M&quot; data-og-url=&quot;https://huggingface.co/MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/chOHyD/hyXKkUmcL9/mfd5sgubQ8KvgF8u2IUui1/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/Oqqvd/hyXOgpdhtR/mHzpPH204S7N1ZGR14KpFK/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/chOHyD/hyXKkUmcL9/mfd5sgubQ8KvgF8u2IUui1/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/Oqqvd/hyXOgpdhtR/mHzpPH204S7N1ZGR14KpFK/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M &amp;middot; Hugging Face&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Update! [2024.06.18] 사전학습량을 250GB까지 늘린 Bllossom ELO모델로 업데이트 되었습니다. 다만 단어확장은 하지 않았습니다. 기존 단어확장된 long-context 모델을 활용하고 싶으신분은 개인연락주세요!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1734152731180&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ollama pull hf.co/MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M
pulling manifest
pulling 36edb3ca5dfd... 100% ▕██████████████████████████████████████████████████████████████▏ 4.9 GB
pulling 62fbfd9ed093... 100% ▕██████████████████████████████████████████████████████████████▏  182 B
pulling b78301c0df4d... 100% ▕██████████████████████████████████████████████████████████████▏   38 B
pulling eef4a93c7add... 100% ▕██████████████████████████████████████████████████████████████▏  193 B
verifying sha256 digest
writing manifest
success

$ ollama list
NAME                                                             ID              SIZE      MODIFIED
hf.co/MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M:latest    6d4bd7f95f75    4.9 GB    6 seconds ago
allganize-llama-3-Alpha-Ko-8B-Instruct:latest                    ee863455b97f    16 GB     2 minutes ago
nomic-embed-text:latest                                          0a109f422b47    274 MB    9 days ago
mistral:7b                                                       f974a74358d6    4.1 GB    9 days ago
llama3.1:8b                                                      46e0c10c039e    4.9 GB    9 days ago&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CD3vK/btsLilk4GKI/JP9HdyLzdZu3wy0Pssc301/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CD3vK/btsLilk4GKI/JP9HdyLzdZu3wy0Pssc301/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CD3vK/btsLilk4GKI/JP9HdyLzdZu3wy0Pssc301/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCD3vK%2FbtsLilk4GKI%2FJP9HdyLzdZu3wy0Pssc301%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;600&quot; height=&quot;348&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 오픈 소스 LLM을 사용할 수 있도록 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Ollama를 설치&lt;/b&gt;&lt;/span&gt;해보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;open-webui까지 설치하여 ChatGPT와 유사한 WEB UI도 구성&lt;/b&gt;&lt;/span&gt;해보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;허깅페이스에 있는 모델을 gguf 파일로 변환&lt;/b&gt;&lt;/span&gt;하여 Ollama에서 사용할 수 있도록 해보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다양한 모델이 존재하기에 테스트해보며 적합한 모델을 선택해야 될거 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[참고사이트]&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;figure id=&quot;og_1734146292032&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Bllossom/llama-3.1-Korean-Bllossom-Vision-8B &amp;middot; Hugging Face&quot; data-og-description=&quot;Update! [2024.09.04] Bllossom의 시각-언어 preview 모델이 최초 업데이트 되었습니다. 저희 Bllossom 팀에서 llama3.1 기반의 한국어-영어 시각-언어모델 Bllossom-Vision을 공개합니다. 이번 Bllossom-Vision은 preview &quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/Bllossom/llama-3.1-Korean-Bllossom-Vision-8B&quot; data-og-url=&quot;https://huggingface.co/Bllossom/llama-3.1-Korean-Bllossom-Vision-8B&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/neyjq/hyXOc1pz9i/3h0BcZlvgk5zvGRYvwTbxk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/GZgNQ/hyXOgW2qwE/vOkbmq6f9H8zKKUQZN3M6k/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/Bllossom/llama-3.1-Korean-Bllossom-Vision-8B&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/Bllossom/llama-3.1-Korean-Bllossom-Vision-8B&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/neyjq/hyXOc1pz9i/3h0BcZlvgk5zvGRYvwTbxk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/GZgNQ/hyXOgW2qwE/vOkbmq6f9H8zKKUQZN3M6k/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bllossom/llama-3.1-Korean-Bllossom-Vision-8B &amp;middot; Hugging Face&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Update! [2024.09.04] Bllossom의 시각-언어 preview 모델이 최초 업데이트 되었습니다. 저희 Bllossom 팀에서 llama3.1 기반의 한국어-영어 시각-언어모델 Bllossom-Vision을 공개합니다. 이번 Bllossom-Vision은 preview&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1734147041048&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Ollama&quot; data-og-description=&quot;Get up and running with large language models.&quot; data-og-host=&quot;ollama.com&quot; data-og-source-url=&quot;https://ollama.com/&quot; data-og-url=&quot;https://ollama.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cjhoKu/hyXOnokXKC/K66PkdoxLgaBPwZWg9QKG0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://ollama.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ollama.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cjhoKu/hyXOnokXKC/K66PkdoxLgaBPwZWg9QKG0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ollama&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Get up and running with large language models.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ollama.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1734146642503&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...)&quot; data-og-description=&quot;User-friendly AI Interface (Supports Ollama, OpenAI API, ...) - open-webui/open-webui&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/open-webui/open-webui&quot; data-og-url=&quot;https://github.com/open-webui/open-webui&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dR4FGg/hyXKuCEu6H/1E2OIu6PfQuRbKMgiCc5p0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cIWHDS/hyXKovG3xI/MUj0v0hVZVndVfukGrmSt1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/open-webui/open-webui&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/open-webui/open-webui&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dR4FGg/hyXKuCEu6H/1E2OIu6PfQuRbKMgiCc5p0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cIWHDS/hyXKovG3xI/MUj0v0hVZVndVfukGrmSt1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;User-friendly AI Interface (Supports Ollama, OpenAI API, ...) - open-webui/open-webui&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1734149440889&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - ggerganov/llama.cpp: LLM inference in C/C++&quot; data-og-description=&quot;LLM inference in C/C++. Contribute to ggerganov/llama.cpp development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ggerganov/llama.cpp&quot; data-og-url=&quot;https://github.com/ggerganov/llama.cpp&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dgCybv/hyXKoPY3We/VZUbX1kWwbiTu3TwoNaspk/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/ycUZl/hyXOl472x3/xmVhnOGI3X8VbzXQNVWA41/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640&quot;&gt;&lt;a href=&quot;https://github.com/ggerganov/llama.cpp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ggerganov/llama.cpp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dgCybv/hyXKoPY3We/VZUbX1kWwbiTu3TwoNaspk/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/ycUZl/hyXOl472x3/xmVhnOGI3X8VbzXQNVWA41/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - ggerganov/llama.cpp: LLM inference in C/C++&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;LLM inference in C/C++. Contribute to ggerganov/llama.cpp development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1734153077902&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;한국어 실무 특화  '알파-인스트럭트' LLM 오픈소스 출시&quot; data-og-description=&quot;올거나이즈는 한국어 실무에 강한 알파-인스트럭트 LLM을 오픈소스로 출시했습니다. 라마3(Llama3) 기반의 8B 모델로 한국어 이해도가 높아 문서 생성 및 요약 등의 실무에 특화돼 있습니다. Logickor &quot; data-og-host=&quot;blog-ko.allganize.ai&quot; data-og-source-url=&quot;https://blog-ko.allganize.ai/alpha-instruct-llm/&quot; data-og-url=&quot;https://blog-ko.allganize.ai/alpha-instruct-llm/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4RKi0/hyXOnWaUFU/8sxM5utmazcLEpbikenXZ1/img.png?width=1200&amp;amp;height=950&amp;amp;face=0_0_1200_950,https://scrap.kakaocdn.net/dn/bqAifq/hyXOiAyJNw/M45XVrdcokCu28Xzim2pO0/img.png?width=1200&amp;amp;height=950&amp;amp;face=0_0_1200_950,https://scrap.kakaocdn.net/dn/Fmx70/hyXOlYmeIX/bCccJkuCklzm4D2uALzKPK/img.png?width=2000&amp;amp;height=1584&amp;amp;face=0_0_2000_1584&quot;&gt;&lt;a href=&quot;https://blog-ko.allganize.ai/alpha-instruct-llm/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog-ko.allganize.ai/alpha-instruct-llm/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4RKi0/hyXOnWaUFU/8sxM5utmazcLEpbikenXZ1/img.png?width=1200&amp;amp;height=950&amp;amp;face=0_0_1200_950,https://scrap.kakaocdn.net/dn/bqAifq/hyXOiAyJNw/M45XVrdcokCu28Xzim2pO0/img.png?width=1200&amp;amp;height=950&amp;amp;face=0_0_1200_950,https://scrap.kakaocdn.net/dn/Fmx70/hyXOlYmeIX/bCccJkuCklzm4D2uALzKPK/img.png?width=2000&amp;amp;height=1584&amp;amp;face=0_0_2000_1584');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;한국어 실무 특화 '알파-인스트럭트' LLM 오픈소스 출시&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;올거나이즈는 한국어 실무에 강한 알파-인스트럭트 LLM을 오픈소스로 출시했습니다. 라마3(Llama3) 기반의 8B 모델로 한국어 이해도가 높아 문서 생성 및 요약 등의 실무에 특화돼 있습니다. Logickor&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog-ko.allganize.ai&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI</category>
      <category>all</category>
      <category>allganize</category>
      <category>bloom</category>
      <category>GPT</category>
      <category>llama</category>
      <category>LLM</category>
      <category>MS</category>
      <category>ollama</category>
      <category>open-webui</category>
      <category>Rag</category>
      <author>천재보단범재</author>
      <guid isPermaLink="true">https://developnote-blog.tistory.com/216</guid>
      <comments>https://developnote-blog.tistory.com/216#entry216comment</comments>
      <pubDate>Sat, 14 Dec 2024 11:52:47 +0900</pubDate>
    </item>
    <item>
      <title>[LLM] RAG와 LLM을 활용한 자동 분류(1) - VectorDB 구성하기</title>
      <link>https://developnote-blog.tistory.com/215</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0GEVH/btsKUE5hWqt/kGsD3ZcQL47MT1hEmSH451/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0GEVH/btsKUE5hWqt/kGsD3ZcQL47MT1hEmSH451/img.png&quot; data-alt=&quot;RAG와 LLM을 활용한 자동 분류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0GEVH/btsKUE5hWqt/kGsD3ZcQL47MT1hEmSH451/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0GEVH%2FbtsKUE5hWqt%2FkGsD3ZcQL47MT1hEmSH451%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;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RAG와 LLM을 활용한 자동 분류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;VectorDB 구성하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;좋은 기회로 사내에서 데이터를 카테고리별로 &lt;b&gt;자동 분류하는 과제&lt;/b&gt;를 맡게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;엔지니어이기 때문에 분류 서비스를 만들어 본 적은 없지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 기회에 다양한 것들을 도전하려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그래서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;자동 분류를 RAG와 LLM을 활용&lt;/b&gt;&lt;/span&gt;해서 해보려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;방식을 간단하게 나열해 보면 아래와 같습니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;학습에 쓰일 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;과거 데이터를 VectorDB에 저장&lt;/span&gt;한다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;서버에 OpenSource 기반의 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;LLM을 설치&lt;/span&gt;한다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;분류를 진행하려는 데이터를 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;VectorDB에서 유사한 데이터&lt;/span&gt;를 찾는다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;찾은 데이터를 기반으로 프롬프트를 구성&lt;/span&gt;해서 LLM에 어떤 카테고리에 해당하는지 물어본다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;시리즈로 구성해서 위 내용들을 블로그에 정리해보려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;VectorDB를 구성하고 분류에 참고할 과거 데이터를 저장&lt;/b&gt;&lt;/span&gt;하려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Milvus 설치&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;VectorDB 중 하나인 Milvus를 설치&lt;/b&gt;&lt;/span&gt;하려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 사용하고 있는 주요 VectorDB는 아래와 같습니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; Pinecone &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; Milvus &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; Weaviate &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; Qdrant &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; Chroma &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; FAISS (Facebook AI Similarity Search) &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; pgvector&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그중에서 이번 포스팅에서는 Milvus를 사용하려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Milvus는 오픈 소스 기반이며 커뮤니티가 활발&lt;/b&gt;&lt;/span&gt;하게 이뤄지고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;분산 아키텍처로 지원으로 안정성도 확보&lt;/b&gt;&lt;/span&gt;하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;MinIO나 S3 같은 Object Storage에 데이터를 저장하는 구조라 스토리지 구성이 부담이 적습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;인덱싱 방식을 지원해서 성능을 최적화해 볼&lt;/b&gt;&lt;/span&gt; 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;쿠버네티스 환경에서도 구성할 수 있고 Milvus lite 버전이 있어 로컬 테스트용으로도 설치 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;(Milvus lite를 지원하는 OS는 Linux, MacOS입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bykrM1/btsKUDyp4mO/39hsrKxksSmL2hvKsKGNHK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bykrM1/btsKUDyp4mO/39hsrKxksSmL2hvKsKGNHK/img.jpg&quot; data-alt=&quot;Milvus architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bykrM1/btsKUDyp4mO/39hsrKxksSmL2hvKsKGNHK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbykrM1%2FbtsKUDyp4mO%2F39hsrKxksSmL2hvKsKGNHK%2Fimg.jpg&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;700&quot; height=&quot;317&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Milvus architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;docker-compose로 구성&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Milvus Standalone 버전을 docker compose로 구성해&lt;/b&gt;&lt;/span&gt;&lt;b&gt; 보겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;총 4가지 컨테이너가 실행됩니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;etcd -&amp;gt; Meta Storage&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;minio -&amp;gt; Blob Storage&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;milvus -&amp;gt; VectorDB engine&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;attu -&amp;gt; Mivus WEB UI&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Minio는 많이 사용되는 Object Storage로 &lt;b&gt;실질적인 데이터 저장소&lt;/b&gt;로 쓰이게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;etcd는 &lt;b&gt;메타정보를 저장하는 곳&lt;/b&gt;으로 쓰입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;attu는 오픈 소스로 &lt;b&gt;Milvus 관리용 툴&lt;/b&gt;입니다. WEB UI를 제공하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;적절한 path에 볼륨 설정을 한 뒤 아래 compose 파일로 실행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732344564432&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3.5'

services:
  etcd:
    container_name: milvus-etcd
    image: quay.io/coreos/etcd:v3.5.5
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_AUTO_COMPACTION_RETENTION=1000
      - ETCD_QUOTA_BACKEND_BYTES=4294967296
      - ETCD_SNAPSHOT_COUNT=50000
    volumes:
      - ./volumes/milvus/etcd:/etcd
    command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd

  minio:
    container_name: milvus-minio
    image: minio/minio:RELEASE.2023-03-20T20-16-18Z
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    volumes:
      - ./volumes/milvus/minio:/minio_data
    command: minio server /minio_data
    healthcheck:
      test: [&quot;CMD&quot;, &quot;curl&quot;, &quot;-f&quot;, &quot;http://localhost:9000/minio/health/live&quot;]
      interval: 30s
      timeout: 20s
      retries: 3

  standalone:
    container_name: milvus-standalone
    image: milvusdb/milvus:v2.3.3
    command: [&quot;milvus&quot;, &quot;run&quot;, &quot;standalone&quot;]
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
    volumes:
      - ./volumes/milvus/milvus:/var/lib/milvus
    ports:
      - &quot;19530:19530&quot;
      - &quot;9091:9091&quot;
    depends_on:
      - &quot;etcd&quot;
      - &quot;minio&quot;
  attu:
    container_name: milvus-attu
    image: zilliz/attu:v2.4.12
    environment:
      MILVUS_URL: standalone:19530
    ports:
      - &quot;8000:3000&quot;
    depends_on:
      - &quot;standalone&quot;

networks:
  default:
    name: milvus&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1732344416044&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# docker compose을 통해서 milvus 생성

$ docker-compose up -d
Creating network &quot;milvus&quot; with the default driver
Pulling etcd (quay.io/coreos/etcd:v3.5.5)...
v3.5.5: Pulling from coreos/etcd
dbba69284b27: Pull complete
270b322b3c62: Pull complete
7c21e2da1038: Pull complete
cb4f77bfee6c: Pull complete
e5485096ca5d: Pull complete
3ea3736f61e1: Pull complete
1e815a2c4f55: Pull complete
Digest: sha256:89b6debd43502d1088f3e02f39442fd3e951aa52bee846ed601cf4477114b89e
Status: Downloaded newer image for quay.io/coreos/etcd:v3.5.5
Pulling minio (minio/minio:RELEASE.2023-03-20T20-16-18Z)...
RELEASE.2023-03-20T20-16-18Z: Pulling from minio/minio
c7e856e03741: Pull complete
c1ff217ec952: Pull complete
b12cc8972a67: Pull complete
4324e307ea00: Pull complete
152089595ebc: Pull complete
05f217fb8612: Pull complete
Digest: sha256:6d770d7f255cda1f18d841ffc4365cb7e0d237f6af6a15fcdb587480cd7c3b93
Status: Downloaded newer image for minio/minio:RELEASE.2023-03-20T20-16-18Z
Pulling standalone (milvusdb/milvus:v2.3.3)...
v2.3.3: Pulling from milvusdb/milvus
d5fd17ec1767: Pull complete
0f5a22c44678: Pull complete
72ad4f350efb: Pull complete
2f5ee08a99b8: Pull complete
3fe28e251347: Pull complete
1f27396f6efc: Pull complete
fe556ec02776: Pull complete
Digest: sha256:6145db1368742b717b5a27d53cc568068308dc204d2014c70e8e8faf0869456b
Status: Downloaded newer image for milvusdb/milvus:v2.3.3
v2.4.12: Pulling from zilliz/attu
2d429b9e73a6: Pull complete
590bc9eabc7e: Pull complete
11b54226a0fa: Pull complete
465f246c24c6: Pull complete
64464083a822: Pull complete
cc991b86a68f: Pull complete
964728ba53f9: Pull complete
dc965c2a769e: Pull complete
d3769fbc79b3: Pull complete
677a81c8214c: Pull complete
0d5e29692220: Pull complete
85441f2440c0: Pull complete
9eeca687e63a: Pull complete
Digest: sha256:36a242d51dbd48e75d8378cd735807502403e4040928d77e92aefc644679855f
Status: Downloaded newer image for zilliz/attu:v2.4.12
Creating milvus-minio ... done
Creating milvus-etcd  ... done
Creating milvus-standalone ... done
Creating milvus-attu       ... done&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;attu 컨테이너에서 포워딩한 포트로 브라우저에서 확인하면 아래와 같은 화면을 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxR0b/btsKTFRe9Pz/d2ykA8Gk9HAsuSxELNX0k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxR0b/btsKTFRe9Pz/d2ykA8Gk9HAsuSxELNX0k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxR0b/btsKTFRe9Pz/d2ykA8Gk9HAsuSxELNX0k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxR0b%2FbtsKTFRe9Pz%2Fd2ykA8Gk9HAsuSxELNX0k1%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;1816&quot; height=&quot;724&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;VectorDB에 데이터 저장&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Milvus 설치가 완료되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 이제 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;LLM이 참고할 수 있도록 외부 지식을 Milvus에 저장&lt;/b&gt;&lt;/span&gt;하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;LLM에게는 외부에 있는 지식으로 표현되지만 사용자 입장에서는 내부 데이터입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Milvus 파이썬 SDK와 임베딩값을 추출하기 위해 SBERT 라이브러리를 설치합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732346308678&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ pip install pymilvus sentence-transformers&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Milvus 컬렉션 구성&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Milvus에서는 &lt;b&gt;컬렉션&lt;/b&gt;이라는 단위가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;데이터를 저장하는 기본 단위&lt;/b&gt;&lt;/span&gt;로 RDB에서 테이블과 비슷한 개념입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;필드, primary key, 인덱스&lt;/b&gt;&lt;/span&gt;를 가지고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;VectorDB이기 때문에 vector 필드를 구성할 수 있으며 dimension값을 지정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732364352151&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 필드 정의
id_field = FieldSchema(name=&quot;id&quot;, dtype=DataType.INT64, is_primary=True)
vector_field = FieldSchema(name=&quot;vector&quot;, dtype=DataType.FLOAT_VECTOR, dim=128)
age_field = FieldSchema(name=&quot;age&quot;, dtype=DataType.INT64)
name_field = FieldSchema(name=&quot;name&quot;, dtype=DataType.VARCHAR, max_length=200)

# 스키마 생성
schema = CollectionSchema(
    fields=[id_field, vector_field, age_field, name_field],
    description=&quot;User profiles collection&quot;
)

# 컬렉션 생성
collection = Collection(
    name=&quot;user_profiles&quot;, 
    schema=schema,
    using='default'
)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsWsWR/btsKToI3GiZ/vkaDciXZXySQ1kO90ONcAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsWsWR/btsKToI3GiZ/vkaDciXZXySQ1kO90ONcAk/img.png&quot; data-alt=&quot;Milvus 인덱스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsWsWR/btsKToI3GiZ/vkaDciXZXySQ1kO90ONcAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsWsWR%2FbtsKToI3GiZ%2FvkaDciXZXySQ1kO90ONcAk%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;900&quot; height=&quot;361&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Milvus 인덱스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;테스트 데이터로 VOC 데이터를 LLM을 생성해 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;내용을 보고 카테고리를 자동으로 분류&lt;/b&gt;&lt;/span&gt;하는 서비스를 만들어볼 예정입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;제목과 내용을 기반으로 임베딩을 생성하며 임베딩값을 vector 필드&lt;/b&gt;&lt;/span&gt;에 넣을 예정입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;컬렉션을 생성하면 attu WEB UI에서도 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;787&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biHdxg/btsKVwS1Ifo/1fyfir8VtAGkl0KhqRk5W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biHdxg/btsKVwS1Ifo/1fyfir8VtAGkl0KhqRk5W0/img.png&quot; data-alt=&quot;Milvus WEB UI&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biHdxg/btsKVwS1Ifo/1fyfir8VtAGkl0KhqRk5W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiHdxg%2FbtsKVwS1Ifo%2F1fyfir8VtAGkl0KhqRk5W0%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;1564&quot; height=&quot;787&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;787&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Milvus WEB UI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;SBERT로 임베딩 생성&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;분류를 하려고 하는 데이터와 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;유사한 데이터를 기반으로 프롬프트를 구성&lt;/b&gt;&lt;/span&gt;하려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;유사 데이터 기반 외부 지식이 더해진 프롬포트가 LLM에 더 좋은 결과를 얻을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;유사한 데이터를 검색하기 위해 해당 내용을 임베딩해서 VectorDB에 저장해야 합니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;이번 포스팅에서는 SBERT를 이용해서 임베딩을 생성합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;SBERT는 Sentence-BERT는 BERT를 기반으로 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;문장 임베딩을 생성하는데 특화되어 있는 모델&lt;/b&gt;&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 문장 간의 유사도를 계산하기 위한 의미 있는 문장 임베딩을 생성할 때 주로 쓰입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732365573711&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install sentence-transformers

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('sentence-transformers/paraphrase-multilingual-mpnet-base-v2')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 다국어지원이 가능하며 가장 범용적인 paraphrase-multilingual-mpnet-base-v2를 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;encode 함수를 사용하면 쉽게 임베딩값을 생성할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732366015483&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 전체 텍스트 임베딩 생성
# 제목과 내용 합치기
combined_texts = [f&quot;{title} {content}&quot;
                    for title, content in zip(df['title'], df['content'])]
# 임베딩 생성
text_vectors = model.encode(combined_texts)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;컬렉션 스키마 구성은 id, title, content, category, vector 필드입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;id값은 primary key로 자동 생성하도록 설정하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;제목(title)과 내용(content)을 기반으로 주제(category)를 자동으로 분류하려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732367641078&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 데이터 준비
titles = df['title'].tolist()
contents = df['content'].tolist()
categories = df['category'].tolist()

# 데이터 삽입
entities = [
    text_vectors.tolist(),
    titles,
    contents,
    categories
]
    
collection.insert(entities)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;성공적으로 Milvus에 데이터를 넣으면 WEB UI에서도 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uGBFt/btsKTTozmlF/pmEZwIjpgbKIF4wZKj51aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uGBFt/btsKTTozmlF/pmEZwIjpgbKIF4wZKj51aK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uGBFt/btsKTTozmlF/pmEZwIjpgbKIF4wZKj51aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuGBFt%2FbtsKTTozmlF%2FpmEZwIjpgbKIF4wZKj51aK%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;611&quot; height=&quot;528&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 RAG와 LLM을 활용해 자동분류하기 첫 번째 포스팅이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;VectorDB인 Milvus를 구성&lt;/b&gt;&lt;/span&gt;하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;SBERT를 이용해서 데이터에서 임베딩값을 생성해서 VectorDB에 저장&lt;/b&gt;&lt;/span&gt;하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음 포스팅에서는 오픈 소스 기반의 LLM을 서버에 구축해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[참고사이트]&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;figure id=&quot;og_1732346239412&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;WebSite&quot; data-og-title=&quot;Run Milvus with Docker Compose | Milvus Documentation&quot; data-og-description=&quot;Learn how to install Milvus standalone with Docker Compose. | v2.4.x&quot; data-og-host=&quot;milvus.io&quot; data-og-source-url=&quot;https://milvus.io/docs/install_standalone-docker-compose.md&quot; data-og-url=&quot;https://milvus.io/docs/install_standalone-docker-compose.md&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KeaCk/hyXzIhatwl/O4ehJUkxkKoIqKKFWHZJOk/img.png?width=3600&amp;amp;height=1881&amp;amp;face=0_0_3600_1881&quot;&gt;&lt;a href=&quot;https://milvus.io/docs/install_standalone-docker-compose.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://milvus.io/docs/install_standalone-docker-compose.md&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KeaCk/hyXzIhatwl/O4ehJUkxkKoIqKKFWHZJOk/img.png?width=3600&amp;amp;height=1881&amp;amp;face=0_0_3600_1881');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Run Milvus with Docker Compose | Milvus Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to install Milvus standalone with Docker Compose. | v2.4.x&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;milvus.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1732362503386&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - zilliztech/attu: The GUI for Milvus&quot; data-og-description=&quot;The GUI for Milvus. Contribute to zilliztech/attu development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/zilliztech/attu&quot; data-og-url=&quot;https://github.com/zilliztech/attu&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/NKnkv/hyXC77r3sj/ycCZQvNxnEytE9gcrBHHbk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/MDR2I/hyXzQzvyAC/aY5oR4B0zvmkFYCRjbbyxK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/zilliztech/attu&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/zilliztech/attu&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/NKnkv/hyXC77r3sj/ycCZQvNxnEytE9gcrBHHbk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/MDR2I/hyXzQzvyAC/aY5oR4B0zvmkFYCRjbbyxK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - zilliztech/attu: The GUI for Milvus&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The GUI for Milvus. Contribute to zilliztech/attu development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1732362556187&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;SentenceTransformers Documentation &amp;mdash; Sentence Transformers  documentation&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.sbert.net&quot; data-og-source-url=&quot;https://www.sbert.net/&quot; data-og-url=&quot;https://www.sbert.net/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/WbwD4/hyXzO9eqkD/HmgvMo2KiReoAQXrkYGMUK/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://www.sbert.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.sbert.net/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/WbwD4/hyXzO9eqkD/HmgvMo2KiReoAQXrkYGMUK/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SentenceTransformers Documentation &amp;mdash; Sentence Transformers documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.sbert.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>AI</category>
      <category>bert</category>
      <category>collection</category>
      <category>kubernetes</category>
      <category>LLM</category>
      <category>MILVUS</category>
      <category>Prompt</category>
      <category>Rag</category>
      <category>SBERT</category>
      <category>Vector</category>
      <category>vectordb</category>
      <author>천재보단범재</author>
      <guid isPermaLink="true">https://developnote-blog.tistory.com/215</guid>
      <comments>https://developnote-blog.tistory.com/215#entry215comment</comments>
      <pubDate>Sat, 23 Nov 2024 15:48:51 +0900</pubDate>
    </item>
    <item>
      <title>[Trino] 너의 흔적을 기록하고 싶어 - 히스토리 데이터 영구 저장</title>
      <link>https://developnote-blog.tistory.com/214</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M95TB/btsKOc2Utis/6gh7GkIZM1p2V6tOknp9K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M95TB/btsKOc2Utis/6gh7GkIZM1p2V6tOknp9K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M95TB/btsKOc2Utis/6gh7GkIZM1p2V6tOknp9K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM95TB%2FbtsKOc2Utis%2F6gh7GkIZM1p2V6tOknp9K1%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;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Trino 히스토리 데이터 영구 저장&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;사내에서 빅데이터 쿼리에 뛰어난 성능을 보여주는 Trino를 활용하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;빅데이터 쿼리뿐만 아니라 다른 데이터베이스의 데이터끼리 조인이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;쿠버네티스 환경에 Trino를 구성해서 사용&lt;/b&gt;&lt;/span&gt;하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다만 한 가지 문제가 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;presto 기반의 쿼리 엔진이라 메모리를 사용해서 로그성 데이터가 남지 않았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;따로 벡엔드 데이터베이스를 가지지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Trino에서 쿼리 한 이력을 확인하는데 큰 제약&lt;/b&gt;&lt;/span&gt;이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하지만 방법은 없는 것이 아닙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Trino에서 쿼리 이력을 저장할 수 있도록 제공해 주는데 따로 설정이 필요&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 Trino에서 쿼리 이력을 따로 저장하는 방법을 정리하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Trino WEB UI&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 쿠버네티스에서 Trino를 구성하는 것을 정리하지 않겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;구성하는 방법은 아래 포스팅을 참고해 주시길 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731823697179&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Trino 한번 써보겠습니다(1) - Kubernetes에 Trino 설치&quot; data-og-description=&quot;Trino 한번 써보겠습니다(1) RDB에서 데이터를 조회할 때 SQL를 통해 조회하였습니다. 데이터는 방대해져서 빅데이터가 생겼고, RDB뿐만 아니라 Storage의 종류도 다양해졌습니다. 데이터 조회는 다양&quot; data-og-host=&quot;developnote-blog.tistory.com&quot; data-og-source-url=&quot;https://developnote-blog.tistory.com/179&quot; data-og-url=&quot;https://developnote-blog.tistory.com/179&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/crD8TN/hyXzO73owF/2rkbKxQViOOWtusWe3yqtk/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/fWrg9/hyXwhKicKV/1gYRWcKNn4OljUloUKspEk/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/eccKXL/hyXzO73ouT/Gt2nRuIjuKGDG6KdestK2k/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450&quot;&gt;&lt;a href=&quot;https://developnote-blog.tistory.com/179&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developnote-blog.tistory.com/179&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/crD8TN/hyXzO73owF/2rkbKxQViOOWtusWe3yqtk/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/fWrg9/hyXwhKicKV/1gYRWcKNn4OljUloUKspEk/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/eccKXL/hyXzO73ouT/Gt2nRuIjuKGDG6KdestK2k/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Trino 한번 써보겠습니다(1) - Kubernetes에 Trino 설치&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Trino 한번 써보겠습니다(1) RDB에서 데이터를 조회할 때 SQL를 통해 조회하였습니다. 데이터는 방대해져서 빅데이터가 생겼고, RDB뿐만 아니라 Storage의 종류도 다양해졌습니다. 데이터 조회는 다양&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developnote-blog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;helm를 통해 쿠버네티스에서 쉽게 구성이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;물론 운영시에는 리소스 관리, 쿼리 옵션 등 디테일한 설정들이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731823882648&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# helm을 통해서 trino를 쿠버네티스에 구성
$ helm install trino -n trino --create-namespace -f values-overrides.yaml ./
NAME: trino
LAST DEPLOYED: Sun Nov 17 05:52:25 2024
NAMESPACE: trino
STATUS: deployed
REVISION: 1
NOTES:
Get the application URL by running these commands:
  export NODE_PORT=$(kubectl get --namespace trino -o jsonpath=&quot;{.spec.ports[0].nodePort}&quot; services trino)
  export NODE_IP=$(kubectl get nodes --namespace trino -o jsonpath=&quot;{.items[0].status.addresses[0].address}&quot;)
  echo http://$NODE_IP:$NODE_PORT
  
  
# 구성한 trino 확인  
$ kubectl get all -n trino
NAME                                     READY   STATUS    RESTARTS   AGE
pod/trino-coordinator-55c78798c9-bskql   1/1     Running   0          3m46s
pod/trino-worker-f7d84cbf9-7wb7j         1/1     Running   0          3m46s

NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/trino          NodePort    10.101.139.23   &amp;lt;none&amp;gt;        8080:30450/TCP   3m46s
service/trino-worker   ClusterIP   None            &amp;lt;none&amp;gt;        8080/TCP         3m46s

NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/trino-coordinator   1/1     1            1           3m46s
deployment.apps/trino-worker        1/1     1            1           3m46s

NAME                                           DESIRED   CURRENT   READY   AGE
replicaset.apps/trino-coordinator-55c78798c9   1         1         1       3m46s
replicaset.apps/trino-worker-f7d84cbf9         1         1         1       3m46s

NAME                                               REFERENCE                 TARGETS                                     MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/trino-worker   Deployment/trino-worker   memory: &amp;lt;unknown&amp;gt;/80%, cpu: &amp;lt;unknown&amp;gt;/20%   1         3         1          3m46s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Trino를 구성하면 바로 WEB UI를 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 이미지가 NodePort로 통해 외부에서 접속한 Trino WEB UI입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;보안 설정을 따로 하지 않았기 때문에 패스워드 없이 유저명을 무작위로 넣어서 접속 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSvbfX/btsKKRdV9Ad/VDu7Qt3BcQsGhgp29klmAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSvbfX/btsKKRdV9Ad/VDu7Qt3BcQsGhgp29klmAk/img.png&quot; data-alt=&quot;trino web login&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSvbfX/btsKKRdV9Ad/VDu7Qt3BcQsGhgp29klmAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSvbfX%2FbtsKKRdV9Ad%2FVDu7Qt3BcQsGhgp29klmAk%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;600&quot; height=&quot;381&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;trino web login&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;쿼리 툴인 &lt;a href=&quot;https://dbeaver.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Dbeaver&lt;/a&gt;로 Trino에 접속해서 쿼리 해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwMhH7/btsKL08VK6V/QfyN4cYKdEXsPxYihhiZYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwMhH7/btsKL08VK6V/QfyN4cYKdEXsPxYihhiZYK/img.png&quot; data-alt=&quot;dbeaver로 trino에 query&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwMhH7/btsKL08VK6V/QfyN4cYKdEXsPxYihhiZYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwMhH7%2FbtsKL08VK6V%2FQfyN4cYKdEXsPxYihhiZYK%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;600&quot; height=&quot;126&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dbeaver로 trino에 query&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;쿼리 결과를 Trino WEB UI에서 확인이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;백엔드 데이터베이스는 없지만 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;쿼리 이력을 메모리에 일부 저장하여 확인&lt;/b&gt;&lt;/span&gt;할 수 있게 해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8b6OQ/btsKLuCxf5B/n8EQ8MeU3vvj2b0CQYxY2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8b6OQ/btsKLuCxf5B/n8EQ8MeU3vvj2b0CQYxY2K/img.png&quot; data-alt=&quot;Trino WEB UI에서 쿼리 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8b6OQ/btsKLuCxf5B/n8EQ8MeU3vvj2b0CQYxY2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8b6OQ%2FbtsKLuCxf5B%2Fn8EQ8MeU3vvj2b0CQYxY2K%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;600&quot; height=&quot;476&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Trino WEB UI에서 쿼리 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;쿼리 아이디를 클릭하면 해당 쿼리의 상세한 정보를 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgJoAd/btsKMZ2jkmL/x0wEKctXS6UHYUfbMNphE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgJoAd/btsKMZ2jkmL/x0wEKctXS6UHYUfbMNphE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgJoAd/btsKMZ2jkmL/x0wEKctXS6UHYUfbMNphE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgJoAd%2FbtsKMZ2jkmL%2Fx0wEKctXS6UHYUfbMNphE1%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;600&quot; height=&quot;386&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;관리자 입장에서 정말 유용한 기능입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다만 쿼리 이력은 메모리에서 관리되기 때문에 최신 데이터만 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;기본 설정에서는 영구적으로 저장하지 않습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;쿼리 이력이 얼마나 저장되는지는 아래 2가지 옵션값에 따라 달라집니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;query.max-history&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;query.min-expire-age&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;query.max-history&lt;/b&gt;는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;이력 데이터를 몇 개까지 저장할 것인가&lt;/b&gt;&lt;/span&gt;이며 디폴트값은 100입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;query.min-expire-age&lt;/b&gt;는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;이력 데이터 저장 만료 시간&lt;/b&gt;&lt;/span&gt;을 나타내며 디폴트값은 15분입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;메모리에 활용하기 때문에 많은 데이터를 저장하고 있을 수 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Trino Event Listener&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;쿼리 이력을 15분 기준으로만 본다면 이슈가 터지면 15분 만에 해결해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그렇다고 시간을 늘려서 메모리 사용률을 높이는 것은 부담이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Trino에서 &lt;b&gt;Event Listener&lt;/b&gt;가 있어 해당 문제를 해결할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Trino에서 발생하는 이벤트에 대해서 리슨하고 있다가 필요한 후속 작업을 진행&lt;/b&gt;&lt;/span&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Trino 464 버전 기준으로 아래와 같은 Event Listener를 제공합니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;HTTP Event Listener&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Kafka Event Listener&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;MySQL Event Listener&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;OpenLineage Event Listener&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;MySQL Event Listener를 활용해서 쿼리 이력 데이터를 MySQL에 저장&lt;/b&gt;&lt;/span&gt;하려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;MySQL Event Listener&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;MySQL에 Trino 이력 데이터를 넣을 데이터베이스와 접속할 유저를 생성해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;MySQL 접속 정보를 Trino Event Listener 설정에 세팅해 주면&lt;/b&gt;&lt;/span&gt; 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 Trino를 쿠버네티스에 Helm으로 구성하였기 때문에,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Helm values.yaml에 Event Listener 설정 값을 넣어줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732022377702&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;eventListenerProperties:
- event-listener.name=mysql
- mysql-event-listener.db.url=jdbc:mysql://mysql-service.trino.svc.cluster.local:3306/trino?user=trino&amp;amp;password=trino&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;values.yaml을 수정하고 helm upgrade 하게 되면 configmap값에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;event-listener.properties 부분이 추가되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732022582963&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ kubectl get cm -n trino trino-coordinator -o yaml
apiVersion: v1
data:
  config.properties: |
    coordinator=true
    node-scheduler.include-coordinator=false
    http-server.http.port=8080
    query.max-memory=4GB
    query.max-memory-per-node=1GB
    discovery.uri=http://localhost:8080
  event-listener.properties: |
    event-listener.name=mysql
    mysql-event-listener.db.url=jdbc:mysql://mysql-service.trino.svc.cluster.local:3306/trino?user=trino&amp;amp;password=trino&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;MySQL에 해당 데이터베이스에 접속하면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;trino_queries 테이블이 생성&lt;/b&gt;&lt;/span&gt;되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;873&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3jUoF/btsKO8ewY2p/cTTwO5kONMnJUfl06d8Knk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3jUoF/btsKO8ewY2p/cTTwO5kONMnJUfl06d8Knk/img.png&quot; data-alt=&quot;MySQL Trino history 테이블&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3jUoF/btsKO8ewY2p/cTTwO5kONMnJUfl06d8Knk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3jUoF%2FbtsKO8ewY2p%2FcTTwO5kONMnJUfl06d8Knk%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;600&quot; height=&quot;484&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;873&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MySQL Trino history 테이블&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;MySQL Event Listener 세팅이 끝났으니 Trino에 쿼리를 날려보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;쿼리 후 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;MySQL trino_queries 테이블을 확인해 보면 쿼리 이력 데이터가 저장&lt;/b&gt;&lt;/span&gt;된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uCp3n/btsKOKybpjp/TkHdrhQKyxHTj4cDXG4st0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uCp3n/btsKOKybpjp/TkHdrhQKyxHTj4cDXG4st0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uCp3n/btsKOKybpjp/TkHdrhQKyxHTj4cDXG4st0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuCp3n%2FbtsKOKybpjp%2FTkHdrhQKyxHTj4cDXG4st0%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;1229&quot; height=&quot;407&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;trino_queries 테이블의 데이터는 WEB UI에서 확인한 쿼리 데이터와 동일합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 Trino 쿼리 이력 데이터를 영구 저장하는 방법을 정리해 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기본 설정에서는 메모리에 일부만 가지고 있어 제한 사항이 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;MySQL Event Listener 설정을 통해서 MySQL에 Trino 쿼리 이력을 별도로 저장&lt;/b&gt;&lt;/span&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Kafka Event Listener도 있기 때문에 Kafka에 저장 후 다양하게 활용&lt;/b&gt;&lt;/span&gt;하는 것도 좋을 거 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[참고사이트]&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;figure id=&quot;og_1731823737592&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Web UI &amp;mdash; Trino 464 Documentation&quot; data-og-description=&quot;Web UI Trino provides a web-based user interface (UI) for monitoring a Trino cluster and managing queries. The Web UI is accessible on the coordinator via HTTP or HTTPS, using the corresponding port number specified in the coordinator Config properties. It&quot; data-og-host=&quot;trino.io&quot; data-og-source-url=&quot;https://trino.io/docs/current/admin/web-interface.html#configuring-query-history&quot; data-og-url=&quot;https://trino.io/docs/current/admin/web-interface.html#configuring-query-history&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://trino.io/docs/current/admin/web-interface.html#configuring-query-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://trino.io/docs/current/admin/web-interface.html#configuring-query-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Web UI &amp;mdash; Trino 464 Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Web UI Trino provides a web-based user interface (UI) for monitoring a Trino cluster and managing queries. The Web UI is accessible on the coordinator via HTTP or HTTPS, using the corresponding port number specified in the coordinator Config properties. It&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;trino.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1731823806903&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Query management properties &amp;mdash; Trino 464 Documentation&quot; data-og-description=&quot;query.max-history The maximum number of queries to keep in the query history to provide statistics and other information. If this amount is reached, queries are removed based on age.&quot; data-og-host=&quot;trino.io&quot; data-og-source-url=&quot;https://trino.io/docs/current/admin/properties-query-management.html&quot; data-og-url=&quot;https://trino.io/docs/current/admin/properties-query-management.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://trino.io/docs/current/admin/properties-query-management.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://trino.io/docs/current/admin/properties-query-management.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Query management properties &amp;mdash; Trino 464 Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;query.max-history The maximum number of queries to keep in the query history to provide statistics and other information. If this amount is reached, queries are removed based on age.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;trino.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Data</category>
      <category>DBeaver</category>
      <category>event-listener</category>
      <category>kubernetes</category>
      <category>MySQL</category>
      <category>query</category>
      <category>Trino</category>
      <author>천재보단범재</author>
      <guid isPermaLink="true">https://developnote-blog.tistory.com/214</guid>
      <comments>https://developnote-blog.tistory.com/214#entry214comment</comments>
      <pubDate>Sun, 17 Nov 2024 15:10:51 +0900</pubDate>
    </item>
    <item>
      <title>[Terraform] AWS EKS 한 번에 올리기(1) - VPC 구성</title>
      <link>https://developnote-blog.tistory.com/213</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TqesX/btsKvApx0Zl/Bz5Lvt7894t3dwRyG0awdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TqesX/btsKvApx0Zl/Bz5Lvt7894t3dwRyG0awdK/img.png&quot; data-alt=&quot;Terraform - VPC 구성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TqesX/btsKvApx0Zl/Bz5Lvt7894t3dwRyG0awdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTqesX%2FbtsKvApx0Zl%2FBz5Lvt7894t3dwRyG0awdK%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;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Terraform - VPC 구성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AWS EKS 한 번에 올리기(1)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이전에 Terraform을 통해서 Kubernetes 클러스터를 한 번에 구성한 적이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AWS EC2 인스턴스를 여러 개 생성해서 클러스터를 구성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730819413088&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;명령어 한 번에 Kubernetes 설치하기 - Terraform으로 Kubernetes 설치&quot; data-og-description=&quot;명령어 한 번에 Kubernetes 설치하기 개발 환경을 자주 구성하다 보니 Kubernetes Cluster를 구성하는 일이 많았습니다. Kubernetes Cluster 구성은 단계도 많고 쉽지 않아 할 때마다 새로웠습니다. 구성을 간&quot; data-og-host=&quot;developnote-blog.tistory.com&quot; data-og-source-url=&quot;https://developnote-blog.tistory.com/170&quot; data-og-url=&quot;https://developnote-blog.tistory.com/170&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QLOoD/hyXsYRgqHf/IxmctQ7GeAHCMmBQGtEoT1/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/EgjQn/hyXsREzmit/oMqpT32oD3VJ0zqKuWPtXk/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/de8oji/hyXsTPUweO/q3LLx7LrsQP2QtRXULzhB1/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450&quot;&gt;&lt;a href=&quot;https://developnote-blog.tistory.com/170&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developnote-blog.tistory.com/170&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QLOoD/hyXsYRgqHf/IxmctQ7GeAHCMmBQGtEoT1/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/EgjQn/hyXsREzmit/oMqpT32oD3VJ0zqKuWPtXk/img.jpg?width=1920&amp;amp;height=1281&amp;amp;face=0_0_1920_1281,https://scrap.kakaocdn.net/dn/de8oji/hyXsTPUweO/q3LLx7LrsQP2QtRXULzhB1/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;명령어 한 번에 Kubernetes 설치하기 - Terraform으로 Kubernetes 설치&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;명령어 한 번에 Kubernetes 설치하기 개발 환경을 자주 구성하다 보니 Kubernetes Cluster를 구성하는 일이 많았습니다. Kubernetes Cluster 구성은 단계도 많고 쉽지 않아 할 때마다 새로웠습니다. 구성을 간&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developnote-blog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;EC2 인스턴스에 kubeadm를 이용해서 클러스터를 구성하였는데, AWS EKS라는 서비스가 존재합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Terraform을 통해서 AWS EKS를 손쉽게 구성해 보도록&lt;/b&gt;&lt;/span&gt; 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅은 테라폼을 사용할 줄 아시는 분이 독자라 생각하고 작성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;What is EKS?&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;EKS는 Elastic Kubernetes Service입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;명칭대로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;AWS에서 제공하는 쿠버네티스 서비스&lt;/b&gt;&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AWS 콘솔에서 손쉽게 구성할 수 있으며 다른 AWS 서비스와 쉽게 통합이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;쿠버네티스 클러스터에서 컨트롤 플레인 컴포넌트들은 Worker 노트와 Pod를 관리하는 중요한 역할을 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjqIiC/btsKChYfDnD/n3wZ2QRm7iLigoQgmYlPFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjqIiC/btsKChYfDnD/n3wZ2QRm7iLigoQgmYlPFk/img.jpg&quot; data-alt=&quot;Kubernetse Control Plane&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjqIiC/btsKChYfDnD/n3wZ2QRm7iLigoQgmYlPFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjqIiC%2FbtsKChYfDnD%2Fn3wZ2QRm7iLigoQgmYlPFk%2Fimg.jpg&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;600&quot; height=&quot;281&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Kubernetse Control Plane&lt;/figcaption&gt;
&lt;/figure&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;kube-apiserver&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;etcd&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;kube-scheduler&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;kube-controller-manager&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;cloud-controller-manager&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;EKS는 위 컨트롤 플레인 컴포넌트들을 직접 구성하지 않고 쿠버네티스 환경을 경험&lt;/b&gt;&lt;/span&gt;할 수 있게 해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;사용자는 쿠버네티스 클러스터 관리 리소스를 최소화할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;클러스터 규모도 자동으로 조정해 주기 때문에 리소스 관리 비용도 최소화할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BqXK4/btsKD5Iic48/Kgv0kZREhNDdNaeTSbKhEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BqXK4/btsKD5Iic48/Kgv0kZREhNDdNaeTSbKhEk/img.png&quot; data-alt=&quot;AWS EKS&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BqXK4/btsKD5Iic48/Kgv0kZREhNDdNaeTSbKhEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBqXK4%2FbtsKD5Iic48%2FKgv0kZREhNDdNaeTSbKhEk%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;600&quot; height=&quot;259&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AWS EKS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Terraform으로 VPC 구성&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 테라폼을 활용하여 VPC를 구성해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;VPC는 Virtual Private Cloud로 논리적으로 격리된 가상 네트워크&lt;/b&gt;&lt;/span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;EKS용 VPC를 구성하여 EKS에 실행되는 서비스를 보안적으로 안전하게 구성&lt;/b&gt;&lt;/span&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;퍼블릭 서브넷, 프라이빗 서브넷을 VPC에 구성해서 안전하게 구성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;내부 통신만 필요한 것은 프라이빗 서브넷에 두어 외부에서 접근하지 못하도록 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;AWS 권한 설정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;테라폼으로 구성하기 전에 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;AWS 권한 설정이 필요&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;VPC를 구성할 수 있는 권한이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AWS 콘솔 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;IAM 메뉴에서 AmazonEC2FullAcess 권한을 가진 유저를 생성&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;유저 생성 시 만들어지는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;accesskey, secretkey를 따로 저장&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxQcJO/btsKDO7QTJD/MmBNMTjbBPnnRvbL5mLPkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxQcJO/btsKDO7QTJD/MmBNMTjbBPnnRvbL5mLPkK/img.png&quot; data-alt=&quot;AWS IAM - 유저 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxQcJO/btsKDO7QTJD/MmBNMTjbBPnnRvbL5mLPkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxQcJO%2FbtsKDO7QTJD%2FMmBNMTjbBPnnRvbL5mLPkK%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;1269&quot; height=&quot;121&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AWS IAM - 유저 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;테라폼을 실행할 서버에 AWS credentials 파일을 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;credentials 파일에 명시된 유저의 권한으로 테라폼이 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731206043178&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[eks]
aws_access_key_id = ************
aws_secret_access_key = ************************************&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Terraform code&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;VPC 구성을 위한 테라폼 코드(tf 파일)는 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;VPC만 생성하는 것이 아니라 VPC 내에 필요한 구성요소들이 명시되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 요소들이 아래 테라폼으로 구성됩니다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;VPC&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;public subnet, private subnet&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;elastic IP&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;internet gateway&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;nat gateway&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;route table&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1730638076201&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
  shared_credentials_files = [&quot;.aws/credentials&quot;]
  profile = &quot;eks&quot;
}

locals {
  azs             = [&quot;ap-northeast-2a&quot;, &quot;ap-northeast-2b&quot;, &quot;ap-northeast-2c&quot;]
  private_subnets = [&quot;10.0.1.0/24&quot;, &quot;10.0.2.0/24&quot;, &quot;10.0.3.0/24&quot;]
  public_subnets  = [&quot;10.0.101.0/24&quot;, &quot;10.0.102.0/24&quot;, &quot;10.0.103.0/24&quot;]
}

resource &quot;aws_vpc&quot; &quot;eks_vpc&quot; {
  cidr_block = &quot;10.0.0.0/16&quot;
  enable_dns_hostnames = true

  tags = {
    Name = &quot;eks-vpc&quot;
  }
}

resource &quot;aws_subnet&quot; &quot;eks_private_subnets&quot; {
  count      = length(local.private_subnets)
  vpc_id     = aws_vpc.eks_vpc.id
  cidr_block = local.private_subnets[count.index]
  availability_zone = local.azs[count.index]

  tags = {
    Name = &quot;eks-vpc-private-subnet-${count.index}&quot;
  }
}

resource &quot;aws_subnet&quot; &quot;eks_public_subnets&quot; {
  count      = length(local.public_subnets)
  vpc_id     = aws_vpc.eks_vpc.id
  cidr_block = local.public_subnets[count.index]
  availability_zone = local.azs[count.index]
  map_public_ip_on_launch = true

  tags = {
    Name = &quot;eks-vpc-public-subnet-${count.index}&quot;
  }
}

resource &quot;aws_eip&quot; &quot;lb&quot; {
  domain = &quot;vpc&quot;

  tags = {
    Name = &quot;eks-eip-lb&quot;
  }
}

resource &quot;aws_internet_gateway&quot; &quot;gw&quot; {
  vpc_id = aws_vpc.eks_vpc.id

  tags = {
    Name = &quot;eks-igw&quot;
  }
}

resource &quot;aws_nat_gateway&quot; &quot;ng&quot; {
  allocation_id = aws_eip.lb.id
  subnet_id = aws_subnet.eks_public_subnets[0].id

  tags = {
    Name = &quot;eks-nat-gateway&quot;
  }
}

resource &quot;aws_route_table&quot; &quot;public_route_table&quot; {
  vpc_id = aws_vpc.eks_vpc.id

  route {
    cidr_block = &quot;0.0.0.0/0&quot;
    gateway_id = aws_internet_gateway.gw.id
  }

  tags = {
    Name = &quot;eks-public-route-table&quot;
  }
}

resource &quot;aws_route_table&quot; &quot;private_route_table&quot; {
  vpc_id = aws_vpc.eks_vpc.id

  route {
    cidr_block = &quot;0.0.0.0/0&quot;
    nat_gateway_id = aws_nat_gateway.ng.id
  }

  tags = {
    Name = &quot;eks-private-route-table&quot;
  }
}

resource &quot;aws_route_table_association&quot; &quot;a&quot; {
  count = length(aws_subnet.eks_public_subnets)

  subnet_id      = aws_subnet.eks_public_subnets[count.index].id
  route_table_id = aws_route_table.public_route_table.id
}

resource &quot;aws_route_table_association&quot; &quot;b&quot; {
  count = length(aws_subnet.eks_private_subnets)

  subnet_id      = aws_subnet.eks_private_subnets[count.index].id
  route_table_id = aws_route_table.private_route_table.id
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;테라폼 코드 부분별로 간단하게 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AWS Provider를 통해 테라폼에서 AWS 리소스들을 생성할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oHfcy/btsKDcaCeiw/VKEhZG5dvyDxDZrPN3U1ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oHfcy/btsKDcaCeiw/VKEhZG5dvyDxDZrPN3U1ok/img.png&quot; data-alt=&quot;terraform aws provider&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oHfcy/btsKDcaCeiw/VKEhZG5dvyDxDZrPN3U1ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoHfcy%2FbtsKDcaCeiw%2FVKEhZG5dvyDxDZrPN3U1ok%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;600&quot; height=&quot;172&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;terraform aws provider&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;리소스를 생성할 리전과 credentials 파일 위치를 설정하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;변수 설정에서는 생성할 VPC내 가용영역과 IP대역대를 지정하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 VPC에는 3개의 가용영역에 각각 퍼블릭 서브넷과 프라이빗 서브넷을 구성할 예정입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731206396555&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;provider &quot;aws&quot; {
  region = &quot;ap-northeast-2&quot;
  shared_credentials_files = [&quot;.aws/credentials&quot;]
  profile = &quot;eks&quot;
}

locals {
  azs             = [&quot;ap-northeast-2a&quot;, &quot;ap-northeast-2b&quot;, &quot;ap-northeast-2c&quot;]
  private_subnets = [&quot;10.0.1.0/24&quot;, &quot;10.0.2.0/24&quot;, &quot;10.0.3.0/24&quot;]
  public_subnets  = [&quot;10.0.101.0/24&quot;, &quot;10.0.102.0/24&quot;, &quot;10.0.103.0/24&quot;]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음은 VPC와 서브넷 구성입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;VPC 대역대를 10.0.0.0/16으로 지정하여 IP를 여유롭게 사용&lt;/b&gt;&lt;/span&gt;할 수 있도록 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;DNS 호스트 네임을 활성해서 퍼블릭 IP주소가 할당될 때 DNS 주소를 제공하도록 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;서브넷 대역대는 VPC 대역대 내에서 잘 분할하여 설정&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3개의 가용영역에 적절하게 분배해서 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731206855641&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_vpc&quot; &quot;eks_vpc&quot; {
  cidr_block = &quot;10.0.0.0/16&quot;
  enable_dns_hostnames = true

  tags = {
    Name = &quot;eks-vpc&quot;
  }
}

resource &quot;aws_subnet&quot; &quot;eks_private_subnets&quot; {
  count      = length(local.private_subnets)
  vpc_id     = aws_vpc.eks_vpc.id
  cidr_block = local.private_subnets[count.index]
  availability_zone = local.azs[count.index]

  tags = {
    Name = &quot;eks-vpc-private-subnet-${count.index}&quot;
  }
}

resource &quot;aws_subnet&quot; &quot;eks_public_subnets&quot; {
  count      = length(local.public_subnets)
  vpc_id     = aws_vpc.eks_vpc.id
  cidr_block = local.public_subnets[count.index]
  availability_zone = local.azs[count.index]
  map_public_ip_on_launch = true

  tags = {
    Name = &quot;eks-vpc-public-subnet-${count.index}&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;외부에서 접근할 수 있도록 EIP(Elastic IP)를 생성하여 고정 퍼블릭 IP를 만듭니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;인터넷 게이트웨이를 생성하여 VPC과 인터넷 간의 통신이 가능하도록 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;NAT 게이트웨이를 통해 프라이빗 서브넷에서도 인터넷을 접근(아웃바운드)할 수 있도록 생성&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0m26Y/btsKCllHuf6/chmd8e0s38rZc6WZVTknkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0m26Y/btsKCllHuf6/chmd8e0s38rZc6WZVTknkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0m26Y/btsKCllHuf6/chmd8e0s38rZc6WZVTknkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0m26Y%2FbtsKCllHuf6%2Fchmd8e0s38rZc6WZVTknkK%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;500&quot; height=&quot;439&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1731239010677&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_eip&quot; &quot;lb&quot; {
  domain = &quot;vpc&quot;

  tags = {
    Name = &quot;eks-eip-lb&quot;
  }
}

resource &quot;aws_internet_gateway&quot; &quot;gw&quot; {
  vpc_id = aws_vpc.eks_vpc.id

  tags = {
    Name = &quot;eks-igw&quot;
  }
}

resource &quot;aws_nat_gateway&quot; &quot;ng&quot; {
  allocation_id = aws_eip.lb.id
  subnet_id = aws_subnet.eks_public_subnets[0].id

  tags = {
    Name = &quot;eks-nat-gateway&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;라우트 테이블 생성하여 퍼블릭 서브넷과 프라이빗 서브넷에 맞춰서 연결합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731239471657&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resource &quot;aws_route_table&quot; &quot;public_route_table&quot; {
  vpc_id = aws_vpc.eks_vpc.id

  route {
    cidr_block = &quot;0.0.0.0/0&quot;
    gateway_id = aws_internet_gateway.gw.id
  }

  tags = {
    Name = &quot;eks-public-route-table&quot;
  }
}

resource &quot;aws_route_table&quot; &quot;private_route_table&quot; {
  vpc_id = aws_vpc.eks_vpc.id

  route {
    cidr_block = &quot;0.0.0.0/0&quot;
    nat_gateway_id = aws_nat_gateway.ng.id
  }

  tags = {
    Name = &quot;eks-private-route-table&quot;
  }
}

resource &quot;aws_route_table_association&quot; &quot;a&quot; {
  count = length(aws_subnet.eks_public_subnets)

  subnet_id      = aws_subnet.eks_public_subnets[count.index].id
  route_table_id = aws_route_table.public_route_table.id
}

resource &quot;aws_route_table_association&quot; &quot;b&quot; {
  count = length(aws_subnet.eks_private_subnets)

  subnet_id      = aws_subnet.eks_private_subnets[count.index].id
  route_table_id = aws_route_table.private_route_table.id
}&lt;/code&gt;&lt;/pre&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;테라폼 실행&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;테라폼 코드 작성이 완료되었으면 테라폼을 실행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;테라폼으로 AWS 리소스를 생성하기 전 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;init 명령어를 통해 로컬에 aws provider를 설치&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730636763496&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ terraform init

.terraform/providers/registry.terraform.io/hashicorp/aws&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;apply 명령어를 통해 테라폼 코드를 작성한대로 AWS 리소스를 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730634405342&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ terraform apply

Plan: 18 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_vpc.eks_vpc: Creating...
aws_eip.lb: Creating...
aws_eip.lb: Creation complete after 1s [id=eipalloc-0c438a05dbfb516c9]
aws_vpc.eks_vpc: Still creating... [10s elapsed]
aws_vpc.eks_vpc: Creation complete after 12s [id=vpc-08546d14e33143fc2]
aws_internet_gateway.gw: Creating...
aws_subnet.eks_public_subnets[2]: Creating...
aws_subnet.eks_public_subnets[0]: Creating...
aws_subnet.eks_private_subnets[2]: Creating...
aws_subnet.eks_private_subnets[0]: Creating...
aws_subnet.eks_private_subnets[1]: Creating...
aws_subnet.eks_public_subnets[1]: Creating...
aws_internet_gateway.gw: Creation complete after 1s [id=igw-0925ec8acc4cf4eb9]
aws_route_table.public_route_table: Creating...
aws_subnet.eks_private_subnets[0]: Creation complete after 1s [id=subnet-0dc7696400c64ee6a]
aws_subnet.eks_private_subnets[1]: Creation complete after 1s [id=subnet-0ad16d11e629ea4fc]
aws_subnet.eks_private_subnets[2]: Creation complete after 1s [id=subnet-002dc8a5f514902ab]
aws_route_table.public_route_table: Creation complete after 0s [id=rtb-0edf0e378dcac2344]
aws_subnet.eks_public_subnets[0]: Still creating... [10s elapsed]
aws_subnet.eks_public_subnets[2]: Still creating... [10s elapsed]
aws_subnet.eks_public_subnets[1]: Still creating... [10s elapsed]
aws_subnet.eks_public_subnets[0]: Creation complete after 11s [id=subnet-0716da3c33da7d83b]
aws_nat_gateway.ng: Creating...
aws_subnet.eks_public_subnets[1]: Creation complete after 11s [id=subnet-0a22fde8e2c65d603]
aws_subnet.eks_public_subnets[2]: Creation complete after 11s [id=subnet-05d18452d0c126bb8]
aws_route_table_association.a[0]: Creating...
aws_route_table_association.a[2]: Creating...
aws_route_table_association.a[1]: Creating...
aws_route_table_association.a[0]: Creation complete after 1s [id=rtbassoc-084e25393b0fede4a]
aws_route_table_association.a[1]: Creation complete after 1s [id=rtbassoc-071910372228a5d37]
aws_route_table_association.a[2]: Creation complete after 1s [id=rtbassoc-0883eabf4615e371b]
aws_nat_gateway.ng: Still creating... [10s elapsed]
aws_nat_gateway.ng: Still creating... [20s elapsed]
aws_nat_gateway.ng: Still creating... [30s elapsed]
aws_nat_gateway.ng: Still creating... [40s elapsed]
aws_nat_gateway.ng: Still creating... [50s elapsed]
aws_nat_gateway.ng: Still creating... [1m0s elapsed]
aws_nat_gateway.ng: Still creating... [1m10s elapsed]
aws_nat_gateway.ng: Still creating... [1m20s elapsed]
aws_nat_gateway.ng: Still creating... [1m30s elapsed]
aws_nat_gateway.ng: Still creating... [1m40s elapsed]
aws_nat_gateway.ng: Still creating... [1m50s elapsed]
aws_nat_gateway.ng: Still creating... [2m0s elapsed]
aws_nat_gateway.ng: Still creating... [2m10s elapsed]
aws_nat_gateway.ng: Creation complete after 2m14s [id=nat-0f1e77a57fae54110]
aws_route_table.private_route_table: Creating...
aws_route_table.private_route_table: Creation complete after 1s [id=rtb-0688a4d80ce4e125f]
aws_route_table_association.b[0]: Creating...
aws_route_table_association.b[1]: Creating...
aws_route_table_association.b[2]: Creating...
aws_route_table_association.b[0]: Creation complete after 1s [id=rtbassoc-0b1cef740bd15a0b0]
aws_route_table_association.b[2]: Creation complete after 1s [id=rtbassoc-0705d817199bc9013]
aws_route_table_association.b[1]: Still creating... [10s elapsed]
aws_route_table_association.b[1]: Creation complete after 14s [id=rtbassoc-024f88f74a71b09ef]

Apply complete! Resources: 18 added, 0 changed, 0 destroyed.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정상적으로 생성이 되었으면 AWS 콘솔에서 VPC 생성이 확인 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;EKS용 VPC가 생성되었고 3개의 가용영역에 각각 2개의 서브넷이 생성된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOHczC/btsKuwNHfjy/fjHJbbU38YkqkMblrhcxEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOHczC/btsKuwNHfjy/fjHJbbU38YkqkMblrhcxEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOHczC/btsKuwNHfjy/fjHJbbU38YkqkMblrhcxEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOHczC%2FbtsKuwNHfjy%2FfjHJbbU38YkqkMblrhcxEk%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;1408&quot; height=&quot;436&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;퍼블릭 서브넷 3개, 프라이빗 서브넷 3개 총 6개의 서브넷이 생성된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;각 서브넷 대역대가 겹치지 않는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAeBjl/btsKuTuXfEX/VaaLtygNcnbEKKGC70nqq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAeBjl/btsKuTuXfEX/VaaLtygNcnbEKKGC70nqq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAeBjl/btsKuTuXfEX/VaaLtygNcnbEKKGC70nqq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAeBjl%2FbtsKuTuXfEX%2FVaaLtygNcnbEKKGC70nqq1%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;1206&quot; height=&quot;186&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;라우트 테이브에 보면 각 인터넷 게이트웨이와 NAT 게이트웨이 설정된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qAlt4/btsKuTPigQi/dUE157khkLcWorkXS9tEdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qAlt4/btsKuTPigQi/dUE157khkLcWorkXS9tEdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qAlt4/btsKuTPigQi/dUE157khkLcWorkXS9tEdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqAlt4%2FbtsKuTPigQi%2FdUE157khkLcWorkXS9tEdK%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;600&quot; height=&quot;183&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cojWzI/btsKvm4DAaW/KdtzWuZMN0JrzOdL2ZB6i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cojWzI/btsKvm4DAaW/KdtzWuZMN0JrzOdL2ZB6i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cojWzI/btsKvm4DAaW/KdtzWuZMN0JrzOdL2ZB6i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcojWzI%2FbtsKvm4DAaW%2FKdtzWuZMN0JrzOdL2ZB6i1%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;600&quot; height=&quot;175&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;프라이빗 서브넷에 EC2를 생성해보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;EC2가 생성되고 퍼블릭 IP가 설정되어 있지 않은 것을 확인&lt;/b&gt;&lt;/span&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1393&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/40sot/btsKvgQ2SSx/K9xs1i8SrciZtZ3ppAWKRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/40sot/btsKvgQ2SSx/K9xs1i8SrciZtZ3ppAWKRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/40sot/btsKvgQ2SSx/K9xs1i8SrciZtZ3ppAWKRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F40sot%2FbtsKvgQ2SSx%2FK9xs1i8SrciZtZ3ppAWKRK%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;700&quot; height=&quot;328&quot; data-origin-width=&quot;1393&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6kEs6/btsKutjh9O2/OPCK3QlTIkHR1NYaJlW6SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6kEs6/btsKutjh9O2/OPCK3QlTIkHR1NYaJlW6SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6kEs6/btsKutjh9O2/OPCK3QlTIkHR1NYaJlW6SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6kEs6%2FbtsKutjh9O2%2FOPCK3QlTIkHR1NYaJlW6SK%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;700&quot; height=&quot;362&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정리&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;테라폼을 통해 AWS VPC를 구성해 보았습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;VPC를 위한 테라폼 코드를 작성해 보면서 VPC의 구성요소에 대해 정리해 볼 수 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음 포스팅에서는 테라폼을 통해 AWS EKS를 구성해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[참고사이트]&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;figure id=&quot;og_1730637824733&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Install Terraform | Terraform | HashiCorp Developer&quot; data-og-description=&quot;Install Terraform on Mac, Linux, or Windows by downloading the binary or using a package manager (Homebrew or Chocolatey). Then create a Docker container locally by following a quick-start tutorial to check that Terraform installed correctly.&quot; data-og-host=&quot;developer.hashicorp.com&quot; data-og-source-url=&quot;https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli&quot; data-og-url=&quot;https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buYtAE/hyXsTIodrR/5XioiIKowYXWxWG4Ky7zNK/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800,https://scrap.kakaocdn.net/dn/MKQQ4/hyXpDf9xQS/kdoyyJVG64dI07nB7tGD91/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800&quot;&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buYtAE/hyXsTIodrR/5XioiIKowYXWxWG4Ky7zNK/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800,https://scrap.kakaocdn.net/dn/MKQQ4/hyXpDf9xQS/kdoyyJVG64dI07nB7tGD91/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Install Terraform | Terraform | HashiCorp Developer&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Install Terraform on Mac, Linux, or Windows by downloading the binary or using a package manager (Homebrew or Chocolatey). Then create a Docker container locally by following a quick-start tutorial to check that Terraform installed correctly.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.hashicorp.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;figure id=&quot;og_1730637769255&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Terraform Registry&quot; data-og-description=&quot;&quot; data-og-host=&quot;registry.terraform.io&quot; data-og-source-url=&quot;https://registry.terraform.io/providers/hashicorp/aws/latest&quot; data-og-url=&quot;https://registry.terraform.io/providers/hashicorp/aws/latest&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://registry.terraform.io/providers/hashicorp/aws/latest&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://registry.terraform.io/providers/hashicorp/aws/latest&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Terraform Registry&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;registry.terraform.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1731201490158&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Amazon EKS란 무엇입니까? - Amazon EKS&quot; data-og-description=&quot;이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/what-is-eks.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/what-is-eks.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dqMFei/hyXsZ4q6W8/qxcDcfgKEWVVtqAS0GZ5a0/img.png?width=1678&amp;amp;height=724&amp;amp;face=0_0_1678_724&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/what-is-eks.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/what-is-eks.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dqMFei/hyXsZ4q6W8/qxcDcfgKEWVVtqAS0GZ5a0/img.png?width=1678&amp;amp;height=724&amp;amp;face=0_0_1678_724');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Amazon EKS란 무엇입니까? - Amazon EKS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1731207385621&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS] VPC를 생성할 때 고려할 점.&quot; data-og-description=&quot;클라우드 사용하는 목적이 무엇이 됐건 VPC(Virtual Private Cloud)를 생성하는 것이 가장 기본이 아닌가 싶다. VPC를 만들고자 한다면 크게 다음 4가지를 거쳐야 한다. VPC라는 가상의 데이터센터를 생성&quot; data-og-host=&quot;bosungtea9416.tistory.com&quot; data-og-source-url=&quot;https://bosungtea9416.tistory.com/entry/AWS-VPC%EB%A5%BC-%EC%83%9D%EC%84%B1%ED%95%A0-%EB%95%8C-%EA%B3%A0%EB%A0%A4%ED%95%A0-%EC%A0%90&quot; data-og-url=&quot;https://bosungtea9416.tistory.com/entry/AWS-VPC%EB%A5%BC-%EC%83%9D%EC%84%B1%ED%95%A0-%EB%95%8C-%EA%B3%A0%EB%A0%A4%ED%95%A0-%EC%A0%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dd7XmL/hyXsWUeqY3/iQImPPOPKKOQBydptXs6r1/img.png?width=800&amp;amp;height=479&amp;amp;face=0_0_800_479,https://scrap.kakaocdn.net/dn/bk5HK8/hyXs0CjroM/rKPwyiMVdfkkgfSWeHcaTK/img.png?width=800&amp;amp;height=479&amp;amp;face=0_0_800_479,https://scrap.kakaocdn.net/dn/btYhae/hyXsUoyumc/Uo4wVFIsG8b2yM8ZuK2NoK/img.jpg?width=880&amp;amp;height=880&amp;amp;face=0_0_880_880&quot;&gt;&lt;a href=&quot;https://bosungtea9416.tistory.com/entry/AWS-VPC%EB%A5%BC-%EC%83%9D%EC%84%B1%ED%95%A0-%EB%95%8C-%EA%B3%A0%EB%A0%A4%ED%95%A0-%EC%A0%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bosungtea9416.tistory.com/entry/AWS-VPC%EB%A5%BC-%EC%83%9D%EC%84%B1%ED%95%A0-%EB%95%8C-%EA%B3%A0%EB%A0%A4%ED%95%A0-%EC%A0%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dd7XmL/hyXsWUeqY3/iQImPPOPKKOQBydptXs6r1/img.png?width=800&amp;amp;height=479&amp;amp;face=0_0_800_479,https://scrap.kakaocdn.net/dn/bk5HK8/hyXs0CjroM/rKPwyiMVdfkkgfSWeHcaTK/img.png?width=800&amp;amp;height=479&amp;amp;face=0_0_800_479,https://scrap.kakaocdn.net/dn/btYhae/hyXsUoyumc/Uo4wVFIsG8b2yM8ZuK2NoK/img.jpg?width=880&amp;amp;height=880&amp;amp;face=0_0_880_880');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS] VPC를 생성할 때 고려할 점.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클라우드 사용하는 목적이 무엇이 됐건 VPC(Virtual Private Cloud)를 생성하는 것이 가장 기본이 아닌가 싶다. VPC를 만들고자 한다면 크게 다음 4가지를 거쳐야 한다. VPC라는 가상의 데이터센터를 생성&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bosungtea9416.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Cloud</category>
      <category>AWS</category>
      <category>eks</category>
      <category>ELB</category>
      <category>gateway</category>
      <category>Internet</category>
      <category>NAT</category>
      <category>subnet</category>
      <category>Terraform</category>
      <category>VPC</category>
      <author>천재보단범재</author>
      <guid isPermaLink="true">https://developnote-blog.tistory.com/213</guid>
      <comments>https://developnote-blog.tistory.com/213#entry213comment</comments>
      <pubDate>Sun, 3 Nov 2024 20:48:05 +0900</pubDate>
    </item>
  </channel>
</rss>