<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>IT모저모</title>
    <link>https://uchive.tistory.com/</link>
    <description>까먹지 않고 제 지식으로 만들기 위해 작성중입니다 
많은 도움 주세요</description>
    <language>ko</language>
    <pubDate>Thu, 9 Apr 2026 05:25:48 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>얀타호수</managingEditor>
    <image>
      <title>IT모저모</title>
      <url>https://tistory1.daumcdn.net/tistory/6277728/attach/6fffb8616fbb45ec919c66051f3813cc</url>
      <link>https://uchive.tistory.com</link>
    </image>
    <item>
      <title>JWT 구조 및 Token 발급 과정</title>
      <link>https://uchive.tistory.com/61</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JWT(JSON Web Token)&lt;/b&gt;는 &amp;ldquo;JSON 형태로 표현된 웹 토큰&amp;rdquo; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT는 인증(Authentication)과 인가(Authorization)를 위해 사용되는 &lt;b&gt;토큰 기반 인증 방식&lt;/b&gt;입니다ㅓ.&lt;br /&gt;사용자가 로그인하면 서버가 &amp;ldquo;이 사용자는 인증된 사용자임&amp;rdquo;을 증명하는 &lt;b&gt;서명된 토큰&lt;/b&gt;을 만들어 주고&lt;br /&gt;이 토큰을 클라이언트가 이후 요청마다 들고 다니면서 인증을 대신합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5UgrB/dJMcahvZi7Q/JbwSCkDUQuruylBkZCpFf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5UgrB/dJMcahvZi7Q/JbwSCkDUQuruylBkZCpFf0/img.png&quot; data-alt=&quot;출처: Google&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5UgrB/dJMcahvZi7Q/JbwSCkDUQuruylBkZCpFf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5UgrB%2FdJMcahvZi7Q%2FJbwSCkDUQuruylBkZCpFf0%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;516&quot; height=&quot;186&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: Google&lt;/figcaption&gt;
&lt;/figure&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;117&quot; data-start=&quot;101&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ JWT 구조 이해&lt;/h2&gt;
&lt;p data-end=&quot;135&quot; data-start=&quot;118&quot; data-ke-size=&quot;size16&quot;&gt;JWT는 세 부분으로 나뉩니다.&lt;/p&gt;
&lt;p data-end=&quot;135&quot; data-start=&quot;118&quot; 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;217&quot; data-start=&quot;171&quot;&gt;&lt;b&gt;Header&lt;/b&gt;: 토큰 타입(JWT)과 해시 알고리즘(예: HS256) 정의&lt;/li&gt;
&lt;li data-end=&quot;285&quot; data-start=&quot;218&quot;&gt;&lt;b&gt;Payload&lt;/b&gt;: 토큰에 담길 정보(claims) &amp;mdash; 보통 sub, iat, exp, role 등&lt;/li&gt;
&lt;li data-end=&quot;344&quot; data-start=&quot;286&quot;&gt;&lt;b&gt;Signature&lt;/b&gt;: Header와 Payload를 합쳐 비밀키로 서명한 값, 토큰 변조 방지용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762911189704&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HEADER.PAYLOAD.SIGNATURE&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;104&quot; data-start=&quot;91&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ 사용자 인증&lt;/h2&gt;
&lt;p data-end=&quot;133&quot; data-start=&quot;105&quot; data-ke-size=&quot;size16&quot;&gt;JWT 발급의 첫 단계는 &lt;b&gt;사용자 인증&lt;/b&gt;입니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;158&quot; data-start=&quot;135&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;158&quot; data-start=&quot;135&quot;&gt;클라이언트가 로그인 요청을 보냅니다.&lt;/li&gt;
&lt;li data-end=&quot;158&quot; data-start=&quot;135&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;서버에서 전달받은 username과 password를 DB에서 조회 후 검증합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;445&quot; data-start=&quot;321&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;424&quot; data-start=&quot;321&quot;&gt;패스워드는 일반적으로 &lt;b&gt;BCrypt 등으로 암호화&lt;/b&gt; 되어 있어, passwordEncoder.matches(rawPassword, encodedPassword)로 비교합니다.&lt;/li&gt;
&lt;li data-end=&quot;445&quot; data-start=&quot;428&quot;&gt;인증 실패 시 401을 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1762911240913&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;POST /login
Content-Type: application/json

{
  &quot;username&quot;: &quot;user1&quot;,
  &quot;password&quot;: &quot;1234&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;468&quot; data-start=&quot;452&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣&lt;span&gt;&amp;nbsp;&lt;/span&gt;JWT 토큰 생성&lt;/h2&gt;
&lt;p data-end=&quot;503&quot; data-start=&quot;469&quot; data-ke-size=&quot;size16&quot;&gt;사용자 인증이 성공하면 &lt;b&gt;서버가 JWT를 발급&lt;/b&gt;합니다.&lt;/p&gt;
&lt;h4 data-end=&quot;519&quot; data-start=&quot;505&quot; data-ke-size=&quot;size20&quot;&gt;JWT 생성 흐름:&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1021&quot; data-start=&quot;520&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;619&quot; data-start=&quot;520&quot;&gt;&lt;b&gt;Header&lt;/b&gt;: 토큰 타입과 해시 알고리즘 지정&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;619&quot; data-start=&quot;520&quot;&gt;&lt;b&gt;Payload&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;/li&gt;
&lt;li data-end=&quot;619&quot; data-start=&quot;520&quot;&gt;&lt;b&gt;Signature&lt;/b&gt;: Header + Payload를 비밀키로 서명&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;h2 data-end=&quot;1690&quot; data-start=&quot;1671&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ 클라이언트에 토큰 전달&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1726&quot; data-start=&quot;1691&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1726&quot; data-start=&quot;1691&quot;&gt;서버는 생성된 JWT를 &lt;b&gt;HTTP 응답으로 반환&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;1726&quot; data-start=&quot;1691&quot;&gt;또는 Authorization 헤더에 포함시켜 반환 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1762911509954&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;accessToken&quot;: &quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1762911537178&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTTP/1.1 200 OK
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-end=&quot;1983&quot; data-start=&quot;1955&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;1983&quot; data-start=&quot;1955&quot; data-ke-size=&quot;size26&quot;&gt;5️⃣ 서버 내부 처리 요약&lt;/h2&gt;
&lt;p data-end=&quot;1983&quot; data-start=&quot;1955&quot; data-ke-size=&quot;size16&quot;&gt;서버 관점에서 JWT 발급 과정은 다음과 같습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2108&quot; data-start=&quot;1985&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2001&quot; data-start=&quot;1985&quot;&gt;&lt;b&gt;로그인 요청 수신&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2033&quot; data-start=&quot;2002&quot;&gt;&lt;b&gt;사용자 인증 (DB 조회 + 비밀번호 검증)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2087&quot; data-start=&quot;2034&quot;&gt;&lt;b&gt;JWT 토큰 생성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2087&quot; data-start=&quot;2054&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2074&quot; data-start=&quot;2054&quot;&gt;Header, Payload 구성&lt;/li&gt;
&lt;li data-end=&quot;2087&quot; data-start=&quot;2078&quot;&gt;비밀키로 서명&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2108&quot; data-start=&quot;2088&quot;&gt;&lt;b&gt;클라이언트에 JWT 반환&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>SpringBoot</category>
      <author>얀타호수</author>
      <guid isPermaLink="true">https://uchive.tistory.com/61</guid>
      <comments>https://uchive.tistory.com/61#entry61comment</comments>
      <pubDate>Wed, 12 Nov 2025 10:40:49 +0900</pubDate>
    </item>
    <item>
      <title>서블릿 컨테이너 로드 순서</title>
      <link>https://uchive.tistory.com/60</link>
      <description>&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;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEDcp/dJMcaacyOHo/QmPk7oXTfLiKiYHpZvfqs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEDcp/dJMcaacyOHo/QmPk7oXTfLiKiYHpZvfqs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEDcp/dJMcaacyOHo/QmPk7oXTfLiKiYHpZvfqs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEDcp%2FdJMcaacyOHo%2FQmPk7oXTfLiKiYHpZvfqs1%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;276&quot; height=&quot;171&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;서블릿 로드(loading)&amp;rdquo; 과정&lt;/b&gt;은 서블릿 컨테이너(Tomcat, Jetty 등)가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서블릿 클래스를 &lt;b&gt;메모리에 올리고 초기화하는 전 과정&lt;/b&gt;을 말합니다.&lt;br /&gt;즉, &amp;ldquo;클라이언트 요청을 처리하기 전에 서블릿이 어떻게 준비되는가&amp;rdquo;에 대한 과정이다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762910762129&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;클라이언트 요청
   &amp;darr;
웹 서버 (ex: Tomcat)
   &amp;darr;
서블릿 컨테이너
   &amp;darr;
서블릿 로드 &amp;rarr; 인스턴스 생성 &amp;rarr; 초기화(init)
   &amp;darr;
요청 처리(service &amp;rarr; doGet/doPost)
   &amp;darr;
종료(destroy)&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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;391&quot; data-start=&quot;353&quot; data-ke-size=&quot;size23&quot;&gt;1️⃣ &lt;b&gt;서블릿 클래스 로드 (Class Loading)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;664&quot; data-start=&quot;393&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;473&quot; data-start=&quot;393&quot;&gt;&lt;b&gt;Servlet Container&lt;/b&gt;가 web.xml 또는 @WebServlet 어노테이션을 보고 해당 서블릿 클래스를 식별합니다.&lt;/li&gt;
&lt;li data-end=&quot;664&quot; data-start=&quot;474&quot;&gt;아직 요청이 오지 않은 상태에서는 클래스를 메모리에 올리지 않을 수도 있음.
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;664&quot; data-start=&quot;521&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;585&quot; data-start=&quot;521&quot;&gt;load-on-startup 설정이 &lt;b&gt;없으면&lt;/b&gt;, 첫 요청이 들어올 때 로드됨 (lazy loading).&lt;/li&gt;
&lt;li data-end=&quot;664&quot; data-start=&quot;588&quot;&gt;load-on-startup 설정이 &lt;b&gt;있으면&lt;/b&gt;, 컨테이너가 &lt;b&gt;서버 시작 시점에 미리 로드&lt;/b&gt;함 (eager loading).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;960&quot; data-start=&quot;925&quot; data-ke-size=&quot;size23&quot;&gt;2️⃣ &lt;b&gt;인스턴스 생성 (Instantiation)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1054&quot; data-start=&quot;962&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1009&quot; data-start=&quot;962&quot;&gt;클래스가 로드되면, 컨테이너는 &lt;b&gt;서블릿 객체를 1회만 생성(new)&lt;/b&gt; 합니다.&lt;/li&gt;
&lt;li data-end=&quot;1054&quot; data-start=&quot;1010&quot;&gt;서블릿 인스턴스는 일반적으로 &lt;b&gt;싱글톤(1개만 존재)&lt;/b&gt; 형태로 관리됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1762910801296&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HelloServlet servlet = new HelloServlet();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1149&quot; data-start=&quot;1117&quot; data-ke-size=&quot;size23&quot;&gt;3️⃣ &lt;b&gt;초기화 (Initialization)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1239&quot; data-start=&quot;1151&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1195&quot; data-start=&quot;1151&quot;&gt;인스턴스가 생성되면, 컨테이너가 &lt;b&gt;init() 메서드&lt;/b&gt;를 호출합니다.&lt;/li&gt;
&lt;li data-end=&quot;1239&quot; data-start=&quot;1196&quot;&gt;서블릿의 초기 설정(예: DB 연결, 설정 로드 등)은 여기서 수행합니다.&lt;/li&gt;
&lt;li data-end=&quot;1239&quot; data-start=&quot;1196&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이 단계는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;서블릿 생명주기에서 단 한 번만 호출&lt;/b&gt;됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1762910815696&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void init() throws ServletException {
    // 초기화 코드
    System.out.println(&quot;서블릿 초기화 완료&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1426&quot; data-start=&quot;1396&quot; data-ke-size=&quot;size23&quot;&gt;4️⃣ &lt;b&gt;요청 처리 (Service 단계)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1491&quot; data-start=&quot;1428&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1491&quot; data-start=&quot;1428&quot;&gt;초기화가 완료된 후 클라이언트 요청이 들어오면 컨테이너는 &lt;b&gt;service()&lt;/b&gt; 메서드를 호출합니다.&lt;/li&gt;
&lt;li data-end=&quot;1668&quot; data-start=&quot;1604&quot;&gt;HttpServlet의 경우 내부에서 자동으로 **doGet() / doPost()**로 분기됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762910843847&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void service(ServletRequest req, ServletResponse res) {
    // 요청 방식(GET, POST 등)에 따라 분기
}&lt;/code&gt;&lt;/pre&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;h3 data-end=&quot;1699&quot; data-start=&quot;1675&quot; data-ke-size=&quot;size23&quot;&gt;5️⃣ &lt;b&gt;종료 (Destroy)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1774&quot; data-start=&quot;1701&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1742&quot; data-start=&quot;1701&quot;&gt;컨테이너가 종료되거나 서블릿이 언로드될 때 destroy() 호출.&lt;/li&gt;
&lt;li data-end=&quot;1774&quot; data-start=&quot;1743&quot;&gt;리소스 해제, 연결 종료 등 정리 작업을 수행합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1762910863351&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void destroy() {
    System.out.println(&quot;서블릿 종료&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1866&quot; data-start=&quot;1854&quot; data-ke-size=&quot;size26&quot;&gt;⚙️ 정리 요약표&lt;/h2&gt;
&lt;div&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: 79.5349%;&quot; border=&quot;1&quot; data-end=&quot;2157&quot; data-start=&quot;1868&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2157&quot; data-start=&quot;1941&quot;&gt;
&lt;tr data-end=&quot;2009&quot; data-start=&quot;1941&quot;&gt;
&lt;td style=&quot;width: 4.76744%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1945&quot; data-start=&quot;1941&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20.1163%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1961&quot; data-start=&quot;1945&quot;&gt;Class Loading&lt;/td&gt;
&lt;td style=&quot;width: 42.093%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2003&quot; data-start=&quot;1961&quot;&gt;첫 요청 시 또는 서버 시작 시(load-on-startup 설정 시)&lt;/td&gt;
&lt;td style=&quot;width: 12.4419%;&quot; data-end=&quot;2009&quot; data-start=&quot;2003&quot; data-col-size=&quot;sm&quot;&gt;1회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2047&quot; data-start=&quot;2010&quot;&gt;
&lt;td style=&quot;width: 4.76744%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2014&quot; data-start=&quot;2010&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20.1163%;&quot; data-end=&quot;2030&quot; data-start=&quot;2014&quot; data-col-size=&quot;sm&quot;&gt;Instantiation&lt;/td&gt;
&lt;td style=&quot;width: 42.093%;&quot; data-end=&quot;2041&quot; data-start=&quot;2030&quot; data-col-size=&quot;sm&quot;&gt;클래스 로드 후&lt;/td&gt;
&lt;td style=&quot;width: 12.4419%;&quot; data-end=&quot;2047&quot; data-start=&quot;2041&quot; data-col-size=&quot;sm&quot;&gt;1회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2080&quot; data-start=&quot;2048&quot;&gt;
&lt;td style=&quot;width: 4.76744%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2052&quot; data-start=&quot;2048&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20.1163%;&quot; data-end=&quot;2061&quot; data-start=&quot;2052&quot; data-col-size=&quot;sm&quot;&gt;init()&lt;/td&gt;
&lt;td style=&quot;width: 42.093%;&quot; data-end=&quot;2074&quot; data-start=&quot;2061&quot; data-col-size=&quot;sm&quot;&gt;인스턴스 생성 직후&lt;/td&gt;
&lt;td style=&quot;width: 12.4419%;&quot; data-end=&quot;2080&quot; data-start=&quot;2074&quot; data-col-size=&quot;sm&quot;&gt;1회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2114&quot; data-start=&quot;2081&quot;&gt;
&lt;td style=&quot;width: 4.76744%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2085&quot; data-start=&quot;2081&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 20.1163%;&quot; data-end=&quot;2097&quot; data-start=&quot;2085&quot; data-col-size=&quot;sm&quot;&gt;service()&lt;/td&gt;
&lt;td style=&quot;width: 42.093%;&quot; data-end=&quot;2106&quot; data-start=&quot;2097&quot; data-col-size=&quot;sm&quot;&gt;매 요청 시&lt;/td&gt;
&lt;td style=&quot;width: 12.4419%;&quot; data-end=&quot;2114&quot; data-start=&quot;2106&quot; data-col-size=&quot;sm&quot;&gt;요청마다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2157&quot; data-start=&quot;2115&quot;&gt;
&lt;td style=&quot;width: 4.76744%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2119&quot; data-start=&quot;2115&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 20.1163%;&quot; data-end=&quot;2131&quot; data-start=&quot;2119&quot; data-col-size=&quot;sm&quot;&gt;destroy()&lt;/td&gt;
&lt;td style=&quot;width: 42.093%;&quot; data-end=&quot;2151&quot; data-start=&quot;2131&quot; data-col-size=&quot;sm&quot;&gt;서버 종료 또는 서블릿 제거 시&lt;/td&gt;
&lt;td style=&quot;width: 12.4419%;&quot; data-end=&quot;2157&quot; data-start=&quot;2151&quot; data-col-size=&quot;sm&quot;&gt;1회&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;&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&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762910905160&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[INFO] HelloServlet 클래스 로드됨
[INFO] HelloServlet 인스턴스 생성됨
[INFO] init() 호출 - 초기화 수행
[INFO] service() 호출 - 클라이언트 요청 처리
[INFO] destroy() 호출 - 종료 처리&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <author>얀타호수</author>
      <guid isPermaLink="true">https://uchive.tistory.com/60</guid>
      <comments>https://uchive.tistory.com/60#entry60comment</comments>
      <pubDate>Wed, 12 Nov 2025 10:30:50 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] deployment 전략, rolling update, blue/green 정책</title>
      <link>https://uchive.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;deployment&amp;nbsp;전략은 주로 애플리케이션이 변경될 때 사용한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이전 버전의 애플리케 이션에서 업데이트가 필요한 경우에 주로 사용되며&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;배포 방법으로는 롤링&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;재생성&lt;/span&gt;&lt;span&gt;, blue/green 정책&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;카나리가 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Rolling update&lt;/b&gt;&lt;br /&gt;롤링(rolling) 업데이트는 새 버전의 애플리케이션(파드)을 배포할 때 새 버전의 애플리케이 션은 하나씩 늘려가고 기존 버전의 애플리케이션은 하나씩 줄여나가는 방식으로, 쿠버네티스 에서 사용하는 표준 배포 방식이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-15 오전 9.32.48.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/styLl/btsQzPsQNX3/QKzzjcJOCfo9AYIwXVx571/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/styLl/btsQzPsQNX3/QKzzjcJOCfo9AYIwXVx571/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/styLl/btsQzPsQNX3/QKzzjcJOCfo9AYIwXVx571/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FstyLl%2FbtsQzPsQNX3%2FQKzzjcJOCfo9AYIwXVx571%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;708&quot; height=&quot;288&quot; data-filename=&quot;스크린샷 2025-09-15 오전 9.32.48.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;288&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_1757896476916&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: rolling
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%				#업데이트 중에 만들 수 있는 파드의 최대 개수
      maxUnavailable: 25%		#업데이트 중에 사용할 수 없는 파드의 개수, 
      							#0보다 큰 정수를 지정할 수 있고 퍼센트로 지정할 수도 있다.
  selector:
    matchLabels:
      app: rolling
  template:
    metadata:
      labels:
        app: rolling
    spec:
      containers:
        - name: rolling
          image: myimage
          ports:
            - containerPort: 8080&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Blue/Green 정책&lt;/b&gt;&lt;br /&gt;블루/그린(blue/green) 업데이트는 애플리케이션의 이전 버전(블루, V1 파드)과 새 버전(그 린, V2 파드)이 동시에 운영된다. 하지만 서비스 목적으로 접속할 수 있는 것은 새 버전의 파드만 가능하며 이전 버전의 파드는 테스트 목적으로만 접속할 수 있다.&lt;/blockquote&gt;
&lt;div&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;장점: 새로운 버전의 파드에 문제가 발생했을 때 빠르게 대응할 수 있으며 안정적으로 배포할 수 있다.&lt;/li&gt;
&lt;li&gt;단점: 많은 파드가 필요하므로 그만큼 많은 자원(CPU, 메모리)이 필요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-15 오전 9.37.17.png&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1JGu4/btsQya5zSjg/zdxPBugxaDs41P3s9St0Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1JGu4/btsQya5zSjg/zdxPBugxaDs41P3s9St0Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1JGu4/btsQya5zSjg/zdxPBugxaDs41P3s9St0Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1JGu4%2FbtsQya5zSjg%2FzdxPBugxaDs41P3s9St0Xk%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;709&quot; height=&quot;289&quot; data-filename=&quot;스크린샷 2025-09-15 오전 9.37.17.png&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Canary 정책&lt;/b&gt;&lt;br /&gt;카나리(canary)는 블루/그린과 비슷하지만 새 버전에는 조금씩 트래픽을 증가시켜 새로운 기 능등을 테스트한다. 기능 테스트가 끝나고 새 버전에 문제가 없다고 판단하면 이전 버전은 모두 종료시키고 새 버전으로만 서비스한다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-15 오전 9.38.05.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEnoqI/btsQAqTTzUe/qq2jfgz1Ghycc6aTYJJ6W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEnoqI/btsQAqTTzUe/qq2jfgz1Ghycc6aTYJJ6W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEnoqI/btsQAqTTzUe/qq2jfgz1Ghycc6aTYJJ6W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEnoqI%2FbtsQAqTTzUe%2Fqq2jfgz1Ghycc6aTYJJ6W0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;707&quot; height=&quot;287&quot; data-filename=&quot;스크린샷 2025-09-15 오전 9.38.05.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;287&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;</description>
      <category>Kubernetes</category>
      <author>얀타호수</author>
      <guid isPermaLink="true">https://uchive.tistory.com/59</guid>
      <comments>https://uchive.tistory.com/59#entry59comment</comments>
      <pubDate>Mon, 15 Sep 2025 09:38:35 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] Replicaset 레플리카셋 생성, 삭제, 정보 확인하기</title>
      <link>https://uchive.tistory.com/58</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kubernetes.io/ko/docs/concepts/workloads/controllers/replicaset/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kubernetes.io/ko/docs/concepts/workloads/controllers/replicaset/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1757399219014&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;레플리카셋&quot; data-og-description=&quot;레플리카셋의 목적은 레플리카 파드 집합의 실행을 항상 안정적으로 유지하는 것이다. 이처럼 레플리카셋은 보통 명시된 동일 파드 개수에 대한 가용성을 보증하는데 사용한다. 레플리카셋의 &quot; data-og-host=&quot;kubernetes.io&quot; data-og-source-url=&quot;https://kubernetes.io/ko/docs/concepts/workloads/controllers/replicaset/&quot; data-og-url=&quot;https://kubernetes.io/ko/docs/concepts/workloads/controllers/replicaset/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dASQ3g/hyZIZzI9By/rv4m4PnmWOfUW9yq6XmsFk/img.png?width=1727&amp;amp;height=373&amp;amp;face=0_0_1727_373&quot;&gt;&lt;a href=&quot;https://kubernetes.io/ko/docs/concepts/workloads/controllers/replicaset/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kubernetes.io/ko/docs/concepts/workloads/controllers/replicaset/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dASQ3g/hyZIZzI9By/rv4m4PnmWOfUW9yq6XmsFk/img.png?width=1727&amp;amp;height=373&amp;amp;face=0_0_1727_373');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;레플리카셋&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;레플리카셋의 목적은 레플리카 파드 집합의 실행을 항상 안정적으로 유지하는 것이다. 이처럼 레플리카셋은 보통 명시된 동일 파드 개수에 대한 가용성을 보증하는데 사용한다. 레플리카셋의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kubernetes.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkLdkp/btsQphdI3Eh/ZXTXLFelSpj7wnHXIkOO40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkLdkp/btsQphdI3Eh/ZXTXLFelSpj7wnHXIkOO40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkLdkp/btsQphdI3Eh/ZXTXLFelSpj7wnHXIkOO40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkLdkp%2FbtsQphdI3Eh%2FZXTXLFelSpj7wnHXIkOO40%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;420&quot; height=&quot;269&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Replicaset 이란?&lt;/b&gt;&lt;/blockquote&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;일정한 개수의 동일한 파드가 항상 실행되도록 관리한다&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;이러한 기능이 필요한 이유는 서비스의 지속성 때문!&lt;/span&gt;&lt;/p&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;이미지상 맨 좌측에 레플리카셋 안에 파드1, 파드2는 -replicas=2 라는 옵션입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;제가 replicas:3 옵션을 주어서 이 yaml파일을 통해 레플리카셋을 생성한다면&lt;/span&gt;&lt;/p&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;같은 이미지로 3개의 파드가 생기겠죠? 테스트해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1757399372824&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ cat replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: 3-replicaset
spec:
  template:
    metadata:
      name: 3-replicaset
      labels:
        app: 3-replicaset
    spec:
      containers:
      - name: 3-replicaset
        image: nginx
        ports:
        - containerPort: 80
  replicas: 3 #레플리카 개수 3개
  selector:
    matchLabels:
      app: 3-replicaset&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레플리카셋을 생성해봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1757399526255&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ kubectl apply -f replicaset.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-09 오후 3.33.40.png&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGeMU8/btsQpZKpe24/iHktm6DjSYHkYBkF0bAWHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGeMU8/btsQpZKpe24/iHktm6DjSYHkYBkF0bAWHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGeMU8/btsQpZKpe24/iHktm6DjSYHkYBkF0bAWHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGeMU8%2FbtsQpZKpe24%2FiHktm6DjSYHkYBkF0bAWHk%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;1057&quot; height=&quot;384&quot; data-filename=&quot;스크린샷 2025-09-09 오후 3.33.40.png&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 이미지 보시면 3-replicaset라는 label을 달고 3개의 파드가 생성되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 두개는 아직 컨테이너가 만들어지는 중이네요!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레플리카셋의 정보를 확인하는 방법도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yaml 파일을 기초로 만들어져있겠네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-09 오후 3.34.59.png&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cThnMg/btsQsNhmXj3/FuYNWcNxaY6GhYzjOkxA61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cThnMg/btsQsNhmXj3/FuYNWcNxaY6GhYzjOkxA61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cThnMg/btsQsNhmXj3/FuYNWcNxaY6GhYzjOkxA61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcThnMg%2FbtsQsNhmXj3%2FFuYNWcNxaY6GhYzjOkxA61%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;1057&quot; height=&quot;744&quot; data-filename=&quot;스크린샷 2025-09-09 오후 3.34.59.png&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 만약 하나의 파드를 삭제한다면 어떻게 될까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제한 후에, 파드 목록을 다시 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-09 오후 3.37.12.png&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WeNAK/btsQrtjEbY9/16a2aolZYKcypsfQTcepsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WeNAK/btsQrtjEbY9/16a2aolZYKcypsfQTcepsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WeNAK/btsQrtjEbY9/16a2aolZYKcypsfQTcepsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWeNAK%2FbtsQrtjEbY9%2F16a2aolZYKcypsfQTcepsK%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;1157&quot; height=&quot;384&quot; data-filename=&quot;스크린샷 2025-09-09 오후 3.37.12.png&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엇,!! 파드를 삭제했는데도 새 파드가 생성되어있네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실시간으로 파드를 관리하는거 같습니다.&lt;/p&gt;
&lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-09 오후 3.37.51.png&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7d7fm/btsQqGcIF4c/xK1N0AdQpIrKaYSktUDhXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7d7fm/btsQqGcIF4c/xK1N0AdQpIrKaYSktUDhXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7d7fm/btsQqGcIF4c/xK1N0AdQpIrKaYSktUDhXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7d7fm%2FbtsQqGcIF4c%2FxK1N0AdQpIrKaYSktUDhXK%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;1157&quot; height=&quot;432&quot; data-filename=&quot;스크린샷 2025-09-09 오후 3.37.51.png&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러가지 방법을 통해 파드를 생성해보았는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음을 위해 깨끗하게 지워보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;* --cascade=orphan: 레플리카셋만 삭제하고 파드는 남기고 싶다면 해당 명령어 사용.&lt;/p&gt;
&lt;pre id=&quot;code_1757400013865&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ kubectl get replicaset,pods

$ kubectl delete -f [이름] --cascade=orphan

$ kubectl delete pods -l app=[앱 이름]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사합니다.&lt;/p&gt;</description>
      <category>Kubernetes</category>
      <category>Kubernetes</category>
      <category>Pod</category>
      <category>Replicaset</category>
      <category>레플리카셋</category>
      <category>쿠버네티스</category>
      <category>파드</category>
      <author>얀타호수</author>
      <guid isPermaLink="true">https://uchive.tistory.com/58</guid>
      <comments>https://uchive.tistory.com/58#entry58comment</comments>
      <pubDate>Tue, 9 Sep 2025 15:41:23 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] yaml 파일을 통해 pod 생성, 관리하기</title>
      <link>https://uchive.tistory.com/57</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Pod 관리하기&lt;br /&gt;...&lt;/blockquote&gt;
&lt;div&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;생성된 컨테이너나 파드에 접속할 때는 kubectl exec 명령어를 사용&lt;/li&gt;
&lt;/ul&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-09 오전 11.36.28.png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUyeVE/btsQqoJAieS/JpDN15edTx2DQTkmqPYKek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUyeVE/btsQqoJAieS/JpDN15edTx2DQTkmqPYKek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUyeVE/btsQqoJAieS/JpDN15edTx2DQTkmqPYKek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUyeVE%2FbtsQqoJAieS%2FJpDN15edTx2DQTkmqPYKek%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;1167&quot; height=&quot;816&quot; data-filename=&quot;스크린샷 2025-09-09 오전 11.36.28.png&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;816&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Pod&amp;nbsp; 로그 확인&lt;br /&gt;...&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-09 오전 11.37.51.png&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BiFQu/btsQpYjR82Z/pfF69aSQNVlLOrujYxjbNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BiFQu/btsQpYjR82Z/pfF69aSQNVlLOrujYxjbNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BiFQu/btsQpYjR82Z/pfF69aSQNVlLOrujYxjbNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBiFQu%2FbtsQpYjR82Z%2FpfF69aSQNVlLOrujYxjbNK%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;1447&quot; height=&quot;432&quot; data-filename=&quot;스크린샷 2025-09-09 오전 11.37.51.png&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;432&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;워커노드에서 yaml을 생성해 pod 을 생성해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;명령으로 yaml을 생성하기&lt;br /&gt;--dry-run 옵션을 이용해서 yaml 생성&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-09 오전 11.55.43.png&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IuMIA/btsQpdaImKk/EBh8mYdkh02CF9UyWF3MSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IuMIA/btsQpdaImKk/EBh8mYdkh02CF9UyWF3MSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IuMIA/btsQpdaImKk/EBh8mYdkh02CF9UyWF3MSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIuMIA%2FbtsQpdaImKk%2FEBh8mYdkh02CF9UyWF3MSk%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;1437&quot; height=&quot;744&quot; data-filename=&quot;스크린샷 2025-09-09 오전 11.55.43.png&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;yaml 파일로 선언적으로 Pod 생성하기&lt;/blockquote&gt;
&lt;div&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;kubectl create -f [yaml 파일] # 처음 생성할 때만 사용하는 명령어&lt;/li&gt;
&lt;li&gt;kubectl apply -f [yaml 파일] # 생성 + 수정 둘다 가능&lt;/li&gt;
&lt;/ul&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-09 오전 11.58.32.png&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHamY4/btsQq1G30kk/21lWg47lnMxJJIzZcyR2s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHamY4/btsQq1G30kk/21lWg47lnMxJJIzZcyR2s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHamY4/btsQq1G30kk/21lWg47lnMxJJIzZcyR2s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHamY4%2FbtsQq1G30kk%2F21lWg47lnMxJJIzZcyR2s1%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;1327&quot; height=&quot;648&quot; data-filename=&quot;스크린샷 2025-09-09 오전 11.58.32.png&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 명령어를 입력한 후, get pod 를 해보니 nginx pod 이 생성되었습니다 :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;워크 노드에서 포트포워딩을 한 후, 마스터 노드에서 8080으로 접속하면 nginx 파일이 출력된답니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-09 오후 12.00.54.png&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mLDnr/btsQruvwpzH/aKKP9Q5KQfktdGpG6YjSOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mLDnr/btsQruvwpzH/aKKP9Q5KQfktdGpG6YjSOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mLDnr/btsQruvwpzH/aKKP9Q5KQfktdGpG6YjSOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmLDnr%2FbtsQruvwpzH%2FaKKP9Q5KQfktdGpG6YjSOK%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;1327&quot; height=&quot;432&quot; data-filename=&quot;스크린샷 2025-09-09 오후 12.00.54.png&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-09 오후 12.01.04.png&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qQvib/btsQrm5kuWr/8k9NopVmAJy1a7HEPWD5XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qQvib/btsQrm5kuWr/8k9NopVmAJy1a7HEPWD5XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qQvib/btsQrm5kuWr/8k9NopVmAJy1a7HEPWD5XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqQvib%2FbtsQrm5kuWr%2F8k9NopVmAJy1a7HEPWD5XK%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;1327&quot; height=&quot;432&quot; data-filename=&quot;스크린샷 2025-09-09 오후 12.01.04.png&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Kubernetes</category>
      <author>얀타호수</author>
      <guid isPermaLink="true">https://uchive.tistory.com/57</guid>
      <comments>https://uchive.tistory.com/57#entry57comment</comments>
      <pubDate>Tue, 9 Sep 2025 15:24:03 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] 쿠버네티스 파드 Pod 개념 / Pod 생성, 삭제하기</title>
      <link>https://uchive.tistory.com/55</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Pod란?&lt;br /&gt;...&lt;/blockquote&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;하나 이상의 컨테이너(Container)를 포함&lt;/li&gt;
&lt;li&gt;컨테이너들은 같은 네트워크 네임스페이스, 볼륨, 환경 변수를 공유&lt;/li&gt;
&lt;li&gt;Pod는&amp;nbsp;단일&amp;nbsp;IP를&amp;nbsp;가지고,&amp;nbsp;그&amp;nbsp;안&amp;nbsp;컨테이너들은&amp;nbsp;서로&amp;nbsp;localhost&amp;nbsp;로&amp;nbsp;통신&amp;nbsp;가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;e.g. &lt;/b&gt;my-httpd-7547bdb59f-s5mnv Pod 안에는 httpd 컨테이너 1개가 있고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP는 10.244.2.3Pod 안 컨테이너는 localhost:80 로 httpd 접근 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod 밖에서 직접 접근하려면 IP(10.xxx.xx.x) 사용해야 함, 단 내부 네트워크에서만 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Pod 생성하기 (Create, Apply 명령어)&lt;br /&gt;...&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파드는 create 또는 apply 명령어를 사용해 생성한다.&lt;/li&gt;
&lt;li&gt;kubectl create: 클러스터에 새로운 리소스를 생성한다.&lt;/li&gt;
&lt;li&gt;kubectl apply: create와 replace(생성된 오브젝트를 삭제하고 새로운 오브젝트를 생성) 의 혼합이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&amp;nbsp;&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;e.g. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;1개의 Pod를 가진 Deployment를 만들고, Pod 안에서 httpd 컨테이너가 80번 포트를 열도록 설정&lt;/b&gt;&lt;br /&gt;Deployment는 Pod를 관리하고, Pod가 죽으면 자동으로 재생성.,&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3k30G/btsQpInYnto/moI8GsqKPob6p5UXugaVRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3k30G/btsQpInYnto/moI8GsqKPob6p5UXugaVRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3k30G/btsQpInYnto/moI8GsqKPob6p5UXugaVRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3k30G%2FbtsQpInYnto%2FmoI8GsqKPob6p5UXugaVRk%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;277&quot; height=&quot;416&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1757382256230&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# kubectl create deployment [deployment name] --image=[컨테이너 이미지] --replicas=[생성 pod수] --port=[컨테이너 노출포트]
# create deployment
# Deployment 리소스 생성 명령어
# Deployment는 Pod를 관리하고, 지정한 수의 복제본(replicas) 유지
# Pod가 죽으면 자동으로 다시 생성해주는 역할
$ kubectl create deployment my-httpd --image=httpd --replicas=1 --port=80

$ kubectl get deployment

$ kubectl get pod

$ kubectl get pod -o wide&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Pod 삭제하기&lt;br /&gt;...&lt;/blockquote&gt;
&lt;pre id=&quot;code_1757383268802&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ kubectl delete deployment my-httpd
$ kubectl create deployment my-httpd --image=httpd --replicas=1 --port=80
$ kubectl edit deployment my-httpd&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Kubernetes</category>
      <author>얀타호수</author>
      <guid isPermaLink="true">https://uchive.tistory.com/55</guid>
      <comments>https://uchive.tistory.com/55#entry55comment</comments>
      <pubDate>Tue, 9 Sep 2025 11:31:04 +0900</pubDate>
    </item>
    <item>
      <title>[AI] 구글 AI 나노바나나 gemini-2.5-flash-image 알아보기</title>
      <link>https://uchive.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;안녕하세요. 오늘은 Google 의 Nano Banana라고 불리는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;gemini-2.5-flash-image 을 한 번 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdj3Pr/btsQm1U7Q8Y/WNMz4CfFjXFmfaSgyY6Ib0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdj3Pr/btsQm1U7Q8Y/WNMz4CfFjXFmfaSgyY6Ib0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdj3Pr/btsQm1U7Q8Y/WNMz4CfFjXFmfaSgyY6Ib0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdj3Pr%2FbtsQm1U7Q8Y%2FWNMz4CfFjXFmfaSgyY6Ib0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;260&quot; height=&quot;260&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;개발 단계에서의 이름은 나노 바나나였지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;발표한 정식이름은 gemini-2.5-flash-image-preview 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;공식적인 논문과 코드가 공개되지 않았지만 간단한 특징에 대해 설명해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1. 캐릭터 일관성 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;우선 AI를 사용하며 가장 불편한 점이었던 디자인 일관성 이슈가 해결되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;기존 diffusion 모델은 반복 편집시 점차 얼굴, 의상, 색감이 변하는 identity drift 문제가 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;하지만 나노바나나의 &lt;span style=&quot;background-color: #ffffff; color: #2c2c36; text-align: left;&quot;&gt;DCL(Design Consistency Layer) 은 수정이 필요한 부분과 유지되어야 할 부분을 &lt;/span&gt;&lt;b&gt;명시적으로 분리&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #2c2c36; text-align: left;&quot;&gt;하여, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #2c2c36; text-align: left;&quot;&gt;의도하지 않은 변경을 방지합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #2c2c36; text-align: left;&quot;&gt;이 기술은 정말 혁신적이네요 ^^&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2. 정밀한 편집&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;자연어 기반의 편집이 가능하며, &quot;특정 부분만 변경하고 나머지는 그대로 유지&quot;하는 식의 프롬프트로 섬세한 조정이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;예를 들어, &quot;이 이미지에서 셔츠의 얼룩만 제거해 주세요&quot;처럼 입력하면 해당 부분만 바뀝니다.&lt;br /&gt;대화형(Iterative) 멀티 턴 편집도 지원됩니다. 즉, 한 번의 프롬프트로 끝나는 게 아니라, &quot;배경을 좀 더 밝게 해줘&quot; -&amp;gt; &quot;이번엔 빨간색으로 바꿔줘&quot;처럼 계속 자연어로 수정할 수 있어 창작 프로세스가 유연합니다.&lt;br /&gt;얼굴이나&amp;nbsp;캐릭터의&amp;nbsp;일관성&amp;nbsp;유지도&amp;nbsp;뛰어나며,&amp;nbsp;복잡한&amp;nbsp;스타일이나&amp;nbsp;구성에서도&amp;nbsp;원본의&amp;nbsp;특징&amp;mdash;예를&amp;nbsp;들어&amp;nbsp;인물의&amp;nbsp;얼굴&amp;mdash;을&amp;nbsp;흐트러뜨리지&amp;nbsp;않고&amp;nbsp;유지할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3. 멀티 모달 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;텍스트+이미지를 한 번에 입력해도 처리가 가능하며, 단일 모델이 텍스트 이해와 이미지 생성/수정을 모두 수행하는 네이티브 멀티모달 아키텍처를 갖추고 있습니다.&lt;br /&gt;여러 이미지를 조합해 하나의 새로운 장면을 만드는 멀티 이미지 퓨전(multi-image fusion)도 지원되며, 예컨대 제품을 여러 장 합쳐 새로운 광고 이미지로 구성하는 식의 활용이 가능합니다.&lt;br /&gt;세계 지식을 반영한 시맨틱 이해가 포함되어 있어, 단순한 스타일 변경을 넘어서 상황에 맞는 맥락 이해와 편집이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;4. 가용 플랫폼&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Gemini 앱에서 바로 사용 가능하며, 일반 사용자도 &amp;ldquo;Gemini 챗봇&amp;rdquo; 등으로 접근할 수 있습니다.&lt;br /&gt;Google AI Studio 내 &amp;ldquo;빌드 모드(build mode)&amp;rdquo;를 통해 예제 템플릿을 활용하거나 직접 앱을 만들어 GitHub에 배포할 수 있습니다.&lt;br /&gt;Vertex AI (Google Cloud) 플랫폼에서도 Preview 형태로 사용 가능하며, 콘솔이나 Python SDK, REST API 등 다양한 방식으로 통합 활용할 수 있습니다.&lt;br /&gt;OpenRouter.ai, fal.ai와 같은 외부 플랫폼과도 연동되어, 더 넓은 개발자 커뮤니티에서도 사용할 수 있습니다.&lt;br /&gt;Adobe Creative Cloud(Firefly, Express), Poe (by Quora), WPP Open, Freepik 등 다양한 파트너 플랫폼에서도 이미 통합되어 사용 중입니다.&lt;br /&gt;모든&amp;nbsp;생성/편집된&amp;nbsp;이미지에는&amp;nbsp;SynthID&amp;nbsp;디지털&amp;nbsp;워터마크가&amp;nbsp;**보이지&amp;nbsp;않는&amp;nbsp;형태(invisible&amp;nbsp;watermark)**로&amp;nbsp;자동&amp;nbsp;포함되어,&amp;nbsp;책임&amp;nbsp;있는&amp;nbsp;AI&amp;nbsp;사용과&amp;nbsp;추적이&amp;nbsp;가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;:)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;추후 포스팅에서 간단한 사용법과 후기 알려드릴게요&amp;nbsp;&lt;/p&gt;</description>
      <category>AI</category>
      <author>얀타호수</author>
      <guid isPermaLink="true">https://uchive.tistory.com/54</guid>
      <comments>https://uchive.tistory.com/54#entry54comment</comments>
      <pubDate>Mon, 8 Sep 2025 11:14:21 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] 쿠버네티스 개발 환경 구축하기 (클러스터 생성)</title>
      <link>https://uchive.tistory.com/53</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1tjSV/btsQsoPGxy0/BKEm8QMxJohpKHrSPWpDu0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1tjSV/btsQsoPGxy0/BKEm8QMxJohpKHrSPWpDu0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1tjSV/btsQsoPGxy0/BKEm8QMxJohpKHrSPWpDu0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1tjSV%2FbtsQsoPGxy0%2FBKEm8QMxJohpKHrSPWpDu0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;344&quot; height=&quot;269&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;92&quot; data-start=&quot;73&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;92&quot; data-start=&quot;73&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TL;DR&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1045&quot; data-end=&quot;1147&quot;&gt;
&lt;li data-start=&quot;1045&quot; data-end=&quot;1101&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;클러스터&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;= 여러 서버를 묶어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;한 번에 관리하고, Pod 실행을 분산&lt;/b&gt;시키는 단위&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;63&quot; data-start=&quot;42&quot;&gt;&lt;b&gt;마스터 노드&lt;/b&gt;: 전체 관리&lt;/li&gt;
&lt;li data-end=&quot;88&quot; data-start=&quot;64&quot;&gt;&lt;b&gt;워커 노드&lt;/b&gt;: 애플리케이션 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;1102&quot; data-end=&quot;1147&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;생성 이유&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;126&quot; data-start=&quot;103&quot;&gt;장애 나도 서비스 지속(고가용성)&lt;/li&gt;
&lt;li data-end=&quot;152&quot; data-start=&quot;127&quot;&gt;트래픽 늘면 노드 추가 가능(확장성)&lt;/li&gt;
&lt;li data-end=&quot;167&quot; data-start=&quot;153&quot;&gt;자원 효율적 사용&lt;/li&gt;
&lt;li data-is-last-node=&quot;&quot; data-end=&quot;188&quot; data-start=&quot;168&quot;&gt;배포/스케일링/헬스 체크 자동화&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;style6&quot; /&gt;
&lt;h2 data-end=&quot;92&quot; data-start=&quot;73&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;쿠버네티스 클러스터란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**클러스터(Cluster)**란, 여러 대의 서버(노드)를 하나로 묶어 &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;183&quot; data-start=&quot;174&quot; data-ke-size=&quot;size23&quot;&gt;구성 요소&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;594&quot; data-start=&quot;184&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;413&quot; data-start=&quot;184&quot;&gt;&lt;b&gt;마스터 노드 (Control Plane)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;413&quot; data-start=&quot;217&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;230&quot; data-start=&quot;217&quot;&gt;클러스터 전체를 관리&lt;/li&gt;
&lt;li data-end=&quot;413&quot; data-start=&quot;234&quot;&gt;주요 컴포넌트:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;413&quot; data-start=&quot;250&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;281&quot; data-start=&quot;250&quot;&gt;&lt;b&gt;kube-apiserver&lt;/b&gt;: API 요청 처리&lt;/li&gt;
&lt;li data-end=&quot;315&quot; data-start=&quot;287&quot;&gt;&lt;b&gt;etcd&lt;/b&gt;: 상태 저장소 (클러스터 상태)&lt;/li&gt;
&lt;li data-end=&quot;362&quot; data-start=&quot;321&quot;&gt;&lt;b&gt;kube-scheduler&lt;/b&gt;: 어떤 노드에 Pod을 배치할지 결정&lt;/li&gt;
&lt;li data-end=&quot;413&quot; data-start=&quot;368&quot;&gt;&lt;b&gt;kube-controller-manager&lt;/b&gt;: 상태를 원하는 상태로 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;594&quot; data-start=&quot;414&quot;&gt;&lt;b&gt;워커 노드 (Worker Node)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;594&quot; data-start=&quot;444&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;463&quot; data-start=&quot;444&quot;&gt;실제 애플리케이션(Pod) 실행&lt;/li&gt;
&lt;li data-end=&quot;594&quot; data-start=&quot;467&quot;&gt;주요 컴포넌트:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;594&quot; data-start=&quot;483&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;515&quot; data-start=&quot;483&quot;&gt;&lt;b&gt;kubelet&lt;/b&gt;: 노드에서 Pod 실행/상태 관리&lt;/li&gt;
&lt;li data-end=&quot;551&quot; data-start=&quot;521&quot;&gt;&lt;b&gt;kube-proxy&lt;/b&gt;: 네트워크 트래픽 라우팅&lt;/li&gt;
&lt;li data-end=&quot;594&quot; data-start=&quot;557&quot;&gt;&lt;b&gt;컨테이너 런타임&lt;/b&gt; (Docker, containerd 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-end=&quot;639&quot; data-start=&quot;596&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;639&quot; data-start=&quot;598&quot; data-ke-size=&quot;size16&quot;&gt;즉, 클러스터 = &lt;b&gt;관리하는 서버 + 애플리케이션 실행 서버들의 집합&lt;/b&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;style6&quot; /&gt;
&lt;h2 data-end=&quot;666&quot; data-start=&quot;646&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;nbsp;클러스터를 생성하는 이유&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1028&quot; data-start=&quot;668&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;751&quot; data-start=&quot;668&quot;&gt;&lt;b&gt;고가용성(High Availability)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;751&quot; data-start=&quot;702&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;737&quot; data-start=&quot;702&quot;&gt;서버 한 대가 다운되어도 다른 노드가 서비스를 계속 제공&lt;/li&gt;
&lt;li data-end=&quot;751&quot; data-start=&quot;741&quot;&gt;즉, 장애 대비&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;850&quot; data-start=&quot;753&quot;&gt;&lt;b&gt;확장성(Scalability)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;850&quot; data-start=&quot;780&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;817&quot; data-start=&quot;780&quot;&gt;트래픽이 늘어나면 노드를 추가하여 Pod 수를 늘릴 수 있음&lt;/li&gt;
&lt;li data-end=&quot;850&quot; data-start=&quot;821&quot;&gt;클러스터 하나로 여러 서버를 묶어 수평 확장 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;933&quot; data-start=&quot;852&quot;&gt;&lt;b&gt;리소스 효율화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;933&quot; data-start=&quot;870&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;898&quot; data-start=&quot;870&quot;&gt;여러 애플리케이션을 하나의 클러스터에서 관리&lt;/li&gt;
&lt;li data-end=&quot;933&quot; data-start=&quot;902&quot;&gt;CPU, 메모리, 네트워크 등 자원을 효율적으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1028&quot; data-start=&quot;935&quot;&gt;&lt;b&gt;자동화된 관리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1028&quot; data-start=&quot;953&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;998&quot; data-start=&quot;953&quot;&gt;배포(Deployment), 롤백, 스케일링, 헬스 체크 등을 자동화 가능&lt;/li&gt;
&lt;li data-end=&quot;1028&quot; data-start=&quot;1002&quot;&gt;사람이 일일이 서버 상태를 관리할 필요 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1756954711044&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# pod-network-cidr: 파드 네트워크의 IP 주소 범위
# apiserver-advertise-address: 수신 대기 중임을 알릴 IP주소로 마스터 노드의 IP를 설정
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.127.128&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1756954613327&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. 현재 로그인 사용자 확인
whoami
# - 현재 터미널에서 사용 중인 계정 이름 출력
# - 쿠버네티스 config 설정 시 어떤 계정으로 작업 중인지 확인용

# 2. 기존 kube 설정 삭제
rm -rf $HOME/.kube
# - 기존 kubeconfig 파일 및 디렉토리 삭제
# - 깨끗한 상태에서 새 클러스터 설정을 적용하기 위해 사용

# 3. kube 디렉토리 새로 생성
mkdir -p $HOME/.kube
# - kubeconfig를 저장할 디렉토리 생성
# - -p 옵션: 부모 디렉토리 없으면 자동 생성

# 4. 관리자 kubeconfig 파일 복사
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# - kubeadm으로 생성된 admin.conf를 현재 사용자 홈 디렉토리에 복사
# - -i : 덮어쓰기 시 확인 메시지 표시

# 5. kubeconfig 파일 소유자 변경
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# - 현재 사용자(uid, gid) 소유로 변경
# - root 소유일 경우 일반 사용자로 kube 명령어 실행 불가 문제 해결

# 6. 현재 컨텍스트 확인
kubectl config get-contexts
# - kubeconfig에 정의된 모든 컨텍스트 확인
# - 컨텍스트 = 클러스터/사용자/네임스페이스 설정 정보

# 7. 현재 컨텍스트 이름 변경
kubectl config rename-context $(kubectl config current-context) k8s
# - 현재 컨텍스트 이름을 &quot;k8s&quot;로 변경
# - 클러스터가 여러 개일 때 명확하게 구분 가능

# 8. 변경 후 컨텍스트 재확인
kubectl config get-contexts
# - 컨텍스트 이름이 &quot;k8s&quot;로 변경됐는지 확인

# 9. 모든 네임스페이스의 Pod 상태 확인
kubectl get pods --all-namespaces
# - 클러스터 내 모든 네임스페이스에서 실행 중인 Pod 목록 출력
# - 마스터 노드 및 초기 시스템 Pod 상태 확인용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;b&gt;혹시라도 쿠버네티스를 초기화하고 싶다면, 아래를 실행해주세요.&lt;/b&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;b&gt;처음부터 다시 설치해야합니다 !!&amp;nbsp;&lt;/b&gt;&lt;/s&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1756958172579&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo su -

$ kubeadm reset -f
$ sudo apt-get purge kubeadm kubectl kubelet kubernetes-cni kube*
$ rm -rf $HOME/.kube&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;클러스터 시작하기&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1756958333126&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ whoami
ubuntu 

# 기존 kube 설정 삭제
$ rm -rf $HOME/.kube

# kube 디렉토리 새로 생성
$ mkdir -p $HOME/.kube

# admin.conf를 사용자 kubeconfig로 복사
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# &amp;rarr; kubeadm init 후 생성된 클러스터 관리용 config 복사

# kubeconfig 소유자를 현재 사용자로 변경
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
# &amp;rarr; root 소유 문제 해결, kubectl 사용 가능

# 현재 컨텍스트 확인
$ kubectl config get-contexts
# &amp;rarr; 클러스터, 사용자, 네임스페이스 정보 확인

# 모든 네임스페이스 Pod 상태 확인
# 마스터 관련 Pod들은 Running, coredns는 Pending 상태
$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-76f75df574-4nf25             0/1     Pending   0          44s
kube-system   coredns-76f75df574-btd98             0/1     Pending   0          44s
kube-system   etcd-k8s-master                      1/1     Running   1          58s
kube-system   kube-apiserver-k8s-master            1/1     Running   1          58s
kube-system   kube-controller-manager-k8s-master   1/1     Running   1          58s
kube-system   kube-proxy-fdsgf                     1/1     Running   0          44s
kube-system   kube-scheduler-k8s-master            1/1     Running   1          58s

# Flannel CNI 설치 (Pod 네트워크)
# &amp;rarr; Pod 간 통신 및 네트워크 구성
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# CNI 설치 후 Pod 상태 확인
# &amp;rarr; kube-flannel Pod가 Init 단계, coredns는 아직 Pending
#    etcd, kube-apiserver, controller-manager, kube-scheduler 등은 Running
$ kubectl get pods --all-namespaces
NAMESPACE      NAME                                 READY   STATUS     RESTARTS   AGE
kube-flannel   kube-flannel-ds-6sb42                0/1     Init:1/2   0          6s
kube-system    coredns-76f75df574-4nf25             0/1     Pending    0          66s
kube-system    coredns-76f75df574-btd98             0/1     Pending    0          66s
kube-system    etcd-k8s-master                      1/1     Running    1          80s
kube-system    kube-apiserver-k8s-master            1/1     Running    1          80s
kube-system    kube-controller-manager-k8s-master   1/1     Running    1          80s
kube-system    kube-proxy-fdsgf                     1/1     Running    0          66s
kube-system    kube-scheduler-k8s-master            1/1     Running    1          80s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1047&quot; data-start=&quot;981&quot;&gt;아직 Flannel 초기화 중이어서 coredns와 kube-flannel Pod는 Pending/Init 상태&lt;/li&gt;
&lt;li data-end=&quot;1118&quot; data-start=&quot;1048&quot;&gt;마스터 핵심 컴포넌트(etcd, apiserver, controller, scheduler)는 모두 정상 Running&lt;/li&gt;
&lt;li data-end=&quot;1174&quot; data-start=&quot;1119&quot;&gt;시간이 조금 지나면 Flannel이 올라가면서 coredns도 Running 상태가 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Kubernetes</category>
      <author>얀타호수</author>
      <guid isPermaLink="true">https://uchive.tistory.com/53</guid>
      <comments>https://uchive.tistory.com/53#entry53comment</comments>
      <pubDate>Thu, 4 Sep 2025 13:01:08 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] 쿠버네티스 환경 구축하기 (VMware에 쿠버 설치)</title>
      <link>https://uchive.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. k8s-master, k8s-worker1~3 에 ssh 접속을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 아래 경로처럼 디렉토리를 만듭니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 쿠버네티스를 clone 받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. hostname을 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1756950038687&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ssh ubuntu@192.168.127.131

$ mkdir -p ~/dev/workspace/devops

$ cd ~/dev/workspace/devops

$ git clone https://github.com/kshelp/kubernetes

$ sudo hostnamectl set-hostname k8s-worker3

$ sudo vi /etc/hosts
#Kubernetes host - Jin Yu 250904
192.168.127.128 k8s-master
192.168.127.129 k8s-worker1
192.168.127.130 k8s-worker2
192.168.127.131 k8s-worker3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-04 오전 10.41.00.png&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZbsxE/btsQlqmoHnP/WnukEbFhzKPUuUzS3bnKKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZbsxE/btsQlqmoHnP/WnukEbFhzKPUuUzS3bnKKK/img.png&quot; data-alt=&quot;디렉토리 만들고 쿠버네티스 repo 클론&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZbsxE/btsQlqmoHnP/WnukEbFhzKPUuUzS3bnKKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZbsxE%2FbtsQlqmoHnP%2FWnukEbFhzKPUuUzS3bnKKK%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;1117&quot; height=&quot;423&quot; data-filename=&quot;스크린샷 2025-09-04 오전 10.41.00.png&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;디렉토리 만들고 쿠버네티스 repo 클론&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-04 오전 10.41.38.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE0JgQ/btsQiEmr002/cKlSVLs5HEnXYQsOjGvJVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE0JgQ/btsQiEmr002/cKlSVLs5HEnXYQsOjGvJVK/img.png&quot; data-alt=&quot;hostname 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE0JgQ/btsQiEmr002/cKlSVLs5HEnXYQsOjGvJVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE0JgQ%2FbtsQiEmr002%2FcKlSVLs5HEnXYQsOjGvJVK%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;865&quot; height=&quot;253&quot; data-filename=&quot;스크린샷 2025-09-04 오전 10.41.38.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;253&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;hostname 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버가 제대로 작동하려면 아래의 이유때문에 swap 메모리를 비활성화해야합니다!&lt;/p&gt;
&lt;h3 data-end=&quot;101&quot; data-start=&quot;76&quot; data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;리소스 관리의 일관성 문제&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;331&quot; data-start=&quot;102&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;157&quot; data-start=&quot;102&quot;&gt;쿠버네티스는 &lt;b&gt;cgroup&lt;/b&gt;을 이용해서 컨테이너별로 CPU, 메모리 리소스를 제한합니다.&lt;/li&gt;
&lt;li data-end=&quot;331&quot; data-start=&quot;158&quot;&gt;메모리 제한은 OOM(Out Of Memory) 이벤트를 기준으로 동작하는데, 만약 스왑이 켜져 있다면 실제로는 물리 메모리 초과 상황에서도 스왑으로 밀려나면서 &quot;쿠버네티스가 예상한 동작&quot;과 달라집니다.&lt;br /&gt;&amp;rarr; 즉, Pod이 제대로 종료되지 않고 계속 버티거나, 다른 Pod이 영향을 받을 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;336&quot; data-start=&quot;333&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;365&quot; data-start=&quot;338&quot; data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;성능 저하 및 예측 불가 동작&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;561&quot; data-start=&quot;366&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;410&quot; data-start=&quot;366&quot;&gt;스왑은 디스크 기반이라 RAM에 비해 속도가 &lt;b&gt;수백~수천 배 느림&lt;/b&gt;.&lt;/li&gt;
&lt;li data-end=&quot;484&quot; data-start=&quot;411&quot;&gt;어떤 Pod이 메모리를 많이 잡아먹을 경우, 스왑으로 밀려난 프로세스들이 급격히 느려짐 &amp;rarr; 다른 Pod 전체가 영향을 받음.&lt;/li&gt;
&lt;li data-end=&quot;561&quot; data-start=&quot;485&quot;&gt;쿠버네티스 스케줄러가 &quot;노드에 리소스가 충분하다&quot;고 판단하고 Pod을 배치했는데, 실제로는 스왑 때문에 성능이 급락하는 문제가 발생.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;566&quot; data-start=&quot;563&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;588&quot; data-start=&quot;568&quot; data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;노드 안정성 확보&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;749&quot; data-start=&quot;589&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;674&quot; data-start=&quot;589&quot;&gt;스왑 활성화 상태에서 메모리 부족이 발생하면, 노드가 전체적으로 느려지거나 커널 OOM Killer가 &lt;b&gt;임의의 프로세스&lt;/b&gt;를 종료시킬 수 있음.&lt;/li&gt;
&lt;li data-end=&quot;749&quot; data-start=&quot;675&quot;&gt;쿠버네티스는 Pod 단위에서 책임지고 자원을 관리해야 하는데, 스왑이 켜져 있으면 &lt;b&gt;운영체제가 개입&lt;/b&gt;해버리므로 제어권을 잃음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 모든 노드에서 swap 메모리를 비활성화해줍시다.&lt;/p&gt;
&lt;pre id=&quot;code_1756950830767&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo swapoff -a

$ sudo sed -i '/ swap / s/^/#/' /etc/fstab

$ sudo vi /etc/fstab
#/swap.img none swap sw 0 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은, docker를 설치해줄겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker를 설치하고 hello-world 이미지가 잘 실행이 되는지 run 해줍시다 ㅎㅎ (생략)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자, 실행이 잘 된다면!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cgroup 드라이버를 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1756951555407&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# cgroup 드라이버 설정
# - 쿠버네티스에서는 도커의 cgroup 관리를 위해 systemd를 사용하도록 변경해야 한다. 
# - 변경하지 않으면 클러스터 설치 과정에서 오류가 발생할 수 있다.
$ sudo docker info | grep Cgroup
WARNING: No swap limit support
 Cgroup Driver: cgroupfs #systemd 라고 되어있어야함
 Cgroup Version: 1
 
 
# cgroup driver가 systemd가 아닌 경우에만 아래와 같이 실행한다.
$ sudo vi /etc/docker/daemon.json
{
&quot;exec-opts&quot;: [&quot;native.cgroupdriver=systemd&quot;], &quot;log-driver&quot;: &quot;json-file&quot;,
&quot;log-opts&quot;: {
		&quot;max-size&quot;: &quot;100m&quot;
	},
	&quot;storage-driver&quot;: &quot;overlay2&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 단계는 서비스를 재시작하는겁니다.&lt;/p&gt;
&lt;pre id=&quot;code_1756953842687&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ sudo docker info

....

Cgroup Driver: systemd
Cgroup Version: 1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-04 오전 11.42.54.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nibin/btsQk96gd6o/FqGneFXUA4XnOYMfWjEi70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nibin/btsQk96gd6o/FqGneFXUA4XnOYMfWjEi70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nibin/btsQk96gd6o/FqGneFXUA4XnOYMfWjEi70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNibin%2FbtsQk96gd6o%2FFqGneFXUA4XnOYMfWjEi70%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;697&quot; height=&quot;288&quot; data-filename=&quot;스크린샷 2025-09-04 오전 11.42.54.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;288&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;위와 같이 Cgroup Driver: systemd 로 변경이 되어있어야해요 !!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Kubernetes 설치&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 이제 모든 설정은 끝났으니, 모든 노드에 쿠버네티스를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 6단계입니다.&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;1600&quot; data-start=&quot;1554&quot;&gt;1~4 단계: Kubernetes 공식 apt 저장소 추가 및 서명키 등록&lt;/li&gt;
&lt;li data-end=&quot;1623&quot; data-start=&quot;1601&quot;&gt;5 단계:&amp;nbsp; apt 목록 업데이트&lt;/li&gt;
&lt;li data-end=&quot;1663&quot; data-start=&quot;1624&quot;&gt;6 단계:&amp;nbsp; kubelet, kubeadm, kubectl 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1756953966788&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
# 1. Kubernetes 설치를 위해 필요한 패키지 설치
$ sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# - apt-transport-https : HTTPS를 통해 apt 리포지토리를 접근 가능하게 함
# - ca-certificates       : HTTPS 인증서 확인용 루트 인증서 설치
# - curl                  : URL에서 파일 다운로드용 툴
# - gpg                   : 패키지 서명 검증용 GNU Privacy Guard 도구
# - -y 옵션              : 설치 시 사용자 확인 없이 자동 Yes


# 2. Kubernetes GPG 키를 저장할 디렉토리 생성
$ sudo mkdir -p -m 755 /etc/apt/keyrings
# - -p : 부모 디렉토리 없으면 생성
# - -m 755 : 디렉토리 권한 설정 (소유자 읽기/쓰기/실행, 그룹/타인 읽기/실행)


# 3. Kubernetes 패키지 서명키 다운로드 및 GPG 형식으로 저장
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# - curl -fsSL : 실패 시 에러 메시지 없이 다운로드, 리다이렉션 허용
# - sudo gpg --dearmor : ASCII 형식의 GPG 키를 바이너리 형식(.gpg)으로 변환
# - -o : 출력 파일 지정


# 4. Kubernetes APT 저장소를 sources.list.d에 등록
$ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# - deb : apt 저장소를 의미
# - [signed-by=...] : 지정한 GPG 키로 패키지 서명 검증
# - https://pkgs.k8s.io/... : Kubernetes 공식 stable v1.29 패키지 URL
# - tee : 관리자 권한으로 파일 생성/덮어쓰기


# 5. 새 저장소 정보로 패키지 목록 업데이트
$ sudo apt-get update
# - apt 패키지 목록을 최신화하여 새 저장소 패키지를 인식


# 6. Kubernetes 핵심 구성 요소 설치
$ sudo apt-get install -y kubelet kubeadm kubectl
# - kubelet : 각 노드에서 Pod을 관리하는 에이전트
# - kubeadm : 클러스터 초기화 및 관리 도구
# - kubectl : 클러스터 제어 및 관리용 CLI
# - -y 옵션 : 설치 시 사용자 확인 없이 자동 Yes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Kubernetes</category>
      <author>얀타호수</author>
      <guid isPermaLink="true">https://uchive.tistory.com/52</guid>
      <comments>https://uchive.tistory.com/52#entry52comment</comments>
      <pubDate>Thu, 4 Sep 2025 11:50:52 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] 쿠버네티스 환경 구축하기 (VMware 사용하기)</title>
      <link>https://uchive.tistory.com/51</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스 환경을 실습해보기 위해 실습 환경을 구축해보겠습니다.&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;blockquote data-ke-style=&quot;style3&quot;&gt;1. ubuntu20.04 다운로드&lt;br /&gt;2. vmware install&lt;br /&gt;3. vmware에 4개의 vm 만들기&lt;br /&gt;4. 네트워크 및 네트워크 인터페이스 설정하기&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;저는 ubuntu 20.04를 usb에 두고 부팅 usb로 쓸 때가 있어 가지고 다닙니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아니신 분들은 아래 링크에서 server install image를 선택해 설치하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://releases.ubuntu.com/focal/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://releases.ubuntu.com/focal/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.22.35.png&quot; data-origin-width=&quot;1495&quot; data-origin-height=&quot;1177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cheoTr/btsQk3dTD4B/cLkx54KIN8YUZDE08rbCMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cheoTr/btsQk3dTD4B/cLkx54KIN8YUZDE08rbCMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cheoTr/btsQk3dTD4B/cLkx54KIN8YUZDE08rbCMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcheoTr%2FbtsQk3dTD4B%2FcLkx54KIN8YUZDE08rbCMk%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;1495&quot; height=&quot;1177&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.22.35.png&quot; data-origin-width=&quot;1495&quot; data-origin-height=&quot;1177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMware 에 들어가서 File &amp;gt; New 에 들어간 후,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드받은 ubuntu를 Virtual machine 으로 선택해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커스터마이징 하는 과정이 있는데 아래 표를 참고로 만들어주세요. ip는 추후 네트워크 인터페이스 과정에서 설정합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 49.7674%; height: 64px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;k8s-matster&lt;/td&gt;
&lt;td&gt;192.168.127.128&lt;/td&gt;
&lt;td&gt;50G 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k8s-worker1&lt;/td&gt;
&lt;td&gt;192.168.127.129&lt;/td&gt;
&lt;td&gt;50G 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k8s-worker2&lt;/td&gt;
&lt;td&gt;192.168.127.130&lt;/td&gt;
&lt;td&gt;50G 할당&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k8s-worker3&lt;/td&gt;
&lt;td&gt;192.168.127.131&lt;/td&gt;
&lt;td&gt;300G 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.26.39.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZbT4h/btsQhVaVnz9/HLmKQtkRHqvm0mr2LgMJHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZbT4h/btsQhVaVnz9/HLmKQtkRHqvm0mr2LgMJHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZbT4h/btsQhVaVnz9/HLmKQtkRHqvm0mr2LgMJHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZbT4h%2FbtsQhVaVnz9%2FHLmKQtkRHqvm0mr2LgMJHk%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;695&quot; height=&quot;578&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.26.39.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;578&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH 접속은 해야하기 때문에 아래 과정에서 &lt;i&gt;&lt;b&gt;Install OpenSSH server&lt;/b&gt;&lt;/i&gt;를 선택해주세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.27.09.png&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KiWsA/btsQiO973QU/el7AxZU1FGqeH74Dc3f9lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KiWsA/btsQiO973QU/el7AxZU1FGqeH74Dc3f9lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KiWsA/btsQiO973QU/el7AxZU1FGqeH74Dc3f9lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKiWsA%2FbtsQiO973QU%2Fel7AxZU1FGqeH74Dc3f9lk%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;692&quot; height=&quot;510&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.27.09.png&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 오랜시간 설치하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 때는 커피 한 잔 마시고 와주면 끝내있습니다.&lt;/p&gt;
&lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.29.24.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;918&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rQGYS/btsQiGYBagQ/ht1n10m04vtFppQeqVGwtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rQGYS/btsQiGYBagQ/ht1n10m04vtFppQeqVGwtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rQGYS/btsQiGYBagQ/ht1n10m04vtFppQeqVGwtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrQGYS%2FbtsQiGYBagQ%2Fht1n10m04vtFppQeqVGwtK%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;1392&quot; height=&quot;918&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.29.24.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;918&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.39.13.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXNhw6/btsQiDudJk2/cAfrWwC17isL9ePDHGla70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXNhw6/btsQiDudJk2/cAfrWwC17isL9ePDHGla70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXNhw6/btsQiDudJk2/cAfrWwC17isL9ePDHGla70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXNhw6%2FbtsQiDudJk2%2FcAfrWwC17isL9ePDHGla70%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;912&quot; height=&quot;750&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.39.13.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 다 된후, worker1에 ubuntu계정으로 로그인하면 이렇게 나옵니다 :)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 3개의 vm도 이렇게 나와야합니다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 vm에 아래와 같은 설정을 해줄건데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 인터페이스에 address 부분은 테이블로 정의한 내부 ip를 작성해주세요.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 49.7674%; height: 64px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;k8s-matster&lt;/td&gt;
&lt;td&gt;192.168.127.128&lt;/td&gt;
&lt;td&gt;50G 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k8s-worker1&lt;/td&gt;
&lt;td&gt;192.168.127.129&lt;/td&gt;
&lt;td&gt;50G 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k8s-worker2&lt;/td&gt;
&lt;td&gt;192.168.127.130&lt;/td&gt;
&lt;td&gt;50G 할당&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k8s-worker3&lt;/td&gt;
&lt;td&gt;192.168.127.131&lt;/td&gt;
&lt;td&gt;300G 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1756946147581&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 최신상태로 업데이트하기
$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get upgrade -y

$ sudo apt install net-tools apt-transport-https curl -y

# 네트워크 설정 - 현재 설치된 네트워크 인터페이스 설정 보기
$ ifconfig

# 네트워크 인터페이스 설정하기
# ip고정을 위해 Ubuntu 20.04에서는 netplan을 사용
$ sudo vi /etc/netplan/00-installer-config.yaml

# 네트워크 설정 적용
$ sudo netplan apply&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.52.26.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWTokJ/btsQiARSeVd/ML5GQS3pl1xIyvpFOCKUMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWTokJ/btsQiARSeVd/ML5GQS3pl1xIyvpFOCKUMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWTokJ/btsQiARSeVd/ML5GQS3pl1xIyvpFOCKUMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWTokJ%2FbtsQiARSeVd%2FML5GQS3pl1xIyvpFOCKUMk%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;912&quot; height=&quot;750&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.52.26.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&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;제 터미널에서 해당 ip에 ssh 접속이 되는지 봅시다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오~~ 완료&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.53.28.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRtwUg/btsQkTvNUcW/qT1b94kC08l8pLikCZ7OKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRtwUg/btsQkTvNUcW/qT1b94kC08l8pLikCZ7OKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRtwUg/btsQkTvNUcW/qT1b94kC08l8pLikCZ7OKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRtwUg%2FbtsQkTvNUcW%2FqT1b94kC08l8pLikCZ7OKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;451&quot; data-filename=&quot;스크린샷 2025-09-04 오전 9.53.28.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;451&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;</description>
      <category>Kubernetes</category>
      <author>얀타호수</author>
      <guid isPermaLink="true">https://uchive.tistory.com/51</guid>
      <comments>https://uchive.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 4 Sep 2025 09:54:30 +0900</pubDate>
    </item>
  </channel>
</rss>