<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>SummerToday</title>
        <link>https://velog.io/</link>
        <description>블로그 이관했습니다.</description>
        <lastBuildDate>Wed, 18 Sep 2024 11:37:10 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>SummerToday</title>
            <url>https://velog.velcdn.com/images/summer_today/profile/6c9b88f2-1423-4a7e-8139-4842329fd0c9/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. SummerToday. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/summer_today" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[EC2 인스턴스 생성 - 상세 옵션 살펴보기  ]]></title>
            <link>https://velog.io/@summer_today/EC2-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@summer_today/EC2-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Wed, 18 Sep 2024 11:37:10 GMT</pubDate>
            <description><![CDATA[<h2 id="ec2-인스턴스-생성">EC2 인스턴스 생성</h2>
<p>필요한 리소스들이 모두 준비되었으므로 EC2 인스턴스를 생성할 수 있다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/2575b306-b95d-4358-bf8b-2bc0ace28586/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>애플리케이션 및 OS 이미지(Amazon Machine Image)
인스턴스에 사용할 운영 체제나 애플리케이션 서버가 포함된 AMI(Amazon Machine Image)를 선택하는 부분이다. 여기에서 사용 가능한 AMI들이 나열되어 있으며, Amazon Linux, macOS, Ubuntu, Windows, Red Hat 등이 포함되어 있다.</p>
<br>

</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/2c7297a3-68b9-437e-9685-36bc4f1d011f/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>인스턴스 유형
인스턴스에 할당할 하드웨어 자원을 선택하는 섹션이다. </p>
</li>
<li><p>키 페어(로그인)
인스턴스에 안전하게 접속하기 위한 키 페어를 설정하는 섹션이다. 
필요한 경우 새로운 키 페어를 생성할 수 있는 옵션도 제공된다.</p>
</li>
</ul>
<br>

<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/e0107142-0f0c-438a-b2c8-ca05a959da76/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>VPC
인스턴스가 속할 VPC(Virtual Private Cloud)를 선택하는 섹션이다. </p>
</li>
<li><p>서브넷
선택된 VPC 내에서 인스턴스가 속할 서브넷을 선택하는 부분이다.</p>
</li>
<li><p>퍼블릭 IP 자동 할당 
퍼블릭 IP 주소를 자동으로 할당할지 여부를 설정하는 옵션이다. </p>
<blockquote>
<p>퍼블릭 서브넷에 배치할 EC2 인스턴스의 경우, 대부분의 경우 퍼블릭 IP 자동 할당 옵션을 활성화하는 것이 일반적이다.
퍼블릭 IP가 필요 없는 인스턴스(예: 프라이빗 서브넷에 있는 데이터베이스 서버 등)에서는 해당 옵션을 비활성화한다.</p>
</blockquote>
</li>
<li><p>방화벽(보안 그룹)
인스턴스에 대한 트래픽을 제어하는 방화벽 규칙을 설정하는 섹션이다. 사용자는 새로운 보안 그룹을 생성하거나 기존 보안 그룹을 선택할 수 있다. </p>
</li>
<li><p>디바이스 인덱스 (Device Index)
네트워크 인터페이스의 순서를 나타낸다. 일반적으로 인덱스 0은 기본 네트워크 인터페이스에 할당되며, 추가적인 인터페이스를 구성할 때는 인덱스가 증가한다.</p>
<blockquote>
<ul>
<li>디바이스 인덱스 0에 할당된 네트워크 인터페이스는 기본 네트워크 인터페이스로 간주된다.<br></li>
<li>기본 네트워크 인터페이스는 인스턴스가 부팅될 때 자동으로 연결되며, 이 네트워크 인터페이스를 통해 기본적으로 인터넷 연결이나 네트워크 트래픽이 이루어진다.<br></li>
<li>기본 네트워크 인터페이스는 삭제할 수 없으며, 인스턴스가 종료될 때까지 항상 존재한다.<br></li>
<li>디바이스 인덱스 1 이상에 할당된 네트워크 인터페이스는 추가 네트워크 인터페이스로 간주된다.<br></li>
<li>추가 인터페이스는 하나의 인스턴스가 여러 네트워크에 동시에 연결될 수 있도록 하거나, 특정 트래픽을 분리하기 위해 사용할 수 있다.<br></li>
<li>예를 들어, 하나의 네트워크 인터페이스는 공용 서브넷에 연결하고 다른 인터페이스는 프라이빗 서브넷에 연결하는 구조로 구성할 수 있다.</li>
</ul>
</blockquote>
</li>
<li><p>기본 IP 주소 (Primary IP Address)
선택된 네트워크 인터페이스에 할당할 기본 IP 주소를 설정한다. AWS에서 제공하는 기본 설정을 따르거나, 사용자가 직접 IP 주소를 지정할 수 있다. </p>
</li>
<li><p>보조 IP 주소 (Secondary IP Addresses)
인스턴스에 추가로 할당할 수 있는 IP 주소이다. 하나의 네트워크 인터페이스에 여러 개의 IP 주소를 할당할 수 있으며, 각 IP 주소는 추가적인 서비스나 애플리케이션에 사용할 수 있다. 이는 고가용성 구성이나 복수의 네트워크 인터페이스를 필요로 하는 경우에 유용하다</p>
</li>
<li><p>IPv6 IP
선택된 서브넷에서 인스턴스에 IPv6 주소를 할당할 수 있는 옵션이다. IPv4와 달리 IPv6는 훨씬 더 많은 주소 공간을 제공하며, 특정 네트워크에서 IPv6 주소가 필요할 경우 이 옵션을 사용할 수 있다.</p>
</li>
<li><p>IPv6 접두사 (IPv6 Prefix Delegation)
서브넷에 IPv6 CIDR 블록을 설정하여 인스턴스에 자동으로 IPv6 주소를 할당할 수 있는 옵션이다.</p>
<blockquote>
<p>서브넷을 생성할 때 x.x.x.x/y 형식으로 CIDR 블록을 정의하는데, 여기서 IPv6 접두사는 /y 부분을 의미한다.</p>
</blockquote>
</li>
<li><p>기본 IPv6 IP 활성 (Enable Primary IPv6)
기본 IPv6 주소의 활성화 여부를 설정한다. 기본적으로 선택된 서브넷이 IPv6 주소를 지원하는 경우에만 이 옵션이 사용 가능하다.</p>
</li>
<li><p>종료 시 삭제 (Delete on Termination)
인스턴스가 종료될 때 이 네트워크 인터페이스를 자동으로 삭제할지 여부를 결정하는 옵션이다. 이 옵션을 활성화하면 인스턴스가 종료되면서 관련된 네트워크 인터페이스도 함께 삭제된다. 이는 자원 관리를 단순화하는 데 도움이 된다.</p>
</li>
</ul>
<br>

<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/25e19330-7ff9-4063-b589-bcc5fc08a7b0/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>Elastic Fabric Adapter (EFA)
활성화 체크박스를 통해 EFA를 활성화할 수 있다.</p>
<blockquote>
<p>EFA는 고성능 컴퓨팅(HPC) 작업 부하 및 머신 러닝 애플리케이션에서 사용되는 네트워크 인터페이스로, 높은 처리량과 낮은 지연 시간을 제공한다.</p>
</blockquote>
</li>
<li><p>네트워크 카드 인덱스
네트워크 카드 인덱스를 선택할 수 있는 옵션이다.</p>
<blockquote>
<p>인스턴스에 여러 개의 네트워크 인터페이스(ENI)가 있을 때, 각 네트워크 인터페이스를 구분하는 데 사용된다. 여러 네트워크 카드를 지원하지 않는 인스턴스 유형일 경우 이 옵션이 비활성화된다.</p>
</blockquote>
</li>
<li><p>ENA Express UDP
ENA Express를 사용하는 동안 UDP(사용자 데이터그램 프로토콜)를 통한 네트워크 전송 성능을 향상시키기 위한 옵션이다.
선택한 인스턴스가 ENA Express를 지원하지 않기 때문에 현재 이 옵션도 사용 불가능하다.</p>
</li>
<li><p>유휴 연결 추적 제한 시간
이 옵션은 활성화할 경우, 인스턴스의 유휴 상태에서 연결을 유지하는 시간에 제한을 두는 기능이다. 네트워크 연결이 유휴 상태일 때 이를 추적하고 제한하는 기능으로, 보안 및 성능 최적화에 사용될 수 있다.</p>
<blockquote>
<p>유휴 상태(Idle State)는 네트워크 연결 또는 컴퓨팅 자원이 아무런 작업을 하지 않고 있는 상태를 의미한다. 유휴 상태는 시스템 자원을 사용하지 않으면서도 네트워크 연결을 유지하고 있기 때문에, 적절히 관리되지 않으면 자원 낭비가 발생할 수 있다.</p>
</blockquote>
</li>
</ul>
<br>

<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/48f800e4-830f-48d3-b896-dcf7869de64c/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>스토리지 구성
이 섹션은 인스턴스에 연결할 스토리지를 설정하는 부분이다. 스토리지는 EBS(Elastic Block Store) 볼륨으로 제공되며, EC2 인스턴스에 영구적인 블록 스토리지를 제공한다.</p>
</li>
<li><p>볼륨 크기:
현재 설정된 볼륨의 크기는 8 GiB로 설정되어 있다.
볼륨 크기를 자유롭게 조정할 수 있으며, 인스턴스의 운영 체제, 애플리케이션, 데이터 등을 저장하는 데 사용된다.</p>
<blockquote>
<p>cf. 프리 티어(Free Tier)를 사용할 경우 최대 30 GiB의 SSD 또는 마그네틱 스토리지를 사용할 수 있다.</p>
</blockquote>
<blockquote>
<p>Gib vs Gb</p>
<ul>
<li>1 GiB = 1,024 MiB (메비바이트) = 1,024^3 바이트 = 1,073,741,824 바이트<br></li>
<li>1 GB = 1,000 MB (메가바이트) = 1,000^3 바이트 = 1,000,000,000 바이트</li>
</ul>
</blockquote>
</li>
<li><p>스토리지 유형 
EC2 인스턴스에 사용할 수 있는 EBS(Elastic Block Store) 볼륨의 종류를 의미한다. </p>
<blockquote>
<table>
<thead>
<tr>
<th>유형</th>
<th>설명</th>
<th>최대 IOPS</th>
<th>최대 처리량 (MB/s)</th>
<th>주요 사용 사례</th>
</tr>
</thead>
<tbody><tr>
<td><strong>gp3</strong></td>
<td>일반 목적 SSD, 성능과 비용 균형</td>
<td>16,000</td>
<td>1,000</td>
<td>다양한 범용 워크로드, 웹 서버, 개발 환경</td>
</tr>
<tr>
<td><strong>gp2</strong></td>
<td>일반 목적 SSD, 볼륨 크기 따라 성능 결정</td>
<td>16,000</td>
<td>250</td>
<td>다양한 범용 워크로드, 웹 서버, 개발 환경</td>
</tr>
<tr>
<td><strong>io2</strong></td>
<td>고성능 SSD, 높은 IOPS와 신뢰성 제공</td>
<td>64,000</td>
<td>1,000</td>
<td>고성능 데이터베이스, 트랜잭션 많은 애플리케이션</td>
</tr>
<tr>
<td><strong>st1</strong></td>
<td>처리량 최적화 HDD, 순차적 읽기/쓰기 용도</td>
<td>500</td>
<td>500</td>
<td>빅 데이터, 데이터 분석, 로그 처리</td>
</tr>
<tr>
<td><strong>sc1</strong></td>
<td>저비용 콜드 HDD, 자주 액세스하지 않는 데이터</td>
<td>250</td>
<td>250</td>
<td>아카이브, 백업, 로그 데이터 보관</td>
</tr>
</tbody></table>
</blockquote>
</li>
<li><p>루트 볼륨
현재 선택된 스토리지는 루트 볼륨으로 설정되어 있으며, 이 볼륨은 인스턴스가 부팅될 때 운영 체제가 설치되는 볼륨이다.</p>
<blockquote>
<p>루트 볼륨은 인스턴스가 종료될 때 삭제되도록 설정할 수 있으며, 기본적으로는 인스턴스와 함께 유지된다.</p>
</blockquote>
</li>
<li><p>새 볼륨 추가
추가적인 볼륨을 설정하고 싶을 경우, 새 볼륨 추가 버튼을 클릭하여 추가 스토리지를 인스턴스에 연결할 수 있다.</p>
<blockquote>
<p>여러 개의 볼륨을 인스턴스에 연결하여, 다양한 데이터나 애플리케이션을 별도로 저장하는 것이 가능하다.</p>
</blockquote>
</li>
<li><p>백업 정보
백업 관련 정보는 Data Lifecycle Manager 정책에 따라 관리된다. 이 정책에 따라 인스턴스의 백업이 자동으로 생성될 수 있으며, 사용자는 이를 관리할 수 있다.</p>
<blockquote>
<p>백업을 자동화하거나 수동으로 백업할 수 있으며, 이 섹션은 해당 설정을 보여준다.</p>
</blockquote>
</li>
<li><p>0x 파일 시스템
이 항목은 파일 시스템이 아직 설정되지 않았음을 나타낸다. 인스턴스의 스토리지에 파일 시스템이 필요할 경우, 파일 시스템을 설정해야 한다.</p>
<blockquote>
<p>&quot;0x&quot;는 파일 시스템이 없음을 나타내는 특수한 상태 메시지이다.</p>
</blockquote>
</li>
</ul>
<br>

<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/d8e018bd-46eb-40a0-a243-2c6fa380dce2/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>도메인 조인 디렉터리
해당 옵션은 디렉터리 서비스를 사용하여 인스턴스를 도메인에 가입시키는 설정이다. 도메인 조인을 통해 인스턴스가 도메인 환경 내에서 인증, 액세스 제어, 디렉터리 기반의 네트워크 설정 등을 지원받을 수 있다.</p>
</li>
<li><p>IAM 인스턴스 프로파일
IAM 인스턴스 프로파일은 EC2 인스턴스에 IAM 역할을 부여하여 해당 인스턴스가 AWS 리소스에 접근할 수 있는 권한을 부여하는 설정이다.    </p>
<blockquote>
<p>예를 들어, 인스턴스가 S3 버킷이나 DynamoDB와 통신해야 하는 경우, IAM 인스턴스 프로파일을 통해 권한을 관리할 수 있다.</p>
</blockquote>
</li>
<li><p>호스트 이름 유형
해당 설정은 인스턴스의 호스트 이름을 구성하는 방식이다.</p>
<ul>
<li><p>IP 이름
호스트 이름이 IP 주소를 기반으로 자동으로 생성된다.</p>
</li>
<li><p>리소스 이름 기반
호스트 이름을 리소스 이름을 기반으로 할지 여부를 선택할 수 있다.</p>
</li>
</ul>
</li>
<li><p>DNS 호스트 이름
EC2 인스턴스가 네트워크에서 식별되기 위해 사용되는 도메인 이름을 의미한다.</p>
<blockquote>
<p>호스트 이름 유형은 내부 식별 방식이고, DNS 호스트 이름은 외부 또는 네트워크 상에서 접근 가능한 도메인 이름 설정이라는 차이가 있다.</p>
</blockquote>
<ul>
<li><p>IPv4 DNS 요청 활성화
이 옵션을 활성화하면 인스턴스에 대한 IPv4 DNS 레코드(A 레코드)가 생성된다.</p>
</li>
<li><p>리소스 기반 IPv4 DNS 요청 활성화
리소스 이름을 기반으로 한 IPv4 DNS 레코드를 요청할 수 있다.</p>
</li>
<li><p>리소스 기반 IPv6 DNS 요청 활성화 
활성화 시 인스턴스에 대한 IPv6 DNS 레코드(AAAA 레코드)를 생성할 수 있다.</p>
</li>
</ul>
</li>
<li><p>인스턴스 자동 복구
이 옵션은 인스턴스가 장애로 인해 종료되었을 때, AWS에서 자동으로 복구할지를 설정하는 기능이다. 이 설정을 활성화하면 장애 발생 시 자동으로 인스턴스를 다시 실행할 수 있다.</p>
</li>
<li><p>종료 동작
인스턴스가 종료될 때의 동작을 설정할 수 있다. 옵션은 중지(Stop) 또는 종료(Terminate)로 선택할 수 있으며, 중지를 선택하면 인스턴스가 완전히 삭제되지 않고 정지 상태로만 유지된다.</p>
</li>
<li><p>최대 절전 중지 방식
인스턴스의 최대 절전 모드를 활성화할지 여부를 설정하는 옵션이다. 최대 절전 모드는 인스턴스의 상태를 그대로 유지한 채 메모리와 상태를 저장한 후 인스턴스를 중지하고, 필요 시 다시 실행할 수 있게 한다.</p>
</li>
<li><p>종료 방지
해당 설정을 통해 인스턴스를 실수로 종료하는 것을 방지할 수 있다. 이 옵션을 활성화하면 사용자가 실수로 인스턴스를 종료하지 못하도록 보호해 준다.</p>
</li>
<li><p>중지 방지
중지 방지는 인스턴스가 의도치 않게 중지되지 않도록 하는 설정이다. 이 옵션을 활성화하면, 인스턴스가 실수로 중지되지 않도록 보호할 수 있다.</p>
</li>
<li><p>세부 CloudWatch 모니터링
이 옵션을 활성화하면 AWS CloudWatch에서 인스턴스의 세부 모니터링 정보를 더 자주 수집할 수 있다. </p>
<blockquote>
<p>기본 모니터링은 5분 간격으로 이루어지지만, 세부 모니터링을 활성화하면 1분 간격으로 모니터링 데이터를 수집할 수 있다.</p>
</blockquote>
</li>
<li><p>크레딧 사양
이 설정은 T2/T3 인스턴스에 대한 CPU 크레딧 사용 방식을 선택하는 옵션이다.</p>
<ul>
<li><p>기본
인스턴스가 기본 성능 이하로 동작할 때는 CPU 크레딧을 축적하고, 이를 사용하여 성능을 향상시키지만, 크레딧이 다 소진될 시 인스턴스는 다시 기본 성능 수준으로 돌아간다.</p>
</li>
<li><p>무제한
인스턴스가 초과 CPU 사용량을 처리할 수 있지만, 추가 요금이 발생할 수 있다.</p>
<blockquote>
<p>CPU 크레딧은 인스턴스가 기본 성능 이상으로 CPU를 사용하는 시간을 의미한다. 각 크레딧은 1 CPU 코어를 100%로 1분간 사용할 수 있는 권리를 나타낸다.</p>
<p>CPU 크레딧이 있는 한, 인스턴스는 CPU 사용량을 급격히 높일 수 있으며, 이를 버스트 성능이라고 한다.</p>
</blockquote>
</li>
</ul>
<blockquote>
<p>cf. T2, T3, T3a 인스턴스와 같은 버스트 가능한(변동 가능한) 성능 인스턴스에서 사용하는 개념이다. </p>
</blockquote>
</li>
<li><p>배치 그룹
배치 그룹은 인스턴스의 물리적인 배치 전략을 설정할 수 있는 옵션이다. 이를 통해 인스턴스를 특정 하드웨어 또는 네트워크 인프라에서 배치하여 성능을 최적화할 수 있다.</p>
<ul>
<li><p>클러스터 배치
동일한 물리적 하드웨어에 인스턴스를 배치하여 높은 네트워크 처리량을 보장.</p>
</li>
<li><p>분산 배치
물리적으로 서로 다른 하드웨어에 인스턴스를 분산 배치하여 장애 내성을 강화.</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/fa8710f0-3ed2-4c2d-83ed-b373ee4203e2/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>EBS 최적 인스턴스
EBS 최적화를 활성화하면, 인스턴스가 EBS와 통신할 때 전용 네트워크 대역폭을 사용할 수 있다. 이는 디스크 I/O와 네트워크 트래픽이 서로 영향을 주지 않도록 하여 성능을 최적화할 수 있는 기능이다.</p>
</li>
<li><p>구매 옵션</p>
<ul>
<li><p>없음
표준 온디맨드 인스턴스 형태로 인스턴스를 실행한다.</p>
</li>
<li><p>스팟 인스턴스
스팟 인스턴스를 선택하면, 온디맨드 가격보다 저렴한 스팟 가격으로 인스턴스를 실행할 수 있다. 이는 AWS가 남는 컴퓨팅 자원을 저렴하게 제공하는 방식이며, 자원이 부족할 경우 스팟 인스턴스가 종료될 수 있다.</p>
</li>
</ul>
</li>
<li><p>용량 예약
특정 가용 영역에서 용량을 예약하여, 나중에 사용하기 위해 인스턴스 실행 시 용량을 확보할 수 있다. 이를 통해 특정 시점에 필요한 리소스를 미리 확보해 둘 수 있다.</p>
</li>
<li><p>테넌시
테넌시(Tenancy)는 인스턴스가 공유 하드웨어에서 실행될지, 아니면 전용 하드웨어에서 실행될지를 결정한다.</p>
<ul>
<li><p>공유 인스턴스
여러 고객이 동일한 물리적 서버를 공유하는 방식.</p>
</li>
<li><p>전용 인스턴스 또는 전용 호스트
하나의 고객만 물리적 서버를 사용할 수 있도록 하여, 보안과 규제 준수를 강화하는 방식.</p>
</li>
</ul>
</li>
<li><p>RAM 디스크 ID
커스텀 RAM 디스크를 사용할 수 있는 설정이다. 특정 커널을 사용할 때 RAM 디스크를 지정할 수 있으며, 해당 옵션은 일반적인 사용자는 거의 설정하지 않는다.</p>
</li>
<li><p>커널 ID
EC2 인스턴스가 특정 커널을 사용해야 할 때, 이 커널 ID를 지정할 수 있다. AWS의 일반적인 AMI는 커널을 자동으로 설정하지만, 특수한 커널을 사용해야 할 때 이 옵션을 사용한다.</p>
</li>
<li><p>Nitro Enclave
Nitro Enclave는 보안과 데이터 격리를 강화하기 위해 사용되는 AWS 기능이다. 민감한 데이터를 안전하게 처리할 수 있도록 하며, 데이터 보호와 애플리케이션 보안 강화를 위해 사용된다.</p>
</li>
<li><p>라이선스 구성
이 옵션을 통해 인스턴스에 적용할 소프트웨어 라이선스를 지정할 수 있다. AWS에서 제공하는 라이선스를 사용할지, 사용자가 소유한 라이선스를 가져와서 사용할지를 선택할 수 있다.</p>
</li>
<li><p>CPU 옵션
CPU 옵션 지정을 선택하면, 인스턴스가 사용할 CPU 코어 수와 스레드 수를 사용자 정의할 수 있다.
이 옵션은 라이선스 비용을 절감하거나, 워크로드 성능 최적화를 위해 인스턴스의 CPU 구성을 조정하는 데 유용하다.</p>
</li>
<li><p>메타데이터 액세스 가능
EC2 인스턴스에서 인스턴스 메타데이터에 접근할 수 있는지 여부를 결정하는 설정이다. 기본적으로 활성화되어 있으며, 인스턴스 메타데이터는 인스턴스 ID, AMI ID 등과 같은 중요한 정보를 제공한다.</p>
</li>
<li><p>메타데이터 IPv6 엔드포인트
인스턴스가 IPv6 주소를 사용해 메타데이터 엔드포인트에 접근할 수 있는지 여부를 설정하는 옵션이다. IPv6을 사용하는 네트워크 환경에서 유용하다.</p>
</li>
<li><p>메타데이터 버전
메타데이터 버전 2를 사용하도록 설정된 상태이다. 메타데이터 버전 2는 더 높은 보안성을 제공하며, 메타데이터 요청에 세션 토큰을 포함하는 방식으로 안전하게 정보를 접근할 수 있다.
V1과 V2는 메타데이터에 접근하는 방식에 차이가 있으며, V2는 보안 측면에서 개선된 버전이다.</p>
</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/4b039c7f-27b3-4378-8e36-a3f8c56aa78a/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>메타데이터 응답 홉 제한(Metadata Response Hop Limit) 
EC2 인스턴스의 인스턴스 메타데이터 서비스(Instance Metadata Service, IMDS)에 접근할 때 적용되는 네트워크 홉(hop)의 최대 수를 설정하는 옵션이다.</p>
<blockquote>
<ul>
<li>인스턴스 메타데이터 서비스(Instance Metadata Service, IMDS)
AWS EC2 인스턴스에서 실행 중인 애플리케이션이나 사용자 스크립트가 인스턴스와 관련된 정보를 검색할 수 있도록 AWS가 제공하는 서비스이다. </li>
</ul>
<p>메타데이터에는 메타데이터는 인스턴스에 대한 정보를 담고 있는 데이터이다. 인스턴스 메타데이터에는 인스턴스 ID, AMI ID, 지역, 퍼블릭/프라이빗 IP 주소, 보안 그룹, 인스턴스 유형 등과 같은 다양한 정보가 포함된다. </p>
</blockquote>
<blockquote>
<p>홉 제한을 1로 설정하면 인스턴스 내부에서만 메타데이터 서비스에 접근할 수 있어 보안을 강화할 수 있다. 이렇게 하면 외부 네트워크나 다른 인스턴스에서 메타데이터를 요청하는 시도를 차단할 수 있다.</p>
</blockquote>
<blockquote>
<p>홉 제한을 2로 설정하면 더 많은 네트워크 홉을 허용하므로, 외부 네트워크나 다른 인스턴스에서도 메타데이터에 접근할 수 있게 설정할 수 있다. 이는 보안상 위험할 수 있다.</p>
</blockquote>
<ul>
<li><p>메타데이터에서 태그 허용
EC2 인스턴스의 메타데이터 서비스(Instance Metadata Service, IMDS)를 통해 인스턴스의 태그 정보를 조회할 수 있는 기능을 말한다. 이 기능이 활성화되면, 인스턴스 태그를 EC2 인스턴스 메타데이터에서 직접 가져와서 사용할 수 있다.</p>
</li>
<li><p>사용자 데이터
EC2 인스턴스가 시작될 때 실행할 스크립트 또는 명령어를 제공하는 데 사용된다. 인스턴스가 시작될 때 자동으로 실행되어 인스턴스 설정을 초기화하거나 애플리케이션을 설치하는 데 유용하다.</p>
<blockquote>
<p>사용자 데이터가 이미 base64로 인코딩되어 있음 체크박스는 사용자가 제공한 데이터가 이미 Base64로 인코딩되어 있는 경우에 선택하는 옵션이다. 이 경우 AWS는 데이터를 추가로 인코딩하지 않고 바로 사용한다.</p>
</blockquote>
</li>
</ul>
<blockquote>
<p>ex. Bash 스크립트 예시
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd</p>
</blockquote>
</li>
</ul>
<br>

<h2 id="eipelastic-ip-할당-및-연결">EIP(Elastic IP) 할당 및 연결</h2>
<p>고정된 공용 IP 주소를 원할 경우 Elastic IP를 할당하여 인스턴스에 연결할 수 있다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/fe85ff29-b04f-46c4-846f-a85dcf7c8ba4/image.png" alt=""></p>
</blockquote>
<p>현 상황에서는 위에서 VPC를 생성할 때 생성된 NAT 게이트웨이에 자동으로 할당된 EIP 2개 존재하고 있다. 여기서 EC2에 할당할 EIP 1개를 더 생성해준다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/b87edac9-4bbd-4b06-82b1-fde3e00f71db/image.png" alt=""></p>
</blockquote>
<p>위와 같이 EIP 할당 후 [작업] -&gt; [탄력적 IP 주소 연결] 버튼을 눌러 다음과 같이 인스턴스와 연결해준다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/6fdad127-cb6f-4182-b795-fd41a4241232/image.png" alt=""></p>
</blockquote>
<p>EC2 대시보드에서 보면 아래와 같이 정상적으로 EIP(퍼블릭 IP)가 정상적으로 할당된 것을 확인할 수 있다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/2d0f9ef0-17f5-42c3-8165-531abda8a7b7/image.png" alt=""></p>
</blockquote>
<br>

<h2 id="ssh-접속-테스트">SSH 접속 테스트</h2>
<ul>
<li><p>PuTTYgen을 통한 키 변환
이전에 받아놓은 .pem키를 putty에서 사용하기 위해 .ppk형식으로 변환해준다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/1bd67038-7180-47fe-a863-66758a3c48e5/image.png" alt=""></p>
</blockquote>
<p>Load 버튼을 누르고 파일 형식을 All Files로 바꾼 뒤 이전에 받아 놓은 .pem 키를 선택한다. </p>
<br>

<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/b4b7a2e1-bb52-47db-ac4e-d3b0c6af4109/image.png" alt=""></p>
</blockquote>
<p>Save private key 버튼을 눌러 .ppk 형식으로 변환한다.</p>
<br>
</li>
<li><p>putty를 실행하여 Session 탭에서 IP address에 EC2에 할당했던 EIP(43.202.234.7)를 적어주고 SSH 포트 번호인 22번을 적어준다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/c32d089f-6e8b-4759-acab-174b56317899/image.png" alt=""></p>
</blockquote>
<br>

<p>Connection -&gt; SSH -&gt; Auth -&gt; Credential 탭에서 Private key files for authentication에서 Browse 버튼을 눌러 아까 생성한 .ppk 파일을 선택한다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/c2480a35-f91c-4e87-b41c-841bf29a8515/image.png" alt=""></p>
</blockquote>
<br>

<p>Open을 눌러 해당 서버에 접속한다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/3e193fc1-9178-4514-b9e0-d74b1a152f76/image.png" alt=""></p>
</blockquote>
<br>

<p>다음과 같이 정상적으로 접속되는 것을 확인할 수 있다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/2550bd5c-571f-4996-a88a-25d0cd2d8b22/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>cf. 만약 접속이 안된다면 보안 그룹에 자신의 IP를 22번 포트로 들어올 수 있도록 인바운드 규칙을 편집을 해주었는지 다시 한번 확인한다. 또는 EC2가 퍼블릭 서브넷에 배치되어 있지 않고, 프라이빗 서브넷에 배치되어 있는지 확인한다.</p>
</blockquote>
<blockquote>
<p>cf. 프라이빗 서브넷에 있는 EC2에 접근하기 위해서는 배스천 호스트를 통해 접근하거나 VPN 연결을 통해 접속해야한다.</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS EC2 인프라 구성]]></title>
            <link>https://velog.io/@summer_today/EC2-%EC%83%9D%EC%84%B1-%EA%B3%BC%EC%A0%95</link>
            <guid>https://velog.io/@summer_today/EC2-%EC%83%9D%EC%84%B1-%EA%B3%BC%EC%A0%95</guid>
            <pubDate>Tue, 17 Sep 2024 10:45:45 GMT</pubDate>
            <description><![CDATA[<p>EC2 인스턴스를 여태 생성하면서 너무 생각없이 인스턴스들을 무작정 만들고 사용했던 것 같았다. 이제는 EC2를 생성하기 위해 어떠한 리소스들이 왜 필요한지 생각해보면서 리소스들의 옵션들은 어떤 의미가 담겨있고, 어떻게 설정해야 하는지를 확실히 하기 위해 해당 포스팅을 작성한다.</p>
<h2 id="1-vpc-서브넷-nat-게이트웨이-리소스-생성">1. VPC, 서브넷, NAT 게이트웨이 리소스 생성</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/161770bf-c8fb-4c54-8549-2ce7156d59d1/image.png" alt=""></p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/7a2d4a57-fc47-4c58-ae86-47aa0cdc6ffd/image.png" alt=""></p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/59cb1e0d-7003-466f-8c2e-a25989798914/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>VPC만 / VPC 등</p>
<ul>
<li><p><code>VPC만</code>: VPC를 단독으로 생성하는 옵션.</p>
</li>
<li><p><code>VPC 등</code>: VPC와 함께 서브넷, 인터넷 게이트웨이, NAT 게이트웨이 등 여러 네트워크 리소스를 한 번에 생성할 수 있는 옵션.</p>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>이름 태그 자동 생성</p>
<ul>
<li>자동 생성
입력한 이름(<code>test</code>)이 VPC 및 해당 리소스의 태그로 자동 할당되는 옵션.</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>IPv6 CIDR 블록</p>
<ul>
<li><p>IPv6 CIDR 블록 없음 
VPC에 IPv6 CIDR 블록을 할당하지 않는 옵션.</p>
</li>
<li><p>Amazon 제공 IPv6 CIDR 블록
Amazon에서 제공하는 IPv6 CIDR 블록을 VPC에 할당하는 옵션.</p>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>테넌시</p>
<ul>
<li><p>기본값
VPC 내의 인스턴스가 공유된 하드웨어에서 실행되는 기본 설정.</p>
</li>
<li><p>전용
단일 고객에게 물리적 서버를 전용으로 할당하는 옵션이다. 전용: 규제 준수, 라이선스 요구사항, 또는 하드웨어 수준의 격리가 필요한 경우에 사용된다.</p>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>가용 영역 (AZ) 수</p>
<ul>
<li><p>AZ 수
서브넷을 분산 배치할 가용 영역의 수를 설정. 예시에서는 2개의 가용 영역을 선택.</p>
</li>
<li><p>첫 번째 가용 영역
첫 번째 서브넷이 배치될 가용 영역. </p>
</li>
<li><p>두 번째 가용 영역
두 번째 서브넷이 배치될 가용 영역.</p>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>퍼블릭 서브넷 수 및 프라이빗 서브넷 수</p>
<ul>
<li><p>퍼블릭 서브넷 수
퍼블릭 서브넷을 몇 개 생성할지를 설정. </p>
</li>
<li><p>프라이빗 서브넷 수
프라이빗 서브넷을 몇 개 생성할지를 설정.</p>
</li>
</ul>
<blockquote>
<p>cf. 서브넷 설계 사이트
<a href="https://www.solarwinds.com/free-tools/advanced-subnet-calculator">https://www.solarwinds.com/free-tools/advanced-subnet-calculator</a></p>
</blockquote>
</li>
</ul>
<br>

<ul>
<li><p>서브넷 CIDR 블록</p>
<ul>
<li><p>ap-northeast-2a 퍼블릭 서브넷 CIDR 블록
<code>192.168.0.0/28</code> (총 16개의 IP 주소)</p>
</li>
<li><p>ap-northeast-2b 퍼블릭 서브넷 CIDR 블록
<code>192.168.0.16/28</code> (총 16개의 IP 주소)</p>
</li>
<li><p>ap-northeast-2a 프라이빗 서브넷 CIDR 블록
<code>192.168.0.32/27</code> (총 32개의 IP 주소)</p>
</li>
<li><p>ap-northeast-2b 프라이빗 서브넷 CIDR 블록
<code>192.168.0.64/27</code> (총 32개의 IP 주소)</p>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>NAT 게이트웨이</p>
<ul>
<li><p>NAT 게이트웨이 없음
NAT 게이트웨이를 생성하지 않음.</p>
</li>
<li><p>AZ당 1개
가용 영역당 NAT 게이트웨이를 1개씩 생성하는 옵션.</p>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>VPC 엔드포인트</p>
<ul>
<li><p>없음
VPC 엔드포인트를 생성하지 않음.</p>
</li>
<li><p>S3 게이트웨이
Amazon S3에 대한 게이트웨이 VPC 엔드포인트를 생성하는 옵션.</p>
<blockquote>
<p>S3 게이트웨이는 AWS VPC 엔드포인트 중 하나로, VPC 내부에서 Amazon S3에 안전하게 접근할 수 있도록 해주는 서비스다. 이 옵션을 활성화하면, VPC 내의 리소스들이 인터넷을 거치지 않고 S3 버킷에 직접 접근할 수 있다.</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>DNS 옵션</p>
<ul>
<li><p>DNS 호스트 이름 활성화
VPC 내에서 EC2 인스턴스의 DNS 호스트 이름을 활성화.</p>
<blockquote>
<p>활성화 시: 인스턴스에 도메인 이름이 할당되어 쉽게 접근 가능.
비활성화 시: 도메인 이름 없이 IP 주소로만 접근 가능, 관리가 불편.</p>
</blockquote>
</li>
<li><p>DNS 확인 활성화
VPC 내에서 DNS 확인 기능을 활성화.</p>
<blockquote>
<p>활성화 시: AWS 제공 DNS 서버를 통해 VPC 내부 및 외부 도메인 이름 해석 가능.
비활성화 시: VPC 내의 리소스가 도메인 이름 해석 불가하고 외부 DNS 서버 설정 필요, 네트워크 관리 복잡성 증가.</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>추가 태그</p>
<ul>
<li>추가 태그
VPC 및 해당 리소스에 추가적인 태그를 할당할 수 있는 옵션. 이는 리소스 관리를 용이하게 함.</li>
</ul>
</li>
</ul>
<br>  


<h2 id="2-라우팅-테이블route-table-설정">2. 라우팅 테이블(Route Table) 설정</h2>
<h3 id="퍼블릭-서브넷-라우팅-테이블-설정">퍼블릭 서브넷 라우팅 테이블 설정</h3>
<p>퍼블릭 서브넷의 인스턴스들이 인터넷과 통신할 수 있도록, 퍼블릭 서브넷에 연결된 라우팅 테이블에서 0.0.0.0/0 대상이 인터넷 게이트웨이를 선택되어 있는지 확인한다. 
만약 되어 있지 않다면 직접 편집 해준다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/f0ab1412-7b9e-4638-84e3-64a2a22f7c48/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>cf. 사진 상 두번째 라우팅 규칙은 VPC 내의 모든 서브넷이 서로 통신할 수 있도록 하는 기본적인 라우팅 규칙으로, 모든 VPC에서 기본적으로 존재한다.</p>
</blockquote>
<br>

<h3 id="프라이빗-서브넷-라우팅-테이블-설정">프라이빗 서브넷 라우팅 테이블 설정</h3>
<p>각 프라이빗 서브넷의 트래픽이 NAT 게이트웨이를 통해 나갈 수 있도록 0.0.0.0/0 대상이 NAT 게이트웨이로 선택되어 있는지 확인한다.
만약 되어 있지 않다면 직접 편집해준다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/46e2c4b8-2b6a-4a12-acc3-9281c4b977b3/image.png" alt=""></p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/b95745f1-63cf-487d-be06-d58e647a66aa/image.png" alt=""></p>
</blockquote>
<br>

<h2 id="3-보안-그룹security-group-생성-및-설정">3. 보안 그룹(Security Group) 생성 및 설정</h2>
<p>보안 그룹은 EC2 인스턴스에 대한 인바운드 및 아웃바운드 트래픽을 제어한다. VPC 생성 시 다음과 같이 기본적으로 1개의 최소 보안 그룹이 생성이 된다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/d6be5d38-fa2c-4558-a9ed-549841f6dcb6/image.png" alt=""></p>
</blockquote>
<p>보통은 보안 그룹을 별도로 생성하여 인스턴스에 할당하지만, 여기서는 연습용으로 생성하는 것이기에 기본 생성된 보안 그룹을 활용하여 EC2 인스턴스에 할당해준다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/fc4abe38-9416-46e1-a27b-dadaaf575c78/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>인터넷에서 들어오는 HTTP 트래픽을 허용하기 위해 80 포트, 소스 0.0.0.0/0으로 설정해준다.</p>
</li>
<li><p>인터넷에서 들어오는 HTTPS 트래픽을 허용하기 위해 443 포트, 소스 0.0.0.0/0으로 설정해준다.</p>
</li>
<li><p>특정 관리자의 IP 주소에서만 SSH로 서버에 접근할 수 있도록 내 PC의 IP를 소스로 하고 22번 포트로 설정해준다.</p>
</li>
</ul>
<br>

<h2 id="4-키-페어key-pair-생성">4. 키 페어(Key Pair) 생성</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/a7d07b07-e41a-41a9-9dc7-977986ccfd88/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>키 페어 유형</p>
<ul>
<li><p>RSA
RSA는 1970년대 후반에 개발되어, 수십 년간 널리 사용되어 온 표준 암호화 알고리즘이다. 그동안 다양한 시스템, 프로토콜, 소프트웨어가 RSA를 기반으로 개발되었기 때문에 대부분의 시스템과 완벽하게 호환된다.</p>
</li>
<li><p>ED25519
ED25519는 2011년에 제안된 최신 공개 키 암호화 알고리즘이다. 보안성과 효율성이 뛰어나지만, RSA에 비해 비교적 최근에 도입되었기 때문에 모든 시스템이나 소프트웨어가 ED25519를 지원하지 않을 수 있다.</p>
</li>
</ul>
<p>결국, 호환성이 중요한 환경에서는 RSA 키를 사용하는 것이 더 안전한 선택일 수 있지만, 최신 시스템이나 보안을 중시하는 환경에서는 ED25519를 선택할 수 있다. ED25519는 점차 더 널리 사용될 가능성이 크지만, 현재는 RSA만큼 보편적이지 않다.  </p>
<br>
</li>
<li><p>프라이빗 키 파일 형식
.pem과 .ppk 파일 형식은 모두 SSH 키 페어를 저장하는 데 사용되지만, 서로 다른 목적과 클라이언트에서 사용된다. </p>
<ul>
<li><p>.pem 파일</p>
<ul>
<li><p>파일 형식
<code>.pem</code> (Privacy Enhanced Mail) 파일은 OpenSSH와 호환되는 프라이빗 키 파일 형식으로, ASCII로 인코딩된 텍스트 파일이다.</p>
</li>
<li><p>사용 목적:</p>
<ul>
<li><p>Linux/macOS 환경
<code>.pem</code> 파일은 주로 Linux와 macOS에서 사용되는 OpenSSH 클라이언트와 호환된다.</p>
</li>
<li><p>SSH 접근
AWS EC2 인스턴스에 SSH로 접근할 때 사용된다.</p>
</li>
<li><p>사용 방법:</p>
<ul>
<li>SSH 명령어
<code>ssh -i /path/to/your-key.pem ec2-user@your-ec2-instance.amazonaws.com</code></li>
</ul>
</li>
<li><p>호환성</p>
<ul>
<li><p><code>.pem</code> 파일은 주로 OpenSSH 기반의 클라이언트에서 사용되며, Windows 환경에서는 기본적으로 지원되지 않는다.</p>
</li>
<li><p>Windows에서 WSL(Windows Subsystem for Linux) 또는 Windows 10/11의 기본 OpenSSH 클라이언트를 사용하는 경우에도 <code>.pem</code> 파일을 사용할 수 있다.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>.ppk 파일</p>
<ul>
<li><p>파일 형식
<code>.ppk</code> (PuTTY Private Key) 파일은 PuTTY에서 사용되는 프라이빗 키 파일 형식이다.</p>
</li>
<li><p>사용 목적</p>
<ul>
<li><p>Windows 환경: <code>.ppk</code> 파일은 주로 Windows에서 사용되는 PuTTY 클라이언트와 호환된다.</p>
</li>
<li><p>SSH 접근: PuTTY 클라이언트 또는 다른 Windows 기반 SSH 클라이언트에서 사용된다.</p>
</li>
</ul>
</li>
<li><p>사용 방법</p>
<ul>
<li><p>PuTTY 설정: PuTTY에서 &quot;SSH&quot; &gt; &quot;Auth&quot; 섹션에서 <code>.ppk</code> 파일을 선택하여 인증에 사용.</p>
</li>
<li><p>PuTTYgen: <code>.pem</code> 파일을 <code>.ppk</code> 파일로 변환하기 위해 사용되는 도구.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>호환성</p>
<ul>
<li><code>.ppk</code> 파일은 PuTTY를 사용하는 Windows 사용자에게 최적화되어 있으며, 다른 SSH 클라이언트에서는 기본적으로 지원되지 않는다.</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>상황별 선택</p>
<ul>
<li><p>Linux/macOS 사용 시
기본적으로 <code>.pem</code> 파일을 사용하는 것이 가장 적합하다.</p>
</li>
<li><p>Windows 사용 시
PuTTY를 사용한다면 <code>.ppk</code> 파일을 사용하는 것이 좋다. <code>.pem</code> 파일을 <code>.ppk</code> 파일로 변환해야 할 수도 있다.</p>
</li>
<li><p>여러 환경에서 사용 시
<code>.pem</code> 파일을 기본으로 사용하고, 필요에 따라 PuTTYgen을 사용하여 <code>.ppk</code> 파일로 변환하는 것이 유용하다.</p>
</li>
</ul>
</li>
</ul>
<br>

<h2 id="요약">요약</h2>
<ol>
<li><p>VPC 및 네트워크 리소스 생성</p>
<ul>
<li><p>VPC, 서브넷, NAT 게이트웨이 등을 생성.</p>
</li>
<li><p>가용 영역과 서브넷 수 설정.</p>
</li>
<li><p>퍼블릭/프라이빗 서브넷 CIDR 블록 지정.</p>
</li>
<li><p>DNS 옵션 및 VPC 엔드포인트 설정.</p>
</li>
</ul>
</li>
</ol>
<br>

<ol start="2">
<li><p>라우팅 테이블 설정</p>
<ul>
<li><p>퍼블릭 서브넷: 인터넷 게이트웨이로 라우팅.</p>
</li>
<li><p>프라이빗 서브넷: NAT 게이트웨이로 라우팅.</p>
</li>
</ul>
</li>
</ol>
<br>

<ol start="3">
<li><p>보안 그룹 설정</p>
<ul>
<li><p>기본 보안 그룹 또는 새로 만든 보안 그룹을 사용해 인스턴스에 할당.</p>
</li>
<li><p>SSH, HTTP, HTTPS 트래픽을 허용하도록 규칙 설정.</p>
</li>
</ul>
</li>
</ol>
<br>

<ol start="4">
<li><p>키 페어 생성</p>
<ul>
<li><p>SSH 접속을 위한 키 페어 생성.</p>
</li>
<li><p>Windows에서는 .pem 파일을 .ppk로 변환하여 사용.</p>
</li>
</ul>
</li>
</ol>
<br>


<p>이로써 EC2를 생성하기 위한 사전 준비들은 끝났고, 다음 포스팅에서 이어서 EC2를 본격적으로 생성해보고 SSH 접속까지 테스트 해볼 것 이다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[VPC 트래픽 보안]]></title>
            <link>https://velog.io/@summer_today/VPC-%ED%8A%B8%EB%9E%98%ED%94%BD-%EB%B3%B4%EC%95%88</link>
            <guid>https://velog.io/@summer_today/VPC-%ED%8A%B8%EB%9E%98%ED%94%BD-%EB%B3%B4%EC%95%88</guid>
            <pubDate>Mon, 16 Sep 2024 11:15:57 GMT</pubDate>
            <description><![CDATA[<h2 id="naclnetwork-access-control-list-네트워크-액세스-제어-목록">NACL(Network Access Control List, 네트워크 액세스 제어 목록)</h2>
<ul>
<li><p>네트워크 트래픽을 제어하기 위해 사용하는 보안 필터이다.</p>
</li>
<li><p>VPC의 서브넷 수준에서 동작하며, 인바운드와 아웃바운드 트래픽에 대해 허용(Allow)하거나 거부(Deny)할 수 있는 규칙들을 설정할 수 있다. </p>
</li>
<li><p>모든 VPC에는 기본 NACL이 자동으로 제공되고, 해당 NACL에 서브넷을 연결하여 사용하면 된다.</p>
</li>
<li><p>각 서브넷은 하나의 NACL과 연관될 수 있으며, NACL의 규칙은 낮은 번호 순서대로 적용된다. </p>
</li>
<li><p>AWS에서 기본적으로 생성되는 NACL(네트워크 액세스 제어 리스트)은 모든 인바운드 및 아웃바운드 트래픽을 허용되만, 사용자 정의로 새로 생성되는 NACL은 모든 인바운드 및 아웃바운드 트래픽을 거부하는 기본 규칙을 가지고 있다.</p>
</li>
<li><p>NACL은 상태 비저장이므로 모든 트래픽에 대한 명시적인 규칙이 필요하다.</p>
</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/56b8796f-6677-44ab-9a3f-5c19741a0525/image.png" alt="">출처: Architecting on AWS 7.7.9 (KO): Student Guide 141p</p>
</blockquote>
<ul>
<li><p>인바운드/아웃바운드 규칙
인바운드 규칙은 외부에서 서브넷으로 들어오는 트래픽을 제어하며, 아웃바운드 규칙은 서브넷에서 외부로 나가는 트래픽을 제어한다. 각 방향에 대해 별도의 규칙을 설정할 수 있다.</p>
</li>
<li><p>규칙 번호
각 규칙은 고유한 번호를 가지고 있으며, NACL은 이 번호를 기준으로 순차적으로 규칙을 평가한다. 작은 번호부터 평가되며, 트래픽이 해당 규칙과 일치하면 더 이상 다른 규칙을 평가하지 않는다.</p>
</li>
<li><p>유형
규칙이 적용될 트래픽의 프로토콜 유형을 나타낸다. 예를 들어, TCP, UDP, ICMP 등이 있으며, 특정 프로토콜에 대한 규칙을 설정할 수 있다.</p>
</li>
<li><p>프로토콜
트래픽이 사용하는 네트워크 프로토콜을 지정한다. </p>
</li>
<li><p>포트 범위
트래픽이 허용되거나 거부될 포트 번호 또는 포트 번호의 범위를 지정한다. 예를 들어, HTTP 트래픽은 포트 80을 사용하며, HTTPS는 포트 443을 사용한다.</p>
</li>
<li><p>소스
트래픽의 소스(CIDR 범위)이다. 인바운드 규칙에만 적용된다.</p>
</li>
<li><p>대상 위치
트래픽의 대상 위치(CIDR 범위)이다. 아웃바운드 규칙에만 적용된다.</p>
</li>
<li><p>허용 또는 거부
해당 규칙에 따라 트래픽을 허용할지(Allow) 거부할지(Deny)를 결정한다. 허용으로 설정된 트래픽은 통과되며, 거부로 설정된 트래픽은 차단된다.</p>
</li>
</ul>
<br>

<h2 id="nacl-생성">NACL 생성</h2>
<p>기본적으로 VPC 생성시 기본적으로 하나가 생성되지만, 추가적으로 NACL을 생성하거나 특정 서브넷에 맞춤형 NACL을 연결할 수 있다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/6a8f2724-ef79-40c0-aeab-641a82f5e8fc/image.png" alt=""></p>
</blockquote>
<br>

<p>NACL 생성 후 다음 항목들을 편집하여 사용하면 된다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/7304a9ca-e536-48b6-a3ae-d9698ba682fb/image.png" alt=""></p>
</blockquote>
<br>

<h2 id="보안그룹">보안그룹</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/20ad1429-4480-4e73-ba72-89a579f31f43/image.png" alt="">출처: Architecting on AWS 7.7.9 (KO): Student Guide 143p</p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/28943f6a-30b0-4bc2-97d2-fb4c9f4bdb6a/image.png" alt="">출처: Architecting on AWS 7.7.9 (KO): Student Guide 144p</p>
</blockquote>
<ul>
<li><p>AWS에서 인스턴스 수준에서 네트워크 트래픽을 제어하기 위해 사용하는 가상 방화벽이다. </p>
</li>
<li><p>보안 그룹은 VPC 내에서 EC2 인스턴스, RDS 데이터베이스 등 다양한 리소스에 적용할 수 있으며, 인바운드(들어오는 트래픽)와 아웃바운드(나가는 트래픽)를 제어하는 규칙을 설정할 수 있다.</p>
</li>
<li><p>IP 프로토콜, 포트, IP 주소를 기준으로 트래픽을 허용한다.</p>
</li>
<li><p>보안 그룹은 상태 저장 방식을 사용하기 때문에 별도로 아웃바운드 규칙을 설정하지 않아도 인바운드 트래픽이 허용된 경우, 해당 연결에 대한 응답은 자동으로 허용된다.</p>
</li>
<li><p>보안 그룹은 기본적으로 모든 아웃바운드 트래픽을 허용하며, 인바운드 트래픽은 모두 허용하지 않는다. 따라서 인바운드 규칙에 명시적 허용 규칙을 추가해줘야 한다.</p>
</li>
<li><p>한 인스턴스에 여러 보안 그룹을 연결할 수 있으며, 각 보안 그룹의 규칙이 결합되어 적용된다.</p>
</li>
</ul>
<br>

<h2 id="보안그룹-생성">보안그룹 생성</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/df45ab93-6e21-4fd1-b5fb-184f53912c11/image.png" alt=""></p>
</blockquote>
<br>

<h2 id="사용자-정의-보안-그룹-규칙">사용자 정의 보안 그룹 규칙</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/882719b0-a9be-4139-b462-91423440bd3b/image.png" alt="">출처: Architecting on AWS 7.7.9 (KO): Student Guide 145p</p>
</blockquote>
<ul>
<li><p>보안 그룹 사용 시 프로토콜 및 포트 번호를 기준으로 트래픽을 필터링 할 수 있다.</p>
</li>
<li><p>보안 그룹은 상태 저장 그룹이므로, 들어온 트래픽은 별도의 아웃바운드 규칙메 명시가 되어있지 않아도 나갈 수 있다.</p>
</li>
<li><p>인바운드 규칙</p>
<ul>
<li><p>첫 번째 규칙은 HTTP 트래픽이 허용된다는 것을 의미한다.</p>
</li>
<li><p>두 번째 규칙은 HTTPS 트래픽이 허용된다는 것을 의미한다.</p>
</li>
</ul>
</li>
<li><p>아웃바운드 규칙</p>
<ul>
<li><p>첫 번째 규칙은 해당 보안 그룹에 속한 인스턴스가 SQL Server에 접근할 수 있도록 허용된다는 의미이다.</p>
</li>
<li><p>두 번째 규칙은 해당 보안 그룹에 속한 인스턴스가 MySQL 서버에 접근할 수 있음을 의미한다.</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>cf. 웹 서버가 외부 클라이언트로부터의 HTTP 또는 HTTPS 요청에 응답하는 경우, 아웃바운드 트래픽에 대해 추가적인 규칙을 설정할 필요가 없다. </p>
<p>기본 아웃바운드 규칙이 모든 트래픽을 허용하도록 되어 있거나, 아웃바운드 규칙이 명시적으로 설정되어 있지 않더라도, 인바운드 요청에 대한 응답은 자동으로 허용되기 때문이다.</p>
</blockquote>
<br>

<h2 id="보안-그룹-간-연결">보안 그룹 간 연결</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/80faf610-f363-41c1-8d39-52b569fcbaf2/image.png" alt="">출처: Architecting on AWS 7.7.9 (KO): Student Guide 146p</p>
</blockquote>
<ul>
<li><p>웹 보안 그룹 (Web Security Group)
웹 서버에 적용된 보안 그룹이다.</p>
<ul>
<li>HTTPS 포트 443 허용
소스가 0.0.0.0/0인 모든 IP 주소로부터 들어오는 HTTPS(포트 443) 트래픽을 허용한다.이 규칙은 웹 서버가 인터넷으로부터 HTTPS 요청을 받아들일 수 있도록 설정된 것이다.</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>앱 보안 그룹 (App Security Group)
앱 서버에 적용된 보안 그룹이다.</p>
<ul>
<li>HTTP 포트 80 허용
소스가 웹 보안 그룹인 트래픽을 허용한다. 해당 규칙은 웹 서버로부터 앱 서버로 전달되는 HTTP(포트 80) 트래픽을 허용한다. 즉, 웹 서버에서 앱 서버로 HTTP 요청이 전달될 수 있도록 설정되어 있다.</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>데이터 보안 그룹 (Database Security Group)
데이터베이스에 적용된 보안 그룹이다.</p>
<ul>
<li>TCP 포트 3306 허용
소스가 앱 보안 그룹인 트래픽을 허용한다. 해당 규칙은 앱 서버에서 데이터베이스로 전달되는 MySQL(포트 3306) 트래픽을 허용한다. 즉, 앱 서버가 데이터베이스에 접근하여 데이터를 읽거나 쓸 수 있도록 설정되어 있다.</li>
</ul>
</li>
</ul>
<blockquote>
<p>cf. 소스에 192.168.1.0/24와 같은 특정 IP 범위를 설정하는 경우, 해당 IP에서 오는 트래픽을 허용할 수 있다.</p>
</blockquote>
<p>소스에 sg-1234567890abcdef0와 같은 특정 보안 그룹 ID를 소스로 지정하면, 해당 보안 그룹에 속한 모든 인스턴스에서 오는 트래픽을 허용할 수 있다.</p>
<br>

<h2 id="다중-방어-계층이-있는-인프라-설계">다중 방어 계층이 있는 인프라 설계</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/bc8c13dd-10c1-4097-be41-8dacb708319f/image.png" alt="">출처: Architecting on AWS 7.7.9 (KO): Student Guide 147p</p>
</blockquote>
<ul>
<li><p>외부 인터넷에서 들어오는 트래픽은 인터넷 게이트웨이를 통해 VPC로 들어오며, 라우팅 테이블에 정의된 경로에 따라 네트워크 ACL을 거쳐 퍼블릭 서브넷에 도달한다.</p>
</li>
<li><p>서브넷 내 인스턴스는 보안 그룹에 의해 보호되며, 허용된 트래픽만 인스턴스로 들어오거나 인스턴스에서 나갈 수 있다.</p>
</li>
<li><p>네트워크 보안은 여러 단계로 강화되어 있으며, 서브넷과 인스턴스 수준에서 각각 네트워크 ACL과 보안 그룹을 통해 트래픽을 필터링하고 관리한다.</p>
</li>
</ul>
<br>

<h2 id="보안-그룹과-nacl-비교">보안 그룹과 NACL 비교</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/382cab34-37d4-454b-aced-665aafbbe03c/image.png" alt="">출처: Architecting on AWS 7.7.9 (KO): Student Guide 148p</p>
</blockquote>
<ul>
<li><p>적용 범위
보안 그룹은 인스턴스 수준에서 적용되며, NACL은 서브넷 수준에서 적용된다.</p>
</li>
<li><p>상태 정보
보안 그룹은 상태 저장(Stateful)이며, NACL은 비상태적(Stateless)이다.</p>
</li>
<li><p>트래픽 제어 방향
보안 그룹은 명시적으로 허용된 트래픽만 허용하는 반면, NACL은 허용 및 거부 규칙을 모두 설정할 수 있다.</p>
</li>
</ul>
<br>
<br>
<br>
해당 글은 Architecting on AWS 7.7.9 (KO): Student Guide를 참고하여 작성된 글임을 밝힙니다.

]]></description>
        </item>
        <item>
            <title><![CDATA[AWS NAT Gateway]]></title>
            <link>https://velog.io/@summer_today/NAT-Gateway</link>
            <guid>https://velog.io/@summer_today/NAT-Gateway</guid>
            <pubDate>Mon, 16 Sep 2024 03:36:05 GMT</pubDate>
            <description><![CDATA[<h2 id="nat-gateway">NAT Gateway</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/e83ebdb5-7aa1-4e36-9771-eaec61e05688/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>VPC(Virtual Private Cloud)에서 프라이빗 서브넷에 있는 인스턴스들이 인터넷으로부터 들어오는 트래픽을 허용하지 않으면서도 외부로 트래픽을 보낼 수 있도록 해주는 서비스다.</p>
</li>
<li><p>프라이빗 서브넷에 있는 리소스들이 외부 네트워크에 접근할 수 있지만, 외부에서 직접적으로 접근할 수 없게 된다.</p>
</li>
<li><p>VPC의 보안성을 유지하면서 외부 API 호출이나 소프트웨어 업데이트를 위한 인터넷 연결을 필요로 하는 애플리케이션을 운영하는 것에 활용 가능하다.</p>
<ul>
<li><p>NAT 게이트웨이는 동적으로 네트워크 트래픽의 부하에 맞춰 성능을 조정하여 트래픽의 급격한 변화에도 NAT 게이트웨이는 성능 저하 없이 안정적인 서비스 제공이 가능하다.</p>
</li>
<li><p>고가용성을 위해 각 AZ마다 별도의 NAT 게이트웨이를 생성하고, 이를 각각의 AZ에 맞게 라우팅 테이블에서 설정할 수 있다. 이렇게 하면 각 AZ 내에서 독립적으로 NAT 트래픽을 처리할 수 있어, AZ 단위의 장애에도 서비스 연속성이 보장된다.</p>
</li>
</ul>
</li>
</ul>
<br>

<h2 id="nat-gateway-생성">NAT Gateway 생성</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/5b6eac2b-8bd9-4cf4-b625-5323a9ba0e2f/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>연결 유형
매우 특수한 경우로 다단계 NAT 설정이나 특정 보안/네트워크 설계 요구사항에 따라 NAT 게이트웨이를 프라이빗 서브넷에 배치할 수 있다.</p>
<p>프라이빗 서브넷에 NAT 게이트웨이를 배치하여, 그 서브넷에서 나가는 트래픽이 반드시 특정 경로를 거치도록 강제할 수 있다. 이는 복잡한 보안 정책이나 네트워크 설계에 따라 외부와의 직접적인 통신을 피하고, 통신 경로를 엄격히 제한하기 위해 사용될 수 있다.</p>
</li>
</ul>
<br>

<h2 id="프라이빗-서브넷-라우팅-테이블-수정">프라이빗 서브넷 라우팅 테이블 수정</h2>
<p>NAT Gateway이만 생성해서는 프라이빗 서브넷의 트래픽이 외부로 나갈 수 있는 것이 아니라, 해당 프라이빗 서브넷의 라우팅 테이블을 수정해야한다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/a0d5b430-3e6e-42cf-bc73-3a1c2cd284c0/image.png" alt=""></p>
</blockquote>
<p>0.0.0.0/0 대상 트래픽이 모두 NAT Gateway로 가도록 라우팅 편집을 해준다.</p>
<br>

<h2 id="nat-gateway를-통한-network-address-translation">NAT Gateway를 통한 Network Address Translation</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/28935d79-3580-4466-8a51-f94f2e668a75/image.png" alt="">출처: Architecting on AWS 7.7.9 (KO): Student Guide 136p</p>
</blockquote>
<blockquote>
<p>cf. 인터넷 게이트웨이로 들어온 외부 트래픽은 퍼블릭 IP를 가지고 있지만, VPC는 사설 대역을 사용하고 있어 프라이빗 IP로 변환을 해주어야 리소스를 식별할 수 있다. 따라서 인터넷 게이트웨이에서 NAT를 수행해주어야 한다.</p>
</blockquote>
<blockquote>
<p>cf. 인터넷 게이트웨이로 들어오는 외부 트래픽은 퍼블릭 IP에서 프라이빗 IP로 변환되고, NAT Gateway에서 인터넷 게이트웨이로 전달되는 트래픽은 해당 퍼블릭 IP 그대로 외부로 나가게 된다.  </p>
</blockquote>
<ul>
<li><p>NAT Gateway를 사용하여 프라이빗 IP 주소를 보호할 수 있다.</p>
</li>
<li><p>AWS VPC(Virtual Private Cloud) 내에서 NAT 게이트웨이를 통해 프라이빗 서브넷의 인스턴스가 인터넷과 통신할 수 있다.</p>
</li>
<li><p>NAT Gateway를 통해 프라이빗 서브넷의 인스턴스의 트래픽을 인터넷 도는 다른 AWS의 리소스로 전달할 수 있다.</p>
</li>
</ul>
<br>

<h2 id="인터넷에-프라이빗-서브넷-연결">인터넷에 프라이빗 서브넷 연결</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/35ba4327-c833-4277-872b-5012da04af36/image.png" alt=""> 출처: Architecting on AWS 7.7.9 (KO): Student Guide 138p</p>
</blockquote>
<ul>
<li><p>프라이빗 서브넷의 라우팅 테이블에서 0.0.0.0/0 항목을 NAT 게이트웨이로 설정하여, 모든 외부로 나가는 트래픽은 NAT 게이트웨이를 경유하여 인터넷으로 나가게 한다.</p>
</li>
<li><p>라우팅 테이블에 0.0.0.0/0 항목을 인터넷 게이트웨이(IGW)로 설정하여. 모든 외부로 나가는 트래픽이 인터넷 게이트웨이를 통해 인터넷으로 전달되게 한다.</p>
</li>
</ul>
<br>

<h2 id="여러-가용-영역에-vpc-배포">여러 가용 영역에 VPC 배포</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/87c16a0f-0bc9-4f19-87dd-f9130454c6d5/image.png" alt="">출처: Architecting on AWS 7.7.9 (KO): Student Guide 139p</p>
</blockquote>
<ul>
<li><p>인바운드 트래픽 처리
인터넷에서 들어오는 트래픽은 인터넷 게이트웨이를 통해 VPC로 들어가며, Elastic Load Balancer에 도달한다. ELB는 이 트래픽을 적절한 가용 영역의 앱 서버로 분배한다. 이는 주로 사용자 요청을 처리하는 트래픽이다.</p>
</li>
<li><p>아웃바운드 트래픽 처리
앱 서버들이 외부 인터넷과 통신해야 할 때, NAT 게이트웨이를 통해 아웃바운드 트래픽을 전송한다. NAT 게이트웨이는 이 트래픽의 소스 IP 주소를 자신의 퍼블릭 IP 주소로 변환한 후, 인터넷 게이트웨이를 통해 외부로 내보낸다.</p>
</li>
</ul>
<br>
<br>
<br>
해당 글은 Architecting on AWS 7.7.9 (KO): Student Guide를 참고하여 작성된 글임을 밝힙니다.]]></description>
        </item>
        <item>
            <title><![CDATA[eksctl을 통한 Amazon EKS 확인 및 설정]]></title>
            <link>https://velog.io/@summer_today/eksctl%EC%9D%84-%ED%86%B5%ED%95%9C-Amazon-EKS-%ED%99%95%EC%9D%B8-%EB%B0%8F-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@summer_today/eksctl%EC%9D%84-%ED%86%B5%ED%95%9C-Amazon-EKS-%ED%99%95%EC%9D%B8-%EB%B0%8F-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Sat, 24 Aug 2024 13:47:42 GMT</pubDate>
            <description><![CDATA[<h2 id="관련-플러그인-설치-확인">관련 플러그인 설치 확인</h2>
<pre><code># krew로 설치한 플러그인 목록 출력
kubectl krew list

# kube_ps1 활성화, Kubernetes 클러스터와 네임스페이스 정보가 프롬프트에 추가로 표시된다. 붉은 색 영역이 컨텍스트이고 노란색 # 영역이 네임스페이스이로, 현재 작업 중인 위치를 알 수 있다.
kubeon

# ctx 플러그인 확인, 사용 가능한 컨텍스트 목록이 표시되며, 명령을 통해 컨텍스트를 전환할 수 있다.
kubectl ctx

# ns 플러그인 확인, 사용 가능한 네임스페이스 목록이 표시되며, 명령을 통해 네임스페이스를 전환할 수 있
kubectl ns

kubectl ns default # kube_ps1과 정보를 맞추기 위해 네임 스페이스를 default로 지정한다.

# 모든 네임스페이스의 모든 리소스 확인
kubectl get-all</code></pre><ul>
<li><p>krew 플러그인
krew는 kubectl의 플러그인 관리 도구로, 다양한 플러그인을 설치하고 관리할 수 있다. kubectl의 기능을 확장하는 플러그인을 쉽게 설치하고 업데이트할 수 있다. </p>
<ul>
<li><p>kube 플러그인 설치 명령어</p>
<pre><code>(
set -x; cd &quot;$(mktemp -d)&quot; &amp;&amp;
OS=&quot;$(uname | tr &#39;[:upper:]&#39; &#39;[:lower:]&#39;)&quot; &amp;&amp;
ARCH=&quot;$(uname -m | sed -e &#39;s/x86_64/amd64/&#39; -e &#39;s/\(arm\)\(64\)\?.*/\1\2/&#39; -e &#39;s/aarch64$/arm64/&#39;)&quot; &amp;&amp;
KREW=&quot;krew-${OS}_${ARCH}&quot; &amp;&amp;
curl -fsSLO &quot;https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz&quot; &amp;&amp;
tar zxvf &quot;${KREW}.tar.gz&quot; &amp;&amp;
./&quot;${KREW}&quot; install krew
)</code></pre><br>
</li>
<li><p>설치 후, ~/.krew/bin 디렉토리를 PATH에 추가하여 krew 명령어를 사용할 수 있도록 설정해야 한다.<br><code>export PATH=&quot;${KREW_ROOT:-$HOME/.krew}/bin:$PATH&quot;</code></p>
</li>
</ul>
</li>
</ul>
  <br>

<ul>
<li><p>kubeon
kube_ps1이라는 셸 프롬프트 확장 기능을 활성화하는 명령어이다.</p>
<ul>
<li><p>kube_ps1
kube_ps1은 사용자의 셸 프롬프트에 현재 사용 중인 Kubernetes 컨텍스트와 네임스페이스를 표시해주는 유틸리티입니다. 이를 통해 어떤 클러스터와 네임스페이스에서 작업 중인지 한눈에 파악할 수 있다.</p>
<ul>
<li><p>컨텍스트
클러스터, 사용자, 네임스페이스 등의 정보를 묶어 하나의 작업 환경을 정의하며, 여러 클러스터 및 환경 간에 쉽게 전환할 수 있도록 한다.</p>
</li>
<li><p>네임스페이스
클러스터 내의 리소스를 논리적으로 분리하여 그룹화하며, 동일한 클러스터 내에서 서로 다른 환경(예: 개발, 테스트, 프로덕션)을 분리하고 관리하는 데 사용된다.</p>
<ul>
<li><p>kube_ps1 설치 명령어
<code>git clone https://github.com/jonmosco/kube-ps1.git</code></p>
</li>
<li><p>셸 설정 파일에 다음</p>
</li>
</ul>
</li>
</ul>
<br>
</li>
</ul>
</li>
<li><p>kubectl ctx
kubectl의 플러그인으로, 현재 사용 중인 Kubernetes 컨텍스트(context)나 다른 컨텍스트로 변경이 가능하다. 멀티 클러스터 환경에서 관리할 때 유용하게 사용된다.</p>
<ul>
<li>kube ctx 플러그인 설치 명령어<pre><code>kubectl krew install ctx
</code></pre></li>
</ul>
<p>vi ~/.bashrc # bashrc에 설정 추가 및 적용</p>
<h1 id="아래-내용-추가">아래 내용 추가</h1>
<p>source /path/to/kube-ps1.sh
PS1=&#39;[\u@\h \W $(kube_ps1)]$ &#39;</p>
<p>source ~/.bashrc # 현재 셸에서 ~/.bashrc 파일의 내용을 실행하여, 파일에 정의된 설정이나 환경 변수를 다시 적용하는 명령어</p>
<pre><code>
</code></pre></li>
</ul>
  <br>

<ul>
<li><p>kubectl ns
ns는 kubectl의 플러그인으로, 현재 작업 중인 네임스페이스(namespace)를 빠르게 전환할 수 있는 명령어이다.</p>
<ul>
<li>kubectl ns 플러그인 설치 명령어
<code>kubectl krew install ns</code></li>
</ul>
<br>
</li>
<li><p>kubectl get-all<br>현재 네임스페이스에 있는 주요 Kubernetes 리소스(예: Pods, Services, Deployments, ReplicaSets 등)를 모두 한 번에 조회한다.</p>
</li>
</ul>
<br>

<h2 id="eks-클러스터-정보-확인">EKS 클러스터 정보 확인</h2>
<pre><code># kubectl을 통한 클러스터 정보 확인
kubectl cluster-info

# eksctl을 통한 클러스터 정보 확인
eksctl get cluster

# awscli를 통한 클러스터 정보 확인 (상세)
aws eks describe-cluster --name $CLUSTER_NAME | jq

# awscli를 통한 클러스터 정보 확인 (API 서버 주소만 추출)
aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint

# API 서버 주소 변수 저장 및 dig 조회
APIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d &#39;/&#39; -f 3)

dig +short $APIDNS

# API 서버 접속
curl -k -s https://$APIDNS | jq

curl -k -s https://$APIDNS/version | jq</code></pre><ul>
<li><p>kubectl cluster-info
명령어는 현재 설정된 특정 Kubernetes 클러스터의 기본 정보(API 서버와 CoreDNS 서비스의 주소 등)를 출력합니다. 클러스터가 정상적으로 동작 중인지 확인할 때 유용하다.</p>
</li>
<li><p>eksctl get cluster
AWS 계정 내에서 관리되는 모든 EKS 클러스터의 상태와 기본 정보를 제공한다.</p>
</li>
<li><p>aws eks describe-cluster --name $CLUSTER_NAME | jq
awscli를 사용하여 특정 EKS 클러스터에 대한 상세 정보를 JSON 형식으로 출력합니다. jq를 사용하여 출력된 JSON을 읽기 쉽게 포맷팅한다.</p>
<ul>
<li>aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint
aws eks describe-cluster 명령어로 클러스터 정보를 조회한 후, jq를 사용해 클러스터 API 서버의 엔드포인트 주소만 추출하여 출력한다.</li>
</ul>
</li>
<li><p>PIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d &#39;/&#39; -f 3)<br>클러스터 API 서버의 DNS 이름(도메인)을 추출하여 APIDNS 변수에 저장한다. cut 명령어를 사용하여 https:// 프로토콜 부분과 경로를 제거하고 순수한 도메인 이름만 추출한다.</p>
<ul>
<li><p>cut -d &#39;/&#39; -f 3</p>
<ul>
<li><p>cut은 텍스트 파일이나 명령어 출력에서 특정 필드를 추출할 때 사용하는 명령어다. 주로 구분자(delimiter)를 기준으로 필드를 나누고, 그 중 필요한 부분을 가져올 때 사용된다.</p>
</li>
<li><p>-d 옵션은 cut 명령어에서 필드를 구분할 때 사용하는 구분자를 지정하는 데 사용됩니다. 여기서 -d &#39;/&#39;는 슬래시(/)를 구분자로 사용하겠다는 의미이다.</p>
</li>
<li><p>-f 옵션은 구분자로 나누어진 텍스트에서 추출할 필드(부분)의 번호를 지정합니다. 여기서 -f 3은 세 번째 필드를 추출하겠다는 의미이다.</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>dig +short $APIDNS<br>dig 명령어를 사용해 APIDNS에 저장된 DNS 이름을 조회하여 해당 도메인의 IP 주소를 확인한다. +short 옵션은 결과를 간단하게 출력하도록 한다. 보통 AWS EKS 클러스터의 API 서버가 배치된 Network Load Balancer (NLB)의 IP 주소가 출력된다.</p>
</li>
</ul>
<br>

<h2 id="eks-노드-그룹-정보-확인">EKS 노드 그룹 정보 확인</h2>
<pre><code># eksctl을 통한 노드 그룹 정보 확인
eksctl get nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup

# awscli를 통한 노드 그룹 정보 확인 (상세)
aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name $CLUSTER_NAME-nodegroup | jq

# kubectl을 통한 노드 정보 확인
kubectl get node

kubectl get node -owide

kubectl get node -v=6</code></pre><ul>
<li><p>eksctl get nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup
eksctl을 사용하여 특정 EKS 클러스터에서 지정된 노드 그룹의 정보를 조회한다. 노드 그룹의 이름, 상태, 인스턴스 타입, 최소/최대 노드 수, 현재 노드 수 등의 기본 정보를 출력한다.
해당 명령어 사용 시 노드 그룹이 정상적으로 작동 중인지, 몇 개의 노드가 할당되어 있는지를 쉽게 확인할 수 있다.</p>
</li>
<li><p>aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name $CLUSTER_NAME-nodegroup | jq
awscli를 사용해 특정 EKS 클러스터의 노드 그룹에 대한 상세 정보를 JSON 형식으로 조회한다. jq는 이 JSON 출력을 가독성 있게 포맷팅하는 데 사용된다.</p>
</li>
<li><p>kubectl get node
Kubernetes 클러스터에서 현재 동작 중인 모든 노드의 목록을 출력한다. 각 노드의 이름, 상태(Ready/NotReady), 역할, 버전, 나이(age) 등을 기본적으로 보여준다.</p>
</li>
<li><p>kubectl get node -owide
kubectl get node 명령어에 -o wide 옵션을 추가하여 노드에 대한 확장된 정보를 출력한다. 기본 정보 외에도 노드의 IP 주소, 호스트네임, 컨테이너 런타임, OS 이미지 등의 추가적인 정보를 포함한다.</p>
</li>
<li><p>kubectl get node -v=6
kubectl 명령어에 -v=6 옵션을 추가하여 디버깅 목적의 상세 로그를 활성화한다. 이 명령어는 노드 정보를 출력하는 과정에서 발생하는 내부 API 호출 및 처리 과정을 매우 상세하게 로그로 출력한다.
주로 디버깅이나 문제 해결을 위해 사용되며, 일반적인 사용에서는 잘 사용되지 않는다. -v 뒤의 숫자는 로그의 상세 수준을 나타내며, 숫자가 높을수록 더 많은 디버그 정보를 출력한다.</p>
<blockquote>
<p>myeks-host에서 kubectl 명령을 API 서버에게 전달하려면 자신의 kubeconfig를 확인해 보안 토큰으로 API 서버에 통신을 수행한다. 이 후 클러스터 엔드포인트 주소에 api 형태로 노드 정보를 요청해서 전달받은 값을 표시하는 것이다. 이러한 모든 과정이 출력 값을 표시가 된다.</p>
</blockquote>
</li>
</ul>
<br>

<h2 id="파드-정보-확인">파드 정보 확인</h2>
<pre><code># 현재 네임스페이스에 파드 정보 확인
kubectl get pod

# 모든 네임스페이스에 파드 정보 확인
kubectl get pod -A

# kube-system 네임스페이스에 파드 정보 확인
kubectl get pod -n kube-system

kubectl get pod -n kube-system -owide
</code></pre><ul>
<li><p>kubectl get pod
kubectl이 설정된 네임스페이스에서 실행 중인 모든 파드의 정보를 조회한다. 파드의 이름, 상태(Running, Pending, Succeeded, Failed 등), 재시작 횟수, 클러스터에서 실행된 시간을 기본적으로 출력한다.</p>
</li>
<li><p>kubectl get pod -A
클러스터의 모든 네임스페이스에서 실행 중인 모든 파드의 정보를 조회한다. -A 옵션은 --all-namespaces의 약어이다.</p>
</li>
<li><p>kubectl get pod -n kube-system
kube-system 네임스페이스에서 실행 중인 파드의 정보를 조회합니다. -n 옵션은 특정 네임스페이스를 지정할 때 사용된다.
kube-system 네임스페이스는 Kubernetes 시스템 관련 파드들이 실행되는 네임스페이스로, 클러스터의 핵심 구성 요소들이 이곳에 위치한다(예: kube-apiserver, kube-controller-manager, kube-dns 등).
해당 명령어를 통해 클러스터의 핵심 서비스들이 제대로 실행되고 있는지 확인할 수 있다.</p>
</li>
<li><p>kubectl get pod -n kube-system -owide
kube-system 네임스페이스에서 실행 중인 파드의 정보를 확장된 형태로 조회합니다. -o wide 옵션은 파드에 대한 추가 정보를 출력하는 데 사용된다.
기본 정보 외에 파드가 실행 중인 노드의 이름, 파드의 IP 주소, 컨테이너 이미지, 더 자세한 파드 상태 등을 포함한 확장된 정보를 출력한다.</p>
<blockquote>
<p>kube-system 네임 스페이스에 존재하는 파드들을 보면 API 서버나 스케쥴러 등과 같은 시스템 파드들든 AWS Managed VPC에 위치해 AWS 관리형으로 동작하고 있기 때문이다.</p>
</blockquote>
</li>
</ul>
<br>

<h2 id="워커-노드의-프라이빗-ip-확인-및-변수-지정">워커 노드의 프라이빗 IP 확인 및 변수 지정</h2>
<pre><code># EC 인스턴스의 프라이빗/퍼블릭 IP 확인
aws ec2 describe-instances --query &quot;Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key==&#39;Name&#39;]|[0].Value,Status:State.Name}&quot; --filters Name=instance-state-name,Values=running --output table

# 워커 노드의 프라이빗 IP 주소를 변수에 입력 및 확인
kubectl get node -o jsonpath={.items[0].status.addresses[0].address}
kubectl get node -o jsonpath={.items[1].status.addresses[0].address}

export N1=$(kubectl get node -o jsonpath={.items[0].status.addresses[0].address})
export N2=$(kubectl get node -o jsonpath={.items[1].status.addresses[0].address})

echo &quot;export N1=$N1&quot; &gt;&gt; /etc/profile
echo &quot;export N2=$N2&quot; &gt;&gt; /etc/profile

echo $N1
echo $N2

# 워커 노도의 노드 이름을 변수에 입력 및 확인
kubectl get node -o jsonpath={.items[0].status.addresses[3].address}
kubectl get node -o jsonpath={.items[1].status.addresses[3].address}

export NN1=$(kubectl get node -o jsonpath={.items[0].status.addresses[3].address})
export NN2=$(kubectl get node -o jsonpath={.items[1].status.addresses[3].address})

echo &quot;export NN1=$NN1&quot; &gt;&gt; /etc/profile
echo &quot;export NN2=$NN2&quot; &gt;&gt; /etc/profile

echo $NN1
echo $NN2</code></pre><ul>
<li><p>aws ec2 describe-instances --query &quot;Reservations[<em>].Instances[</em>].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key==&#39;Name&#39;]|[0].Value,Status:State.Name}&quot; --filters Name=instance-state-name,Values=running --output table</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/fc785c13-7fb5-4630-b739-a682f33d17e1/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>aws ec2 describe-instances
AWS CLI 명령어로, 현재 계정에서 실행 중인 EC2 인스턴스의 세부 정보를 가져온다.</p>
</li>
<li><p>--query
jq와 유사한 형식으로 JSON 출력 결과를 필터링하여 필요한 정보만 선택할 수 있도록 한다.</p>
</li>
<li><p>&quot;Reservations[<em>].Instances[</em>]&quot;
각 인스턴스에 대한 정보를 나타내는 경로이다.</p>
<blockquote>
<p>Reservations는 AWS에서 EC2 인스턴스와 관련된 정보를 그룹화한 개념이다.</p>
</blockquote>
<ul>
<li><p>PublicIpAddress, PrivateIpAddress
각각 인스턴스의 공인 IP와 사설 IP 주소를 나타내는 필드이다.</p>
</li>
<li><p>Tags[?Key==&#39;Name&#39;]|[0].Value
EC2 인스턴스에 설정된 태그 중에서 Name이라는 키의 값을 가져온다.</p>
</li>
<li><p>State.Name
인스턴스의 상태를 나타내며, running, stopped 등의 상태가 있을 수 있다.</p>
</li>
</ul>
<br>
</li>
<li><p>--filters: EC2 인스턴스를 필터링하는 옵션으로, Name=instance-state-name,Values=running는 실행 중인(running) 인스턴스만 선택하도록 한다.</p>
</li>
<li><p>--output table: 결과를 표 형식으로 출력한다. --output json, --output text 등 다른 형식으로도 출력할 수 있다.</p>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>kubectl get node -o jsonpath={.items[0].status.addresses[0].address}</p>
<ul>
<li><p>kubectl get node
Kubernetes 클러스터의 노드 목록을 조회하는 명령어다.</p>
</li>
<li><p>-o jsonpath={}
출력 결과를 JSONPath 형식으로 필터링하여 원하는 필드만 선택할 수 있다.</p>
</li>
<li><p>.items[0].status.addresses[0].address
첫 번째 노드의 첫 번째 주소를 선택한다. 일반적으로 프라이빗 IP 주소다.</p>
</li>
</ul>
<br>
</li>
<li><p>export N1=$(kubectl get node -o jsonpath={.items[0].status.addresses[0].address}) </p>
<ul>
<li><p>export N1= 
N1이라는 환경 변수를 설정합니다. 이 변수는 현재 셸 세션에서만 유지된다.</p>
</li>
<li><p>$(...)
명령어를 실행하고 그 출력을 변수에 할당하는 구문이다. 예를 들어, $(kubectl get node...)는 명령어의 결과(IP 주소)를 N1에 할당한다.</p>
</li>
</ul>
<br>
</li>
<li><p>echo &quot;export N1=$N1&quot; &gt;&gt; /etc/profile  </p>
<ul>
<li><p>echo &quot;export N1=$N1&quot; &gt;&gt; /etc/profile
/etc/profile 파일에 N1 환경 변수를 설정하는 명령어를 추가한다. /etc/profile은 시스템이 부팅될 때 모든 사용자에게 공통적으로 적용되는 설정을 포함하는 파일이다.</p>
</li>
<li><p><code>&gt;&gt;</code>
파일에 내용을 추가하는 연산자이다. 기존 파일 내용을 덮어쓰지 않고, 새로운 내용을 추가한다.</p>
</li>
</ul>
<br>
</li>
<li><p>echo $N1
N1 변수에 저장된 값을 출력한다.</p>
<br>
</li>
<li><p>kubectl get node -o jsonpath={.items[0].status.addresses[3].address}</p>
<ul>
<li>.items[0].status.addresses[3].address
첫 번째 노드의 네 번째 주소를 선택한다. 일반적으로 노드 이름이나 호스트 이름에 해당한다.</li>
</ul>
<br>

</li>
</ul>
<h2 id="워커-노드-ssh-접속">워커 노드 SSH 접속</h2>
<pre><code># 워커 노드 SSH 접속 후 빠져 나오기
ssh ec2-user@$N1 
exit

ssh ec2-user@$N2
exit

# 워커 노드 SSH 접속하여 hostname 명령어 실행
ssh ec2-user@$N1 hostname

ssh ec2-user@$N2 hostname</code></pre><ul>
<li><p>참고
SSH 키 페어를 베스천 호스트의 특정 폴더에 저장해두면 명령어에 별도로 키 지정을 안해도 된다.</p>
<ol>
<li>SSH 키 페어를 적절한 위치에 저장<pre><code>mv /path/to/your-key.pem ~/.ssh/your-key.pem
chmod 600 ~/.ssh/your-key.pem # 파일의 권한을 변경하여, 소유자만 읽고 쓸 수 있도록 합니다. 이는 SSH가 키 파일을 안전하게 사용하는 데 필수적이다.
</code></pre></li>
</ol>
<pre><code>Bastion 호스트의 ~/.ssh 폴더에 SSH 키 페어를 저장한다.
&lt;br&gt;

2. SSH 설정 파일 수정 (~/.ssh/config)</code></pre><p>nano ~/.ssh/config</p>
<p>Host your-ec2-instance
  HostName &lt;노드의 프라이빗 IP 또는 퍼블릭 IP&gt;
  User ec2-user
  IdentityFile ~/.ssh/your-key.pem</p>
<p>Host your-ec2-instance
  HostName &lt;노드의 프라이빗 IP 또는 퍼블릭 IP&gt;
  User ec2-user
  IdentityFile ~/.ssh/your-key.pem</p>
<p>...</p>
<pre><code>
&lt;br&gt;
</code></pre></li>
</ul>
<h2 id="워커-노드의-프로세스-정보-확인">워커 노드의 프로세스 정보 확인</h2>
<pre><code>// kubelet 상태 정보
ssh ec2-user@$N1 sudo systemctl status kubelet

ssh ec2-user@$N2 sudo systemctl status kubelet

// 프로세스 확인
ssh ec2-user@$N1 sudo pstree
ssh ec2-user@$N1 sudo ps afxuwww

ssh ec2-user@$N2 sudo pstree
ssh ec2-user@$N2 sudo ps afxuwww

// 컨테이너 런타임 확인
ssh ec2-user@$N1 sudo ps axf |grep /usr/bin/containerd

ssh ec2-user@$N2 sudo ps axf |grep /usr/bin/containerd</code></pre><ul>
<li><p>ssh ec2-user@$N1 sudo systemctl status kubelet
접속한 워커 노드 서버에서 관리자 권한으로 kubelet 서비스의 상태를 확인한다.</p>
<ul>
<li>systemctl status kubelet
systemd로 관리되는 kubelet 서비스의 현재 상태를 보여준다. 여기에는 서비스가 활성화되어 있는지, 실행 중인지, 실패했는지 등에 대한 정보가 포함된다.</li>
</ul>
<br>
</li>
<li><p>ssh ec2-user@$N1 sudo pstree
시스템에서 실행 중인 프로세스들이 어떤 부모-자식 관계로 연결되어 있는지를 직관적으로 볼 수 있다.</p>
</li>
<li><p>ssh ec2-user@$N1 sudo ps afxuwww
현재 시스템에서 실행 중인 모든 프로세스를 자세히 나열하는 명령어이다.</p>
<ul>
<li><p>a
터미널에 관계없이 모든 프로세스를 보여줍니다.</p>
</li>
<li><p>f
프로세스 간의 부모-자식 관계를 트리 형식으로 보여줍니다.</p>
</li>
<li><p>x
특정 터미널에 종속되지 않은 모든 프로세스를 포함시킵니다.</p>
</li>
<li><p>u
각 프로세스에 대해 사용자, CPU, 메모리 사용량 등을 포함한 추가 정보를 표시합니다.</p>
</li>
<li><p>www
출력 라인을 잘리지 않도록 전체 명령어 줄을 표시합니다.</p>
</li>
</ul>
<br>
</li>
<li><p>ssh ec2-user@$N1 sudo ps axf |grep /usr/bin/containerd</p>
<blockquote>
<p>cf. kubernetes 1.24 버전 이후로 컨테이너 런타임은 containerd를 사용한다.</p>
</blockquote>
<ul>
<li><p>ps axf
시스템에서 실행 중인 모든 프로세스를 나열하고, 트리 형식으로 보여준다.</p>
</li>
<li><p>grep /usr/bin/containerd
프로세스 목록에서 containerd 실행 경로(/usr/bin/containerd)와 일치하는 프로세스를 필터링한다.</p>
<ul>
<li>grep
특정 패턴과 일치하는 텍스트를 검색하는 명령어이다. 여기서는 containerd라는 컨테이너 런타임 프로세스를 검색한다.</li>
</ul>
<br>

</li>
</ul>
</li>
</ul>
<h2 id="워커-노드의-네트워크-정보-확인">워커 노드의 네트워크 정보 확인</h2>
<pre><code>// 인터페이스 IP 주소 확인
ssh ec2-user@$N1 sudo ip -c addr

ssh ec2-user@$N2 sudo ip -c addr

// 라우팅 테이블 확인
ssh ec2-user@$N1 sudo ip -c route

ssh ec2-user@$N2 sudo ip -c route

// NAT iptables 확인
ssh ec2-user@$N1 sudo iptables -t nat -S

ssh ec2-user@$N2 sudo iptables -t nat -S</code></pre><ul>
<li><p>ssh ec2-user@$N1 sudo ip -c addr</p>
<ul>
<li><p>sudo
명령어를 관리자 권한으로 실행한다. 네트워크 설정을 확인하려면 일반적으로 관리자 권한이 필요합니다.</p>
</li>
<li><p>ip addr
시스템의 네트워크 인터페이스에 대한 상세 정보를 표시한다. 여기에는 각 인터페이스의 IP 주소, 브로드캐스트 주소, 네트워크 마스크 등이 포함된다.</p>
</li>
<li><p>-c
터미널에서 정보를 쉽게 구분할 수 있도록 컬러 출력을 활성화 한다. </p>
</li>
</ul>
<br>
</li>
<li><p>ssh ec2-user@$N1 sudo ip -c route  </p>
<ul>
<li><p>sudo ip -c route:</p>
<ul>
<li><p>ip route
현재 시스템의 라우팅 테이블을 표시한다. </p>
</li>
<li><p>-c
컬러 출력을 활성화한다.</p>
</li>
</ul>
<br>
</li>
</ul>
</li>
<li><p>ssh ec2-user@$N1 sudo iptables -t nat -S</p>
<ul>
<li><p>sudo iptables -t nat -S</p>
<ul>
<li><p>iptables
리눅스 시스템에서 네트워크 패킷 필터링 규칙을 설정하고 관리하는 명령어다.</p>
</li>
<li><p>-t nat
NAT(Network Address Translation) 테이블을 대상으로 지정한다. NAT 테이블은 네트워크 주소 변환과 관련된 규칙을 포함하고 있다.</p>
</li>
<li><p>-S
현재의 모든 규칙을 나열하는 옵션이다.</p>
</li>
</ul>
<br>

</li>
</ul>
</li>
</ul>
<h2 id="워커-노드의-스토리지-정보-확인">워커 노드의 스토리지 정보 확인</h2>
<pre><code> // 스토리지 정보
ssh ec2-user@$N1 lsblk

ssh ec2-user@$N2 lsblk
</code></pre><ul>
<li>lsblk
&quot;list block devices&quot;의 약자로, 시스템에 연결된 블록 디바이스(주로 디스크 장치와 그 파티션)를 트리 구조로 보여준다.
각 디스크의 이름, 크기, 유형(예: 디스크, 파티션), 마운트 포인트 등의 정보를 확인할 수 있다.</li>
</ul>
<br>

<h2 id="워커-노드의-통신-대상-확인">워커 노드의 통신 대상 확인</h2>
<pre><code># TCP 세션 확인 (kubelet과 kubeproxy의 Peer IP 확인)
ssh ec2-user@$N1 sudo ss -tnp
ssh ec2-user@$N2 sudo ss -tnp

# API 서버 주소 dig 조회
dig +short $APIDNS

# 새로운 터미널에서 kebectl으로 노드에 bash 셸 접근
kubectl node-shell $NN1

exit</code></pre><ul>
<li><p>ssh ec2-user@$N1 sudo ss -tnp
각 워커 노드에서 kubelet 및 kube-proxy와 같은 주요 Kubernetes 컴포넌트들이 사용 중인 TCP 세션과 연결된 Peer IP를 확인하는 데 사용된다.</p>
<ul>
<li><p>sudo
명령어를 관리자 권한으로 실행합니다. 네트워크 관련 정보는 보통 관리자 권한이 필요합니다.</p>
</li>
<li><p>ss
ss 명령어는 소켓 통계(socket statistics)를 보여주는 유틸리티로, 현재 시스템에서 열려 있는 소켓(네트워크 연결)에 대한 정보를 제공합니다.</p>
<blockquote>
<ul>
<li>소켓
소켓(Socket)은 네트워크 통신에서 데이터를 주고받기 위한 끝점(Endpoint)을 정의하는 개념이다. IP 주소, 포트 번호, 프로토콜로 구성되어 있으며, 이들을 결합하여 네트워크 상의 특정 서비스와 통신을 가능하게 한다. 소켓을 통해 클라이언트와 서버 간의 연결이 이루어지고, 데이터를 송수신하며, 통신 세션을 관리할 수 있다.</li>
</ul>
</blockquote>
</li>
<li><p>-t
TCP 소켓만 표시한다.</p>
</li>
<li><p>-n
호스트 이름을 숫자 IP 주소로 표시하며, 포트도 숫자로 표시한다.</p>
</li>
<li><p>-p
연결된 프로세스의 정보를 표시한다. 이는 각 연결이 어떤 프로세스에 의해 관리되고 있는지 확인하는 데 유용하다.</p>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>dig +short <code>$APIDNS</code>
$APIDNS에 저장된 Kubernetes API 서버의 DNS 이름을 IP 주소로 조회한다.</p>
<ul>
<li><p>dig
DNS 조회 도구로, 도메인 이름에 대한 정보를 확인하는 데 사용된다. </p>
</li>
<li><p>+short
간략한 형태로 결과를 출력한다. 해당 옵션을 사용하면 기본적으로 IP 주소만 출력된다.</p>
</li>
<li><p>$APIDNS
APIDNS 환경 변수에 저장된 Kubernetes API 서버의 도메인 이름이다. </p>
</li>
</ul>
<br>
</li>
<li><p>kubectl node-shell $NN1
ubernetes 노드에 kubectl을 통해 직접 셸(bash) 접근을 제공한다. 이를 통해 노드에서 직접 명령을 실행하고 시스템 상태를 점검할 수 있다.</p>
<ul>
<li><p>kubectl
Kubernetes 클러스터와 상호작용하기 위한 명령줄 도구이다.</p>
</li>
<li><p>node-shell
Kubernetes 노드에 대한 인터랙티브 셸을 연다. 이 셸을 통해 해당 노드의 환경에 직접 접근하여 진단, 문제 해결 및 관리 작업을 수행할 수 있다.</p>
</li>
<li><p>$NN1
접근하려는 노드의 이름이다. $NN1 변수는 노드의 이름을 저장하고 있다.</p>
</li>
</ul>
</li>
</ul>
<h2 id="eks-보안-그룹-확인">EKS 보안 그룹 확인</h2>
<pre><code># 보안 그룹 ID와 이름 확인
aws ec2 describe-security-groups --query &#39;SecurityGroups[*].[GroupId, GroupName]&#39; --output text | grep myeks

# 각각의 보안 그룹 정보 확인
aws ec2 describe-security-groups --group-ids --output yaml sg-XXXXXXXXXXX | yh</code></pre><ul>
<li><p>aws ec2 describe-security-groups --query &#39;SecurityGroups[*].[GroupId, GroupName]&#39; --output text | grep myeks
이 명령어는 보안 그룹의 ID와 이름을 텍스트 형식으로 출력하며, 그 중 myeks라는 문자열을 포함하는 보안 그룹만을 표시한다.</p>
<ul>
<li>aws ec2 describe-security-groups
AWS CLI 명령어로, 현재 계정에서 사용 가능한 모든 보안 그룹의 정보를 조회한다.</li>
</ul>
<br>

<ul>
<li>--query &#39;SecurityGroups[*].[GroupId, GroupName]&#39;
JMESPath 구문을 사용하여 출력 결과를 필터링한다.<blockquote>
<p>JMESPath는 JSON 데이터에서 원하는 정보를 필터링하거나 선택하는 데 사용되는 쿼리 언어이다. JMESPath는 AWS CLI와 같은 도구에서 JSON 응답을 처리할 때 매우 유용하다. 이를 사용하여 복잡한 JSON 구조에서 특정 데이터를 추출할 수 있다.</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>SecurityGroups[*].[GroupId, GroupName]
모든 보안 그룹의 ID(GroupId)와 이름(GroupName)을 리스트 형식으로 추출한다.</p>
<br>

<ul>
<li>--output text
결과를 텍스트 형식으로 출력한다. 기본적으로 열 구분자로 탭이 사용된다.</li>
</ul>
<br>

<ul>
<li>| grep myeks
grep 명령어를 사용하여 출력된 보안 그룹 중 myeks라는 문자열을 포함하는 항목만 필터링한다. 
이는 myeks라는 이름이나 ID를 포함한 보안 그룹을 찾는 데 유용하다.</li>
</ul>
<br>

</li>
</ul>
<ul>
<li><p>aws ec2 describe-security-groups --group-ids --output yaml sg-XXXXXXXXXXX | yh
지정된 보안 그룹 ID(sg-XXXXXXXXXXX)에 대한 상세 정보를 YAML 형식으로 출력한다. 이 정보에는 인바운드 규칙, 아웃바운드 규칙, VPC ID, 설명 등이 포함된다. yh 명령어를 사용하면 출력된 YAML 데이터를 더 깔끔하고 가독성 있게 볼 수 있다.  </p>
<ul>
<li><p>aws ec2 describe-security-groups --group-ids sg-XXXXXXXXXXX
특정 보안 그룹의 상세 정보를 조회한다.</p>
</li>
<li><p>--group-ids sg-XXXXXXXXXXX
조회할 보안 그룹의 ID를 지정한다. 예: sg-XXXXXXXXXXX.</p>
</li>
<li><p>--output yaml
출력 형식을 YAML로 지정한다. YAML 형식은 사람이 읽기 쉽게 구조화된 데이터 표현을 제공한다.</p>
</li>
<li><p>| yh
yh는 YAML 출력을 깔끔하게 표시하는 명령어다. 이는 설치된 yh 유틸리티를 사용하여 출력된 YAML을 보기 좋게 색상 구분을 하여 표시한다.</p>
<br>

</li>
</ul>
</li>
</ul>
<h3 id="eksctl에서-amazon-eks-보안그룹-구성">eksctl에서 Amazon EKS 보안그룹 구성</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/bb008173-16c0-4fe1-b0f3-60ea99923d71/image.png" alt="">출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟  </p>
</blockquote>
<ul>
<li><p>워커 노드는 myeks-VPC의 ENI와 연결되어 VPC 내부의 통신이나 외부 인터넷 구간 통신이 가능하다.</p>
</li>
<li><p>워커 노드는 컨트롤 플레인의 API 서버와 연결된 EKS owned ENI와도 연결된다.</p>
</li>
<li><p>EKS 관리용 인스턴스인 myeks-host도 myeks-VPC의 ENI와 연결되어 통신을 수행한다.</p>
<blockquote>
<p>ENI는 EC2 인스턴스의 네트워크 인터페이스로, 서브넷에 속해 있으며 서브넷의 IP 주소 범위 내에서 IP 주소를 할당받는다. ENI는 EC2 인스턴스가 네트워크에 연결될 수 있도록 하는 가상 네트워크 인터페이스로, IP 주소, 보안 그룹 등을 포함한다.</p>
</blockquote>
</li>
</ul>
<ul>
<li><p>Cluster SG 보안 그룹
컨트롤 플레인과 워커 노드 간 통신을 할 때 사용하는 보안 정책이다. 각 워커 노드의 ENI와 EKS owned ENI 모두에 해당 보안 그룹이 적용되어 있다.</p>
</li>
<li><p>Control Plane SG 보안 그룹
EKS owned ENI로 컨트롤 플레인과 통신 할 때 사용하는 보안 정책이다.</p>
</li>
<li><p>Cluster Shared Node SG 보안 그룹
노드 간의 통신을 할 때 사용하는 보안 정책이다.</p>
</li>
<li><p>Node Remote Access SG
워커 노드로 SSH 접근을 할 때 사용하는 보안 정책이다.</p>
</li>
<li><p>myeks-host Remote Access SG
myeks-host에 접근을 위한 보안 정책도 존재한다.</p>
</li>
</ul>
<br>

<h3 id="파드-배포">파드 배포</h3>
<pre><code># 새로운 터미널에서 파드와 서비스 모니터링
watch -d &#39;kubectl get pod,svc&#39;

# 슈퍼마리오 디플로이먼트 다운 및 확인
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/mario.yaml

cat mario.yaml | yh

# 슈퍼마리오 디플로이먼트 배포
kubectl apply -f mario.yaml

# 슈퍼마리오 디플로이먼트 배포 확인 (CLB 확인)
kubectl get deploy,svc,ep mario

# 슈퍼마리오 CLB 주소 추출
kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk &#39;{ print &quot;Mario URL = http://&quot;$1 }&#39;
</code></pre><ul>
<li><p>watch -d &#39;kubectl get pod,svc&#39;
주기적으로 파드와 서비스의 상태를 확인하면서, 변화가 발생하는 즉시 이를 모니터링할 수 있도록 한다. 새로운 파드가 생성되거나 서비스의 상태가 변경될 때마다 업데이트된 정보를 즉시 확인할 수 있다.</p>
<ul>
<li><p>watch -d
주어진 명령어를 주기적으로 실행하여 출력 결과를 모니터링한다. -d 옵션은 변경된 부분을 강조하여 표시한다.</p>
</li>
<li><p>kubectl get pod,svc
클러스터에서 실행 중인 파드(pods)와 서비스(services)의 상태를 조회한다.</p>
</li>
</ul>
<br>
</li>
<li><p>curl -s -O <a href="https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/mario.yaml">https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/mario.yaml</a><br>슈퍼마리오 애플리케이션을 배포하기 위한 Kubernetes YAML 파일을 다운로드하고, 이를 확인한다.</p>
<ul>
<li><p>curl -s -O
주어진 URL에서 파일을 다운로드하여 현재 디렉토리에 저장한다. -O 옵션은 원본 파일 이름을 유지한다.</p>
</li>
<li><p><a href="https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/mario.yaml">https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/mario.yaml</a>
슈퍼마리오 애플리케이션의 Kubernetes 디플로이먼트 파일이 위치한 URL이다.</p>
</li>
<li><p>cat mario.yaml
다운로드한 mario.yaml 파일의 내용을 출력한다.</p>
</li>
<li><p>| yh
출력된 YAML 파일을 더 깔끔하게 보기 위해 yh 유틸리티를 사용한다. 이는 YAML 데이터를 색상으로 구분하여 가독성을 높인다.</p>
</li>
</ul>
<br>
</li>
<li><p>kubectl apply -f mario.yaml
다운로드한 mario.yaml 파일을 사용하여 Kubernetes 클러스터에 슈퍼마리오 애플리케이션을 배포한다.</p>
<ul>
<li><p>apply 
정의된 리소스(파드, 서비스 등)를 클러스터에 적용한다.</p>
</li>
<li><p>-f 
Kubernetes 클러스터에서 실행할 리소스(예: 파드, 디플로이먼트, 서비스 등)의 설정을 담고 있는 YAML 또는 JSON 파일을 읽어들여, 그 내용에 따라 실제로 Kubernetes 클러스터에 해당 리소스들을 생성하거나 업데이트한다.</p>
</li>
</ul>
<br>
</li>
<li><p>kubectl get deploy,svc,ep mario
mario라는 이름의 디플로이먼트(deployment), 서비스(service), 엔드포인트(endpoint) 정보를 조회하여 상태를 확인한다.</p>
<ul>
<li><p>deploy
슈퍼마리오 애플리케이션의 디플로이먼트 상태를 확인한다.</p>
</li>
<li><p>svc
슈퍼마리오 애플리케이션의 서비스 상태를 확인한다.</p>
</li>
<li><p>ep
서비스가 연결된 파드의 엔드포인트 상태를 확인한다.</p>
</li>
</ul>
<br>
</li>
<li><p>kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk &#39;{ print &quot;Mario URL = http://&quot;$1 }&#39;
슈퍼마리오 애플리케이션이 로드 밸런서를 통해 접근 가능한 URL을 출력한다. 이를 통해 사용자는 웹 브라우저에서 슈퍼마리오 애플리케이션을 직접 접근할 수 있는 주소를 얻을 수 있다.</p>
<blockquote>
<p>JSONPath는 JSON 데이터 구조에서 특정 데이터를 선택하고 추출하기 위해 사용하는 쿼리 언어이다. JSONPath는 JSON 문서 내의 특정 부분을 탐색하고 필터링할 수 있도록 도와주고,이를 통해 JSON 객체나 배열에서 원하는 데이터를 효율적으로 추출할 수 있다.</p>
</blockquote>
<ul>
<li><p>kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname}:</p>
<ul>
<li><p>svc mario: mario라는 이름의 서비스를 조회한다.</p>
</li>
<li><p>-o jsonpath={.status.loadBalancer.ingress[0].hostname}
JSON 경로를 사용하여 서비스의 로드 밸런서 주소(호스트 이름)를 추출한다.</p>
<ul>
<li><p>.status
JSON 출력에서 status 필드를 선택한다. status는 리소스의 현재 상태 정보를 담고 있다.</p>
</li>
<li><p>.loadBalancer
status 필드 안의 loadBalancer 필드를 선택한다. 이 필드는 로드 밸런서 관련 정보를 포함하고 있다.</p>
</li>
<li><p>.ingress
loadBalancer 필드 안의 ingress 필드를 선택한다. ingress는 로드 밸런서의 진입점 목록을 나타내는 배열이다. 이 배열에는 로드 밸런서의 IP 주소나 호스트 이름이 포함된다.</p>
</li>
<li><p>[0]
ingress 배열의 첫 번째 요소를 선택한다. 이 배열은 여러 진입점을 가질 수 있지만, 일반적으로 클라이언트가 서비스에 접근하기 위해서는 첫 번째 진입점이 필요하다.</p>
</li>
<li><p>.hostname
ingress[0] 요소의 hostname 필드를 선택한다. 해당 필드는 로드 밸런서의 DNS 호스트 이름을 나타낸다.</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>| awk &#39;{ print &quot;Mario URL = http://&quot;$1 }&#39;</p>
<ul>
<li>awk
추출된 호스트 이름 앞에 &quot;Mario URL = http://&quot;을 추가하여 완전한 URL 형식으로 출력한다.   </li>
</ul>
<br>

</li>
</ul>
</li>
</ul>
<h2 id="생성한-파드-삭제">생성한 파드 삭제</h2>
<pre><code>kubectl delete -f mario.yaml</code></pre><ul>
<li>delete 
kubectl 명령어 중 하나로, 지정된 리소스 또는 리소스 그룹을 삭제하는 명령어다.
해당 명령어는 클러스터에서 리소스를 제거한다. 리소스가 삭제되면 해당 리소스와 관련된 모든 파드, 서비스, 디플로이먼트 등이 삭제된다.</li>
</ul>
<ul>
<li><p>-f mario.yaml</p>
<ul>
<li><p>-f
file의 약자로, 파일 경로를 지정하는 옵션이다.</p>
</li>
<li><p>mario.yaml
삭제할 리소스들이 정의된 YAML 파일이다. 해당 파일에는 리소스의 종류(예: 디플로이먼트, 서비스), 이름, 설정 등이 포함되어 있다.</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>kubectl delete -f mario.yaml 명령어가 실행되면, Kubernetes는 이 YAML 파일을 읽고, 해당 파일에 정의된 모든 리소스를 클러스터에서 삭제한다. 여기에는 디플로이먼트, 서비스, 파드, 컨피그맵, 시크릿 등 다양한 리소스가 포함될 수 있다.</p>
</blockquote>
<br>

<h2 id="관리형-노드-그룹에-노드-추가-및-삭제">관리형 노드 그룹에 노드 추가 및 삭제</h2>
<pre><code># 새로운 터미널에서 EC2 인스턴스 생성 모니터링
while true; do aws ec2 describe-instances --query &quot;Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key==&#39;Name&#39;]|[0].Value,Status:State.Name}&quot; --filters Name=instance-state-name,Values=running --output text ; echo &quot;------------------------------&quot; ; sleep 1; done

# EKS 노드 그룹 정보 확인
eksctl get nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup

# EKS 노드 수 증가 (2개 -&gt; 3개)
eksctl scale nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup --nodes 3 --nodes-min 3 --nodes-max 6

# EKS 노드 수 감소 (3개 -&gt; 2개)
eksctl scale nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup --nodes 2 --nodes-min 2 --nodes-max 4</code></pre><ul>
<li><p>while true; do aws ec2 describe-instances --query &quot;Reservations[<em>].Instances[</em>].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key==&#39;Name&#39;]|[0].Value,Status:State.Name}&quot; --filters Name=instance-state-name,Values=running --output text ; echo &quot;------------------------------&quot; ; sleep 1; done</p>
<ul>
<li><p>while true; do ... done
무한 루프를 실행하여 주기적으로 특정 작업을 수행한다. true 조건이 항상 참이므로, 루프는 무한정 반복한다.</p>
</li>
<li><p>aws ec2 describe-instances
AWS CLI 명령어로, 현재 계정의 EC2 인스턴스에 대한 정보를 조회합니다.</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>--query
describe-instances 명령어의 출력 결과를 필터링하여, 원하는 필드만 선택하는 데 사용된다.</p>
<ul>
<li>Reservations[<em>].Instances[</em>].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key==&#39;Name&#39;]|[0].Value,Status:State.Name}
각 인스턴스의 퍼블릭 IP, 프라이빗 IP, 인스턴스 이름, 상태 정보를 출력한다.</li>
</ul>
</li>
</ul>
<ul>
<li><p>--filters Name=instance-state-name,Values=running
현재 실행 중인(running) 인스턴스만 필터링하여 출력한다.</p>
</li>
<li><p>--output text
출력 결과를 텍스트 형식으로 표시한다.</p>
</li>
<li><p>echo &quot;------------------------------&quot;
각 반복이 끝날 때마다 출력되어, 이전 명령어 출력과 다음 명령어 출력 사이에 구분선을 삽입한다.</p>
</li>
<li><p>sleep 1
각 루프 사이에 1초 대기한다.</p>
<br>

</li>
</ul>
<ul>
<li><p>eksctl get nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup
 EKS 클러스터 내의 특정 노드 그룹에 대한 정보를 조회합니다. 노드 그룹의 상태, 크기, 구성 등의 정보를 확인할 수 있다.</p>
<ul>
<li><p>get nodegroup
지정된 클러스터에서 노드 그룹 정보를 가져온다.</p>
</li>
<li><p>--cluster $CLUSTER_NAME
CLUSTER_NAME 변수에 저장된 클러스터 이름을 지정하여, 해당 클러스터의 정보를 조회한다.</p>
</li>
<li><p>--name $CLUSTER_NAME-nodegroup
특정 노드 그룹의 이름을 지정한다. </p>
<br>

</li>
</ul>
<ul>
<li><p>eksctl scale nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup --nodes 3 --nodes-min 3 --nodes-max 6</p>
<ul>
<li><p>scale nodegroup
EKS 클러스터의 노드 그룹 크기를 조정하는 명령어다.</p>
</li>
<li><p>--cluster $CLUSTER_NAME
조정할 노드 그룹이 속한 클러스터 이름을 지정한다.</p>
</li>
<li><p>--name $CLUSTER_NAME-nodegroup
크기를 조정할 노드 그룹의 이름을 지정한다.</p>
</li>
<li><p>--nodes 3
노드 그룹의 현재 노드 수를 3개로 조정한다.</p>
</li>
<li><p>--nodes-min 3
노드 그룹의 최소 노드 수를 3개로 설정한다.</p>
</li>
<li><p>--nodes-max 6
노드 그룹의 최대 노드 수를 6개로 설정한다. </p>
</li>
</ul>
<br>

</li>
</ul>
</li>
</ul>
<h2 id="실습-환경-삭제">실습 환경 삭제</h2>
<pre><code># eksctl 도구로 Amazon EKS 클러스터 삭제
eksctl delete cluster --name $CLUSTER_NAME</code></pre><ul>
<li><p>delete cluster
클러스터를 삭제하는 명령이다.</p>
</li>
<li><p>--name $CLUSTER_NAME
삭제하려는 클러스터의 이름을 지정한다. </p>
<br>

</li>
</ul>
<pre><code>// awscli 도구로 기본 인프라 삭제
aws cloudformation delete-stack --stack-name $CLUSTER_NAME</code></pre><ul>
<li>delete-stack
특정 스택을 삭제하는 명령이다.</li>
</ul>
<ul>
<li>--stack-name $CLUSTER_NAME
삭제하려는 스택의 이름을 지정한다. </li>
</ul>
<br>
<br>
<br>
해당 글은 다음 강의의 내용을 참고한 글임을 밝힙니다. 자세한 내용은 다음 강의에서 확인해볼 수 있습니다. <br>
인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟  
]]></description>
        </item>
        <item>
            <title><![CDATA[eksctl을 통한 Amazon EKS 배포]]></title>
            <link>https://velog.io/@summer_today/eksctl%EC%9D%84-%ED%86%B5%ED%95%B4-Amazon-EKS-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@summer_today/eksctl%EC%9D%84-%ED%86%B5%ED%95%B4-Amazon-EKS-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 22 Aug 2024 06:48:21 GMT</pubDate>
            <description><![CDATA[<h2 id="eksctl에서-amazon-eks-배포">eksctl에서 Amazon EKS 배포</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/e3217a46-bf34-4b49-8245-750c2d519e1e/image.png" alt=""> 출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟ </p>
</blockquote>
<ul>
<li><p>다양한 옵션을 정의해야 하지만 eksctl 명령만으로도 손쉽게 클러스터를 생성하거나 삭제가 가능하다.</p>
</li>
<li><p>myeks-host에서 eksctl create cluster 형태의 명령어 수행 시 EKS 클러스터를 생성하는 작업을 진행한다.</p>
</li>
<li><p>옵션에 따라 다르지만, 명령어 한번에 EKS 클러스터 생성과 노드 그룹까지 생성할 수도 있다.</p>
</li>
<li><p>eksctl create cluster 명령으로 EKS 클러스터를 생성하기 위한 IAM 역할을 만든 뒤 Control Plane을 구성하며 Kubeconfig 정보를 업데이트 한다.</p>
</li>
<li><p>EKS 노드 그룹 생성을 위한 IAM 역할을 만들어 노드 그룹 구성까지 한 번에 진행할 수 있다. </p>
</li>
<li><p>eksctl이 EKS 클러스터 생성을 위한 다양한 자원을 동적으로 만들 수 있는 이유는 CloudFormation을 활용하기 때문이다.</p>
<ul>
<li><p>요청에 의해 CloudFormation 스택을 생성하고 스택에 정의된 자원을 동적으로 생성하게 된다.</p>
</li>
<li><p>즉, EKS 클러스터 IAM 역할과 노드 IAM 역할이 생성되고 EKS 클러스터를 구성하는 Control Plane과 노드 그룹이 동적으로 생성된다.</p>
</li>
<li><p>myeks-host에 kubeconfig 정보를 동적으로 업데이트하여 kubectl 명령도 수행할 수 있게 처리된다.</p>
</li>
</ul>
<br>

</li>
</ul>
<h2 id="eksctl-설치">eksctl 설치</h2>
<pre><code>curl -sL &quot;https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz&quot; | tar xz -C /tmp

sudo mv /tmp/eksctl /usr/local/bin

eksctl version</code></pre><ul>
<li><p>curl -sL &quot;<a href="https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz&quot;">https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz&quot;</a> | tar xz -C /tmp
최신 버전의 eksctl 압축 파일을 GitHub에서 다운로드하고, 바로 /tmp 디렉터리에 압축을 푸는 작업을 수행한다.</p>
<ul>
<li><p>curl
파일을 다운로드할 때 사용하는 명령어.</p>
</li>
<li><p>-s
출력 메시지를 숨기고 조용히(silent) 다운로드하는 옵션.</p>
</li>
<li><p>-L
URL이 리다이렉트될 경우, 최종 위치까지 따라가서 다운로드하도록 하는 옵션.</p>
</li>
<li><p>| (파이프 연산자)
이 연산자는 앞의 curl 명령어의 출력을 다음 명령어인 tar로 전달하는 역할을 한다. 즉, 다운로드된 압축 파일을 tar로 직접 전달한다.</p>
</li>
<li><p>tar
압축 파일을 다루는 명령어로, 파일의 압축을 풀거나 묶을 때 사용한다.</p>
</li>
<li><p>xz
tar의 옵션으로, x는 압축을 푼다는 의미(Extract), z는 gzip 형식의 압축을 해제한다는 뜻이다.</p>
</li>
<li><p>-C /tmp
압축을 풀 때 결과 파일을 /tmp 디렉터리에 저장하라는 의미다. /tmp는 임시 디렉터리로, 사용자가 임시로 파일을 보관할 때 자주 쓰는 위치다.</p>
</li>
</ul>
<br>
</li>
<li><p>sudo mv /tmp/eksctl /usr/local/bin<br>eksctl 바이너리를 시스템이 실행 가능한 경로에 옮기는 명령어이다.</p>
<ul>
<li><p>/usr/local/bin은 리눅스 시스템에서 실행 파일들을 저장하는 디렉터리 중 하나로, 사용자가 명령어를 입력할 때 자동으로 검색되는 경로다. 해당 경로에 파일을 옮겨야 명령어를 어디서든 쉽게 실행할 수 있다.</p>
</li>
<li><p>일반 사용자 권한으로는 파일을 옮길 수 없기 때문에, sudo를 사용해서 관리자 권한으로 파일을 이동해야 한다.</p>
</li>
</ul>
<br>

</li>
</ul>
<h2 id="eksctl에-활용할-변수-확인">eksctl에 활용할 변수 확인</h2>
<pre><code>echo $AWS_DEFAULT_REGION

echo $CLUSTER_NAME

echo $VPCID

echo $PubSubnet1

echo $PubSubnet2
</code></pre><ul>
<li>위 명령어들을 통해 미리 설정해두었던 변수 값들을 확인한다.</li>
</ul>
<br>

<h2 id="eksctl-명령어">eksctl 명령어</h2>
<ul>
<li>기본 명령어</li>
</ul>
<pre><code>// eksctl 명령어 확인
eksctl

// eksctl create 명령어
eksctl create

// eksctl create cluster or nodegroup 명령어 (--help)
eksctl create cluster -h

eksctl create nodegroup -h

// 지원하는 Kubernetes 버전 정보
eksctl create cluster -h | grep version</code></pre><br>

<ul>
<li><p>EKS 클러스터 기본 생성 확인 명령어</p>
<pre><code>eksctl create cluster \
  --name $CLUSTER_NAME \
  --region=$AWS_DEFAULT_REGION \
  --dry-run | yh</code></pre><p>--dry-run 명령어를 통해 실제 클러스터를 생성하지 않고, 생성할 때 사용될 설정을 yh를 통해 YAML 형식으로 출력하여 확인할 수 있다.</p>
<br>

<ul>
<li><p>노드 그룹을 제외한 EKS 클러스터 생성 확인 명령어 </p>
<pre><code>eksctl create cluster \
--name $CLUSTER_NAME \
--region=$AWS_DEFAULT_REGION \
--without-nodegroup \
--dry-run | yh </code></pre><ul>
<li>환경 변수로 지정된 클러스터 이름과 리전 정보를 사용하여 노드 그룹 없이 EKS 클러스터를 생성할 준비를 하고, 실제로 생성하지 않고 어떤 작업이 수행될지를 확인하는 명령어이다.(--dry-run 옵션 사용시 실제 자원을 생성하지 않고 생성될 자원을 출력한다.)</li>
</ul>
</li>
</ul>
<br>
</li>
<li><p>노드 그룹을 제외하고 가용 영역 2a, 2c에 EKS 클러스터 생성 확인 명령어 </p>
<pre><code>eksctl create cluster \
  --name $CLUSTER_NAME \
  --region=$AWS_DEFAULT_REGION \
  --without-nodegroup \
  --zones=ap-northeast-2a,ap-northeast-2c \
  --dry-run | yh
</code></pre><br>
</li>
<li><p>노드 그룹을 포함하여 EKS 클러스터 생성 확인 명령어</p>
<pre><code>eksctl create cluster \
  --name $CLUSTER_NAME \
  --region=$AWS_DEFAULT_REGION \
  --nodegroup-name=$CLUSTER_NAME-nodegroup \
  --node-type=t3.medium \
  --node-volume-size=30 \
  --zones=ap-northeast-2a,ap-northeast-2c \
  --vpc-cidr=172.20.0.0/16 \
  --ssh-access \
  --dry-run | yh</code></pre><ul>
<li><p>서울 리전의 특정 가용 영역(ap-northeast-2a 및 ap-northeast-2c)에 t3.medium 인스턴스 타입과 30GB 볼륨을 갖춘 노드 그룹이 포함된 EKS 클러스터를 생성하는 명령어이다.</p>
<br>

</li>
</ul>
</li>
</ul>
<h2 id="eks-클러스터--관리형-노드-그룹-생성">EKS 클러스터 &amp; 관리형 노드 그룹 생성</h2>
<ul>
<li>EKS 클러스터 및 관리형 노드 그룹 생성 전 정보 확인</li>
</ul>
<pre><code>eksctl create cluster \
  --name $CLUSTER_NAME \
  --region=$AWS_DEFAULT_REGION \
  --nodegroup-name=$CLUSTER_NAME-nodegroup \
  --node-type=t3.medium \
  --node-volume-size=30 \
  --vpc-public-subnets &quot;$PubSubnet1,$PubSubnet2&quot; \
  --version 1.26 \
  --ssh-access \
  --external-dns-access \
  --dry-run | yh</code></pre><p>  클러스터 이름과 리전을 지정하고, t3.medium 인스턴스 타입의 노드 그룹을 생성하며, 각 노드에 30GB의 볼륨을 할당한다.</p>
<p>  클러스터는 지정된 퍼블릭 서브넷($PubSubnet1, $PubSubnet2)에서 배포되며, Kubernetes 버전 1.26을 사용한다. </p>
<p>  또한, SSH 접근과 외부 DNS 접근을 허용하도록 설정합니다. --dry-run 옵션을 사용해 실제 클러스터 생성 없이 설정 내용을 미리 확인하며, 이 설정 결과를 YAML 형식으로 yq를 통해 가독성 있게 출력한다.
  <br></p>
<ul>
<li>EKS 클러스터 및 관리형 노드 그룹 생성</li>
</ul>
<pre><code>eksctl create cluster \
  --name $CLUSTER_NAME \
  --region=$AWS_DEFAULT_REGION \
  --nodegroup-name=$CLUSTER_NAME-nodegroup \
  --node-type=t3.medium \
  --node-volume-size=30 \
  --vpc-public-subnets &quot;$PubSubnet1,$PubSubnet2&quot; \
  --version 1.26 \
  --ssh-access \
  --external-dns-access \
  --verbose 4</code></pre><p>verbose 옵션은 eksctl 명령어에서 실행 중에 출력되는 로그의 상세 수준을 제어하는 데 사용된다.</p>
<blockquote>
<p>--verbose 0: 거의 로그를 출력하지 않으며, 기본적인 오류와 중요한 메시지만 표시된다.
--verbose 1: 일반적인 정보 메시지가 포함되며, 일반적인 사용에 적합하다.
--verbose 2: 추가적인 디버그 정보가 출력된다.
--verbose 3: 더 상세한 디버그 정보와 더 많은 내부 처리 과정을 볼 수 있다.
--verbose 4: 가장 상세한 로그가 출력되며, 명령어의 내부 동작을 모두 볼 수 있다. 모든 HTTP 요청, API 호출, 내부 상태 등이 포함된다.</p>
</blockquote>
<br>

<h2 id="eks-클러스터-배포-자원-구성도">EKS 클러스터 배포 자원 구성도</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/0ff19e95-ce0f-4d7a-8671-7731d16440ae/image.png" alt="">출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟ </p>
</blockquote>
<ul>
<li><p>EKS 클러스터 IAM과 EKS 노드 IAM이 연결되어 자격 증명을 수행한다.</p>
</li>
<li><p>AWS 관리형 VPC에 Control Plane 자원이 생성되고, myeks-VPC에 워커 노드가 구성된다.</p>
</li>
<li><p>eksctl 명령으로 서브넷은 서로 다른 가용 영역의 퍼블릭 서브넷 2개만 지정되었다.</p>
</li>
<li><p>워커 노드는 2개의 가용 영역에 퍼블릭 서브넷에만 구성되고, 이에 따라 Control Plane은 2개의 가용 영역에서만 생성된다.</p>
</li>
<li><p>클러스터 엔드포인트 액세스는 별도로 설정하지 않아 기본 값인 퍼블릭으로 구성된다.</p>
</li>
<li><p>이에 따라 myeks-host는 인터넷을 통해 API 서버와 통신할 수 있다.</p>
</li>
<li><p>API 서버와 워커 노드 간의 통신을 위해 EKS-owned ENI가 구성된다.</p>
</li>
</ul>
<br>
<br>
<br>
해당 글은 다음 강의의 내용을 참고한 글임을 밝힙니다. 자세한 내용은 다음 강의에서 확인해볼 수 있습니다. <br>
인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟  ]]></description>
        </item>
        <item>
            <title><![CDATA[EKS 배포 - 관리 콘솔]]></title>
            <link>https://velog.io/@summer_today/EKS-%EB%B0%B0%ED%8F%AC-%EA%B4%80%EB%A6%AC-%EC%BD%98%EC%86%94</link>
            <guid>https://velog.io/@summer_today/EKS-%EB%B0%B0%ED%8F%AC-%EA%B4%80%EB%A6%AC-%EC%BD%98%EC%86%94</guid>
            <pubDate>Mon, 19 Aug 2024 05:17:15 GMT</pubDate>
            <description><![CDATA[<h2 id="관리콘솔을-통해-eks-배포하기">관리콘솔을 통해 EKS 배포하기</h2>
<ul>
<li><p>관리 콘솔에서 EKS 클러스터 생성시 Amazon Mangaged VPC에 Control Plane이 구성되고, EC2나 오토 스케일링이나 ELB 등이 자동으로 구성된다.</p>
</li>
<li><p>EKS는 AWS 자원을 구성하기 위한 권한이 필요하게 된다. -&gt; IAM 역할을 생성하는 작업이 선행되어 Amazon EKS에 자격 증명을 수행한 후 생성 작업이 진행된다.</p>
</li>
<li><p>EKS 관리용 인스턴스인 myeks-host에 생성된 EKS 클러스터 정보를 업데이트 해야한다. -&gt; EKS 클러스터의 보안 정보가 있어야 kubectl을 통해 명령을 내릴 수 있기 때문이다.</p>
</li>
<li><p>또한 관리형 노드 그룹을 구성함에 있어서 다양한 AWS 자원을 동적으로 구성하기 위해 IAM 역할이 필요하다. -&gt; 마찬가지로 IAM 역할을 생성하는 작업이 선행되어 Amazon EKS에 자격 증명을 수행한 후 생성 작업이 진행된다.</p>
</li>
</ul>
<br>

<h3 id="eks-클러스터-iam-역할-생성">EKS 클러스터 IAM 역할 생성</h3>
<ul>
<li><p>IAM 역할을 생성한다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/c444cb7b-c88a-4d41-9b02-61dd39d8f21e/image.png" alt=""></p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/5a03ad97-374c-40f7-a011-23eeba961735/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<ul>
<li><p>신뢰 정책의 STS는 보안 토큰을 통해 AWS 외부 자격을 증명하는 것으로 AssumRole은 AWS 자원에 접근할 수 있는 자격 증명을 의미한다.</p>
</li>
<li><p>나머지는 기본 설정으로 역할을 생성해준다.</p>
<br>

</li>
</ul>
<h3 id="eks-클러스터-생성">EKS 클러스터 생성</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/c99855a5-81b8-4a1b-9292-f426ce72abf9/image.png" alt=""></p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/94d3b720-2272-46f0-820c-083fb8a9136b/image.png" alt=""></p>
</blockquote>
<ul>
<li>나머지는 기본 값으로 설정하여 생성해준다.</li>
</ul>
<br>

<h3 id="eks-클러스터-구성">EKS 클러스터 구성</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/7287b0ed-c386-4c2a-b9fa-f7dbd4a85112/image.png" alt="">출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟ </p>
</blockquote>
<ul>
<li><p>AWS EKS는 기본적으로 클러스터의 고가용성과 안정성을 보장하기 위해 컨트롤 플레인(제어 플레인) 컴포넌트들을 여러 가용 영역(AZ)에 분산 배치하게 된다.</p>
</li>
<li><p>컨트롤 플레인은 AWS Managed VPC에 할당되어 아마존이 관리하게 된다.</p>
</li>
<li><p>클러스터 엔드포인트 엑세스를 퍼블릭으로 설정하여 인터넷 게이트웨이도 같이 구성된다.</p>
</li>
<li><p>2개의 가용 영역에서 Control Plane 자원인 API 서버, 컨트롤러, 스케쥴러가 각각 생성되고 또 다른 서브넷이 etcd가 생성된다.</p>
</li>
<li><p>부하 분산을 위해 ELB가 구성되고, 오토 스케일링 서비스도 구성된다.</p>
</li>
</ul>
<br>

<h3 id="eks-클러스터-정보-kubeconfig-등록">EKS 클러스터 정보 kubeconfig 등록</h3>
<p>EKS 관리용 인스턴스인 myeks-host에 생성된 EKS 클러스터 정보를 업데이트 해준다.</p>
<pre><code># EKS 클러스터 정보 업데이트
aws eks update-kubeconfig --region $AWS_DEFAULT_REGION --name $CLUSTER_NAME

# kubeconfig 정보 확인
cat ~/.kube/config | yh

# kube_ps1 비활성화
kubeoff

# 생성한 Kubernetes 서비스 확인
kubectl get svc</code></pre><br>

<h2 id="amazon-eks-노드-생성">Amazon EKS 노드 생성</h2>
<p>EKS 관리형 노드 그룹이 AWS 자원을 관리하기 위해 IAM 역할이 필요하다. EKS 노드 IAM 역할을 awscli를 통해 생성해보자.</p>
<h3 id="eks-노드-iam-role의-신뢰-엔티티-설정">EKS 노드 IAM Role의 신뢰 엔티티 설정</h3>
<pre><code># EKS 노드 IAM 역할의 신뢰 대상 지정 파일 생성
cat &lt;&lt;EOT &gt; node-role-trust-policy.json
{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Principal&quot;: {
        &quot;Service&quot;: &quot;ec2.amazonaws.com&quot;
      },
      &quot;Action&quot;: &quot;sts:AssumeRole&quot;
    }
  ]
}
EOT
</code></pre><br>

<h3 id="eks-노드-iam-role-생성">EKS 노드 IAM Role 생성</h3>
<pre><code># EKS 노드 IAM 역할 생성 (eksNodeRole)
aws iam create-role \
  --role-name eksNodeRole \
  --assume-role-policy-document file://&quot;node-role-trust-policy.json&quot;

# EKS 노드 IAM 역할에 정책 연결
aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy \
  --role-name eksNodeRole

aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \
  --role-name eksNodeRole

aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
  --role-name eksNodeRole</code></pre><br>

<h3 id="eks-노드-iam-role-확인">EKS 노드 IAM Role 확인</h3>
<pre><code># EKS 노드 IAM 역할 확인
aws iam get-role --role-name eksNodeRole | jq

# EKS 노드 IAM 역할에 연결된 정책 확인
aws iam list-attached-role-policies --role-name eksNodeRole | jq
</code></pre><br>

<h3 id="eks-관리형-노드-그룹-생성">EKS 관리형 노드 그룹 생성</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/dd63778c-c4e4-4fcc-860a-63d9a6231e8e/image.png" alt=""></p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/189eaf48-4131-4464-8a96-4f8d669cfac4/image.png" alt=""></p>
</blockquote>
<ul>
<li>나머지는 기본 설정으로 진행한다.</li>
</ul>
<br>

<h2 id="amazon-eks-노드-그룹-구성도">Amazon EKS 노드 그룹 구성도</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/29995c93-78c2-4b4f-9233-c265c5280ff7/image.png" alt="">출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟ </p>
</blockquote>
<ul>
<li><p>노드 그룹이 사용자 VPC인 myeks VPC에 생성된다.</p>
</li>
<li><p>생성되는 노드의 인스턴스는 오토 스케일 그룹에 의해 자동으로 구성하고 유지된다.</p>
</li>
<li><p>API 서버와 노드 간의 통신을 위한 EKS owend ENI가 구성된다.</p>
</li>
</ul>
<br>

<h2 id="amazon-eks-클러스터-정보">Amazon EKS 클러스터 정보</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/1a80680a-ff0a-484b-99e5-96c024403eef/image.png" alt=""></p>
</blockquote>
<ul>
<li>EKS 클러스터 생성 시 엔드포인트 엑세스를 퍼블릭으로 설정을 했기에, API 서버 엔드포인트 주소만 안다면 누구나 접속할 수 있다.</li>
</ul>
<br>

<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/b284bb29-09db-4f82-b8dd-62417fff7778/image.png" alt=""></p>
</blockquote>
<ul>
<li>엔드포인트에 접속 시, 위와 같이 API 서버가 정상 응답하는 것을 확인할 수 있다. 다만, 권한이 없어 응답이 위와 같이 에러 메시지가 표기된다.</li>
</ul>
<br>


<br>
<br>
<br>
해당 글은 다음 강의의 내용을 참고한 글임을 밝힙니다. 자세한 내용은 다음 강의에서 확인해볼 수 있습니다. <br>
인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟  
]]></description>
        </item>
        <item>
            <title><![CDATA[Cloud Formation 기본 인프라 배포]]></title>
            <link>https://velog.io/@summer_today/Cloud-Formation-%EA%B8%B0%EB%B3%B8-%EC%9D%B8%ED%94%84%EB%9D%BC-%EB%B0%B0%ED%8F%AC</link>
            <guid>https://velog.io/@summer_today/Cloud-Formation-%EA%B8%B0%EB%B3%B8-%EC%9D%B8%ED%94%84%EB%9D%BC-%EB%B0%B0%ED%8F%AC</guid>
            <pubDate>Sun, 18 Aug 2024 13:08:19 GMT</pubDate>
            <description><![CDATA[<h2 id="aws-cloudformation">AWS CloudFormation</h2>
<ul>
<li><p>AWS CloudFormation은 Amazon Web Services에서 제공하는 인프라 관리 도구로, 코드로 인프라를 정의하고 관리할 수 있게 해준다.</p>
</li>
<li><p>클라우드 환경에서 서버, 데이터베이스, 네트워크 등 다양한 AWS 리소스를 효율적으로 프로비저닝하고 관리할 수 있도록 도와준다.</p>
</li>
<li><p>Git, Subversion(SVN) 등 선택한 버전 제어 시스템을 사용하여 CloudFormation 템플릿을 관리할 수 있다.</p>
</li>
<li><p>JSON 또는 YAML 템플릿 파일에서 전체 애플리케이션 스택(애플리케이션에 필요한 모든 리소스)을 정의한다.</p>
</li>
</ul>
<br>

<h3 id="스택">스택</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/b9c57c84-55ba-44bf-a494-1e19e2e57c5d/image.png" alt="">출처: Architecting on AWS 7.7.6 (KO): Student Guide</p>
</blockquote>
<ul>
<li><p>단일 단위로 관리되는 AWS 리소스 모음이다.</p>
</li>
<li><p>스택을 통해 여러 리소스를 한꺼번에 생성, 업데이트, 삭제할 수 있어, 복잡한 인프라 설정을 쉽고 일관되게 관리할 수 있다.</p>
</li>
</ul>
<br>

<h3 id="계층형-아키텍처-구현-가능">계층형 아키텍처 구현 가능</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/4ff57594-eda9-49da-ad44-1aaf30bb0938/image.png" alt="">출처: Architecting on AWS 7.7.6 (KO): Student Guide</p>
</blockquote>
<ul>
<li><p>CloudFormation을 사용하면 각 계층을 개별 템플릿이나 모듈로 관리할 수 있다. </p>
</li>
<li><p>각 계층의 리소스가 독립적으로 관리되고, 필요할 때 특정 계층만 업데이트할 수 있다.</p>
</li>
<li><p>예를 들어, 네트워크 계층(VPC, 서브넷 등)은 한 템플릿으로 정의하고, 애플리케이션 계층(EC2 인스턴스, 로드 밸런서 등)은 다른 템플릿으로 관리할 수 있다.</p>
</li>
</ul>
<br>

<h2 id="cloudformation-스택-생성">CloudFormation 스택 생성</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/17d41936-614a-4572-ba5d-4a9d1eb394ca/image.png" alt=""></p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/0953f560-efdf-4f8f-8202-95cb5ca057e1/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>sgingressSshcidr
AWS CloudFormation 템플릿에서 보안 그룹(Security Group)의 SSH(포트 22) 인바운드 규칙을 정의할 때 사용되는 매개변수(Parameter)이다. 이 매개변수는 특정 CIDR 블록을 지정하여 SSH 트래픽을 허용할 IP 범위를 정의한다. 여기서는 자신의 IP 주소/32로 설정해준다.</p>
</li>
<li><p>나머지는 기본 설정으로 진행한다.</p>
<br>

</li>
</ul>
<h2 id="cloudformation-기본-인프라-배포-구성">CloudFormation 기본 인프라 배포 구성</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/f65e6677-95eb-4d2d-8440-0acf5766d90f/image.png" alt="">출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟</p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/6ac3c62f-21de-4e6a-9477-aaf1c4920242/image.png" alt="">출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟</p>
</blockquote>
<ul>
<li><p>myeks-host라는 EC2 인스턴스는 EKS 관리 용도의 인스턴스로 Bastion Host 역할을 수행한다. 즉 myeks-host에 접근하여 EKS 관리 작업을 수행한다.</p>
<blockquote>
<ul>
<li>Bastion Host
보안 목적으로 사용되는 특별한 유형의 서버로, 민감한 내부 네트워크에 위치한 다른 서버들에 접근하기 위한 게이트웨이 역할을 한다.</li>
</ul>
</blockquote>
</li>
<li><p>보안 그룹은 위에서 설정한 대로 각자의 PC만 접근이 가능하도록 설정되어 있다.</p>
</li>
<li><p>cf. 인터넷 게이트웨이 
퍼블릭 서브넷의 리소스가 인터넷과 양방향으로 통신할 수 있도록 한다.</p>
</li>
<li><p>cf. NAT 게이트웨이
프라이빗 서브넷의 리소스가 인터넷에 나가는 트래픽을 처리하되, 외부에서 해당 리소스로 직접 접근할 수는 없다.</p>
</li>
</ul>
<br>

<h2 id="ec2-접속-후-기본-설정">EC2 접속 후 기본 설정</h2>
<p>putty를 사용하여 myeks-host EC2에 접속하여 다음 명령어들을 실행한다.</p>
<ul>
<li>사용자 확인
<code>whoami</code> 명령어를 통해 root 사용자임을 확인한다.</li>
</ul>
<br>

<ul>
<li><p>기본 설치 도구 확인</p>
<pre><code># kubectl 버전 확인
kubectl version --client=true -o yaml | yh

# eksctl 버전 확인
eksctl version

# awscli 버전 확인
aws --version

# 도커 정보 확인
docker info | yh</code></pre><br>
</li>
<li><p>awscli 사용을 위한 IAM 자격 증명
<code>aws configure</code> 명령어를 통해 IAM 사용자의 액세스 키들을 참고하여 자격 증명을 설정해준다. 그래야 awscli 사용이 가능하다.</p>
</li>
</ul>
<br>

<ul>
<li><p>EKS 배포할 VPC 정보 확인</p>
<pre><code># CLUSTER_NAME 변수 확인
echo $CLUSTER_NAME

# EKS를 배포할 myeks-VPC 정보 확인
aws ec2 describe-vpcs --filters &quot;Name=tag:Name,Values=$CLUSTER_NAME-VPC&quot; | jq

# EKS를 배포할 myeks-VPC ID 값만 확인
aws ec2 describe-vpcs --filters &quot;Name=tag:Name,Values=$CLUSTER_NAME-VPC&quot; | jq -r .Vpcs[].VpcId
</code></pre></li>
</ul>
<br>

<ul>
<li><p>EKS 배포할 VPC ID 변수 저장</p>
<pre><code># VPCID 변수에 myeks-VPC ID 값을 저장
export VPCID=$(aws ec2 describe-vpcs --filters &quot;Name=tag:Name,Values=$CLUSTER_NAME-VPC&quot; | jq -r .Vpcs[].VpcId)

# VPCID를 전역 변수로 선언
echo &quot;export VPCID=$VPCID&quot; &gt;&gt; /etc/profile

# VPCID 변수 호출
echo $VPCID</code></pre><br>
</li>
<li><p>EKS를 배포할 VPC의 서브넷 정보 확인 </p>
<pre><code># EKS를 배포할 VPC의 전체 서브넷 정보 확인
aws ec2 describe-subnets --filters &quot;Name=vpc-id,Values=$VPCID&quot; --output json | jq

# EKS를 배포할 VPC의 퍼블릭 서브넷 정보 확인
aws ec2 describe-subnets --filters Name=tag:Name,Values=&quot;$CLUSTER_NAME-PublicSubnet1&quot; | jq

aws ec2 describe-subnets --filters Name=tag:Name,Values=&quot;$CLUSTER_NAME-PublicSubnet2&quot; | jq

# EKS를 배포할 VPC의 퍼블릭 서브넷 ID 값만 확인
aws ec2 describe-subnets --filters Name=tag:Name,Values=&quot;$CLUSTER_NAME-PublicSubnet1&quot; --query &quot;Subnets[0].[SubnetId]&quot; --output text

aws ec2 describe-subnets --filters Name=tag:Name,Values=&quot;$CLUSTER_NAME-PublicSubnet2&quot; --query &quot;Subnets[0].[SubnetId]&quot; --output text
</code></pre><br>
</li>
<li><p>EKS를 배포할 퍼블릭 서브넷 ID 변수 저장</p>
<pre><code>// 변수에 퍼블릭 서브넷 ID 값을 저장
export PubSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values=&quot;$CLUSTER_NAME-PublicSubnet1&quot; --query &quot;Subnets[0].[SubnetId]&quot; --output text)

export PubSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values=&quot;$CLUSTER_NAME-PublicSubnet2&quot; --query &quot;Subnets[0].[SubnetId]&quot; --output text)

// 퍼블릭 서브넷 ID를 전역 변수로 선언
echo &quot;export PubSubnet1=$PubSubnet1&quot; &gt;&gt; /etc/profile

echo &quot;export PubSubnet2=$PubSubnet2&quot; &gt;&gt; /etc/profile

// VPCID 변수 호출
echo $PubSubnet1

echo $PubSubnet2</code></pre></li>
</ul>
<br>
<br>
<br>
해당 글은 다음 강의의 내용을 참고한 글임을 밝힙니다. 자세한 내용은 다음 강의에서 확인해볼 수 있습니다. <br>
인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟  ]]></description>
        </item>
        <item>
            <title><![CDATA[주요 라이브러리 문법]]></title>
            <link>https://velog.io/@summer_today/%EC%A3%BC%EC%9A%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@summer_today/%EC%A3%BC%EC%9A%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Sun, 18 Aug 2024 09:24:34 GMT</pubDate>
            <description><![CDATA[<h2 id="표준-라이브러리">표준 라이브러리</h2>
<p>특정한 프로그래밍 언어에서 자주 사용되는 표준 소스 코드를 미리 구현해 놓은 라이브러리이다. 코딩 테스트에 있어 반드시 알고 있어야 하는 라이브러리는 다음 6가지이다.</p>
<ul>
<li><p>내장 함수
print(), input()과 같은 기본 입출력 기능부터 sorted()와 같은 정렬 기능을 포함하고 있는 기본 내장 라이브러리이다. </p>
</li>
<li><p>itertools
파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리이다. 순열과 조합 라이브러리를 제공한다.</p>
</li>
<li><p>heapq
힙(Heap) 기능을 제공하는 라이브러리이다. 우선 순위 큐 기능을 구현하기 위해 사용한다.</p>
</li>
<li><p>bisect
이진 탐색(Binary Search) 기능을 제공하는 라이브러리이다.</p>
</li>
<li><p>collections
덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함하고 있는 라이브러리이다.</p>
</li>
<li><p>math
필수적인 수학적 기능을 제공하는 라이브러리이다. 팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련 함수부터 파이(pi)와 같은 상수를 포함하고 있다.</p>
</li>
</ul>
<br>

<h3 id="내장함수">내장함수</h3>
<p>파이썬에는 별도의 import 명령어 없이 바로 사용할 수 있는 내장 함수가 존재한다.</p>
<ul>
<li>sum()
iterable 객체(리스트, 사전 자료형, 튜플 자료형 등의 반복 가능한 객체)가 입력으로 주어졌을 때, 모든 원소의 합을 반환한다.<pre><code>result = sum([1, 2, 3])
print(result) # 출력: 6</code></pre></li>
</ul>
<br>

<ul>
<li>min()
파라미터가 2개 이상 들어왔을 때 가장 작은 값을 반환한다.<pre><code>result = min(7, 3, 5, 2)
print(result) # 출력: 2</code></pre></li>
</ul>
<br>

<ul>
<li>max()
파라미터가 2개 이상 들어왔을 때 가장 큰 값을 반환한다.<pre><code>result = max(2, 4, 1)
print(result) # 출력: 4</code></pre></li>
</ul>
<br>

<ul>
<li>eval()
수학 수식이 문자열 형식으로 들어오면 해당 수식을 계산한 결과를 반환한다.<pre><code>result = eval(&quot;(2 + 3) * 7&quot;)
print(result) # 출력: 35</code></pre></li>
</ul>
<br>

<ul>
<li><p>sorted()
iterable 객체가 들어왔을 때, 정렬된 결과를 반환한다. key 속성으로 정렬 기준을 명시할 수 있으며, reverse 속성으로 정렬된 결과 리스트를 뒤집을지의 여부를 설정할 수 있다.</p>
<pre><code># 1
result = sorted([1, 4, 2, 3])
print(result) # 출력: [1, 2, 3, 4]
# 2
result = sorted([1, 4, 2, 3], reverse = True)
print(result) # 출력: [4, 3, 2, 1]
# 3
result = sorted([(&#39;a&#39;, 3), (&#39;b&#39;, 2), (&#39;c&#39;, 7)], key = lambda x: x[1], reverse = True)
print(result) # 출력: [(&#39;c&#39;, 7), (&#39;a&#39;, 3), (&#39;b&#39;, 2)</code></pre><ul>
<li>참고로 리스트와 같은 iterable 객체는 기본으로 sort() 함수를 내장하고 있다.<pre><code>data = sort[2, 4, 1, 3]
data.sort()
print(data) # 출력: [1, 2, ,3 ,4]</code></pre></li>
</ul>
</li>
</ul>
<br>

<h3 id="itertools">itertools</h3>
<p>파이썬에서 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리이다. 가장 유용하게 사용할 수 있는 클래스는 permutations, combinations이다.</p>
<ul>
<li><p>permutations
리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산해준다. permutations는 클래스이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다.</p>
<pre><code>from itertools import permutations

data = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]
result = list(permutations(data, 3)) # data 리스트에서 3개를 뽑아 나열하는 모든 경우의 수

print(result) # 출력: [(&#39;A&#39;, &#39;B&#39;, &#39;C&#39;), (&#39;A&#39;, &#39;C&#39;, &#39;B&#39;), (&#39;B&#39;, &#39;A&#39;, &#39;C&#39;), (&#39;B&#39;, &#39;C&#39;, &#39;A&#39;), (&#39;C&#39;, &#39;A&#39;, &#39;B&#39;), (&#39;C&#39;, &#39;B&#39;, &#39;A&#39;)]</code></pre></li>
</ul>
<br>

<ul>
<li><p>combinations
리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)을 계산한다. combination도 클래스이므로 객체 초기화 이후에는 리스트 자료형을 변환하여 사용한다.</p>
<pre><code>from itertools import combination

data = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;] # 데이터 준비
result = list(combinations(data, 2)) # 2개를 뽑는 모든 조합 구하기

print(result) # 출력: [(&#39;A&#39;, &#39;B&#39;), (&#39;A&#39;, &#39;C&#39;), (&#39;B&#39;, &#39;C&#39;)]</code></pre><br>

<ul>
<li>product 
permutations와 같이 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산한다. 하지만 중복을 허용하여 뽑는다. product도 클래스이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다.<pre><code>from itertools import product
</code></pre></li>
</ul>
<p>data = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;] # 데이터 준비
result = list(product(data, repeat=2)) # 2개를 뽑는 모든 순열 구하기</p>
<p>print(result) # 출력: [(&#39;A&#39;, &#39;A&#39;), (&#39;A&#39;, &#39;B&#39;), (&#39;A&#39;, &#39;C&#39;), (&#39;B&#39;, &#39;A&#39;), (&#39;B&#39;, &#39;B&#39;), (&#39;B&#39;, &#39;C&#39;),(&#39;C&#39;, &#39;A&#39;), (&#39;C&#39;, &#39;B&#39;), (&#39;C&#39;, &#39;C&#39;),]</p>
<pre><code>
&lt;br&gt;

- combinations_with_replacement
combinations와 같이 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)를 계산한다. 하지만 중복을 허용하여 뽑는다. combinations_with_replacement도 클래스이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다.</code></pre><p>from itertools import combinations_with_replacement</p>
<p>data = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;] # 데이터 준비
result = list(combinations_with_replacement(data, repeat=2)) # 2개를 뽑는 모든 조합 구하기(중복허용)</p>
<p>print(result) # 출력: [(&#39;A&#39;, &#39;A&#39;), (&#39;A&#39;, &#39;B&#39;), (&#39;A&#39;, &#39;C&#39;), (&#39;B&#39;, &#39;A&#39;), (&#39;B&#39;, &#39;C&#39;), (&#39;C&#39;, &#39;C&#39;),]</p>
<pre><code></code></pre></li>
</ul>
<br>

<h3 id="heapq">heapq</h3>
<p>파이썬에서는 힙 기능을 위해 heapq 라이브러리를 제공한다. heapq는 다양한 알고리즘에서 우선순위 큐 기능을 구현하고자 할 때 사용된다.</p>
<ul>
<li><p>파이썬의 힙은 최소 힙으로 구성되어 있어, 원소를 힙에 넣었다 빼기만 해도 O(NlogN)에 오름차순 정렬이 된다. 보통 최소 힙 자료 구조의 최상단 원소는 항상 가장 작은 원소이기 때문이다.</p>
</li>
<li><p>heapq.heappush(): 원소를 삽입할 때 사용</p>
</li>
<li><p>heapq.heappop(): 원소를 꺼낼 때 사용</p>
</li>
<li><p>ex. 최소 힙</p>
<pre><code>import heapq

def heapsort(iterable):
    h = []
    result = []

    # 모든 원소를 차례대로 힙에 삽입
    for value in iterable:
        heapq.heappush(h, vlaue)

    # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for i in range(len(h)):
        result.append(heapq.heappush(h))
    return result

result = heapsort([1, 3, 2, 4])
print(result) # 출력: [1, 2, 3, 4]</code></pre><br>

<ul>
<li><p>ex. 최대 힙</p>
<pre><code>import heapq

def heapsort(iterable):
   h = []
   result = []

   # 모든 원소를 차례대로 힙에 삽입
   for value in iterable:
       heapq.heappush(h, -vlaue)

   # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
   for i in range(len(h)):
      result.append(-heapq.heappush(h))    
   return result

result = heapsort([1, 3, 2, 4])
print(result) # 출력: [4, 3, 2, 1]</code></pre></li>
</ul>
<br>

</li>
</ul>
<h3 id="bisect">bisect</h3>
<p>파이썬에서는 이진 탐색을 쉽게 구현할 수 있도록 bisect 라이브러리를 제공한다. </p>
<ul>
<li><p>&#39;정렬된 배열&#39;에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용된다.</p>
</li>
<li><p>bisect_left(), bisect_right() 함수가 중요하며 시간 복잡도 O(logN)에 동작한다. 특히 정렬된 리스트에서 특정 범위에 속하는 값의 원소들의 개수를 구할 때 효과적으로 사용될 수 있다.</p>
</li>
<li><p>bisect_left(a, x): 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는다.</p>
</li>
<li><p>bisec_right(a, x): 정렬된 순서를 유지하도록 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는다. </p>
</li>
<li><p>ex. 정렬된 리스트에서 특정 값을 삽입할 위치의 인덱스 구하기  </p>
<pre><code>from bisec import bisec_left, bisec_right

a = [1, 2, 4, 4, 8]
x = 4

print(bisec_left(a, x)) # 출력: 2
print(bisec_right(b, x)) # 출력: 4</code></pre></li>
<li><p>ex. 정렬된 리스트에서 특정 범위에 속하는 값의 원소들의 개수를 구하기</p>
<pre><code>from bisec import bisec_left, bisec_right

# 값이 [left_value, right_value] -&gt; left_value&lt;= x &lt;= right_value인 데이터의 개수를 반환하는 함수
def count_by_range(a, left_value, rigtht_value):
    right_index = bisect_right(a, right_value)
    left_index = bisect_left(a, left_value)
    return right_index - left_index

a = [1, 2, 3, 3, 3, 3, 4, 4, 8, 9]

# 값이 4인 데이터 개수 출력
print(count_by_range(a, 4, 4))

# 값이 [-1, 3] 범위에 있는 데이터 개수 출력
print(count_by_range(a, -1, 3))

# 출력: 
2
6</code></pre><br>

</li>
</ul>
<h3 id="collections">Collections</h3>
<p>유용한 자료 구조를 제공하는 표준 라이브러리이다.</p>
<ul>
<li><p>특히, deque와 Counter 클래스가 코딩 테스트에서 유용하게 사용된다.</p>
</li>
<li><p>deque</p>
<ul>
<li><p>deque를 이용하여 큐 자료구조를 구현한다. 앞쪽에 있는 원소를 처리할 때는 리스트 자료형의 메서드보다 시간 복잡도가 O(1)로 우수하다.</p>
</li>
<li><p>deque에서는 리스트 자료형과 다르게 인덱싱, 슬라이싱 등의 기능은 사용할 수 없지만 연속적으로 나열된 데이터의 시작 부분이나 끝 부분에 데이터를 삽입하거나 삭제할 때는 매우 효과적이다.</p>
<ul>
<li><p>popleft() : 첫번째 원소 제거</p>
</li>
<li><p>pop(): 마지막 원소 제거</p>
</li>
<li><p>appendleft(x): 첫번째 인덱스에 원소 x 삽입</p>
</li>
<li><p>append(x): 마지막 인덱스에 원소를 삽입</p>
</li>
</ul>
<br>
</li>
<li><p>따라서 deque를 큐 자료구조로 이용할 때, 원소를 삽입할 때에는 append()를 사용하고 원소를 삭제할 때에는 popleft()를 사용하면되고, 먼저 들어온 원소가 항상 먼저 나가게 된다.</p>
</li>
<li><p>ex. </p>
<pre><code>from collections import Counter

data = deque([2, 3, 4])
data.appendleft(1)
data.apend(5)

print(data)
print(list(data)) # 리스트 자료형으로 변환
# 출력
deque([1, 2, 3, 4, 5])
[1, 2, 3, 4, 5]</code></pre></li>
</ul>
<br>
</li>
<li><p>Counter</p>
<ul>
<li><p>등장 횟수를 세는 기능을 제공한다.</p>
</li>
<li><p>리스트와 같은 iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 개씩 존재하는 지 알 수 있다.</p>
</li>
<li><p>ex.</p>
<pre><code>from collections import Counter

counter = Counter([&#39;a&#39;, &#39;b&#39;, &#39;a&#39;, &#39;c&#39;, &#39;b&#39;, &#39;b&#39;])

print(counter[&#39;b&#39;]) # b의 개수 출력
print(counter[&#39;c&#39;]) # c의 개수 출력
print(dict(counter)) # 사전 자료형으로 변환

# 출력
3
1
{&#39;a&#39;: 2, &#39;b&#39;: 3, &#39;c&#39;: 1}</code></pre><br>

</li>
</ul>
</li>
</ul>
<h3 id="math">math</h3>
<p>수학적인 기능을 포함하고 있는 라이브러리이다. 팩토리얼, 제곱근, 최대 공약수(GCD) 등을 계산해주는 기능을 포함한다.</p>
<ul>
<li><p>factorial(x): x! 반환 </p>
<pre><code>import math

print(math.factorial(5)) # 출력: 120
</code></pre><br>
</li>
<li><p>sqrt(x): x의 제곱근 반환</p>
<pre><code>import math

print(math.sqrt(7)) # 출력: 2.6457513110645907</code></pre><br>
</li>
<li><p>gcd(a, b): a와 b의 최대 공약수 반환</p>
<pre><code>import math

print(math.gcd(21, 14)) # 출력: 7</code></pre><br>
</li>
<li><p>파이(pi), 자연상수(e)</p>
<pre><code>import math

 print(math.pi) 
 print(math.e)

 # 출력 
 3.141592653589793
 2.718281828459045</code></pre></li>
</ul>
<br>
<br>
<br>
 해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.<br>
나동빈, ⌜이것이 취업을 위한 코딩 테스트다 with 파이썬⌟, 한빛미디어, 2020, 604쪽]]></description>
        </item>
        <item>
            <title><![CDATA[Amazon EKS 추가 내용]]></title>
            <link>https://velog.io/@summer_today/Amazon-EKS-%EC%B6%94%EA%B0%80-%EB%82%B4%EC%9A%A9</link>
            <guid>https://velog.io/@summer_today/Amazon-EKS-%EC%B6%94%EA%B0%80-%EB%82%B4%EC%9A%A9</guid>
            <pubDate>Sat, 17 Aug 2024 05:42:12 GMT</pubDate>
            <description><![CDATA[<h2 id="amazon-eks">Amazon EKS</h2>
<p>kubernetes 컨트롤 플레인 또는 노드를 제공하는 AWS의 관리형 Kubernetes 서비스</p>
<ul>
<li><p>다수의 AWS 가용 영역에 Kubernetes Control Plane 실행 -&gt; Control Plane의 컴포넌트인 API 서버, 스케쥴러, Controller Management, etcd가 가용영역 별로 구성된다는 의미이다.</p>
</li>
<li><p>다양한 AWS 서비스와 통합하여 확장성과 보안성 제공</p>
<ul>
<li><p>컨테이너 이미지 저장소 -&gt; Amazon ECR</p>
</li>
<li><p>부하 분산 -&gt; Amazon ELB</p>
</li>
<li><p>보안 주체 및 액세스 사용 -&gt; IAM</p>
</li>
<li><p>노드 격리 -&gt; Amazon VPC</p>
</li>
</ul>
</li>
<li><p>Kubernetes 최신 버전을 사용하여 Amazon EKS로 손쉬운 마이그레이션이 가능 - X(Major).YY(Minor).Z(Petch)</p>
</li>
</ul>
<br>

<h2 id="amazon-eks-cluster-배포">Amazon EKS Cluster 배포</h2>
<ul>
<li><p>관리 콘솔
AWS 관리 콘솔에 접근하여 EKS 클러스터 생성. 인터페이스 가시성은 좋지만, 설정을 위해 일일히 작업을 해줘야하는 불편함이 있다.</p>
</li>
<li><p>eksctl
EKS 클러스터를 생성하고 관리하는 명령어 기반의 CLI 도구이다. eksctl 명령어를 입력하면 EKS 클러스터를 생성하거나 삭제하고 관리할 수 있다.</p>
</li>
<li><p>IaC(Inprastructure as Code) - ex. AWS CDK, AWS CloudFormation, Terraform
코드 기반으로 인프라를 정의해 EKS 클러스터 생성.</p>
</li>
</ul>
<br>

<h2 id="amazon-eks-control-plane-아키텍처">Amazon EKS Control Plane 아키텍처</h2>
<p>Kubernetes를 제어하기 위한 컨트롤 플레인 컴포넌트(API 서버, 컨트롤러, 스케줄러, ETCD)가 AWS 관리형으로 동작한다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/b04dc619-6a31-4e2b-a769-6d6527481154/image.png" alt="">출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟  </p>
</blockquote>
<ul>
<li>etcd는 데이터 저장소 개념의 컴포넌트로 다른 컴포넌트와 특성이 달라 별도의 인스턴스로 분리하여 구성한다.<blockquote>
<p>etcd는 클러스터의 중앙 데이터 저장소 역할을 한다. Kubernetes의 모든 상태 정보, 구성 정보, 클러스터의 메타데이터가 etcd에 저장된다. 이는 Kubernetes의 핵심 구성 요소 중 하나로, 클러스터의 상태와 구성 정보를 일관되게 관리하고 저장하는 역할을 담당한다.</p>
</blockquote>
</li>
</ul>
<ul>
<li><p>Auto Scailing Group을 통해 지정된 수량의 자원을 유지·확장·축소할 수 있어 서비스 연속성을 지닌다.</p>
</li>
<li><p>가용 영역별로 자원이 다수로 구성됨에 따라 ELB를 배치해 트래픽을 분산한다. -&gt; 효율적 통신과 고가용성 보장</p>
</li>
</ul>
<br>

<h2 id="amazon-eks-data-plane-아키텍처">Amazon EKS Data Plane 아키텍처</h2>
<p>Kubernetes 클러스터의 노드를 구성하기 위해 Data Plane 컴포넌트(컨테이너 런타임, Kubelet, kube-proxy)가 동작한다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/43135676-f2af-4984-bca6-6c56def82a1c/image.png" alt="">출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟  </p>
</blockquote>
<ul>
<li>EKS owned ENI
ENI(Elastic Network Interface)는 EC2 인스턴스를 네트워크에 연결하는 가상 네트워크 인터페이스이다. EC2 인스턴스는 ENI를 통해 VPC 내 서브넷과 연결되고, IP 주소와 보안 그룹이 할당된다.<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/0deb076b-3c03-4844-b6c9-c7bd901d335b/image.png" alt="">좌: x, 우: o 
출처: <a href="https://jibinary.tistory.com/133">https://jibinary.tistory.com/133</a></p>
</blockquote>
</li>
</ul>
<pre><code> - ENI는 EC2의 일종의 가상의 랜카드(LAN Card)로, 하나 이상의 IP 주소, 보안 그룹, MAC 주소를 가질 수 있다.

 - ENI에 할당된 IP 주소로 EC2 인스턴스에 접근하며, 이를 통해 네트워크 트래픽을 처리한다.

 &lt;br&gt;</code></pre><ul>
<li><p>Control Plane과는 다르게 사용자 VPC에서 생성된다. -&gt; 사용자가 직접 운용 및 관리 가능</p>
</li>
<li><p>Control Plane에서 Data Plane을 제어하기 때문에 관리용 VPC도 아키텍처에 같이 표현되어 있다. 이 중 Data Plane과 연계되는 API 서버만 표현됐다.</p>
</li>
<li><p>위 아키텍처는 노드 구성 방식이 관리형 노드 그룹 방식임을 가정한다.</p>
</li>
<li><p>Control Plane 영역과 Data Plane 영역은 EKS owned ENI라는 네트워크 인터페이스로 연결되어 있고, 이를 활용하여 통신한다.</p>
<br>

</li>
</ul>
<h2 id="amazon-eks-data-plane---노드">Amazon EKS Data Plane - 노드</h2>
<p>Amazon EKS 클러스터에 데이터 플레인 노드를 구성하는 방식은 3가지로 분류된다.</p>
<ul>
<li><p>관리형 노드 그룹(Managed Node Groups)
Managed Node Groups는 AWS에서 관리하는 방식이다. 해당 방식은 AWS가 노드의 수명 주기를 관리하며, 사용자는 노드를 손쉽게 추가하거나 제거할 수 있다.</p>
<ul>
<li><p>EKS에 최적화된 AMI를 사용한다.</p>
</li>
<li><p>사용자는 노드 그룹에 사용할 다양한 EC2 인스턴스 유형을 선택할 수 있다.</p>
</li>
<li><p>유지 관리 및 버전 관리를 AWS에서 지원한다. </p>
</li>
<li><p>노드 그룹에 대해 자동 확장을 설정할 수 있다.</p>
</li>
</ul>
<br>
</li>
<li><p>자체 관리형 노드(Self-Managed Node Groups)
Self-Managed Node Groups는 사용자가 직접 관리하는 방식dl다. 해당 방식은 더 큰 유연성을 제공하지만, 사용자에게 더 많은 관리 책임이 존재한다.</p>
<ul>
<li><p>사용자 정의 AMI를 사용한다.</p>
</li>
<li><p>특정 요구 사항에 맞게 노드 구성 및 네트워킹 설정을 완전히 제어할 수 있다. </p>
</li>
<li><p>유지 관리 및 버전 관리를 직접 수행한다.</p>
</li>
<li><p>사용자가 직접 EC2 인스턴스를 관리하므로 비용 최적화에 더 많은 유연성이 있다.</p>
</li>
</ul>
<br>
</li>
<li><p>AWS Fargate
서버리스 방식으로, EC2 인스턴스를 사용하지 않고도 컨테이너를 실행할 수 있는 방식이다. 인프라 관리를 전혀 할 필요가 없으며, Fargate가 필요한 리소스를 자동으로 할당하고 관리한다.</p>
<ul>
<li><p>사용자가 직접 관리 없이 서버리스 환경에서 동작한다.</p>
</li>
<li><p>AWS Fargate 환경에서 제공하는 Micro VM 형태로 할당하여 관리한다. -&gt; Firecracker라는 서버리스 컴퓨팅을 위한 오픈 소스 경량 가상화 기술을 통해 가상머신의 단점을 보완한다. </p>
</li>
<li><p>Control Plane 뿐만 아니라 워커 노드도 AWS 관리형으로 동작한다.</p>
</li>
</ul>
<br>

</li>
</ul>
<h2 id="amazon-eks-cluster-endpoint-access---public">Amazon EKS Cluster Endpoint Access - Public</h2>
<p>쿠버네티스 클러스터의 API Server로 접근을 위해 퍼블릭 엔드포인트(EKS 클러스터의 Control Plane에 접근할 수 있는 API 서버의 URL)를 정의할 수 있다. 하지만 EKS 클러스터 엔드포인트를 퍼블릭으로 구성하면 자유로운 접근이 가능하지만 보안적인 측면과 효율성 측면에서 떨어지는 통신이 된다. 일반적인 비즈니스 환경에서는 권장되지 않는 방식이다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/d146f4e2-e53a-4f2e-a860-e04e31818810/image.png" alt="">출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟  </p>
</blockquote>
<ul>
<li><p>엔드포인트의 도메인 주소는 NLB Public IP로 매핑한다.</p>
</li>
<li><p>API 서버 -&gt; kubelet
EKS owned ENI를 통해 워커 노드의 kubelet으로 전달한다. </p>
</li>
<li><p>kubelet -&gt; API 서버
엔드포인트가 퍼블릭 IP 주소이므로 인터넷 게이트웨이로 빠져나가 인터넷 구간을 통해 관리형 VPC로 진입하고 API 서버로 전달한다.
해당 방식의 통신은 외부 인터넷 구간으로 트래픽이 노출되어 보안적인 측면으로도 좋지 않고, 비효율적인 통신이다.</p>
</li>
<li><p>사용자 kubectl -&gt; API 서버
외부 인터넷 구간에서 관리형 VPC로 진입하고 API 서버가 전달받는다. 퍼블릭 환경이므로 사용자는 외부 구간에서 인터넷을 통해 자유롭게 접근이 가능하지만 사용자가 아닌 사람도 접근할 수 있는 여지가 존재한다.</p>
</li>
</ul>
<br>

<h2 id="amazon-eks-cluster-endpoint-access---public--private">Amazon EKS Cluster Endpoint Access - Public + Private</h2>
<p>비즈니스 환경에 따라 EKS 클러스터 엔드포인트 방식을 퍼블릭과 프라이빗을 혼용해서 사용할 수 있다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/cfff429f-776f-41b2-b192-2963141aad8f/image.png" alt="">출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟  </p>
</blockquote>
<ul>
<li><p>엔드포인트의 도메인 주소는 NLB Public IP로 매핑한다.</p>
</li>
<li><p>워커 노드를 위한 주소는 별도의 프라이빗 호스팅 존을 구성해 대상을 EKS owned ENI로 매핑한다.</p>
</li>
<li><p>API 서버 -&gt; kubelet
엔드포인트와 별개로 EKS owned ENI를 통해 통신이 된다.</p>
</li>
<li><p>kubelet -&gt; API 서버
AWS 내부 프라이빗 호스팅 존에게 DNS 질의한 후 대상을 EKS owned ENI로 전달하고 이를 통해 API 서버가 전달받는다.
외부 인터넷 구간의 노출 없이 보안성이 있는 통신이 가능하다.</p>
</li>
</ul>
<ul>
<li>사용자 kubectl -&gt; API 서버
도메인 주소에 매핑된 퍼블릭 IP로 API 서버가 전달받는다. 사용자의 트래픽이 노출될 여지가 있고 퍼블릭 IP 주소를 알아낸다면 누구든 접근할 수 있어 보안성이 낮지만, 접근성이 좋다는 장점도 존재한다.</li>
</ul>
<br>

<h2 id="amazon-eks-cluster-endpoint-access---private">Amazon EKS Cluster Endpoint Access - Private</h2>
<p>외부 인터넷 구간의 노출 없이 AWS 내부로 동작하여 보안성 있는 통신과 효율적인 통신이 가능하다. 일반적인 비즈니스 환경에 적합하다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/5f62462b-972a-4caa-8184-3ea8f0d24f00/image.png" alt="">출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟  </p>
</blockquote>
<ul>
<li><p>엔드포인트 도메인 주소는 AWS 내부의 프라이빗 호스트존에서만 관리한다.</p>
</li>
<li><p>프라이빗 호스팅 존(Private Hosted Zone)을 사용하여 EKS API 서버 엔드포인트를 EKS owned ENI와 매핑하는 것은 주로 Amazon Route 53에서 이루어진다.</p>
</li>
<li><p>사용자는 Custom VPC 내에 있는 EC2 인스턴스에 접속 후 kubectl 명령을 하던가, VPC 피어링 또는 Direct Connect를 통한 접근 같이 Custom VPC 위치에서 명령을 수행해야 한다.</p>
</li>
<li><p>API 서버 -&gt; kubelet
API 서버는 EKS owned ENI를 통해 kublet으로 통신한다.</p>
</li>
<li><p>kubelet -&gt; API 서버
kublet은 프라이빗 호스팅 존에 의해 EKS owned ENI를 통해 API 서버로 통신한다.</p>
</li>
<li><p>사용자 kubectl -&gt; API 서버
프라이빗 호스팅 존에 의해 EKS owned ENI를 통해 API 서버로 통신한다.</p>
</li>
</ul>
<br>
<br>
<br>
해당 글은 다음 강의의 내용을 참고한 글임을 밝힙니다. 자세한 내용은 다음 강의에서 확인해볼 수 있습니다. <br>
인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟  ]]></description>
        </item>
        <item>
            <title><![CDATA[2.2 EKS 클러스터 구축]]></title>
            <link>https://velog.io/@summer_today/2.2-EKS-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EA%B5%AC%EC%B6%95</link>
            <guid>https://velog.io/@summer_today/2.2-EKS-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EA%B5%AC%EC%B6%95</guid>
            <pubDate>Fri, 16 Aug 2024 13:24:41 GMT</pubDate>
            <description><![CDATA[<h2 id="기본-리소스-구축">기본 리소스 구축</h2>
<h3 id="실습-환경-설치">실습 환경 설치</h3>
<ul>
<li><p>AWS CLI 설치</p>
<ul>
<li><p><a href="https://aws.amazon.com/ko/cli%EC%97%90">https://aws.amazon.com/ko/cli에</a> 접속하여 AWSCLI64.msi를 다운로드 한다. </p>
</li>
<li><p>모두 기본 설정으로 다운하고 CMD를 열어 aws --version을 입력해 정상 설치되었는지 확인한다.</p>
</li>
</ul>
<br>
</li>
<li><p>Git for Windows 설치</p>
<ul>
<li><p><a href="https://gitforwindows.org%EC%97%90">https://gitforwindows.org에</a> 접속하여 다운로드 한다.</p>
</li>
<li><p>Configuring the line ending conversions 설정은 기본 값인 checkout as-is, commit as-is로 변경한다. 기본 설정으로 할 시 리포지토리에서 파일을 가져올 때 개행 코드가 변환되어 로컬 환경에서 오류가 발생할 수 있기 때문이다.</p>
</li>
<li><p>CMD에서 git --version을 입력해 정상 설치되었는지 확인한다.</p>
</li>
</ul>
<br>
</li>
<li><p>eksctl, kubectl 설치</p>
<ul>
<li><p>eksctl 설치 링크: <a href="https://github.com/eksctl-io/eksctl/releases">https://github.com/eksctl-io/eksctl/releases</a></p>
</li>
<li><p>kubectl 설치 링크: <a href="https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html">https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html</a></p>
<ul>
<li>명령 내부의 URL을 통해 다운로드 받아도 된다.</li>
</ul>
</li>
</ul>
<br>
</li>
<li><p>명령줄 도구 저장 폴더의 PATH 환경변수 설정  </p>
<ul>
<li><p>이름 PATH, 값 %USERPROFILE%\k8sbook\bin으로 환경변수를 새로 생성한다.</p>
</li>
<li><p>Git Bash에서 eksctl version, kubectl version --client 명령어를 통해 동작을 확인한다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/f0960865-c6ee-44ed-a1a5-388c8611281e/image.png" alt=""></p>
</blockquote>
<br>
</li>
</ul>
</li>
<li><p>Amazon Corretto 설치</p>
<ul>
<li><p><a href="https://aws.amazon.com/ko/coretto%EC%97%90%EC%84%9C">https://aws.amazon.com/ko/coretto에서</a> 다운받는다. 이 책에서는 coretto 11을 사용한다.</p>
</li>
<li><p>javac -version, java --version 명령어를 통해 동작을 확인한다.</p>
</li>
</ul>
<br>
</li>
<li><p>JAVA_HOME 환경 변수 설정  </p>
<ul>
<li>변수 이름은 JAVA_HOME, 변수 값은 c:\program Files\Amazon Corretto\JDK 버전(JDK 버전 값은 파일 탐색기 등에서 확인한다.)</li>
</ul>
<br>
</li>
<li><p>Docker Desktop 설치  </p>
<ul>
<li><p><a href="https://docs.docker.com/desktop/install/windows-install/">https://docs.docker.com/desktop/install/windows-install/</a> 링크를 통해 다운로드한다.</p>
</li>
<li><p>CMD를 열어 docker --version 명령어를 통해 확인한다.</p>
</li>
<li><p>도커 허브 계정에 가입 및 로그인을 한다.</p>
</li>
</ul>
<br>
</li>
<li><p>Node.js 설치</p>
<ul>
<li><p><a href="https://nodejs.org/en">https://nodejs.org/en</a> 링크를 통해 다운로드한다. 책에서는 LTS 버전을 사용한다.</p>
</li>
<li><p>Git Bash에서 node --version 명령어를 통해 정상 동작을 확인한다.</p>
</li>
</ul>
<br>

</li>
</ul>
<h2 id="기본-리소스-생성">기본 리소스 생성</h2>
<h3 id="cloudformation">CloudFormation</h3>
<p>인프라를 코드(IaC, Infrastructure as Code)로 관리할 수 있게 해주는 AWS의 도구이다. 이를 통해 사용자는 EC2 인스턴스, S3 버킷, RDS 데이터베이스 등의 AWS 리소스를 코드로 정의하고, 자동으로 프로비저닝, 관리 및 업데이트할 수 있다. 다음과 같은 주요 기능이 존재한다.</p>
<ul>
<li><p>인프라 자동화
CloudFormation을 사용하면 복잡한 인프라 설정을 코드로 작성하여 자동으로 배포할 수 있다. 이를 통해 인프라 설정의 일관성을 유지하고, 수동 설정에서 발생할 수 있는 오류를 줄일 수 있다.</p>
</li>
<li><p>템플릿 기반 설정
JSON 또는 YAML 형식의 템플릿 파일을 사용해 인프라를 정의합니다. 이 템플릿에는 필요한 모든 AWS 리소스 및 해당 리소스 간의 관계가 포함된다.</p>
</li>
<li><p>버전 관리 및 변경 관리
템플릿은 코드로 관리되므로 Git 등의 버전 관리 시스템을 사용해 버전 관리가 가능하며, 변경 사항을 추적할 수 있다. 이를 통해 인프라 변경을 더 쉽게 관리하고 롤백할 수 있다.</p>
</li>
<li><p>스택(Stack) 관리
CloudFormation에서는 템플릿을 사용해 &#39;스택&#39;이라는 단위로 리소스를 배포한다. 스택은 리소스의 집합을 나타내며, 스택 단위로 리소스를 생성, 업데이트 또는 삭제할 수 있다.</p>
</li>
<li><p>반복 가능성과 확장성
동일한 템플릿을 사용해 여러 환경(예: 개발, 테스트, 프로덕션)에 일관된 인프라를 구축할 수 있다. 이는 확장 가능한 인프라를 쉽게 배포하는 데 유용하다.</p>
</li>
<li><p>드리프트 감지
CloudFormation은 드리프트 감지 기능을 제공하여 실제 배포된 리소스가 템플릿과 일치하는지 확인할 수 있다. 이 기능을 통해 예상치 못한 인프라 변경을 감지하고 관리할 수 있다.</p>
</li>
</ul>
<blockquote>
<ul>
<li>CloudFormation 주요 사용 사례</li>
</ul>
</blockquote>
<ul>
<li><p>멀티 계정 환경에서의 인프라 배포</p>
</li>
<li><p>CI/CD 파이프라인과의 통합을 통한 자동화된 인프라 관리</p>
</li>
<li><p>재해 복구를 위한 인프라 복제 및 관리</p>
</li>
<li><p>다양한 AWS 서비스 간의 복잡한 의존성 관리</p>
<br>

</li>
</ul>
<h3 id="cloudformation-생성">CloudFormation 생성</h3>
<ul>
<li>템플릿 파일<pre><code>AWSTemplateFormatVersion: &#39;2024-08-09&#39;
</code></pre></li>
</ul>
<p>Parameters:
  ClusterBaseName:
    Type: String
    Default: eks-work</p>
<p>  TargetRegion:
    Type: String
    Default: ap-northeast-2</p>
<p>  AvailabilityZone1:
    Type: String
    Default: ap-northeast-2a</p>
<p>  AvailabilityZone2:
    Type: String
    Default: ap-northeast-2b</p>
<p>  AvailabilityZone3:
    Type: String
    Default: ap-northeast-2c</p>
<p>  VpcBlock:
    Type: String
    Default: 192.168.0.0/16</p>
<p>  WorkerSubnet1Block:
    Type: String
    Default: 192.168.0.0/24</p>
<p>  WorkerSubnet2Block:
    Type: String
    Default: 192.168.1.0/24</p>
<p>  WorkerSubnet3Block:
    Type: String
    Default: 192.168.2.0/24</p>
<p>Resources:
  EksWorkVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcBlock
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Sub ${ClusterBaseName}-VPC</p>
<p>  WorkerSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Ref AvailabilityZone1
      CidrBlock: !Ref WorkerSubnet1Block
      VpcId: !Ref EksWorkVPC
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub ${ClusterBaseName}-WorkerSubnet1</p>
<p>  WorkerSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Ref AvailabilityZone2
      CidrBlock: !Ref WorkerSubnet2Block
      VpcId: !Ref EksWorkVPC
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub ${ClusterBaseName}-WorkerSubnet2</p>
<p>  WorkerSubnet3:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Ref AvailabilityZone3
      CidrBlock: !Ref WorkerSubnet3Block
      VpcId: !Ref EksWorkVPC
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub ${ClusterBaseName}-WorkerSubnet3</p>
<p>  InternetGateway:
    Type: AWS::EC2::InternetGateway</p>
<p>  VPCGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref EksWorkVPC</p>
<p>  WorkerSubnetRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref EksWorkVPC
      Tags:
        - Key: Name
          Value: !Sub ${ClusterBaseName}-WorkerSubnetRouteTable</p>
<p>  WorkerSubnetRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref WorkerSubnetRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway</p>
<p>  WorkerSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref WorkerSubnet1
      RouteTableId: !Ref WorkerSubnetRouteTable</p>
<p>  WorkerSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref WorkerSubnet2
      RouteTableId: !Ref WorkerSubnetRouteTable</p>
<p>  WorkerSubnet3RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref WorkerSubnet3
      RouteTableId: !Ref WorkerSubnetRouteTable</p>
<p>Outputs:
  VPC:
    Value: !Ref EksWorkVPC</p>
<p>  WorkerSubnets:
    Value: !Join
      - &quot;,&quot;
      - [!Ref WorkerSubnet1, !Ref WorkerSubnet2, !Ref WorkerSubnet3]</p>
<p>  RouteTable:
    Value: !Ref WorkerSubnetRouteTable</p>
<pre><code>
- 기본 구조 

  - AWSTemplateFormatVersion
  템플릿 버전을 명시한다. 선택 사항이며, 현재 사용되는 버전은 &#39;2024-08-09&#39;이다.

  - Description
  템플릿에 대한 설명을 작성할 수 있다. (선택)

  - Parameters
  템플릿에서 동적으로 값을 입력받을 수 있는 파라미터를 정의한다. 예를 들어, VPC의 CIDR 블록이나 EC2 인스턴스의 타입을 사용자가 템플릿 실행 시 지정할 수 있다.

  - Mappings
  지역(Region)별 값이나 다른 하드코딩된 값을 정의한다. 예를 들어, 각 리전에서 사용할 AMI ID 등을 설정할 수 있습다.

  - Conditions
  리소스의 생성 여부를 조건에 따라 제어할 수 있다. 예를 들어, 특정 환경에서만 리소스를 생성하도록 조건을 설정할 수 있다.

  - Resources
  실제로 생성할 AWS 리소스들을 정의한다. 이 섹션은 CloudFormation 템플릿의 핵심 부분으로, VPC, 서브넷, EC2 인스턴스, S3 버킷 등 다양한 AWS 서비스 리소스를 정의한다.

  - Outputs
  템플릿이 생성한 리소스의 정보를 출력한다. 예를 들어, 생성된 VPC의 ID나 EC2 인스턴스의 퍼블릭 IP를 출력할 수 있다.

  - Metadata
  템플릿에 대한 추가 정보를 제공하는 섹션이다. AWS CLI와 같은 도구에서 유용하게 사용될 수 있다.

  &lt;br&gt;

- 스택 생성

&gt; ![](https://velog.velcdn.com/images/summer_today/post/1674b6d8-70ca-479e-8678-afa769bd4871/image.png)

&gt; ![](https://velog.velcdn.com/images/summer_today/post/61c765bb-49bb-4e43-89eb-ba8deb1ba139/image.png)

  - 템플릿 URL은 동적으로 생성되어 파일 이름 외에 URL 끝부분이 매번 변경된다.

  - 나머지 설정은 기본 설정으로 진행하여 스택을 생성한다.
  &gt; ![](https://velog.velcdn.com/images/summer_today/post/a1b8b106-414a-4456-ac76-23fd9319f08b/image.png)

&lt;br&gt;

### 생성 리소스 확인

- VPC 서비스에 들어가 &#39;eks-work-VPC&#39;라는 VPC가 생성이 잘 되었는지 확인한다.
&gt; ![](https://velog.velcdn.com/images/summer_today/post/614e566e-dbe3-40f7-b53a-065f89e3cd1c/image.png)

&lt;br&gt;

## EKS 클러스터 구축

### 기본 리소스 정보 
- CloudFormation 페이지에서 &#39;eks-work-base&#39; 스택을 클릭하고 출력 탭을 선택한다.
&gt; ![](https://velog.velcdn.com/images/summer_today/post/81672508-818c-42e5-8688-2684a7fa5c0c/image.png)

  - WorkerSubnets(워커 노드용 서브넷) 값을 복사한다.

  &lt;br&gt;

### AWS CLI 설정
- Git Bash를 열고, 다음 명령어를 사용하여 AWS CLI를 설정한다.</code></pre><p>  aws configure</p>
<h1 id="위-명령어-후-다음과-같이-설정">위 명령어 후 다음과 같이 설정</h1>
<p>  AWS Access Key ID [None]: YOUR_ACCESS_KEY_ID
AWS Secret Access Key [None]: YOUR_SECRET_ACCESS_KEY
Default region name [None]: YOUR_DEFAULT_REGION
Default output format [None]: json</p>
<pre><code>
 &lt;br&gt;

### eksctl 실행
eksctl 명령어는 옵션으로 파라미터를 설정할 경우 다양한 구성의 EKS 클러스터를 구축할 수 있다.

- 다음 명령어들을 통해 EKS 클러스터를 구축한다.</code></pre><p> $ eksctl create cluster \  # 아래의 인수를 설정하여 eksctl 실행</p>
<blockquote>
<p>--vpc-public-subnets &lt;WorkerSubnets 값&gt; \  # 워커 노드용 서브넷
--name eks-work-cluster \  # 클러스터 이름
--region ap-northeast-2 \  # 리전 (서울 리전을 설정)
--version 1.24 \  # EKS 클러스터 버전 
--nodegroup-name eks-work-nodegroup \  # 노드 그룹 이름
--node-type t2.small \  # 워커 노드 인스턴스 타입
--nodes 2 \  # 워커 노드 수
--nodes-min 2 \  # 워커 노드의 최소 노드 수
--nodes-max 5 \  # 워커 노드의 최대 노드 수</p>
</blockquote>
<p> ```</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/73627f3a-288d-4ca9-a620-4efbc0715d20/image.png" alt=""></p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/8249fd2e-eb3a-4915-a1b8-fc52785eb02f/image.png" alt=""></p>
</blockquote>
<ul>
<li>eksctl에서는 CloudFormation 스택 2개(EKS 클러스터 구축, 워커 노드 구축)를 생성하여 EKS 환경을 구축한다.</li>
</ul>
  <br>


<h3 id="kubeconfig-설정">Kubeconfig 설정</h3>
<ul>
<li><p>eksctl은 EKS 클러스터 구축 중에 kubeconfig 파일을 자동으로 업데이트한다.</p>
</li>
<li><p>kubeconfig 파일은 Kubernetes 클라이언트 도구(kubectl 등)가 Kubernetes 클러스터와 상호작용할 수 있도록 필요한 설정을 제공하는 구성 파일이다.</p>
</li>
<li><p>쿠버네티스 클러스터의 접속 정보(컨트롤 플레인 URL, 인증 정보, 이용할 쿠버네티스 네임스페이스 등)를 저장하고 있다.</p>
</li>
<li><p>EKS 클러스터에 접근하려면 인증정보가 필요하다.</p>
<ul>
<li><p>IAM 자격 증명: AWS 계정의 사용자 또는 역할로, EKS 클러스터 접근을 위한 기본적인 인증 수단.</p>
</li>
<li><p>Kubeconfig 파일: 클러스터 연결 설정과 인증 정보를 포함하는 파일. kubectl이 이 파일을 통해 클러스터와 상호작용.</p>
</li>
<li><p>API 서버 엔드포인트와 인증 토큰: 클러스터 API와의 통신을 위한 엔드포인트 및 인증 토큰. 클러스터에 접근할 때마다 필요.</p>
</li>
</ul>
</li>
</ul>
<br>
<br>
<br>
해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.<br>
아이자와 고지 외 1명, ⌜클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트⌟, 동양북스, 2021, 370쪽  ]]></description>
        </item>
        <item>
            <title><![CDATA[Python 문법 정리 - 입출력]]></title>
            <link>https://velog.io/@summer_today/Python-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC-%EC%9E%85%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@summer_today/Python-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC-%EC%9E%85%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Mon, 12 Aug 2024 02:59:39 GMT</pubDate>
            <description><![CDATA[<h2 id="입력">입력</h2>
<ul>
<li><p>input을 이용하여 한 줄의 문자열을 입력받는다.</p>
</li>
<li><p>int() 함수를 이용하여 입력받은 데이터를 정수형 데이터로 처리할 수 있다.</p>
</li>
<li><p>공백으로 구분된 여러 개의 데이터를 입력받을 때는 list(map(int, input().split()))을 이용한다.</p>
<ul>
<li><p>input()으로 입력받은 문자열을 split()을 이용해 공백으로 나눈 리스트로 바꾼다.</p>
</li>
<li><p>map을 이용하여 해당 리스트의 모든 원소에 int() 함수를 적용한다.</p>
</li>
<li><p>최종적으로 결과를 list()로 바꿔 입력 받은 문자열을 공백으로 구분하여 각각 숫자형으로 저장되게 한다.</p>
</li>
</ul>
</li>
<li><p>줄바꿈을 해서 정수로 입력을 받는 경우에는 int(input())과 같은 형태로 사용하면된다.</p>
</li>
</ul>
<br>

<h3 id="입력-예시-소스코드">입력 예시 소스코드</h3>
<pre><code># 데이터 개수 입력 -&gt; 5

n = int(input())  

# 각 데이터를 공백으로 구분하여 입력한다. -&gt; 1 3 4 2 5
data = list(map(int input().split())) 

data.sort(reverse = True)
print(data) 

# 출력: [5, 4, 3, 2, 1]</code></pre><br>

<h3 id="공백을-기준으로-구분하여-적은-수의-데이터-입력">공백을 기준으로 구분하여 적은 수의 데이터 입력</h3>
<pre><code># n, m, k를 공백으로 구분하여 입력 -&gt; 3, 5, 7 
n, m, k = map(int, input().split()) 

print(n, m, k) # 출력: 3, 5, 7</code></pre><br>

<h3 id="입력을-빠르게-받는-방법">입력을 빠르게 받는 방법</h3>
<ul>
<li><p>입력의 개수가 많은 경우에는 input() 함수를 사용하면 시간 초과로 오답 판정이 날 수 있다.</p>
</li>
<li><p>많은 입력을 받아야 하는 경우에는 sys.stdin.readline().rstrip() 함수를 이용한다.</p>
<ul>
<li><p>sys 라이브러리를 사용할 때는 한 줄 입력을 받고 나서 rstrip() 함수를 꼭 호출해야 한다.</p>
</li>
<li><p>readline()으로 입력하면 입력 후 엔터가 줄 바꿈 기호로 입력 되는데, 이 공백 문자를 제거하기 위함이다.</p>
<pre><code>import sys

# 문자열 입력받기 -&gt; Hello World
data = sys.stdin.readline().rstrip()
print(data) # 출력: Hello World</code></pre></li>
</ul>
</li>
</ul>
<br>

<h2 id="출력">출력</h2>
<ul>
<li><p>Print()를 이용하여 변수나 상수를 매개변수로 입력받아 이를 표준 출력으로 출력할 수 있다.</p>
</li>
<li><p>각 변수는 띄어쓰기로 구분되어 출력되고, 출력된 후 자동으로 개행이 된다.</p>
<pre><code>a = 1
b = 2
print(a, b) # 출력: 1 2</code></pre><br>
</li>
<li><p>더하기 연산은 같은 자료형끼리만 가능하다.</p>
<ul>
<li><p>다른 자료형끼리 더하기 연산을 할 시 TypeError가 발생한다.</p>
</li>
<li><p>ex.</p>
<pre><code>a = 7
print(&quot;정답은 &quot; + str(a) + &quot;입니다.&quot;) # 출력: 정답은 7입니다. </code></pre><pre><code>a = 7
print(&quot;정답은&quot;, str(answer), &quot;입니다.&quot;) # 정답은 7 입니다.</code></pre><ul>
<li>각 변수를 콤마로 구분하여 출력하는 경우, 변수의 값 사이에 공백이 삽입된다.</li>
</ul>
<br>
</li>
<li><p>Python 3.6 이상의 버전부터 f-string의 접두사 &#39;f&#39;를 사용하여 단순히 중괄호 안에 변수를 넣음으로써, 자료형의 변환 없이도 간단히 문자열과 정수를 함께 출력할 수 있다.</p>
<pre><code>a = 7
print(f&quot;정답은 {a}입니다.&quot;) # 출력: 정답은 7입니다.</code></pre></li>
</ul>
</li>
</ul>
<br>
<br>
<br>
 해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.<br>
나동빈, ⌜이것이 취업을 위한 코딩 테스트다 with 파이썬⌟, 한빛미디어, 2020, 604쪽
]]></description>
        </item>
        <item>
            <title><![CDATA[2.1 애플리케이션 개요와 AWS 기본]]></title>
            <link>https://velog.io/@summer_today/2.1-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EA%B0%9C%EC%9A%94%EC%99%80-AWS-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@summer_today/2.1-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EA%B0%9C%EC%9A%94%EC%99%80-AWS-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Fri, 09 Aug 2024 12:14:26 GMT</pubDate>
            <description><![CDATA[<h2 id="예제-애플리케이션-개요">예제 애플리케이션 개요</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/b2b9943e-f969-4b1a-8db4-8f70be0d67b6/image.png" alt="">
출처: 아이자와 고지 외 1명, ⌜클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트⌟, 동양북스, 2021, p.39.</p>
</blockquote>
<ul>
<li><p>마음에 드는 장소를 등록하는 서비스. ex. 인천, 서울, 강릉, ...</p>
</li>
<li><p>장소를 표시, 등록하는 웹 애플리케이션과 장소 정보를 일괄 등록하는 배치 애플리케이션으로 구성된다.</p>
</li>
</ul>
<br>

<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/b1ea54a9-0363-4c12-8671-26f909be845a/image.png" alt=""> 
출처: 아이자와 고지 외 1명, ⌜클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트⌟, 동양북스, 2021, p.39.</p>
</blockquote>
<ul>
<li><p>싱글 페이지 애플리케이션(Single Page Application)의 프론트엔드, REST API를 제공하는 벡엔드로 구성된 웹 애플리케이션과 스케줄된 배치 애플리케이션 으로 구성된다.</p>
</li>
<li><p>웹 애플리케이션의 프론트엔드 파일은 S3에 저장하고 CloudFront를 통해 정적 웹 콘텐츠로 배포한다.</p>
</li>
<li><p>백엔드는 EKS 클러스토 워커 노드에 컨테이너로 배포하고 RDS 데이터베이스와 접속한다.</p>
</li>
<li><p>가용성을 위해 백엔드로의 접속은 ELB를 통해 분산 시킨다.</p>
</li>
<li><p>ECR을 통해 백엔드 애플리케이션의 컨테이너 이미지와 배치 애플리케이션의 이미지를 관리한다. </p>
</li>
<li><p>배치 애플리케이션도 EKS에 배포되며 S3에 저장된 파일을 처리하고 RDS에 접속하여 쓰기를 실행한다.</p>
</li>
<li><p>RDS의 데이터베이스 조작을 위해 EC2 인스턴스로 배스천 호스트(Bastion Host)를 구성한다.</p>
<blockquote>
<ul>
<li>배스천 호스트
 네트워크 보안을 강화하기 위해 설계된 특별한 목적의 서버이다. 해당 서버는 일반적으로 내부 네트워크와 외부 네트워크(인터넷) 사이에 위치하며, 외부에서 내부 네트워크의 자원(ex. 데이터베이스, 파일 서버, 애플리케이션 서버 등)에 접근할 수 있는 유일한 접속 지점 역할을 한다. </li>
</ul>
</blockquote>
</li>
</ul>
<br>

<h2 id="aws-관련-서비스-및-용어">AWS 관련 서비스 및 용어</h2>
<ul>
<li><p>S3(Simple Storage Service)</p>
<ul>
<li><p>기본 스토리지 단위는 버킷이다.</p>
</li>
<li><p>AWS가 제공하는 클라우드 스토리지 서비스</p>
</li>
<li><p>미리 스토리지 용량을 정의하지 않고 사용 가능하다.</p>
</li>
<li><p>프론트엔드 콘텐츠 배포 장소로 사용하며, 배치 애플리케이션에서 파일을 읽어오는 장소로도 사용한다.</p>
</li>
<li><p>위 애플리케이션에서는 프론트엔드용 버킷과 배치 입력 파일용 버킷 2개를 생성한다.</p>
</li>
</ul>
<br>
</li>
<li><p>CloudFront</p>
<ul>
<li><p>AWS가 제공하는 CDN(Content Delivery Network) 서비스이다. </p>
</li>
<li><p>웹 콘텐츠, 이미지, 동영상 애플리케이션 등을 빠르게 전송하기 위한 구조로 되어있다.</p>
</li>
<li><p>전 세계에 많은 에지 로케이션(데이터를 전송하기 위한 지점)을 갖고 있어 사용자가 접속한 가장 가까운 장소에서 콘텐츠를 제공한다.</p>
</li>
<li><p>위 애플리케이션에서는 프론트엔드 콘텐츠는 S3에 저장하고 CloudFront를 통해 접속한다.</p>
</li>
</ul>
<br>
</li>
<li><p>RDS(Relational DataBase)</p>
<ul>
<li><p>AWS가 제공하는 관계형 데이터베이스이다.</p>
</li>
<li><p>Amazon Aurora, PostgreSQL, MySQL, MariaDB 등이 존재한다.</p>
</li>
<li><p>RDS에서는 멀티 AZ 구성(여러 개 가용 영역에 인스턴스를 배치하여 다중화하는 구조)을 지원하여 가용성을 높일 수 있다.</p>
</li>
</ul>
<br>
</li>
<li><p>ECR(Elastic Container Registry)</p>
<ul>
<li><p>AWS가 제공하는 컨테이너 레즈스트리 관리형 서비스이다.</p>
</li>
<li><p>컨테이너 이미지를 저장하고 다운로드할 수 있는 구조로 컨테이너 레지스트리를 사용한다.</p>
<blockquote>
<ul>
<li>컨테이너 레지스트리
컨테이너 이미지를 보관하는 리포지토리이며, 도커 명령어 등을 사용하여 컨테이너 이미지를 등록 및 다운로드한다. </li>
</ul>
</blockquote>
</li>
<li><p>컨테이너 이미지를 ECR에 등록해두고 EKS 클러스터로 배포한다.</p>
</li>
</ul>
<br>
</li>
<li><p>EC2(Elastic Computing Cloud)</p>
<ul>
<li><p>AWS에서 가상 머신을 사용할 수 있는 서비스로 다양한 형태의 가상 머신을 쉽게 구축할 수 있다.</p>
</li>
<li><p>배스천 호스트와 EKS 클러스터의 워커 노드에 사용된다.</p>
</li>
</ul>
<br>
</li>
<li><p>ELB(Elastic Load Balancing)</p>
<ul>
<li><p>AWS가 제공하는 로드밸런서 서비스이다.</p>
</li>
<li><p>ALB(Application Load Balancer)</p>
<ul>
<li><p>HTTP/HTTPS에 특화된 L7(응용계층) 로드밸런서이다.</p>
</li>
<li><p>경로 기반 라우팅, 호스트 기반 라우팅(HTTPS 헤더에 설정된 Host에 따라 경로 변경) 등 HTTP 특화 처리가 가능하다.</p>
</li>
</ul>
<br>
</li>
<li><p>NLB(Network Load Balancer)</p>
<ul>
<li><p>TCP/UDP에 특화된 L4(전송계층) 로드밸런서이다.</p>
</li>
<li><p>HTTP 트래픽에도 동작하지만, HTTP 레이어에서의 고급 기능이 필요하다면 ALB를 선택하는 것이 더 적합하다.</p>
</li>
</ul>
<br>
</li>
<li><p>CLB(Classic Load Balancer)</p>
<ul>
<li><p>HTTP/HTTPS와 TCP로 분산 설정이 가능하고 기본적인 로드 밸런서 기능을 제공한다.</p>
</li>
<li><p>하지만, 기능상 제약사항이 많아 AWS 측에서도 ALB와 NLB를 사용할 것을 권장하고 있다.</p>
</li>
</ul>
<br>
</li>
<li><p>GLB(Gateway Load Balancer)</p>
<ul>
<li><p>다른 회사의 가상 네트워킹 어플라이언스의 배포, 확장, 실행을 돕는다.</p>
</li>
<li><p>여러 회사의 어플라이언스에 대한 로드 밸런싱 및 자동 조정 기능을 제공한다.</p>
</li>
<li><p>전 세계적으로 분산된 리소스에 대해 지리적 기반 트래픽 라우팅이 필요한 경우 주로 사용된다.</p>
</li>
</ul>
<br>
</li>
<li><p>IAM(Identity and Access Management)</p>
<ul>
<li><p>AWS 리소스에 접속하는 사용자나 권한을 관리하는 서비스이다.</p>
</li>
<li><p>AWS 관리 콘솔이나 AWS CLI 작업, 혹은 애플리케이션이나 도구를 이용하는 사용자는 사용 형태에 맞는 권한을 가진 IAM 사용자를 생성하여 이용하는 것이 권장된다.</p>
</li>
<li><p>IAM 역할을 생성하여 리소스에 설정함으로써 해당 리소스에 다른 리소스에 대한 접근 권한을 부여할 수 있다.</p>
</li>
<li><p>예를 들어 워커 노드에는 IAM 역할을 통해 ECR에 접속할 수 있는 권한을 부여한다.</p>
</li>
</ul>
<br>

</li>
</ul>
</li>
</ul>
<h2 id="eks-구축에-사용하는도구">EKS 구축에 사용하는도구</h2>
<p>EKS 클러스터 구축에는 eksctl을 사용하는 방법과 AWS 관리 콘솔(AWS CLI)을 이용하는 방법이 존재한다. 
보통은 eksctl을 사용하여 EKS 환경 구축을 한다. </p>
<h3 id="eksctl">eksctl</h3>
<ul>
<li><p>EKS 클러스터 구축 및 관리를 하기 위한 오픈소스 명령줄 도구이다.</p>
</li>
<li><p><code>eksctl create cluster</code>란 명령만으로 EKS 클러스터를 구축할 수 있다.</p>
</li>
<li><p>VPC, 서브넷, 보안 그룹 등 EKS 클러스터를 구축하는 데 필요한 리소스를 한번에 구성할 수 있다.</p>
</li>
<li><p>VPC 등의 기본 리소스를 먼저 생성해두고 EKS 클러스터 구축 시 리소스 ID 설정을 통해 구성할 수도 있다.</p>
</li>
<li><p>EKS 클러스터와 VPC 등의 리소스를 별도로 구축하면 EKS 클러스터를 삭제해도 다른 리소스가 삭제되지 않기 때문에 EKS 클러스터만 재생성하면 다시 작업을 시작할 수 있다.</p>
</li>
<li><p>VPC 등의 기본 리소스는 EKS 클러스터와 별도로 구축하는 것이 구성을 유연하게 할 수 있어 보편적인 방법이다.</p>
</li>
</ul>
<br>

<h3 id="vpc-관련">VPC 관련</h3>
<ul>
<li><p>AWS 계정에서 여러 VPC를 생성할 수 있지만, 기본적으로 VPC는 독립적인 환경이므로 VPC를 명시적으로 연결하지 않는 한 VPC 간 통신은 할 수 없다.</p>
</li>
<li><p>VPC는 기본적으로 1개의 리전을 선택하여 그 안에 서비스를 구축한다.</p>
</li>
<li><p>가용 영역 여러 개에 리소스를 배포하여 다중화할 시 데이터센터 수준의 장애가 발생해도 정상적인 서비스가 가능하다.</p>
</li>
<li><p>VPC는 서브넷을 사용해 네트워크를 분할하여 관리한다.</p>
</li>
<li><p>서브넷은 가용 영역 여러 개를 동시 사용할 수 없고, 여러 가용 영역을 사용할 경우 서브넷도 그만큼 나눠야 한다.</p>
</li>
<li><p>라우팅 설정은 서브넷 단위로 이루어지며, 퍼블릭 서브넷과 프라이빗 서브넷을 구분하여 운영하는 경우가 많다.</p>
</li>
</ul>
<br>

<h3 id="cloudformation을-이용한-환경-구축">CloudFormation을 이용한 환경 구축</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/b673a03c-b03e-4879-b472-1550d64e3dce/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>CloudFormation은 AWS에서 인프라를 코드로 관리(Infrastructure as Code, IaC)할 수 있도록 해주는 서비스이다.</p>
</li>
<li><p>CloudFormation을 사용하면 AWS 리소스를 텍스트 형식의 템플릿으로 정의하고, 이 템플릿을 기반으로 AWS 인프라를 자동으로 생성, 업데이트, 삭제할 수 있다. </p>
</li>
<li><p>AWS 리소스는 AWS 관리 콘솔, AWS CLI 등 여러 방법으로 구축이 가능하지만, 여러 리소스를 한번에 구축하고 변경 및 삭제할 때는 CloudFormation이 적합하다.</p>
</li>
<li><p>JSON 또는 YAML 형식으로 리소스 구성을 정의한다.</p>
<pre><code class="language-Resources:">MyEC2Instance:
  Type: &quot;AWS::EC2::Instance&quot;
  Properties:
    InstanceType: t2.micro
    ImageId: ami-0abcdef1234567890

MyS3Bucket:
  Type: &quot;AWS::S3::Bucket&quot;
  Properties:
    BucketName: my-bucket</code></pre>
<br>

</li>
</ul>
<h3 id="aws-관리-콘솔">AWS 관리 콘솔</h3>
<ul>
<li><p>AWS 서비스를 관리하기 위한 웹 사용자 인터페이스이다.</p>
</li>
<li><p>CloudFormation으로 구축한 환경 확인은 AWS 관리 콘솔에서 한다.</p>
<br>

</li>
</ul>
<h3 id="aws-cli">AWS CLI</h3>
<ul>
<li><p>AWS가 제공하는 명령줄 도구이다.</p>
</li>
<li><p>파이썬으로 만들어진 도구로 인스톨러가 제공되며 파이썬 패키지 관리 도구인 pip를 이용해 설치할 수 있다.</p>
</li>
</ul>
<br>
<br>
<br>
해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.<br>
아이자와 고지 외 1명, ⌜클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트⌟, 동양북스, 2021, 370쪽   ]]></description>
        </item>
        <item>
            <title><![CDATA[Python 문법 정리 - 함수]]></title>
            <link>https://velog.io/@summer_today/Python-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@summer_today/Python-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC-%ED%95%A8%EC%88%98</guid>
            <pubDate>Fri, 09 Aug 2024 02:12:43 GMT</pubDate>
            <description><![CDATA[<h2 id="함수">함수</h2>
<pre><code>def 함수명(매개변수):
    실행할 소스코드
    return 반환 값</code></pre><ul>
<li><p>함수나 매개변수나 return문은 존재하지 않을 수 있다.</p>
</li>
<li><p>함수를 호출하는 과정에서 다음과 같이 인자(Argument)를 넘겨줄 때, 파라미터의 변수를 직접 지정해서 값을 넣을 수 있다.</p>
<pre><code>def add(a, b):
      print(a+b)

add(b = 3, a = 2) # 출력: 5</code></pre><br>
</li>
<li><p>함수 밖의 변수 데이터를 변경해야하는 경우에는 global 키워드를 사용한다.</p>
<pre><code>x = 0

def func():
    flobal x
    x += 1

for i in range(10):
    func()

print(x) # 출력: 10
</code></pre><br>
</li>
<li><p>람다 표현식을 사용할 수 있다.</p>
<pre><code>def add(x, y):
    return x + y

# 일반적인 add() 메서드 사용
print(add(3, 7))

# 람다 표현식으로 구현한 add() 메서드
print((lambda x, y: x + y)(3, 7))</code></pre></li>
</ul>
<br>
<br>
<br>
 해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.<br>
나동빈, ⌜이것이 취업을 위한 코딩 테스트다 with 파이썬⌟, 한빛미디어, 2020, 604쪽
]]></description>
        </item>
        <item>
            <title><![CDATA[1.4 Amazon EKS]]></title>
            <link>https://velog.io/@summer_today/1.4-Amazon-EKS</link>
            <guid>https://velog.io/@summer_today/1.4-Amazon-EKS</guid>
            <pubDate>Thu, 08 Aug 2024 13:07:22 GMT</pubDate>
            <description><![CDATA[<h2 id="amazon-ekselastic-kubernetes-service">Amazon EKS(Elastic Kubernetes Service)</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/fb01aa01-4102-4510-8076-b6c71fd05acf/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>Amazon Elastic Kubernetes Service (EKS)는 Amazon Web Services (AWS)에서 제공하는 관리형 Kubernetes 서비스이다.</p>
</li>
<li><p>EKS는 사용자가 Kubernetes를 쉽게 사용할 수 있도록 클러스터 관리 및 운영 작업을 AWS가 대신 처리한다.</p>
</li>
<li><p>쿠버네티스를 제어하는 컨트롤 플레인을 제공하는 관리형 서비스이다.</p>
</li>
</ul>
<br>

<h2 id="eks를-쓰는-이유">EKS를 쓰는 이유</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/919a7c0c-9845-403e-8ba5-7449bbfc3e50/image.png" alt="">출처: <a href="https://medium.com/devops-mojo/kubernetes-architecture-overview-introduction-to-k8s-architecture-and-understanding-k8s-cluster-components-90e11eb34ccd">https://medium.com/devops-mojo/kubernetes-architecture-overview-introduction-to-k8s-architecture-and-understanding-k8s-cluster-components-90e11eb34ccd</a></p>
</blockquote>
<ul>
<li><p>쿠버네티스 도입 중 가장 큰 어려움은 &#39;컨트롤 플레인의 유지 및 운영&#39;이다.</p>
</li>
<li><p>쿠버네티스에서는 여러 컴포넌트들이 서로 독립적이고 비동기로 동작하며 전체를 구성한다.</p>
</li>
<li><p>각 구성 요소의 설정이나 장애가 발생했을 시 복구 방법 등이 복잡할 수 있다.</p>
</li>
<li><p>이러한 유지, 운영의 어려움을 AWS에서 해결해준다. </p>
</li>
<li><p>AWS에서 컨트롤 플레인 부분(kube-apiserver, kube scheduler, controller, CoreDNS)을 관리해준다. </p>
</li>
</ul>
<br>

<h2 id="eks의-특징">EKS의 특징</h2>
<ul>
<li><p>이미 구축된 쿠버네티스 클러스터에서 동작하는 애플리케이션을 수정하지 않고 동작시킬 수 있다. (쿠버네티스와의 완전한 호완성)</p>
</li>
<li><p>AWS의 각종 서비스와 통합이 쉽다.</p>
</li>
</ul>
<br>

<h3 id="vpc와-통합">VPC와 통합</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/9953fdfd-3a43-4627-b1ed-981e6d211f87/image.png" alt="">출처: <a href="https://velog.io/@bbkyoo/Amazon-EKS%EB%9E%80">https://velog.io/@bbkyoo/Amazon-EKS%EB%9E%80</a></p>
</blockquote>
<ul>
<li><p>파드 네트워크에는 데이터 플레인의 네트워크와는 다른 자체 네트워크 체계를 배치하여, 클러스터 외부에서 파드에 명시적으로 엔드 포인트를 생성하지 않으면 통신이 불가능하다.</p>
</li>
<li><p>Amazon VPC(Amazon Virtual Private Cloud) 통합 네트워킹을 통해 파드에서 VPC 내부 주소 대역을 사용하여 클러스터 외부와의 통신을 심리스(Seamless)하게 구현할 수 있다.</p>
<blockquote>
<ul>
<li>심리스(Seamless)
서비스 접근을 단순하게 한느 것 혹은 복잡한 기술이나 기능을 설명하지 않아도 서비스 기능을 직관적으로 구현하는 것을 목표로 한다.</li>
</ul>
</blockquote>
</li>
</ul>
<br>

<h3 id="iam을-통한-인증과-인가">IAM을 통한 인증과 인가</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/ea334f74-abcc-4664-8bbf-ad11dd08a53a/image.png" alt=""> 출처: <a href="https://velog.io/@bbkyoo/Amazon-EKS%EB%9E%80">https://velog.io/@bbkyoo/Amazon-EKS%EB%9E%80</a></p>
</blockquote>
<ul>
<li><p>쿠버네티스 클러스터는 kubectl이라는 명령줄 도구를 사용하여 조작</p>
<blockquote>
<ul>
<li>kubectl
쿠버네티스(Kubernetes) 클러스터를 관리하기 위한 기본적인 커맨드 라인 인터페이스(CLI) 도구이다. kubectl을 사용하면 쿠버네티스 클러스터의 리소스를 생성, 업데이트, 삭제, 조회할 수 있다. </li>
</ul>
</blockquote>
</li>
<li><p>조작을 위해서는 적절한 인증/인가 구조가 필요하다.</p>
</li>
<li><p>EKS에서는 IAM과 연결한 인증 및 인가 구조를 제공한다.</p>
</li>
</ul>
<br>

<h3 id="elbelastic-load-balancing와의-연동">ELB(Elastic Load Balancing)와의 연동</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/006ccbb3-5e57-40e9-a6da-fa77e1075f9c/image.png" alt=""> 출처: <a href="https://velog.io/@bbkyoo/Amazon-EKS%EB%9E%80">https://velog.io/@bbkyoo/Amazon-EKS%EB%9E%80</a></p>
</blockquote>
<ul>
<li><p>쿠버네티스 클러스터 외부에서 접속할 때는 ELB를 사용해 엔드포인트를 생성한다.</p>
</li>
<li><p>EKS에서는 로드밸런서를 설정하면 자동적으로 ELB가 생성된다.</p>
</li>
<li><p>ELB를 통해 HTTPS나 경로 기반 라우팅 등의 L7 로드밸런서 기능을 AWS로 구현할 수 있다.</p>
</li>
</ul>
<br>

<h3 id="데이터-플레인-선택-ec2-vs-fargate">데이터 플레인 선택 (EC2 vs Fargate)</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/f942b628-3708-42f2-9894-15186bee66db/image.png" alt="">출처: <a href="https://www.simform.com/blog/fargate-vs-ec2-pricing/">https://www.simform.com/blog/fargate-vs-ec2-pricing/</a></p>
</blockquote>
<ul>
<li><p>쿠버네티스는 컨트롤 플레인과 데이터 플레인으로 구성되고, 컨트롤 플레인은 EKS에서 관리형 서비스로 제공된다.</p>
<blockquote>
<ul>
<li>컨트롤 플레인(Control Plane): 클러스터의 전반적인 관리와 제어를 담당하는 계층으로, 클러스터의 상태를 모니터링하고 원하는 상태로 유지한다.<br></li>
<li>데이터 플레인(Data Plane): 실제로 애플리케이션이 실행되고 네트워크 트래픽이 흐르는 계층으로, 사용자 애플리케이션의 실행을 책임진다. </li>
</ul>
</blockquote>
</li>
<li><p>EKS 클러스터의 유지 관리나 버전을 업그레이드할 때 필요한 가상 머신 설정을 쉽게 해주는 관리형 노드 그룹 구조(EC2)와 가상 머신을 의식하지 않고 파드를 배포할 수 있는 파게이트(Fargate)를 이용하여 데이터 플레인을 관리할 수 있다.</p>
</li>
<li><p>파게이트는 데이터 플레인 관리가 필요 없는 만큼 파드가 배포되는 호스트에 사용자 접근이 제한되는 등 제약이 존재한다.</p>
</li>
</ul>
<br>
<br>
<br>
해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.
아이자와 고지 외 1명, ⌜클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트⌟, 동양북스, 2021, 370쪽  ]]></description>
        </item>
        <item>
            <title><![CDATA[Python 문법 정리 - 반복문]]></title>
            <link>https://velog.io/@summer_today/Python-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC-%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@summer_today/Python-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC-%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Thu, 08 Aug 2024 03:00:32 GMT</pubDate>
            <description><![CDATA[<h2 id="while문">while문</h2>
<ul>
<li><p>조건문이 참일 때 에 한해서 반복적으로 코드가 수행된다.</p>
</li>
<li><p>ex.</p>
<pre><code>a = 1
result = 0

while a &lt;= 9:
  result += a
  a += 1

print(result) # 출력: 45</code></pre></li>
</ul>
<pre><code> a = 1
result = 0

 while a &lt;= 9:
    if a % 2 == 1:
        result += a
    a += 1

 print(result) # 출력: 25</code></pre> <br>

<h2 id="for문">for문</h2>
<ul>
<li><p>반복문으로 사용된다.</p>
</li>
<li><p>in 뒤에 오는 데이터에 포함되어 있는 모든 원소를 첫 번째 인덱스부터 차례대로 하나씩 방문한다.</p>
</li>
<li><p>in 뒤에는 리스트, 튜플, 문자열 등이 사용될 수 있다.</p>
</li>
<li><p>ex.</p>
<pre><code>for 변수 in 리스트:
  실행할 소스코드</code></pre><br>

<pre><code>result = 0

# a는 1부터 9까지 모든 값 순회 - range(시작 값, 끝 값 + 1)
for a in range(1, 10):
  result += a

print(result)</code></pre><br>

</li>
</ul>
<ul>
<li><p>range()의 값으로 하나의 값만을 넣으면, 자동으로 시작 값은 0이 된다. </p>
<pre><code>a = [1, 2 ,3 ,4, 5]

for i in range(5):
   if scores[i] &gt;= 3:
      print(i + 1, &quot;번은 통과&quot;)

# 출력:
3번은 통과
4번은 통과
5번은 통과</code></pre><br>

<ul>
<li><p>반복문 안에서 continue를 사용할 수 있다.</p>
<pre><code>a = [1, 2, 3, 4, 5]
b = [2, 4]

for i in range(5):
  if i + 1 in b:
      continue
   if scores[i] &gt;= 3:
    print(i + 1, &quot;번은 통과&quot;)

# 출력:
3번은 통과
5번은 통과</code></pre></li>
</ul>
<br>

<ul>
<li>반복문 안에 반복문을 사용할 수 있다.</li>
</ul>
</li>
</ul>
<br>
<br>
<br>
 해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.<br>
나동빈, ⌜이것이 취업을 위한 코딩 테스트다 with 파이썬⌟, 한빛미디어, 2020, 604쪽



]]></description>
        </item>
        <item>
            <title><![CDATA[Python 문법 정리 - 조건문]]></title>
            <link>https://velog.io/@summer_today/Python-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC-%EC%A1%B0%EA%B1%B4%EB%AC%B8</link>
            <guid>https://velog.io/@summer_today/Python-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC-%EC%A1%B0%EA%B1%B4%EB%AC%B8</guid>
            <pubDate>Wed, 07 Aug 2024 13:09:54 GMT</pubDate>
            <description><![CDATA[<h2 id="if--elif--else">if ~ elif ~ else</h2>
<pre><code>if 조건문 1:
    조건문 1이 True일 때 실행되는 코드

elif 조건문 2:
    조건문 1에 해당하지 않고, 조건문 2가 True일 때 실행되는 코드 

else:
    위의 모든 조건문이 모두 True 값이 아닐 때 실행되는 코드</code></pre><ul>
<li><p>파이썬에서 들여쓰기는 스페이스 바 4번 또는 Tab을 입력한다. 표준은 스페이스 바 4번이긴 하다.</p>
</li>
<li><p>파이썬에서 조건문을 작성할 때는 if ~ elif ~ elses문을 이용한다.</p>
</li>
<li><p>조건문을 사용할 때 elif 혹은 else 부분은 경우에 따라 사용하지 않아도 된다.</p>
</li>
<li><p>ex. </p>
<ul>
<li><p>학점이 4.0 이상일 때 A</p>
</li>
<li><p>학점이 4.0 미만, 3.0 이상일 때 B</p>
</li>
<li><p>학점이 3.0 미만, 2.0 이상일 때 C</p>
</li>
<li><p>학점이 2.0 미만일 때 F</p>
</li>
</ul>
<pre><code>if score &gt;= 4.0:
    print(&quot;학점: A&quot;)
elif score &gt;= 3.0:
    print(&quot;학점: B&quot;)
elif score &gt;= 2.0:
    print(&quot;학점: C&quot;)
else:  
    pring(&quot;학점: F&quot;)  </code></pre><br>  

</li>
</ul>
<h2 id="비교-연산자">비교 연산자</h2>
<p>조건문에는 비교 연산자를 자주 사용한다.</p>
<ul>
<li><p>X == Y: X와 Y사 서로 같을 때 참(True)이다.</p>
</li>
<li><p>X != Y: X와 Y사 서로 다를 때 참(True)이다.</p>
</li>
<li><p>X &gt; Y: X가 Y보다 클 때 참(True)이다.</p>
</li>
<li><p>X &lt; Y: X가 Y보다 작을 때 참(True)이다.</p>
</li>
<li><p>X &gt;= Y: X가 Y보다 크거나 같을 때 참(True)이다.</p>
</li>
<li><p>X &lt;= Y: X가 Y보다 작거나 같을 때 참(True)이다.</p>
<br>

</li>
</ul>
<h2 id="논리-연산자">논리 연산자</h2>
<p>2개의 논리 값 사이의 연산을 수행할 때 사용한다.</p>
<ul>
<li><p>X and Y: X와 Y가 모두 참(True)일 때 참(True)이다.</p>
</li>
<li><p>X or Y: X와 Y 중에 하나만 참(True)이어도 참(True)이다.</p>
</li>
<li><p>not X: X가 거짓(False)일 때 참(True)이다.</p>
</li>
</ul>
<br>

<h2 id="파이썬의-기타-연산자">파이썬의 기타 연산자</h2>
<h3 id="in-연산자와-not-in-연산자">in 연산자와 not in 연산자</h3>
<p>파이썬에는 추가적으로 &#39;in 연산자&#39;와 &#39;not in 연산자&#39;를 제공한다. 여러 개의 데이터를 포함하는 자료형에서 특정 값이 존재하는 지 확인하는 연산에 주로 사용된다.</p>
<ul>
<li><p>X in 리스트: 리스트 안에 X가 들어가 있을 때 참(True)이다.</p>
</li>
<li><p>X not in 문자열: 문자열 안에 X가 들어가 있지 않을 때 참(True)이다.</p>
</li>
</ul>
<br>

<h3 id="pass문">pass문</h3>
<p>조건문의 값이 참(True)이라고 해도, 아무것도 처리하고 싶지 않을 때 pass 문을 이용할 수 있다. </p>
<pre><code>star = 4

if star &gt; 2:
    pass # 나중에 작성할 코드
else:
    printf(&#39;별이 2개 미만&#39;)

printf(&#39;프로그램 종료&#39;) 

# 출력: 프로그램 종료
</code></pre><br>

<h3 id="기타-표현">기타 표현</h3>
<ul>
<li><p>조건문에서 실행될 코드가 한 줄인 경우, 굳이 줄 바꿈을 하지 않고도 간략하게 표현할 수 있다.</p>
<pre><code>star = 4

if star &gt;= 2: printf(&#39;별이 2개 이상&#39;)
else: printf(&#39;별이 2개 미만&#39;)</code></pre><br>
</li>
<li><p>조건부 표현식(Conditional Expression)을 이용하면 if ~ else문을 한 줄에 작성해 사용할 수 있다.</p>
<pre><code>star = 4
result = &quot;good&quot; if star &gt;= 4 else &quot;bad&quot;

print(result) # 출력: good</code></pre><br>
</li>
<li><p>리스트에 있는 원소의 값을 변경해서, 또 다른 리스트를 만들 때 조건부 표현식이 유용하다.</p>
<pre><code>a = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3,5}

result = []
for i in a:
    if i not in remove_set:
      result.append(i)

print(result) # 출력: [1, 2, 4]      </code></pre><p>위 코드를 조건부 표현식을 사용하여 아래와 같이 간단하게 표현할 수 있다.</p>
<pre><code>a= [1, 2, 3, 4, 5, 5, 5]
remove_set = {3,5}

result = [i for i in a if i not in remove_set]

print(result) # 출력: [1, 2, 4]</code></pre><br>
</li>
<li><p>파이썬에서는 조건문 안에 0 &lt; x &lt; 20 과 같은 부등식을 그대로 사용 가능하다.  </p>
</li>
</ul>
<br>
<br>
<br>
 해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.<br>
나동빈, ⌜이것이 취업을 위한 코딩 테스트다 with 파이썬⌟, 한빛미디어, 2020, 604쪽
]]></description>
        </item>
        <item>
            <title><![CDATA[What is Kubernetes? ]]></title>
            <link>https://velog.io/@summer_today/What-is-Kubernetes</link>
            <guid>https://velog.io/@summer_today/What-is-Kubernetes</guid>
            <pubDate>Tue, 06 Aug 2024 13:10:55 GMT</pubDate>
            <description><![CDATA[<h2 id="관련-용어-발음-정리">관련 용어 발음 정리</h2>
<ul>
<li><p>master: 마스터</p>
</li>
<li><p>node: 노드(구 minion 미니언)</p>
</li>
<li><p>k8s: 쿠버네티스, 케이에잇츠, 케이팔에스</p>
</li>
<li><p>etcd: 엣지디, 엣시디, 이티시디</p>
</li>
<li><p>pod: 팟, 파드, 포드</p>
</li>
<li><p>istio: 이스티오</p>
</li>
<li><p>helm: 헬름, 핾, 햄</p>
</li>
<li><p>knative: 케이 네이티브</p>
</li>
</ul>
<br>

<h2 id="kubernetesk8s란">Kubernetes(k8s)란?</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/b196c3c4-4e28-4b0b-b89e-f181b39eca22/image.png" alt="">출처: <a href="https://www.youtube.com/watch?v=DU2RDN7ZXo8&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&amp;index=4">https://www.youtube.com/watch?v=DU2RDN7ZXo8&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&amp;index=4</a></p>
</blockquote>
<ul>
<li><p>컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리를 해준다.</p>
</li>
<li><p>컨테이너를 쉽게 관리하고 연결하기 위해 논리적인 단위로 그룹화한다.</p>
</li>
<li><p>Google에서 15년간 경험을 토대로 최상의 아이디어와 방법들을 결합하여 구현했다. (borg -&gt; k8s)</p>
<br>



</li>
</ul>
<h2 id="cloudnativ">CloudNativ</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/22f5f5c8-75ce-42f2-a8c8-a370802bc5a6/image.png" alt="">출처: <a href="https://www.youtube.com/watch?v=DU2RDN7ZXo8&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&amp;index=4">https://www.youtube.com/watch?v=DU2RDN7ZXo8&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&amp;index=4</a></p>
</blockquote>
<ul>
<li><p>클라우드 환경을 최대한 활용하여 애플리케이션을 설계하고 운영하는 접근 방식을 의미한다.</p>
</li>
<li><p>클라우드의 확장성, 탄력성, 유연성을 최대한 활용할 수 있도록 설계된 애플리케이션 및 서비스 개발 방법론이다.</p>
</li>
<li><p>컨테이너, 서비스메시, 마이크로서비스 등을 이용할 시 클라우드 환경에서의 배포가 용이하고, 이를 &#39;클라우드 네이티브하다&#39;라고 한다.</p>
</li>
<li><p>클라우드에 적합한 기술들이 쿠버네티스에서 구현이 쉽기 때문에 클라우드 네이티브하다고 할 수 있다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/de61fcb5-19dc-4b00-9805-b4eda67756bf/image.png" alt=""> 출처: <a href="https://www.youtube.com/watchv=DU2RDN7ZXo8&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&amp;index=4">https://www.youtube.com/watchv=DU2RDN7ZXo8&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&amp;index=4</a></p>
</blockquote>
<br>  

</li>
</ul>
<h2 id="쿠버네티스-개념">쿠버네티스 개념</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/0fa38fe5-4865-4ccf-b77f-9663f521eead/image.png" alt=""> 출처: <a href="https://medium.com/devops-mojo/kubernetes-architecture-overview-introduction-to-k8s-architecture-and-understanding-k8s-cluster-components-90e11eb34ccd">https://medium.com/devops-mojo/kubernetes-architecture-overview-introduction-to-k8s-architecture-and-understanding-k8s-cluster-components-90e11eb34ccd</a></p>
</blockquote>
<ul>
<li><p>데이터 플레인이라 불리는 서버를 여러 대 실행시켜 그 위에 가상 오케스트레이션 계층을 구축하여 이 위에서 컨테이너가 동작한다.</p>
<blockquote>
<ul>
<li>데이터 플레인
서비스 사이의 네트워크 트래픽을 관리하는 서비스 메시(애플리케이션의 다양한 부분들이 통신하는 것을 제어하는 방법) 애플리케이션을 의미한다.</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>서비스 메시</li>
</ul>
</blockquote>
<ul>
<li>마이크로서비스 아키텍처에서 서비스 간 통신을 관리하는 인프라 계층이다. </li>
<li>주요 목적은 복잡한 네트워크 트래픽 관리를 단순화하고, 서비스 간의 통신을 보다 안정적이고 안전하게 만드는 것이다. </li>
<li>주로 마이크로서비스 간의 트래픽을 제어하고 모니터링하는데 사용된다.</li>
</ul>
</li>
</ul>
<ul>
<li><p>컨테이너 그룹을 하나의 큰 머신 리소스로 관리할 수 있어 인프라를 추상화 할 수 있다.</p>
</li>
<li><p>Control plane을 통해 컨테이너 배포, 장애 복구(장애가 발생한 컨테이너를 정지·재시작) 기능도 구현할 수 있다. </p>
</li>
<li><p>Control Plane의 컴포넌트들이 상호작용하여 노드를 제어한다.</p>
<blockquote>
<p><strong>노드(Node)</strong>는 파드가 실행되는 서버를 의미한다. 해당 서버는 실제로 애플리케이션을 실행하는 물리적 또는 가상 머신이다.</p>
</blockquote>
<blockquote>
<p><strong>파드(Pod)</strong>는 컨테이너 그룹을 의미한다. 파드는 하나 이상의 컨테이너를 포함하며, 이 컨테이너들은 함께 실행되면서 같은 네트워크와 스토리지를 공유한다.</p>
</blockquote>
</li>
<li><p>Control Plane 구성 요소</p>
<ul>
<li><p>API Server
Control Plane의 프론트엔드 역할을 수행하는 것으로 사용자가 전달하는 API를 받아 Kubernetes 내부 컴포넌트와 상호 작용을 수행한다.</p>
</li>
<li><p>Scheduler
노드에 배정되지 않은 Pod를 감지하고 어떤 노드에 실행할지 선택하는 역할을 담당하는 컴포넌트이다.</p>
</li>
<li><p>Controller Manger
API Server와 상호작용해 클러스터 내에 컴포넌트의 상태를 감지하고 원하는 상태로 전환하는 역할을 담당하는 컴포넌트이다.</p>
</li>
<li><p>etcd
클러스터 내의 모든 정보들을 저장하고 있는 Key-Value 형태의 저장소이다. </p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>Data Plane에도 컴포넌트가 구성되어 Control Plane과 연계하고 네트워킹 연결과 컨테이너를 관리할 수 있다.</p>
</li>
<li><p>Data Plane 구성 요소</p>
<ul>
<li><p>kublet
각 노드에서 실행되는 에이전트 개념의 컴포넌트이다. Control Plane과 통신하거나 컨테이너 생성 및 삭제와 상태 모니터링을 수행한다.</p>
</li>
<li><p>kube-proxy
각 노드에서 실행되는 노드의 네트워킹을 담당하는 컴포넌트이다. kube-proxy를 통해 다른 노드 간의 통신이나 외부 구간의 통신을 할 수 있게 된다.</p>
</li>
<li><p>Container Runtime
컨테이너가 실행될 수 있는 환경을 구성하는 컴포넌트이다.</p>
</li>
</ul>
<br>

</li>
</ul>
<h2 id="쿠버네티스-기본-오브젝트">쿠버네티스 기본 오브젝트</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/15a870b7-ebd1-4f4e-99fe-26e977977921/image.png" alt="">출처: <a href="https://tsuyoshiushio.medium.com/kubernetes-in-three-diagrams-6aba8432541c">https://tsuyoshiushio.medium.com/kubernetes-in-three-diagrams-6aba8432541c</a></p>
</blockquote>
<ul>
<li><p>Pod (파드)</p>
<ul>
<li><p>쿠버네티스의 최소 단위</p>
</li>
<li><p>파드 하나 안에 하나 이상의 컨테이너 실행 가능</p>
</li>
<li><p>어떤 컨테이너 이미지를 사용할지 등을 설정</p>
</li>
</ul>
<br>
</li>
<li><p>ReplicaSet (레플리카셋) </p>
<ul>
<li><p>파드를 얼마나 동작시킬지 관리하는 오브젝트</p>
</li>
<li><p>파드 수 설정 시 해당 수 만큼의 파드 동작 보장</p>
</li>
</ul>
<br>
</li>
<li><p>Deployment (디플로이먼트)</p>
<ul>
<li><p>배포 이력 관리 역할.</p>
</li>
<li><p>새로운 버전을 릴리스하거나 부하 증가에 따른 레플리카셋 수를 변경하는 등의 작업을 디플로이먼트로 관리.</p>
</li>
<li><p>적용 이력도 관리하므로 문제 발생 시 이전 버전으로 쉽게 롤백 가능</p>
</li>
</ul>
<br>
</li>
<li><p>서비스 (Service)</p>
<ul>
<li><p>배포한 파드를 쿠버네티스 클러스터 외부에 공개하기 위한 구조 제공</p>
</li>
<li><p>공개 방법은 다양하지만, 가장 대표적인 방법은 클러스터 내의 파드 여러개를 동작시키고 그 앞단에 로드밸런서를 배치하여 특정 파드를 클러스터 외부로 공개하는 방식이 있다. </p>
</li>
</ul>
</li>
</ul>
<br>
<br>
<br>
본 포스팅은 다음 내용을 참고하여 작성되었습니다.<br>
[초보를 위한 쿠버네티스 안내서] 왜 쿠버네티스인가? - https://www.youtube.com/watch?v=DU2RDN7ZXo8&list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&index=4 <br>
아이자와 고지 외 1명, ⌜클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트⌟, 동양북스, 2021, 370쪽

]]></description>
        </item>
        <item>
            <title><![CDATA[Why Kubernetes?]]></title>
            <link>https://velog.io/@summer_today/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%82%AC%EC%9A%A9-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@summer_today/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%82%AC%EC%9A%A9-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Tue, 06 Aug 2024 12:00:30 GMT</pubDate>
            <description><![CDATA[<h2 id="kubernetes">Kubernetes</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/1cf1e314-93e6-44cc-8942-0d0c4e510d5c/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 구글의 오픈소스 플랫폼</p>
</li>
<li><p>구글이 컨테이너 배포 시스템으로 사용하던 borg를 기반으로 만든 오픈소스</p>
</li>
<li><p>20억개의 컨테이너를 관리할 수 있을 만큼 스케일 능력이 뛰어나다.</p>
</li>
<li><p>다양하 요구사항을 만족시킬 수 있는 유연성을 지닌다.</p>
</li>
<li><p>환경을 타지 않고 어디서든 동작할 수 있다.</p>
</li>
</ul>
<br>

<h2 id="kubernetes가-인기가-많은-이유">Kubernetes가 인기가 많은 이유</h2>
<ul>
<li><p>오픈소스</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/deb64d9f-6441-4935-9835-80a0d2f3bc48/image.png" alt=""> 출처: <a href="https://github.com/kubernetes/kubernetes">https://github.com/kubernetes/kubernetes</a></p>
</blockquote>
<p>Google, Red Hat, Huawai, VMware, Microsoft, IBM, Intel 등 여러 메이저 업체들이 활발하게 참여하고 있다.</p>
<br>
</li>
<li><p>커뮤니티</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/a2c52eab-4979-49d0-a499-43f0808633a9/image.png" alt=""> 출처: <a href="https://www.youtube.com/watch?v=fDcqL6xlOPk&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&amp;index=2">https://www.youtube.com/watch?v=fDcqL6xlOPk&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&amp;index=2</a></p>
</blockquote>
<p>전세계 150개가 넘는 모임이 존재하고, 활발한 활동을 이어오고 있다. 그만큼 쿠버네티스 관련 정보들이 많이 존재한다.</p>
<br>
</li>
<li><p>무한한 확장성</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/2395ac6a-4e36-40ca-858c-e1455b7838ce/image.png" alt=""> 출처: <a href="https://www.youtube.com/watch?v=fDcqL6xlOPk&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&amp;index=2">https://www.youtube.com/watch?v=fDcqL6xlOPk&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&amp;index=2</a></p>
</blockquote>
<p>쿠버네티스라는 플랫폼 위에서 머신러닝, CI/CD, 서비스메시, 서버리스와 같은 서비스들이 동작할 수 있다.</p>
<br>
</li>
<li><p>사실상의 표준</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/67a26d60-e651-4157-a4bd-66926e313e3e/image.png" alt=""> 출처: <a href="https://www.youtube.com/watch?v=fDcqL6xlOPk&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&amp;index=2">https://www.youtube.com/watch?v=fDcqL6xlOPk&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&amp;index=2</a></p>
</blockquote>
<p>쿠버네티스가 컨테이너 오케스트레이션의 사실상의 표준이 되어 Cloud Native의 핵심 역할을 하고 있다. 또한 여러 업체들이 쿠버네티스 관련 서비스를 제공하고 있다. </p>
</li>
</ul>
<br>
<br>
<br>
본 포스팅은 다음 내용을 참고하여 작성되었습니다.<br>
[초보를 위한 쿠버네티스 안내서] 왜 쿠버네티스인가? - https://www.youtube.com/watch?v=fDcqL6xlOPk&list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&index=2

]]></description>
        </item>
        <item>
            <title><![CDATA[컨테이너 오케스트레이션]]></title>
            <link>https://velog.io/@summer_today/Kubernetes-%EA%B8%B0%EC%B4%88-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%98%A4%EC%BC%80%EC%8A%A4%ED%8A%B8%EB%A0%88%EC%9D%B4%EC%85%98</link>
            <guid>https://velog.io/@summer_today/Kubernetes-%EA%B8%B0%EC%B4%88-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%98%A4%EC%BC%80%EC%8A%A4%ED%8A%B8%EB%A0%88%EC%9D%B4%EC%85%98</guid>
            <pubDate>Mon, 05 Aug 2024 07:58:32 GMT</pubDate>
            <description><![CDATA[<h2 id="서버-관리의-어려움">서버 관리의 어려움</h2>
<ul>
<li><p>가장 초기 서버 관리는 문서화를 통해 이루어졌다.</p>
</li>
<li><p>하지만, 문서를 통해 유지 관리하는 것은 실질적으로 어려운 부분들이 많았다. (문서를 보고 실행을 해도 되지 않거나, 버전이 바뀌면 무용지물이 되는 등의 문제점 존재)</p>
</li>
<li><p>다음으로 CHEF, puppet과 같은 툴을 사용하여 서버를 관리하는 방식이 나타났지만, 서버가 복잡해질수록 해당 툴 사용법들도 복잡해지는 문제점이 존재했다.</p>
</li>
<li><p>가상머신이 다음으로 나타났지만, 클라우드 환경과의 통합의 문제와 속도가 느리다는 단점이 존재했다.</p>
</li>
</ul>
<br>

<h2 id="docker의-등장">Docker의 등장</h2>
<ul>
<li><p>모든 실행환경을 컨테이너로 동작할 수 있도록 해준다.</p>
</li>
<li><p>어디서든 동작하고 사용법도 쉽고 속도도 빠르다.</p>
</li>
<li><p>서버 관리의 복잡함을 해소시켜주었다.</p>
</li>
</ul>
<br>

<h2 id="docker-container의-특징">Docker Container의 특징</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/5d4103d4-0856-469f-867e-d68fa16e43ac/image.png" alt=""> 출처: <a href="https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb">https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb</a></p>
</blockquote>
<ul>
<li><p>가상 머신과 비교하여 컨테이너 생성이 쉽고 효율적이다.</p>
</li>
<li><p>컨테이너 이미지를 이용한 배포와 롤백이 간단하다.</p>
</li>
<li><p>언어나 프레임워크에 상관없이 애플리케이션을 동일한 방식으로 관리한다.</p>
</li>
<li><p>개발, 테스팅, 운영 환경은 물론 로컬 PC와 클라우드까지 동일한 환경을 구축할 수 있다.</p>
</li>
<li><p>특정 클라우드 벤더에 종속적이지 않다.</p>
</li>
</ul>
<br>

<h2 id="컨테이너-관리의-어려움">컨테이너 관리의 어려움</h2>
<ul>
<li><p>서비스의 규모가 커질수록 다수의 컨테이너를 관리하기가 어려워진다.</p>
</li>
<li><p>컨테이너 하나하나 일일히 관리하기 어렵다.</p>
</li>
<li><p>서비스 이상, 부하 모니터링이 힘들다.</p>
</li>
<li><p>롤아웃/롤백 같은 버전 관리가 힘들다.</p>
</li>
</ul>
<br>

<h2 id="컨테이너-오케스트레이션-container-orchestration">컨테이너 오케스트레이션 (Container Orchestration)</h2>
<ul>
<li><p>복잡한 컨테이너 환경을 효과적으로 관리하기 위한 도구이다.</p>
</li>
<li><p>기존 서버 관리자가 하는 일들을 대신 해주는 프로그램이다.</p>
</li>
<li><p>Kubernetes(K8S), AWS EKS, Docker Swarm 등과 같은 서비스들이 존재한다.</p>
</li>
</ul>
<br>

<h2 id="컨테이너-오케스트레이션의-특징">컨테이너 오케스트레이션의 특징</h2>
<h3 id="cluster---클러스터-관리">Cluster - 클러스터 관리</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/084a8156-ec9c-46b8-a41f-c3c941d31019/image.png" alt=""> 출처: <a href="https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb">https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb</a></p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/cf205627-5f6d-46ce-ac28-eef55350741e/image.png" alt=""> 출처: <a href="https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb">https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb</a></p>
</blockquote>
<ul>
<li><p>컨테이너 오케스트레이션에서는 노드 단위가 아닌 클러스터 단위로 관리를 하게 된다. </p>
</li>
<li><p>마스터 노드를 통해 클러스터 내의 노드들을 관리한다.</p>
</li>
<li><p>클러스터 내의 노드끼리는 네트워크 통신이 원할히 되도록 설정해줘야 한다. </p>
</li>
<li><p>다수의 노드가 동작해도 문제가 없도록 노드 스케일을 신경써야 한다.</p>
</li>
</ul>
<br>

<h3 id="state---상태-관리">State - 상태 관리</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/e7b65f7d-cf16-46f8-bdb9-84282d217af5/image.png" alt="">출처: <a href="https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb">https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb</a></p>
</blockquote>
<ul>
<li><p>컨테이너 오케스트레이션은 컨테이너의 상태들을 주기적으로 확인하며 관리한다.</p>
</li>
<li><p>예를 들어, 컨테이너에 문제가 생기면 해당 컨테이너를 제거하고 새로운 컨테이너를 생성하게 된다. </p>
</li>
</ul>
<br>

<h3 id="scheduling---배포-관리">Scheduling - 배포 관리</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/168bd155-6dd0-4185-b68c-23c4e9544c80/image.png" alt="">출처: <a href="https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb">https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb</a></p>
</blockquote>
<ul>
<li>서버의 여유에 따라 추가적인 애플리케이션을 배치하거나, 추가로 컨테이너를 생성하여 해당 컨테이너에 애플리케이션을 배치해준다.</li>
</ul>
<br>

<h3 id="rolloutrollback---배포-버전관리">Rollout/Rollback - 배포 버전관리</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/d6263798-90b4-460a-aef6-aae7c16714df/image.png" alt=""> 출처: <a href="https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb">https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb</a></p>
</blockquote>
<ul>
<li>컨테이너 각각 버전 관리를 하지 않고, 중앙에서 버전관리를 할 수 있다. </li>
</ul>
<br>

<h3 id="service-discovery---서비스-등록-및-조회">Service Discovery - 서비스 등록 및 조회</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/f9e9bc1b-ce9b-4444-81cc-a5e807089cd2/image.png" alt=""> 출처: <a href="https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb">https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb</a></p>
</blockquote>
<ul>
<li>웹 저장소 설정에 변동이 생길 시 프록시 서버가 자동적으로 설정을 변경하고 관련 프로세스를 자동으로 재시작해준다.</li>
</ul>
<br>

<h3 id="volume---볼륨-스토리지">Volume - 볼륨 스토리지</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/summer_today/post/e5b54baf-995e-4825-9ea5-e12d84ef99ba/image.png" alt=""> 출처: <a href="https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb">https://www.youtube.com/watch?v=Ia8IfowgU7s&amp;list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb</a></p>
</blockquote>
<ul>
<li>노드마다 일일히 볼륨 스토리지를 마운트 하지 않고 간편한 설정으로 가능하게 해준다. </li>
</ul>
<br>
<br>
<br>
본 포스팅은 다음 내용을 참고하여 작성되었습니다.<br>
[초보를 위한 쿠버네티스 안내서] 컨테이너 오케스트레이션이란? - https://www.youtube.com/watch?v=Ia8IfowgU7s&list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb















]]></description>
        </item>
    </channel>
</rss>