<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>이 시대의 진정한 야인.이되겠.어</title>
    <link>https://iapaalst.tistory.com/</link>
    <description>이 블로그는 공부하면서 내용을 정리해두는 공간입니다. 
혹시나 글을 보시고 도움이 되셨다면 완전 Lucky~ 
(공부 중 작성한 글이라 일부 내용이 부정확할 수 있어요! 참고용으로 봐주세요)</description>
    <language>ko</language>
    <pubDate>Sat, 4 Apr 2026 22:35:24 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>iapaalst</managingEditor>
    <image>
      <title>이 시대의 진정한 야인.이되겠.어</title>
      <url>https://tistory1.daumcdn.net/tistory/7093847/attach/a062c0df245a4c68b52b2dfad954285a</url>
      <link>https://iapaalst.tistory.com</link>
    </image>
    <item>
      <title>네트워크 Bonding이란?</title>
      <link>https://iapaalst.tistory.com/34</link>
      <description>&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. Bonding이란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Bonding은 일반적으로 &lt;b&gt;네트워크 인터페이스 카드(NIC)의 이중화를 의미합니다. &lt;/b&gt;이는 하나이상의 물리적인 NIC를 논리적으로 묶어 하나의 단일 인터페이스처럼 작동하게 하는 기술입니다. &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 네트워크 장애 발생 시 자동으로 다른 NIC로 트래픽을 전환하여, 연결이 끊기는 상황을 방지하기 위함입니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 왜 이중화를 해야 할까?&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이중화는 특정 구성 요소의 장애 발생 시에도 전체 시스템이 중단 없이 정상적으로 작동하도록 여분의 구성 요소를 마련해 두는 전략입니다. 특히 네트워크 통신과 같이 서비스 연속성에 필수적인 부분에서는 이중화가 매우 중요합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하드웨어 관점에서 서버를 생각해보면,&amp;nbsp; CPU, 메모리, 디스크와 같은 핵심 요소들은 물론, 외부 네트워크와의 연결을 담당하는 &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;NIC 또한 매우 중요합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;NIC 단일 구성의 문제점:&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약 서버에 NIC가 하나만 연결되어 있다고 가정해 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1751370208969&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    [서버]
  ┌─────────────┐
  │             │
  │   NIC 1     │──────┐
  └─────────────┘      │
                       ▼
                  [스위치]
                       │
                       ▼
              [외부 네트워크]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;케이블 고장:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NIC와 스위치 사이의 연결 케이블이 손상되거나 분리될 경우&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스위치 고장:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;서버가 연결된 스위치에 장애가 발생할 경우&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NIC 고장:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;서버 자체의 NIC에 하드웨어적인 결함이 발생할 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위와 같은 상황에서 서버가 네트워크와 완전히 단절되어 서비스가 중단되는 심각한 문제가 발생합니다. 이는 비즈니스 연속성에 치명적인 영향을 미칠 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Bonding (NIC 이중화)의 해결책:&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751369754674&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    [서버]
  ┌─────────────┐
  │             │
  │  NIC 1      │────┐
  │             │    │
  │  NIC 2      │────┼───┐
  └─────────────┘    │   │
                     ▼   ▼
               [스위치1] [스위치2]
                   │       │
                   ▼       ▼
                 [ 외부 네트워크 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;465&quot; data-start=&quot;427&quot;&gt;&lt;b&gt;NIC 1 / NIC 2&lt;/b&gt;: 각각 독립된 물리 네트워크 카드&lt;/li&gt;
&lt;li data-end=&quot;517&quot; data-start=&quot;466&quot;&gt;&lt;b&gt;Bonding 구성&lt;/b&gt;: 두 NIC를 하나의 논리적 인터페이스(Bond0 등)로 묶음&lt;/li&gt;
&lt;li data-end=&quot;572&quot; data-start=&quot;518&quot;&gt;&lt;b&gt;스위치도 이중화&lt;/b&gt; 가능: LACP 또는 Active-Backup 모드에 따라 구성 달라짐&lt;/li&gt;
&lt;li data-end=&quot;606&quot; data-start=&quot;573&quot;&gt;장애 발생 시 &lt;b&gt;자동으로 다른 NIC로 트래픽 전환&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이러한 문제에 대한 해결책으로, 서버에 NIC를 하나 더 추가하고 이들을 Bonding으로 묶습니다. 이렇게 하면 다음과 같은 이점을 ㄹ얻을 수 있습니다.&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;장애 허용 (Fault Tolerance):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;첫 번째 NIC, 연결 케이블, 또는 스위치 중 어느 하나에 장애가 발생하더라도, Bonding으로 묶인 다른 NIC가 자동으로 네트워크 통신을 인계받아 서비스가 끊기지 않고 계속 제공됩니다. (NIC는 여러 개를 구성할 수 있습니다.)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서비스 안정성 및 가용성 향상:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;네트워크 연결이 항상 유지되므로, 서버의 안정성과 서비스 가용성이 크게 향상됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위와 같은 문제가 발생하면 서버의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;전체 네트워크 통신이 중단&lt;/b&gt;될 수 있습니다. 이를 방지하기 위해 NIC를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;2개 이상 구성하여 이중화&lt;/b&gt;하는 것이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결론적으로,&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이중화 = Bonding&lt;/li&gt;
&lt;li&gt;Bonding = 이중화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;즉, Bonding은 네트워크 통신의 핵심 구성 요소인 NIC에 대한 이중화를 구현하여 서버 안정성(가용성)을 확보하기 위한 필수적인 기술입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Cloud(Infra)/용어 정리</category>
      <author>iapaalst</author>
      <guid isPermaLink="true">https://iapaalst.tistory.com/34</guid>
      <comments>https://iapaalst.tistory.com/34#entry34comment</comments>
      <pubDate>Tue, 1 Jul 2025 21:16:39 +0900</pubDate>
    </item>
    <item>
      <title>[OpenStack]OpenStack 구조와 컴포넌트 정리</title>
      <link>https://iapaalst.tistory.com/33</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;들어가며&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 처음에는 &amp;ldquo;오픈스택(OpenStack)&amp;rdquo;이 하나의 큰 기업 이름인 줄 알았습니다.4 전공 수업과 부트캠프를 거쳤지만 오픈스택을 직접 다뤄볼 기회는 없었고, 곧 시작될 인턴 업무에서 OpenStack 기반 인스턴스 관리를 맡게 될 예정이라 미리 오픈스택을 공부하고 빠르게 이해하기 위해 정리한 글입니다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;오픈스택? 그게 뭐야? &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenStack은 원래 &lt;b&gt;NASA와 Rackspace&lt;/b&gt;가 공동으로 개발하던 클라우드 프로젝트를&lt;br /&gt;&lt;b&gt;오픈소스로 공개하면서 시작된 인프라 플랫폼&lt;/b&gt;입니다. 현재는 Red Hat, HP, Intel, VMware 등&lt;br /&gt;수많은 글로벌 기업들이 기여하고 있는 오픈소스 프로젝트로 성장했죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;553&quot; data-start=&quot;531&quot; data-ke-size=&quot;size16&quot;&gt;오픈스택은 다음과 같은 특징을 지닙니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;660&quot; data-start=&quot;555&quot;&gt;&lt;b&gt;풀링된 가상 자원&lt;/b&gt;(컴퓨팅, 스토리지, 네트워크 등)을 기반으로&lt;br /&gt;&lt;b&gt;Private 또는 Public Cloud&lt;/b&gt; 환경을 구축하고 운영할 수 있게 해주는 오픈소스 플랫폼&lt;/li&gt;
&lt;li data-end=&quot;724&quot; data-start=&quot;661&quot;&gt;여러 자원들을 통합해 &lt;b&gt;제어 및 운영&lt;/b&gt;할 수 있도록 돕는 일종의 &lt;b&gt;Cloud OS(클라우드 운영체제)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 오픈스택은 서버, 스토리지, 네트워크 자원을 모두 가상화해서&lt;br /&gt;&lt;b&gt;필요한 사용자에게 적절히 할당하고, 대시보드나 API를 통해 조작할 수 있게 해주는 시스템&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;서버 10대, 스토리지 5개, 라우터 몇 개가 있다고 하면,&lt;br /&gt;OpenStack은 이 자원들을 가상화하고 통합해 필요한 사용자에게 자원을 자동으로 할당하고&lt;br /&gt;웹 대시보드(Horizon)나 API를 통해 조작할 수 있도록 도와줍니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 오픈스택은 자원을 가상화하고 풀(Pool) 형태로 모아두고,&lt;br /&gt;이를 기반으로 유연하고 확장성 있는 클라우드 환경을 구축할 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1043&quot; data-start=&quot;1027&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;오픈스택은 계속 진화 중&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈스택은 &lt;b&gt;6개월 주기로 새로운 버전이 릴리즈&lt;/b&gt;되며,&lt;br /&gt;첫 릴리즈는 2010년의 &lt;b&gt;Austin&lt;/b&gt;이었고, 이후 알파벳 순으로 이름이 정해졌습니다.&lt;br /&gt;2022년에는 알파벳 Z까지 도달한 &lt;b&gt;Zed&lt;/b&gt; 버전이 나오면서 한 사이클이 끝났고,&lt;br /&gt;지금은 다시 A부터 시작해 현재는 &lt;b&gt;Epoxy(E)&lt;/b&gt;까지 도달했습니다.&lt;br /&gt;&lt;b&gt;올해 10월에는 F로 시작하는 새로운 릴리즈가 예정되어 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1355&quot; data-start=&quot;1270&quot; data-ke-size=&quot;size16&quot;&gt;오픈스택 버전명을 보면 릴리즈 시기를 대략 추정할 수 있어서,&lt;br /&gt;사용 중인 환경의 버전을 확인하는 데도 유용하죠. 이런 네이밍 방식도 흥미롭지 않나요?&lt;/p&gt;
&lt;p data-end=&quot;1355&quot; data-start=&quot;1270&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1355&quot; data-start=&quot;1270&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1355&quot; data-start=&quot;1270&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;OpenStack 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;OpenStack 구조.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQx0oD/btsOAZMFaXx/OzG2lNdgkiuvmFsv7Q5GUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQx0oD/btsOAZMFaXx/OzG2lNdgkiuvmFsv7Q5GUk/img.png&quot; data-alt=&quot;[출처] : https://www.openstack.org/software/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQx0oD/btsOAZMFaXx/OzG2lNdgkiuvmFsv7Q5GUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQx0oD%2FbtsOAZMFaXx%2FOzG2lNdgkiuvmFsv7Q5GUk%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;338&quot; data-filename=&quot;OpenStack 구조.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[출처] : https://www.openstack.org/software/&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenStack은 Compute, Storage, Network 등의 핵심 기능들이 &lt;b&gt;독립된 컴포넌트(프로젝트)&lt;/b&gt;로 구성되어 있으며,&lt;br /&gt;6개월 주기로 새로운 릴리즈가 발표됩니다.&lt;br /&gt;예전에는 Keystone, Cinder, Horizon 등의 새로운 기능이 지속적으로 추가되었지만,&lt;br /&gt;&lt;b&gt;Kilo 버전 이후부터는 안정성과 성능 개선에 주력&lt;/b&gt;하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1223&quot; data-start=&quot;1205&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;OpenStack 설치 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenStack은 두 가지 방식으로 설치할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-15 오후 6.45.23.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RG8oa/btsOA0re21n/1uEtZpkwQGWkoa92fiEKv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RG8oa/btsOA0re21n/1uEtZpkwQGWkoa92fiEKv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RG8oa/btsOA0re21n/1uEtZpkwQGWkoa92fiEKv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRG8oa%2FbtsOA0re21n%2F1uEtZpkwQGWkoa92fiEKv1%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;144&quot; data-filename=&quot;스크린샷 2025-06-15 오후 6.45.23.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;450&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;h2 data-end=&quot;1445&quot; data-start=&quot;1432&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;주요 컴포넌트 소개&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenStack은 기능별로 나뉜 여러 개의 컴포넌트들로 구성됩니다.&lt;br /&gt;이들은 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Core&lt;/span&gt; 컴포넌트(필수)와 &lt;span style=&quot;color: #f89009;&quot;&gt;Optional&lt;/span&gt; 컴포넌트(선택)&lt;/b&gt;로 구분됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Core &lt;/span&gt;컴포넌트 요약&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Compute : Nova&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Nova.png&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;1285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4l7Nh/btsOBxINCmP/d8S3ypj9XKmtqZdKO28IQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4l7Nh/btsOBxINCmP/d8S3ypj9XKmtqZdKO28IQK/img.png&quot; data-alt=&quot;[출처] : https://docs.openstack.org/nova/latest/admin/architecture.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4l7Nh/btsOBxINCmP/d8S3ypj9XKmtqZdKO28IQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4l7Nh%2FbtsOBxINCmP%2Fd8S3ypj9XKmtqZdKO28IQK%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;497&quot; data-filename=&quot;Nova.png&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;1285&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[출처] : https://docs.openstack.org/nova/latest/admin/architecture.html&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;size16&quot;&gt;Nova는 Nova-api, Nova-scheduler, Nova-compute, Nova-conductor 와 같은 다양한 컴포넌트들로 존재하고 있습니다.&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&gt;Nova-scheduler&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 시간 스케줄링이 아닌 VM을 만들 때 어떤 물리서버가 적절한지 결정을하고 공간적인 스케줄링을 해주는 요소입니다. 실제로 VM을 생성할 물리서버가 지정이 된다면 Nova-compute와 같은 요소를 사용해서 VM을 생성하게 됩니다.&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&gt;Nova-computes&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nova-compute는 하이퍼바이저를 제어하여 가상 머신 인스턴스를 생성하고 삭제하는 역할을 합니다. OpenStack은 nova-api를 통해 요청을 받고, 내부적으로 nova-compute가 libvirt (하이퍼바이저 드라이버)같은 Hypervisor API를 호출해 KVM/QEMU 등의 하이퍼바이저에 명령을 내립니다.&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&gt;Nova-conductor&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nova는 VM 인스턴스의 생성, 상태 변경 등을 Nova-conductror라는 모듈이 DB에 기록하며 관리합니다.&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;그리고 OpenStack의 각 컴포넌트(Nova, Neutron, Cinder 등)는 내부적으로 Message Queue를 사용해서 서로 간의 작업 요청을 주고받는데, 이 방식은 여러 사용자가 동시에 요청하더라도 큐가 중간에서 처리 속도를 조절해주는 완충장치 역할을 합니다. 여러개의 동시작업을 하는데 최적화가 될 수 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Network : Neutron&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;가상 네트워킹 인프라와 물리 네트워킹 인프라 모두를 관리하며 OpenStack 서비스 간의 연결을 제공합니다. &lt;br /&gt;&lt;br /&gt;1. 논리적인 네트워크 토폴로지를 제공합니다. &lt;br /&gt;2. 서비스 네트워크 별 Tenant 분리 제공합니다. &lt;br /&gt;3. 시큐리티 그룹 내에서 Stateless Firewall 제공합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Neutron은 OpenStack에서 &lt;b&gt;가상 네트워크와 물리 네트워크를 연결&amp;middot;관리&lt;/b&gt;해주는 컴포넌트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 &lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;*&lt;/span&gt;&lt;/b&gt;테넌트마다 독립된 네트워크 환경을 구성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Neutron의 구성요소는 서드파티 플러그인(외부 드라이버 및 기술)에 상당히 많이 의존합니다. 리눅스 브릿지나, OVS 같은 기술을 활용해 IP할당, NAT, 방화벽 기능 등을 제공합니다.&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;OpenStack에서 방화벽을 제공해주고는 있지만 일반적인 보안 방화벽과는 다른 개념이고 Stateless 방화벽(세션 추적 하지 않음)이라고 해서 간단한 접근 제어에 효과적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/span&gt;테넌트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 건물(= OpenStack 클라우드)에 여러 세입자(= 테넌트)가 있는데, 각 세입자마다 자기만의 와이파이, 출입문, 보안카드가 따로 있는 것과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 그래서 서로 인터넷 회선이나 내부 통신망이 분리되어 있어서 보안이 보장됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Storage : Manila, Swift, Cinder&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;590&quot; data-start=&quot;555&quot; data-ke-size=&quot;size18&quot;&gt;  1. File Storage &amp;ndash; Manila&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;774&quot; data-start=&quot;592&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;620&quot; data-start=&quot;592&quot;&gt;구조: 디렉토리/파일처럼 계층적으로 저장&lt;/li&gt;
&lt;li data-end=&quot;647&quot; data-start=&quot;621&quot;&gt;접근: 일반 파일처럼 mount해서 접근&lt;/li&gt;
&lt;li data-end=&quot;712&quot; data-start=&quot;648&quot;&gt;특징:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;712&quot; data-start=&quot;656&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;681&quot; data-start=&quot;656&quot;&gt;사용하기 쉬움 (운영체제가 파일처럼 다룸)&lt;/li&gt;
&lt;li data-end=&quot;712&quot; data-start=&quot;684&quot;&gt;&lt;b&gt;확장성 한계&lt;/b&gt; 있음 &amp;rarr; 커질수록 성능 저하&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;774&quot; data-start=&quot;713&quot;&gt;용도:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;774&quot; data-start=&quot;721&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;747&quot; data-start=&quot;721&quot;&gt;여러 VM에서 공유 폴더처럼 접근해야 할 때&lt;/li&gt;
&lt;li data-end=&quot;774&quot; data-start=&quot;750&quot;&gt;백업, 데이터 마이그레이션, NFS 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;817&quot; data-start=&quot;781&quot; data-ke-size=&quot;size18&quot;&gt;  2. Block Storage &amp;ndash; Cinder&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1021&quot; data-start=&quot;819&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;848&quot; data-start=&quot;819&quot;&gt;구조: 데이터를 일정 블록 단위로 나눠서 저장&lt;/li&gt;
&lt;li data-end=&quot;883&quot; data-start=&quot;849&quot;&gt;접근: &lt;b&gt;VM에 디스크처럼 연결됨 (raw 디바이스)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;966&quot; data-start=&quot;884&quot;&gt;특징:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;966&quot; data-start=&quot;892&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;903&quot; data-start=&quot;892&quot;&gt;성능 좋고 유연함&lt;/li&gt;
&lt;li data-end=&quot;939&quot; data-start=&quot;906&quot;&gt;파일 시스템은 사용자가 직접 생성해야 함 (ext4 등)&lt;/li&gt;
&lt;li data-end=&quot;966&quot; data-start=&quot;942&quot;&gt;개발자가 조작 필요 (운영체제 수준에서)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1021&quot; data-start=&quot;967&quot;&gt;용도:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1021&quot; data-start=&quot;975&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;998&quot; data-start=&quot;975&quot;&gt;VM OS 디스크, 추가 데이터 디스크&lt;/li&gt;
&lt;li data-end=&quot;1021&quot; data-start=&quot;1001&quot;&gt;DB 저장소 등 고성능 요구 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1064&quot; data-start=&quot;1028&quot; data-ke-size=&quot;size18&quot;&gt;  3. Object Storage &amp;ndash; Swift&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1264&quot; data-start=&quot;1066&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1104&quot; data-start=&quot;1066&quot;&gt;구조: 디렉토리 없음. &lt;b&gt;Key-Value 형태로 파일 저장&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1183&quot; data-start=&quot;1105&quot;&gt;특징:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1183&quot; data-start=&quot;1113&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1135&quot; data-start=&quot;1113&quot;&gt;확장성 최고 (수천~수만 노드 가능)&lt;/li&gt;
&lt;li data-end=&quot;1168&quot; data-start=&quot;1138&quot;&gt;다양한 형식 저장 가능 (문서, 이미지, 영상 등)&lt;/li&gt;
&lt;li data-end=&quot;1183&quot; data-start=&quot;1171&quot;&gt;복제/무결성 내장됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1207&quot; data-start=&quot;1184&quot;&gt;접근: API 또는 URL로 직접 접근&lt;/li&gt;
&lt;li data-end=&quot;1264&quot; data-start=&quot;1208&quot;&gt;용도:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1264&quot; data-start=&quot;1216&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1241&quot; data-start=&quot;1216&quot;&gt;정적 콘텐츠 저장 (이미지, 영상, 백업)&lt;/li&gt;
&lt;li data-end=&quot;1264&quot; data-start=&quot;1244&quot;&gt;클라우드 스토리지 서비스처럼 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. Image : Glance&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Glance는 OpenStack에서 VM 생성 시 필요한 OS 이미지 파일을 저장하고 관리하는 서비스입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자는 REST API를 통해 이미지를 업로드하거나 조회할 수 있고, Nova는 Glance에서 이미지를 가져와 해당 OS 기반으로 가상머신을 생성합니다. 다양한 이미지 포맷을 지원하며, 클라우드 확장을 위해 다른 컴포넌트에서도 Glance API를 호출해 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. Identity : Keystone&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;OpenStack에서 사용자 인증(Authentication)과 권한 부여(Authorization)를 담당하는 서비스&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;누가(OpenStack User)&lt;/b&gt;가 &lt;b&gt;어떤 자원(Project)&lt;/b&gt;에, &lt;b&gt;어떤 권한(Role)&lt;/b&gt;으로, &lt;b&gt;얼마나(Token 유효시간 동안)&lt;/b&gt; 접근 가능한지를 판단하는 &lt;b&gt;인증과 접근 제어의 중심&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;344&quot; data-start=&quot;320&quot; data-ke-size=&quot;size26&quot;&gt;Keystone의 주요 구성 요소&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 150px;&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;height: 17px;&quot;&gt;구성 요소&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;User&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;OpenStack을 사용하는 사용자 (사람 or 서비스)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;Project&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;사용자들이 속하는 그룹 (예: 팀, 부서) &amp;mdash; 리소스를 나누는 단위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;Role&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;사용자가 수행할 수 있는 작업 권한 (예: admin, member 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;Token&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;인증 성공 시 Keystone이 발급해주는 &lt;b&gt;일회용 키&lt;/b&gt;&amp;rarr; 이걸 들고 다른 컴포넌트(Nova, Glance 등)에 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;Endpoint&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;서비스가 동작 중인 API 주소 (ex: Nova의 API URL 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;Policy&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&amp;ldquo;이 역할을 가진 사용자는 어떤 작업이 가능한가&amp;rdquo; 정의한 정책&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;Catalog&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;어떤 서비스가 어디 주소에서 동작 중인지 정리한 목록&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Keystone은 OpenStack 내 모든 리소스 접근에 대해 &quot;누가, 언제, 어디까지 접근 가능한가&quot;를 토큰 기반으로 통제하는 중앙 인증 서비스입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. Dashboard : Horizon&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 기반 GUI 관리 도구이며, 사용자가 프로젝트, 인스턴스, 이미지 등을 직관적으로 조작 가능합니다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;Optional&lt;/span&gt; 컴포넌트 요약&lt;/b&gt;&lt;/h3&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: 15%;&quot;&gt;컴포넌트&lt;/td&gt;
&lt;td style=&quot;width: 84.8837%;&quot;&gt;기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%;&quot;&gt;&lt;b&gt;Heat&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.8837%;&quot;&gt;리소스 자동 배포(오케스트레이션) - YAML 템플릿 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%;&quot;&gt;&lt;b&gt;Ceilometer&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.8837%;&quot;&gt;자원 사용량 수집 (모니터링)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%;&quot;&gt;&lt;b&gt;Aodh&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.8837%;&quot;&gt;알림/경고 처리 (Ceilometer 연동)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%;&quot;&gt;&lt;b&gt;Trove&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.8837%;&quot;&gt;DBaaS &amp;ndash; MariaDB, PostgreSQL 등의 DB 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%;&quot;&gt;&lt;b&gt;Sahara&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.8837%;&quot;&gt;빅데이터 클러스터(Hadoop, Spark 등) 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%;&quot;&gt;&lt;b&gt;Ironic&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.8837%;&quot;&gt;베어메탈 서버 관리 (물리 장비에 직접 OS 설치)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%;&quot;&gt;&lt;b&gt;Zaqar&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.8837%;&quot;&gt;메시징 서비스 (REST API, WebSocket 지원)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%;&quot;&gt;&lt;b&gt;Designate&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.8837%;&quot;&gt;DNS 관리 서비스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15%;&quot;&gt;&lt;b&gt;Murano&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.8837%;&quot;&gt;OpenStack 상의 앱 배포/관리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 와 같이 Optional 컴포넌트들이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 가지 기능을 확장하기 위해서 각각의 모듈들을 설치해서 OpenStack에서 제공하는 기능을 확장할 수 있다는 것이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유연한 구조를 가진 아키텍처라고 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2941&quot; data-start=&quot;2921&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;OpenStack 논리 아키텍처&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenStack은 컴포넌트 기반 구조로 구성된 클라우드 플랫폼으로,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 기능(Nova, Neutron, Cinder, Glance 등)이 모듈처럼 독립적 역할을 수행하고,&lt;/li&gt;
&lt;li&gt;사용자는 Horizon이나 API를 통해 명령을 내리면,&lt;/li&gt;
&lt;li&gt;Keystone이 인증을 처리하고 Heat가 자동화된 리소스를 구성하며,&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 컴포넌트들이 유기적으로 동작하여 하나의 VM을 완성하는 구조입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.openstack.org/nova/latest/admin/architecture.html&quot;&gt;https://docs.openstack.org/nova/latest/admin/architecture.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.redhat.com/ko/topics/openstack&quot;&gt;https://www.redhat.com/ko/topics/openstack&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.redhat.com/ko/topics/cloud-computing/cloud-vs-virtualization&quot;&gt;https://www.redhat.com/ko/topics/cloud-computing/cloud-vs-virtualization&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ozpWKFLI3V0&quot;&gt;https://www.youtube.com/watch?v=ozpWKFLI3V0&lt;/a&gt;&lt;/p&gt;</description>
      <category>Cloud(Infra)/공부</category>
      <category>OpenStack</category>
      <category>개념알아보기</category>
      <author>iapaalst</author>
      <guid isPermaLink="true">https://iapaalst.tistory.com/33</guid>
      <comments>https://iapaalst.tistory.com/33#entry33comment</comments>
      <pubDate>Sun, 15 Jun 2025 19:24:43 +0900</pubDate>
    </item>
    <item>
      <title>[CKA]#6 Namespace</title>
      <link>https://iapaalst.tistory.com/32</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Namespace란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kubernetes 클러스터 내에서 &lt;b&gt;리소스를 논리적으로 분리하는 방법&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;하나의 클러스터 안에서 여러 개의 &amp;ldquo;작은 독립 공간&amp;rdquo;을 나눠서 쓰는 개념&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;예: 하나의 아파트(클러스터)에 여러 가정집(네임스페이스)이 있는 느낌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 default, kube-system, kube-public이 생성된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1 네임스페이스로 자원/권한 나누기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 리소스를 논리적으로 분리하는 것뿐 아니라 자원도 나눠 분리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;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&gt;팀&lt;/td&gt;
&lt;td&gt;네임스페이스&lt;/td&gt;
&lt;td&gt;사용 자원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;팀 A&lt;/td&gt;
&lt;td&gt;`dev-a`&lt;/td&gt;
&lt;td&gt;CPU 5개, 메모리 10GiB, 최대 Pod 20개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;팀 B&lt;/td&gt;
&lt;td&gt;`dev-b`&lt;/td&gt;
&lt;td&gt;CPU 10개, 메모리 20GiB, 최대 Pod 50개&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 서로 자원을 침범하지 않게 구분됨!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(와우, 보통 리소스를 네임스페이스로 구분해서 사용만 했었는데 이런 것도 있구먼)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.1.1 ResourceQuota&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 네임스페이스마다 CPU/메모리/Pod 개수 제한을 줄 수 있음&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-a-quota
  namespace: dev-a
spec:
  hard:
    requests.cpu: &quot;5&quot;
    limits.memory: 10Gi
    pods: &quot;20&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.1.2 LimitRange&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod이나 Container 단위의 기본 CPU/메모리 설정값 제한&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.1.3 RBAC (권한 제어)&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 네임스페이스에 누가 어떤 권한으로 접근 가능한지 제어&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예: 팀 A가 `dev-a`에만 `admin` , `dev-b`에는 `view`&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-a-access
  namespace: dev-a
subjects:
  - kind: User
    name: team-a-user
roleRef:
  kind: Role
  name: admin
  #apiGroup: rbac.authorization.k8s.io
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-b-access-for-team-a
  namespace: dev-b
subjects:
  - kind: User
    name: team-a-user     # team-a-user가
    #apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: view              # dev-b에서는 view 권한만 줌
  #apiGroup: rbac.authorization.k8s.io
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 이렇게 하면 Cross-Namesoace 권한 부여&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2 리소스 이름은 네임스페이스 내에서만 유일하면 된다.&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;즉, &lt;b&gt;같은 이름의 리소스를 서로 다른 네임스페이스에 만들어도 됨&lt;/b&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;# dev 네임스페이스에 있는 서비스
svc: web-service (dev)

# prod 네임스페이스에도 같은 이름의 서비스
svc: web-service (prod)
&lt;/code&gt;&lt;/pre&gt;
✔️ 둘 다 같은 이름을 써도 문제없음 &amp;mdash; 왜? &lt;b&gt;&quot;주소 체계가 다르기 때문&quot;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;(마치 아파트 101호에도 철수가 있고, 201호에도 철수가 있는 것처럼)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.3 Namespace 기반 스코핑은 Namespace 기반 리소스에만 적용된다&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  쿠버네티스에는 &amp;ldquo;네임스페이스에 속하는 리소스&amp;rdquo;와 &amp;ldquo;네임스페이스에 속하지 않는 리소스&amp;rdquo;가 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 네임스페이스에 소속될 수 있는 오브젝트만 격리 가능하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 리소스는 &lt;b&gt;네임스페이스가 적용됨:&lt;/b&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&gt;리소스&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;td&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pod&lt;/td&gt;
&lt;td&gt;애플리케이션 단위&lt;/td&gt;
&lt;td&gt;kubectl get pods -n dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;네트워크 접근 제어&lt;/td&gt;
&lt;td&gt;svc: web (in dev) vs svc: web (in prod)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Pod 자동 관리&lt;/td&gt;
&lt;td&gt;앱 배포를 네임스페이스별로 분리 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ConfigMap&lt;/td&gt;
&lt;td&gt;설정 데이터&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret&lt;/td&gt;
&lt;td&gt;보안 설정&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 다음 리소스는 &lt;b&gt;네임스페이스랑 상관없음 (클러스터 전체 대상):&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 129px;&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;height: 17px;&quot;&gt;리소스&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;이유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Node&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;클러스터의 물리/가상 머신&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;물리/가상 머신 수준이라 네임스페이스랑 무관&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;PersistentVolume&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;물리적 디스크 같은 저장소 자원&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;실제 스토리지 자원이기 때문에 클러스터 전체에서 공유됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;StorageClass&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;볼륨의 클래스 정의&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;스토리지 정책 설정이기 때문에 전역에서 사용됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Namespace&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;네임스페이스 자체도 네임스페이스에 속하지 않음&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;ClusterRole&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;클러스터 전체 권한&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Namespace와 DNS&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNS 형식: `&amp;lt;서비스명&amp;gt;.svc.cluster.local`&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 DNS형식으로 서비스에 접근한다. 기본으로 되어있는 네임스페이스에 접근하게 됨&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;하지만, 다른 네임스페이스 리소스 접근 시 FQDN을 사용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`dev` 네임스페이스, `data` 서비스&lt;/li&gt;
&lt;li&gt;`prod` 네임스페이스,`data`서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 어떤 네임스페이스의 서비스를 연결해야 할지 정확하게 명시해야 하는 거임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; `&amp;lt;서비스명&amp;gt;.&amp;lt;네임스페이스명&amp;gt;svc.cluster.local`&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;3. 그 외&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 소프트웨어의 다른 버전 구분에서는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`web-app:v1`&lt;/li&gt;
&lt;li&gt;`web-app:v2`&lt;/li&gt;
&lt;li&gt;&amp;rarr; 이런 버전 구분은 `namespace` 나누지 말고, `label`이나 `deployment` 이름으로 구분해라&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 명령어 정리.&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 279px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; width: 45.1163%;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;명령어&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 54.7674%;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;설명&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; width: 45.1163%;&quot; rowspan=&quot;2&quot;&gt;`kubectl create namespcae [Namespace명]` or&lt;br /&gt;`kubectl create -f ./[파일명]`&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 54.7674%;&quot; rowspan=&quot;2&quot;&gt;Namespace 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; width: 45.1163%;&quot;&gt;`kubectl apply -f [파일명] -n [Namespace명]`&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 54.7674%;&quot;&gt;리소스를 특정 Namespace에 배포&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; width: 45.1163%;&quot;&gt;`kubectl describe namespace [Namespace명]`&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 54.7674%;&quot;&gt;특정 네임스페이스 정보보기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; width: 45.1163%;&quot;&gt;`kubectl delete namespaces [Namespace명]`&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 54.7674%;&quot;&gt;네임스페이스 삭제하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;height: 38px; width: 45.1163%;&quot;&gt;`kubectl config set-context --current --namespace=dev`&lt;/td&gt;
&lt;td style=&quot;height: 38px; width: 54.7674%;&quot;&gt;현재 context의 default namespace 변경(기본 네임스페이스를 설정하는 것)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 45.1163%;&quot; rowspan=&quot;2&quot;&gt;`kubectl get pods --all-namespaces` or&lt;br /&gt;`kubectl get namespace or ns`&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 54.7674%;&quot; rowspan=&quot;2&quot;&gt;전체 Namespace의 리소스 보기 or 네임스페이스 목록보기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 45.1163%;&quot; rowspan=&quot;2&quot;&gt;`kubectl get pods --namespace=dev` or `-n dev`&lt;br /&gt;`kubectl run nginx --image=nginx &amp;mdash;-namespace=dev`&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 54.7674%;&quot; rowspan=&quot;2&quot;&gt;특정 네임스페이스를 명시해서 명령어 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 45.1163%;&quot;&gt;`kubectl config view --minify`&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 54.7674%;&quot;&gt;grep namespace:`&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; width: 45.1163%;&quot;&gt;`kubectl api-resources --namespaced=true`&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 54.7674%;&quot;&gt;네임스페이스에 속하는 리소스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; width: 45.1163%;&quot;&gt;`kubectl api-resources --namespaced=false`&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 54.7674%;&quot;&gt;네임스페이스에 속하지 않는 리소스&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>Cloud(Infra)/공부</category>
      <author>iapaalst</author>
      <guid isPermaLink="true">https://iapaalst.tistory.com/32</guid>
      <comments>https://iapaalst.tistory.com/32#entry32comment</comments>
      <pubDate>Fri, 30 May 2025 15:48:34 +0900</pubDate>
    </item>
    <item>
      <title>[CKA]#5 Service</title>
      <link>https://iapaalst.tistory.com/31</link>
      <description>&lt;h4 id=&quot;%EC%B0%B8%EA%B3%A0-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #9d9d9d;&quot;&gt;[참고]&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kubernetes.io/ko/docs/concepts/services-networking/service/&quot;&gt;[Kubernetes 공식문서] Service&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;[Kubernetes 공식문서] kube-proxy&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kubernetes.io/docs/reference/config-api/kube-proxy-config.v1alpha1/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;[&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;Kubernetes 공식문서&lt;/span&gt;] &lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;kube-proxy Configuration&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;[Udemy] cka&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Service란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod 간 또는 외부 &amp;harr; 클러스터 내부 간 통신을 가능하게 해주는데&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 하기 위해 다음을 가능하게 함:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 개의 Pod(백엔드)가 있다고 해도 하나의 서비스처럼 묶어주며, 외부/내부에 &lt;b&gt;하나의 고정된 단일 엔드포인트(ClusterIP, NodePort 등)&lt;/b&gt;로 접근 가능하게 해준다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;즉, 사용자는 내부 구조를 몰라도 접속할 수 있음.(서버 IP가 뭔지 몰라도 하나의 고정된 엔드포인트가 있기 때문에)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNS 이름으로 접근가능하니까 쿠버네티스가 로드밸런싱을 자동으로 처리할 수 있는 것.&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;즉, Pods는 죽거나 교체되면 IP가 바뀌며 고정되지 않음. DNS으로 통신이 되니 연결이 끊기는 것을 방지하고 파드가 변경되더라도 항상 최신 파드로 자동 라우팅해줌&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그렇기 때문에 서비스 이름. DNS만 알면 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 연결하고 싶은 서비스(백엔드 파드 등)의 위치(IP, 포트 등)를 자동으로 찾는 것은 외부/내부에 따라 다른데&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내부에선 API 요청으로 알아내고,&lt;/li&gt;
&lt;li&gt;외부에서 접근하려면 중간 수단을 제공해야 하는데 NodePort, LoadBalancer, Ingress를 이용하여 포워딩해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1 Selector&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, 어떻게 서비스를 통신시켜 줄까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-29 오후 2.44.49.png&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;1110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dt1lQe/btsOidXH4dO/TAO1k3S31uKlFUbIaoXSjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dt1lQe/btsOidXH4dO/TAO1k3S31uKlFUbIaoXSjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dt1lQe/btsOidXH4dO/TAO1k3S31uKlFUbIaoXSjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdt1lQe%2FbtsOidXH4dO%2FTAO1k3S31uKlFUbIaoXSjK%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;382&quot; data-filename=&quot;스크린샷 2025-05-29 오후 2.44.49.png&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;1110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`selector`를 통해 파드들을 하나의 서비스로 만들어서 연결해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(예: `app=front-end` 라벨을 가진 파드들만 묶어서 하나의 서비스로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 특정 상황에서는 `selector` 없이 수동으로 연결가능한데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우에는 Service가 어떤 파드를 자동으로 선택하지 않고, 직접 IP와 포트를 수동으로 명시해야 함.&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;h3 data-ke-size=&quot;size23&quot;&gt;1.2 EndpointSlice(vs. Endpoint)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Service가 연결할 수 있는 파드들의 IP와 포트 정보를 담는 오브젝트(라우팅을 위해 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`my-service`라는 서비스가 있고,&lt;/li&gt;
&lt;li&gt;여기에 300개의 파드가 연결되어 있다면,&lt;/li&gt;
&lt;li&gt;쿠버네티스는 약 &lt;b&gt;3개의 EndpointSlice&lt;/b&gt;를 만들어 각 100개씩 파드를 담는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1748497586368&quot; class=&quot;yaml&quot; data-ke-language=&quot;yaml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;my-service
 └── EndpointSlice 1 (100개 엔드포인트)
 └── EndpointSlice 2 (100개 엔드포인트)
 └── EndpointSlice 3 (100개 엔드포인트)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, EndpointSlice는 &lt;b&gt;서비스의 연결 대상 파드들을 묶어서 분산 저장&lt;/b&gt;하는 역할&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스에 연결된 파드(엔드포인트)가 많으면, &lt;b&gt;한 슬라이스(EndpointSlice)에 다 담지 않.음.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;100개가 넘으면&lt;/b&gt;, 쿠버네티스는 &lt;b&gt;새로운 EndpointSlice를 만들어&lt;/b&gt; 나눠 저장.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`Endpoints`도 있지만 `EndpointSlice` 사용이 좋은 것 같다. 모쪼록,,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;Endpoints (기존)&lt;/td&gt;
&lt;td&gt;EndpointSlice (권장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구조&lt;/td&gt;
&lt;td&gt;모든 정보 한 곳에&lt;/td&gt;
&lt;td&gt;여러 개로 나눠 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 엔드포인트 수&lt;/td&gt;
&lt;td&gt;1000개&lt;/td&gt;
&lt;td&gt;100개 per 슬라이스 (자동 분산)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;초과 시 처리&lt;/td&gt;
&lt;td&gt;잘림(truncated)&lt;/td&gt;
&lt;td&gt;슬라이스 추가 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;업데이트&lt;/td&gt;
&lt;td&gt;전체 갱신&lt;/td&gt;
&lt;td&gt;부분 갱신 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 EndpointSlice는 어떻게 생성되냐?&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;서비스 정의파일에 `selector`를 이용해서 파드들을 하나의 서비스로 묶어줬으면 자동으로 EndpointSlice를 생성하는데 수동으로도 만들 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 :&lt;/p&gt;
&lt;pre id=&quot;code_1748497741696&quot; class=&quot;yaml&quot; data-ke-language=&quot;yaml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
  name: external-db-slice # 네임스페이스 내에서 고유해야함
  labels:
    kubernetes.io/service-name: external-db # ⭐️ 반드시 필요
    endpointslice.kubernetes.io/managed-by: staff # 누가 관리하는 지 #controller는 예약어라 사용못함
addressType: IPv4
ports:
  - protocol: TCP
    port: 5432
endpoints: # 금지된 IP주소 사용하면 안됨
  - addresses:
      - &quot;10.20.30.40&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이렇게 하면 `external-db`라는 `service`가 수동으로 작성한 이 EndpointSlice를 통해 &lt;span data-token-index=&quot;1&quot;&gt;10.20.30.40:5432&lt;/span&gt;로 트래픽을 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수동으로 생성할 땐 규칙이 꽤 있는데 &amp;hellip; 예..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.3 서비스 정의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod 포트에 이름을 붙일 수가 있는데&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-28 오후 4.51.27.png&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/05RIm/btsOjdbqmLM/a4pQ2PeKbhgsjHSHePbMR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/05RIm/btsOjdbqmLM/a4pQ2PeKbhgsjHSHePbMR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/05RIm/btsOjdbqmLM/a4pQ2PeKbhgsjHSHePbMR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F05RIm%2FbtsOjdbqmLM%2Fa4pQ2PeKbhgsjHSHePbMR1%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;229&quot; data-filename=&quot;스크린샷 2025-05-28 오후 4.51.27.png&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 하면 Pod가 노출하는 포트 번호를 나중에 바꿔도, 포트 이름을 참조하므로 유지보수가 유연함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.3.1 appProtocol&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 `protocol` 필드(전송계층 L4)만으로는 애플리케이션 수준의 프로토콜 구분이 되지 않음. 그래서 `appProtocol`필드(앱계층 L7)를 추가할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre id=&quot;code_1748497892043&quot; class=&quot;yaml&quot; data-ke-language=&quot;yaml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: my-http-service
spec:
  selector:
    app: my-app
  ports:
    - name: http
      port: 80
      targetPort: 8080
      protocol: TCP
      appProtocol: http&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 정의는 서버 코드가 HTTP(gRPC 등 7 계층 프로토콜)의 요청을 읽고 응답하는 로직이고 TCP 연결을 통해 전달된다는 것임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;근데 이제 이걸 왜 구분해놔야 하냐?  &lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭐 예를 들어, istio 같은 서비스 메시나 ingress controllere들이 트래픽 내부를 파악해서 정보를 가져올 수 있게 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구체적인 예시로는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;모든 트래픽을 가로채서&lt;/b&gt; 80%는 v1으로, 20%는 v2로 알아서 라우팅&lt;/li&gt;
&lt;li&gt;특정 사용자(예: `user=guest`)가 `POST /admin` 호출하는 것을 차단
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이건 &lt;b&gt;JWT 토큰에 담긴 클레임 정보 기반으로 트래픽 차단 &amp;rarr; istio&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇듯 여러 가지를 위해 구분한다고 함 ~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.3.2 멀티-포트 서비스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 Kubernetes Service가 &lt;b&gt;여러 포트를 동시에 노출&lt;/b&gt;할 수 있도록 설정하는 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 상황이 이렇다면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spring Boot 백엔드 앱
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`8080`: 일반 HTTP (API 서버)&lt;/li&gt;
&lt;li&gt;`9090`: `/metrics` (Prometheus용 엔드포인트)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이 백엔드 파드들을 하나의 Service로 묶음&lt;/li&gt;
&lt;li&gt;이때 서비스 포트 정의에 두 포트를 &lt;b&gt;역할별로 명시하고 싶음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1748497936659&quot; class=&quot;yaml&quot; data-ke-language=&quot;yaml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: backend-app
spec:
  selector:
    app: backend
  ports:
    - name: http
      port: 8080
      targetPort: 8080
      protocol: TCP
      appProtocol: http         # ✅ 일반 API용 포트
    - name: metrics
      port: 9090
      targetPort: 9090
      protocol: TCP
      appProtocol: prometheus   # ✅ 메트릭 수집용 포트&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 예시 파일을 보면,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot 백엔드 서버가 여러 포트를 열 때&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;8080 포트는 HTTP 요청용 (예: `/login`, `/api/data`)&lt;/li&gt;
&lt;li&gt;9090 포트는 Prometheus가 scrape 할 `/metrics` 엔드포인트용&lt;/li&gt;
&lt;li&gt;appProtocol로 포트의 &lt;b&gt;의도와 사용처를 명확히&lt;/b&gt; 알 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 내가 작성한 코드로 확인해 보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;argocd의 grpc(HTTP/2) 통신을 위해 작성한 grpc 서비스 매니페스트다. 아무래도 엉성한 부분이 많다.&lt;/p&gt;
&lt;pre id=&quot;code_1748497956008&quot; class=&quot;yaml&quot; data-ke-language=&quot;yaml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#argocd-grpc.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-protocol-version: GRPC
  labels:
    app: argogrp
  name: argogrpc
  namespace: argocd
spec:
  ports:
    - name: &quot;80&quot;
      port: 80 
      protocol: TCP
      targetPort: 8080
      nodePort: 30081  # 클러스터 외부(ALB &amp;rarr; EC2 노드)
  selector:
    app.kubernetes.io/name: argocd-server
  sessionAffinity: None
  type: NodePort&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ports 필드를 보면 80 포트 하나만 정의되어 있다. 여기에 gRPC를 넣어 명확하게 표현할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정된 코드:&lt;/p&gt;
&lt;pre id=&quot;code_1748497970647&quot; class=&quot;yaml&quot; data-ke-language=&quot;yaml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pec:
  ports:
    - name: grpc
      port: 80 
      protocol: TCP
      targetPort: 8080
      nodePort: 30081
      appProtocol: grpc    # ⭐️&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 수정한다면, 이제 이 포트를 정말 명확하게 grpc 프로토콜로 인식하게 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.4 서비스 디스커버리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스는 DNS기반의 서비스를 찾고 통신함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴 때 DNS로 통신한다면?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`http://[서비스이름]` (같은 네임스페이스 내에서 접근)&lt;/li&gt;
&lt;li&gt;`http://[서비스이름].[네임스페이스]` (다른 네임스페이스에서 접근)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, IP가 아니라 서비스 이름으로 통신 ~&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;h2 data-ke-size=&quot;size26&quot;&gt;2. 종류&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 91px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;타입&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;설명&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;ClusterIP&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;(기본값) 클러스터 내부 통신용 가상 IP 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;NodePort&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;노드의 고정 포트를 열어 외부에서 접근 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;LoadBalancer&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;클라우드 환경에서 외부 LoadBalancer를 생성해 접근 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 ClusterIP&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ClusterIP는 클러스터 내에서만 접근 가능한 기본 서비스 타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod IP 대신 고정한 IP 또는 DNS로 Pod 그룹을 접근 가능하게 해 줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 클러스터 내 다른 Pod는 다음과 같이 접근 가능:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`http://backend` (서비스 이름이 DNS처럼 동작)&lt;/li&gt;
&lt;li&gt;또는 `http://&amp;lt;ClusterIP&amp;gt;` (서비스가 부여한 IP)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 Pod에서 이 서비스에 접속하면, 로드밸런싱을 통해 one of Pods로 트래픽 전달함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나, 외부에선 접근할 수 없음 말 그대로, 내부. 에서. 만 가, 능&lt;/p&gt;
&lt;pre id=&quot;code_1748498066262&quot; class=&quot;yaml&quot; data-ke-language=&quot;yaml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: backend
spec:
  type: ClusterIP   # 생략하면 기본값으로 ClusterIP
  #clusterIP: 10.0.0.150  # 직접 지정(service IP 범위(CIDR) 내)
  selector:
    app: backend    # backend Pod의 레이블과 일치해야 함
  ports:
    - port: 80             # 서비스가 노출할 포트
      targetPort: 80       # 실제 Pod에서 노출된 포트&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.1.1 Headless 서비스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 봤던 ClusterIP를 직접 지정하지 않고 None으로 지정할 경우 Headless Service가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Headless Service는 ClusterIP 없이 파드의 실제 IP 목록만 DNS로 반환하는 서비스임.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;spec:
  clusterIP: None 
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이걸 언제 쓰냐?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로드밸런싱 필요 없을 때&lt;/li&gt;
&lt;li&gt;파드별로 직접 접근하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;hellip; 그렇다네요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2 NodePort&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NodePort는 ClusterIP와는 다르게 클러스터 외부에서 특정 노드 IP와 포트를 통해 서비스에 접근할 수 있게 해 주는데, 포트로 들어오는 요청을 내부의 해당 Pod로 프락시 해줌.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;요청 흐름:
&amp;lt;외부 사용자&amp;gt; ──▶ &amp;lt;NodeIP&amp;gt;:&amp;lt;NodePort&amp;gt; ──▶ &amp;lt;Service&amp;gt; ──▶ &amp;lt;Pod&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nodeport.png&quot; data-origin-width=&quot;1964&quot; data-origin-height=&quot;1270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs29rn/btsOhiSXjCa/gZIUcAxE5k2b0KIVSJIbKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs29rn/btsOhiSXjCa/gZIUcAxE5k2b0KIVSJIbKk/img.png&quot; data-alt=&quot;단일 Pod 연결 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs29rn/btsOhiSXjCa/gZIUcAxE5k2b0KIVSJIbKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs29rn%2FbtsOhiSXjCa%2FgZIUcAxE5k2b0KIVSJIbKk%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;388&quot; data-filename=&quot;nodeport.png&quot; data-origin-width=&quot;1964&quot; data-origin-height=&quot;1270&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;단일 Pod 연결 구조&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NodePort 구조는 위와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pod 내부 웹 서버 포트인 targetPort,&lt;/li&gt;
&lt;li&gt;Service가 가진 가상 IP포트인 port,&lt;/li&gt;
&lt;li&gt;Node에서 외부로 노출되는 포트인 NodePort.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;NodePort의 포트 번호는 기본적으로 &lt;b&gt;30000~32767 사이만 가능(다른 NodePort와 충돌하면 안 됨)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;자동으로 ClusterIP도 같이 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`http://[NodeIP:NodePort]`&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.2.1 --nodeport-addresses&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, &lt;b&gt;내부망/외부망 관계없이&lt;/b&gt; 모든 노드의 IP에서 열리게 되면 외부에 노출하면 안 되는 서비스는 어쩌냐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 해결하기 위해선 `--nodeport-addresses` 옵션을 추가함.&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;kube-proxy에 아래 옵션 추가:&lt;/p&gt;
&lt;pre id=&quot;code_1748498341649&quot; class=&quot;yaml&quot; data-ke-language=&quot;yaml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;containers:
  - name: kube-proxy
    command:
      - /usr/local/bin/kube-proxy
      - --nodeport-addresses=192.168.0.0/24
				# NodePort로 열리는 포트는 192.168.0.X IP로 들어오는 요청만 받음&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1748498359082&quot; class=&quot;yaml&quot; data-ke-language=&quot;yaml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
...
nodePortAddresses:
  - 192.168.0.0/24&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 환경(AWS 등) 보안그룹 너낌이라 온프레미스에서 설정하면 되는 것 같음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;2.3 LoadBalancer&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 환경(AWS, GCP, Azure 등)에서만 외부 로드밸런서를 생성하여 서비스에 외부 IP를 부여하고 연결해 줌. 그렇게 되면, 노드의 포트로 트래픽을 자동 전달함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;type: LoadBalancer
&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;명시 후&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클라우드에서 외부 로드밸런서 + 외부 IP&lt;/b&gt; 생성됨&lt;/li&gt;
&lt;li&gt;서비스 상태 `.status.loadBalancer.ingress` 에 IP가 표시됨 이 IP로 외부에서 접근 가능!&lt;/li&gt;
&lt;li&gt;(AWS에서 로드밸런서 IP 확인하는 방법: EC2 &amp;rarr; 네트워크 인터페이스 &amp;rarr; 해당 LB의 IPv4 주소 확인)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.3.1 MixedProtocolLBService&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;(Kubernetes v1.24부터 기본 활성화된 베타 기능)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 서비스 리소스 안에서 여러 프로토콜을 동시에 정의를 할 수 있다고 하는데 AWS기준 ALB가 아니라 NLB만 가능한 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;NLB는 그러면 service 타입을 loadbalancer 로만 하면 된다..?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;ALB는 ALB Controller를 권장해서 ingress와 같이 사용했는데 ingress 리소스 자체가 L7 기반&amp;hellip;(?) 이라는데 이거이거,,, NLB,, 를.. 이건 좀 더 ingress까지 공부를 해야 이해할 수 있을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1748498428563&quot; class=&quot;yaml&quot; data-ke-language=&quot;yaml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  selector:
    app: myapp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 8080
    - name: dns
      protocol: UDP
      port: 53
      targetPort: 53&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;클라우드 환경에서는 외부에 노출되는 공용 IP 주소가 자동 할당되고, DNS 연결만 하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.3.2 spec.loadBalancerClass&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로드밸런서를 다른 특정한 로드밸런서로 선택하고 싶을 때 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 번 지정하면 변경 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`metallb.io/l2` &amp;rarr; MetalLB&lt;/li&gt;
&lt;li&gt;`mycompany.com/custom-lb` &amp;rarr; 사내 자체 구현 로드밸런서&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: my-metallb-service
  namespace: default
spec:
  type: LoadBalancer
  loadBalancerClass: metallb.io/l2
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;한 번 지정하면 변경 불가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.3.3 AWS ELB 접근 로그 설정&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;metadata:
  name: my-service
  annotations:
    # 1. 접근 로그 기능 활성화 여부
    service.beta.kubernetes.io/aws-load-balancer-access-log-enabled: &quot;true&quot;

    # 2. 로그를 S3에 몇 분 간격으로 저장할지 (5 또는 60만 가능)
    service.beta.kubernetes.io/aws-load-balancer-access-log-emit-interval: &quot;60&quot;

    # 3. 로그를 저장할 S3 버킷 이름
    service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name: &quot;my-bucket&quot;

    # 4. S3 버킷 내 저장 위치 (예: logs/prod)
    service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix: &quot;logs/prod&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설정하면 S3에 로그가 쌓인다고 함 ~ &lt;span style=&quot;color: #666666;&quot;&gt;(더 좋은 방법이 있지 않을까?)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.3.4 AWS ELB Connection Draining&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로드 밸런서에서 인스턴스(파드 등)를 제거할 때, 기존에 연결된 사용자들의 세션이 끊기지 않도록 일정 시간 동안 요청을 마무리하고 난 후 제거하는 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;metadata:
  name: my-service
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-connection-draining-enabled: &quot;true&quot;
    service.beta.kubernetes.io/aws-load-balancer-connection-draining-timeout: &quot;60&quot; # 초 단위 (최대 3600)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`&quot;true&quot;`: 연결 드레이닝 기능 활성화&lt;/li&gt;
&lt;li&gt;`&quot;60&quot;`: 최대 60초까지 기존 연결을 유지함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 ELB를 통해 서비스 접속 중 (예: 파일 업로드 중)&lt;/li&gt;
&lt;li&gt;배포나 노드 종료로 인해 해당 파드를 제거하려고 함&lt;/li&gt;
&lt;li&gt;드레이닝이 설정되어 있으면:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 파드로의 &lt;b&gt;새 연결은 차단&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기존 연결은 60초간 유지&lt;/b&gt;되어 요청 완료 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;60초 내에 종료되면 gracefully 제거됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 그 외&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스는 API 오프젝트이기 때문에&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`kubectl get service my-service -o yaml` 로 YAML 확인 가능&lt;/li&gt;
&lt;li&gt;`kubectl proxy` 또는 직접 API 호출로 `/api/v1/namespaces/default/services` 로 접근 가능&lt;/li&gt;
&lt;li&gt;프로그램적으로 쿠버네티스 클러스터 내부에서 서비스 목록을 조회하거나 생성 가능&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Cloud(Infra)/공부</category>
      <author>iapaalst</author>
      <guid isPermaLink="true">https://iapaalst.tistory.com/31</guid>
      <comments>https://iapaalst.tistory.com/31#entry31comment</comments>
      <pubDate>Thu, 29 May 2025 15:23:37 +0900</pubDate>
    </item>
    <item>
      <title>[CKA]#4 Deployment</title>
      <link>https://iapaalst.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;
&lt;p class=&quot;page-description&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;h3 id=&quot;1ef995a6-b033-8005-9c94-fbdfe3e85ac3&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p id=&quot;1ef995a6-b033-805d-953b-f15fe553fc8e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kubernetes.io/ko/docs/concepts/workloads/controllers/deployment/&quot;&gt;[Kubernetes 공식문서] Deployment&lt;/a&gt;&lt;/p&gt;
&lt;p id=&quot;1ef995a6-b033-8034-ad94-f4f72453f6af&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 class=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 class=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h2 id=&quot;1ef995a6-b033-80a1-8c7b-fdf859e58aee&quot; data-ke-size=&quot;size26&quot;&gt;1. Deployment란?&lt;/h2&gt;
&lt;p id=&quot;202995a6-b033-8051-9899-d2d6d660d1f9&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1ef995a6-b033-8035-878b-d8cb4ba59c45&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 사용자가 &lt;code&gt;replicas: 5&lt;/code&gt;, &lt;code&gt;image: nginx:1.21&lt;/code&gt;이라고 선언하면,&lt;/p&gt;
&lt;ul id=&quot;1ef995a6-b033-8026-b45e-d83288d7a8b6&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Kubernetes는 현재 상태와 비교해서,
&lt;ul id=&quot;1ef995a6-b033-8090-a1a7-f9a4786c25b8&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;파드가 3개밖에 없으면 2개를 추가하고,&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1ef995a6-b033-80d6-8d4b-f2421dff9af9&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;이미지가 &lt;code&gt;nginx:1.20&lt;/code&gt;이면 &lt;code&gt;1.21&lt;/code&gt;로 순차적으로 업데이트하며&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1ef995a6-b033-8025-9a96-f43cd46f53e3&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;&quot;의도한 상태&quot;로 만들어줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;202995a6-b033-8081-9510-c1e99bac9060&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1ef995a6-b033-80d5-b5db-fa3b9cd6582b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1ef995a6-b033-8069-8faa-df87493c91ff&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 원하는 상태를 YAML로 선언만 하면, 알아서 조정해 주는 것임&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80f3-b161-dcb41922d7b9&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;Deployment는 &lt;b&gt;단순한 파드 관리 이상&lt;/b&gt;의 기능(롤링 업데이트, 롤백, 확장, 일시정지 등)을 제공하는 &lt;b&gt;상위 관리 오브젝트&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8075-b418-f2cc51d72dda&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1ef995a6-b033-8052-a0c2-e4db090a99d4&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1ef995a6-b033-80b0-805c-d80747cdcb0d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;대신,&lt;/p&gt;
&lt;blockquote id=&quot;1ef995a6-b033-807d-9f38-c718f70488ec&quot; data-ke-style=&quot;style2&quot;&gt;Deployment가 생성한 ReplicaSet이나 Pod를 직접 수정하면 안 됨.&lt;/blockquote&gt;
&lt;p class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1ef995a6-b033-80bf-80d7-d23faf09839c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;수정하고 싶다면 Deployment를 수정해야 함&lt;/p&gt;
&lt;p id=&quot;1ef995a6-b033-80d7-a1cd-c5780b9adfe4&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1ef995a6-b033-8080-9a03-d15408a98a3b&quot; data-ke-size=&quot;size23&quot;&gt;1.1 유스케이스&lt;/h3&gt;
&lt;p id=&quot;202995a6-b033-8078-9228-c1753542011a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1ef995a6-b033-8071-806e-e958a8907ef6&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;Deployment는 &lt;b&gt;배포/업데이트/복구/확장&lt;/b&gt; 등 운영에 필요한 기능을 자동화해주는데, 어떻게 사용이 되냐?&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80b7-9c5a-cdfcc3d202da&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1ef995a6-b033-8062-810d-fa06d1688246&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol id=&quot;1ef995a6-b033-8026-bdcb-d5babd27bd86&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;1&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;새로운 ReplicaSet을 생성해서 애플리케이션을 롤아웃(배포)&lt;/b&gt;
&lt;ul id=&quot;1ef995a6-b033-80b0-af87-d6229d87c230&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Deployment를 만들면, 그에 맞는 ReplicaSet이 생성되고 &amp;rarr; ReplicaSet이 파드를 자동으로 생성함&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1ef995a6-b033-8082-8d8f-ef2f7bd01db2&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;배포가 정상적으로 완료됐는지 상태(롤아웃 상태)를 확인할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;1ef995a6-b033-802b-9fcc-eb6a83f163b1&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;2&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;애플리케이션을 새 버전으로 업데이트 (rolling update)&lt;/b&gt;
&lt;ul id=&quot;1ef995a6-b033-809a-85d5-e4ca1c39f354&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Deployment의 &lt;code&gt;.spec.template&lt;/code&gt;을 바꾸면 (예: image 버전 변경),&amp;rarr; 새로운 ReplicaSet이 생성되고,&lt;/li&gt;
&lt;li id=&quot;1ef995a6-b033-8092-9067-fee7abad2c39&quot; class=&quot;&quot;&gt;&amp;rarr; 기존 파드를 조금씩 줄이고 새로운 파드를 조금씩 늘리는 &lt;b&gt;롤링 업데이트&lt;/b&gt;가 자동으로 일어남&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;1ef995a6-b033-803b-8014-fb9c901bc915&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;3&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;문제가 생기면 이전 버전으로 롤백&lt;/b&gt;
&lt;ul id=&quot;1ef995a6-b033-80fe-b9c3-c6f9d3a40111&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;문제가 발생한 경우, 이전에 잘 동작하던 상태로 되돌릴 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1ef995a6-b033-8080-aa80-cd921fdf6c52&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;이때도 버전 번호가 올라감 (수정 버전이 자동 관리됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;1ef995a6-b033-80be-88e5-f93aadf4bb09&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;4&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;애플리케이션 수평 확장 (scale up/down)&lt;/b&gt;
&lt;ul id=&quot;1ef995a6-b033-8091-84c6-efcc4cbb5a00&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;replicas&lt;/code&gt; 수치를 변경하면 &amp;rarr; 자동으로 파드 수 증가 또는 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;1ef995a6-b033-80b9-8587-cfd1d66538ac&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;5&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;배포 일시 중지 후, 여러 수정 후 재개&lt;/b&gt;
&lt;ul id=&quot;1ef995a6-b033-807f-a6d2-db529a85df72&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;rollout을 &lt;b&gt;pause&lt;/b&gt;하고 여러 설정을 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1ef995a6-b033-80c0-b8d3-c14e2d997c7c&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;다 수정하고 나서 &lt;b&gt;resume&lt;/b&gt;하면 그때 적용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;1ef995a6-b033-8021-886c-f16067b25ea7&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;6&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;배포가 막혀 있는 상태를 알 수 있음&lt;/b&gt;
&lt;ul id=&quot;1ef995a6-b033-8027-bc3e-f6b5517db79c&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;예: readiness probe 실패로 새 파드가 준비되지 않으면 롤아웃이 멈춰 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1ef995a6-b033-8098-9379-e9d3cc36fea9&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Deployment 상태로 이런 문제를 파악할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;1ef995a6-b033-80f5-8596-c9aa8c08dccf&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;7&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;이전 버전의 ReplicaSet 정리&lt;/b&gt;
&lt;ul id=&quot;1ef995a6-b033-8083-abc6-f517f7476e51&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;오래된 ReplicaSet은 자동으로 정리됨 (디플로이먼트가 관리함)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;1f1995a6-b033-8053-ac81-c02171a72f98&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-805d-b53d-dbef942d18b4&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8047-ba98-fc0de1747b80&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1ef995a6-b033-8032-8f4f-ede25a5d84cc&quot; data-ke-size=&quot;size23&quot;&gt;1.2 YAML&lt;/h3&gt;
&lt;p id=&quot;1f1995a6-b033-8043-93b0-f3c17aa22b36&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;#controllers/nginx-deployment.yaml&lt;/code&gt;&lt;/p&gt;
&lt;pre id=&quot;1f1995a6-b033-80e5-850d-c829e7e10a9f&quot; class=&quot;code yaml&quot;&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3              # 없으면 기본적으로 1개의 파드만 생성
  selector:
    matchLabels:
      app: nginx            # ★ 이게 .spec.selector
  template:                 # ★ 이게 .spec.template (실제 pod 정의)
    metadata:
      labels:
        app: nginx          # selector와 꼭 일치해야 함!
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;202995a6-b033-80e9-8e06-ec1949a58726&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80fc-b650-ea73313f2d41&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;파일 구성은 ReplicaSet과 다를게 없다.&lt;/p&gt;
&lt;ul id=&quot;1f8995a6-b033-8031-ab41-dd7497fbe35d&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;.spec.selector&lt;/code&gt;는 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-803f-898c-c1a595002f08&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;.spec.selector&lt;/code&gt;는 &lt;b&gt;한 번 생성하면 수정할 수 없다 (immutable)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-80de-9e14-ea6f29f152cf&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;.spec.selector&lt;/code&gt;와 &lt;code&gt;.spec.template.metadata.labels&lt;/code&gt;는 &lt;b&gt;꼭 일치&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f1995a6-b033-806e-bc44-d7422d9d06b2&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;HPA를 사용할 거면 &lt;code&gt;.spec.replicas&lt;/code&gt;는 &lt;b&gt;절대 설정하지 말 것!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;202995a6-b033-8006-b82b-f78afc50e1d8&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80ed-af4a-cc20fe0ef42d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-80fd-85c6-e9449ab3df91&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8032-b7cc-e11408b2f661&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;대신, 출력을 잘보자.&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80eb-84fe-f087220c5ccc&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;클러스터에서 디플로이먼트, 레플리카셋, 파드를 점검할 때, 다음 필드가 표시된다.&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80f8-b8a7-d1185df98ac2&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8014-9c7f-c1b7d3e7fd39&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-807b-a7ce-ec48017075b3&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8085-a2fa-f9a27aa3edc7&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1f1995a6-b033-809c-90c4-c29edce33333&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;1.2.1 Deployment&lt;/h3&gt;
&lt;pre id=&quot;1f1995a6-b033-80b1-9b7d-d8d7dedb004f&quot; class=&quot;code angelscript&quot;&gt;&lt;code&gt;NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           18s&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;1f1995a6-b033-8051-a454-f2c7b2e12089&quot; class=&quot;code vhdl&quot;&gt;&lt;code&gt;Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment &quot;nginx-deployment&quot; successfully rolled out&lt;/code&gt;&lt;/pre&gt;
&lt;ul id=&quot;1f1995a6-b033-80ff-9fbb-e711f6e1902c&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;READY&lt;/code&gt;: 준비된 파드 수 / 원하는 파드 수&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f1995a6-b033-8050-a2d2-fb31e6fd4289&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;UP-TO-DATE&lt;/code&gt;: 최신 템플릿 기준으로 생성된 파드 수&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f1995a6-b033-80b5-b61c-df4c91738ffd&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;AVAILABLE&lt;/code&gt;: 사용자 요청 처리 가능한 파드 수&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f1995a6-b033-80a5-9ad5-f6070c80bb0a&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;AGE&lt;/code&gt;: 생성된 지 얼마나 되었는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;202995a6-b033-80e5-b0ff-d47d723c5b0d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8092-b29a-c685bdb3a27e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1f1995a6-b033-80e9-bd16-d9d6f76ac913&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;1.2.2 ReplicaSet&lt;/h3&gt;
&lt;pre id=&quot;1f1995a6-b033-8051-adb7-f4974913b473&quot; class=&quot;code angelscript&quot;&gt;&lt;code&gt;NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-75675f5897   3         3         3       18s&lt;/code&gt;&lt;/pre&gt;
&lt;ul id=&quot;1f1995a6-b033-8036-96db-ec6b98f217f0&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;이름은 보통 &lt;code&gt;디플로이먼트이름-HASH&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f1995a6-b033-808a-9dc9-e70803f70a29&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;.pod-template-hash&lt;/code&gt; 라벨과 일치&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f1995a6-b033-80c4-88ff-eefb462927f3&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;DESIRED&lt;/code&gt;, &lt;code&gt;CURRENT&lt;/code&gt;, &lt;code&gt;READY&lt;/code&gt; 필드로 상태 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;202995a6-b033-8031-9c54-c1ea229ff6f0&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-805b-80e2-dc508365585d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1f1995a6-b033-802b-a598-ed188c735af3&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;1.2.3 Pod&lt;/h3&gt;
&lt;pre id=&quot;1f1995a6-b033-8057-b4de-d4d84f7f9ebc&quot; class=&quot;code angelscript&quot;&gt;&lt;code&gt;NAME                                READY     STATUS    RESTARTS   AGE       LABELS
nginx-deployment-75675f5897-7ci7o   1/1       Running   0          18s       app=nginx,pod-template-hash=3123191453
nginx-deployment-75675f5897-kzszj   1/1       Running   0          18s       app=nginx,pod-template-hash=3123191453
nginx-deployment-75675f5897-qqcnn   1/1       Running   0          18s       app=nginx,pod-template-hash=3123191453&lt;/code&gt;&lt;/pre&gt;
&lt;ul id=&quot;1f1995a6-b033-8025-96fd-eaa55475d77d&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;이름도 보통 &lt;code&gt;디플로이먼트이름-HASH-랜덤문자&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f1995a6-b033-80c6-bf4d-dafbecc5e0b6&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;app=nginx&lt;/code&gt;, &lt;code&gt;pod-template-hash=...&lt;/code&gt; 라벨이 자동 부여됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;202995a6-b033-8073-8699-db39671874b5&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8090-948a-db128592dca8&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1f1995a6-b033-802c-b5d1-fc70677476e2&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;1.2.4 파드 템플릿 라벨&lt;/h3&gt;
&lt;p id=&quot;202995a6-b033-8052-951a-d79879723645&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8055-8905-e086fc3a8ce2&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;여기서, &lt;code&gt;pod-template-hash&lt;/code&gt; 라벨이 자꾸 튀어나오는데 무엇이냐면?&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80df-a7b4-d1a5c651a84e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8095-8802-d1dd362e43a6&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;ReplicaSet의 문제점이 selector의 라벨이 겹치지 않아야 함.&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80a1-affa-c8588fb20a93&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;만약 겹친 경우 여러 ReplicaSet이 관리가 ..해당 파드를 소유하게 될 수 있음.&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80cb-8e8e-ed384e295aa6&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;이와 비슷한 맥락으로 Deployment도 &lt;b&gt;단순한 파드 관리 이상&lt;/b&gt;의 기능을 하기 때문에 여러 ReplicaSet을 가짐.&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80e9-8c51-dc2fb600d2cd&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80b6-a5c6-fdc868f8b7da&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 여러 버전의 ReplicaSet을 동시에 가지게 되는데 이때 서로 겹치는 파드를 관리하지 않도록 하기 위해 &lt;code&gt;pod-template-hash&lt;/code&gt; 값이 다르게 설정되어 &lt;b&gt;각 ReplicaSet이 자신만의 파드만 관리&lt;/b&gt;하도록 하는 것.&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8004-8be0-da868198918f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80ea-a00a-f52a3767472b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80f0-86a8-d3c43bffd77f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;즉, Deployment가 ReplicaSet을 유일하게 구분하고 충돌 없이 관리하기 위해 파드 템플릿 내용을 해시한 값입니다. 이 값은 Deployment 컨트롤러가 자동으로 생성하며, 사용자가 직접 수정하면 시스템 동작이 꼬일 수 있기 때문에 변경하면 안 됩니다.&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80f1-81e1-c033107b5c9d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8042-8e47-e5bb72e766c8&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;apps/v1에서는 selector가 생성 후에 변경이 아예 불가능;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8041-a5db-e4e9cf4aaf1e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;1f1995a6-b033-804d-8ed7-db0227a2e3cc&quot; data-ke-size=&quot;size26&quot;&gt;2. 업데이트&lt;/h2&gt;
&lt;p id=&quot;1f1995a6-b033-8084-8c07-f22f354b8d80&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;디플로이먼트는 파드를 업데이트할 때 &lt;b&gt;롤링 업데이트&lt;/b&gt; 방식으로 점진적으로 업데이트를 수행합니다. &lt;b&gt;롤링 업데이트&lt;/b&gt;는 한 번에 모든 파드를 업데이트하지 않고, 몇 개씩 순차적으로 업데이트하여 서비스의 다운타임을 최소화합니다.&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8037-a69d-f4440e6f8696&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80ef-9033-e9999c859590&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, &lt;code&gt;nginx:1.14.2&lt;/code&gt; 이미지를 &lt;code&gt;nginx:1.16.1&lt;/code&gt;로 업데이트할 때:&lt;/p&gt;
&lt;ul id=&quot;1f1995a6-b033-80d4-8ed9-d4179b4fb2c6&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;디플로이먼트는 &lt;b&gt;새 파드를 생성하고&lt;/b&gt; (새로운 레플리카셋으로),&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f1995a6-b033-8029-bf08-ddb4d89e38b7&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;기존 파드를 삭제&lt;/b&gt;하는 방식으로 업데이트합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;1f1995a6-b033-8024-8bd0-ff4556e11772&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 통해 &lt;b&gt;서비스가 중단되지 않고 점진적으로 새로운 버전으로 변경&lt;/b&gt;됩니다.&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-803f-8570-d1c7831c4df5&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1f1995a6-b033-804c-ae54-e8a1ce9bb87d&quot; data-ke-size=&quot;size23&quot;&gt;2.1 파드 수의 제한&lt;/h3&gt;
&lt;p id=&quot;1f1995a6-b033-80c5-8b08-c41571f40639&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;디플로이먼트는 항상 &lt;b&gt;최소 75% 이상의 파드가 동작하도록 보장함. &lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80a0-b0b8-f74d9faaee8d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-806a-af1d-db277ce62bd0&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 디플로이먼트는 롤링 업데이트 중에 &lt;b&gt;최대 25%의 파드만 동시에 다운&lt;/b&gt;되도록 설정되어 있음.&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80f8-ae8a-e6b40d5fb55d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80ee-9fd0-f2769a9b452e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 디플로이먼트가 업데이트 중일 때, 적어도 75%의 파드는 계속 실행됩니다. 이 설정은 서비스의 가용성을 유지하기 위해 매우 중요함.&lt;/p&gt;
&lt;ul id=&quot;1f1995a6-b033-8088-abf7-e265fe55c254&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;&lt;b&gt;maxUnavailable&lt;/b&gt;&lt;/code&gt;: 롤링 업데이트 중 동시에 다운될 수 있는 파드의 최대 개수입니다. 기본적으로 최대 25%까지 설정됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f1995a6-b033-8003-9f23-d7f57fa70945&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;&lt;b&gt;maxSurge&lt;/b&gt;&lt;/code&gt;: 롤링 업데이트 중 동시에 실행되는 파드의 최대 수입니다. 기본적으로 25%까지 설정되어 있으며, 디플로이먼트가 새 파드를 추가할 때 이를 제어합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;202995a6-b033-801d-812b-f532fd46e240&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8033-8bf4-dc54e8e52f98&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8080-b447-dee936663ebf&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시&lt;/b&gt;:&lt;/p&gt;
&lt;ul id=&quot;1f1995a6-b033-80f4-93b9-f9845c389877&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;디플로이먼트의 레플리카 수가 4일 경우, &lt;b&gt;최소 3개&lt;/b&gt;의 파드는 항상 실행되어야 합니다. &lt;code&gt;maxSurge&lt;/code&gt;와 &lt;code&gt;maxUnavailable&lt;/code&gt; 설정에 따라, 최대 5개의 파드가 동시에 실행될 수 있으며, 최소 3개는 항상 실행됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul id=&quot;1f1995a6-b033-80f4-93b9-f9845c389877&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;&lt;b&gt;availableReplicas&lt;/b&gt;&lt;/code&gt;: 종료 중인(&lt;code&gt;terminating&lt;/code&gt;) 파드는 포함되지 않으며, 현재 실행 중인 &lt;b&gt;사용 가능한&lt;/b&gt; 파드만 계산됩니다. 롤링 업데이트 중에는 새로 생성된 파드가 완료되기 전까지 이전 파드가 삭제되지 않기 때문에, &lt;code&gt;availableReplicas&lt;/code&gt;는 예기치 않게 더 많은 수치를 보일 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;202995a6-b033-8075-9e80-cae5733ae07c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80b0-909e-caf0d267e615&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8064-be9a-d6c95399d330&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1f1995a6-b033-8069-ac98-d31da81eb422&quot; data-ke-size=&quot;size23&quot;&gt;2.3 롤오버(일명 인-플라이트 다중 업데이트)&lt;/h3&gt;
&lt;p id=&quot;1f1995a6-b033-8005-964e-f01d14e4c731&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;= 기존 디플로이먼트 업데이트(롤링 중) 도중에 또 다른 업데이트가 발생했을 때의 처리 방식&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80d1-9123-d28b1a953843&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-805a-8397-eb6d2c75c19e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;디플로이먼트는 &lt;b&gt;이전 요청이 완전히 끝나지 않았더라도&lt;/b&gt; 최신 요청 기준으로 동작함. &lt;b&gt;기존 버전(nginx:1.14.2)의&lt;/b&gt; 나머지 파드는 더 이상 만들지 않고 중단함 대신 &lt;b&gt;새 버전(nginx:1.16.1)으로&lt;/b&gt; 파드를 만들기 시작함 이전 레플리카셋은 &lt;b&gt;스케일 다운&lt;/b&gt;되어 사라지고, 새로운 레플리카셋이 &lt;b&gt;스케일 업&lt;/b&gt;됨&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8047-86bd-da5287342fa7&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-801f-9383-f89c4c859919&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;즉, 롤링 업데이트 중에 또 업데이트가 들어오면&lt;/b&gt;, 새로운 버전으로 바로 전환함&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8082-8f32-c2df250bdceb&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80a5-9c18-d944c64e97c6&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80f2-8ec3-f9a5f3919b9f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;1f1995a6-b033-80d8-8b25-e3a84bb6f5b3&quot; data-ke-size=&quot;size26&quot;&gt;3. 롤백&lt;/h2&gt;
&lt;p id=&quot;1f1995a6-b033-80bf-a7d0-f02f5c80c7ff&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80a4-be8c-f2002ad37e9a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;만약 새로운 버전으로 업데이트한 후 오류가 발생하면, 자동으로 중단하거나, 수동으로 롤백함.&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-800d-b5fd-cc83d3c7b712&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-809b-963e-c5227324cc6e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;. spec.template이&lt;/code&gt; 바뀌면 수정 버전(Revision)이 생기는데, 이걸 기준으로 &lt;b&gt;롤백. 대신 수정 버전은 `&lt;/b&gt;.spec.template&lt;b&gt;`&lt;/b&gt;이 바뀌었을 때만 생성됨.&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8036-850b-c086788814eb&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-803d-9c53-ebbe45ec814d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80a0-a318-c18ca944c98b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어서,&lt;/p&gt;
&lt;ol id=&quot;1f1995a6-b033-8025-9280-d8caf5b96de9&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;1&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;오타로 잘못된 이미지 입력&lt;/b&gt;
&lt;pre id=&quot;1f1995a6-b033-80c1-a64c-c141a322b548&quot; class=&quot;code routeros&quot;&gt;&lt;code&gt;kubectl set image deployment/nginx-deployment nginx=nginx:1.161&lt;/code&gt;&lt;/pre&gt;
&lt;ul id=&quot;1f1995a6-b033-80c3-9e68-c153c632f3fe&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;실제로 존재하지 않는 이미지라서 &lt;code&gt;&lt;b&gt;ImagePullBackOff&lt;/b&gt;&lt;/code&gt;&lt;b&gt; 상태&lt;/b&gt;로 고착됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;1f1995a6-b033-8089-bbeb-ff39f849713c&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;2&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;롤아웃 상태 확인&lt;/b&gt;
&lt;pre id=&quot;1f1995a6-b033-801d-9a93-fa5a27459583&quot; class=&quot;code fortran&quot;&gt;&lt;code&gt;kubectl rollout status deployment/nginx-deployment&lt;/code&gt;&lt;/pre&gt;
&lt;ul id=&quot;1f1995a6-b033-80ab-bd0a-c28a14660042&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;출력: &lt;code&gt;1 out of 3 new replicas have been updated...&lt;/code&gt; (계속 대기)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;1f1995a6-b033-8000-8ee6-dd3c76930978&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;3&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;&lt;b&gt;kubectl get rs&lt;/b&gt;&lt;/code&gt;
&lt;ul id=&quot;1f1995a6-b033-80e3-a6fb-d1239f1cbd68&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;새 레플리카셋이 1개 생성되었지만, 파드가 문제로 제대로 실행되지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f1995a6-b033-804a-9c34-f0fb1fea4a9a&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;이전 정상 상태의 레플리카셋도 아직 남아있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;1f1995a6-b033-8056-8efe-d958ef282609&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;4&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;문제 원인&lt;/b&gt;
&lt;ul id=&quot;1f1995a6-b033-80a3-a166-ddf1f5e050d2&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;오타로 인해 이미지를 불러올 수 없고&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f1995a6-b033-80ac-8688-ea492e3fca4c&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;쿠버네티스는 기본적으로 25%만 비정상 파드를 허용하므로 &lt;b&gt;롤아웃이 멈춤&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;1f1995a6-b033-807a-aea4-f0c2cd47f05a&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;5&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;해결 방법: 롤백&lt;/b&gt;
&lt;pre id=&quot;1f1995a6-b033-8061-913e-fbe2f945b45e&quot; class=&quot;code mel&quot;&gt;&lt;code&gt;kubectl rollout undo deployment/nginx-deployment&lt;/code&gt;&lt;/pre&gt;
&lt;ul id=&quot;1f1995a6-b033-8083-af9c-cad0476e2c0e&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;가장 최근의 정상 상태로 롤백함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;1f1995a6-b033-80de-83cd-c4968806cf11&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1f1995a6-b033-80fa-9dbf-e0ae30dedb33&quot; data-ke-size=&quot;size23&quot;&gt;3.1 롤아웃 기록&lt;/h3&gt;
&lt;p id=&quot;1f1995a6-b033-807e-a174-feec04ca189c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 디플로이먼트가. spec.template이 바뀔 때마다 수정 버전을 하나씩 남기는데 각 버전의 변경 내역을 볼 수 있고, 원하면 특정 버전으로 롤백할 수도 있음.&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8016-a258-ddb72904bce5&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;1f1995a6-b033-803e-841b-dbeab5f82a3a&quot; data-ke-size=&quot;size20&quot;&gt;3.1.1 롤아웃 기록 확인&lt;/h4&gt;
&lt;pre id=&quot;1f1995a6-b033-8096-81a3-e84ec0e7eea1&quot; class=&quot;code bash&quot;&gt;&lt;code&gt;kubectl rollout history deployment/nginx-deployment&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;202995a6-b033-80e2-a883-e0e1e6b70494&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80ac-8fd3-e5e943176827&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;예시 출력:&lt;/p&gt;
&lt;pre id=&quot;1f1995a6-b033-8043-8665-c4d669d20a89&quot; class=&quot;code routeros&quot;&gt;&lt;code&gt;REVISION    CHANGE-CAUSE
1           kubectl apply --filename=...
2           kubectl set image ... nginx=nginx:1.16.1
3           kubectl set image ... nginx=nginx:1.161&lt;/code&gt;&lt;/pre&gt;
&lt;ul id=&quot;1f1995a6-b033-80b1-be24-ddef1d975901&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;REVISION&lt;/b&gt;: 디플로이먼트 버전 번호&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f1995a6-b033-80ae-8a90-d3a13d2edca0&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;CHANGE-CAUSE&lt;/b&gt;: 무엇 때문에 수정되었는지 나타냄
&lt;ul id=&quot;1f1995a6-b033-8021-a78c-f6cc30a11e9e&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;&lt;code&gt;kubectl set image&lt;/code&gt;나 &lt;code&gt;kubectl apply&lt;/code&gt; 등의 명령이 표시됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;1f1995a6-b033-80ae-b132-c443ee4a4f0c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;1f1995a6-b033-80d7-b56b-cb8581759d0a&quot; data-ke-size=&quot;size20&quot;&gt;3.1.2 특정 수정 버전 상세 보기&lt;/h4&gt;
&lt;pre id=&quot;1f1995a6-b033-80b3-85f3-fc32e0ad2d42&quot; class=&quot;code jboss-cli&quot;&gt;&lt;code&gt;kubectl rollout history deployment/nginx-deployment --revision=2&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;1f1995a6-b033-803b-af0d-eaa1233f91a2&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;1f1995a6-b033-80c1-a566-c8a5f6cbb0fd&quot; data-ke-size=&quot;size26&quot;&gt;4. 스케일링&lt;/h2&gt;
&lt;p id=&quot;1f1995a6-b033-80cf-adb9-fe90ddbe721f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;디플로이먼트도 rs처럼 수동 또는 자동으로 스케일링한다.&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-808b-ab33-dcc54b1774c4&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1f1995a6-b033-8097-b805-de6674d62ac3&quot; data-ke-size=&quot;size23&quot;&gt;4.1 비례적 스케일링&lt;/h3&gt;
&lt;p id=&quot;1f1995a6-b033-802a-8a89-cc1ed9a6c371&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 롤링 업데이트 도중에 &lt;b&gt;기존 파드와 새 파드에 파드 개수를 비율로 잘 분산&lt;/b&gt;하는 방식&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-802b-b257-c3192d9f72ce&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80aa-afc6-e71910152002&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-802e-a310-ff3751ab5641&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;롤링 업데이트 중이어서 기존 파드가 10개고 5개를 늘린다고 하면, 새 버전 이미지로 업데이트가 시작됨&lt;b&gt;. 이때 오토스케일러가 개입해서 파드 수 15개로 늘리라고 요청함&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8074-801b-d7283952c20e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80eb-a67a-d8d706e2e31a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;기존 RS: 8개 중 3개 추가 &amp;rarr; 총 11개&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-808f-9753-cd3f049f45b1&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;새 RS: 5개 중 2개 추가 &amp;rarr; 총 7개&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8004-ba7b-ddf572047155&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80c9-87f5-e3a3d86d9d27&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;현재 활성 레플리카셋(New + Old)에 비율에 따라 새 파드를 골고루 배분&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-804e-ae5d-cf282a5031b9&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 즉, 업데이트가 아직 완료되지 않았을 때는 분산해서 안전하게 늘림&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80e2-b3b9-d90625d493c6&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8048-be70-da533bfd08fd&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;새 파드가 모두 정상 상태가 되면, 기존 구 버전 파드를 점점 줄이고 최종적으로 모든 파드가 신버전으로 전환됨&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-8075-b2c7-ef3cea7154e4&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-801c-9832-c1532051edb1&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;1f1995a6-b033-8085-8f16-db1430540a13&quot; data-ke-size=&quot;size26&quot;&gt;5. 일시정지 및 재개(기본값 = false)&lt;/h2&gt;
&lt;p id=&quot;1f1995a6-b033-800e-8216-caf400c46138&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;.spec.template&lt;/code&gt; 안의 내용이 변경되면 롤아웃되는데 파일에서 한 번에 여러 항목을 변경하면 한 번의 롤아웃이 트리거가 됨&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-80e7-826c-fc9998d9d63f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80c9-b89a-c1bd8f422546&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;근데? 왜 &lt;code&gt;pause&lt;/code&gt;/&lt;code&gt;resume&lt;/code&gt;을 쓰냐?&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8032-bd63-ec2ed594ddab&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-801f-8ec9-ebd02dba8a34&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;CLI 명령어로 여러 번 나눠서 수정하는 경우, 수정할 때마다 롤아웃이 발생함. 그렇기 때문에 일시정지하고 재개하는 것임. 배포 제어하려고&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80bd-b38d-fe75af71dd67&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80ee-9f38-fe20f26667ce&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f1995a6-b033-80b1-bb9d-e4620ef372dd&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;대신, 일시 중지된 디플로이먼트를 재개할 때까지 롤백할 수 없음 ~&lt;/p&gt;
&lt;pre id=&quot;1f8995a6-b033-8048-8463-f5698ff62cd2&quot; class=&quot;code yaml&quot;&gt;&lt;code&gt;spec:
  paused: true&lt;/code&gt;&lt;/pre&gt;
&lt;ul id=&quot;1f8995a6-b033-8059-883d-d04361f81a1e&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;위와 같이 설정하면, 이후 &lt;code&gt;.spec.template&lt;/code&gt;의 이미지나 리소스 등을 바꿔도 &lt;b&gt;롤아웃되지 않음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-809b-bbcf-e0eaa8b13b80&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;나중에 다음 명령으로 롤아웃 재개:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;1f8995a6-b033-8066-884f-f5b7e614cfa0&quot; class=&quot;code hsp&quot;&gt;&lt;code&gt;kubectl rollout resume deployment/nginx-deployment&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;202995a6-b033-80b8-b433-d73a6b4b3d0b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80ba-9335-c043936ec828&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8072-a912-d87e328bca60&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;1f1995a6-b033-80bf-8918-c3deac3513b4&quot; data-ke-size=&quot;size26&quot;&gt;6. 상태&lt;/h2&gt;
&lt;h3 id=&quot;1f4995a6-b033-805b-a5ae-cb8493b6b94c&quot; data-ke-size=&quot;size23&quot;&gt;6.1 진행 중 = 디플로이먼트가 무언가를 바꾸고 있는 중일 때&lt;/h3&gt;
&lt;p id=&quot;1f4995a6-b033-80cc-ac1c-d4f9ae0393c2&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;디플로이먼트 오브젝트의 &lt;code&gt;.status.conditions&lt;/code&gt; 항목에 다음과 같은 정보가 들어갑니다:&lt;/p&gt;
&lt;pre id=&quot;1f4995a6-b033-8038-bc73-c2bafab3da00&quot; class=&quot;code avrasm&quot;&gt;&lt;code&gt;type: Progressing
status: &quot;True&quot;
reason: NewReplicaSetCreated | FoundNewReplicaSet | ReplicaSetUpdated&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;1f4995a6-b033-806b-96d4-de071556dc60&quot; class=&quot;code vala&quot;&gt;&lt;code&gt;kubectl rollout status deployment/nginx
# 출력 예시:
# Waiting for deployment &quot;nginx&quot; rollout to finish: 1 out of 3 new replicas have been updated...&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;202995a6-b033-80b0-96fc-f52a27229e7a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1f4995a6-b033-80fd-8036-d3a05d9dcd62&quot; data-ke-size=&quot;size23&quot;&gt;6.2 완료 = 모든 파드가 최신 상태 + 사용 가능 + 이전 버전 없음&lt;/h3&gt;
&lt;p id=&quot;1f4995a6-b033-8022-b44c-de694e5aaaed&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;.status.conditions&lt;/code&gt; :&lt;/p&gt;
&lt;pre id=&quot;1f4995a6-b033-8088-8cc8-cee4fe7bc35a&quot; class=&quot;code avrasm&quot;&gt;&lt;code&gt;type: Progressing
status: &quot;True&quot;
reason: NewReplicaSetAvailable&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;202995a6-b033-80a8-9a5c-c4c7b21ff69f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f4995a6-b033-80f9-96f6-d8efd29ebc4e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;출력 예시:&lt;/p&gt;
&lt;pre id=&quot;1f4995a6-b033-800d-8916-eec0ae8fc925&quot; class=&quot;code angelscript&quot;&gt;&lt;code&gt;Waiting for rollout to finish: 2 of 3 updated replicas are available...
deployment &quot;nginx-deployment&quot; successfully rolled out

echo $? # 종료 코드 0&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;202995a6-b033-80e7-b9d4-e21435d4556c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;202995a6-b033-8065-84c0-f595b25933a1&quot; data-ke-size=&quot;size23&quot;&gt;6.3 실패&lt;/h3&gt;
&lt;p id=&quot;1f8995a6-b033-80d3-934f-cdc61ade5e10&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-801d-9f90-c93d81090bd0&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  가능한 실패 원인&lt;/b&gt;&lt;/p&gt;
&lt;ul id=&quot;1f8995a6-b033-809e-9a21-fd79771065cc&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;이미지가 존재하지 않거나 Pull 오류 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-80cf-aff5-d5bf810a8679&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;readiness probe 실패&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-8041-af4b-d4eb3ed4f692&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;리소스 부족 (예: CPU, 메모리)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-8040-9fb6-cba0ce859acd&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;권한 부족 (RBAC 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-8074-9643-dcfa444d5a7b&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;할당량(quota) 초과&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-8031-9766-e73d5b9381c7&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;잘못된 애플리케이션 설정 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;1f8995a6-b033-803b-a674-fc3d8f754d69&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;1f8995a6-b033-8035-af06-cd9368302e4d&quot; data-ke-size=&quot;size20&quot;&gt;6.3.1 progressDeadlineSeconds&lt;/h4&gt;
&lt;p id=&quot;1f8995a6-b033-80a0-a881-d214ba2e61a0&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;만약 위 실패 원인으로 롤아웃이 실패가 되기까지 기본값이 600(10분)을 기다려야 함. 그렇기 때문에 문제가 발생했을 때 적절한 조치를 취하기 위해 설정하는 것.&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8099-861c-ecaf1f0affb3&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-8093-9ceb-c7671e47b787&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어서 잘못된 이미지(&lt;code&gt;nginx:typo&lt;/code&gt;)로 인해 파드가 &lt;code&gt;ImagePullBackOff&lt;/code&gt; 상태인데, 롤아웃 실패로 간주되기까지 &lt;b&gt;10분이나 기다려야 함.&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80ce-9a4a-d332e86ca6de&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-80f9-8c6a-e0da4ccdde7d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;code&gt;progressDeadlineSeconds: 60&lt;/code&gt;으로 줄이면, &lt;b&gt;1분 안에 롤아웃 실패 감지&lt;/b&gt; 가능.&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80ca-8ab1-cd3aa345046e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-80ff-b517-c4885f4bd104&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;예: 60(1분) 동안 롤아웃이 완료되지 않으면 실패 처리&lt;/p&gt;
&lt;pre id=&quot;1f8995a6-b033-8078-a50c-e8ba11750d14&quot; class=&quot;code jboss-cli&quot;&gt;&lt;code&gt;kubectl patch deployment/nginx-deployment -p '{&quot;spec&quot;:{&quot;progressDeadlineSeconds&quot;:60}}'&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;1f8995a6-b033-807f-8bd3-dda0662ee6ca&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-809c-9190-d7b1fe965753&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 설정하면 더 빠르게 실패로 간주해서 운영 자동화 및 디버깅에 유리하게 된다 ~&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-8067-9b93-c5439037b4a3&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-809f-a086-ee168aa5c270&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;디플로이먼트 진행 데드라인을 넘어서면, 쿠버네티스는 진행 컨디션의 상태와 이유를 업데이트함.&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-806a-9358-d23fcacb057b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;.status.conditions&lt;/code&gt; :&lt;/p&gt;
&lt;pre id=&quot;1f8995a6-b033-8076-8e68-d949542e6ec4&quot; class=&quot;code routeros&quot;&gt;&lt;code&gt;Conditions:
  Type            Status  Reason
  ----            ------  ------
  Available       True    MinimumReplicasAvailable
  Progressing     False   ProgressDeadlineExceeded #설정했을 경우
  ReplicaFailure  True    FailedCreate&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;1f8995a6-b033-80c0-b3c3-e2651f8113d5&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;출력 예시:&lt;/p&gt;
&lt;pre id=&quot;1f8995a6-b033-8068-ae1b-edc3b5218763&quot; class=&quot;code autoit&quot;&gt;&lt;code&gt;kubectl rollout status deployment/nginx-deployment
# 출력:
# error: deployment &quot;nginx-deployment&quot; exceeded its progress deadline

echo $?  # 종료 코드 1&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;1f8995a6-b033-8070-a088-e128c0ae49f2&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul id=&quot;1f8995a6-b033-80a3-8577-f64d04b93efa&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;progressDeadlineSeconds&lt;/code&gt;는 &lt;b&gt;선택 필드&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-80d8-a404-fc2b752c4141&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;만약 설정한다면, &lt;code&gt;minReadySeconds&lt;/code&gt;&lt;b&gt;보다 커야 함&lt;/b&gt;(파드가 준비됐다고 간주되기까지 기다리는 시간보다 길어야 한다는 뜻)
&lt;pre id=&quot;1f8995a6-b033-80cc-a82a-f6d7f4f4d4c0&quot; class=&quot;code yaml&quot;&gt;&lt;code&gt;spec:
  progressDeadlineSeconds: 300  # 5분 안에 롤아웃 완료 안 되면 실패로 간주
  minReadySeconds: 60&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;202995a6-b033-80fd-a78b-d2d9656f281a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80db-b900-c02e9c905ee2&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80f0-bf29-e645cbe6cd04&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;1f8995a6-b033-808a-b207-fb751336aeab&quot; data-ke-size=&quot;size26&quot;&gt;7. 그 외&lt;/h2&gt;
&lt;h3 id=&quot;1f8995a6-b033-80b7-b00a-da0c09f2af56&quot; data-ke-size=&quot;size23&quot;&gt;7.1 &lt;code&gt;.spec.revisionHistoryLimit&lt;/code&gt;(기본값=10)&lt;/h3&gt;
&lt;p id=&quot;1f8995a6-b033-80e2-9e73-f1f4c6e7af86&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;디플로이먼트가 새로운 롤아웃(업데이트)을 할 때마다 &lt;b&gt;이전 버전의 ReplicaSet&lt;/b&gt;을 하나씩 남기는데 몇 개까지 남길 것인지 결정하는 것. 대신 롤아웃을 성공했을 때만 정리함 &amp;rarr; &lt;span style=&quot;border-bottom: 0.05em solid;&quot;&gt;즉, revisionHistoryLimit보다 오래된 이전 버전들이 자동으로 정리됨&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-805b-b3bc-f56536ec2ef6&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-8014-9d0d-cfc997a1755a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;근데?&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-8089-86c5-ec1f7601bd52&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;진행 중이거나 실패 중이면 제한보다 더 많은 이전 버전이 남아 있을 수 있음&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80b5-9a10-c119c77686e7&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-80ee-b8a6-d39f102c6948&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;근데?&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-8051-8387-f95e673f5f6e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;0이면 롤백 못함. 이전 버전 없어서&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-8073-9919-e22d8596eef1&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;revisionHistoryLimit: 3&lt;/code&gt; &amp;rarr; 가장 최근의 3개 버전까지만 롤백 가능&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-804b-a309-c7d3022bda5f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-805b-8073-f6e5600c0fad&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;왜 중요한가?&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-808d-ae9a-c0739eec1316&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;너무 많은 ReplicaSet을 남기면:&lt;/p&gt;
&lt;ul id=&quot;1f8995a6-b033-804b-b63e-f215ff4cf2d1&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;etcd 저장소 낭비&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-805f-8d50-e92f2628b4f9&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;kubectl get rs 목록 복잡해짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;1f8995a6-b033-808e-80a9-eae1c86a802c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;너무 적게 설정하면:&lt;/p&gt;
&lt;ul id=&quot;1f8995a6-b033-802e-9f58-cf18e8163e4f&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;이전 상태가 없어서 롤백이 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;202995a6-b033-80b2-82ba-d0ad39af1a85&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-8098-9f8e-e2339278ed9e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1f8995a6-b033-80db-b5c2-f4f64897e44d&quot; data-ke-size=&quot;size23&quot;&gt;7.2 카나리아 배포&lt;/h3&gt;
&lt;p id=&quot;1f8995a6-b033-80b0-83e2-d4a51f7c63b9&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;전체를 한 번에 바꾸지 말고, 조금씩 나눠서 새 버전을 테스트하자&quot;라는&lt;/b&gt; 개념&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-80f6-bbbc-e65fe37df00c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-806d-ae03-f92a654c3b8c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ol id=&quot;1f8995a6-b033-80f7-b832-ce0684bebfc4&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;1&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;기존 버전 (&lt;code&gt;v1&lt;/code&gt;)을 가진 Deployment가 &lt;b&gt;전체 100개&lt;/b&gt; 파드를 운영하고 있음.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;1f8995a6-b033-809d-a56c-d9350c7f49fc&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;2&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;새 버전(&lt;code&gt;v2&lt;/code&gt;)을 일부만 롤아웃하고 싶을 때:
&lt;ul id=&quot;1f8995a6-b033-8089-bbef-e64e8b50dc5d&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;v2 전용 Deployment&lt;/b&gt;를 따로 만들어 &lt;b&gt;10개만 배포&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-8054-998c-d2142de047af&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;v1은 90개 그대로 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;1f8995a6-b033-80cb-862f-dc57e720bea2&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: decimal;&quot; start=&quot;3&quot; type=&quot;1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;v2의 동작이 안정적임을 확인한 뒤 &amp;rarr; 점진적으로 수를 늘려나감
&lt;ul id=&quot;1f8995a6-b033-80d8-a7f4-f34ecddbe0e0&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;v2 30개 / v1 70개 &amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-8048-9501-d5db141bd6c1&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;최종적으로 v2 100개 &amp;rarr; v1 완전 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;1f8995a6-b033-80f9-8962-d5d66aa55b85&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1f8995a6-b033-804c-8160-d50ae0ebc291&quot; data-ke-size=&quot;size23&quot;&gt;7.3 &lt;code&gt;.spec.strategy&lt;/code&gt;&lt;/h3&gt;
&lt;p id=&quot;1f8995a6-b033-8007-bf31-f56718298279&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;기존 파드를 새로운 파드로 어떻게 교체할지를 결정하는 전략 필드&lt;/p&gt;
&lt;p id=&quot;1f8995a6-b033-8064-9d40-e554b13415b7&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;7.3.1 RollingUpdate(기본값)&lt;/p&gt;
&lt;pre id=&quot;1f8995a6-b033-80fe-95b5-ddeda32092ca&quot; class=&quot;code yaml&quot;&gt;&lt;code&gt;strategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 3 # or 30%, 전체 파드 중 최대 3개까지 동시 중단될 수 있음
    maxSurge: 3 # or 30%, 전체 파드 10개면 최대 3개를 추가 생성할 수 있음&lt;/code&gt;&lt;/pre&gt;
&lt;ul id=&quot;1f8995a6-b033-8058-b23e-c24a8741e627&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;maxUnavailable&lt;/b&gt;: 새 파드가 준비되기 전에 내려도 되는 기존 파드 수 (기본 25%)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-8019-af27-f96d0615cd6d&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;maxSurge&lt;/b&gt;: 의도한 파드 수보다 &lt;b&gt;더 많이 생성해도 되는 새 파드 수&lt;/b&gt; (기본 25%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;1f8995a6-b033-80be-b930-f00a1dab644d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1f8995a6-b033-8010-8c0f-f626182e0270&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;7.3.2 Recreate&lt;/h3&gt;
&lt;pre id=&quot;1f8995a6-b033-803b-a2b1-f6ede85caab7&quot; class=&quot;code dts&quot;&gt;&lt;code&gt;strategy:
  type: Recreate&lt;/code&gt;&lt;/pre&gt;
&lt;ul id=&quot;1f8995a6-b033-80e6-843e-fe7ecf95ba29&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;먼저 &lt;b&gt;기존 파드를 모두 종료하고&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-803f-a916-f0612fd56a10&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;그 다음에 새 파드를 생성&lt;/b&gt;함&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;1f8995a6-b033-80e4-8b68-d81187d280f7&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;즉, 자원 충돌없이 새 버전만 동작(DB나 단일 인스턴스만 떠야하는 서비스에 적합)&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;202995a6-b033-804f-9f3b-e8dfa81caeba&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;202995a6-b033-803c-b8e8-ca9f31848f30&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;1f1995a6-b033-8013-aa9e-f0bc9b4a4aab&quot; data-ke-size=&quot;size26&quot;&gt;8. 명령어 정리&lt;/h2&gt;
&lt;table id=&quot;1f1995a6-b033-8095-a2e7-e30e32fd7517&quot; class=&quot;simple-table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;1f1995a6-b033-80d1-a670-faebf1740542&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;명령어&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f1995a6-b033-802e-a211-d8869488e72c&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl create -f [파일명]&lt;/code&gt; or &lt;code&gt;kubectl apply -f [파일]&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;리소스 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f1995a6-b033-8047-8df5-e4724ad48a45&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl get deployment&lt;/code&gt; or &lt;code&gt;kubectl descibe deployment&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;디플로이먼트 상태 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f4995a6-b033-80df-ba97-cb00e0d636da&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl rollout status deployment/[이름]&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;디플로이먼트 진행 상태 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f1995a6-b033-8078-b8f2-fea59c444cea&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl rollout status deployment/[deployment name]&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;롤아웃 상태 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f1995a6-b033-80c0-9ec9-da17f20dd59a&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl get pods &amp;mdash;show-labels&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;생성된 파드 라벨 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f1995a6-b033-8040-b9f4-de1c1070b82a&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl get replicaset&lt;/code&gt; or &lt;code&gt;kubectl get rs&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;ReplicaSet 목록 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f1995a6-b033-80e4-b4f0-dc673881b1cc&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl rollout undo deployment/[deployment name]&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;가장 최근의 이전 버전으로 롤백&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f1995a6-b033-804b-8b4b-c5c5b6f9945a&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl rollout undo deployment/[deployment name] --to-revision=2&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;특정 수정 버전(예: 2번)으로 롤백&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f1995a6-b033-8092-b509-d63d456ee300&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl delete rs [이름]&lt;/code&gt; or &lt;code&gt;kubectl delete rs [이름] [이름]&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;삭제 및 여러개 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f1995a6-b033-80d1-a83d-c0f547cbecd3&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl replace -f [파일명]&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;리소스 전체 교체 &amp;rarr; 이거 뭔말임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f1995a6-b033-8028-853d-d788d7f13729&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl edit rs [이름]&lt;/code&gt; 후 &lt;code&gt;kubectl delete pod [이름]&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;수정 및 반영(수정해도 자동으로 갱신 안됨)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f1995a6-b033-8076-a05f-e5127aef8737&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl scale deployment/[이름] --replicas=N&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;확장/축소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;1f1995a6-b033-8012-9d08-f84a913a33eb&quot;&gt;
&lt;td id=&quot;&amp;lt;PnZ&quot; class=&quot;&quot; style=&quot;width: 415px;&quot;&gt;&lt;code&gt;kubectl autoscale deploymenet/[이름] --min=10 --max=15 --cpu-percent=80&lt;/code&gt;&lt;/td&gt;
&lt;td id=&quot;;Vfl&quot; class=&quot;&quot; style=&quot;width: 272px;&quot;&gt;HPA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;</description>
      <category>Cloud(Infra)/공부</category>
      <category>CKA</category>
      <category>deployment</category>
      <category>개념이해</category>
      <category>디플로이먼트</category>
      <author>iapaalst</author>
      <guid isPermaLink="true">https://iapaalst.tistory.com/30</guid>
      <comments>https://iapaalst.tistory.com/30#entry30comment</comments>
      <pubDate>Thu, 29 May 2025 14:37:03 +0900</pubDate>
    </item>
  </channel>
</rss>