<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>잔디심는 정원사</title>
    <link>https://minsu20.tistory.com/</link>
    <description>기록하지 않는건 기억되지 않는다.</description>
    <language>ko</language>
    <pubDate>Sun, 12 Apr 2026 09:59:26 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>minsu20</managingEditor>
    <image>
      <title>잔디심는 정원사</title>
      <url>https://tistory1.daumcdn.net/tistory/5775136/attach/eec15e8d24ce4749869fa068f260fab4</url>
      <link>https://minsu20.tistory.com</link>
    </image>
    <item>
      <title>[CKA 준비] Scheduling</title>
      <link>https://minsu20.tistory.com/97</link>
      <description>&lt;h2 data-end=&quot;79&quot; data-start=&quot;51&quot; data-section-id=&quot;1ltx7ms&quot; data-ke-size=&quot;size26&quot;&gt;Pod를 수동으로 특정 Node에 배치하는 방법&lt;/h2&gt;
&lt;p data-end=&quot;123&quot; data-start=&quot;81&quot; data-ke-size=&quot;size16&quot;&gt;이 강의는 &lt;b&gt;스케줄러 없이 Pod를 Node에 배치하는 방법&lt;/b&gt;을 설명함.&lt;/p&gt;
&lt;p data-end=&quot;208&quot; data-start=&quot;125&quot; data-ke-size=&quot;size16&quot;&gt;보통 Kubernetes에서는 &lt;b&gt;Scheduler&lt;/b&gt;가 어떤 Pod를 어떤 Node에 올릴지 결정함.&lt;br /&gt;그런데 다음과 같은 상황이 있을 수 있음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;289&quot; data-start=&quot;210&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;235&quot; data-start=&quot;210&quot; data-section-id=&quot;87mk2x&quot;&gt;클러스터에 &lt;b&gt;Scheduler가 없음&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;257&quot; data-start=&quot;236&quot; data-section-id=&quot;1avyhld&quot;&gt;기본 Scheduler를 쓰지 않고&lt;/li&gt;
&lt;li data-end=&quot;289&quot; data-start=&quot;258&quot; data-section-id=&quot;17vxr4p&quot;&gt;&lt;b&gt;직접 Pod를 원하는 Node에 배치하고 싶음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;327&quot; data-start=&quot;291&quot; data-ke-size=&quot;size16&quot;&gt;이럴 때 사용할 수 있는 방법을 이해하는 것이 이 강의의 핵심임.&lt;/p&gt;
&lt;hr data-end=&quot;332&quot; data-start=&quot;329&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;363&quot; data-start=&quot;334&quot; data-section-id=&quot;exd4ly&quot; data-ke-size=&quot;size23&quot;&gt;1. Scheduler는 원래 어떻게 동작하는가&lt;/h3&gt;
&lt;p data-end=&quot;386&quot; data-start=&quot;365&quot; data-ke-size=&quot;size16&quot;&gt;먼저 기본 동작부터 보면 이해가 쉬움.&lt;/p&gt;
&lt;p data-end=&quot;422&quot; data-start=&quot;388&quot; data-ke-size=&quot;size16&quot;&gt;Pod 정의 파일에는 nodeName 이라는 필드가 있음.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;br /&gt;&lt;span&gt; nodeName: ...&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;510&quot; data-start=&quot;459&quot; data-ke-size=&quot;size16&quot;&gt;그런데 일반적으로는 이 값을 직접 적지 않음.&lt;br /&gt;Pod를 생성할 때 보통 비워두고 생성함.&lt;/p&gt;
&lt;p data-end=&quot;549&quot; data-start=&quot;512&quot; data-ke-size=&quot;size16&quot;&gt;왜냐하면 원래는 &lt;b&gt;Scheduler가 이 값을 채우기 때문&lt;/b&gt;임.&lt;/p&gt;
&lt;p data-end=&quot;579&quot; data-start=&quot;551&quot; data-ke-size=&quot;size16&quot;&gt;Scheduler의 동작 흐름은 대략 다음과 같음.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;795&quot; data-start=&quot;581&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;601&quot; data-start=&quot;581&quot; data-section-id=&quot;1r4jkc8&quot;&gt;클러스터 안의 Pod들을 확인함&lt;/li&gt;
&lt;li data-end=&quot;644&quot; data-start=&quot;602&quot; data-section-id=&quot;1vfh3h8&quot;&gt;그중에서 &lt;b&gt;nodeName이 아직 설정되지 않은 Pod&lt;/b&gt;를 찾음&lt;/li&gt;
&lt;li data-end=&quot;684&quot; data-start=&quot;645&quot; data-section-id=&quot;vkz9kr&quot;&gt;그런 Pod들을 &lt;b&gt;스케줄링 대상(candidate)&lt;/b&gt; 으로 봄&lt;/li&gt;
&lt;li data-end=&quot;717&quot; data-start=&quot;685&quot; data-section-id=&quot;rtglam&quot;&gt;스케줄링 알고리즘으로 어떤 Node가 적절한지 결정함&lt;/li&gt;
&lt;li data-end=&quot;751&quot; data-start=&quot;718&quot; data-section-id=&quot;1ef5hv2&quot;&gt;적절한 Node를 찾으면 Pod를 그 Node에 배치함&lt;/li&gt;
&lt;li data-end=&quot;795&quot; data-start=&quot;752&quot; data-section-id=&quot;182qj1h&quot;&gt;이 과정에서 내부적으로 &lt;b&gt;Binding Object&lt;/b&gt;를 만들어 연결함&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;808&quot; data-start=&quot;797&quot; data-ke-size=&quot;size16&quot;&gt;즉, 핵심은 다음임.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;898&quot; data-start=&quot;810&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;853&quot; data-start=&quot;810&quot; data-section-id=&quot;rxmuek&quot;&gt;nodeName이 없는 Pod = 아직 어느 Node에도 배치되지 않음&lt;/li&gt;
&lt;li data-end=&quot;898&quot; data-start=&quot;854&quot; data-section-id=&quot;8c8ac&quot;&gt;Scheduler가 적절한 Node를 골라서 nodeName을 설정해 줌&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;903&quot; data-start=&quot;900&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;936&quot; data-start=&quot;905&quot; data-section-id=&quot;1l1eadp&quot; data-ke-size=&quot;size23&quot;&gt;2. Scheduler가 없으면 무슨 일이 생기는가&lt;/h3&gt;
&lt;p data-end=&quot;997&quot; data-start=&quot;938&quot; data-ke-size=&quot;size16&quot;&gt;클러스터에 Scheduler가 없으면,&lt;br /&gt;nodeName이 비어 있는 Pod를 아무도 처리하지 못함.&lt;/p&gt;
&lt;p data-end=&quot;1022&quot; data-start=&quot;999&quot; data-ke-size=&quot;size16&quot;&gt;그 결과 Pod는 계속 다음 상태로 남음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1035&quot; data-start=&quot;1024&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1035&quot; data-start=&quot;1024&quot; data-section-id=&quot;1fm3xiv&quot;&gt;Pending&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1108&quot; data-start=&quot;1037&quot; data-ke-size=&quot;size16&quot;&gt;즉, Pod는 생성되었지만&lt;br /&gt;&lt;b&gt;어느 Node에서 실행되어야 하는지 정해지지 않았기 때문에 실제로 올라가지 못하는 상태&lt;/b&gt;임.&lt;/p&gt;
&lt;hr data-end=&quot;1113&quot; data-start=&quot;1110&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1157&quot; data-start=&quot;1115&quot; data-section-id=&quot;k14oce&quot; data-ke-size=&quot;size23&quot;&gt;3. Scheduler 없이 Pod를 수동으로 배치하는 가장 쉬운 방법&lt;/h3&gt;
&lt;p data-end=&quot;1207&quot; data-start=&quot;1159&quot; data-ke-size=&quot;size16&quot;&gt;가장 쉬운 방법은 &lt;b&gt;Pod 생성 시점에 nodeName을 직접 지정하는 것&lt;/b&gt;임.&lt;/p&gt;
&lt;p data-end=&quot;1241&quot; data-start=&quot;1209&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 Pod manifest에 이렇게 적을 수 있음.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;apiVersion: v1&lt;/span&gt;&lt;br /&gt;&lt;span&gt;kind: Pod&lt;/span&gt;&lt;br /&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;br /&gt;&lt;span&gt; name: my-pod&lt;/span&gt;&lt;br /&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;br /&gt;&lt;span&gt; nodeName: node01&lt;/span&gt;&lt;br /&gt;&lt;span&gt; containers:&lt;/span&gt;&lt;br /&gt;&lt;span&gt; - name: nginx&lt;/span&gt;&lt;br /&gt;&lt;span&gt; image: nginx&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1428&quot; data-start=&quot;1382&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하면 Scheduler가 없어도&lt;br /&gt;Pod는 바로 node01에 배치됨.&lt;/p&gt;
&lt;p data-end=&quot;1432&quot; data-start=&quot;1430&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1509&quot; data-start=&quot;1434&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1452&quot; data-start=&quot;1434&quot; data-section-id=&quot;x1hmov&quot;&gt;Pod를 &lt;b&gt;처음 만들 때&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1488&quot; data-start=&quot;1453&quot; data-section-id=&quot;wzomlx&quot;&gt;spec.nodeName에 원하는 Node 이름을 적으면&lt;/li&gt;
&lt;li data-end=&quot;1509&quot; data-start=&quot;1489&quot; data-section-id=&quot;15ykjv5&quot;&gt;해당 Node에 직접 할당 가능함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1514&quot; data-start=&quot;1511&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1554&quot; data-start=&quot;1516&quot; data-section-id=&quot;1u64b15&quot; data-ke-size=&quot;size23&quot;&gt;4. 이미 생성된 Pod에는 nodeName을 바꿀 수 없음&lt;/h3&gt;
&lt;p data-end=&quot;1571&quot; data-start=&quot;1556&quot; data-ke-size=&quot;size16&quot;&gt;여기서 중요한 제약이 있음.&lt;/p&gt;
&lt;p data-end=&quot;1614&quot; data-start=&quot;1573&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pod가 이미 생성된 뒤에는 nodeName을 수정할 수 없음.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1628&quot; data-start=&quot;1616&quot; data-ke-size=&quot;size16&quot;&gt;즉 이런 식은 안 됨.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1679&quot; data-start=&quot;1630&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1643&quot; data-start=&quot;1630&quot; data-section-id=&quot;18gh1gb&quot;&gt;Pod를 먼저 만들고&lt;/li&gt;
&lt;li data-end=&quot;1679&quot; data-start=&quot;1644&quot; data-section-id=&quot;163afda&quot;&gt;나중에 nodeName만 수정해서 다른 Node에 붙이기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1728&quot; data-start=&quot;1681&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes는 &lt;b&gt;기존 Pod의 nodeName 변경을 허용하지 않음&lt;/b&gt;.&lt;/p&gt;
&lt;hr data-end=&quot;1733&quot; data-start=&quot;1730&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1767&quot; data-start=&quot;1735&quot; data-section-id=&quot;xykdo6&quot; data-ke-size=&quot;size23&quot;&gt;5. 이미 만들어진 Pod를 Node에 붙이고 싶다면&lt;/h3&gt;
&lt;p data-end=&quot;1858&quot; data-start=&quot;1769&quot; data-ke-size=&quot;size16&quot;&gt;이미 생성된 Pod를 특정 Node에 연결하려면&lt;br /&gt;실제 Scheduler가 하는 것처럼 &lt;b&gt;Binding Object&lt;/b&gt;를 만들어서 API 요청을 보내야 함.&lt;/p&gt;
&lt;p data-end=&quot;1892&quot; data-start=&quot;1860&quot; data-ke-size=&quot;size16&quot;&gt;즉, 직접 Scheduler처럼 동작을 흉내 내는 방식임.&lt;/p&gt;
&lt;p data-end=&quot;1905&quot; data-start=&quot;1894&quot; data-ke-size=&quot;size16&quot;&gt;흐름은 다음과 같음.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2012&quot; data-start=&quot;1907&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1928&quot; data-start=&quot;1907&quot; data-section-id=&quot;pndtdk&quot;&gt;Binding Object를 만듦&lt;/li&gt;
&lt;li data-end=&quot;1951&quot; data-start=&quot;1929&quot; data-section-id=&quot;1wtlp05&quot;&gt;그 안에 목표 Node 이름을 적음&lt;/li&gt;
&lt;li data-end=&quot;1984&quot; data-start=&quot;1952&quot; data-section-id=&quot;1va2lpn&quot;&gt;Pod의 Binding API로 POST 요청을 보냄&lt;/li&gt;
&lt;li data-end=&quot;2012&quot; data-start=&quot;1985&quot; data-section-id=&quot;1bbtzxo&quot;&gt;그러면 해당 Pod가 그 Node에 바인딩됨&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2056&quot; data-start=&quot;2014&quot; data-ke-size=&quot;size16&quot;&gt;Binding Object에는 어떤 Node에 붙일지에 대한 정보가 들어감.&lt;/p&gt;
&lt;p data-end=&quot;2079&quot; data-start=&quot;2058&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 개념적으로는 다음과 비슷함.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;apiVersion: v1&lt;/span&gt;&lt;br /&gt;&lt;span&gt;kind: Binding&lt;/span&gt;&lt;br /&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;br /&gt;&lt;span&gt; name: my-pod&lt;/span&gt;&lt;br /&gt;&lt;span&gt;target:&lt;/span&gt;&lt;br /&gt;&lt;span&gt; apiVersion: v1&lt;/span&gt;&lt;br /&gt;&lt;span&gt; kind: Node&lt;/span&gt;&lt;br /&gt;&lt;span&gt; name: node01&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2293&quot; data-start=&quot;2201&quot; data-ke-size=&quot;size16&quot;&gt;그런데 API로 보낼 때는 보통 &lt;b&gt;JSON 형식&lt;/b&gt;으로 보내야 하므로,&lt;br /&gt;YAML을 그대로 보내는 것이 아니라 &lt;b&gt;JSON으로 변환해서 POST 요청&lt;/b&gt;해야 함.&lt;/p&gt;
&lt;p data-end=&quot;2293&quot; data-start=&quot;2201&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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;2. Labels and Selectors&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Labels와 Selectors의 기본 개념&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Labels와 Selectors는 대상을 &lt;b&gt;분류하고 필터링하기 위한 방법&lt;/b&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;class&lt;/li&gt;
&lt;li&gt;kind&lt;/li&gt;
&lt;li&gt;domestic / wild&lt;/li&gt;
&lt;li&gt;color&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;예를 들면 다음과 같음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;class = mammal &amp;rarr; 포유류만 조회&lt;/li&gt;
&lt;li&gt;color = green &amp;rarr; 초록색 동물만 조회&lt;/li&gt;
&lt;li&gt;class = bird, color = green &amp;rarr; 초록색 새만 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;Labels는 속성을 붙이는 역할&lt;/b&gt;, &lt;b&gt;Selectors는 그 속성을 기준으로 원하는 대상을 찾는 역할&lt;/b&gt;을 함.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Labels는 무엇인가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Labels는 각 객체에 붙이는 &lt;b&gt;key-value 형태의 속성 정보&lt;/b&gt;임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 어떤 대상에 다음과 같은 label을 붙일 수 있음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;class: mammal&lt;/li&gt;
&lt;li&gt;kind: dog&lt;/li&gt;
&lt;li&gt;color: green&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 label을 붙여두면, 나중에 여러 기준으로 객체를 구분할 수 있음.&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;Labels는 객체를 설명하는 속성임&lt;/li&gt;
&lt;li&gt;필요한 만큼 여러 개를 붙일 수 있음&lt;/li&gt;
&lt;li&gt;객체를 그룹화할 때 기준이 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Selectors는 무엇인가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Selectors는 Labels를 기준으로 &lt;b&gt;원하는 객체를 골라내는 조건&lt;/b&gt;임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Labels가 붙어 있어야 Selectors가 동작할 수 있음.&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;class = mammal&lt;/li&gt;
&lt;li&gt;app = app1&lt;/li&gt;
&lt;li&gt;color = green&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;즉, Selectors는 단순히 객체를 보는 것이 아니라,&lt;br /&gt;&lt;b&gt;특정 조건에 맞는 객체만 선택하는 역할&lt;/b&gt;을 함.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 왜 Labels와 Selectors가 필요한가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes에서는 다양한 객체를 생성하게 됨.&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;/li&gt;
&lt;li&gt;Service&lt;/li&gt;
&lt;li&gt;ReplicaSet&lt;/li&gt;
&lt;li&gt;Deployment&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;이때는 객체를 다음과 같은 기준으로 나눠서 봐야 함.&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;li&gt;어떤 종류의 객체인지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 구분을 위해 Labels와 Selectors를 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Kubernetes에서 Labels와 Selectors는&lt;br /&gt;&lt;b&gt;객체를 체계적으로 관리하기 위한 핵심 수단&lt;/b&gt;임.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. Kubernetes에서 Labels를 지정하는 위치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes에서 Labels는 객체 정의 파일의 metadata 아래에 작성함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Pod 정의 파일에서는 metadata.labels 아래에 label을 추가함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형식은 key-value 방식임.&lt;/p&gt;
&lt;pre id=&quot;code_1775888322303&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; apiVersion: v1
 kind: Pod
 metadata:
  name: simple-webapp
  labels:
    app: App1
    function: Front-end
 spec:
  containers:
  - name: simple-webapp
    image: simple-webapp
    ports:
    - containerPort: 8080&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T3gGF/dJMcagkNNyR/XVd7G3bAmNGaB5xKBAkIZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T3gGF/dJMcagkNNyR/XVd7G3bAmNGaB5xKBAkIZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T3gGF/dJMcagkNNyR/XVd7G3bAmNGaB5xKBAkIZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT3gGF%2FdJMcagkNNyR%2FXVd7G3bAmNGaB5xKBAkIZk%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;735&quot; height=&quot;428&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 원하는 만큼 label을 추가할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Pod를 만들 때부터 어떤 그룹에 속하는지 미리 표시해두는 것임.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. Labels로 Pod를 조회하는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod가 생성된 후에는 label을 기준으로 Pod를 조회할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 kubectl get pods 명령어와 --selector 옵션을 함께 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 조건으로 조회할 수 있음.&lt;/p&gt;
&lt;pre id=&quot;code_1775888366593&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ kubectl get pods --selector app=App1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 해당 label을 가진 Pod만 확인할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, label은 단순한 메모가 아니라&lt;br /&gt;&lt;b&gt;실제로 원하는 객체를 찾는 기준&lt;/b&gt;으로 사용됨.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. ReplicaSet에서 Labels와 Selectors가 어떻게 연결되는가&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brKPsE/dJMcaciqk7i/FBZK7hcAAGomk4CzMBHwAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brKPsE/dJMcaciqk7i/FBZK7hcAAGomk4CzMBHwAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brKPsE/dJMcaciqk7i/FBZK7hcAAGomk4CzMBHwAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrKPsE%2FdJMcaciqk7i%2FFBZK7hcAAGomk4CzMBHwAk%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;785&quot; height=&quot;537&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;537&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;size18&quot;&gt;7. 1 metadata.labels &amp;rarr; &lt;b&gt;ReplicaSet 객체 자신에게 붙는 라벨&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775889446770&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;metadata:
  labels:
    app: myapp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 즉 &lt;b&gt;ReplicaSet 리소스를 분류할 때&lt;/b&gt; 의미가 있음.&lt;/p&gt;
&lt;pre id=&quot;code_1775889469177&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get rs --selector app=myapp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;7.2 spec.template.metadata.labels &amp;rarr; &lt;b&gt;ReplicaSet이 생성할 Pod들에 붙는 라벨&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775889494987&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;selector:
  matchLabels:
    app: myapp&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-end=&quot;2171&quot; data-start=&quot;2133&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;2171&quot; data-start=&quot;2135&quot; data-ke-size=&quot;size16&quot;&gt;&quot;label이 app=myapp인 Pod를 내가 관리하겠다.&quot;&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;7.3 spec.selector &amp;rarr; &lt;b&gt;ReplicaSet이 어떤 Pod를 자기 관리 대상으로 볼지 고르는 조건&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775889520374&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template:
  metadata:
    labels:
      app: myapp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; ReplicaSet이 Pod를 만들면, 그 Pod는 app=myapp label을 가지고 생성됨.&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: #ee2323;&quot;&gt;&lt;b&gt;spec.selector.matchLabels와 spec.template.metadata.labels는 반드시 맞춰야 함&lt;/b&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;selector가 app=myapp인데,&lt;br /&gt;template에서 생성되는 Pod label이 app=nginx라면 어떻게 되느냐?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;2745&quot; data-end=&quot;2791&quot; data-ke-size=&quot;size16&quot;&gt;ReplicaSet은 자기가 만든 Pod조차 자기 Pod로 인식하지 못할 수 있음!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;2745&quot; data-end=&quot;2791&quot; data-ke-size=&quot;size16&quot;&gt;metadata.labels는 달라도 ReplicaSet 동작에는 직접 문제 없음.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. Service에서도 같은 방식이 사용됨&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Service도 Labels와 Selectors를 이용해 Pod를 찾음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동작 방식은 ReplicaSet과 거의 같음.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Pod에 labels가 붙어 있음&lt;/li&gt;
&lt;li&gt;Service에 selector가 정의되어 있음&lt;/li&gt;
&lt;li&gt;Service가 selector와 일치하는 Pod를 찾음&lt;/li&gt;
&lt;li&gt;그 Pod들로 트래픽을 전달함&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Service도 Pod 이름이나 IP를 직접 기준으로 연결하는 것이 아니라&lt;br /&gt;&lt;b&gt;label 기준으로 연결 대상 Pod를 선택함&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8F6Nw/dJMcafM0NEa/nnIG3bhBiTnn2UZrTxd19K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8F6Nw/dJMcafM0NEa/nnIG3bhBiTnn2UZrTxd19K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8F6Nw/dJMcafM0NEa/nnIG3bhBiTnn2UZrTxd19K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8F6Nw%2FdJMcafM0NEa%2FnnIG3bhBiTnn2UZrTxd19K%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;779&quot; height=&quot;547&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9. Labels와 Selectors의 핵심 역할 정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes에서 Labels와 Selectors는 다음 두 가지 목적으로 사용됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;9-1. 객체를 조회하고 필터링하기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 특정 앱에 속한 Pod만 보고 싶을 때 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;9-2. Kubernetes 객체끼리 연결하기 위해&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;ReplicaSet &amp;rarr; Pod 연결&lt;/li&gt;
&lt;li&gt;Service &amp;rarr; Pod 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Kubernetes에서 Labels와 Selectors는&lt;br /&gt;&lt;b&gt;관리용 기능이면서 동시에 객체 연결의 기준&lt;/b&gt;이기도 함.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;10. Annotations는 Labels와 어떻게 다른가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Annotations는 Labels와 목적이 다름.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Labels와 Selectors는 객체를 &lt;b&gt;그룹화하고 선택하기 위한 것&lt;/b&gt;임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 Annotations는 객체에 &lt;b&gt;부가 정보를 기록하기 위한 것&lt;/b&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;tool name&lt;/li&gt;
&lt;li&gt;version&lt;/li&gt;
&lt;li&gt;build information&lt;/li&gt;
&lt;li&gt;contact details&lt;/li&gt;
&lt;li&gt;phone numbers&lt;/li&gt;
&lt;li&gt;email IDs&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Annotations는 객체를 선택하는 기준이 아니라&lt;br /&gt;&lt;b&gt;참고용 정보나 통합용 정보&lt;/b&gt;를 저장하는 용도임.&lt;/p&gt;
&lt;pre id=&quot;code_1775889037032&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: simple-webapp
  labels:
    app: App1
    function: Front-end
  annotations:
     buildversion: 1.34
spec:
 replicas: 3
 selector:
   matchLabels:
    app: App1
template:
  metadata:
    labels:
      app: App1
      function: Front-end
  spec:
    containers:
    - name: simple-webapp
      image: simple-webapp&lt;/code&gt;&lt;/pre&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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Taints and Tolerations&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 목적&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Taints와 Tolerations는 &lt;b&gt;어떤 Pod가 어떤 Node에 스케줄될 수 있는지를 제한하는 기능&lt;/b&gt;임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 특정 Node에 아무 Pod나 올라가지 못하게 하고,&lt;br /&gt;조건을 만족하는 Pod만 올라가게 할 때 사용함.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 어디에 설정하는가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2-1. Taint&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Node에 설정함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2-2. Toleration&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pod에 설정함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Node 쪽에는 &amp;ldquo;이런 Pod만 받을 수 있다&amp;rdquo;는 제한을 걸고,&lt;br /&gt;Pod 쪽에는 &amp;ldquo;이 taint를 견딜 수 있다&amp;rdquo;는 설정을 넣는 구조임.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 핵심 동작&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node에 taint가 있으면,&lt;br /&gt;그 taint를 toleration하지 못하는 Pod는 해당 Node에 스케줄되지 않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 Pod에 해당 taint에 대한 toleration이 있으면,&lt;br /&gt;그 Node에 스케줄될 수 있음.&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;Taint는 Node가 Pod를 거부하는 기준&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Toleration은 Pod가 그 거부 조건을 예외적으로 통과할 수 있게 하는 설정&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Taint Effect 3가지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4-1. NoSchedule&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 taint를 toleration하지 않는 Pod는&lt;br /&gt;&lt;b&gt;그 Node에 새로 스케줄되지 않음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4-2. PreferNoSchedule&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능하면 그 Node에 스케줄하지 않으려 하지만&lt;br /&gt;&lt;b&gt;강제는 아님&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4-3. NoExecute&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 taint를 toleration하지 않는 Pod는&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;이미 그 Node에서 실행 중이던 Pod도 &lt;b&gt;evict(제거)&lt;/b&gt; 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MhZzV/dJMcaiXb5tZ/6Wq7mDBYbJceDaCsQ1rXU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MhZzV/dJMcaiXb5tZ/6Wq7mDBYbJceDaCsQ1rXU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MhZzV/dJMcaiXb5tZ/6Wq7mDBYbJceDaCsQ1rXU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMhZzV%2FdJMcaiXb5tZ%2F6Wq7mDBYbJceDaCsQ1rXU0%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;954&quot; height=&quot;294&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;294&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;pre id=&quot;code_1775892925257&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
 name: myapp-pod
spec:
 containers:
 - name: nginx-container
   image: nginx
 tolerations:
 - key: &quot;app&quot;
   operator: &quot;Equal&quot;
   value: &quot;blue&quot;
   effect: &quot;NoSchedule&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Em4Xk/dJMcahD0mL9/J98R5k3u7U4SLwElzNiJNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Em4Xk/dJMcahD0mL9/J98R5k3u7U4SLwElzNiJNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Em4Xk/dJMcahD0mL9/J98R5k3u7U4SLwElzNiJNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEm4Xk%2FdJMcahD0mL9%2FJ98R5k3u7U4SLwElzNiJNK%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;915&quot; height=&quot;443&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 반드시 기억할 핵심&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Taints와 Tolerations는&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Pod를 특정 Node로 보내는 기능이 아님&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이것은&lt;br /&gt;&amp;ldquo;이 Pod는 반드시 이 Node로 가야 한다&amp;rdquo;를 의미하지 않음.&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;해당 Node는 특정 toleration이 있는 Pod만 받을 수 있다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 특정 Pod를 특정 Node에 반드시 배치하고 싶다면&lt;br /&gt;그건 &lt;b&gt;Node Affinity&lt;/b&gt;로 해결해야 함.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. Master Node 관련&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes 클러스터에서는 보통 Master Node에 기본 taint가 설정되어 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 일반 Pod는 Master Node에 스케줄되지 않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Master Node에 워크로드가 올라가지 않는 이유 중 하나가&lt;br /&gt;바로 이 taint 설정 때문임.&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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Node Selectors&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 목적&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node Selector는 &lt;b&gt;특정 Pod가 특정 Node에서만 실행되도록 제한하는 기능&lt;/b&gt;임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 클러스터에 3개의 Node가 있고,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2개는 리소스가 적은 작은 Node&lt;/li&gt;
&lt;li&gt;1개는 리소스가 많은 큰 Node&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 할 때,&lt;br /&gt;리소스를 많이 사용하는 &lt;b&gt;데이터 처리 workload&lt;/b&gt;는 큰 Node에서만 실행되게 하고 싶을 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 설정에서는 어떤 Pod든 어떤 Node에나 배치될 수 있기 때문에,&lt;br /&gt;원하는 Pod가 작은 Node에 배치될 수도 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해 Pod가 &lt;b&gt;특정 Node에서만 실행되도록 제한&lt;/b&gt;하는 방법이 필요함.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Pod를 특정 Node에 배치하는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 강의에서는 그 방법 중 하나로 &lt;b&gt;Node Selector&lt;/b&gt;를 설명함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod를 특정 Node에서만 실행되게 하려면,&lt;br /&gt;Pod 정의 파일의 spec 아래에 nodeSelector를 추가하면 됨.&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;size: large&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;&lt;b&gt;size=large 라는 label이 붙은 Node에만 이 Pod를 배치하라&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;는 뜻임.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Node Selector의 동작 방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동작 흐름은 아래와 같음.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. Node에 label을 붙임&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DGGM0/dJMcacbEoz6/Nnqj7OPayIkecPgffkjk7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DGGM0/dJMcacbEoz6/Nnqj7OPayIkecPgffkjk7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DGGM0/dJMcacbEoz6/Nnqj7OPayIkecPgffkjk7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDGGM0%2FdJMcacbEoz6%2FNnqj7OPayIkecPgffkjk7K%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;887&quot; height=&quot;419&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Syntax&lt;/p&gt;
&lt;div style=&quot;background-color: #f6f8fa; color: #1f2328; text-align: start;&quot;&gt;
&lt;pre class=&quot;delphi&quot; style=&quot;background-color: #f6f8fa; color: #1f2328;&quot;&gt;&lt;code&gt;$ kubectl label nodes &amp;lt;node-name&amp;gt; &amp;lt;label-key&amp;gt;=&amp;lt;label-value&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Example&lt;/p&gt;
&lt;div style=&quot;background-color: #f6f8fa; color: #1f2328; text-align: start;&quot;&gt;
&lt;pre class=&quot;crmsh&quot; style=&quot;background-color: #f6f8fa; color: #1f2328;&quot;&gt;&lt;code&gt;$ kubectl label nodes node-1 size=Large&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.44em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;3-2. Pod에 nodeSelector를 설정함&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM8kcD/dJMcaaSsw5Z/sFwEAtd3LEFIxdueWV2KT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM8kcD/dJMcaaSsw5Z/sFwEAtd3LEFIxdueWV2KT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM8kcD/dJMcaaSsw5Z/sFwEAtd3LEFIxdueWV2KT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM8kcD%2FdJMcaaSsw5Z%2FsFwEAtd3LEFIxdueWV2KT1%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;630&quot; height=&quot;443&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;To create a pod definition&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #f6f8fa;&quot;&gt;
&lt;pre style=&quot;background-color: #f6f8fa; color: #1f2328;&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
 name: myapp-pod
spec:
 containers:
 - name: data-processor
   image: data-processor
 nodeSelector:
  size: Large
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f6f8fa;&quot;&gt;
&lt;pre style=&quot;background-color: #f6f8fa; color: #1f2328;&quot;&gt;&lt;code&gt;$ kubectl create -f pod-definition.yml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. Scheduler가 label과 selector를 비교함&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-4. 일치하는 Node에 Pod를 배치함&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 핵심은:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Pod의 nodeSelector와 Node의 label이 일치해야 한다는 것&lt;/b&gt;임.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Node Selector의 한계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node Selector는 단순하고 쉬운 방법이지만,&lt;br /&gt;복잡한 조건을 표현하는 데는 한계가 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 아래와 같은 조건은 Node Selector로 처리하기 어려움.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;large 또는 medium Node에 배치&lt;/li&gt;
&lt;li&gt;small이 아닌 모든 Node에 배치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;즉 Node Selector는&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;단순한 key-value 일치 조건만 사용할 수 있음.&lt;/b&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;더 복잡한 조건이 필요하면 Node Selector만으로는 부족함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우에는 &lt;b&gt;Node Affinity / Anti-Affinity&lt;/b&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;&lt;b&gt;간단한 조건&lt;/b&gt; &amp;rarr; Node Selector&lt;/li&gt;
&lt;li&gt;&lt;b&gt;복잡한 조건&lt;/b&gt; &amp;rarr; Node Affinity / Anti-Affinity&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Infra/K8S</category>
      <author>minsu20</author>
      <guid isPermaLink="true">https://minsu20.tistory.com/97</guid>
      <comments>https://minsu20.tistory.com/97#entry97comment</comments>
      <pubDate>Sat, 11 Apr 2026 15:08:28 +0900</pubDate>
    </item>
    <item>
      <title>[CKA 준비] Core Concepts - 3</title>
      <link>https://minsu20.tistory.com/95</link>
      <description>&lt;h2 data-end=&quot;120&quot; data-start=&quot;90&quot; data-section-id=&quot;1pxpv8u&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Services&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;120&quot; data-start=&quot;90&quot; data-section-id=&quot;1pxpv8u&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Kubernetes Service란 무엇인가&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;184&quot; data-start=&quot;122&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes Service는 &lt;b&gt;애플리케이션 내부와 외부의 컴포넌트 간 통신을 가능하게 하는 객체&lt;/b&gt;임.&lt;/p&gt;
&lt;p data-end=&quot;208&quot; data-start=&quot;186&quot; data-ke-size=&quot;size16&quot;&gt;즉 Service의 역할은 다음과 같음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;266&quot; data-start=&quot;210&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;228&quot; data-start=&quot;210&quot; data-section-id=&quot;jsovgp&quot;&gt;애플리케이션과 사용자 간 연결&lt;/li&gt;
&lt;li data-end=&quot;249&quot; data-start=&quot;229&quot; data-section-id=&quot;19osnrc&quot;&gt;애플리케이션 내부 서비스 간 연결&lt;/li&gt;
&lt;li data-end=&quot;266&quot; data-start=&quot;250&quot; data-section-id=&quot;3ymrsk&quot;&gt;외부 데이터 소스와의 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;302&quot; data-start=&quot;268&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 애플리케이션이 다음과 같이 구성되어 있다고 가정함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;378&quot; data-start=&quot;304&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;333&quot; data-start=&quot;304&quot; data-section-id=&quot;5fdo1x&quot;&gt;Frontend Pod 그룹 (사용자 요청 처리)&lt;/li&gt;
&lt;li data-end=&quot;363&quot; data-start=&quot;334&quot; data-section-id=&quot;ngdx26&quot;&gt;Backend Pod 그룹 (비즈니스 로직 처리)&lt;/li&gt;
&lt;li data-end=&quot;378&quot; data-start=&quot;364&quot; data-section-id=&quot;9g313o&quot;&gt;외부 데이터베이스 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;419&quot; data-start=&quot;380&quot; data-ke-size=&quot;size16&quot;&gt;이때 &lt;b&gt;각 Pod 그룹 간 연결을 담당하는 것이 Service&lt;/b&gt;임.&lt;/p&gt;
&lt;p data-end=&quot;445&quot; data-start=&quot;421&quot; data-ke-size=&quot;size16&quot;&gt;Service는 다음과 같은 역할을 수행함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;512&quot; data-start=&quot;447&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;466&quot; data-start=&quot;447&quot; data-section-id=&quot;mse7vl&quot;&gt;사용자 &amp;rarr; Frontend 연결&lt;/li&gt;
&lt;li data-end=&quot;490&quot; data-start=&quot;467&quot; data-section-id=&quot;1khvakw&quot;&gt;Frontend &amp;rarr; Backend 연결&lt;/li&gt;
&lt;li data-end=&quot;512&quot; data-start=&quot;491&quot; data-section-id=&quot;byt9yq&quot;&gt;Backend &amp;rarr; 외부 데이터 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;563&quot; data-start=&quot;514&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 마이크로서비스 간 느슨한 결합(loose coupling)을 가능하게 함.&lt;/p&gt;
&lt;hr data-end=&quot;568&quot; data-start=&quot;565&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;592&quot; data-start=&quot;570&quot; data-section-id=&quot;1xp8wao&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;외부에서 Pod에 접근하는 문제 해결&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;633&quot; data-start=&quot;594&quot; data-ke-size=&quot;size16&quot;&gt;지금까지는 &lt;b&gt;Pod끼리 내부 네트워크로 통신하는 방법&lt;/b&gt;을 설명했음.&lt;/p&gt;
&lt;p data-end=&quot;669&quot; data-start=&quot;635&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이제 &lt;b&gt;외부에서 Pod에 접근하는 방법&lt;/b&gt;을 살펴봄.&lt;/p&gt;
&lt;p data-end=&quot;702&quot; data-start=&quot;671&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 웹 애플리케이션 Pod가 하나 있다고 가정함.&lt;/p&gt;
&lt;p data-end=&quot;723&quot; data-start=&quot;704&quot; data-ke-size=&quot;size16&quot;&gt;현재 네트워크 구조는 다음과 같음.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;blockquote id=&quot;code-block-viewer&quot; data-ke-style=&quot;style3&quot;&gt;Laptop IP : 192.168.1.1&lt;br /&gt;Kubernetes Node IP : 192.168.1.2&lt;br /&gt;Pod Network Range : 10.244.0.0/16&lt;br /&gt;Pod IP : 10.244.0.2&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;882&quot; data-start=&quot;871&quot; data-ke-size=&quot;size16&quot;&gt;문제는 다음과 같음.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Laptop &amp;rarr; Pod 직접 접근 불가능&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;951&quot; data-start=&quot;916&quot; data-ke-size=&quot;size16&quot;&gt;왜냐하면 Pod는 &lt;b&gt;클러스터 내부 네트워크&lt;/b&gt;에 있기 때문임.&lt;/p&gt;
&lt;hr data-end=&quot;956&quot; data-start=&quot;953&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;967&quot; data-start=&quot;958&quot; data-section-id=&quot;1gndr4w&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;가능한 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;989&quot; data-start=&quot;979&quot; data-ke-size=&quot;size16&quot;&gt;노드에 SSH 접속 :&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;ssh 192.168.1.2&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1027&quot; data-start=&quot;1016&quot; data-ke-size=&quot;size16&quot;&gt;그 후 Pod에 접근 : &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;curl 10.244.0.2&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1082&quot; data-start=&quot;1054&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이것은 &lt;b&gt;노드 내부에서만 접근 가능&lt;/b&gt;함.&lt;/p&gt;
&lt;p data-end=&quot;1121&quot; data-start=&quot;1084&quot; data-ke-size=&quot;size16&quot;&gt;사용자는 &lt;b&gt;노드에 SSH 없이 바로 웹 서비스에 접근&lt;/b&gt;해야 함.&lt;/p&gt;
&lt;hr data-end=&quot;1126&quot; data-start=&quot;1123&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1203&quot; data-start=&quot;1159&quot; data-ke-size=&quot;size16&quot;&gt;Service는 &lt;b&gt;Node의 포트를 Pod의 포트로 연결&lt;/b&gt;해주는 역할을 함.&lt;/p&gt;
&lt;p data-end=&quot;1220&quot; data-start=&quot;1205&quot; data-ke-size=&quot;size16&quot;&gt;즉 다음과 같은 구조가 됨.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;blockquote id=&quot;code-block-viewer&quot; data-ke-style=&quot;style3&quot;&gt;Laptop&lt;br /&gt;&amp;nbsp;│&lt;br /&gt;NodeIP:NodePort&lt;br /&gt;&amp;nbsp;│&lt;br /&gt;Service&lt;br /&gt;&amp;nbsp;│&lt;br /&gt;Pod:TargetPort&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1312&quot; data-start=&quot;1292&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 외부 요청을 Pod로 전달함.&lt;/p&gt;
&lt;hr data-end=&quot;1317&quot; data-start=&quot;1314&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1345&quot; data-start=&quot;1319&quot; data-section-id=&quot;1prn4pq&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Kubernetes Service 종류&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1382&quot; data-start=&quot;1347&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes에는 3가지 주요 Service 타입이 있음.&lt;/p&gt;
&lt;h4 data-end=&quot;1399&quot; data-start=&quot;1384&quot; data-section-id=&quot;pz4d8h&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. NodePort&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1431&quot; data-start=&quot;1401&quot; data-ke-size=&quot;size16&quot;&gt;Pod를 &lt;b&gt;Node의 포트를 통해 외부에 노출&lt;/b&gt;함.&lt;/p&gt;
&lt;p data-end=&quot;1431&quot; data-start=&quot;1401&quot; data-ke-size=&quot;size16&quot;&gt;External&amp;nbsp;User&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&lt;br /&gt;NodeIP:NodePort&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&lt;br /&gt;Service&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&lt;br /&gt;Pod&lt;/p&gt;
&lt;hr data-end=&quot;1515&quot; data-start=&quot;1512&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1533&quot; data-start=&quot;1517&quot; data-section-id=&quot;tsnmso&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. ClusterIP&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1556&quot; data-start=&quot;1535&quot; data-ke-size=&quot;size16&quot;&gt;클러스터 내부에서만 사용되는 서비스임.&lt;/p&gt;
&lt;p data-end=&quot;1559&quot; data-start=&quot;1558&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Frontend Pods &amp;rarr; Backend Pods&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1616&quot; data-start=&quot;1599&quot; data-ke-size=&quot;size16&quot;&gt;서비스 간 내부 통신에 사용됨.&lt;/p&gt;
&lt;hr data-end=&quot;1621&quot; data-start=&quot;1618&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1642&quot; data-start=&quot;1623&quot; data-section-id=&quot;1rxgw8&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. LoadBalancer&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1658&quot; data-start=&quot;1644&quot; data-ke-size=&quot;size16&quot;&gt;클라우드 환경에서 사용됨.&lt;/p&gt;
&lt;p data-end=&quot;1692&quot; data-start=&quot;1660&quot; data-ke-size=&quot;size16&quot;&gt;외부 Load Balancer를 생성하여 트래픽을 분산함.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;Internet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&lt;br /&gt;LoadBalancer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&lt;br /&gt;Multiple&amp;nbsp;Pods&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1755&quot; data-start=&quot;1752&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1781&quot; data-start=&quot;1757&quot; data-section-id=&quot;1pr80px&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;NodePort Service&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1813&quot; data-start=&quot;1783&quot; data-ke-size=&quot;size16&quot;&gt;NodePort 서비스에는 &lt;b&gt;3개의 포트&lt;/b&gt;가 있음.&lt;/p&gt;
&lt;p data-end=&quot;1813&quot; data-start=&quot;1783&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1813&quot; data-start=&quot;1783&quot; data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://github.com/kodekloudhub/certified-kubernetes-administrator-course/blob/master/docs/02-Core-Concepts/20-Services.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/kodekloudhub/certified-kubernetes-administrator-course/blob/master/docs/02-Core-Concepts/20-Services.md&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfXThe/dJMcajanBc8/7quBTstupuO1HvykBgfv30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfXThe/dJMcajanBc8/7quBTstupuO1HvykBgfv30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfXThe/dJMcajanBc8/7quBTstupuO1HvykBgfv30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfXThe%2FdJMcajanBc8%2F7quBTstupuO1HvykBgfv30%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;987&quot; height=&quot;431&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-end=&quot;1832&quot; data-start=&quot;1815&quot; data-section-id=&quot;1076r4&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. TargetPort&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1843&quot; data-start=&quot;1834&quot; data-ke-size=&quot;size16&quot;&gt;Pod 내부 포트&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;targetPort: 80&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1890&quot; data-start=&quot;1872&quot; data-ke-size=&quot;size16&quot;&gt;웹 서버가 실제 실행되는 포트임.&lt;/p&gt;
&lt;hr data-end=&quot;1895&quot; data-start=&quot;1892&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1908&quot; data-start=&quot;1897&quot; data-section-id=&quot;1182poi&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Port&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1924&quot; data-start=&quot;1910&quot; data-ke-size=&quot;size16&quot;&gt;Service 자체의 포트&lt;/p&gt;
&lt;p data-end=&quot;1948&quot; data-start=&quot;1926&quot; data-ke-size=&quot;size16&quot;&gt;Service 내부에서 사용하는 포트임.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;port: 80&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1971&quot; data-start=&quot;1968&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1988&quot; data-start=&quot;1973&quot; data-section-id=&quot;1ercrwj&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. NodePort&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2011&quot; data-start=&quot;1990&quot; data-ke-size=&quot;size16&quot;&gt;Node에서 외부 접근에 사용하는 포트&lt;/p&gt;
&lt;p data-end=&quot;2014&quot; data-start=&quot;2013&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;nodePort: 30008&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2049&quot; data-start=&quot;2041&quot; data-ke-size=&quot;size16&quot;&gt;외부 접근 방식&lt;/p&gt;
&lt;p data-end=&quot;2049&quot; data-start=&quot;2041&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;http://NodeIP:30008&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-end=&quot;2125&quot; data-start=&quot;2101&quot; data-ke-size=&quot;size16&quot;&gt;NodePort는 다음 범위만 사용 가능함.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;30000 ~ 32767&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2153&quot; data-start=&quot;2150&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;2175&quot; data-start=&quot;2155&quot; data-section-id=&quot;bz50bq&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;NodePort Service YAML 구조&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2215&quot; data-start=&quot;2177&quot; data-ke-size=&quot;size16&quot;&gt;Service도 Kubernetes 리소스이므로 기본 구조는 동일함.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773581795706&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: my-service

spec:
  type: NodePort
  ports:
    - targetPort: 80
      port: 80
      nodePort: 30008

  selector:
    app: myapp&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2453&quot; data-start=&quot;2450&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;2478&quot; data-start=&quot;2455&quot; data-section-id=&quot;1qzn6vu&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Service YAML 핵심 요소&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-end=&quot;2487&quot; data-start=&quot;2480&quot; data-section-id=&quot;1xwwpml&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;type: &lt;/b&gt;서비스 타입 지정&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NodePort&lt;/li&gt;
&lt;li&gt;ClusterIP&lt;/li&gt;
&lt;li&gt;LoadBalancer&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2554&quot; data-start=&quot;2546&quot; data-section-id=&quot;y9eidr&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ports : &lt;/b&gt;포트 매핑 정보&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;targetPort &amp;rarr; Pod&lt;/li&gt;
&lt;li&gt;port &amp;rarr; Service&lt;/li&gt;
&lt;li&gt;nodePort &amp;rarr; Node&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2639&quot; data-start=&quot;2628&quot; data-section-id=&quot;th68sw&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;selector : &lt;/b&gt;Service가 연결할 Pod를 선택함.&lt;/h4&gt;
&lt;p data-end=&quot;2681&quot; data-start=&quot;2665&quot; data-ke-size=&quot;size16&quot;&gt;Pod의 label과 연결됨.&lt;/p&gt;
&lt;p data-end=&quot;2684&quot; data-start=&quot;2683&quot; data-ke-size=&quot;size16&quot;&gt;예&lt;/p&gt;
&lt;p data-end=&quot;2689&quot; data-start=&quot;2686&quot; data-ke-size=&quot;size16&quot;&gt;Pod&lt;/p&gt;
&lt;pre id=&quot;code_1773581893409&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;labels:
  app: myapp&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2732&quot; data-start=&quot;2725&quot; data-ke-size=&quot;size16&quot;&gt;Service&lt;/p&gt;
&lt;pre id=&quot;code_1773581908123&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;selector:
  app: myapp&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2799&quot; data-start=&quot;2770&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하면 Service가 Pod를 찾을 수 있음.&lt;/p&gt;
&lt;hr data-end=&quot;2804&quot; data-start=&quot;2801&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;2821&quot; data-start=&quot;2806&quot; data-section-id=&quot;1229gxt&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;외부 접근 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3060&quot; data-start=&quot;3052&quot; data-ke-size=&quot;size16&quot;&gt;웹 서비스 접근&lt;/p&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773581964350&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://NodeIP:NodePort

http://192.168.1.2:30008
curl 192.168.1.2:30008&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3170&quot; data-start=&quot;3167&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;3822&quot; data-start=&quot;3805&quot; data-section-id=&quot;1ob3y2&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Service 내부 Load Balancing&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2724&quot; data-start=&quot;2674&quot; data-ke-size=&quot;size16&quot;&gt;Service 뒤에 여러 Pod가 있을 경우 Kubernetes가 자동으로 로드 밸런싱함.&lt;/p&gt;
&lt;p data-end=&quot;2724&quot; data-start=&quot;2674&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2802&quot; data-start=&quot;2790&quot; data-ke-size=&quot;size16&quot;&gt;Pod가 요청을 보내면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Service&lt;/span&gt;&lt;br /&gt;&lt;span&gt; │&lt;/span&gt;&lt;br /&gt;&lt;span&gt; ├ Pod1&lt;/span&gt;&lt;br /&gt;&lt;span&gt; ├ Pod2&lt;/span&gt;&lt;br /&gt;&lt;span&gt; └ Pod3&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2866&quot; data-start=&quot;2856&quot; data-ke-size=&quot;size16&quot;&gt;중 하나로 전달됨.&lt;/p&gt;
&lt;p data-end=&quot;2894&quot; data-start=&quot;2868&quot; data-ke-size=&quot;size16&quot;&gt;이 작업은 &lt;b&gt;kube-proxy&lt;/b&gt;가 수행함.&lt;/p&gt;
&lt;hr data-end=&quot;2899&quot; data-start=&quot;2896&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;2925&quot; data-start=&quot;2901&quot; data-section-id=&quot;17f0cje&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Pod가 여러 Node에 있을 경우&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wbKvW/dJMcafFRILy/zcpg7zSH0mGlgpXSGxdLoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wbKvW/dJMcafFRILy/zcpg7zSH0mGlgpXSGxdLoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wbKvW/dJMcafFRILy/zcpg7zSH0mGlgpXSGxdLoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwbKvW%2FdJMcafFRILy%2Fzcpg7zSH0mGlgpXSGxdLoK%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;710&quot; height=&quot;444&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;Node1 &amp;rarr; Pod1&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Node2 &amp;rarr; Pod2&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Node3 &amp;rarr; Pod3&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2999&quot; data-start=&quot;2978&quot; data-ke-size=&quot;size16&quot;&gt;NodePort Service 생성 시&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Node1:30008&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Node2:30008&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Node3:30008&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3065&quot; data-start=&quot;3046&quot; data-ke-size=&quot;size16&quot;&gt;모든 노드에서 동일한 포트가 열림.&lt;/p&gt;
&lt;p data-end=&quot;3077&quot; data-start=&quot;3067&quot; data-ke-size=&quot;size16&quot;&gt;하지만 중요한 점은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Node1로 요청이 들어와도 Pod1으로만 가는 것이 아님.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;3119&quot; data-start=&quot;3114&quot; data-ke-size=&quot;size16&quot;&gt;실제 흐름&lt;/p&gt;
&lt;blockquote data-end=&quot;3119&quot; data-start=&quot;3114&quot; data-ke-style=&quot;style3&quot;&gt;Client&lt;br /&gt;&amp;nbsp;&amp;nbsp;│&lt;br /&gt;Node1:30008&lt;br /&gt;&amp;nbsp;&amp;nbsp;│&lt;br /&gt;Service&lt;br /&gt;&amp;nbsp;&amp;nbsp;│&lt;br /&gt;├&amp;nbsp;Pod1&lt;br /&gt;├&amp;nbsp;Pod2&lt;br /&gt;└ Pod3&lt;/blockquote&gt;
&lt;p data-end=&quot;3231&quot; data-start=&quot;3191&quot; data-ke-size=&quot;size16&quot;&gt;즉 &lt;b&gt;Service가 Pod 레벨 Load Balancing 수행&lt;/b&gt;.&lt;/p&gt;
&lt;hr data-end=&quot;3236&quot; data-start=&quot;3233&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;3822&quot; data-start=&quot;3805&quot; data-section-id=&quot;1ob3y2&quot; data-ke-size=&quot;size16&quot;&gt;Service는 매우 유연함.&lt;/p&gt;
&lt;p data-end=&quot;3860&quot; data-start=&quot;3842&quot; data-ke-size=&quot;size16&quot;&gt;다음 상황 모두 동일하게 동작함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3899&quot; data-start=&quot;3862&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3870&quot; data-start=&quot;3862&quot; data-section-id=&quot;32h5um&quot;&gt;Pod 1개&lt;/li&gt;
&lt;li data-end=&quot;3881&quot; data-start=&quot;3871&quot; data-section-id=&quot;1t11ai7&quot;&gt;Pod 여러 개&lt;/li&gt;
&lt;li data-end=&quot;3899&quot; data-start=&quot;3882&quot; data-section-id=&quot;i3eejb&quot;&gt;여러 Node에 Pod 분산&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3945&quot; data-start=&quot;3901&quot; data-ke-size=&quot;size16&quot;&gt;그리고 Pod가 추가되거나 삭제되면 Service가 &lt;b&gt;자동으로 업데이트됨&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;3960&quot; data-start=&quot;3947&quot; data-ke-size=&quot;size16&quot;&gt;추가 설정이 필요 없음.&lt;/p&gt;
&lt;p data-end=&quot;3960&quot; data-start=&quot;3947&quot; data-ke-size=&quot;size18&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;h4 data-end=&quot;3960&quot; data-start=&quot;3947&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;EKS + Fargate&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3960&quot; data-start=&quot;3947&quot; data-ke-size=&quot;size18&quot;&gt;EKS Fargate에서는 NodePort를 사용하지 않음.&lt;/p&gt;
&lt;p data-end=&quot;3315&quot; data-start=&quot;3313&quot; data-ke-size=&quot;size16&quot;&gt;이유&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Fargate에는 Node가 없음 (AWS도 Fargate는 &lt;b&gt;노드를 AWS가 관리하는 serverless compute&lt;/b&gt;라고 설명함.)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-end=&quot;3360&quot; data-start=&quot;3345&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컨테이너는 여전히 Pod 안에서 실행되고, Pod는 Kubernetes 관점에서는 Node에 스케줄링됨.&lt;/b&gt;&lt;br /&gt;다만 EKS Fargate에서는 그 Node를 &lt;b&gt;네가 관리하는 EC2 worker node로 보지 않는 것&lt;/b&gt;임. AWS가 Fargate용 스케줄러/컨트롤러로 Pod를 Fargate에 올리고, 각 Fargate Pod는 &lt;b&gt;자기만의 compute boundary&lt;/b&gt;를 가지며 다른 Pod와 커널/CPU/메모리/ENI를 공유하지 않는다고 AWS가 설명함.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3360&quot; data-start=&quot;3345&quot; data-ke-size=&quot;size16&quot;&gt;NodePort는 다음이 필요함.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Node network interface&lt;/li&gt;
&lt;li&gt;Node IP&lt;/li&gt;
&lt;li&gt;Node port open&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;863&quot; data-start=&quot;851&quot; data-ke-size=&quot;size16&quot;&gt;하지만 Fargate는&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Node IP 없음&lt;/li&gt;
&lt;li&gt;Node network 없음&lt;/li&gt;
&lt;li&gt;Node OS 접근 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;955&quot; data-start=&quot;915&quot; data-ke-size=&quot;size16&quot;&gt;즉 &lt;b&gt;Node 자체가 없어서 NodePort 개념을 만들 수 없음&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;1001&quot; data-start=&quot;957&quot; data-ke-size=&quot;size16&quot;&gt;그래서 AWS Load Balancer Controller도 Fargate에서는 target-type: ip &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;만 허용함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;3360&quot; data-start=&quot;3345&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3360&quot; data-start=&quot;3345&quot; data-ke-size=&quot;size16&quot;&gt;그래서 구조는 다음과 같음.&lt;/p&gt;
&lt;p data-end=&quot;3360&quot; data-start=&quot;3345&quot; data-ke-size=&quot;size16&quot;&gt;Client&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;ALB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;TargetGroup&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;Pod&amp;nbsp;IP&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;Pod&lt;/p&gt;
&lt;p data-end=&quot;3360&quot; data-start=&quot;3345&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3444&quot; data-start=&quot;3443&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;ALB &amp;rarr; Pod 직접&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Service는 내부 routing과 DNS 역할을 담당함.&lt;/span&gt;&lt;/div&gt;
&lt;/div&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;68&quot; data-start=&quot;38&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ClusterIP Service&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;163&quot; data-start=&quot;124&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 &lt;b&gt;풀스택 웹 애플리케이션&lt;/b&gt;은 여러 종류의 Pod로 구성됨.&lt;/p&gt;
&lt;p data-end=&quot;178&quot; data-start=&quot;165&quot; data-ke-size=&quot;size16&quot;&gt;예를 들면 다음과 같음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;301&quot; data-start=&quot;180&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;206&quot; data-start=&quot;180&quot;&gt;Frontend 웹 서버를 실행하는 Pod들&lt;/li&gt;
&lt;li data-end=&quot;230&quot; data-start=&quot;207&quot;&gt;Backend 서버를 실행하는 Pod들&lt;/li&gt;
&lt;li data-end=&quot;268&quot; data-start=&quot;231&quot;&gt;Redis 같은 Key-Value Store를 실행하는 Pod들&lt;/li&gt;
&lt;li data-end=&quot;301&quot; data-start=&quot;269&quot;&gt;MySQL 같은 영속성 데이터베이스를 실행하는 Pod들&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;331&quot; data-start=&quot;303&quot; data-ke-size=&quot;size16&quot;&gt;이처럼 애플리케이션은 여러 계층으로 나뉘어 동작함.&lt;/p&gt;
&lt;hr data-end=&quot;336&quot; data-start=&quot;333&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;366&quot; data-start=&quot;338&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;애플리케이션 내부 통신에서 생기는 문제&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;431&quot; data-start=&quot;368&quot; data-ke-size=&quot;size16&quot;&gt;Frontend는 Backend와 통신해야 함.&lt;br /&gt;Backend는 Database 및 Redis와 통신해야 함.&lt;/p&gt;
&lt;p data-end=&quot;470&quot; data-start=&quot;433&quot; data-ke-size=&quot;size16&quot;&gt;그렇다면 이런 계층 간 연결은 어떤 방식으로 해야 하는가가 문제임.&lt;/p&gt;
&lt;p data-end=&quot;522&quot; data-start=&quot;472&quot; data-ke-size=&quot;size16&quot;&gt;Pod는 각각 IP 주소를 할당받음.&lt;/p&gt;
&lt;p data-end=&quot;547&quot; data-start=&quot;524&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이 IP들은 &lt;b&gt;고정값이 아님&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;551&quot; data-start=&quot;549&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;618&quot; data-start=&quot;553&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;573&quot; data-start=&quot;553&quot;&gt;Pod는 언제든지 내려갈 수 있음&lt;/li&gt;
&lt;li data-end=&quot;596&quot; data-start=&quot;574&quot;&gt;새로운 Pod가 계속 생성될 수 있음&lt;/li&gt;
&lt;li data-end=&quot;618&quot; data-start=&quot;597&quot;&gt;생성될 때마다 IP가 바뀔 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;662&quot; data-start=&quot;620&quot; data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;Pod IP를 기준으로 내부 통신을 구성하면 안정적이지 않음&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;740&quot; data-start=&quot;664&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 Frontend Pod가 Backend에 요청을 보내야 할 때, Backend Pod가 3개 있다면 다음과 같은 문제가 생김.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;783&quot; data-start=&quot;742&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;768&quot; data-start=&quot;742&quot;&gt;어떤 Backend Pod로 연결해야 하는가&lt;/li&gt;
&lt;li data-end=&quot;783&quot; data-start=&quot;769&quot;&gt;그 선택은 누가 하는가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;823&quot; data-start=&quot;785&quot; data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하는 것이 &lt;b&gt;Kubernetes Service&lt;/b&gt;임.&lt;/p&gt;
&lt;hr data-end=&quot;828&quot; data-start=&quot;825&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;929&quot; data-start=&quot;850&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes Service는 여러 Pod를 하나의 그룹으로 묶고,&lt;br /&gt;그 그룹에 접근할 수 있는 단일 인터페이스 제공함.&lt;/p&gt;
&lt;p data-end=&quot;973&quot; data-start=&quot;931&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 Backend용 Service를 만들면 다음과 같은 효과가 있음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1105&quot; data-start=&quot;975&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;999&quot; data-start=&quot;975&quot;&gt;여러 Backend Pod를 하나로 묶음&lt;/li&gt;
&lt;li data-end=&quot;1039&quot; data-start=&quot;1000&quot;&gt;다른 Pod가 Backend에 접근할 때 하나의 주소만 사용하면 됨&lt;/li&gt;
&lt;li data-end=&quot;1073&quot; data-start=&quot;1040&quot;&gt;요청은 Service가 연결된 Pod들 중 하나로 전달됨&lt;/li&gt;
&lt;li data-end=&quot;1105&quot; data-start=&quot;1074&quot;&gt;어떤 Pod로 보낼지는 Service가 알아서 처리함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1188&quot; data-start=&quot;1107&quot; data-ke-size=&quot;size16&quot;&gt;즉, Frontend는 더 이상 특정 Backend Pod의 IP를 알 필요가 없음.&lt;br /&gt;그냥 Backend Service만 바라보면 됨.&lt;/p&gt;
&lt;p data-end=&quot;1278&quot; data-start=&quot;1190&quot; data-ke-size=&quot;size16&quot;&gt;마찬가지로 Redis용 Service를 만들면 Backend Pod는 Redis Pod의 개별 IP가 아니라&lt;br /&gt;Redis Service를 통해 접근하면 됨.&lt;/p&gt;
&lt;hr data-end=&quot;1283&quot; data-start=&quot;1280&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1310&quot; data-start=&quot;1285&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ClusterIP를 사용하는 이유&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1329&quot; data-start=&quot;1312&quot; data-ke-size=&quot;size16&quot;&gt;이 방식의 장점은 다음과 같음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1426&quot; data-start=&quot;1331&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1354&quot; data-start=&quot;1331&quot;&gt;마이크로서비스 구조를 쉽게 구성 가능함&lt;/li&gt;
&lt;li data-end=&quot;1375&quot; data-start=&quot;1355&quot;&gt;각 계층이 독립적으로 확장 가능함&lt;/li&gt;
&lt;li data-end=&quot;1405&quot; data-start=&quot;1376&quot;&gt;Pod가 교체되거나 이동되어도 통신 방식은 유지됨&lt;/li&gt;
&lt;li data-end=&quot;1426&quot; data-start=&quot;1406&quot;&gt;서비스 간 결합도를 낮출 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1515&quot; data-start=&quot;1428&quot; data-ke-size=&quot;size16&quot;&gt;즉, 각 계층은 필요에 따라 확장(scale)되거나 재배치(move)될 수 있고,&lt;br /&gt;그 과정에서 다른 서비스와의 통신에는 영향이 거의 없음.&lt;/p&gt;
&lt;hr data-end=&quot;1520&quot; data-start=&quot;1517&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1545&quot; data-start=&quot;1522&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ClusterIP의 핵심 개념&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1580&quot; data-start=&quot;1547&quot; data-ke-size=&quot;size16&quot;&gt;각 Service는 클러스터 내부에서 다음 두 가지를 가짐.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1594&quot; data-start=&quot;1582&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1589&quot; data-start=&quot;1582&quot;&gt;IP 주소&lt;/li&gt;
&lt;li data-end=&quot;1594&quot; data-start=&quot;1590&quot;&gt;이름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1648&quot; data-start=&quot;1596&quot; data-ke-size=&quot;size16&quot;&gt;그리고 다른 Pod들은 이 &lt;b&gt;Service 이름 또는 ClusterIP&lt;/b&gt;를 사용해 접근함.&lt;/p&gt;
&lt;p data-end=&quot;1685&quot; data-start=&quot;1650&quot; data-ke-size=&quot;size16&quot;&gt;이런 유형의 Service를 &lt;b&gt;ClusterIP&lt;/b&gt;라고 부름.&lt;/p&gt;
&lt;p data-end=&quot;1729&quot; data-start=&quot;1687&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;ClusterIP는 클러스터 내부 통신용 Service 타입&lt;/b&gt;임.&lt;/p&gt;
&lt;hr data-end=&quot;1734&quot; data-start=&quot;1731&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1766&quot; data-start=&quot;1736&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ClusterIP Service&amp;nbsp; Yaml구조&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773583538645&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: back-end

spec:
  type: ClusterIP
  ports:
    - targetPort: 80
      port: 80

  selector:
    app: myapp
    type: back-end&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1846&quot; data-start=&quot;1768&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1846&quot; data-start=&quot;1768&quot; data-ke-size=&quot;size16&quot;&gt;ClusterIP Service도 다른 Kubernetes 리소스와 마찬가지로&lt;br /&gt;정의 파일로 생성함.&lt;/p&gt;
&lt;p data-end=&quot;1862&quot; data-start=&quot;1848&quot; data-ke-size=&quot;size16&quot;&gt;기본 구조는 다음과 같음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1901&quot; data-start=&quot;1864&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1876&quot; data-start=&quot;1864&quot;&gt;apiVersion&lt;/li&gt;
&lt;li data-end=&quot;1883&quot; data-start=&quot;1877&quot;&gt;kind&lt;/li&gt;
&lt;li data-end=&quot;1894&quot; data-start=&quot;1884&quot;&gt;metadata&lt;/li&gt;
&lt;li data-end=&quot;1901&quot; data-start=&quot;1895&quot;&gt;spec&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1913&quot; data-start=&quot;1903&quot; data-ke-size=&quot;size20&quot;&gt;주요 설정&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1978&quot; data-start=&quot;1915&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1933&quot; data-start=&quot;1915&quot;&gt;apiVersion: v1&lt;/li&gt;
&lt;li data-end=&quot;1951&quot; data-start=&quot;1934&quot;&gt;kind: Service&lt;/li&gt;
&lt;li data-end=&quot;1978&quot; data-start=&quot;1952&quot;&gt;metadata.name: backend&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2012&quot; data-start=&quot;1980&quot; data-ke-size=&quot;size16&quot;&gt;여기서는 Service 이름을 backend로 지정함.&lt;/p&gt;
&lt;h4 data-end=&quot;2036&quot; data-start=&quot;2019&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-end=&quot;2036&quot; data-start=&quot;2019&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;spec 항목 설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2064&quot; data-start=&quot;2038&quot; data-ke-size=&quot;size16&quot;&gt;spec 아래에는 주로 다음 항목이 들어감.&lt;/p&gt;
&lt;p data-end=&quot;2078&quot; data-start=&quot;2066&quot; data-ke-size=&quot;size16&quot;&gt;1) type&lt;/p&gt;
&lt;p data-end=&quot;2094&quot; data-start=&quot;2079&quot; data-ke-size=&quot;size16&quot;&gt;Service 타입 지정함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2115&quot; data-start=&quot;2096&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2115&quot; data-start=&quot;2096&quot;&gt;type: ClusterIP&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2178&quot; data-start=&quot;2117&quot; data-ke-size=&quot;size16&quot;&gt;사실 &lt;b&gt;ClusterIP는 기본 타입&lt;/b&gt;임.&lt;br /&gt;따라서 명시하지 않아도 자동으로 ClusterIP로 간주함.&lt;/p&gt;
&lt;p data-end=&quot;2178&quot; data-start=&quot;2117&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2193&quot; data-start=&quot;2180&quot; data-ke-size=&quot;size16&quot;&gt;2) ports&lt;/p&gt;
&lt;p data-end=&quot;2223&quot; data-start=&quot;2194&quot; data-ke-size=&quot;size16&quot;&gt;Service가 어떤 포트를 통해 연결되는지 정의함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2283&quot; data-start=&quot;2225&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2256&quot; data-start=&quot;2225&quot;&gt;targetPort: 실제 Pod가 노출하는 포트&lt;/li&gt;
&lt;li data-end=&quot;2283&quot; data-start=&quot;2257&quot;&gt;port: Service가 노출하는 포트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2302&quot; data-start=&quot;2285&quot; data-ke-size=&quot;size16&quot;&gt;예시에서는 둘 다 80 사용함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2361&quot; data-start=&quot;2308&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2337&quot; data-start=&quot;2308&quot;&gt;Backend 애플리케이션이 80 포트에서 동작함&lt;/li&gt;
&lt;li data-end=&quot;2361&quot; data-start=&quot;2338&quot;&gt;Service도 80 포트로 요청 받음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2379&quot; data-start=&quot;2363&quot; data-ke-size=&quot;size16&quot;&gt;3) selector&lt;/p&gt;
&lt;p data-end=&quot;2413&quot; data-start=&quot;2380&quot; data-ke-size=&quot;size16&quot;&gt;어떤 Pod들을 이 Service에 연결할지 정하는 항목임.&lt;/p&gt;
&lt;p data-end=&quot;2459&quot; data-start=&quot;2415&quot; data-ke-size=&quot;size16&quot;&gt;Pod 정의 파일에 있는 label 값을 복사해서 selector에 넣으면 됨.&lt;/p&gt;
&lt;p data-end=&quot;2509&quot; data-start=&quot;2461&quot; data-ke-size=&quot;size16&quot;&gt;즉, selector와 label이 일치하는 Pod들이 이 Service의 대상이 됨.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-section-id=&quot;cj4k3d&quot; data-end=&quot;42&quot; data-start=&quot;0&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;LoadBalancer&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;83&quot; data-start=&quot;44&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 &lt;b&gt;LoadBalancer 타입의 Service&lt;/b&gt;를 살펴봄.&lt;/p&gt;
&lt;p data-end=&quot;200&quot; data-start=&quot;85&quot; data-ke-size=&quot;size16&quot;&gt;앞에서 &lt;b&gt;NodePort Service&lt;/b&gt;를 통해 외부에서 애플리케이션에 접근할 수 있도록 만드는 방법을 봤음.&lt;br /&gt;NodePort는 워커 노드의 특정 포트를 열어서 외부 요청을 Pod로 전달하는 방식임.&lt;/p&gt;
&lt;p data-end=&quot;279&quot; data-start=&quot;202&quot; data-ke-size=&quot;size16&quot;&gt;이제 여기서는 &lt;b&gt;Frontend 애플리케이션&lt;/b&gt;, 즉 예시로 나온 &lt;b&gt;Voting App&lt;/b&gt;과 &lt;b&gt;Result App&lt;/b&gt;에 초점을 맞춤.&lt;/p&gt;
&lt;hr data-end=&quot;284&quot; data-start=&quot;281&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;340&quot; data-start=&quot;300&quot; data-ke-size=&quot;size16&quot;&gt;이 Pod들은 Kubernetes 클러스터의 워커 노드들 위에서 실행됨.&lt;/p&gt;
&lt;p data-end=&quot;378&quot; data-start=&quot;342&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 &lt;b&gt;4개의 노드로 구성된 클러스터&lt;/b&gt;가 있다고 가정함.&lt;/p&gt;
&lt;p data-end=&quot;466&quot; data-start=&quot;380&quot; data-ke-size=&quot;size16&quot;&gt;그리고 외부 사용자가 애플리케이션에 접근할 수 있도록 하기 위해&lt;br /&gt;각 애플리케이션에 대해 &lt;b&gt;NodePort 타입 Service&lt;/b&gt;를 생성했다고 가정함.&lt;/p&gt;
&lt;p data-end=&quot;497&quot; data-start=&quot;468&quot; data-ke-size=&quot;size16&quot;&gt;이 NodePort Service는 다음 역할을 함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;544&quot; data-start=&quot;499&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-section-id=&quot;1je3piv&quot; data-end=&quot;523&quot; data-start=&quot;499&quot;&gt;각 노드의 특정 포트에서 외부 요청 받음&lt;/li&gt;
&lt;li data-section-id=&quot;1hlw2s&quot; data-end=&quot;544&quot; data-start=&quot;524&quot;&gt;받은 요청을 해당 Pod로 전달함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;595&quot; data-start=&quot;546&quot; data-ke-size=&quot;size16&quot;&gt;즉, 외부 사용자는 노드의 IP와 NodePort를 이용해서 애플리케이션에 접속 가능함.&lt;/p&gt;
&lt;hr data-end=&quot;600&quot; data-start=&quot;597&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-section-id=&quot;10368d7&quot; data-end=&quot;625&quot; data-start=&quot;602&quot; data-ke-size=&quot;size16&quot;&gt;이 방식은 동작은 하지만, 사용자에게 제공할 URL이 불편함.&lt;/p&gt;
&lt;p data-end=&quot;728&quot; data-start=&quot;663&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 사용자가 Voting App과 Result App에 접속하려면&lt;br /&gt;다음과 같은 형태의 주소를 사용해야 함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;776&quot; data-start=&quot;730&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-section-id=&quot;18lbo4q&quot; data-end=&quot;742&quot; data-start=&quot;730&quot;&gt;노드 IP + 포트&lt;/li&gt;
&lt;li data-section-id=&quot;11a0byu&quot; data-end=&quot;758&quot; data-start=&quot;743&quot;&gt;다른 노드 IP + 포트&lt;/li&gt;
&lt;li data-section-id=&quot;1v6rqli&quot; data-end=&quot;776&quot; data-start=&quot;759&quot;&gt;또 다른 노드 IP + 포트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;822&quot; data-start=&quot;778&quot; data-ke-size=&quot;size16&quot;&gt;즉, 애플리케이션 하나당 여러 개의 &lt;b&gt;IP:Port 조합&lt;/b&gt;이 생길 수 있음.&lt;/p&gt;
&lt;p data-end=&quot;930&quot; data-start=&quot;824&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 Voting App의 Pod가 실제로는&lt;br /&gt;IP가 70, 71인 두 노드에만 배포되어 있다고 하더라도,&lt;br /&gt;Service 특성상 &lt;b&gt;클러스터의 모든 노드 IP에서 접근 가능함&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;991&quot; data-start=&quot;932&quot; data-ke-size=&quot;size16&quot;&gt;즉, Pod가 특정 노드에만 떠 있어도&lt;br /&gt;사용자는 모든 노드의 IP와 NodePort로 접근할 수 있음.&lt;/p&gt;
&lt;p data-end=&quot;1027&quot; data-start=&quot;993&quot; data-ke-size=&quot;size16&quot;&gt;이론적으로는 문제없지만, 실제 사용자 입장에서는 매우 불편함.&lt;/p&gt;
&lt;p data-end=&quot;1052&quot; data-start=&quot;1029&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 원하는 것은 다음과 같은 형태임.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1107&quot; data-start=&quot;1054&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-section-id=&quot;rs1k74&quot; data-end=&quot;1080&quot; data-start=&quot;1054&quot;&gt;voting-app.example.com&lt;/li&gt;
&lt;li data-section-id=&quot;14zr5gk&quot; data-end=&quot;1107&quot; data-start=&quot;1081&quot;&gt;result-app.example.com&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1132&quot; data-start=&quot;1109&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;하나의 고정된 URL&lt;/b&gt;을 원함.&lt;/p&gt;
&lt;hr data-end=&quot;1137&quot; data-start=&quot;1134&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1225&quot; data-start=&quot;1163&quot; data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하는 한 가지 방법은&lt;br /&gt;&lt;b&gt;별도의 VM을 하나 만들어 외부 로드밸런서 용도로 사용하는 것&lt;/b&gt;임.&lt;/p&gt;
&lt;p data-end=&quot;1262&quot; data-start=&quot;1227&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 그 VM에 다음과 같은 소프트웨어를 설치할 수 있음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1281&quot; data-start=&quot;1264&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-section-id=&quot;11x77f1&quot; data-end=&quot;1273&quot; data-start=&quot;1264&quot;&gt;HAProxy&lt;/li&gt;
&lt;li data-section-id=&quot;16vuoim&quot; data-end=&quot;1281&quot; data-start=&quot;1274&quot;&gt;NGINX&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1343&quot; data-start=&quot;1283&quot; data-ke-size=&quot;size16&quot;&gt;그리고 그 로드밸런서가 외부 요청을 받아서&lt;br /&gt;클러스터 내부의 노드들로 트래픽을 분산하도록 설정할 수 있음.&lt;/p&gt;
&lt;p data-end=&quot;1369&quot; data-start=&quot;1345&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이 방식은 다음과 같은 단점이 있음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1432&quot; data-start=&quot;1371&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-section-id=&quot;i9618v&quot; data-end=&quot;1385&quot; data-start=&quot;1371&quot;&gt;별도 VM 준비 필요함&lt;/li&gt;
&lt;li data-section-id=&quot;6d35mg&quot; data-end=&quot;1400&quot; data-start=&quot;1386&quot;&gt;로드밸런서 설치 필요함&lt;/li&gt;
&lt;li data-section-id=&quot;1ojeko&quot; data-end=&quot;1413&quot; data-start=&quot;1401&quot;&gt;라우팅 설정 필요함&lt;/li&gt;
&lt;li data-section-id=&quot;1aahfyq&quot; data-end=&quot;1432&quot; data-start=&quot;1414&quot;&gt;지속적인 운영 및 관리 필요함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1465&quot; data-start=&quot;1434&quot; data-ke-size=&quot;size16&quot;&gt;즉, 직접 구성하고 유지보수하기에는 번거롭고 부담이 큼.&lt;/p&gt;
&lt;hr data-end=&quot;1470&quot; data-start=&quot;1467&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Google Cloud&lt;/li&gt;
&lt;li data-section-id=&quot;1o4fv1&quot; data-end=&quot;1585&quot; data-start=&quot;1580&quot;&gt;AWS&lt;/li&gt;
&lt;li data-section-id=&quot;16ywf75&quot; data-end=&quot;1593&quot; data-start=&quot;1586&quot;&gt;Azure&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1641&quot; data-start=&quot;1595&quot; data-ke-size=&quot;size16&quot;&gt;이런 클라우드들은 자체적으로 &lt;b&gt;네이티브 Load Balancer&lt;/b&gt; 기능 제공함.&lt;/p&gt;
&lt;p data-end=&quot;1693&quot; data-start=&quot;1643&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes는 일부 클라우드 제공자의 네이티브 로드밸런서와 연동하는 기능을 지원함.&lt;/p&gt;
&lt;p data-end=&quot;1734&quot; data-start=&quot;1695&quot; data-ke-size=&quot;size16&quot;&gt;따라서 사용자는 직접 HAProxy나 NGINX를 설치하지 않아도 됨.&lt;/p&gt;
&lt;p data-end=&quot;1802&quot; data-start=&quot;1736&quot; data-ke-size=&quot;size16&quot;&gt;그 대신 &lt;b&gt;Frontend Service의 타입을 NodePort가 아니라 LoadBalancer로 지정하면 됨&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;1806&quot; data-start=&quot;1804&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1856&quot; data-start=&quot;1808&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-section-id=&quot;ya6qgj&quot; data-end=&quot;1829&quot; data-start=&quot;1808&quot;&gt;type: NodePort 대신&lt;/li&gt;
&lt;li data-section-id=&quot;1hradqt&quot; data-end=&quot;1856&quot; data-start=&quot;1830&quot;&gt;type: LoadBalancer 사용함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1923&quot; data-start=&quot;1858&quot; data-ke-size=&quot;size16&quot;&gt;그러면 Kubernetes가 클라우드 제공자의 로드밸런서와 연동하여&lt;br /&gt;외부에서 접근 가능한 단일 진입점을 구성해줌.&lt;/p&gt;
&lt;hr data-end=&quot;1928&quot; data-start=&quot;1925&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;2016&quot; data-start=&quot;1958&quot; data-ke-size=&quot;size16&quot;&gt;LoadBalancer 타입을 사용하면&lt;br /&gt;클라우드 환경에서 외부 로드밸런서를 자동으로 구성할 수 있음.&lt;/p&gt;
&lt;p data-end=&quot;2052&quot; data-start=&quot;2018&quot; data-ke-size=&quot;size16&quot;&gt;그 결과 사용자는 여러 노드의 IP와 포트를 알 필요가 없음.&lt;/p&gt;
&lt;p data-end=&quot;2086&quot; data-start=&quot;2054&quot; data-ke-size=&quot;size16&quot;&gt;대신 하나의 외부 주소를 통해 애플리케이션에 접근 가능함.&lt;/p&gt;
&lt;p data-end=&quot;2123&quot; data-start=&quot;2088&quot; data-ke-size=&quot;size16&quot;&gt;즉, 사용자 입장에서는 더 자연스럽고 실용적인 접근 방식이 됨.&lt;/p&gt;
&lt;hr data-end=&quot;2128&quot; data-start=&quot;2125&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;2178&quot; data-start=&quot;2144&quot; data-ke-size=&quot;size16&quot;&gt;이 기능은 &lt;b&gt;지원되는 클라우드 환경에서만 제대로 동작함&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;2194&quot; data-start=&quot;2180&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로 다음은 지원됨.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2215&quot; data-start=&quot;2196&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-section-id=&quot;1o4h24&quot; data-end=&quot;2201&quot; data-start=&quot;2196&quot;&gt;GCP&lt;/li&gt;
&lt;li data-section-id=&quot;1o4fv1&quot; data-end=&quot;2207&quot; data-start=&quot;2202&quot;&gt;AWS&lt;/li&gt;
&lt;li data-section-id=&quot;16ywf75&quot; data-end=&quot;2215&quot; data-start=&quot;2208&quot;&gt;Azure&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2251&quot; data-start=&quot;2217&quot; data-ke-size=&quot;size16&quot;&gt;반대로 다음과 같은 환경에서는 기대한 방식으로 동작하지 않음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2299&quot; data-start=&quot;2253&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-section-id=&quot;271se4&quot; data-end=&quot;2265&quot; data-start=&quot;2253&quot;&gt;VirtualBox&lt;/li&gt;
&lt;li data-section-id=&quot;1d48vbt&quot; data-end=&quot;2276&quot; data-start=&quot;2266&quot;&gt;일반 로컬 환경&lt;/li&gt;
&lt;li data-section-id=&quot;rhe2he&quot; data-end=&quot;2299&quot; data-start=&quot;2277&quot;&gt;클라우드 로드밸런서 연동이 없는 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2382&quot; data-start=&quot;2301&quot; data-ke-size=&quot;size16&quot;&gt;이런 &lt;b&gt;비지원 환경&lt;/b&gt;에서 Service 타입을 LoadBalancer로 설정하더라도&lt;br /&gt;실제로는 외부 클라우드 로드밸런서가 생성되지 않음.&lt;/p&gt;
&lt;p data-end=&quot;2417&quot; data-start=&quot;2384&quot; data-ke-size=&quot;size16&quot;&gt;결과적으로는 &lt;b&gt;NodePort와 거의 같은 효과&lt;/b&gt;만 냄.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2475&quot; data-start=&quot;2423&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-section-id=&quot;106mugu&quot; data-end=&quot;2444&quot; data-start=&quot;2423&quot;&gt;노드의 높은 포트로 서비스가 노출됨&lt;/li&gt;
&lt;li data-section-id=&quot;6fllvr&quot; data-end=&quot;2475&quot; data-start=&quot;2445&quot;&gt;하지만 별도의 외부 로드밸런서는 자동 생성되지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2541&quot; data-start=&quot;2477&quot; data-ke-size=&quot;size16&quot;&gt;따라서 LoadBalancer 타입이라고 해서&lt;br /&gt;어떤 환경에서나 자동으로 단일 외부 주소가 생기는 것은 아님.&lt;/p&gt;
&lt;p data-end=&quot;2557&quot; data-start=&quot;2543&quot; data-ke-size=&quot;size16&quot;&gt;환경 지원 여부가 중요함.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2557&quot; data-start=&quot;2543&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Load Balancer Yaml&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1773585585493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: myapp-service

spec:
  type: LoadBalancer
  ports:
    - targetPort: 80
      port: 80
      nodePort: 30008&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;28&quot; data-end=&quot;50&quot;&gt;&lt;b&gt;Namespace&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;52&quot; data-end=&quot;111&quot;&gt;Kubernetes의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Namespace&lt;/b&gt;는 클러스터 안의 리소스를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;논리적으로 구분하는 공간&lt;/b&gt;임.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;113&quot; data-end=&quot;140&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;142&quot; data-end=&quot;184&quot;&gt;예를 들어 Smith 가족의 집과 Williams 가족의 집이 있다고 하면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;186&quot; data-end=&quot;268&quot;&gt;
&lt;li data-start=&quot;186&quot; data-end=&quot;215&quot;&gt;같은 집 안에서는 사람을 이름만으로 부를 수 있음&lt;/li&gt;
&lt;li data-start=&quot;216&quot; data-end=&quot;246&quot;&gt;다른 집 사람을 부를 때는 더 정확한 구분이 필요함&lt;/li&gt;
&lt;li data-start=&quot;247&quot; data-end=&quot;268&quot;&gt;각 집마다 규칙과 자원이 따로 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;270&quot; data-end=&quot;309&quot;&gt;Kubernetes에서도 Namespace가 이와 비슷한 역할 수행함.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;311&quot; data-end=&quot;324&quot;&gt;즉, Namespace는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;326&quot; data-end=&quot;378&quot;&gt;
&lt;li data-start=&quot;326&quot; data-end=&quot;336&quot;&gt;리소스를 구분함&lt;/li&gt;
&lt;li data-start=&quot;337&quot; data-end=&quot;352&quot;&gt;서로 다른 환경을 격리함&lt;/li&gt;
&lt;li data-start=&quot;353&quot; data-end=&quot;378&quot;&gt;정책과 자원 제한을 따로 적용 가능하게 함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;380&quot; data-end=&quot;383&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;409&quot; data-end=&quot;426&quot;&gt;지금까지 생성한 다음 리소스들은&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;428&quot; data-end=&quot;456&quot;&gt;
&lt;li data-start=&quot;428&quot; data-end=&quot;433&quot;&gt;Pod&lt;/li&gt;
&lt;li data-start=&quot;434&quot; data-end=&quot;446&quot;&gt;Deployment&lt;/li&gt;
&lt;li data-start=&quot;447&quot; data-end=&quot;456&quot;&gt;Service&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;458&quot; data-end=&quot;485&quot;&gt;모두 어떤 Namespace 안에서 생성된 것임.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;487&quot; data-end=&quot;543&quot;&gt;지금까지 별도로 지정하지 않았다면&lt;br /&gt;대부분&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;default namespace&lt;/b&gt;에서 작업한 것임.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;545&quot; data-end=&quot;607&quot;&gt;이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;default namespace&lt;/b&gt;는 Kubernetes가 자동으로 만들어주는 기본 Namespace임.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;609&quot; data-end=&quot;644&quot;&gt;즉, 지금까지 계속 기본 집 안에서 작업하고 있었던 것과 같음.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;646&quot; data-end=&quot;649&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;690&quot; data-end=&quot;741&quot;&gt;Kubernetes는 클러스터가 처음 생성될 때 몇 가지 Namespace를 자동으로 만듦.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;743&quot; data-end=&quot;758&quot;&gt;&lt;b&gt;1) default&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;759&quot; data-end=&quot;798&quot;&gt;사용자가 별도 지정 없이 작업할 때 사용하는 기본 Namespace임.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;800&quot; data-end=&quot;819&quot;&gt;&lt;b&gt;2) kube-system&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;820&quot; data-end=&quot;857&quot;&gt;Kubernetes 내부 구성요소들이 사용하는 Namespace임.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;859&quot; data-end=&quot;861&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;863&quot; data-end=&quot;887&quot;&gt;
&lt;li data-start=&quot;863&quot; data-end=&quot;877&quot;&gt;네트워크 관련 구성요소&lt;/li&gt;
&lt;li data-start=&quot;878&quot; data-end=&quot;887&quot;&gt;DNS 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;889&quot; data-end=&quot;945&quot;&gt;이런 시스템 리소스를 사용자 리소스와 분리해서&lt;br /&gt;실수로 수정하거나 삭제하지 않게 하기 위한 목적임.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;947&quot; data-end=&quot;966&quot;&gt;&lt;b&gt;3) kube-public&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;967&quot; data-end=&quot;1007&quot;&gt;모든 사용자가 접근할 수 있어야 하는 리소스를 위한 Namespace임.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1140&quot; data-end=&quot;1228&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;1230&quot; data-end=&quot;1233&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;1235&quot; data-end=&quot;1260&quot;&gt;&lt;b&gt;Namespace를 왜 사용하는가&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1262&quot; data-end=&quot;1309&quot;&gt;Namespace를 사용하는 대표적인 이유는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;격리(isolation)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;때문임.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1311&quot; data-end=&quot;1349&quot;&gt;예를 들어 하나의 클러스터를 다음 두 환경이 함께 사용한다고 가정함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1351&quot; data-end=&quot;1363&quot;&gt;
&lt;li data-start=&quot;1351&quot; data-end=&quot;1356&quot;&gt;dev&lt;/li&gt;
&lt;li data-start=&quot;1357&quot; data-end=&quot;1363&quot;&gt;prod&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1365&quot; data-end=&quot;1418&quot;&gt;이때 Namespace를 나누지 않으면&lt;br /&gt;개발 작업 중 운영 리소스를 실수로 건드릴 수 있음.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1420&quot; data-end=&quot;1437&quot;&gt;그래서 다음처럼 나눌 수 있음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1439&quot; data-end=&quot;1471&quot;&gt;
&lt;li data-start=&quot;1439&quot; data-end=&quot;1454&quot;&gt;dev namespace&lt;/li&gt;
&lt;li data-start=&quot;1455&quot; data-end=&quot;1471&quot;&gt;prod namespace&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1473&quot; data-end=&quot;1496&quot;&gt;이렇게 하면 환경별 리소스를 분리 가능함.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1498&quot; data-end=&quot;1545&quot;&gt;즉, Namespace는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;같은 클러스터 안에서 환경을 안전하게 나누는 방법&lt;/b&gt;임.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;1547&quot; data-end=&quot;1550&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;1552&quot; data-end=&quot;1584&quot;&gt;&lt;b&gt;Namespace마다 따로 적용할 수 있는 것&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1586&quot; data-end=&quot;1620&quot;&gt;각 Namespace는 독립적으로 다음 설정을 가질 수 있음.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;1622&quot; data-end=&quot;1640&quot;&gt;&lt;b&gt;1) 정책(Policy)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1641&quot; data-end=&quot;1663&quot;&gt;누가 무엇을 할 수 있는지 정의 가능함.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1665&quot; data-end=&quot;1704&quot;&gt;즉, 접근 제어나 권한 정책을 Namespace 단위로 나눌 수 있음.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;1706&quot; data-end=&quot;1736&quot;&gt;&lt;b&gt;2) 자원 할당량(Resource Quota)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1737&quot; data-end=&quot;1775&quot;&gt;각 Namespace가 사용할 수 있는 자원의 한계를 정할 수 있음.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1777&quot; data-end=&quot;1790&quot;&gt;예를 들면 다음과 같음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1792&quot; data-end=&quot;1832&quot;&gt;
&lt;li data-start=&quot;1792&quot; data-end=&quot;1803&quot;&gt;Pod 개수 제한&lt;/li&gt;
&lt;li data-start=&quot;1804&quot; data-end=&quot;1816&quot;&gt;CPU 사용량 제한&lt;/li&gt;
&lt;li data-start=&quot;1817&quot; data-end=&quot;1832&quot;&gt;Memory 사용량 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1834&quot; data-end=&quot;1880&quot;&gt;이렇게 하면 특정 Namespace가 과도하게 자원을 사용하지 못하게 할 수 있음.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;1882&quot; data-end=&quot;1885&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;1887&quot; data-end=&quot;1924&quot;&gt;&lt;b&gt;같은 Namespace 안에서는 이름만으로 접근 가능함&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1926&quot; data-end=&quot;2003&quot;&gt;같은 집 안에서는 사람을 이름만으로 부를 수 있다고 했듯이,&lt;br /&gt;같은 Namespace 안의 리소스도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;이름만으로 서로 접근 가능함&lt;/b&gt;.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2005&quot; data-end=&quot;2078&quot;&gt;예를 들어 webapp Pod가 같은 Namespace 안의 DB Service에 접근할 때는&lt;br /&gt;그냥 서비스 이름만 사용하면 됨.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2080&quot; data-end=&quot;2082&quot;&gt;예: &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;db-service&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2080&quot; data-end=&quot;2082&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2108&quot; data-end=&quot;2139&quot;&gt;즉, 같은 Namespace 안에서는 이름만으로 충분함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 Kubernetes에서 &lt;b&gt;namespace를 명시하지 않은 DNS query는 Pod 자신의 namespace 기준으로 해석&lt;/b&gt;되기 때문이다.&lt;br /&gt;또한 공식문서에 따르면 &lt;b&gt;kubelet은 각 Pod의 /etc/resolv.conf를 구성&lt;/b&gt;하며, 짧은 이름 질의는 search domain을 이용해 확장될 수 있다. 예를 들어 현재 Namespace가 test라면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;db-service&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;rarr; db-service.test.svc.cluster.local&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1435&quot; data-start=&quot;1418&quot; data-ke-size=&quot;size16&quot;&gt;예시 resolv.conf&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773838470123&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nameserver 10.32.0.10
search &amp;lt;namespace&amp;gt;.svc.cluster.local svc.cluster.local cluster.local
options ndots:5&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1765&quot; data-start=&quot;1557&quot; data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;같은 Namespace 안의 Service 호출에는 FQDN을 항상 풀로 적을 필요가 없고&lt;/b&gt;,&lt;br /&gt;&amp;lt;service-name&amp;gt;만으로도 충분하다.&lt;br /&gt;다른 Namespace의 Service에 접근할 때만 &amp;lt;service-name&amp;gt;.&amp;lt;namespace&amp;gt; 또는 전체 FQDN을 사용하면 된다.&lt;/p&gt;
&lt;p data-end=&quot;1765&quot; data-start=&quot;1557&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;2141&quot; data-end=&quot;2144&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;2146&quot; data-end=&quot;2183&quot;&gt;&lt;b&gt;다른 Namespace의 Service에 접근하는 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2185&quot; data-end=&quot;2241&quot;&gt;만약 다른 Namespace에 있는 Service에 접근하려면&lt;br /&gt;&lt;b&gt;서비스 이름만으로는 부족함&lt;/b&gt;.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2243&quot; data-end=&quot;2258&quot;&gt;이때는 다음 형식을 사용함.&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;blockquote id=&quot;code-block-viewer&quot; style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;service-name.namespace&lt;br /&gt;or&lt;br /&gt;service-name.namespace.svc.cluster.local&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2314&quot; data-end=&quot;2395&quot;&gt;예를 들어 default namespace의 web Pod가&lt;br /&gt;dev namespace에 있는 db-service에 접근하려면 다음처럼 사용함.&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;blockquote id=&quot;code-block-viewer&quot; style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;db-service.dev&lt;br /&gt;or&lt;br /&gt;db-service.dev.svc.cluster.local (FQDN, 명시적임)&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2443&quot; data-end=&quot;2490&quot;&gt;이 형식은 Kubernetes가 Service 생성 시 자동으로 만든 DNS 이름임.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2492&quot; data-end=&quot;2506&quot;&gt;구성을 보면 다음과 같음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;2508&quot; data-end=&quot;2606&quot;&gt;
&lt;li data-start=&quot;2508&quot; data-end=&quot;2531&quot;&gt;db-service &amp;rarr; 서비스 이름&lt;/li&gt;
&lt;li data-start=&quot;2532&quot; data-end=&quot;2554&quot;&gt;dev &amp;rarr; Namespace 이름&lt;/li&gt;
&lt;li data-start=&quot;2555&quot; data-end=&quot;2574&quot;&gt;svc &amp;rarr; 서비스 서브도메인&lt;/li&gt;
&lt;li data-start=&quot;2575&quot; data-end=&quot;2606&quot;&gt;cluster.local &amp;rarr; 클러스터 기본 도메인&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2608&quot; data-end=&quot;2664&quot;&gt;&lt;span&gt;다른 Namespace에서는 최소한 &amp;lt;service-name&amp;gt;.&amp;lt;namespace&amp;gt; 형태로 namespace를 명시해야 한다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;가장 명시적인 전체 이름은 &amp;lt;service-name&amp;gt;.&amp;lt;namespace&amp;gt;.svc.cluster.local 이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;2666&quot; data-end=&quot;2669&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;2703&quot; data-end=&quot;2713&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;kubectl&amp;nbsp;&lt;/span&gt;get&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;&amp;nbsp;pods&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;&lt;br /&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이 명령은 기본적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;default namespace의 Pod만 조회함&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2816&quot; data-end=&quot;2844&quot;&gt;예를 들어 kube-system의 Pod를 보려면:&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;kubectl&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pods&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;--namespace&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;kube-system&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;kubectl&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pods&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-n&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;kube-system&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;2954&quot; data-end=&quot;2957&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;2959&quot; data-end=&quot;2993&quot;&gt;&lt;b&gt;리소스를 다른 Namespace에 생성하는 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2995&quot; data-end=&quot;3068&quot;&gt;Pod 정의 파일로 리소스를 생성할 때&lt;br /&gt;Namespace를 지정하지 않으면 기본적으로 default namespace에 생성됨.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;3070&quot; data-end=&quot;3089&quot;&gt;&lt;b&gt;방법 1) 명령어에서 지정&lt;/b&gt;&lt;/h4&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;kubectl apply&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pod.yaml&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-n&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;dev&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;3136&quot; data-end=&quot;3160&quot;&gt;&lt;b&gt;방법 2) YAML 파일 안에 지정&lt;/b&gt;&lt;/h4&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773595909862&quot; class=&quot;dts&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;metadata:
  name: my-pod
  namespace: dev&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;3216&quot; data-end=&quot;3246&quot;&gt;이렇게 해두면 항상 dev namespace에 생성됨.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;3248&quot; data-end=&quot;3277&quot;&gt;실수 방지 측면에서 YAML에 명시하는 것이 유용함.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;3279&quot; data-end=&quot;3282&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;3284&quot; data-end=&quot;3307&quot;&gt;&lt;b&gt;Namespace 생성 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;3309&quot; data-end=&quot;3350&quot;&gt;Namespace도 Kubernetes 객체이므로 YAML로 생성 가능함.&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773595909862&quot; class=&quot;properties&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Namespace
metadata:
  name: dev
  
  
## 생성
kubectl create -f namespace.yaml

## 명령어로
kubectl create namespace dev&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;3535&quot; data-end=&quot;3538&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;3567&quot; data-end=&quot;3630&quot;&gt;매번 -n dev를 붙이는 것이 번거로우면&lt;br /&gt;현재 context의 기본 Namespace를 변경할 수 있음.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;3632&quot; data-end=&quot;3634&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;kubectl config set-context&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;--current&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;--namespace&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;3702&quot; data-end=&quot;3713&quot;&gt;이렇게 하면 이후에는&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;kubectl&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pods&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;3745&quot; data-end=&quot;3775&quot;&gt;만 입력해도 dev namespace 기준으로 동작함.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;3777&quot; data-end=&quot;3818&quot;&gt;다른 Namespace를 보고 싶으면 그때만 -n 옵션을 사용하면 됨.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;3820&quot; data-end=&quot;3823&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;3855&quot; data-end=&quot;3885&quot;&gt;클러스터 전체 Pod를 보고 싶다면 다음 명령 사용함.&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;kubectl&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pods&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;--all-namespaces&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;3934&quot; data-end=&quot;3936&quot;&gt;또는&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;kubectl&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pods&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-A&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;3971&quot; data-end=&quot;4005&quot;&gt;이 명령은 모든 Namespace의 Pod를 한 번에 보여줌.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;4007&quot; data-end=&quot;4010&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;4012&quot; data-end=&quot;4052&quot;&gt;&lt;b&gt;ResourceQuota로 Namespace 자원 제한하기&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;4054&quot; data-end=&quot;4115&quot;&gt;특정 Namespace가 사용할 수 있는 자원을 제한하려면&lt;br /&gt;&lt;b&gt;ResourceQuota&lt;/b&gt;를 생성하면 됨.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;4117&quot; data-end=&quot;4140&quot;&gt;예를 들어 다음과 같은 제한 설정 가능함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;4142&quot; data-end=&quot;4175&quot;&gt;
&lt;li data-start=&quot;4142&quot; data-end=&quot;4151&quot;&gt;Pod 10개&lt;/li&gt;
&lt;li data-start=&quot;4152&quot; data-end=&quot;4161&quot;&gt;CPU 10개&lt;/li&gt;
&lt;li data-start=&quot;4162&quot; data-end=&quot;4175&quot;&gt;Memory 10GB&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;4177&quot; data-end=&quot;4220&quot;&gt;이렇게 하면 해당 Namespace는 정해진 범위 내에서만 자원 사용 가능함.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;4222&quot; data-end=&quot;4264&quot;&gt;즉, ResourceQuota는 Namespace 단위의 자원 통제 수단임.&lt;/p&gt;
&lt;pre id=&quot;code_1773596056345&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: ResourceQuota
metadata:
 name: compute-quota
 namespace: dev
 
spec: 
 hard:
   pods: &quot;10&quot;
   requests.cpu: &quot;4
   requests.memory: 5Gi
   limits.cput: &quot;10&quot;
   limits.memory: 10Gi&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Infra/K8S</category>
      <author>minsu20</author>
      <guid isPermaLink="true">https://minsu20.tistory.com/95</guid>
      <comments>https://minsu20.tistory.com/95#entry95comment</comments>
      <pubDate>Sun, 15 Mar 2026 22:44:08 +0900</pubDate>
    </item>
    <item>
      <title>[CKA 준비] - Core Concepts - 2</title>
      <link>https://minsu20.tistory.com/94</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Yaml in Kubernets&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1773451054880&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion:
kind:
metadata:
spec&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 85px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Kind&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Pod&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;v1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Service&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;v1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;ReplicSet&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;apps/v1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Deployment&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;apps/v1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Pod yaml 구조&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1773450282683&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
    - name: nginx-container
      image: nginx&lt;/code&gt;&lt;/pre&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;Pod 관련 명령어&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;#&amp;nbsp;Pod 목록&amp;nbsp;보기&lt;/b&gt;&lt;br /&gt;kubectl&amp;nbsp;get&amp;nbsp;pods&lt;br /&gt;kubectl&amp;nbsp;get&amp;nbsp;pods&amp;nbsp;-o&amp;nbsp;wide&lt;br /&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;Pod&amp;nbsp;상세&amp;nbsp;보기&lt;/b&gt;&lt;br /&gt;kubectl&amp;nbsp;describe&amp;nbsp;pod&amp;nbsp;&amp;lt;pod-name&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;Pod&amp;nbsp;YAML&amp;nbsp;초안&amp;nbsp;만들기&lt;/b&gt;&lt;br /&gt;kubectl&amp;nbsp;run&amp;nbsp;&amp;lt;pod-name&amp;gt;&amp;nbsp;--image=&amp;lt;image-name&amp;gt;&amp;nbsp;--dry-run=client&amp;nbsp;-o&amp;nbsp;yaml&amp;nbsp;&amp;gt;&amp;nbsp;filename.yaml&lt;br /&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;YAML로&amp;nbsp;Pod&amp;nbsp;생성&lt;/b&gt;&lt;br /&gt;kubectl&amp;nbsp;create&amp;nbsp;-f&amp;nbsp;filename.yaml&lt;br /&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;YAML&amp;nbsp;수정&amp;nbsp;후&amp;nbsp;반영&lt;/b&gt;&lt;br /&gt;vim&amp;nbsp;filename.yaml&lt;br /&gt;kubectl&amp;nbsp;apply&amp;nbsp;-f&amp;nbsp;filename.yaml&lt;br /&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;Pod&amp;nbsp;삭제&lt;/b&gt;&lt;br /&gt;kubectl&amp;nbsp;delete&amp;nbsp;pod&amp;nbsp;&amp;lt;pod-name&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;로그&amp;nbsp;확인&lt;/b&gt;&lt;br /&gt;kubectl&amp;nbsp;logs&amp;nbsp;&amp;lt;pod-name&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;Pod&amp;nbsp;내부&amp;nbsp;접속&lt;/b&gt;&lt;br /&gt;kubectl&amp;nbsp;exec&amp;nbsp;-it&amp;nbsp;&amp;lt;pod-name&amp;gt;&amp;nbsp;--&amp;nbsp;/bin/sh&lt;/blockquote&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;Replication Controller / ReplicaSet&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;122&quot; data-start=&quot;110&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 컨트롤러란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;190&quot; data-start=&quot;124&quot; data-ke-size=&quot;size16&quot;&gt;컨트롤러는 Kubernetes에서 &lt;b&gt;객체 상태를 계속 감시하고, &lt;/b&gt;&lt;b&gt;원하는 상태가 유지되도록 조치하는 구성요소&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;285&quot; data-start=&quot;192&quot; data-ke-size=&quot;size16&quot;&gt;즉, Kubernetes는 그냥 한 번 생성하고 끝나는 것이 아니라,&lt;/p&gt;
&lt;p data-end=&quot;285&quot; data-start=&quot;192&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;계속 상태를 확인하면서 부족하거나 문제가 생기면 자동으로 맞춰주는 방식&lt;/b&gt;으로 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;313&quot; data-start=&quot;292&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 왜 여러 Pod가 필요한가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;360&quot; data-start=&quot;315&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 애플리케이션이 &lt;b&gt;Pod 1개에서만 실행 중&lt;/b&gt;이라고 가정&lt;/p&gt;
&lt;p data-end=&quot;378&quot; data-start=&quot;362&quot; data-ke-size=&quot;size16&quot;&gt;이 경우 그 Pod가 죽으면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;415&quot; data-start=&quot;380&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;394&quot; data-start=&quot;380&quot;&gt;애플리케이션이 중단되고&lt;/li&gt;
&lt;li data-end=&quot;415&quot; data-start=&quot;395&quot;&gt;사용자는 접속할 수 없게 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;450&quot; data-start=&quot;417&quot; data-ke-size=&quot;size16&quot;&gt;그래서 같은 애플리케이션 Pod를 &lt;b&gt;여러 개 유지&lt;/b&gt;하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;489&quot; data-start=&quot;452&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;462&quot; data-start=&quot;452&quot;&gt;하나가 실패해도&lt;/li&gt;
&lt;li data-end=&quot;489&quot; data-start=&quot;463&quot;&gt;나머지 Pod가 계속 서비스할 수 있음&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;3. Replication Controller / ReplicaSet 의 역할&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;639&quot; data-start=&quot;605&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;지정한 개수만큼 Pod가 항상 실행되도록 유지한다.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;666&quot; data-start=&quot;641&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 replicas를 3으로 설정하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;713&quot; data-start=&quot;668&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;686&quot; data-start=&quot;668&quot;&gt;정상일 때는 Pod 3개 유지&lt;/li&gt;
&lt;li data-end=&quot;713&quot; data-start=&quot;687&quot;&gt;1개가 죽으면 새로 만들어서 다시 3개 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;753&quot; data-start=&quot;715&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;Pod 개수를 자동으로 맞춰주는 관리자&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;753&quot; data-start=&quot;715&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;753&quot; data-start=&quot;715&quot; data-ke-size=&quot;size16&quot;&gt;Pod 가 1개여도 의미가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;753&quot; data-start=&quot;715&quot; data-ke-size=&quot;size16&quot;&gt;Pod 하나가 죽으면 새 Pod를 자동으로 다시 만들어주기 때문 -&amp;gt; 단일 Pod의 자동 복구 목적으로도 사용 가능&lt;/p&gt;
&lt;p data-end=&quot;753&quot; data-start=&quot;715&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;753&quot; data-start=&quot;715&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 차이점&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1352&quot; data-start=&quot;1326&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Replication Controller&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1369&quot; data-start=&quot;1353&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1360&quot; data-start=&quot;1353&quot;&gt;예전 방식&lt;/li&gt;
&lt;li data-end=&quot;1369&quot; data-start=&quot;1361&quot;&gt;오래된 기술&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773450653635&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: ReplicationController
metadata:
  name: myapp-rc
  labels:
    app: myapp
    type: frontend
spec:
  replicas: 3
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
    spec:
      containers:
        - name: nginx
          image: nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;selector를 생략 가능&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;replicas : 몇 개의 Pod를 유지할 것인가?&lt;/li&gt;
&lt;li&gt;template: Replica 가 새 Pod를 만들어야 할 때 사용할 Pod 설계도
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pod 템플릿을 이용해 나중에 Pod가 죽으면 새 Pod를 생성함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1385&quot; data-start=&quot;1371&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ReplicaSet&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1406&quot; data-start=&quot;1386&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1395&quot; data-start=&quot;1386&quot;&gt;더 최신 방식&lt;/li&gt;
&lt;li data-end=&quot;1406&quot; data-start=&quot;1396&quot;&gt;현재 권장 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1446&quot; data-start=&quot;1408&quot; data-ke-size=&quot;size18&quot;&gt;즉, &lt;b&gt;지금은 ReplicaSet을 사용하는 것이 일반적&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773450774873&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-rs
  labels:
    app: myapp
    type: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: nginx
          image: nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;selector 가 필수&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;selector: 어떤 Pod 들을 내가 관리 대상으로 볼 것인가?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3320&quot; data-start=&quot;3296&quot;&gt;&lt;b&gt;label = Pod에 붙인 표식 (옷에 있는 라벨이랑 똑같음)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3357&quot; data-start=&quot;3321&quot;&gt;&lt;b&gt;selector = 그 표식을 보고 대상을 고르는 조건&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3357&quot; data-start=&quot;3321&quot;&gt;&lt;b&gt;Pod에 라벨링을 하고, selector 에서 해당 라벨을 보고 내가 원하는 것만 다시 재생성하는 구조&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;ReplicaSet = apps/v1 + selector 필수&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Deployment&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;실제 운영 환경에서는 애플리케이션을 Pod 1개만 띄워서 끝내는 경우가 거의 없음.&lt;br /&gt;&lt;br /&gt;예를 들어 웹 서버를 운영한다고 하면:&lt;br /&gt;- 인스턴스가 여러 개 있어야 함 &lt;br /&gt;- 새 버전이 나오면 서비스 중단 없이 업데이트하고 싶음 &lt;br /&gt;- 업데이트하다가 문제 생기면 이전 버전으로 되돌리고 싶음 &lt;br /&gt;- 여러 변경 사항을 한 번에 반영하고 싶음 &lt;br /&gt;&lt;br /&gt;-&amp;gt; 이런 운영상의 요구를 해결하는 객체가 Deployment&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;기능&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;445&quot; data-start=&quot;428&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 여러 인스턴스 운영&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;536&quot; data-start=&quot;446&quot; data-ke-size=&quot;size16&quot;&gt;웹 서버를 실제 서비스에 배포할 때는 보통 여러 개의 인스턴스를 실행해야 함.&lt;br /&gt;그래야 부하 분산도 되고, 일부 인스턴스에 문제가 생겨도 서비스가 계속 가능함.&lt;/p&gt;
&lt;p data-end=&quot;559&quot; data-start=&quot;538&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;559&quot; data-start=&quot;538&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Rolling Update&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;636&quot; data-start=&quot;560&quot; data-ke-size=&quot;size16&quot;&gt;새 버전 이미지가 나오면 기존 인스턴스를 새 버전으로 바꿔야 함.&lt;br /&gt;그런데 모든 인스턴스를 한 번에 바꾸면 서비스 영향이 클 수 있음.&lt;/p&gt;
&lt;p data-end=&quot;646&quot; data-start=&quot;638&quot; data-ke-size=&quot;size16&quot;&gt;그래서 보통은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;677&quot; data-start=&quot;648&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;657&quot; data-start=&quot;648&quot;&gt;하나 업데이트&lt;/li&gt;
&lt;li data-end=&quot;665&quot; data-start=&quot;658&quot;&gt;정상 확인&lt;/li&gt;
&lt;li data-end=&quot;677&quot; data-start=&quot;666&quot;&gt;다음 것 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;729&quot; data-start=&quot;679&quot; data-ke-size=&quot;size16&quot;&gt;이런 식으로 &lt;b&gt;순차적으로 교체&lt;/b&gt;함&lt;/p&gt;
&lt;p data-end=&quot;729&quot; data-start=&quot;679&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;746&quot; data-start=&quot;731&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) Rollback&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;805&quot; data-start=&quot;747&quot; data-ke-size=&quot;size16&quot;&gt;업데이트 후 문제가 생길 수 있음.&lt;br /&gt;이 경우 최근 변경을 취소하고 이전 상태로 되돌릴 수 있어야 함.&lt;/p&gt;
&lt;p data-end=&quot;850&quot; data-start=&quot;829&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;850&quot; data-start=&quot;829&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) Pause / Resume&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;882&quot; data-start=&quot;851&quot; data-ke-size=&quot;size16&quot;&gt;운영 중에는 한 번에 여러 가지를 바꾸고 싶을 수 있음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;925&quot; data-start=&quot;888&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;899&quot; data-start=&quot;888&quot;&gt;이미지 버전 변경&lt;/li&gt;
&lt;li data-end=&quot;913&quot; data-start=&quot;900&quot;&gt;replicas 변경&lt;/li&gt;
&lt;li data-end=&quot;925&quot; data-start=&quot;914&quot;&gt;리소스 설정 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;945&quot; data-start=&quot;927&quot; data-ke-size=&quot;size16&quot;&gt;이걸 하나씩 즉시 반영하는 대신,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;992&quot; data-start=&quot;947&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;959&quot; data-start=&quot;947&quot;&gt;잠시 배포를 멈추고&lt;/li&gt;
&lt;li data-end=&quot;980&quot; data-start=&quot;960&quot;&gt;필요한 변경을 모아서 적용한 다음&lt;/li&gt;
&lt;li data-end=&quot;992&quot; data-start=&quot;981&quot;&gt;다시 배포를 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1005&quot; data-start=&quot;994&quot; data-ke-size=&quot;size16&quot;&gt;하는 방식이 필요함.&lt;/p&gt;
&lt;p data-end=&quot;1005&quot; data-start=&quot;994&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1005&quot; data-start=&quot;994&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Pod, ReplicaSet, Deployment 관계&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 74px;&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;width: 33.3333%; height: 17px;&quot;&gt;Pod&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;ReplicaSet&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;Deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 57px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 57px;&quot;&gt;애플리케이션 하나의 실행 단위&lt;br /&gt;컨테이너는 Pod 안에서 실행&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 57px;&quot;&gt;같은 Pod 를 여러 개 유지하는 역할을 함&lt;br /&gt;원하는 개수의 Pod 가 계속 유지하도록 관리&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 57px;&quot;&gt;ReplicaSet 보다 한 단계 위에 있는 상위 객체&lt;br /&gt;ReplciaSet을 관리하면서 운영에 필요한 기능까지 제공함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1773506200303&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;                Deployment
                    │
                    │ (관리 / 업데이트 전략)
                    ▼
               ReplicaSet
                    │
                    │ (Pod 개수 유지)
                    ▼
        ┌───────┬───────┬───────┬───────┐
        │  Pod  │  Pod  │  Pod  │  Pod  │
        └───────┴───────┴───────┴───────┘&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Deployment &amp;rarr; ReplicaSet &amp;rarr; Pod&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Deployment 가 하는 일&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1519&quot; data-start=&quot;1427&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1443&quot; data-start=&quot;1427&quot;&gt;여러 Pod를 유지하게 함&lt;/li&gt;
&lt;li data-end=&quot;1468&quot; data-start=&quot;1444&quot;&gt;새 버전으로 무중단 업데이트 가능하게 함&lt;/li&gt;
&lt;li data-end=&quot;1487&quot; data-start=&quot;1469&quot;&gt;문제 생기면 롤백 가능하게 함&lt;/li&gt;
&lt;li data-end=&quot;1519&quot; data-start=&quot;1488&quot;&gt;변경을 pause/resume 하며 제어 가능하게 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1604&quot; data-start=&quot;1521&quot; data-ke-size=&quot;size16&quot;&gt;즉 ReplicaSet이 &amp;ldquo;Pod 개수 유지&amp;rdquo;에 초점이 있다면,&lt;br /&gt;Deployment는 그 위에서 &lt;b&gt;배포 전략까지 관리하는 객체&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1604&quot; data-start=&quot;1521&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1604&quot; data-start=&quot;1521&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Deployment Yaml&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1773506053841&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: nginx
          image: nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ReplicaSet YAML과 거의 같고,&lt;br /&gt;kind만 Deployment로 바꾸면 됨.&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;Deployment 생성 후&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Deployment가 ReplicaSet을 만들고, ReplicaSet이 Pod를 만드는 구조&lt;/blockquote&gt;
&lt;p data-end=&quot;2872&quot; data-start=&quot;2852&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2872&quot; data-start=&quot;2852&quot;&gt;Deployment 생성&lt;/li&gt;
&lt;li data-end=&quot;2913&quot; data-start=&quot;2890&quot;&gt;ReplicaSet 자동 생성
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2913&quot; data-start=&quot;2890&quot;&gt;Deployment가 ReplicaSet을 자동으로 만듦.&lt;/li&gt;
&lt;li data-end=&quot;2913&quot; data-start=&quot;2890&quot;&gt;확인 명령: kubectl &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; rs&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2997&quot; data-start=&quot;2984&quot;&gt;Pod 생성
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2997&quot; data-start=&quot;2984&quot;&gt;ReplicaSet이 실제 Pod들을 생성함.&lt;/li&gt;
&lt;li data-end=&quot;2997&quot; data-start=&quot;2984&quot;&gt;확인 명령: kubectl &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; pods&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하나의 Deployment를 만들었더니&lt;br /&gt;그 아래에 ReplicaSet이 생기고, 그 아래에 Pod들이 생긴다.&lt;br /&gt;Deployment는 ReplcaSet보다 상위객체이므로&amp;nbsp;&lt;br /&gt;ReplicaSet을 직접 쓰기보다는 운영에서는 Deployment을 더 많이 사용함&lt;/span&gt;&lt;/blockquote&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;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;!! 실습 명령어 정리&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;691&quot; data-start=&quot;677&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;NGINX Pod 생성&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773507216340&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl run nginx --image=nginx&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;778&quot; data-start=&quot;743&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;778&quot; data-start=&quot;743&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Pod YAML Manifest 생성 (실제 생성하지 않음)&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773507225544&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl run nginx --image=nginx --dry-run=client -o yaml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;855&quot; data-start=&quot;850&quot; data-ke-size=&quot;size18&quot;&gt;옵션 설명&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;923&quot; data-start=&quot;857&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;883&quot; data-start=&quot;857&quot;&gt;-o yaml &amp;rarr; YAML 형식으로 출력&lt;/li&gt;
&lt;li data-end=&quot;923&quot; data-start=&quot;884&quot;&gt;--dry-run=client &amp;rarr; 실제로 리소스를 생성하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;945&quot; data-start=&quot;930&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;945&quot; data-start=&quot;930&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Deployment 생성&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773507237078&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl create deployment --image=nginx nginx&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1047&quot; data-start=&quot;1011&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1047&quot; data-start=&quot;1011&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Deployment YAML 파일 생성 (실제 생성하지 않음)&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773507247888&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl create deployment --image=nginx nginx --dry-run=client -o yaml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1167&quot; data-start=&quot;1138&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1167&quot; data-start=&quot;1138&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Deployment YAML 생성 후 파일로 저장&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773507264104&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl create deployment --image=nginx nginx --dry-run=client -o yaml &amp;gt; nginx-deployment.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1310&quot; data-start=&quot;1282&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1310&quot; data-start=&quot;1282&quot; data-ke-size=&quot;size18&quot;&gt;YAML 파일 수정 후 Deployment 생성&lt;/p&gt;
&lt;p data-end=&quot;1343&quot; data-start=&quot;1312&quot; data-ke-size=&quot;size18&quot;&gt;예를 들어 &lt;b&gt;replicas 수를 추가로 수정한 뒤&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773507281617&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl create -f nginx-deployment.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1440&quot; data-start=&quot;1403&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1440&quot; data-start=&quot;1403&quot; data-ke-size=&quot;size18&quot;&gt;Kubernetes 1.19 이상에서 replicas 옵션 사용&lt;/p&gt;
&lt;p data-end=&quot;1497&quot; data-start=&quot;1442&quot; data-ke-size=&quot;size18&quot;&gt;Kubernetes &lt;b&gt;1.19 이상&lt;/b&gt;에서는 --replicas 옵션을 직접 사용할 수 있음.&lt;/p&gt;
&lt;p data-end=&quot;1536&quot; data-start=&quot;1499&quot; data-ke-size=&quot;size18&quot;&gt;예: replicas 4개 Deployment 생성 YAML 만들기&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773507289411&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl create deployment --image=nginx nginx --replicas=4 --dry-run=client -o yaml &amp;gt; nginx-deployment.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Infra/K8S</category>
      <author>minsu20</author>
      <guid isPermaLink="true">https://minsu20.tistory.com/94</guid>
      <comments>https://minsu20.tistory.com/94#entry94comment</comments>
      <pubDate>Sun, 15 Mar 2026 01:41:56 +0900</pubDate>
    </item>
    <item>
      <title>[CKA 준비] Core Conecepts - 1</title>
      <link>https://minsu20.tistory.com/93</link>
      <description>&lt;h2 data-end=&quot;175&quot; data-start=&quot;160&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Cluster Architecture&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;175&quot; data-start=&quot;160&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;아키텍처 구조 개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;212&quot; data-start=&quot;177&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes 클러스터는 크게 두 종류의 노드로 구성된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;265&quot; data-start=&quot;214&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;247&quot; data-start=&quot;214&quot;&gt;&lt;b&gt;Master Node (Control Plane)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;265&quot; data-start=&quot;248&quot;&gt;&lt;b&gt;Worker Node&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Master Node&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. etcd&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;495&quot; data-start=&quot;475&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;etcd와 통신하는 유일한 Kubernetes 컴포넌트는 kube-apiserver이다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;495&quot; data-start=&quot;475&quot;&gt;고가용성 Key-Value 저장소&lt;/li&gt;
&lt;li data-end=&quot;559&quot; data-start=&quot;496&quot;&gt;클러스터의 모든 상태 정보 저장
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;559&quot; data-start=&quot;518&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;525&quot; data-start=&quot;518&quot;&gt;노드 정보&lt;/li&gt;
&lt;li data-end=&quot;536&quot; data-start=&quot;528&quot;&gt;Pod 정보&lt;/li&gt;
&lt;li data-end=&quot;547&quot; data-start=&quot;539&quot;&gt;설정 데이터&lt;/li&gt;
&lt;li data-end=&quot;559&quot; data-start=&quot;550&quot;&gt;메타데이터 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. kube-apiserver&lt;/b&gt;&lt;/h4&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;외부 사용자, 컨트롤러, kubelet 모두 이 API 서버를 통해 통신&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;클러스터 전체를 오케스트레이션하는 중앙 관리 서버&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772633945247&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Controller-Manager / kube-scheduler / kubelet
                &amp;darr;
         kube-apiserver
                &amp;darr;
              etcd&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. kube-scheduler&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pod를 어떤 Worker Node에 배치할지 결정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;스케줄러는 &amp;ldquo;어디에 배치할지 결정&amp;rdquo;만 하고, 실제 생성은 하지 않는다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. Controller Manager&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-start=&quot;1078&quot; data-end=&quot;1141&quot;&gt;Node Controller
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1102&quot; data-end=&quot;1141&quot;&gt;
&lt;li data-start=&quot;1102&quot; data-end=&quot;1112&quot;&gt;노드 상태 감시&lt;/li&gt;
&lt;li data-start=&quot;1115&quot; data-end=&quot;1125&quot;&gt;노드 장애 처리&lt;/li&gt;
&lt;li data-start=&quot;1128&quot; data-end=&quot;1141&quot;&gt;신규 노드 등록 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-start=&quot;1143&quot; data-end=&quot;1200&quot;&gt;Replication Controller
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1174&quot; data-end=&quot;1200&quot;&gt;
&lt;li data-start=&quot;1174&quot; data-end=&quot;1200&quot;&gt;원하는 개수의 Pod가 항상 유지되도록 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Woker Node&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Container Runtime&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너를 실행하기 위한 엔진.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1406&quot; data-start=&quot;1375&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1383&quot; data-start=&quot;1375&quot;&gt;Docker&lt;/li&gt;
&lt;li data-end=&quot;1396&quot; data-start=&quot;1384&quot;&gt;containerd&lt;/li&gt;
&lt;li data-end=&quot;1406&quot; data-start=&quot;1397&quot;&gt;CRI-O 등&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;2. kubelet&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1472&quot; data-start=&quot;1454&quot;&gt;각 노드에서 실행되는 에이전트&lt;/li&gt;
&lt;li data-end=&quot;1498&quot; data-start=&quot;1473&quot;&gt;kube-apiserver로부터 명령 수신&lt;/li&gt;
&lt;li data-end=&quot;1513&quot; data-start=&quot;1499&quot;&gt;Pod 생성/삭제 수행&lt;/li&gt;
&lt;li data-end=&quot;1539&quot; data-start=&quot;1514&quot;&gt;노드 및 Pod 상태를 API 서버에 보고&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;3. kube-proxy&lt;/b&gt;&lt;/h4&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 data-end=&quot;1665&quot; data-start=&quot;1645&quot;&gt;클러스터 내부 통신을 가능하게 함&lt;/li&gt;
&lt;/ul&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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Docker vs ContainerD&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;65&quot; data-start=&quot;28&quot;&gt;초기 Kubernetes는 &lt;b&gt;Docker 전용&lt;/b&gt;이었다.&lt;/li&gt;
&lt;li data-end=&quot;128&quot; data-start=&quot;66&quot;&gt;다양한 런타임을 지원하기 위해 &lt;b&gt;CRI(Container Runtime Interface)&lt;/b&gt; 도입.&lt;/li&gt;
&lt;li data-end=&quot;177&quot; data-start=&quot;129&quot;&gt;Docker는 CRI를 직접 지원하지 않아 &lt;b&gt;Dockershim&lt;/b&gt;을 사용.&lt;/li&gt;
&lt;li data-end=&quot;238&quot; data-start=&quot;178&quot;&gt;Kubernetes 1.24에서 &lt;b&gt;Dockershim 제거 &amp;rarr; Docker 런타임 지원 종료&lt;/b&gt;. (단, 이미지는 사용 가능 ! OCI 표준 준수하므로)&lt;/li&gt;
&lt;li data-end=&quot;268&quot; data-start=&quot;239&quot;&gt;현재 표준 런타임은 &lt;b&gt;containerd&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;300&quot; data-start=&quot;275&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;300&quot; data-start=&quot;275&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Docker vs containerD&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;300&quot; data-start=&quot;275&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Docker는 여러 구성요소로 이루어져 있다:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1497&quot; data-start=&quot;1409&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1421&quot; data-start=&quot;1409&quot;&gt;Docker CLI&lt;/li&gt;
&lt;li data-end=&quot;1434&quot; data-start=&quot;1422&quot;&gt;Docker API&lt;/li&gt;
&lt;li data-end=&quot;1454&quot; data-start=&quot;1435&quot;&gt;Image Build Tools&lt;/li&gt;
&lt;li data-end=&quot;1466&quot; data-start=&quot;1455&quot;&gt;Volume 관리&lt;/li&gt;
&lt;li data-end=&quot;1477&quot; data-start=&quot;1467&quot;&gt;Security&lt;/li&gt;
&lt;li data-end=&quot;1490&quot; data-start=&quot;1478&quot;&gt;containerd&lt;/li&gt;
&lt;li data-end=&quot;1497&quot; data-start=&quot;1491&quot;&gt;runc&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1503&quot; data-start=&quot;1499&quot; data-ke-size=&quot;size16&quot;&gt;여기서 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;containerd는 실제 컨테이너 실행을 담당하는 런타임이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1556&quot; data-start=&quot;1541&quot; data-ke-size=&quot;size16&quot;&gt;현재 containerd는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1603&quot; data-start=&quot;1558&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1567&quot; data-start=&quot;1558&quot;&gt;독립 프로젝트&lt;/li&gt;
&lt;li data-end=&quot;1603&quot; data-start=&quot;1583&quot;&gt;Docker 없이 단독 설치 가능&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CLI 도구&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;41&quot; data-start=&quot;32&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. ctr - containerd CLI&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-end=&quot;103&quot; data-start=&quot;43&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;103&quot; data-start=&quot;45&quot; data-ke-size=&quot;size16&quot;&gt;containerd 기본 디버깅 CLI&lt;br /&gt;기능 제한적 / Docker와 문법 다름 / 실사용 비권장&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;340&quot; data-start=&quot;118&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;340&quot; data-start=&quot;146&quot;&gt;
&lt;tr data-end=&quot;209&quot; data-start=&quot;146&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;157&quot; data-start=&quot;146&quot;&gt;이미지 pull&lt;/td&gt;
&lt;td data-end=&quot;209&quot; data-start=&quot;157&quot; data-col-size=&quot;md&quot;&gt;ctr images pull docker.io/library/nginx:latest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;238&quot; data-start=&quot;210&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;219&quot; data-start=&quot;210&quot;&gt;이미지 목록&lt;/td&gt;
&lt;td data-end=&quot;238&quot; data-start=&quot;219&quot; data-col-size=&quot;md&quot;&gt;ctr images ls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;273&quot; data-start=&quot;239&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;249&quot; data-start=&quot;239&quot;&gt;컨테이너 실행&lt;/td&gt;
&lt;td data-end=&quot;273&quot; data-start=&quot;249&quot; data-col-size=&quot;md&quot;&gt;ctr run IMAGE NAME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;301&quot; data-start=&quot;274&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;283&quot; data-start=&quot;274&quot;&gt;태스크 목록&lt;/td&gt;
&lt;td data-end=&quot;301&quot; data-start=&quot;283&quot; data-col-size=&quot;md&quot;&gt;ctr tasks ls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;340&quot; data-start=&quot;302&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;312&quot; data-start=&quot;302&quot;&gt;컨테이너 삭제&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;340&quot; data-start=&quot;312&quot;&gt;ctr containers rm NAME&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;501&quot; data-start=&quot;488&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;501&quot; data-start=&quot;488&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. nerdctl - containerd CLI&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-end=&quot;561&quot; data-start=&quot;503&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;561&quot; data-start=&quot;505&quot; data-ke-size=&quot;size16&quot;&gt;Docker 대체 CLI (containerd용)&lt;br /&gt;일반 사용 가능 / Docker와 거의 동일&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;923&quot; data-start=&quot;592&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;923&quot; data-start=&quot;635&quot;&gt;
&lt;tr data-end=&quot;663&quot; data-start=&quot;635&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;648&quot; data-start=&quot;635&quot;&gt;docker run&lt;/td&gt;
&lt;td data-end=&quot;663&quot; data-start=&quot;648&quot; data-col-size=&quot;sm&quot;&gt;nerdctl run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;690&quot; data-start=&quot;664&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;676&quot; data-start=&quot;664&quot;&gt;docker ps&lt;/td&gt;
&lt;td data-end=&quot;690&quot; data-start=&quot;676&quot; data-col-size=&quot;sm&quot;&gt;nerdctl ps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;721&quot; data-start=&quot;691&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;705&quot; data-start=&quot;691&quot;&gt;docker logs&lt;/td&gt;
&lt;td data-end=&quot;721&quot; data-start=&quot;705&quot; data-col-size=&quot;sm&quot;&gt;nerdctl logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;752&quot; data-start=&quot;722&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;736&quot; data-start=&quot;722&quot;&gt;docker exec&lt;/td&gt;
&lt;td data-end=&quot;752&quot; data-start=&quot;736&quot; data-col-size=&quot;sm&quot;&gt;nerdctl exec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;785&quot; data-start=&quot;753&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;768&quot; data-start=&quot;753&quot;&gt;docker build&lt;/td&gt;
&lt;td data-end=&quot;785&quot; data-start=&quot;768&quot; data-col-size=&quot;sm&quot;&gt;nerdctl build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;816&quot; data-start=&quot;786&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;800&quot; data-start=&quot;786&quot;&gt;docker pull&lt;/td&gt;
&lt;td data-end=&quot;816&quot; data-start=&quot;800&quot; data-col-size=&quot;sm&quot;&gt;nerdctl pull&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;851&quot; data-start=&quot;817&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;833&quot; data-start=&quot;817&quot;&gt;docker images&lt;/td&gt;
&lt;td data-end=&quot;851&quot; data-start=&quot;833&quot; data-col-size=&quot;sm&quot;&gt;nerdctl images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;888&quot; data-start=&quot;852&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;869&quot; data-start=&quot;852&quot;&gt;docker network&lt;/td&gt;
&lt;td data-end=&quot;888&quot; data-start=&quot;869&quot; data-col-size=&quot;sm&quot;&gt;nerdctl network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;923&quot; data-start=&quot;889&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;905&quot; data-start=&quot;889&quot;&gt;docker volume&lt;/td&gt;
&lt;td data-end=&quot;923&quot; data-start=&quot;905&quot; data-col-size=&quot;sm&quot;&gt;nerdctl volume&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;951&quot; data-start=&quot;925&quot; data-ke-size=&quot;size16&quot;&gt;추가 기능 (Docker보다 앞선 기능)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1029&quot; data-start=&quot;953&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;964&quot; data-start=&quot;953&quot;&gt;Lazy Pull&lt;/li&gt;
&lt;li data-end=&quot;974&quot; data-start=&quot;965&quot;&gt;이미지 암호화&lt;/li&gt;
&lt;li data-end=&quot;987&quot; data-start=&quot;975&quot;&gt;P2P 이미지 배포&lt;/li&gt;
&lt;li data-end=&quot;1003&quot; data-start=&quot;988&quot;&gt;image signing&lt;/li&gt;
&lt;li data-end=&quot;1029&quot; data-start=&quot;1004&quot;&gt;containerd namespace 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;1110&quot; data-start=&quot;1087&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;1110&quot; data-start=&quot;1089&quot; data-ke-size=&quot;size16&quot;&gt;목적: Docker 대체 실사용 CLI&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1129&quot; data-start=&quot;1117&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1129&quot; data-start=&quot;1117&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. crictl - &lt;/b&gt;Kubernetes 커뮤니티에서 제공.&lt;/h4&gt;
&lt;blockquote data-end=&quot;1199&quot; data-start=&quot;1131&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;1199&quot; data-start=&quot;1133&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes 관점 디버깅 도구&lt;br /&gt;&lt;b&gt;CRI 인터페이스 기반&lt;/b&gt;&lt;br /&gt;kubelet이 사용하는 런타임을 직접 조회&lt;/p&gt;
&lt;p data-end=&quot;2081&quot; data-start=&quot;2062&quot; data-ke-size=&quot;size16&quot;&gt;containerd 전용이 아니라:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2103&quot; data-start=&quot;2083&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2090&quot; data-start=&quot;2083&quot;&gt;CRI-O&lt;/li&gt;
&lt;li data-end=&quot;2103&quot; data-start=&quot;2091&quot;&gt;기타 CRI 런타임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2111&quot; data-start=&quot;2105&quot; data-ke-size=&quot;size16&quot;&gt;모두 지원.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1482&quot; data-start=&quot;1214&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1482&quot; data-start=&quot;1242&quot;&gt;
&lt;tr data-end=&quot;1270&quot; data-start=&quot;1242&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1251&quot; data-start=&quot;1242&quot;&gt;이미지 목록&lt;/td&gt;
&lt;td data-end=&quot;1270&quot; data-start=&quot;1251&quot; data-col-size=&quot;sm&quot;&gt;crictl images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1296&quot; data-start=&quot;1271&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1281&quot; data-start=&quot;1271&quot;&gt;컨테이너 목록&lt;/td&gt;
&lt;td data-end=&quot;1296&quot; data-start=&quot;1281&quot; data-col-size=&quot;sm&quot;&gt;crictl ps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1323&quot; data-start=&quot;1297&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1306&quot; data-start=&quot;1297&quot;&gt;Pod 목록&lt;/td&gt;
&lt;td data-end=&quot;1323&quot; data-start=&quot;1306&quot; data-col-size=&quot;sm&quot;&gt;crictl pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1362&quot; data-start=&quot;1324&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1332&quot; data-start=&quot;1324&quot;&gt;로그 확인&lt;/td&gt;
&lt;td data-end=&quot;1362&quot; data-start=&quot;1332&quot; data-col-size=&quot;sm&quot;&gt;crictl logs CONTAINER_ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1407&quot; data-start=&quot;1363&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1370&quot; data-start=&quot;1363&quot;&gt;exec&lt;/td&gt;
&lt;td data-end=&quot;1407&quot; data-start=&quot;1370&quot; data-col-size=&quot;sm&quot;&gt;crictl exec -it CONTAINER_ID sh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1451&quot; data-start=&quot;1408&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1418&quot; data-start=&quot;1408&quot;&gt;inspect&lt;/td&gt;
&lt;td data-end=&quot;1451&quot; data-start=&quot;1418&quot; data-col-size=&quot;sm&quot;&gt;crictl inspect CONTAINER_ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1482&quot; data-start=&quot;1452&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1459&quot; data-start=&quot;1452&quot;&gt;pull&lt;/td&gt;
&lt;td data-end=&quot;1482&quot; data-start=&quot;1459&quot; data-col-size=&quot;sm&quot;&gt;crictl pull IMAGE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 생성은 가능하지만 권장하지 않음 : kubelet은 자신이 모르는 컨테이너를 삭제하기 때문&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 data-end=&quot;1653&quot; data-start=&quot;1627&quot;&gt;ctr &amp;rarr; containerd 내부 디버깅용&lt;/li&gt;
&lt;li data-end=&quot;1679&quot; data-start=&quot;1654&quot;&gt;nerdctl &amp;rarr; Docker 대체 CLI&lt;/li&gt;
&lt;li data-end=&quot;1709&quot; data-start=&quot;1680&quot;&gt;crictl &amp;rarr; Kubernetes 노드 디버깅용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker는 deprecated된 것이 아니라 Kubernetes에서 런타임으로서의 Docker 지원이 제거된 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt;&amp;nbsp;containerd가 Kubernetes의 기본 런타임 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;52&quot; data-start=&quot;20&quot; data-ke-size=&quot;size18&quot;&gt;Docker 런타임 지원 중단?&lt;/p&gt;
&lt;blockquote data-end=&quot;63&quot; data-start=&quot;54&quot; data-ke-style=&quot;style2&quot;&gt;Kubernetes가 Docker Engine을 컨테이너 런타임으로 직접 사용하지 않는다는 뜻이다.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;201&quot; data-start=&quot;132&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;172&quot; data-start=&quot;132&quot;&gt;kubelet이 Docker daemon과 더 이상 통신하지 않는다.&lt;/li&gt;
&lt;li data-end=&quot;201&quot; data-start=&quot;173&quot;&gt;Dockershim이 제거되었다. (v1.24)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;234&quot; data-start=&quot;228&quot; data-ke-style=&quot;style3&quot;&gt;과거 구조: kubelet &amp;rarr; Dockershim &amp;rarr; Docker Engine &amp;rarr; containerd &amp;rarr; runc&lt;br /&gt;현재 구조: kubelet &amp;rarr;&amp;nbsp;CRI&amp;nbsp;&amp;rarr; containerd &amp;rarr; runc&lt;/blockquote&gt;
&lt;p data-end=&quot;312&quot; data-start=&quot;306&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;367&quot; data-start=&quot;361&quot; data-ke-size=&quot;size16&quot;&gt;변경된 점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;442&quot; data-start=&quot;369&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;384&quot; data-start=&quot;369&quot;&gt;Dockershim 제거&lt;/li&gt;
&lt;li data-end=&quot;406&quot; data-start=&quot;385&quot;&gt;Docker Engine 경로 제거&lt;/li&gt;
&lt;li data-end=&quot;442&quot; data-start=&quot;407&quot;&gt;kubelet이 Docker API를 더 이상 호출하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;ETCD&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;etcd는 Kubernetes 클러스터 상태를 저장하는 &lt;b&gt;분산형과 강한 일관성을 가진 Key-Value 데이터 저장소&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 특징을 가지고 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;특징 &amp;amp; 기본 개념&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Distributed&lt;/b&gt;&lt;/h4&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;li&gt;클러스터 형태로 구성 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Strongly Consistent&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 번 write 가 성공하면 그 이후의 모든 read 는 항상 최신 값을 본다&lt;/li&gt;
&lt;li&gt;Raft 기반이기 때문에 가능함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;-&amp;gt;&amp;nbsp; Eventually Consistency&lt;/b&gt;: 시간이 지나면 결국 동일해지지만, 그 전까지는 다른 값을 볼 수도 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;-&amp;gt; stale raed&lt;/b&gt;: 이미 업데이트된 데이터가 있는데, 이전 값을 읽는 것&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Raft 기반&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분산 노드들이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;항상 동일한 상태&lt;/b&gt;&lt;/span&gt;를 유지하기 위해 만든 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;과반수 합의&lt;/b&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;Raft 클러스터는 보통 &lt;b&gt;3개 또는 5개 노드&lt;/b&gt;로 구성된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1772956952268&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        Client
          │
          ▼
      Leader (etcd)
       /      \
      /        \
Follower A     Follower B&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;441&quot; data-start=&quot;334&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;441&quot; data-start=&quot;356&quot;&gt;
&lt;tr data-end=&quot;383&quot; data-start=&quot;356&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;365&quot; data-start=&quot;356&quot;&gt;Leader&lt;/td&gt;
&lt;td data-end=&quot;383&quot; data-start=&quot;365&quot; data-col-size=&quot;sm&quot;&gt;모든 write 요청 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;413&quot; data-start=&quot;384&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;395&quot; data-start=&quot;384&quot;&gt;Follower&lt;/td&gt;
&lt;td data-end=&quot;413&quot; data-start=&quot;395&quot; data-col-size=&quot;sm&quot;&gt;Leader 데이터를 복제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;441&quot; data-start=&quot;414&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;423&quot; data-start=&quot;414&quot;&gt;Client&lt;/td&gt;
&lt;td data-end=&quot;441&quot; data-start=&quot;423&quot; data-col-size=&quot;sm&quot;&gt;kube-apiserver&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;480&quot; data-start=&quot;452&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;480&quot; data-start=&quot;454&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Write는 항상 Leader만 처리한다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&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;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, Kubernetes가 Pod 생성을 한다고 가정해보자&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;1. Leader가 요청을 받는다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1772957083599&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; Client (kube-apiserver)
        │
        ▼
      Leader&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;620&quot; data-start=&quot;604&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;2. Leader &amp;rarr; Followers 로그 전파&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1772957104779&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;       Leader
       /    \
      /      \
Follower A    Follower B
   log         log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;3. 과반수 확인&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;849&quot; data-start=&quot;841&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3개 노드라면 2개 이상 성공&lt;/b&gt;해야 commit된다.&lt;/p&gt;
&lt;p data-end=&quot;849&quot; data-start=&quot;841&quot; data-ke-size=&quot;size16&quot;&gt;즉, Leader, FollowerA 가 성공하면 commit 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;write 는 데이터를 변경하는 요청이고, &lt;br /&gt;commit 은 write가 과반수 노드에 복제되어 클러스터 공식 상태로 확정되는 것&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;4. Commit 후 응답 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1002&quot; data-start=&quot;970&quot; data-ke-size=&quot;size16&quot;&gt;Leader가 &lt;b&gt;Client에게 성공 응답&lt;/b&gt;을 보내고, 이 시점부터 모든 read는 최신 데이터임&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Q 1. 커밋을 못한 Follower B 로 인해 이전 데이터를 반환해서 정합성이 깨지는 일은 없을까?&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; &lt;b&gt;Strong consistency 환경에서는 follower가 commit되지 않은 상태로 read를 직접 처리하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;commit 이후 내부 동작&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;561&quot; data-start=&quot;531&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;561&quot; data-start=&quot;531&quot; data-ke-size=&quot;size16&quot;&gt;Leader가 commit을 선언하면 다음이 일어난다.&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;561&quot; data-start=&quot;531&quot; data-ke-style=&quot;style2&quot;&gt;Leader &amp;rarr; followers &quot;commit index 업데이트&quot;&lt;/blockquote&gt;
&lt;p data-end=&quot;647&quot; data-start=&quot;611&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;647&quot; data-start=&quot;611&quot; data-ke-size=&quot;size16&quot;&gt;Follower B는 이미 로그가 있으므로 바로 commit되지만, Follower C는 아직 로그가 없다.&lt;/p&gt;
&lt;p data-end=&quot;671&quot; data-start=&quot;649&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;686&quot; data-start=&quot;673&quot; data-ke-size=&quot;size16&quot;&gt;하지만 Raft 규칙상, &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;follower C는 이후 leader로부터 로그를 다시 받아 &lt;/span&gt;&lt;b&gt;catch-up replication&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;을 수행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;686&quot; data-start=&quot;673&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;768&quot; data-start=&quot;758&quot; data-ke-size=&quot;size16&quot;&gt;즉 시간이 지나면 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;b&gt;모든 노드가 동일 상태로 수렴한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;768&quot; data-start=&quot;758&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;style3&quot; /&gt;
&lt;p data-end=&quot;896&quot; data-start=&quot;865&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;그런데 read가 follower C로 가면?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;940&quot; data-start=&quot;911&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;940&quot; data-start=&quot;911&quot; data-ke-size=&quot;size16&quot;&gt;Raft에서는 &lt;b&gt;읽기 전략이 여러 가지&lt;/b&gt;가 있다.&lt;/p&gt;
&lt;p data-end=&quot;975&quot; data-start=&quot;942&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;975&quot; data-start=&quot;942&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;975&quot; data-start=&quot;942&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Leader Read&lt;/b&gt; (기본 / 강한 일관성)&lt;/p&gt;
&lt;p data-end=&quot;1006&quot; data-start=&quot;977&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1006&quot; data-start=&quot;977&quot; data-ke-size=&quot;size16&quot;&gt;모든 read 요청을 &lt;b&gt;Leader가 처리&lt;/b&gt;한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Client&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &amp;rarr; Leader &amp;rarr; response &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1073&quot; data-start=&quot;1044&quot; data-ke-size=&quot;size16&quot;&gt;이 경우 stale read가 절대 발생하지 않는다.&lt;/p&gt;
&lt;p data-end=&quot;1073&quot; data-start=&quot;1044&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1105&quot; data-start=&quot;1080&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1105&quot; data-start=&quot;1080&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Linearizable Read&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1105&quot; data-start=&quot;1080&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1129&quot; data-start=&quot;1107&quot; data-ke-size=&quot;size16&quot;&gt;Follower가 read 요청을 받으면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Follower&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &amp;rarr; &lt;b&gt;Leader 확인&lt;/b&gt; &amp;rarr; 최신 상태 확인 &amp;rarr; 응답&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1201&quot; data-start=&quot;1177&quot; data-ke-size=&quot;size16&quot;&gt;즉 follower가 바로 응답하지 않는다.&lt;/p&gt;
&lt;p data-end=&quot;1201&quot; data-start=&quot;1177&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1224&quot; data-start=&quot;1203&quot; data-ke-size=&quot;size16&quot;&gt;그래서 stale read가 방지된다.&lt;/p&gt;
&lt;p data-end=&quot;1257&quot; data-start=&quot;1231&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1257&quot; data-start=&quot;1231&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1257&quot; data-start=&quot;1231&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. Stale Read&lt;/b&gt; (허용 모드)&lt;/p&gt;
&lt;p data-end=&quot;1273&quot; data-start=&quot;1259&quot; data-ke-size=&quot;size16&quot;&gt;성능을 위해 일부 시스템은&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;Follower가 바로 read &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1336&quot; data-start=&quot;1302&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이 경우 eventual consistency가 된다.&lt;/p&gt;
&lt;p data-end=&quot;1372&quot; data-start=&quot;1338&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1372&quot; data-start=&quot;1338&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 하지만, etcd의 기본 read는 &lt;b&gt;linearizable&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1401&quot; data-start=&quot;1379&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1401&quot; data-start=&quot;1379&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;etcd에서는 어떻게 처리되나?&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772958396926&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;client read 요청
&amp;darr;
leader 확인
&amp;darr;
commit index 확인
&amp;darr;
응답&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1612&quot; data-start=&quot;1580&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;즉 &lt;b&gt;뒤처진 follower가 바로 응답하지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1612&quot; data-start=&quot;1580&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1612&quot; data-start=&quot;1580&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요약하자면&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A: committed&lt;/li&gt;
&lt;li&gt;B: committed&lt;/li&gt;
&lt;li&gt;C: 아직 replication 안됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1719&quot; data-start=&quot;1704&quot; data-ke-size=&quot;size16&quot;&gt;이런 상황에서 read 요청이 C로 가면,&lt;/p&gt;
&lt;p data-end=&quot;1719&quot; data-start=&quot;1704&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;C&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &amp;rarr; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;leader&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;b&gt; 확인&lt;/b&gt;해&amp;nbsp;&lt;/span&gt;leader가 최신 commit index를 알려준다.&lt;/p&gt;
&lt;p data-end=&quot;1796&quot; data-start=&quot;1782&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1796&quot; data-start=&quot;1782&quot; data-ke-size=&quot;size16&quot;&gt;C가 최신 로그가 없다면, &lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;replication &amp;rarr; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;-up &lt;/span&gt;&lt;/b&gt;후에 read 응답.&lt;/p&gt;
&lt;blockquote data-end=&quot;1872&quot; data-start=&quot;1849&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1872&quot; data-start=&quot;1851&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;etcd의 기본 read는&amp;nbsp;&lt;/span&gt;linearizable이므로, leader 에게 확인하는 과정이 있어&lt;br /&gt;C가 옛 데이터를 반환하는 일이 없다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Q 2. 커밋을 못한&amp;nbsp;&lt;/b&gt;&lt;b&gt;follwer B 가 리더가 되면 ?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;leader가 죽으면 follower에서 랜덤 election timeout이 발생하고 가장 먼저 timeout된 노드가 candidate가 된다.&lt;/li&gt;
&lt;li&gt;가장 먼저 candidate가 된 노드는 자기 자신에게 투표를 하고, RequestVote RPC로 다른 노드에게 투표를 요청한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;이때, 투표할 때 follower는 다음을 확인한다. &lt;br /&gt;candidate log &amp;ge; follower log&lt;br /&gt;즉 candidate가 더 오래된 로그면 vote를 거부함&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;과반수 투표를 받으면 leader가 된다.&lt;/li&gt;
&lt;li&gt;이때 로그가 뒤처진 노드는 투표를 받지 못하기 때문에 commit 상태보다 오래된 노드는 leader가 될 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Q 3. &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; font-size: 16px; letter-spacing: 0px;&quot;&gt;etcd가 왜 절대 split brain 이 발생하지 않을까?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;221&quot; data-start=&quot;200&quot; data-ke-size=&quot;size16&quot;&gt;split brain은 두 리더가 동시에 존재해서 ,&lt;/p&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A : replicas = 5&lt;/li&gt;
&lt;li&gt;B : replicas = 3&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-end=&quot;351&quot; data-start=&quot;337&quot; data-ke-size=&quot;size16&quot;&gt;클러스터 상태가 갈라진다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-end=&quot;419&quot; data-start=&quot;386&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;454&quot; data-start=&quot;421&quot; data-ke-size=&quot;size16&quot;&gt;Raft는&lt;b&gt; 두 가지 규칙&lt;/b&gt;으로 split brain을 막는다.&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;494&quot; data-start=&quot;456&quot;&gt;Leader는 quorum 투표로만 선출&lt;/li&gt;
&lt;li data-end=&quot;619&quot; data-start=&quot;592&quot;&gt;Write도 quorum 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;628&quot; data-start=&quot;621&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Network Partition 상황&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;5개의 노드: A B C D E&lt;/li&gt;
&lt;li&gt;과반수 -&amp;gt; 3&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1115&quot; data-start=&quot;1106&quot; data-ke-size=&quot;size16&quot;&gt;partition&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Group1 : A,B&lt;/li&gt;
&lt;li&gt;Group2&amp;nbsp;:&amp;nbsp;C,D,E&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1169&quot; data-start=&quot;1163&quot; data-ke-size=&quot;size16&quot;&gt;Group1&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;1169&quot; data-start=&quot;1163&quot;&gt;nodes = 2 quorum = 3&lt;/li&gt;
&lt;li data-end=&quot;1169&quot; data-start=&quot;1163&quot;&gt;-&amp;gt; leader 불가.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1228&quot; data-start=&quot;1222&quot; data-ke-size=&quot;size16&quot;&gt;Group2&lt;/p&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;nodes = 3 quorum = 3&lt;/li&gt;
&lt;li&gt;-&amp;gt; leader 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C,D,E &amp;rarr; leader&lt;/li&gt;
&lt;li&gt;A,B &amp;rarr; follower&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1332&quot; data-start=&quot;1329&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1355&quot; data-start=&quot;1334&quot; data-ke-size=&quot;size16&quot;&gt;항상 &lt;b&gt;한쪽만 leader 가능&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;1355&quot; data-start=&quot;1334&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1355&quot; data-start=&quot;1334&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 수학적으로 두 개의 leader 는 절대로 불가능하다!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-end=&quot;1712&quot; data-start=&quot;1679&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;그래서 etcd는 split brain을 방지한다&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1722&quot; data-start=&quot;1714&quot; data-ke-size=&quot;size16&quot;&gt;Raft 규칙:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1823&quot; data-start=&quot;1724&quot;&gt;leader election &amp;rarr; quorum 필요&lt;/li&gt;
&lt;li data-end=&quot;1823&quot; data-start=&quot;1724&quot;&gt;commit &amp;rarr; quorum 필요&lt;/li&gt;
&lt;li data-end=&quot;1823&quot; data-start=&quot;1724&quot;&gt;quorum 집합은 항상 교집합 존재&lt;/li&gt;
&lt;li data-end=&quot;1823&quot; data-start=&quot;1724&quot;&gt;로그 최신성 검증&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-end=&quot;1956&quot; data-start=&quot;1912&quot; data-ke-size=&quot;size18&quot;&gt;Raft는 split brain 대신 &lt;b&gt;availability를 포기한다.&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cluster = 3 nodes&lt;/li&gt;
&lt;li&gt;partition = 1 + 1 + 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2025&quot; data-start=&quot;2015&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; quorum 없음.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;write 불가 leader 없기 때문에 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;시스템이 &lt;/span&gt;&lt;b&gt;멈추게 됨&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2083&quot; data-start=&quot;2080&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;하지만, &lt;b&gt;데이터 불일치&lt;/b&gt;&lt;/span&gt;는 발생하지 않는다.&lt;/p&gt;
&lt;hr data-end=&quot;2122&quot; data-start=&quot;2119&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;2146&quot; data-start=&quot;2124&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;CAP 이론과 연결된다&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2176&quot; data-start=&quot;2148&quot; data-ke-size=&quot;size16&quot;&gt;분산 시스템은 세 가지 중 두 개만 선택 가능하다.&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2268&quot; data-start=&quot;2178&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2268&quot; data-start=&quot;2200&quot;&gt;
&lt;tr data-end=&quot;2219&quot; data-start=&quot;2200&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2204&quot; data-start=&quot;2200&quot;&gt;C&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2219&quot; data-start=&quot;2204&quot;&gt;Consistency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2240&quot; data-start=&quot;2220&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2224&quot; data-start=&quot;2220&quot;&gt;A&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2240&quot; data-start=&quot;2224&quot;&gt;Availability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2268&quot; data-start=&quot;2241&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2245&quot; data-start=&quot;2241&quot;&gt;P&lt;/td&gt;
&lt;td data-end=&quot;2268&quot; data-start=&quot;2245&quot; data-col-size=&quot;sm&quot;&gt;Partition tolerance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2278&quot; data-start=&quot;2270&quot; data-ke-size=&quot;size16&quot;&gt;etcd 는&amp;nbsp;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;CP 시스템&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2301&quot; data-start=&quot;2300&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2301&quot; data-start=&quot;2300&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Consistency + Partition tolerance&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2352&quot; data-start=&quot;2350&quot; data-ke-size=&quot;size16&quot;&gt;대신에 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Availability 일부 포기&lt;/span&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Cluster State Store&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;etcd는 Kubernetes 클러스터의 모든 상태를 저장하는 저장소이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;820&quot; data-start=&quot;814&quot; data-ke-size=&quot;size16&quot;&gt;저장 대상:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;898&quot; data-start=&quot;822&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;829&quot; data-start=&quot;822&quot;&gt;Nodes&lt;/li&gt;
&lt;li data-end=&quot;836&quot; data-start=&quot;830&quot;&gt;Pods&lt;/li&gt;
&lt;li data-end=&quot;850&quot; data-start=&quot;837&quot;&gt;Deployments&lt;/li&gt;
&lt;li data-end=&quot;863&quot; data-start=&quot;851&quot;&gt;ConfigMaps&lt;/li&gt;
&lt;li data-end=&quot;873&quot; data-start=&quot;864&quot;&gt;Secrets&lt;/li&gt;
&lt;li data-end=&quot;880&quot; data-start=&quot;874&quot;&gt;RBAC&lt;/li&gt;
&lt;li data-end=&quot;891&quot; data-start=&quot;881&quot;&gt;Services&lt;/li&gt;
&lt;li data-end=&quot;898&quot; data-start=&quot;892&quot;&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;940&quot; data-start=&quot;900&quot; data-ke-size=&quot;size16&quot;&gt;kubectl get으로 보는 모든 정보는 etcd에 저장되어 있다.&lt;/p&gt;
&lt;p data-end=&quot;940&quot; data-start=&quot;900&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;940&quot; data-start=&quot;900&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Q. Kubernetes는 모든 상태를 etcd에 저장할까?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;940&quot; data-start=&quot;900&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes는 &lt;b&gt;클러스터 상태 기반(control loop) 시스템&lt;/b&gt;으로 설계되어 있다.&lt;/p&gt;
&lt;p data-end=&quot;98&quot; data-start=&quot;96&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;모든 컴포넌트가 동일한 상태&lt;/span&gt;를 기준으로 동작해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;182&quot; data-start=&quot;138&quot; data-ke-size=&quot;size16&quot;&gt;그래서 &lt;b&gt;하나의 신뢰 가능한 상태 저장소&lt;/b&gt;가 필요하고, 그것이 etcd이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;etcd 배포 방식&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클러스터를 어떻게 구성하느냐에 따라 &lt;b&gt;etcd의 배포 방식도 달라진다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;h4 data-end=&quot;226&quot; data-start=&quot;205&quot; data-section-id=&quot;dpuahx&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. From scratch 방식&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;253&quot; data-start=&quot;228&quot; data-ke-size=&quot;size16&quot;&gt;직접 Kubernetes를 설치하는 방식이다.&lt;/p&gt;
&lt;p data-end=&quot;267&quot; data-start=&quot;255&quot; data-ke-size=&quot;size16&quot;&gt;직접 해야 하는 작업:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;336&quot; data-start=&quot;269&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;286&quot; data-start=&quot;269&quot; data-section-id=&quot;m0fvo8&quot;&gt;etcd 바이너리 다운로드&lt;/li&gt;
&lt;li data-end=&quot;297&quot; data-start=&quot;287&quot; data-section-id=&quot;100hhyr&quot;&gt;etcd 설치&lt;/li&gt;
&lt;li data-end=&quot;319&quot; data-start=&quot;298&quot; data-section-id=&quot;14ql7yc&quot;&gt;systemd service 작성&lt;/li&gt;
&lt;li data-end=&quot;336&quot; data-start=&quot;320&quot; data-section-id=&quot;ir9eyg&quot;&gt;etcd 실행 옵션 설정&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1772961800246&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;etcd \
--advertise-client-urls=http://10.0.0.5:2379 \
--listen-client-urls=http://0.0.0.0:2379 \
--initial-cluster=...&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;505&quot; data-start=&quot;480&quot; data-ke-size=&quot;size16&quot;&gt;즉 이런 옵션들을 &lt;b&gt;직접 설정해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;520&quot; data-start=&quot;507&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로 설정하는 것&lt;/p&gt;
&lt;div&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-end=&quot;709&quot; data-start=&quot;522&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;709&quot; data-start=&quot;544&quot;&gt;
&lt;tr data-end=&quot;594&quot; data-start=&quot;544&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;572&quot; data-start=&quot;544&quot;&gt;--advertise-client-urls&lt;/td&gt;
&lt;td data-end=&quot;594&quot; data-start=&quot;572&quot; data-col-size=&quot;sm&quot;&gt;API server가 접근할 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;645&quot; data-start=&quot;595&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;620&quot; data-start=&quot;595&quot;&gt;--listen-client-urls&lt;/td&gt;
&lt;td data-end=&quot;645&quot; data-start=&quot;620&quot; data-col-size=&quot;sm&quot;&gt;etcd가 실제 listen 하는 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;687&quot; data-start=&quot;646&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;668&quot; data-start=&quot;646&quot;&gt;--initial-cluster&lt;/td&gt;
&lt;td data-end=&quot;687&quot; data-start=&quot;668&quot; data-col-size=&quot;sm&quot;&gt;HA etcd 클러스터 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;709&quot; data-start=&quot;688&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;702&quot; data-start=&quot;688&quot;&gt;TLS options&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;709&quot; data-start=&quot;702&quot;&gt;인증서&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-end=&quot;732&quot; data-start=&quot;716&quot; data-section-id=&quot;72n3ml&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. kubeadm 방식&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;772&quot; data-start=&quot;734&quot; data-ke-size=&quot;size16&quot;&gt;kubeadm은 &lt;b&gt;control plane 구성 자동화 도구&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-end=&quot;788&quot; data-start=&quot;774&quot; data-ke-size=&quot;size16&quot;&gt;kubeadm이 하는 일:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;850&quot; data-start=&quot;790&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;799&quot; data-start=&quot;790&quot; data-section-id=&quot;1ackl42&quot;&gt;etcd 설치&lt;/li&gt;
&lt;li data-end=&quot;809&quot; data-start=&quot;800&quot; data-section-id=&quot;1acklgv&quot;&gt;etcd 설정&lt;/li&gt;
&lt;li data-end=&quot;822&quot; data-start=&quot;810&quot; data-section-id=&quot;1vp97zq&quot;&gt;TLS 인증서 생성&lt;/li&gt;
&lt;li data-end=&quot;840&quot; data-start=&quot;823&quot; data-section-id=&quot;156rr0p&quot;&gt;etcd cluster 구성&lt;/li&gt;
&lt;li data-end=&quot;850&quot; data-start=&quot;841&quot; data-section-id=&quot;1ackhgz&quot;&gt;etcd 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 직접 설정 X, &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;kubeadm이 자동 생성&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;920&quot; data-start=&quot;901&quot; data-section-id=&quot;1saqskq&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. etcd 실행 방식 차이&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;937&quot; data-start=&quot;922&quot; data-section-id=&quot;zi5erz&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;From scratch&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;965&quot; data-start=&quot;939&quot; data-ke-size=&quot;size16&quot;&gt;보통 &lt;b&gt;systemd service&lt;/b&gt;로 실행&lt;/p&gt;
&lt;p data-end=&quot;968&quot; data-start=&quot;967&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;/etc/systemd/system/etcd.service&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1031&quot; data-start=&quot;1021&quot; data-section-id=&quot;1atltf8&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;kubeadm&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1060&quot; data-start=&quot;1033&quot; data-ke-size=&quot;size16&quot;&gt;etcd는 &lt;b&gt;static pod&lt;/b&gt;로 실행된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;/etc/kubernetes/manifests/etcd.yaml&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1148&quot; data-start=&quot;1115&quot; data-ke-size=&quot;size16&quot;&gt;kubelet이 이 파일을 보고 자동으로 pod를 실행한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1772961928158&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get pods -n kube-system
-------------------------------
etcd-master
kube-apiserver
kube-controller-manager
kube-scheduler&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1320&quot; data-start=&quot;1295&quot; data-section-id=&quot;1h9u5be&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1320&quot; data-start=&quot;1295&quot; data-section-id=&quot;1h9u5be&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. kubeadm에서도 옵션은 존재한다&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1772961977665&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# /etc/kubernetes/manifests/etcd.yaml
----------------------------------------
containers:
- command:
- etcd
- --advertise-client-urls=https://10.0.0.5:2379
- --listen-client-urls=https://127.0.0.1:2379
- --initial-cluster=...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1535&quot; data-start=&quot;1534&quot; data-ke-size=&quot;size16&quot;&gt;즉 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;옵션은 동일하지만 사용자가 직접 작성하지는 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1535&quot; data-start=&quot;1534&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1535&quot; data-start=&quot;1534&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5.&amp;nbsp; etcd 데이터 구조&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1650&quot; data-start=&quot;1615&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes 리소스는 etcd에서 다음 구조로 저장된다.&lt;/p&gt;
&lt;p data-end=&quot;1656&quot; data-start=&quot;1652&quot; data-ke-size=&quot;size16&quot;&gt;root&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;/registry&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1682&quot; data-start=&quot;1681&quot; data-ke-size=&quot;size16&quot;&gt;예&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;/registry/nodes&lt;br /&gt;&lt;span&gt;/registry/pods&lt;/span&gt;&lt;br /&gt;&lt;span&gt;/registry/deployments&lt;/span&gt;&lt;br /&gt;&lt;span&gt;/registry/services&lt;/span&gt;&lt;br /&gt;&lt;span&gt;/registry/secrets&lt;/span&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. HA etcd 클러스터&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1836&quot; data-start=&quot;1812&quot; data-ke-size=&quot;size16&quot;&gt;HA 환경에서는 여러 etcd 노드가 있다.&lt;/p&gt;
&lt;p data-end=&quot;1839&quot; data-start=&quot;1838&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이때 etcd는 서로를 알아야 함&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1772962133449&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--initial-cluster \
etcd1=http://10.0.0.5:2380,\
etcd2=http://10.0.0.6:2380,\
etcd3=http://10.0.0.7:2380&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&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-end=&quot;2275&quot; data-start=&quot;2080&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody data-end=&quot;2275&quot; data-start=&quot;2126&quot;&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;From Scratch&lt;/td&gt;
&lt;td&gt;Kubeadm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2147&quot; data-start=&quot;2126&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2136&quot; data-start=&quot;2126&quot;&gt;etcd 설치&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2141&quot; data-start=&quot;2136&quot;&gt;직접&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2147&quot; data-start=&quot;2141&quot;&gt;자동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2180&quot; data-start=&quot;2148&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2161&quot; data-start=&quot;2148&quot;&gt;etcd 옵션 설정&lt;/td&gt;
&lt;td data-end=&quot;2166&quot; data-start=&quot;2161&quot; data-col-size=&quot;sm&quot;&gt;직접&lt;/td&gt;
&lt;td data-end=&quot;2180&quot; data-start=&quot;2166&quot; data-col-size=&quot;sm&quot;&gt;kubeadm 자동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2213&quot; data-start=&quot;2181&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2189&quot; data-start=&quot;2181&quot;&gt;실행 방식&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2199&quot; data-start=&quot;2189&quot;&gt;systemd&lt;/td&gt;
&lt;td data-end=&quot;2213&quot; data-start=&quot;2199&quot; data-col-size=&quot;sm&quot;&gt;static pod&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2245&quot; data-start=&quot;2214&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2220&quot; data-start=&quot;2214&quot;&gt;인증서&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2228&quot; data-start=&quot;2220&quot;&gt;직접 생성&lt;/td&gt;
&lt;td data-end=&quot;2245&quot; data-start=&quot;2228&quot; data-col-size=&quot;sm&quot;&gt;kubeadm 자동 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2275&quot; data-start=&quot;2246&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2256&quot; data-start=&quot;2246&quot;&gt;클러스터 구성&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2261&quot; data-start=&quot;2256&quot;&gt;직접&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2275&quot; data-start=&quot;2261&quot;&gt;kubeadm 자동&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;kube-api-server&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;149&quot; data-start=&quot;83&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;149&quot; data-start=&quot;85&quot; data-ke-style=&quot;style3&quot;&gt;Kubernetes의 중앙 관제 서버&lt;br /&gt;모든 요청이 여기로 들어오고, 모든 컴포넌트가 여기와 통신한다.&lt;/blockquote&gt;
&lt;p data-end=&quot;165&quot; data-start=&quot;156&quot; data-section-id=&quot;189hcxo&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;165&quot; data-start=&quot;156&quot; data-section-id=&quot;189hcxo&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 중요한가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;192&quot; data-start=&quot;167&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes에는 여러 컴포넌트가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;253&quot; data-start=&quot;194&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;203&quot; data-start=&quot;194&quot; data-section-id=&quot;1r9sa4q&quot;&gt;kubectl&lt;/li&gt;
&lt;li data-end=&quot;215&quot; data-start=&quot;204&quot; data-section-id=&quot;14ey84f&quot;&gt;scheduler&lt;/li&gt;
&lt;li data-end=&quot;236&quot; data-start=&quot;216&quot; data-section-id=&quot;u9jb1m&quot;&gt;controller-manager&lt;/li&gt;
&lt;li data-end=&quot;246&quot; data-start=&quot;237&quot; data-section-id=&quot;1r9sep8&quot;&gt;kubelet&lt;/li&gt;
&lt;li data-end=&quot;253&quot; data-start=&quot;247&quot; data-section-id=&quot;1j3d0qm&quot;&gt;etcd&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;325&quot; data-start=&quot;255&quot; data-ke-size=&quot;size16&quot;&gt;이 컴포넌트들이 &lt;b&gt;서로 직접 통신하는 게 아니라&lt;/b&gt;,&lt;br /&gt;대부분 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;kube-apiserver를 중심으로 연결&lt;/b&gt;&lt;/span&gt;된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;509&quot; data-start=&quot;487&quot; data-section-id=&quot;1s121un&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;509&quot; data-start=&quot;487&quot; data-section-id=&quot;1s121un&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;kube-apiserver가 하는 일&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;522&quot; data-start=&quot;511&quot; data-section-id=&quot;1t5zcaw&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 요청 받기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773326015258&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get pods
kubectl apply -f pod.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;612&quot; data-start=&quot;583&quot; data-ke-size=&quot;size16&quot;&gt;이 명령은 실제로 kube-apiserver로 간다.&lt;/p&gt;
&lt;p data-end=&quot;612&quot; data-start=&quot;583&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;644&quot; data-start=&quot;619&quot; data-section-id=&quot;8tepg4&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 인증 / 권한 확인 / 유효성 검사&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;697&quot; data-start=&quot;649&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;662&quot; data-start=&quot;649&quot; data-section-id=&quot;121i0s9&quot;&gt;이 사용자가 누구인지&lt;/li&gt;
&lt;li data-end=&quot;680&quot; data-start=&quot;663&quot; data-section-id=&quot;j7jlbo&quot;&gt;이 작업을 할 권한이 있는지&lt;/li&gt;
&lt;li data-end=&quot;697&quot; data-start=&quot;681&quot; data-section-id=&quot;1eeq5cl&quot;&gt;YAML이 올바른 형식인지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;718&quot; data-start=&quot;704&quot; data-section-id=&quot;s6ii0r&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. etcd와 통신&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;763&quot; data-start=&quot;719&quot; data-ke-size=&quot;size16&quot;&gt;kube-apiserver는 &lt;b&gt;etcd에 직접 접근하는 유일한 컴포넌트&lt;/b&gt;다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;796&quot; data-start=&quot;769&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;777&quot; data-start=&quot;769&quot; data-section-id=&quot;yf5vtd&quot;&gt;데이터 읽기&lt;/li&gt;
&lt;li data-end=&quot;786&quot; data-start=&quot;778&quot; data-section-id=&quot;yf93q1&quot;&gt;데이터 저장&lt;/li&gt;
&lt;li data-end=&quot;796&quot; data-start=&quot;787&quot; data-section-id=&quot;127o7m4&quot;&gt;상태 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;821&quot; data-start=&quot;798&quot; data-ke-size=&quot;size16&quot;&gt;를 kube-apiserver가 담당한다.&lt;/p&gt;
&lt;p data-end=&quot;845&quot; data-start=&quot;828&quot; data-section-id=&quot;12a4dr&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;845&quot; data-start=&quot;828&quot; data-section-id=&quot;12a4dr&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. 다른 컴포넌트와 연결&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;861&quot; data-start=&quot;846&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 Pod 생성 시:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1082&quot; data-start=&quot;863&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;880&quot; data-start=&quot;863&quot; data-section-id=&quot;1fuib8h&quot;&gt;사용자가 Pod 생성 요청&lt;/li&gt;
&lt;li data-end=&quot;916&quot; data-start=&quot;881&quot; data-section-id=&quot;jcu7dp&quot;&gt;&lt;b&gt;kube-apiserver가 Pod 객체를 etcd에 저장&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;946&quot; data-start=&quot;917&quot; data-section-id=&quot;1q6vwpd&quot;&gt;scheduler가 이 Pod를 보고 노드 선택&lt;/li&gt;
&lt;li data-end=&quot;982&quot; data-start=&quot;947&quot; data-section-id=&quot;1b5vjr5&quot;&gt;&lt;b&gt;kube-apiserver가 그 결과를 etcd에 업데이트&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1016&quot; data-start=&quot;983&quot; data-section-id=&quot;c62k69&quot;&gt;kubelet이 자기 노드에 할당된 Pod를 보고 실행&lt;/li&gt;
&lt;li data-end=&quot;1051&quot; data-start=&quot;1017&quot; data-section-id=&quot;1fai7mp&quot;&gt;kubelet이 상태를 kube-apiserver에 보고&lt;/li&gt;
&lt;li data-end=&quot;1082&quot; data-start=&quot;1052&quot; data-section-id=&quot;7ie697&quot;&gt;&lt;b&gt;kube-apiserver가 etcd에 상태 저장&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1108&quot; data-start=&quot;1084&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;모든 상태 변화의 중간 허브&lt;/b&gt;다.&lt;/p&gt;
&lt;hr data-end=&quot;1113&quot; data-start=&quot;1110&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1136&quot; data-start=&quot;1115&quot; data-section-id=&quot;1rzsrc8&quot; data-ke-size=&quot;size16&quot;&gt;Pod 생성 흐름을 아주 쉽게 보면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773326070287&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;사용자 &amp;rarr; kube-apiserver &amp;rarr; etcd 저장
                    &amp;darr;
              scheduler가 노드 선택
                    &amp;darr;
              kube-apiserver 업데이트
                    &amp;darr;
                kubelet이 실행
                    &amp;darr;
              kube-apiserver에 상태 보고
                    &amp;darr;
                  etcd 업데이트&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-end=&quot;647&quot; data-start=&quot;614&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pod 생성 과정 상세&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;647&quot; data-start=&quot;614&quot; data-ke-size=&quot;size16&quot;&gt;1. 요청이 들어오면 먼저 &lt;b&gt;인증과 검증이 수행된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;721&quot; data-start=&quot;649&quot; data-ke-size=&quot;size16&quot;&gt;2. kube-api-server는 &lt;b&gt;Pod 객체를 생성한다.&lt;/b&gt;&lt;br /&gt;3. 이때 아직 &lt;b&gt;어떤 노드에도 할당되지 않은 상태&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;752&quot; data-start=&quot;723&quot; data-ke-size=&quot;size16&quot;&gt;4. 해당 정보를 &lt;b&gt;etcd 서버에 저장한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;789&quot; data-start=&quot;754&quot; data-ke-size=&quot;size16&quot;&gt;5. 사용자에게 &lt;b&gt;Pod가 생성되었다는 응답을 반환한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;789&quot; data-start=&quot;754&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;855&quot; data-start=&quot;813&quot; data-ke-size=&quot;size16&quot;&gt;6. Scheduler는 계속해서 &lt;b&gt;API Server를 모니터링&lt;/b&gt;하고 있다.&lt;/p&gt;
&lt;p data-end=&quot;880&quot; data-start=&quot;857&quot; data-ke-size=&quot;size16&quot;&gt;7. Scheduler는 다음 상태: &lt;span style=&quot;caret-color: auto; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;노드가 할당되지 않은 새로운 Pod 를 발견한다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;caret-color: auto; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;8. Scheduler는 적절한 노드를 선택하고 그 정보를 &lt;/span&gt;&lt;b&gt;kube-api-server에 전달한다.&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;caret-color: auto; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;kube-api-server는 다음 작업을 수행한다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1054&quot; data-start=&quot;1018&quot; data-ke-size=&quot;size16&quot;&gt;10. etcd 클러스터에 &lt;b&gt;노드 할당 정보를 업데이트한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1093&quot; data-start=&quot;1056&quot; data-ke-size=&quot;size16&quot;&gt;11. 해당 워커 노드의 &lt;b&gt;kubelet에게 정보를 전달한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1093&quot; data-start=&quot;1056&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1143&quot; data-start=&quot;1122&quot; data-ke-size=&quot;size16&quot;&gt;kubelet은 다음 작업을 수행한다.&lt;/p&gt;
&lt;p data-end=&quot;1143&quot; data-start=&quot;1122&quot; data-ke-size=&quot;size16&quot;&gt;13. 해당 노드에 &lt;b&gt;Pod를 생성한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1238&quot; data-start=&quot;1172&quot; data-ke-size=&quot;size16&quot;&gt;14. 컨테이너 런타임 엔진(container runtime)을 사용해 &lt;b&gt;애플리케이션 이미지를 실행한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1290&quot; data-start=&quot;1240&quot; data-ke-size=&quot;size16&quot;&gt;16. 작업이 완료되면 kubelet은 &lt;b&gt;Pod 상태 정보를 API Server에 전달한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1335&quot; data-start=&quot;1292&quot; data-ke-size=&quot;size16&quot;&gt;17. 그리고 API Server는 &lt;b&gt;etcd에 상태 정보를 다시 업데이트한다.&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1828&quot; data-start=&quot;1814&quot; data-section-id=&quot;1tx8q3u&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1828&quot; data-start=&quot;1814&quot; data-section-id=&quot;1tx8q3u&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;설치 방식에 따른 차이&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1852&quot; data-start=&quot;1830&quot; data-section-id=&quot;m8rgp2&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. kubeadm으로 설치한 경우&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1922&quot; data-start=&quot;1853&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1887&quot; data-start=&quot;1853&quot; data-section-id=&quot;1m8lsy4&quot;&gt;kube-apiserver를 kubeadm이 자동으로 구성&lt;/li&gt;
&lt;li data-end=&quot;1922&quot; data-start=&quot;1888&quot; data-section-id=&quot;hzco06&quot;&gt;보통 kube-system 네임스페이스의 Pod로 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773326590527&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get pods -n kube-system&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2005&quot; data-start=&quot;1979&quot; data-section-id=&quot;ycmy76&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2005&quot; data-start=&quot;1979&quot; data-section-id=&quot;ycmy76&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. from scratch로 설치한 경우&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2058&quot; data-start=&quot;2006&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2034&quot; data-start=&quot;2006&quot; data-section-id=&quot;1fkvyr9&quot;&gt;kube-apiserver 바이너리를 직접 설치&lt;br /&gt;Master 노드에서 &lt;b&gt;서비스로 실행하도록 설정&lt;/b&gt;해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;ps&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-ef&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; kube-apiserver&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2119&quot; data-start=&quot;2106&quot; data-ke-size=&quot;size16&quot;&gt;또는 서비스 파일 확인.&lt;/p&gt;
&lt;p data-end=&quot;2137&quot; data-start=&quot;2126&quot; data-section-id=&quot;1yfqi36&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;2137&quot; data-start=&quot;2126&quot; data-section-id=&quot;1yfqi36&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;인증서 옵션&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes의 각 컴포넌트에는 인증서가 존재한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 옵션들이 &lt;b&gt;TLS 인증서(certificates)&lt;/b&gt; 와 관련되어 있다.&lt;/p&gt;
&lt;p data-end=&quot;2340&quot; data-start=&quot;2296&quot; data-ke-size=&quot;size16&quot;&gt;이 인증서는 Kubernetes 컴포넌트 간 통신을 &lt;b&gt;보안적으로 보호&lt;/b&gt;한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;b&gt;--etcd-servers : &lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;kube-api-server가 &lt;b&gt;어떤 etcd 서버에 연결할지&lt;/b&gt;를 설정하는 옵션&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;
&lt;p data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-end=&quot;2648&quot; data-start=&quot;2611&quot; data-section-id=&quot;b0q1cp&quot;&gt;&lt;b&gt;기존 클러스터에서 kube-api-server 옵션 확인 방법&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-end=&quot;2676&quot; data-start=&quot;2650&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-end=&quot;2698&quot; data-start=&quot;2678&quot; data-section-id=&quot;g1il6i&quot;&gt;&lt;b&gt;kubeadm으로 설치한 경우&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-end=&quot;2743&quot; data-start=&quot;2700&quot;&gt;kubeadm은 kube-api-server를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Pod 형태로 배포&lt;/b&gt;한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-end=&quot;2747&quot; data-start=&quot;2745&quot;&gt;위치 : &lt;span style=&quot;caret-color: auto; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;kube-system namespace&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-end=&quot;2792&quot; data-start=&quot;2780&quot;&gt;Pod 정의 파일 위치: &lt;span style=&quot;caret-color: auto; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;/etc/kubernetes/manifests/&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;2868&quot; data-start=&quot;2835&quot; data-section-id=&quot;1j82kq5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;2868&quot; data-start=&quot;2835&quot; data-section-id=&quot;1j82kq5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;kubeadm이 아닌 경우 (from scratch)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-end=&quot;2914&quot; data-start=&quot;2870&quot; data-ke-size=&quot;size16&quot;&gt;이 경우 kube-api-server는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;systemd 서비스로 실행된다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-end=&quot;2925&quot; data-start=&quot;2916&quot; data-ke-size=&quot;size16&quot;&gt;서비스 파일 위치: &lt;span style=&quot;caret-color: auto; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;/etc/systemd/system/kube-apiserver.service&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;caret-color: auto; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;또는 다음 명령어로 실행 중인 프로세스를 확인할 수도 있다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;b&gt;&lt;span&gt;ps&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-ef&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;kube-apiserver&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-end=&quot;3091&quot; data-start=&quot;3061&quot; data-ke-size=&quot;size16&quot;&gt;이 명령어로 실제 실행 중인 옵션들을 확인할 수 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; font-size: 1.62em; letter-spacing: -1px;&quot;&gt;kube-controller-manager&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;753&quot; data-start=&quot;679&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;709&quot; data-start=&quot;679&quot; data-section-id=&quot;sw51zh&quot;&gt;시스템의 다양한 컴포넌트 상태를 지속적으로 모니터링&lt;/li&gt;
&lt;li data-end=&quot;753&quot; data-start=&quot;710&quot; data-section-id=&quot;1t0h8ea&quot;&gt;시스템을 &lt;b&gt;원하는 상태(desired state)&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-end=&quot;780&quot; data-start=&quot;760&quot; data-section-id=&quot;qhra5q&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Node Controller&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;834&quot; data-start=&quot;814&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;873&quot; data-start=&quot;836&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;848&quot; data-start=&quot;836&quot; data-section-id=&quot;129o9c0&quot;&gt;노드 상태 모니터링&lt;/li&gt;
&lt;li data-end=&quot;873&quot; data-start=&quot;849&quot; data-section-id=&quot;uztd55&quot;&gt;애플리케이션이 정상적으로 실행되도록 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;928&quot; data-start=&quot;875&quot; data-ke-size=&quot;size16&quot;&gt;Node Controller는 &lt;b&gt;kube-api-server를 통해 노드 상태를 확인한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;959&quot; data-start=&quot;935&quot; data-section-id=&quot;syshad&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;959&quot; data-start=&quot;935&quot; data-section-id=&quot;syshad&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동작 방식&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;977&quot; data-start=&quot;961&quot; data-ke-size=&quot;size16&quot;&gt;Node Controller는&amp;nbsp;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;b&gt;5초&lt;/b&gt;마다 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;노드 상태를 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1038&quot; data-start=&quot;1011&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 통해 노드의 건강 상태를 모니터링한다.&lt;/p&gt;
&lt;p data-end=&quot;1058&quot; data-start=&quot;1045&quot; data-section-id=&quot;12gpgc4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1058&quot; data-start=&quot;1045&quot; data-section-id=&quot;12gpgc4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장애 처리&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1106&quot; data-start=&quot;1060&quot; data-ke-size=&quot;size16&quot;&gt;Node Controller가 어떤 노드에서 &lt;b&gt;heartbeat를 받지 못하면&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1123&quot; data-start=&quot;1108&quot; data-ke-size=&quot;size16&quot;&gt;즉시 장애 처리하지 않는다. 먼저 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;b&gt;40&lt;/b&gt;초 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;동안 기다린다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1184&quot; data-start=&quot;1156&quot; data-ke-size=&quot;size16&quot;&gt;그래도 heartbeat가 오지 않으면 해당 노드를 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Unreachable &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;상태로 표시한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1184&quot; data-start=&quot;1156&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1184&quot; data-start=&quot;1156&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;노드 복구 대기&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1262&quot; data-start=&quot;1240&quot; data-ke-size=&quot;size16&quot;&gt;노드가 Unreachable 상태가 되면 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;b&gt;5분 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;동안 노드가 복구되기를 기다린다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1311&quot; data-start=&quot;1300&quot; data-ke-size=&quot;size16&quot;&gt;만약 복구되지 않으면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1356&quot; data-start=&quot;1313&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1333&quot; data-start=&quot;1313&quot; data-section-id=&quot;rw28m&quot;&gt;해당 노드에 있던 Pod들을 제거&lt;/li&gt;
&lt;li data-end=&quot;1356&quot; data-start=&quot;1334&quot; data-section-id=&quot;19t29vr&quot;&gt;다른 정상 노드에 Pod를 다시 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Replication Controller 예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1432&quot; data-start=&quot;1392&quot; data-ke-size=&quot;size16&quot;&gt;또 다른 컨트롤러는 &lt;b&gt;Replication Controller&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1445&quot; data-start=&quot;1434&quot; data-ke-size=&quot;size16&quot;&gt;이 컨트롤러의 역할:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1490&quot; data-start=&quot;1447&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1467&quot; data-start=&quot;1447&quot; data-section-id=&quot;1cveqyu&quot;&gt;ReplicaSet 상태 모니터링&lt;/li&gt;
&lt;li data-end=&quot;1490&quot; data-start=&quot;1468&quot; data-section-id=&quot;1lkwjl3&quot;&gt;항상 &lt;b&gt;원하는 Pod 개수 유지&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1534&quot; data-start=&quot;1520&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 만약 Pod 하나가 죽으면 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;새 Pod를 생성&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;하여 개수를 맞춘다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1608&quot; data-start=&quot;1576&quot; data-section-id=&quot;tc9s0u&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1657&quot; data-start=&quot;1610&quot; data-ke-size=&quot;size16&quot;&gt;지금까지는 두 개만 설명했지만 Kubernetes에는 훨씬 많은 컨트롤러가 존재한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1760&quot; data-start=&quot;1662&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1685&quot; data-start=&quot;1662&quot; data-section-id=&quot;qakd8t&quot;&gt;Deployment controller&lt;/li&gt;
&lt;li data-end=&quot;1706&quot; data-start=&quot;1686&quot; data-section-id=&quot;162uf55&quot;&gt;Service controller&lt;/li&gt;
&lt;li data-end=&quot;1729&quot; data-start=&quot;1707&quot; data-section-id=&quot;15xl253&quot;&gt;Namespace controller&lt;/li&gt;
&lt;li data-end=&quot;1760&quot; data-start=&quot;1730&quot; data-section-id=&quot;hsm9l&quot;&gt;Persistent Volume controller&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1810&quot; data-start=&quot;1762&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes의 많은 기능과 자동화 로직은 &lt;b&gt;이 컨트롤러들로 구현되어 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1813&quot; data-start=&quot;1812&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Controller = Kubernetes 자동화 로직의 핵심&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1893&quot; data-start=&quot;1873&quot; data-section-id=&quot;eg6a15&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1893&quot; data-start=&quot;1873&quot; data-section-id=&quot;eg6a15&quot; data-ke-size=&quot;size16&quot;&gt;Controller Manager&lt;/p&gt;
&lt;p data-end=&quot;1906&quot; data-start=&quot;1895&quot; data-ke-size=&quot;size16&quot;&gt;이 많은 컨트롤러들은 &lt;b&gt;Kube Controller Manager &lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;라는 &lt;/span&gt;&lt;b&gt;하나의 프로세스 안에 포함되어 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1975&quot; data-start=&quot;1974&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Controller Manager = 여러 Controller들의 집합&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2063&quot; data-start=&quot;2040&quot; data-section-id=&quot;s5xp6d&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2063&quot; data-start=&quot;2040&quot; data-section-id=&quot;s5xp6d&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2063&quot; data-start=&quot;2040&quot; data-section-id=&quot;s5xp6d&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Controller Manager 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2089&quot; data-start=&quot;2065&quot; data-ke-size=&quot;size16&quot;&gt;Controller Manager를 설치하면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2111&quot; data-start=&quot;2091&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2111&quot; data-start=&quot;2091&quot; data-section-id=&quot;1ajou6y&quot;&gt;여러 컨트롤러들이 함께 설치된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2119&quot; data-start=&quot;2113&quot; data-ke-size=&quot;size16&quot;&gt;설치 방법:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2206&quot; data-start=&quot;2121&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2177&quot; data-start=&quot;2121&quot; data-section-id=&quot;gz6w9u&quot;&gt;Kubernetes 릴리스 페이지에서 &lt;b&gt;kube-controller-manager 다운로드&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2186&quot; data-start=&quot;2178&quot; data-section-id=&quot;nsym4x&quot;&gt;압축 해제&lt;/li&gt;
&lt;li data-end=&quot;2206&quot; data-start=&quot;2187&quot; data-section-id=&quot;kzffmx&quot;&gt;서비스(service)로 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2239&quot; data-start=&quot;2213&quot; data-section-id=&quot;1gs0zux&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Controller Manager 실행 옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2283&quot; data-start=&quot;2241&quot; data-ke-size=&quot;size16&quot;&gt;Controller Manager는 실행 시 다양한 옵션을 사용할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2298&quot; data-start=&quot;2285&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 앞에서 설명한&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2355&quot; data-start=&quot;2300&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2321&quot; data-start=&quot;2300&quot; data-section-id=&quot;rhnkjl&quot;&gt;node monitor period&lt;/li&gt;
&lt;li data-end=&quot;2336&quot; data-start=&quot;2322&quot; data-section-id=&quot;brbyv3&quot;&gt;grace period&lt;/li&gt;
&lt;li data-end=&quot;2355&quot; data-start=&quot;2337&quot; data-section-id=&quot;9p9vjq&quot;&gt;eviction timeout&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2378&quot; data-start=&quot;2357&quot; data-ke-size=&quot;size16&quot;&gt;같은 설정을 옵션으로 지정할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2405&quot; data-start=&quot;2385&quot; data-section-id=&quot;1bfwozn&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2405&quot; data-start=&quot;2385&quot; data-section-id=&quot;1bfwozn&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특정 Controller만 활성화&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2418&quot; data-start=&quot;2407&quot; data-ke-size=&quot;size16&quot;&gt;다음 옵션을 사용하면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;--controllers&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2467&quot; data-start=&quot;2447&quot; data-ke-size=&quot;size16&quot;&gt;활성화할 컨트롤러를 선택할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2498&quot; data-start=&quot;2469&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로는 &lt;b&gt;모든 컨트롤러가 활성화되어 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2530&quot; data-start=&quot;2500&quot; data-ke-size=&quot;size16&quot;&gt;하지만 특정 컨트롤러만 활성화하도록 설정할 수도 있다.&lt;/p&gt;
&lt;p data-end=&quot;2553&quot; data-start=&quot;2532&quot; data-ke-size=&quot;size16&quot;&gt;만약 어떤 컨트롤러가 동작하지 않는다면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;b&gt;&lt;span&gt;controllers 옵션&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2604&quot; data-start=&quot;2583&quot; data-ke-size=&quot;size16&quot;&gt;을 확인&lt;/p&gt;
&lt;p data-end=&quot;2604&quot; data-start=&quot;2583&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2640&quot; data-start=&quot;2611&quot; data-section-id=&quot;zoq62x&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Controller Manager 설정 확인 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2668&quot; data-start=&quot;2642&quot; data-ke-size=&quot;size16&quot;&gt;클러스터 설정 방식에 따라 확인 방법이 다르다.&lt;/p&gt;
&lt;p data-end=&quot;2668&quot; data-start=&quot;2642&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2694&quot; data-start=&quot;2675&quot; data-section-id=&quot;1j831eh&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;kubeadm&lt;/b&gt;으로 설치한 경우&lt;/p&gt;
&lt;p data-end=&quot;2739&quot; data-start=&quot;2696&quot; data-ke-size=&quot;size16&quot;&gt;kubeadm은 &lt;b&gt;Controller Manager를 Pod로 실행한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2743&quot; data-start=&quot;2741&quot; data-ke-size=&quot;size16&quot;&gt;위치 : &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;kube-system namespace&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2743&quot; data-start=&quot;2741&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Pod 설정 파일 위치: &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;/etc/kubernetes/manifests/&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;kubeadm이 아닌 경우&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2902&quot; data-start=&quot;2858&quot; data-ke-size=&quot;size16&quot;&gt;Controller Manager는 &lt;b&gt;서비스(service)&lt;/b&gt; 로 실행된다.&lt;/p&gt;
&lt;p data-end=&quot;2913&quot; data-start=&quot;2904&quot; data-ke-size=&quot;size16&quot;&gt;서비스 파일 위치 : &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;/etc/systemd/system/&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2913&quot; data-start=&quot;2904&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;또는 실행 중인 프로세스를 확인할 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2982&quot; data-start=&quot;2981&quot; data-ke-size=&quot;size16&quot;&gt;예: &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;ps&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;-ef&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; | &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;grep&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; kube-controller-manager&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이 명령으로 실행 옵션을 확인할 수 있다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;kube scheduler&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;177&quot; data-start=&quot;111&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Kubernetes Scheduler는 Pod를 어떤 Node에 배치할지 결정하는 역할&lt;/b&gt;을 한다.&lt;/p&gt;
&lt;p data-end=&quot;177&quot; data-start=&quot;111&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Scheduler는 Pod를 실제로 Node에 배치하지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;278&quot; data-start=&quot;243&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Pod를 실제로 생성하는 것은 &lt;b&gt;kubelet의 역할&lt;/b&gt;&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;286&quot; data-start=&quot;280&quot; data-ke-size=&quot;size16&quot;&gt;비유하자면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;386&quot; data-start=&quot;288&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;340&quot; data-start=&quot;288&quot; data-section-id=&quot;mnyxmr&quot;&gt;&lt;b&gt;Scheduler&lt;/b&gt; &amp;rarr; 어떤 배(ship)에 어떤 컨테이너를 실을지 결정하는 사람&lt;/li&gt;
&lt;li data-end=&quot;386&quot; data-start=&quot;341&quot; data-section-id=&quot;1646n6q&quot;&gt;&lt;b&gt;kubelet&lt;/b&gt; &amp;rarr; 실제로 컨테이너를 배에 실어주는 선장(captain)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Scheduler = Pod 배치 결정&lt;/span&gt;&lt;br /&gt;&lt;span&gt;kubelet = Pod 실제 생성&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;471&quot; data-start=&quot;452&quot; data-section-id=&quot;9jqv8p&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;471&quot; data-start=&quot;452&quot; data-section-id=&quot;9jqv8p&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;471&quot; data-start=&quot;452&quot; data-section-id=&quot;9jqv8p&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Scheduler가 필요한 이유&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;506&quot; data-start=&quot;473&quot; data-ke-size=&quot;size16&quot;&gt;클러스터에는 여러 개의 Node와 여러 개의 Pod가 있다.&lt;/p&gt;
&lt;p data-end=&quot;531&quot; data-start=&quot;508&quot; data-ke-size=&quot;size16&quot;&gt;Scheduler는 다음을 고려해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;619&quot; data-start=&quot;533&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;557&quot; data-start=&quot;533&quot; data-section-id=&quot;jzqu62&quot;&gt;Pod의 CPU / Memory 요구사항&lt;/li&gt;
&lt;li data-end=&quot;572&quot; data-start=&quot;558&quot; data-section-id=&quot;156qxec&quot;&gt;Node의 리소스 용량&lt;/li&gt;
&lt;li data-end=&quot;598&quot; data-start=&quot;573&quot; data-section-id=&quot;i7q21g&quot;&gt;특정 Node에 배치해야 하는 애플리케이션&lt;/li&gt;
&lt;li data-end=&quot;619&quot; data-start=&quot;599&quot; data-section-id=&quot;1vgmhwt&quot;&gt;특정 Node를 피해야 하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;622&quot; data-start=&quot;621&quot; data-ke-size=&quot;size16&quot;&gt;즉 &lt;b&gt;올바른 Pod가 올바른 Node에 배치되도록 결정한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;660&quot; data-start=&quot;626&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;684&quot; data-start=&quot;667&quot; data-section-id=&quot;45s8zx&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;684&quot; data-start=&quot;667&quot; data-section-id=&quot;45s8zx&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Scheduler 동작 방식&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;728&quot; data-start=&quot;686&quot; data-ke-size=&quot;size16&quot;&gt;Scheduler는 Pod를 Node에 배치할 때 &lt;b&gt;두 단계&lt;/b&gt;를 거친다.&lt;/p&gt;
&lt;p data-end=&quot;728&quot; data-start=&quot;686&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;754&quot; data-start=&quot;735&quot; data-section-id=&quot;1g7pp2s&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Filtering 단계&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;791&quot; data-start=&quot;756&quot; data-ke-size=&quot;size16&quot;&gt;먼저 Pod의 요구사항을 만족하지 못하는 Node들을 제거한다.&lt;/p&gt;
&lt;p data-end=&quot;825&quot; data-start=&quot;793&quot; 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 data-end=&quot;825&quot; data-start=&quot;793&quot;&gt;CPU: 4&lt;/li&gt;
&lt;li data-end=&quot;825&quot; data-start=&quot;793&quot;&gt;Memory: 8GB&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;882&quot; data-start=&quot;859&quot; data-ke-size=&quot;size16&quot;&gt;Scheduler는 Node들을 검사하면서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;916&quot; data-start=&quot;884&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;899&quot; data-start=&quot;884&quot; data-section-id=&quot;2gemzl&quot;&gt;리소스가 부족한 Node&lt;/li&gt;
&lt;li data-end=&quot;916&quot; data-start=&quot;900&quot; data-section-id=&quot;83gmyk&quot;&gt;조건에 맞지 않는 Node&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;926&quot; data-start=&quot;918&quot; data-ke-size=&quot;size16&quot;&gt;들을 제거한다.&lt;/p&gt;
&lt;p data-end=&quot;929&quot; data-start=&quot;928&quot; data-ke-size=&quot;size16&quot;&gt;즉&amp;nbsp; &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;적합하지 않은 Node 제거&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;987&quot; data-start=&quot;970&quot; data-section-id=&quot;15juesh&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;987&quot; data-start=&quot;970&quot; data-section-id=&quot;15juesh&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Ranking 단계&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1036&quot; data-start=&quot;989&quot; data-ke-size=&quot;size16&quot;&gt;Filtering을 통과한 Node들 중에서 &lt;b&gt;가장 적합한 Node를 선택&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-end=&quot;1091&quot; data-start=&quot;1038&quot; data-ke-size=&quot;size16&quot;&gt;Scheduler는 &lt;b&gt;Priority Function&lt;/b&gt;을 사용하여 Node에 점수를 매긴다.&lt;/p&gt;
&lt;p data-end=&quot;1099&quot; data-start=&quot;1093&quot; data-ke-size=&quot;size16&quot;&gt;점수 범위: &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;0 ~ 10&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;br /&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;예를 들어 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Pod를 배치했을 때 남는 리소스가 많은 Node가 더 높은 점수를 받을 수 있다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1178&quot; data-start=&quot;1176&quot; data-ke-size=&quot;size16&quot;&gt;예: &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Node남는 CPU&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1245&quot; data-start=&quot;1180&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1245&quot; data-start=&quot;1216&quot;&gt;
&lt;tr data-end=&quot;1230&quot; data-start=&quot;1216&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1225&quot; data-start=&quot;1216&quot;&gt;Node A&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1230&quot; data-start=&quot;1225&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1245&quot; data-start=&quot;1231&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1240&quot; data-start=&quot;1231&quot;&gt;Node B&lt;/td&gt;
&lt;td data-end=&quot;1245&quot; data-start=&quot;1240&quot; data-col-size=&quot;sm&quot;&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1270&quot; data-start=&quot;1247&quot; data-ke-size=&quot;size16&quot;&gt;Node B가 더 높은 점수를 받게 된다.&lt;/p&gt;
&lt;p data-end=&quot;1304&quot; data-start=&quot;1272&quot; data-ke-size=&quot;size16&quot;&gt;그래서 Scheduler는 &lt;b&gt;Node B를 선택&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-end=&quot;1304&quot; data-start=&quot;1272&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1329&quot; data-start=&quot;1311&quot; data-section-id=&quot;kmn1ig&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Scheduler 커스터마이징&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1368&quot; data-start=&quot;1331&quot; data-ke-size=&quot;size16&quot;&gt;Scheduler 동작은 &lt;b&gt;사용자가 커스터마이징할 수도 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1376&quot; data-start=&quot;1370&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1412&quot; data-start=&quot;1378&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1399&quot; data-start=&quot;1378&quot; data-section-id=&quot;1efe63w&quot;&gt;Custom Scheduler 작성&lt;/li&gt;
&lt;li data-end=&quot;1412&quot; data-start=&quot;1400&quot; data-section-id=&quot;wwq6ys&quot;&gt;스케줄링 정책 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1447&quot; data-start=&quot;1414&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes에는 스케줄링과 관련된 많은 기능이 있다.&lt;/p&gt;
&lt;p data-end=&quot;1451&quot; data-start=&quot;1449&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1539&quot; data-start=&quot;1453&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1481&quot; data-start=&quot;1453&quot; data-section-id=&quot;1i7z2cp&quot;&gt;Resource requests / limits&lt;/li&gt;
&lt;li data-end=&quot;1506&quot; data-start=&quot;1482&quot; data-section-id=&quot;1jo8r20&quot;&gt;Taints and tolerations&lt;/li&gt;
&lt;li data-end=&quot;1523&quot; data-start=&quot;1507&quot; data-section-id=&quot;1yvcudq&quot;&gt;Node selectors&lt;/li&gt;
&lt;li data-end=&quot;1539&quot; data-start=&quot;1524&quot; data-section-id=&quot;vlquoa&quot;&gt;Node affinity&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1610&quot; data-start=&quot;1596&quot; data-section-id=&quot;qirl3h&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Scheduler 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1647&quot; data-start=&quot;1612&quot; data-ke-size=&quot;size16&quot;&gt;Scheduler를 직접 설치하려면 다음과 같은 과정을 거친다.&lt;/p&gt;
&lt;p data-end=&quot;1706&quot; data-start=&quot;1649&quot; data-ke-size=&quot;size16&quot;&gt;1. Kubernetes release 페이지에서 &lt;b&gt;kube-scheduler 바이너리 다운로드&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1717&quot; data-start=&quot;1708&quot; data-ke-size=&quot;size16&quot;&gt;2. 압축 해제&lt;/p&gt;
&lt;p data-end=&quot;1739&quot; data-start=&quot;1719&quot; data-ke-size=&quot;size16&quot;&gt;3. 서비스(service)로 실행&lt;/p&gt;
&lt;p data-end=&quot;1795&quot; data-start=&quot;1741&quot; data-ke-size=&quot;size16&quot;&gt;Scheduler 실행 시에는 &lt;b&gt;scheduler configuration 파일&lt;/b&gt;을 지정한다.&lt;/p&gt;
&lt;p data-end=&quot;1822&quot; data-start=&quot;1802&quot; data-section-id=&quot;146pgvl&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1822&quot; data-start=&quot;1802&quot; data-section-id=&quot;146pgvl&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Scheduler 설정 확인 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1850&quot; data-start=&quot;1824&quot; data-ke-size=&quot;size16&quot;&gt;클러스터 구성 방식에 따라 확인 방법이 다르다.&lt;/p&gt;
&lt;p data-end=&quot;1850&quot; data-start=&quot;1824&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1876&quot; data-start=&quot;1857&quot; data-section-id=&quot;1j831eh&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;kubeadm으로 설치한 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1915&quot; data-start=&quot;1878&quot; data-ke-size=&quot;size16&quot;&gt;kubeadm은 Scheduler를 &lt;b&gt;Pod 형태로 배포&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-end=&quot;1919&quot; data-start=&quot;1917&quot; data-ke-size=&quot;size16&quot;&gt;위치: &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;kube-system namespace&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1919&quot; data-start=&quot;1917&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;설정 파일 위치: &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;/etc/kubernetes/manifests/&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2027&quot; data-start=&quot;2011&quot; data-section-id=&quot;11io1pk&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;실행 중인 프로세스 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2059&quot; data-start=&quot;2029&quot; data-ke-size=&quot;size16&quot;&gt;Master 노드에서 다음 명령으로 확인할 수도 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;ps&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-ef&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; kube-scheduler&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2135&quot; data-start=&quot;2103&quot; data-ke-size=&quot;size16&quot;&gt;이 명령으로 &lt;b&gt;실행 옵션과 설정값&lt;/b&gt;을 확인할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;kubelet&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;140&quot; data-start=&quot;91&quot; data-ke-size=&quot;size16&quot;&gt;kubelet은 &lt;b&gt;배(ship)의 선장(captain)&lt;/b&gt; 과 같다.&lt;/p&gt;
&lt;p data-end=&quot;167&quot; data-start=&quot;142&quot; data-ke-size=&quot;size16&quot;&gt;선장은 배에서 일어나는 모든 활동을 관리한다.&lt;/p&gt;
&lt;p data-end=&quot;175&quot; data-start=&quot;169&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;305&quot; data-start=&quot;177&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;209&quot; data-start=&quot;177&quot; data-section-id=&quot;dd624n&quot;&gt;클러스터에 참여하기 위해 필요한 모든 절차를 수행한다.&lt;/li&gt;
&lt;li data-end=&quot;243&quot; data-start=&quot;210&quot; data-section-id=&quot;1w6jatq&quot;&gt;마스터와 통신하는 &lt;b&gt;유일한 연락 창구&lt;/b&gt; 역할을 한다.&lt;/li&gt;
&lt;li data-end=&quot;279&quot; data-start=&quot;244&quot; data-section-id=&quot;16os5bl&quot;&gt;마스터의 스케줄러가 지시하면 컨테이너를 배에 싣거나 내린다.&lt;/li&gt;
&lt;li data-end=&quot;305&quot; data-start=&quot;280&quot; data-section-id=&quot;1qm171j&quot;&gt;배와 컨테이너 상태를 정기적으로 보고한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;337&quot; data-start=&quot;312&quot; data-section-id=&quot;81h5vl&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Kubernetes에서 kubelet 역할&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;391&quot; data-start=&quot;339&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes에서 &lt;b&gt;worker node에 있는 kubelet&lt;/b&gt;은 다음 역할을 한다.&lt;/p&gt;
&lt;p data-end=&quot;427&quot; data-start=&quot;393&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.노드를 Kubernetes 클러스터에 등록한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;457&quot; data-start=&quot;429&quot; data-ke-size=&quot;size16&quot;&gt;2. Pod나 컨테이너를 실행하라는 명령을 받으면&lt;/p&gt;
&lt;p data-end=&quot;485&quot; data-start=&quot;459&quot; data-ke-size=&quot;size16&quot;&gt;컨테이너 런타임 엔진(예: Docker)을 통해&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;519&quot; data-start=&quot;487&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;505&quot; data-start=&quot;487&quot; data-section-id=&quot;1x1v6y1&quot;&gt;필요한 이미지를 pull 하고&lt;/li&gt;
&lt;li data-end=&quot;519&quot; data-start=&quot;506&quot; data-section-id=&quot;1plokjb&quot;&gt;&lt;b&gt;컨테이너를 실행&lt;/b&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;556&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;3. 실행된 Pod와 컨테이너 상태를 &lt;b&gt;지속적으로 모니터링&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-end=&quot;600&quot; data-start=&quot;558&quot; data-ke-size=&quot;size16&quot;&gt;4. 상태 정보를 &lt;b&gt;kube-apiserver에 주기적으로 보고한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;619&quot; data-start=&quot;607&quot; data-section-id=&quot;1jxqqv2&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;619&quot; data-start=&quot;607&quot; data-section-id=&quot;1jxqqv2&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;kubelet 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;639&quot; data-start=&quot;621&quot; data-ke-size=&quot;size16&quot;&gt;kubelet 설치 방법을 보자.&lt;/p&gt;
&lt;p data-end=&quot;672&quot; data-start=&quot;641&quot; data-ke-size=&quot;size16&quot;&gt;만약 kubeadm을 사용해 클러스터를 배포했다면&lt;/p&gt;
&lt;p data-end=&quot;706&quot; data-start=&quot;674&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;kubeadm은 kubelet을 자동으로 배포하지 않는다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;728&quot; data-start=&quot;708&quot; data-ke-size=&quot;size16&quot;&gt;이것이 다른 컴포넌트와 다른 점이다.&lt;/p&gt;
&lt;blockquote data-end=&quot;772&quot; data-start=&quot;730&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;772&quot; data-start=&quot;732&quot; data-ke-size=&quot;size16&quot;&gt;kubelet은 항상 &lt;b&gt;worker node에 직접 설치해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;788&quot; data-start=&quot;774&quot; data-ke-size=&quot;size16&quot;&gt;설치 과정은 다음과 같다.&lt;/p&gt;
&lt;p data-end=&quot;847&quot; data-start=&quot;790&quot; data-ke-size=&quot;size16&quot;&gt;1. kubelet 설치 파일 다운로드&lt;br /&gt;2. 압축 해제&lt;br /&gt;3. 서비스(service)로 실행&lt;/p&gt;
&lt;p data-end=&quot;847&quot; data-start=&quot;790&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;847&quot; data-start=&quot;790&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;kubelet 실행 상태 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;920&quot; data-start=&quot;874&quot; data-ke-size=&quot;size16&quot;&gt;worker node에서 다음 명령어로 실행 중인 kubelet을 확인할 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;ps&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-ef&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; kubelet&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;972&quot; data-start=&quot;961&quot; data-ke-size=&quot;size16&quot;&gt;이 명령어를 사용하면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1002&quot; data-start=&quot;974&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;994&quot; data-start=&quot;974&quot; data-section-id=&quot;1mflkwc&quot;&gt;실행 중인 kubelet 프로세스&lt;/li&gt;
&lt;li data-end=&quot;1002&quot; data-start=&quot;995&quot; data-section-id=&quot;vo4i6g&quot;&gt;실행 옵션&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1015&quot; data-start=&quot;1004&quot; data-ke-size=&quot;size16&quot;&gt;을 확인할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;kube proxy&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes에서는 &lt;b&gt;모든 Pod가 다른 모든 Pod와 통신할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;207&quot; data-start=&quot;164&quot; data-ke-size=&quot;size16&quot;&gt;이것은 &lt;b&gt;Pod 네트워크&lt;/b&gt;를 통해 가능하다.&lt;/p&gt;
&lt;p data-end=&quot;255&quot; data-start=&quot;209&quot; data-ke-size=&quot;size16&quot;&gt;Pod 네트워크는 &lt;b&gt;클러스터의 모든 노드에 걸쳐 있는 내부 가상 네트워크&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;305&quot; data-start=&quot;257&quot; data-ke-size=&quot;size16&quot;&gt;모든 Pod는 이 네트워크에 연결되어 있고, 이 네트워크를 통해 서로 통신할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;305&quot; data-start=&quot;257&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;305&quot; data-start=&quot;257&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Service를 사용하는 이유&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 상황을 생각해 보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;443&quot; data-start=&quot;388&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;416&quot; data-start=&quot;388&quot; data-section-id=&quot;c5ntlp&quot;&gt;첫 번째 노드에는 &lt;b&gt;웹 애플리케이션 Pod&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;443&quot; data-start=&quot;417&quot; data-section-id=&quot;1ojnqtz&quot;&gt;두 번째 노드에는 &lt;b&gt;데이터베이스 Pod&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;492&quot; data-start=&quot;445&quot; data-ke-size=&quot;size16&quot;&gt;웹 애플리케이션은 &lt;b&gt;데이터베이스 Pod의 IP 주소&lt;/b&gt;를 사용해서 접근할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;505&quot; data-start=&quot;494&quot; data-ke-size=&quot;size16&quot;&gt;하지만 문제가 있다.&lt;/p&gt;
&lt;p data-end=&quot;505&quot; data-start=&quot;494&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Pod의 IP 주소는 항상 동일하게 유지되지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;574&quot; data-start=&quot;544&quot; data-ke-size=&quot;size16&quot;&gt;Pod가 재시작되거나 재생성되면 IP가 바뀔 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;574&quot; data-start=&quot;544&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;574&quot; data-start=&quot;544&quot; data-ke-size=&quot;size16&quot;&gt;그래서 Kubernetes에서는 &lt;b&gt;Service&lt;/b&gt;를 사용한다.&lt;/p&gt;
&lt;p data-end=&quot;708&quot; data-start=&quot;639&quot; data-ke-size=&quot;size16&quot;&gt;Service를 생성하면 데이터베이스 애플리케이션을 &lt;b&gt;클러스터 전체에서 접근 가능하게 노출&lt;/b&gt;할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;715&quot; data-start=&quot;710&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Service 이름: DB라고 하자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;715&quot; data-start=&quot;710&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;715&quot; data-start=&quot;710&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;웹 애플리케이션은 이제 &lt;/span&gt;&lt;b&gt;DB라는 서비스 이름으로 데이터베이스에 접근&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;824&quot; data-start=&quot;795&quot; data-ke-size=&quot;size16&quot;&gt;Service에는 &lt;b&gt;IP 주소도 하나 할당된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;856&quot; data-start=&quot;826&quot; data-ke-size=&quot;size16&quot;&gt;Pod가 Service의 이름이나 IP로 요청을 보내면&lt;/p&gt;
&lt;p data-end=&quot;905&quot; data-start=&quot;858&quot; data-ke-size=&quot;size16&quot;&gt;Service는 해당 요청을 &lt;b&gt;백엔드 Pod(데이터베이스 Pod)&lt;/b&gt; 로 전달한다.&lt;/p&gt;
&lt;p data-end=&quot;305&quot; data-start=&quot;257&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1009&quot; data-start=&quot;983&quot; data-ke-size=&quot;size16&quot;&gt;단, Service는 &lt;b&gt;실제 컨테이너가 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1071&quot; data-start=&quot;1014&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1038&quot; data-start=&quot;1014&quot; data-section-id=&quot;3is3c3&quot;&gt;Pod처럼 실제로 실행되는 것이 아니다.&lt;/li&gt;
&lt;li data-end=&quot;1056&quot; data-start=&quot;1039&quot; data-section-id=&quot;1b24a1o&quot;&gt;네트워크 인터페이스도 없다.&lt;/li&gt;
&lt;li data-end=&quot;1071&quot; data-start=&quot;1057&quot; data-section-id=&quot;5p2gkc&quot;&gt;실제 프로세스도 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1081&quot; data-start=&quot;1073&quot; data-ke-size=&quot;size16&quot;&gt;Service는&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Kubernetes 내부 메모리에 존재하는 가상 객체&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;1081&quot; data-start=&quot;1073&quot; data-ke-style=&quot;style3&quot;&gt;Service는 실제 실행되는 객체가 아니라,&lt;br /&gt;백엔드 Pod 집합에 대해 고정된 이름/IP와 접근 경로를 제공하는 가상 리소스다.&lt;br /&gt;실제 트래픽 전달은 kube-proxy 등의 네트워크 규칙이 수행한다.&lt;/blockquote&gt;
&lt;p data-end=&quot;305&quot; data-start=&quot;257&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Service 에 접근하는 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1189&quot; data-start=&quot;1167&quot; data-ke-size=&quot;size16&quot;&gt;Service는 실제 프로세스가 아니지만 &lt;b&gt;클러스터의 어떤 노드에서도 접근 가능해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1189&quot; data-start=&quot;1167&quot; data-ke-size=&quot;size16&quot;&gt;이 기능을 제공하는 것이 바로 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;b&gt;kube-proxy&lt;/b&gt; 이다.&lt;/span&gt;&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;&lt;b&gt;역할&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1352&quot; data-start=&quot;1338&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1465&quot; data-start=&quot;1354&quot;&gt;새로운 Service가 생성되는지 감시한다.&lt;/li&gt;
&lt;li data-end=&quot;1465&quot; data-start=&quot;1354&quot;&gt;Service가 생성되면 각 노드에 트래픽 전달 규칙을 만든다.&lt;/li&gt;
&lt;li data-end=&quot;1465&quot; data-start=&quot;1354&quot;&gt;Service로 들어온 요청을 실제 Pod로 전달한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;동작 방식&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kube-proxy는 주로 &lt;b&gt;iptables 규칙&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 data-end=&quot;1548&quot; data-start=&quot;1538&quot;&gt;Service IP : 10.96.0.1&lt;/li&gt;
&lt;li data-end=&quot;1548&quot; data-start=&quot;1538&quot;&gt;실제 Pod IP: 10.32.0.15&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;kube-proxy는 다음과 같은 규칙을 만든다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;b&gt;Service IP로 들어온 트래픽&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;b&gt;&lt;span&gt;&amp;darr;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;실제 Pod IP로 전달&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1687&quot; data-start=&quot;1686&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Service &amp;rarr; Backend Pod &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;으로 트래픽을 전달하도록 설정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1687&quot; data-start=&quot;1686&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1918&quot; data-start=&quot;1903&quot; data-section-id=&quot;jgshnm&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;kube-proxy 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1945&quot; data-start=&quot;1920&quot; data-ke-size=&quot;size16&quot;&gt;kube-proxy 설치 방법은 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2000&quot; data-start=&quot;1947&quot;&gt;Kubernetes release 페이지에서 kube-proxy 바이너리 다운로드&lt;/li&gt;
&lt;li data-end=&quot;2011&quot; data-start=&quot;2002&quot;&gt;압축 해제&lt;/li&gt;
&lt;li data-end=&quot;2033&quot; data-start=&quot;2013&quot;&gt;서비스(service)로 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;2057&quot; data-start=&quot;2040&quot; data-section-id=&quot;m8pggr&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;kubeadm을 사용할 경우&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2105&quot; data-start=&quot;2059&quot; data-ke-size=&quot;size16&quot;&gt;kubeadm을 사용하면 kube-proxy는 &lt;b&gt;Pod 형태로 자동 배포된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2144&quot; data-start=&quot;2107&quot; data-ke-size=&quot;size16&quot;&gt;그리고 kube-proxy는 &lt;b&gt;DaemonSet&lt;/b&gt;으로 배포된다.&lt;/p&gt;
&lt;p data-end=&quot;2157&quot; data-start=&quot;2146&quot; data-ke-size=&quot;size16&quot;&gt;DaemonSet이란 &lt;b&gt;클러스터의 모든 노드에 하나씩 Pod가 실행되도록 보장하는 Kubernetes 객체&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;2157&quot; data-start=&quot;2146&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;각 노드마다&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; kube-proxy Pod 1개&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;가 항상 실행&lt;/b&gt;&lt;/span&gt;된다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;59&quot; data-start=&quot;53&quot; data-section-id=&quot;1htr7pq&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;pods&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;87&quot; data-start=&quot;61&quot; data-ke-size=&quot;size16&quot;&gt;Pods를 이해하기 전에 몇 가지 전제가 있다.&lt;/p&gt;
&lt;p data-end=&quot;114&quot; data-start=&quot;89&quot; data-ke-size=&quot;size16&quot;&gt;우리는 이미 다음이 준비되어 있다고 가정한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;288&quot; data-start=&quot;116&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;135&quot; data-start=&quot;116&quot; data-section-id=&quot;1bdhrxo&quot;&gt;애플리케이션이 개발되어 있다.&lt;/li&gt;
&lt;li data-end=&quot;171&quot; data-start=&quot;136&quot; data-section-id=&quot;o341p7&quot;&gt;애플리케이션이 &lt;b&gt;Docker 이미지로 빌드&lt;/b&gt;되어 있다.&lt;/li&gt;
&lt;li data-end=&quot;216&quot; data-start=&quot;172&quot; data-section-id=&quot;imuynx&quot;&gt;Docker Hub 같은 &lt;b&gt;Docker 레지스트리에 업로드되어 있다.&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;256&quot; data-start=&quot;217&quot; data-section-id=&quot;atpra6&quot;&gt;Kubernetes가 이미 이미지를 &lt;b&gt;pull 할 수 있다.&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;288&quot; data-start=&quot;257&quot; data-section-id=&quot;nzxrd7&quot;&gt;Kubernetes 클러스터가 이미 구축되어 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;308&quot; data-start=&quot;290&quot; data-ke-size=&quot;size16&quot;&gt;클러스터는 다음과 같을 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;335&quot; data-start=&quot;310&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;322&quot; data-start=&quot;310&quot; data-section-id=&quot;1tancpg&quot;&gt;단일 노드 클러스터&lt;/li&gt;
&lt;li data-end=&quot;335&quot; data-start=&quot;323&quot; data-section-id=&quot;xv7vow&quot;&gt;멀티 노드 클러스터&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;349&quot; data-start=&quot;337&quot; data-ke-size=&quot;size16&quot;&gt;어떤 형태든 상관없다.&lt;/p&gt;
&lt;p data-end=&quot;397&quot; data-start=&quot;351&quot; data-ke-size=&quot;size16&quot;&gt;또한 Kubernetes의 모든 서비스가 &lt;b&gt;정상적으로 실행 중&lt;/b&gt;이라고 가정한다.&lt;/p&gt;
&lt;p data-end=&quot;423&quot; data-start=&quot;414&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;423&quot; data-start=&quot;414&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;목표 : Kubernetes 클러스터의 Worker Node에 컨테이너 형태로 애플리케이션을 배포하는 것&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-end=&quot;528&quot; data-start=&quot;486&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;528&quot; data-start=&quot;486&quot; data-ke-size=&quot;size16&quot;&gt;하지만 Kubernetes는 &lt;b&gt;컨테이너를 직접 노드에 배포하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;554&quot; data-start=&quot;530&quot; data-ke-size=&quot;size16&quot;&gt;대신 컨테이너는 &lt;b&gt;pod&lt;/b&gt;&amp;nbsp;객체 안에서 실행된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;Pod 란?&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;603&quot; data-start=&quot;591&quot; data-ke-size=&quot;size16&quot;&gt;Pod는 다음과 같다.&lt;/p&gt;
&lt;blockquote data-end=&quot;645&quot; data-start=&quot;605&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;p data-end=&quot;645&quot; data-start=&quot;607&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes에서 생성할 수 있는 가장 작은 단위의 객체&lt;br /&gt;애플리케이션의 단일 인스턴스&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;679&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;679&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 가장 간단한 구조는 다음과 같다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;blockquote id=&quot;code-block-viewer&quot; data-ke-style=&quot;style3&quot;&gt;Kubernetes Node &lt;br /&gt;└ Pod &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;└ Container (App)&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;813&quot; data-start=&quot;771&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;788&quot; data-start=&quot;771&quot; data-section-id=&quot;bx01gb&quot;&gt;Pod 안에 컨테이너가 있고&lt;/li&gt;
&lt;li data-end=&quot;813&quot; data-start=&quot;789&quot; data-section-id=&quot;7ipo9j&quot;&gt;컨테이너 안에서 애플리케이션이 실행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;833&quot; data-start=&quot;820&quot; data-section-id=&quot;fnml0z&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h4 data-end=&quot;833&quot; data-start=&quot;820&quot; data-section-id=&quot;fnml0z&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;애플리케이션 스케일링&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;852&quot; data-start=&quot;835&quot; data-ke-size=&quot;size16&quot;&gt;웹 애플리케이션 트래픽이 증가하면 &lt;b&gt;애플리케이션 인스턴스를 늘려야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;916&quot; data-start=&quot;899&quot; data-ke-size=&quot;size16&quot;&gt;이때 선택지는 두 가지가 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;956&quot; data-start=&quot;918&quot;&gt;기존 Pod 안에 컨테이너 추가&lt;/li&gt;
&lt;li data-end=&quot;956&quot; data-start=&quot;918&quot;&gt;새로운 Pod 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;961&quot; data-start=&quot;958&quot; data-ke-size=&quot;size16&quot;&gt;정답은 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;새로운 Pod 생성 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Node&lt;/span&gt;&lt;br /&gt;&lt;span&gt; ├ Pod1 &amp;rarr; App container&lt;/span&gt;&lt;br /&gt;&lt;span&gt; └ Pod2 &amp;rarr; App container&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1085&quot; data-start=&quot;1062&quot; data-ke-size=&quot;size16&quot;&gt;즉 &lt;b&gt;Pod를 복제하여 스케일링&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-end=&quot;1103&quot; data-start=&quot;1092&quot; data-section-id=&quot;173wcfr&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1103&quot; data-start=&quot;1092&quot; data-section-id=&quot;173wcfr&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1103&quot; data-start=&quot;1092&quot; data-section-id=&quot;173wcfr&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;노드 리소스 부족&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1132&quot; data-start=&quot;1105&quot; data-ke-size=&quot;size16&quot;&gt;만약 현재 노드에 리소스가 부족하면 어떻게 할까?&lt;/p&gt;
&lt;p data-end=&quot;1157&quot; data-start=&quot;1134&quot; data-ke-size=&quot;size16&quot;&gt;새로운 노드를 클러스터에 추가할 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;blockquote id=&quot;code-block-viewer&quot; data-ke-style=&quot;style3&quot;&gt;Node1&lt;br /&gt;├ Pod1&lt;br /&gt;└ Pod2&lt;br /&gt;&lt;br /&gt;Node2&lt;br /&gt;└ Pod3&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1238&quot; data-start=&quot;1212&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1238&quot; data-start=&quot;1212&quot; data-section-id=&quot;1e90hrp&quot;&gt;Pod는 여러 노드에 분산 배치될 수 있다.&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-end=&quot;1264&quot; data-start=&quot;1245&quot; data-section-id=&quot;fe7q1q&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Pod와 Container 관계&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1286&quot; data-start=&quot;1266&quot; data-ke-size=&quot;size16&quot;&gt;대부분의 경우 다음 관계가 성립한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Pod : Container = 1 : 1&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1355&quot; data-start=&quot;1328&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1337&quot; data-start=&quot;1328&quot; data-section-id=&quot;1w97m23&quot;&gt;하나의 Pod&lt;/li&gt;
&lt;li data-end=&quot;1355&quot; data-start=&quot;1338&quot; data-section-id=&quot;1cz5a84&quot;&gt;하나의 애플리케이션 컨테이너&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;1371&quot; data-start=&quot;1362&quot; data-section-id=&quot;hqezab&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h4 data-end=&quot;1371&quot; data-start=&quot;1362&quot; data-section-id=&quot;hqezab&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;스케일링 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1389&quot; data-start=&quot;1373&quot; data-ke-size=&quot;size16&quot;&gt;스케일링은 다음과 같이 한다.&lt;/p&gt;
&lt;p data-end=&quot;1396&quot; data-start=&quot;1391&quot; data-ke-size=&quot;size16&quot;&gt;스케일 업&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Pod 추가&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1424&quot; data-start=&quot;1418&quot; data-ke-size=&quot;size16&quot;&gt;스케일 다운&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Pod 삭제&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1452&quot; data-start=&quot;1446&quot; data-ke-size=&quot;size16&quot;&gt;주의할 점:&lt;/p&gt;
&lt;blockquote data-end=&quot;1485&quot; data-start=&quot;1454&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1485&quot; data-start=&quot;1456&quot; data-ke-size=&quot;size16&quot;&gt;기존 Pod에 컨테이너를 추가해서 스케일하지 않는다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 data-end=&quot;1513&quot; data-start=&quot;1492&quot; data-section-id=&quot;1uam3z7&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h4 data-end=&quot;1513&quot; data-start=&quot;1492&quot; data-section-id=&quot;1uam3z7&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Pod에 여러 컨테이너가 가능할까?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1520&quot; data-start=&quot;1515&quot; data-ke-size=&quot;size16&quot;&gt;가능하다.&lt;/p&gt;
&lt;p data-end=&quot;1550&quot; data-start=&quot;1522&quot; data-ke-size=&quot;size16&quot;&gt;Pod에는 &lt;b&gt;여러 컨테이너가 들어갈 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1592&quot; data-start=&quot;1552&quot; data-ke-size=&quot;size16&quot;&gt;하지만 일반적으로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;같은 종류의 컨테이너를 여러 개 넣지는 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1611&quot; data-start=&quot;1594&quot; data-ke-size=&quot;size16&quot;&gt;대신 다음과 같은 경우가 있다.&lt;/p&gt;
&lt;h4 data-end=&quot;1636&quot; data-start=&quot;1618&quot; data-section-id=&quot;1k9wlif&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-end=&quot;1636&quot; data-start=&quot;1618&quot; data-section-id=&quot;1k9wlif&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Helper Container (Sidecar)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1643&quot; data-start=&quot;1638&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1686&quot; data-start=&quot;1645&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1660&quot; data-start=&quot;1645&quot; data-section-id=&quot;yigujp&quot;&gt;웹 애플리케이션 컨테이너&lt;/li&gt;
&lt;li data-end=&quot;1673&quot; data-start=&quot;1661&quot; data-section-id=&quot;1koxwhg&quot;&gt;파일 처리 컨테이너&lt;/li&gt;
&lt;li data-end=&quot;1686&quot; data-start=&quot;1674&quot; data-section-id=&quot;1f3wjts&quot;&gt;로그 처리 컨테이너&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1728&quot; data-start=&quot;1688&quot; data-ke-size=&quot;size16&quot;&gt;같이 &lt;b&gt;보조 역할(helper)&lt;/b&gt; 을 하는 컨테이너가 있을 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;1747&quot; data-start=&quot;1730&quot; data-ke-size=&quot;size16&quot;&gt;이 경우 같은 Pod에 넣는다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;blockquote id=&quot;code-block-viewer&quot; data-ke-style=&quot;style3&quot;&gt;Pod&lt;br /&gt;├ App Container&lt;br /&gt;└ Helper Container&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1825&quot; data-start=&quot;1808&quot; data-section-id=&quot;eygp4&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-end=&quot;1825&quot; data-start=&quot;1808&quot; data-section-id=&quot;eygp4&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;같은 Pod의 컨테이너 특징&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1852&quot; data-start=&quot;1827&quot; data-ke-size=&quot;size16&quot;&gt;같은 Pod 안의 컨테이너는 다음을 공유한다.&lt;/p&gt;
&lt;p data-end=&quot;1852&quot; data-start=&quot;1827&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1866&quot; data-start=&quot;1854&quot;&gt;네트워크: localhost로 서로 통신 가능&lt;/li&gt;
&lt;li data-end=&quot;1913&quot; data-start=&quot;1901&quot;&gt;스토리지: 같은 볼륨 공유 가능&lt;/li&gt;
&lt;li data-end=&quot;1952&quot; data-start=&quot;1940&quot;&gt;생명주기: 같이 생성, 같이 종료=&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;2006&quot; data-start=&quot;1984&quot; data-section-id=&quot;j0d6hk&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Kubernetes가 해결해주는 문제&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2054&quot; data-start=&quot;2008&quot; data-ke-size=&quot;size16&quot;&gt;만약 Kubernetes 없이 Docker만 사용한다면 다음을 직접 관리해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2119&quot; data-start=&quot;2056&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2068&quot; data-start=&quot;2056&quot; data-section-id=&quot;d31v1w&quot;&gt;컨테이너 연결 관계&lt;/li&gt;
&lt;li data-end=&quot;2078&quot; data-start=&quot;2069&quot; data-section-id=&quot;n72et0&quot;&gt;네트워크 연결&lt;/li&gt;
&lt;li data-end=&quot;2086&quot; data-start=&quot;2079&quot; data-section-id=&quot;8laqw9&quot;&gt;볼륨 공유&lt;/li&gt;
&lt;li data-end=&quot;2101&quot; data-start=&quot;2087&quot; data-section-id=&quot;13tqlks&quot;&gt;컨테이너 상태 모니터링&lt;/li&gt;
&lt;li data-end=&quot;2119&quot; data-start=&quot;2102&quot; data-section-id=&quot;bdbd1k&quot;&gt;컨테이너 종료 시 정리 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2138&quot; data-start=&quot;2121&quot; data-ke-size=&quot;size16&quot;&gt;하지만 Kubernetes에서는 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Pod 정의만 하면 자동으로 관리된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2138&quot; data-start=&quot;2121&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2138&quot; data-start=&quot;2121&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;2191&quot; data-start=&quot;2170&quot; data-section-id=&quot;a683yr&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Multi Container Pod&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2215&quot; data-start=&quot;2193&quot; data-ke-size=&quot;size16&quot;&gt;여러 컨테이너가 있는 Pod는 가능하지만 &lt;b&gt;실제 사용 사례는 많지 않다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2256&quot; data-start=&quot;2241&quot; data-ke-size=&quot;size16&quot;&gt;그래서 이 강의에서는 대부분 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Pod = Container 1개 &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;구조를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;h1 data-end=&quot;2314&quot; data-start=&quot;2306&quot; data-section-id=&quot;glzjdd&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h4 data-end=&quot;2314&quot; data-start=&quot;2306&quot; data-section-id=&quot;glzjdd&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Pod 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2340&quot; data-start=&quot;2316&quot; data-ke-size=&quot;size16&quot;&gt;Pod를 생성하려면 다음 명령어를 사용한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre id=&quot;code_1773410805953&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl run nginx --image=nginx&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2408&quot; data-start=&quot;2387&quot; data-ke-size=&quot;size16&quot;&gt;이 명령은 내부적으로 다음을 수행한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2440&quot; data-start=&quot;2410&quot;&gt;Pod 생성&lt;/li&gt;
&lt;li data-end=&quot;2440&quot; data-start=&quot;2410&quot;&gt;nginx 컨테이너 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 data-end=&quot;2457&quot; data-start=&quot;2447&quot; data-section-id=&quot;1h1htui&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h4 data-end=&quot;2457&quot; data-start=&quot;2447&quot; data-section-id=&quot;1h1htui&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;이미지 다운로드&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2477&quot; data-start=&quot;2459&quot; data-ke-size=&quot;size16&quot;&gt;이미지는 DockerHub 위치에서 가져온다.&lt;/p&gt;
&lt;p data-end=&quot;2536&quot; data-start=&quot;2503&quot; data-ke-size=&quot;size16&quot;&gt;Docker Hub는 &lt;b&gt;Docker 이미지 저장소&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 data-end=&quot;2536&quot; data-start=&quot;2503&quot;&gt;사설 레지스트리&lt;/li&gt;
&lt;li data-end=&quot;2566&quot; data-start=&quot;2553&quot; data-section-id=&quot;1xyzv3p&quot;&gt;조직 내부 레지스트리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2579&quot; data-start=&quot;2568&quot; data-ke-size=&quot;size16&quot;&gt;도 사용할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2579&quot; data-start=&quot;2568&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2579&quot; data-start=&quot;2568&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2626&quot; data-start=&quot;2599&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pod 목록&lt;/b&gt;을 확인하려면 다음 명령어를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1773410880085&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get pods
--------------------------------------
NAME     READY   STATUS
nginx    0/1     ContainerCreating&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2752&quot; data-start=&quot;2737&quot; data-ke-size=&quot;size16&quot;&gt;곧 상태가 Running으로 바뀐다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2830&quot; data-start=&quot;2789&quot; data-ke-size=&quot;size16&quot;&gt;지금 상태에서는 nginx 웹 서버가 &lt;b&gt;외부에서 접근 가능하지 않다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2850&quot; data-start=&quot;2832&quot; data-ke-size=&quot;size16&quot;&gt;노드 내부에서는 접근할 수 있지만&lt;/p&gt;
&lt;p data-end=&quot;2866&quot; data-start=&quot;2852&quot; data-ke-size=&quot;size16&quot;&gt;외부 사용자에게 공개하려면 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Service &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;가 필요하다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Infra/K8S</category>
      <author>minsu20</author>
      <guid isPermaLink="true">https://minsu20.tistory.com/93</guid>
      <comments>https://minsu20.tistory.com/93#entry93comment</comments>
      <pubDate>Wed, 4 Mar 2026 23:19:09 +0900</pubDate>
    </item>
    <item>
      <title>KEDA 필요성, HPA 와의 차이점</title>
      <link>https://minsu20.tistory.com/91</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Kubernetes를 운영하면서 가장 큰 장점 중 하나는 트래픽에 따라 파드(Pod)의 수를 자동으로 조절하는 &lt;b&gt;Autoscaling &lt;/b&gt;기능입니다. 우리는 보통 &lt;b&gt;HPA(Horizontal Pod Autoscaler)&lt;/b&gt; 를 통해 이를 구현합니다. 하지만, CPU나 메모리 사용량은 낮은데 처리해야 할 작업(이벤트)이 쌓여 서비스가 지연되는 경험을 해보신 적이 있나요? 이번 글에서는 HPA의 한계를 짚어보고, 이를 보완하기 위해 등장한 KEDA(Kubernetes Event-driven Autoscaling)가 왜 필요한지, 그리고 둘의 차이점은 무엇인지 알아보겠습니다.&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;HPA 란?&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HPA&lt;/b&gt;는 쿠버네티스의 기본 리소스 오토스케일러입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;작동 원리:&lt;/b&gt; 주로 &lt;b&gt;CPU 사용량&lt;/b&gt;이나 &lt;b&gt;메모리 사용량&lt;/b&gt; 같은 리소스 메트릭을 주기적으로 확인하여 스케일링을 결정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점:&lt;/b&gt; 설정이 간편하고, 일반적인 웹 서버와 같이 리소스 사용량이 트래픽과 비례하는 애플리케이션에 적합합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;리소스 기반 스케일링의 한계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HPA는 훌륭하지만, &lt;b&gt;이벤트 기반 아키텍처&lt;/b&gt;에서는 한계가 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;반응 속도의 지연:&lt;/b&gt; 메시지 큐(Kafka, RabbitMQ 등)에 메시지가 1만 개가 쌓여도, 파드가 이를 처리하느라 CPU를 본격적으로 쓰기 전까지는 스케일링이 일어나지 않습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외부 메트릭 연동의 복잡함:&lt;/b&gt; 기본 HPA로 특정 큐의 길이나 외부 API 수치를 기반으로 스케일링하려면, 별도의 Metrics Adapter를 구축해야 하는 등 설정이 매우 복잡해집니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Scale to Zero 불가:&lt;/b&gt; HPA는 기본적으로 최소 1개의 파드를 유지해야 합니다. 작업이 없을 때 아예 0개로 줄여 비용을 절감하는 것이 불가능합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;KEDA (Kubernetes Event-driven Autoscaling)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;KEDA&lt;/b&gt;는 이름 그대로 &lt;b&gt;&quot;이벤트 기반&quot;&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;다양한 Scaler 지원:&lt;/b&gt; Kafka, AWS SQS, Prometheus, Redis 등 60개 이상의 외부 이벤트 소스를 기본적으로 지원합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Scale to Zero:&lt;/b&gt; 처리할 이벤트가 없으면 파드 수를 &lt;b&gt;0으로 줄였다가&lt;/b&gt;, 이벤트가 발생하면 즉시 파드를 생성합니다. (비용 절감 효과)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HPA와의 공존:&lt;/b&gt; KEDA는 HPA를 대체하는 것이 아니라, HPA에게 &quot;언제 스케일링해야 하는지&quot;에 대한 &lt;b&gt;외부 메트릭을 제공하는 역할&lt;/b&gt;을 합니다. (실제 스케일링은 HPA가 수행)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;990&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjeD60/dJMcahb5Q3Q/kJcKYS60Kw8jKEdUHeCFI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjeD60/dJMcahb5Q3Q/kJcKYS60Kw8jKEdUHeCFI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjeD60/dJMcahb5Q3Q/kJcKYS60Kw8jKEdUHeCFI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjeD60%2FdJMcahb5Q3Q%2FkJcKYS60Kw8jKEdUHeCFI0%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;1280&quot; height=&quot;990&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;990&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;pre id=&quot;code_1768746075870&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ScaledObject(사용자 선언)
   &amp;darr; (KEDA Operator)
HPA(자동 생성/관리)
   &amp;darr; (HPA가 질의)
KEDA Metrics Server(external.metrics API)
   &amp;darr; (KEDA Scaler가 이벤트 소스 조회)
Event Source(Kafka/RabbitMQ/Prometheus/CloudWatch/&amp;hellip;)&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;KEDA는 다양한 이벤트 소스에 대응하는 scaler (&lt;a title=&quot;공식 문서 링크&quot; href=&quot;https://keda.sh/docs/2.18/scalers/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;공식문서 링크)&lt;/a&gt;를 제공하고, 각 scaler가 이벤트 기반 활성화 여부 판단과 메트릭 제공을 담당해 HPA가 이를 기반으로 스케일링하도록 연결합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;height: 115px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;th style=&quot;height: 20px;&quot;&gt;비교 항목&lt;/th&gt;
&lt;th style=&quot;height: 20px;&quot;&gt;HPA (기본)&lt;/th&gt;
&lt;th style=&quot;height: 20px;&quot;&gt;KEDA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;스케일링 기준&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;CPU, Memory (리소스 중심)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Queue Length, Lag, Stream 등 (이벤트 중심)&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;반응성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;리소스 사용량이 증가해야 반응 (Reactive)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;이벤트 발생 즉시 반응 (Proactive)&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;Scale to Zero&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;불가능 (최소 1개 유지)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;가능 (0개로 축소 가능)&lt;/b&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;외부 연동&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;복잡함 (Custom Metrics Adapter 필요)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;간편함 (다양한 내장 Scaler 제공)&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;주요 사용처&lt;/b&gt;&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;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Infra/K8S</category>
      <category>k8s</category>
      <category>keda</category>
      <author>minsu20</author>
      <guid isPermaLink="true">https://minsu20.tistory.com/91</guid>
      <comments>https://minsu20.tistory.com/91#entry91comment</comments>
      <pubDate>Sun, 18 Jan 2026 23:24:42 +0900</pubDate>
    </item>
    <item>
      <title>[LIS] 최장 증가 부분 수열</title>
      <link>https://minsu20.tistory.com/90</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;최장 증가 부분 수열(LIS, Longest Increasing Subsequence)란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원소가 n개인 배열의 일부 원소를 골라내서 만든 부분 수열 중, 다음 조건을 만족하는 수열이다.&lt;/p&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;그 길이가 최대이다&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예를 들어, { 6,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;2&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;5&lt;/b&gt;, 1,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;7&lt;/b&gt;, 4,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;8&lt;/b&gt;, 3} 이라는 배열이 있을 경우, LIS는 { 2, 5, 7, 8 } 이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;구현 방법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DP를 이용한 방법&lt;/li&gt;
&lt;li&gt;이분탐색을 이용한 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;DP를 이용한 방법&amp;nbsp;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;알고리즘 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하지만 시간복잡도가 O(n^2)로 이분탐색보다는 큰 알고리즘이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;dp[i]: &amp;nbsp;i번째 인덱스에서 끝나는 최장 증가 부분 수열의 길이&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;/span&gt;라고 한다면,&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;주어진 배열에서 인덱스를 한 칸씩(i+=1) 늘려가면서 확인합니다.&lt;/li&gt;
&lt;li&gt;내부 반복문으로 i보다 작은 인덱스들을 하나씩 살펴(j+=1) 보면서 arr[j] &amp;lt; arr[i]인 것이 있을 경우 &lt;br /&gt;(내부 반복문 변수 j의 배열 값이 현재 인덱스 i 배열 값보다 작다면)&lt;br /&gt;&lt;b&gt;dp[i] = Math.max(dp[i], dp[j] + 1)&lt;/b&gt;로 업데이트한다.&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;dp[i]: 기존의 dp[i]값&lt;/li&gt;
&lt;li&gt;dp[j]+1 : (내부 반복문 변수) j번째 인덱스에서 끝나는 최장 증가 부분 수열의 마지막에 arr[i]를 추가했을 때의 값 (+1)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 dp[i]값 중에서 가장 큰 값이 최장 증가 수열의 길이가 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1722494456222&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class LIS_DP {
    public static void main(String[] args) {
        int arr[] = {3, 2, 4, 1, 6};
        int dp[] = new int[arr.length];
        dp[0] = 1; // LIS의 첫 번째는 항상 1이다.
 
        for (int i = 1; i &amp;lt; arr.length; i++) {
            // 첫 원소부터 i원소 전까지 비교
            for (int j = 0; j &amp;lt; i; j++) {
                if (arr[j] &amp;lt; arr[i]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
                //  증가 부분 수열의 길이는 1부터 시작하므로 0인 값을 1으로 변경해준다.
                if (dp[i] == 0) {
                    dp[i] = 1;
                }
            }
        }
 
        System.out.println(&quot;arr : &quot; + Arrays.toString(arr));
        System.out.println(&quot;DP  : &quot; + Arrays.toString(dp));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kk1Wi/btsIRft2UcO/5KeTo8kxZpxNtJtkmH3o80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kk1Wi/btsIRft2UcO/5KeTo8kxZpxNtJtkmH3o80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kk1Wi/btsIRft2UcO/5KeTo8kxZpxNtJtkmH3o80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKk1Wi%2FbtsIRft2UcO%2F5KeTo8kxZpxNtJtkmH3o80%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;741&quot; height=&quot;664&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;664&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이분탐색을 이용한 방법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;알고리즘 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DP보다는 복잡하지만 시간복잡도가 O(nlogn)으로 DP보다 효율적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;LIS의 형태를 유지하기 위해 주어진 배열의 인덱스를 하나씩 살펴보면서 그&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;숫자가 들어갈 위치를 이분탐색으로 탐색&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;해서 넣는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이분 탐색을 활용할 때는 정확한 수열 값이 아닌 길이를 구해야 할 때 사용한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1722495659111&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.StringTokenizer;

public class Main {
	
	static int[] memo;
	static int INF = Integer.MIN_VALUE;

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int[] arr = new int[n];
		
		StringTokenizer st= new StringTokenizer(br.readLine());
		for(int i=0; i&amp;lt;n; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		memo = new int[n+1];
		int len=0;
		int idx=0;
		for(int i=0; i&amp;lt;n; i++) {
			if(arr[i] &amp;gt; memo[len]) {
				len +=1;
				memo[len] = arr[i];
			}else {
				idx = binarySearch(0,len, arr[i]);
				memo[idx] = arr[i];
			}
		}
		System.out.println(len);
	}
	
	static int binarySearch(int left, int right, int key) {
		int mid =0;
		while(left&amp;lt;right) {
			mid = (left+right)/2;
			if(memo[mid] &amp;lt; key) {
				left = mid+1;
			}else {
				right = mid;
			}
		}
		return right;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dg6nq6/btsITtRImB4/Xz5lIVd8YvKDzO49qjvo3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dg6nq6/btsITtRImB4/Xz5lIVd8YvKDzO49qjvo3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dg6nq6/btsITtRImB4/Xz5lIVd8YvKDzO49qjvo3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdg6nq6%2FbtsITtRImB4%2FXz5lIVd8YvKDzO49qjvo3k%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;705&quot; height=&quot;761&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;761&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>CS/Algorithm</category>
      <category>lis</category>
      <author>minsu20</author>
      <guid isPermaLink="true">https://minsu20.tistory.com/90</guid>
      <comments>https://minsu20.tistory.com/90#entry90comment</comments>
      <pubDate>Thu, 1 Aug 2024 16:02:29 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 2225번: 합분해 -JAVA</title>
      <link>https://minsu20.tistory.com/89</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제 바로 가기 &amp;gt; &lt;a href=&quot;https://www.acmicpc.net/problem/2225&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;2225번: 합분해&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1947&quot; data-origin-height=&quot;2396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/COM4O/btsIReaHNy0/KAWWFXk1FUXd8MsgkmXa9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/COM4O/btsIReaHNy0/KAWWFXk1FUXd8MsgkmXa9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/COM4O/btsIReaHNy0/KAWWFXk1FUXd8MsgkmXa9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCOM4O%2FbtsIReaHNy0%2FKAWWFXk1FUXd8MsgkmXa9k%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;1947&quot; height=&quot;2396&quot; data-origin-width=&quot;1947&quot; data-origin-height=&quot;2396&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;blockquote data-ke-style=&quot;style2&quot;&gt;다이나믹 프로그래밍을 풀 수 있는 문제이다.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알고리즘 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 입력에 예제처럼 6, 4가 주어졌다면&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;6= 0(3번 더해서 0이 되는 경우) + 6&lt;br /&gt;6= 1 (3번 더해서 1이 되는 경우) + 5&lt;br /&gt;6= 2 (3번 더해서 2가 되는 경우) + 4&lt;br /&gt;6= 3 (3번 더해서 3이 되는 경우) + 3&lt;br /&gt;6= 4 (3번 더해서 4가 되는 경우) + 2&lt;br /&gt;6= 5 (3번 더해서 5가 되는 경우) + 1&lt;br /&gt;6= 6 (3번 더해서 6이 되는 경우) + 0&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;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;&lt;b&gt;dp[K][N]: N이하의 정수를 K번 더해서 합이 N이 되는 경우의 수&lt;/b&gt;&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;dp[4][6]=dp[3][0]+dp[3][1]+dp[3][2]+dp[3][3]+dp[3][4]+dp[3][5]+dp[3][6];&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 일반화한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;dp[K][N]=&lt;span style=&quot;color: #006dd7;&quot;&gt;dp[K-1][0]+dp[K-1][1]+dp[K-1][2]+...+dp[K-1][N-1]&lt;/span&gt;+&lt;span style=&quot;color: #ee2323;&quot;&gt;dp[K-1][N]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;dp[K-1][0]+dp[K-1][1]+dp[K-1][2]+...+dp[K-1][N-1]=dp[K][N-1]&lt;/b&gt;&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;따라서&lt;b&gt; dp[K][N]=&lt;span style=&quot;color: #006dd7;&quot;&gt;dp[K][N-1]&lt;/span&gt;+&lt;span style=&quot;color: #ee2323;&quot;&gt;dp[K-1][N]&lt;/span&gt;&lt;/b&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;/h2&gt;
&lt;pre id=&quot;code_1722488372652&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;
import java.io.*;

public class _2225 {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st=new StringTokenizer(br.readLine());
        int n=Integer.parseInt(st.nextToken()); //최대수
        int k=Integer.parseInt(st.nextToken()); //가지수
        long DIV_NUM=1000000000;

        long max=0;
        long[][] dp=new long[k+1][n+1];
        for(int i=1;i&amp;lt;=k;i++){
            dp[i][0]=1;
        }

        for(int i=1;i&amp;lt;=k;i++){
            for(int j=1;j&amp;lt;=n;j++){
                dp[i][j]=(dp[i-1][j]+dp[i][j-1])%DIV_NUM;
            }
        }

        System.out.println(dp[k][n]);

    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>ProblemSolve/BOJ</category>
      <author>minsu20</author>
      <guid isPermaLink="true">https://minsu20.tistory.com/89</guid>
      <comments>https://minsu20.tistory.com/89#entry89comment</comments>
      <pubDate>Thu, 1 Aug 2024 13:59:37 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 4384번: 공평하게 팀 나누기 -JAVA</title>
      <link>https://minsu20.tistory.com/88</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제 바로 가기 &amp;gt; &lt;a href=&quot;https://www.acmicpc.net/problem/4384&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;4384번: 공평하게 팀 나누기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1938&quot; data-origin-height=&quot;1872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zFIZG/btsIRdvTkF0/wcC1UNXPdY8tUzuXkfhxKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zFIZG/btsIRdvTkF0/wcC1UNXPdY8tUzuXkfhxKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zFIZG/btsIRdvTkF0/wcC1UNXPdY8tUzuXkfhxKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzFIZG%2FbtsIRdvTkF0%2FwcC1UNXPdY8tUzuXkfhxKK%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;1938&quot; height=&quot;1872&quot; data-origin-width=&quot;1938&quot; data-origin-height=&quot;1872&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;0/1 냅색 알고리즘으로, DP로 풀 수 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 '부분집합의 합' 문제의 변형으로 볼 수 있다. 우리의 목표는 &lt;b&gt;전체 무게의 절반에 가장 가까운 부분집합&lt;/b&gt;을 찾는 것이다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;2차원 boolean 배열 dp를 사용합니다.&lt;/li&gt;
&lt;li&gt;dp[i][j]는 i명의 사람을 선택하여 정확히 j 무게를 만들 수 있는지 여부를 나타낸다 (true/false)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;알고리즘&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. dp 배열 초기화: dp[0][0] = true (0명으로 0kg을 만들 수 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 각 참가자에 대해:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1명부터 전체 인원의 절반까지 선택하는 경우를 고려&lt;/li&gt;
&lt;li&gt;가능한 모든 무게 조합을 계산하여 dp 배열 갱신&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1722434327626&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int i=0; i&amp;lt;n; i++){
    for(int j=n/2; j&amp;gt;0; j--){
        for(int k=totalWeight; k&amp;gt;=weights[i]; k--){
            dp[j][k] = dp[j][k] || dp[j-1][k-weights[i]];
        }
    }
}&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;3. dp[전체 인원의 절반][k]가 true인 k 중 전체 무게의 절반에 가장 가까운 값 선택&lt;/p&gt;
&lt;pre id=&quot;code_1722434357019&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int k=0;k&amp;lt;=totalWeight;k++){
    if(dp[n/2][k]){
        int a=k;
        int b=totalWeight-a;
        int curDif=Math.abs(a-b);
        if(minDif&amp;gt;curDif){
            minDif=curDif;
            team1weight=k;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력이 다음과 같이 주어졌다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;4&lt;br /&gt;30&lt;br /&gt;40&lt;br /&gt;50&lt;br /&gt;60&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step1. 배열 초기화&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 34.6512%; text-align: center;&quot; bgcolor=&quot;#D9E5FF&quot;&gt;j/k&lt;/td&gt;
&lt;td style=&quot;width: 31.8605%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 34.6512%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 31.8605%; text-align: center;&quot;&gt;T&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step2. dp배열 갱신&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;i = 0 (30kg 참가자 추가)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;j = 2 (2명)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k는 180부터 30까지 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;j = 1 (2명)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k는 180부터 30까지 감소&lt;/li&gt;
&lt;li&gt;dp[1][30] = dp[1][30] || dp[0][0] = true&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 34.6512%;&quot;&gt;j/k&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 31.8605%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 33.3721%;&quot;&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 34.6512%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 31.8605%;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 33.3721%;&quot;&gt;F&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 34.6512%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 31.8605%;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 33.3721%;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 34.6512%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 31.8605%;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 33.3721%;&quot;&gt;F&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;i = 1 (40kg 참가자 추가)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;j = 2 (2명)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k는 180부터 40까지 감소&amp;nbsp;&lt;/li&gt;
&lt;li&gt;dp[2][70] = dp[2][70] || dp[1][30] = true&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;j = 1 (1명)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k는 180부터 40까지 감소&lt;/li&gt;
&lt;li&gt;dp[1][40] = dp[1][40] || dp[0][0] = true&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 68px;&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; text-align: center; width: 19.8837%;&quot;&gt;j/k&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 20.2326%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 20.814%;&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 19.4185%;&quot;&gt;40&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 19.4187%;&quot;&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 19.8837%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 20.2326%;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 20.814%;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 19.4185%;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 19.4187%;&quot;&gt;F&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 19.8837%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 20.2326%;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 20.814%;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 19.4185%;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 19.4187%;&quot;&gt;F&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 19.8837%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 20.2326%;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 20.814%;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 19.4185%;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 19.4187%;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;i = 2 (50kg 참가자 추가)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;j = 2 (2명)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k는 180부터 50까지 감소&lt;/li&gt;
&lt;li&gt;dp[2][90] = dp[2][90] || dp[1][40] = true&lt;/li&gt;
&lt;li&gt;dp[2][80] = dp[2][80] || dp[1][30] = true&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;j = 1 (1명)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k는 180부터 50까지 감소&lt;/li&gt;
&lt;li&gt;dp[1][50] = dp[1][50] || dp[0][0] = true&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 68px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; height: 17px; text-align: center;&quot;&gt;j/k&lt;/td&gt;
&lt;td style=&quot;width: 13.1396%; height: 17px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 12.7906%; height: 17px; text-align: center;&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;width: 10.6395%; height: 17px; text-align: center;&quot;&gt;40&lt;/td&gt;
&lt;td style=&quot;width: 12.6162%; text-align: center;&quot;&gt;50&lt;/td&gt;
&lt;td style=&quot;width: 11.7442%; height: 17px; text-align: center;&quot;&gt;70&lt;/td&gt;
&lt;td style=&quot;width: 11.3953%; height: 17px; text-align: center;&quot;&gt;80&lt;/td&gt;
&lt;td style=&quot;width: 13.721%; height: 17px; text-align: center;&quot;&gt;90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; text-align: center; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 13.1396%; text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;width: 12.7906%; text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;width: 10.6395%; text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;width: 12.6162%; text-align: center;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;width: 11.7442%; text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;width: 11.3953%; text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;width: 13.721%; text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; text-align: center; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 13.1396%; text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;width: 12.7906%; text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;width: 10.6395%; text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;width: 12.6162%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.7442%; text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;width: 11.3953%; text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;width: 13.721%; text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.8372%; text-align: center; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 13.1396%; text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;width: 12.7906%; text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;width: 10.6395%; text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;width: 12.6162%; text-align: center;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;width: 11.7442%; text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;width: 11.3953%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.721%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;i = 3 (60kg 참가자 추가)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;j= 2 (2명)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k는 180부터 60까지 감소&lt;/li&gt;
&lt;li&gt;dp[2][120] = dp[2][120] || dp[1][60] = true&lt;/li&gt;
&lt;li&gt;dp[2][110] = dp[2][110] || dp[1][50] = true&lt;/li&gt;
&lt;li&gt;dp[2][100] = dp[2][100] || dp[1][40] = true&lt;/li&gt;
&lt;li&gt;dp[2][90] = dp[2][90] || dp[1][30] = true&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;j = 1 (1명)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k는 180부터 60까지 감소&lt;/li&gt;
&lt;li&gt;dp[1][60] = dp[1][60] || dp[0][0] = true&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 68px;&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;text-align: center; height: 17px;&quot;&gt;j/k&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;40&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;50&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;60&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;70&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;80&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;90&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;110&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Step3. dp[전체 인원의 절반][k]가 true인 k 중 전체 무게의 절반에 가장 가까운 값 선택&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[2][k]가 true인 k중에서 무게의 절반(90)에 가장 가까운 값은&lt;b&gt; 90&lt;/b&gt;이다.&lt;br /&gt;따라서 답은 90 90이 된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 32px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&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; text-align: center;&quot;&gt;j/k&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;40&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;50&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;60&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;70&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;80&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;90&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;110&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 15px;&quot;&gt;
&lt;td style=&quot;height: 15px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;height: 15px; text-align: center;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;height: 15px; text-align: center;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;height: 15px; text-align: center;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;height: 15px; text-align: center;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;height: 15px; text-align: center;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;height: 15px; text-align: center;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;height: 15px; text-align: center;&quot;&gt;T&lt;/td&gt;
&lt;td style=&quot;height: 15px; text-align: center;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 15px; text-align: center;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 15px; text-align: center;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 15px; text-align: center;&quot;&gt;&lt;b&gt;T&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전체 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1722437135529&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;

public class _4384 {

    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(br.readLine());
        int[] weights=new int[n+1];
        int totalWeight=0;
        int minDif=Integer.MAX_VALUE;
        int team1weight=0;
        int team2weight=0;

        for(int i=0;i&amp;lt;n;i++){
            weights[i]=Integer.parseInt(br.readLine());
            totalWeight+=weights[i];
        }
        boolean[][] dp=new boolean[n][totalWeight+1];


        dp[0][0]=true;

        for(int i=0;i&amp;lt;n;i++){
            for(int j=n/2;j&amp;gt;0;j--){
                for(int k=totalWeight;k&amp;gt;=weights[i];k--){
                    dp[j][k]=dp[j][k]||dp[j-1][k-weights[i]];
                }
            }
        }


        for(int k=0;k&amp;lt;=totalWeight;k++){
            if(dp[n/2][k]){
                int a=k;
                int b=totalWeight-a;
                int curDif=Math.abs(a-b);
                if(minDif&amp;gt;curDif){
                    minDif=curDif;
                    team1weight=k;
                }
            }
        }

        team2weight=totalWeight-team1weight;

        if(team1weight&amp;gt;team2weight){
            int temp=team1weight;
            team1weight=team2weight;
            team2weight=temp;
        }

        System.out.println(team1weight+&quot; &quot;+team2weight);

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ProblemSolve/BOJ</category>
      <category>dp</category>
      <category>냅색알고리즘</category>
      <author>minsu20</author>
      <guid isPermaLink="true">https://minsu20.tistory.com/88</guid>
      <comments>https://minsu20.tistory.com/88#entry88comment</comments>
      <pubDate>Wed, 31 Jul 2024 23:22:20 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 11000번: 강의실 배정 - JAVA</title>
      <link>https://minsu20.tistory.com/87</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제 바로가기&amp;gt; &lt;a href=&quot;https://www.acmicpc.net/problem/11000&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;11000번: 강의실 배정&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2133&quot; data-origin-height=&quot;2141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbAYBn/btsIRNiq8pM/eCgcrLjZiHhjDc0W16aq3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbAYBn/btsIRNiq8pM/eCgcrLjZiHhjDc0W16aq3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbAYBn/btsIRNiq8pM/eCgcrLjZiHhjDc0W16aq3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbAYBn%2FbtsIRNiq8pM%2FeCgcrLjZiHhjDc0W16aq3k%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;2133&quot; height=&quot;2141&quot; data-origin-width=&quot;2133&quot; data-origin-height=&quot;2141&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;blockquote data-ke-style=&quot;style2&quot;&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;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;1 &amp;le; N &amp;le; 200,000이므로 브루트포스를 돌리면 당연히&amp;nbsp;&lt;b&gt;시간초과&lt;/b&gt;가 난다. &lt;br /&gt;따라서&amp;nbsp;&lt;b&gt;정렬&lt;/b&gt;을 이용한&amp;nbsp;&lt;b&gt;우선순위 큐&lt;/b&gt;를 이용해 그리디 알고리즘으로 풀어야 한다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;/span&gt;&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;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;정렬 기준&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;그렇다면 어떤 기준으로 정렬을 해야할까?&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&lt;/span&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;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시작 시각&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;으로 정렬&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;을 해야 앞에서부터 차곡 차곡 강의 간의 텀을 짧게 해 배정이 가능한 것이었다.&lt;/span&gt;&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;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;정렬 자체는 시작 시각을 기준으로 하였지만, 결국 어떤 강의가 들어갈 자리를 찾기 위해서는 종료시각과 비교를 해야 한다.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 그러기 위해서는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;종료 시각을 담는 우선순위 큐&lt;/span&gt;가&lt;/b&gt; 필요하다. 이때 당연히 오름차순으로 정렬을 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 우선순위 큐에서 top위치값은&amp;nbsp;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;종료시각이 가장 빠른 강의의 종료시각이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 앞에서 정렬한 모든&amp;nbsp;&lt;b&gt;강의의 시작 시각&lt;/b&gt;과 우선순위 큐의 top와 비교한다. (반복문)&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약, 현재 강의의 시작 시각 &amp;gt;= 우선순위 큐의 top (종료시각)&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;top에 있는 강의를 poll()&lt;/b&gt; (제거)&lt;/li&gt;
&lt;li&gt;현재 강의의 종료시각을 우선순위 큐에 넣는다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;poll() x&lt;/li&gt;
&lt;li&gt;현재 강의의 종료 시각을 우선순위 큐에 넣는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 새로운 강의실에 강의를 배정하는 것이다. (우선순위 큐의 사이즈 1 증가)&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 모든 강의가 배정이 되었다면, 우선순위 큐의 사이즈가&amp;nbsp;&lt;b&gt;강의실의 개수&lt;/b&gt;가 된다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&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;style7&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;왜 종료시각을 기준으로 오름차순하면 안될까?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;반례&lt;/b&gt;를 통해 종료시각을 기준으로 오름차순 정렬을 하면 안되는 이유를 살펴보자.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1&amp;nbsp;3&lt;br /&gt;2&amp;nbsp;5&lt;br /&gt;4&amp;nbsp;12&lt;br /&gt;7&amp;nbsp;8&lt;br /&gt;7&amp;nbsp;11&lt;br /&gt;9&amp;nbsp;10&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&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;h4 data-ke-size=&quot;size20&quot;&gt;1) 시작시각 오름차순 정렬&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오름차순으로 시작 시각을 정렬하면&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1 3 - 강의 1&lt;br /&gt;2 5 - 강의 2&lt;br /&gt;4 12 - 강의 3&lt;br /&gt;7 8 - 강의 4&lt;br /&gt;7 11 - 강의 5&lt;br /&gt;9 10 - 강의 6&lt;/blockquote&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;강의 1부터 강의 6까지 반복해서 강의의 시작시각과 우선순위 큐의 종료시각을 비교하면 된다.&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;강의 1에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종료시각이 3이므로,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선순위 큐: 3&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 36px;&quot; border=&quot;1&quot; width=&quot;1200&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; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; height: 19px; text-align: center;&quot; colspan=&quot;2&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;강의 2에서는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;우선순위 큐의 top(3)&amp;gt;현재 강의실의 시작시각(2)이므로 poll x&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;우선순위 큐: 3, 5&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;500&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; colspan=&quot;2&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; colspan=&quot;3&quot; width=&quot;300&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의 3에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 큐의 top(3)&amp;lt;현재 강의실의 시작시각(4)이므로 poll o&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선순위 큐: 5, 12&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;1200&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; colspan=&quot;2&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; colspan=&quot;8&quot; width=&quot;800&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; colspan=&quot;3&quot; width=&quot;300&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의 4에서는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 큐의 top(5)&amp;lt;현재 강의실의 시작시각(7)이므로 poll o&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선순위 큐: 8, 12&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;1200&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; colspan=&quot;2&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; colspan=&quot;8&quot; width=&quot;800&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; colspan=&quot;3&quot; width=&quot;300&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의 5에서는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 큐의 top(8)&amp;gt;현재 강의실의 시작시각이므로 poll x&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선순위 큐: 8, 11, 12&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;1200&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; colspan=&quot;2&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; colspan=&quot;8&quot; width=&quot;800&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; colspan=&quot;3&quot; width=&quot;300&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #92d050; text-align: center;&quot; colspan=&quot;4&quot; width=&quot;400&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의 6에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 큐의 top(8)&amp;lt;현재 강의실의 시작시각이므로 poll o&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선순위 큐: 10, 11, 12&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;1200&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00;&quot; colspan=&quot;2&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00;&quot; colspan=&quot;8&quot; width=&quot;800&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000;&quot; colspan=&quot;3&quot; width=&quot;300&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #92d050;&quot; colspan=&quot;4&quot; width=&quot;400&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서&lt;b&gt; 강의실은 총 3개&lt;/b&gt;가 나온다.&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) 종료시각 오름차순 정렬&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오름차순으로 종료 시각을 정렬하면&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1&amp;nbsp;3&amp;nbsp;-&amp;nbsp;강의&amp;nbsp;1&lt;br /&gt;2&amp;nbsp;5&amp;nbsp;-&amp;nbsp;강의&amp;nbsp;2&lt;br /&gt;7&amp;nbsp;8&amp;nbsp;-&amp;nbsp;강의&amp;nbsp;3&lt;br /&gt;9&amp;nbsp;10&amp;nbsp;-&amp;nbsp;강의&amp;nbsp;4&lt;br /&gt;7&amp;nbsp;11&amp;nbsp;-&amp;nbsp;강의&amp;nbsp;5&lt;br /&gt;4&amp;nbsp;12&amp;nbsp;-&amp;nbsp;강의&amp;nbsp;6&lt;/blockquote&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;강의 1부터 강의 6까지 반복해서 강의의 시작시각과 우선순위 큐의 종료시각을 비교하면 된다.&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;강의 1에서는&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;종료시각이 3이므로,&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선순위 큐: 3&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 36px;&quot; border=&quot;1&quot; width=&quot;1200&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 17px; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; height: 19px; text-align: center;&quot; colspan=&quot;2&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;강의 2에서는&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;우선순위 큐의 top(3)&amp;gt;현재 강의실의 시작시각(2)이므로 poll x&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;우선순위 큐: 3, 5&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;500&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; colspan=&quot;2&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; colspan=&quot;3&quot; width=&quot;300&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;강의 3에서는&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우선순위 큐의 top(3)&amp;lt;현재 강의실의 시작시각(7)이므로 poll o&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선순위 큐 :&amp;nbsp; 5, 8&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 55px;&quot; border=&quot;1&quot; width=&quot;800&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; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; height: 19px; text-align: center;&quot; colspan=&quot;2&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실B&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; height: 19px; text-align: center;&quot; colspan=&quot;3&quot; width=&quot;300&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의 4에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 큐의 top(5)&amp;lt;현재 강의실의 시작시각(9)이므로 poll o&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선순위 큐: 8, 10&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;1000&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; colspan=&quot;2&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; colspan=&quot;3&quot; width=&quot;300&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt; 4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의 5에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 큐의 top(8)&amp;gt;현재 강의실의 시작시각(7)이므로 poll x&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선순위 큐: 8, 10, 11&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;1100&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; colspan=&quot;2&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; colspan=&quot;3&quot; width=&quot;300&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt; 4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #92d050; text-align: center;&quot; colspan=&quot;4&quot; width=&quot;400&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의 6에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 큐의 top(8)&amp;gt;현재 강의실의 시작시각(4)이므로 poll x&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선순위 큐: 8, 10, 11, 12&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;1200&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; colspan=&quot;2&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffff00; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; colspan=&quot;3&quot; width=&quot;300&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffc000; text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt; 4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #92d050; text-align: center;&quot; colspan=&quot;4&quot; width=&quot;400&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의실&lt;span&gt; D&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot; width=&quot;100&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;　&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #00b0f0; text-align: center;&quot; colspan=&quot;8&quot; width=&quot;800&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;따라서 종료시각을 기준으로 오름차순 정렬하면 총 4개의 강의실이 생기고 시작시각을 기준으로 오름차순 정렬하면 총 3개의 강의실이 생기므로 시작시간을 기준으로 오름차순해야 최소의 강의실 개수가 도출된다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;</description>
      <category>ProblemSolve/BOJ</category>
      <category>그리디 알고리즘</category>
      <author>minsu20</author>
      <guid isPermaLink="true">https://minsu20.tistory.com/87</guid>
      <comments>https://minsu20.tistory.com/87#entry87comment</comments>
      <pubDate>Mon, 29 Jul 2024 18:45:49 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 20055번: 컨베이어 벨트 위의 로봇 - JAVA</title>
      <link>https://minsu20.tistory.com/86</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제 바로가기 &amp;gt; &lt;a href=&quot;https://www.acmicpc.net/problem/20055&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;20055번: 컨베이어&amp;nbsp;벨트&amp;nbsp;위의&amp;nbsp;로봇&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2049&quot; data-origin-height=&quot;4199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwEDTr/btsINarRi9x/B31WGfKMBURa3pw1GrBF7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwEDTr/btsINarRi9x/B31WGfKMBURa3pw1GrBF7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwEDTr/btsINarRi9x/B31WGfKMBURa3pw1GrBF7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwEDTr%2FbtsINarRi9x%2FB31WGfKMBURa3pw1GrBF7K%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;2049&quot; height=&quot;4199&quot; data-origin-width=&quot;2049&quot; data-origin-height=&quot;4199&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;&lt;b&gt;단계마다 이동을 할 때 각 단계마다 다음 두 조건을 반드시 지켜야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 로봇은 1번칸인 올리는 위치에서만 올릴 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 로봇은 N번칸인 내리는 위치에 도달하면 언제든지 내려야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 단계마다 함수로 구현해준다.&lt;/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;Step 1 . &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;/li&gt;
&lt;li&gt;로봇을 이동시켜준다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이때, 위에 언급한 조건때문에 robot[N-1] (N칸) 위치와 robot[0] (1번째 칸) 위치를 false로 시켜줘야 한다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;robot[N-1]=false: 내리는 위치에 도달하면 언제든 내려야 한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;robot[0]=false: 로봇은 올리는 위치에서 3번째 Step에서만 올릴 수 있지, 로봇이 2N칸에서 1칸으로 이동하면 안된다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1721890300334&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   public static void rotate() {
        //벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
        //언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다.
        //이때 robot[2N-1]위치에 있는 로봇은 robot[0]에 추가하면 안된다.
        int temp = map[2 * N - 1];
        for (int i = 2 * N - 1; i &amp;gt; 0; i--) {
            map[i] = map[i - 1];
        }
        map[0] = temp;

        for (int i = N - 1; i &amp;gt; 0; i--) {
            robot[i] = robot[i - 1];
        }
        robot[0] = false;
        robot[N - 1] = false;
    }&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;b&gt;Step 2.&lt;/b&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;/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;로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.&lt;/li&gt;
&lt;li&gt;이동하면 내구도는 1 감소한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #282c34; color: #bbbbbb;&quot;&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;public static void move() {
    //가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다.
    // 만약 이동할 수 없다면 가만히 있는다.
    //로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
    for (int i = N - 2; i &amp;gt;= 0; i--) {
        if (robot[i]) {
            if (!robot[i + 1] &amp;amp;&amp;amp; map[i + 1] &amp;gt;= 1) {
                robot[i + 1] = true;
                map[i + 1]--;
                robot[i] = false;
            }
        }

        robot[N - 1] = false;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 3&lt;/b&gt;. 로봇 올리기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;이때도 내구도는 1 감소한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #282c34; color: #bbbbbb;&quot;&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;public static void addRobot() {
    //올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
    if (map[0] &amp;gt; 0) {
        map[0]--;
        robot[0] = true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 4. 내구도 검사&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;내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #282c34; color: #bbbbbb;&quot;&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;public static boolean check() {
    int zero = 0;
    for (int i = 0; i &amp;lt; 2 * N; i++) {
        if (map[i] == 0)
            zero++;
    }
    return zero &amp;gt;= K;
}&lt;/code&gt;&lt;/pre&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 코드&lt;/p&gt;
&lt;div style=&quot;background-color: #282c34; color: #bbbbbb;&quot;&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class _20055 {
    public static int[] map;
    public static boolean[] robot;
    public static int N, K;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
        map = new int[N * 2];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i &amp;lt; 2 * N; i++) {
            map[i] = Integer.parseInt(st.nextToken());
        }
        robot = new boolean[N];
        simulation();
    }

    public static void simulation() {
        int i = 0;
        while (!check()) {
            rotate();
            move();
            addRobot();
            i++;
        }
        System.out.println(i);
    }

    public static void rotate() {
        //벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
        //언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다.
        //이때 robot[2N-1]위치에 있는 로봇은 robot[0]에 추가하면 안된다.
        int temp = map[2 * N - 1];
        for (int i = 2 * N - 1; i &amp;gt; 0; i--) {
            map[i] = map[i - 1];
        }
        map[0] = temp;

        for (int i = N - 1; i &amp;gt; 0; i--) {
            robot[i] = robot[i - 1];
        }
        robot[0] = false;
        robot[N - 1] = false;
    }

    public static void move() {
        //가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다.
        // 만약 이동할 수 없다면 가만히 있는다.
        //로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
        for (int i = N - 2; i &amp;gt;= 0; i--) {
            if (robot[i]) {
                if (!robot[i + 1] &amp;amp;&amp;amp; map[i + 1] &amp;gt;= 1) {
                    robot[i + 1] = true;
                    map[i + 1]--;
                    robot[i] = false;
                }
            }

            robot[N - 1] = false;
        }

    }

    public static void addRobot() {
        //올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
        if (map[0] &amp;gt; 0) {
            map[0]--;
            robot[0] = true;
        }
    }

    public static boolean check() {
        int zero = 0;
        for (int i = 0; i &amp;lt; 2 * N; i++) {
            if (map[i] == 0)
                zero++;
        }
        return zero &amp;gt;= K;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>ProblemSolve/BOJ</category>
      <author>minsu20</author>
      <guid isPermaLink="true">https://minsu20.tistory.com/86</guid>
      <comments>https://minsu20.tistory.com/86#entry86comment</comments>
      <pubDate>Thu, 25 Jul 2024 15:58:01 +0900</pubDate>
    </item>
  </channel>
</rss>