이전 내용
[Cloud] aws : aws cli 로 쿠버네티스 클러스터 만들기
이전 내용 [Cloud] aws : aws console로 쿠버네티스 클러스터 만들기이전 내용 [Cloud] aws: ECR(Amazon Elastic Container Registry)이전 내용 [Cloud] 도커로 DB 연결하기이전 내용 [Cloud] 컨테이너 이미지 경량화 시
puppy-foot-it.tistory.com
eksctl과 kubectl
개념, 차이점
eksctl과 kubectl은 모두 Kubernetes와 관련된 도구이지만, 각각의 목적과 기능이 다르다.
1. 목적
- eksctl:
- 주로 Amazon EKS (Elastic Kubernetes Service) 클러스터를 생성하고 관리하는 데 사용.
- 클러스터와 관련된 VPC, 노드 그룹, IAM 역할 등의 설정을 간편하게 처리할 수 있도록 도움.
- 클러스터 생성을 위한 기본적인 YAML 구성 파일을 사용할 수 있으며, 이를 통해 복잡한 설정을 쉽게 자동화 가능.
- kubectl:
- Kubernetes 클러스터에 배포되고 실행되는 애플리케이션을 관리하는 도구. (쿠버네티스 API를 사용하여 쿠버네티스 클러스터의 컨트롤 플레인과 통신하기 위한 커맨드라인 툴)
- 클러스터 내 리소스(예: Pods, Deployments, Services 등)의 생성, 조회, 수정 및 삭제와 같은 작업 수행.
- 사용자가 클러스터의 상태를 모니터링하며 애플리케이션의 로그를 확인하는 등의 운영 관리에 초점.
2. 기능
- eksctl:
- EKS 클러스터를 쉽게 생성, 업데이트 및 삭제할 수 있는 기능 제공.
- VPC 및 서브넷 설정, IAM 역할 생성 등을 포함하여, EKS 클러스터와 관련된 모든 인프라 리소스 관리.
- YAML 형식의 구성 파일을 통해 클러스터 설정을 정의하는 방식 지원.
- kubectl:
- Kubernetes API와 통신하여 클러스터 내 리소스를 직접 관리.
- 사용자가 정의한 Deployment, Service 등의 리소스를 생성하고 상태를 모니터링하며, 로그 조회와 같은 디버깅 작업 수행.
- 다양한 간편한 명령어를 통해 클러스터 업무를 수행할 수 있도록 설계.
- eksctl은 EKS 클러스터 생성을 위한 도구로, 인프라 리소스를 관리하는 데 중점
- kubectl은 Kubernetes 클러스터 내에서 애플리케이션 리소스를 관리하고 운영하는 데 사용.
eksctl: eks 클러스터 생성이나 설정에 사용
kubectl: 생성된 클러스터 내의 애플리케이션 관리에 사용
eksctl
클러스터 생성 (feat. yaml 파일)
kubectl 명령어를 시연하기 위해 cluster.yaml 파일을 생성한 후 클러스터 생성
eksctl create cluster -f cluster.yaml
클러스터 생성 완료 (aws console의 Cloud Formation 에서도 진행 상황 확인 가능)
인스턴스와 Auto Scailing 그룹도 생성된 것을 확인할 수 있다.
Kubernetes 리소스
파드, 네임스페이스, Deployment
- 파드(Pod)는 가장 기본적인 실행 단위로, 하나 또는 여러 개의 컨테이너를 포함할 수 있는 논리적 호스팅 환경이다. 파드는 Kubernetes 클러스터에서 애플리케이션을 실행하기 위해 필요한 모든 리소스를 묶어서 제공한다.
- 네임스페이스(Namespace)는 클러스터 내에서 여러 사용자와 팀이 리소스를 분리하고 관리할 수 있도록 해주는 가상 공간이다. 네임스페이스를 활용하면 동일한 클러스터에서 서로 다른 환경(예: 개발, 테스트, 운영)을 효과적으로 구성하고 격리할 수 있다.
- 네임스페이스 내의 Deployment는 특정 어플리케이션을 실행하기 위한 파드를 관리하는 Kubernetes 리소스다.
[네임스페이스 (Namespace)]
- 목적: 리소스를 논리적으로 그룹화하여 관리할 수 있도록 한다. 다양한 사용자와 팀이 동일한 클러스터를 사용하더라도 서로의 리소스에 영향을 주지 않게 된다.
- 기본 네임스페이스
- default: 기본 네임스페이스. 별도로 네임스페이스를 지정하지 않으면 이곳에 리소스가 생성된다.
- kube-system: Kubernetes 시스템 컴포넌트가 실행되는 네임스페이스.
- kube-public: 모든 사용자에게 읽기 가능하도록 설정된 네임스페이스.
[Deployment]
Deployment는 선언적(descriptive) 방식으로 애플리케이션을 배포하고 관리하는 Kubernetes 리소스다. 이를 통해 특정 버전의 애플리케이션을 원하는 만큼 실행하고, 필요할 때 롤링 업데이트를 수행하며, 이전 버전으로 복구할 수 있다.
- 구성 요소
- 레플리카 수: Deployment에 의해 관리되는 파드의 수 정의.
- 파드 템플릿: 파드의 구성과 속성을 정의하는 부분으로, 어떤 컨테이너 이미지를 사용할 것인지, 환경 변수는 무엇인지 등을 포함.
- 업데이트 전략: 파드를 업데이트하는 방법(롤링 업데이트 또는 재배포)을 정의
★ Deployment 생성 예제
▶ Kubernetes YAML 파일을 사용하여 네임스페이스 내에서 Deployment를 생성하는 예제
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: my-namespace # 특정 네임스페이스 지정
spec:
replicas: 3 # 생성할 파드 수
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2 # 사용할 컨테이너 이미지
ports:
- containerPort: 80
이 파일을 통해 my-namespace라는 네임스페이스 내에 nginx를 실행하는 Deployment가 생성되는데, 이 때 생성을 위해 사용하는 명령어는 아래와 같다.
kubectl apply -f <filename>.yaml
★ Deployment를 관리하는 주요 명령어
상태 확인
kubectl get deployments -n <namespace>
Deployment 상세 정보 확인
kubectl describe deployment <deployment-name> -n <namespace>
Deployment 업데이트
kubectl set image deployment/nginx-deployment nginx=nginx:latest -n <namespace>
Deployment 삭제:
kubectl delete deployment <deployment-name> -n <namespace>
[파드(pod)]
- 파드의 구성 요소
- 컨테이너: 파드는 하나 이상의 컨테이너를 포함할 수 있으며, 일반적으로 같은 애플리케이션의 여러 구성 요소를 실행한다. 예를 들어, 웹 서버와 데이터베이스 서버가 함께 동작할 수 있다.
- 공유 네트워크: 동일한 파드 내에 포함된 모든 컨테이너는 같은 IP 주소와 포트 공간을 공유한다. 이를 통해 컨테이너 간의 통신이 쉽게 이루어진다.
- 스토리지: 파드는 영구 저장소를 연결하거나 공유할 수 있는 볼륨을 정의할 수 있다. 이를 통해 컨테이너가 데이터를 저장하고 관리할 수 있도록 한다.
- 환경 변수 및 설정: 파드에는 환경 변수나 설정 파일 등을 정의하여 컨테이너가 이를 사용할 수 있도록 설정할 수 있다.
[파드의 유형]
- 싱글 컨테이너 파드: 일반적으로 단일 컨테이너를 포함하는 가장 일반적인 형태.
- 멀티 컨테이너 파드: 서로 협력하여 동작하는 여러 개의 컨테이너를 포함하며, 이들은 같은 IP와 네트워크 공간을 공유. 이러한 경우 일반적으로 "사이드카 패턴"이나 "엉클 패턴"과 같은 디자인 패턴이 사용된다.
[파드의 생명주기]
- 생성: 파드는 주로 Deployment 또는 StatefulSet과 같은 상위 리소스에 의해 생성.
- 실행: 생성된 후 Kubernetes가 해당 파드를 노드에서 실행.
- 재시작: 만약 파드 내의 컨테이너가 실패하면, Kubernetes에서 이를 감지하고 자동으로 재시작.
- 삭제: 파드에 대한 요청이 있을 경우, 해당 파드는 종료되고 클러스터에서 제거 됨.
★ 파드(POD)를 관리하는 주요 명령어
모든 파드 목록 조회
kubectl get pods
특정 파드의 상세 정보 조회
kubectl describe pod <pod-name>
파드 생성을 위한 YAML 파일 예
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
파드 생성 명령어
kubectl apply -f <filename>.yaml
kubectl
주요 명령어
CLI 명령어 자동완성 기능 추가
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
클러스터 정보 조회
kubectl cluster-info
모든 노드 상태 조회
kubectl get nodes
kube-system 네임스페이스 내의 모든 파드(pod)를 조회.
※ kube-system 네임스페이스는 Kubernetes 시스템 컴포넌트가 실행되는 공간으로, 클러스터의 기본적인 기능을 제공하는 파드들이 포함되어 있다.
kubectl get pod -n kube-system
클러스터 내의 모든 노드(nodes)의 상태를 조회
※-o wide 옵션을 사용하면 각 노드의 IP 주소, 오퍼레이터, 리소스 및 추가적인 세부정보가 포함된 좀 더 자세한 정보를 제공
kubectl get nodes -o wide
Deployment 를 위한 yaml 파일 생성
vi webserver-deploy.yaml
webserver-deploy.yaml 파일 내용
apiVersion: apps/v1
kind: Deployment
metadata:
name: webui
spec:
replicas: 4
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: ECR 에서 이미지 URL 복사 붙여넣기
tolerations:
- key: "role"
operator: "Equal"
value: "web"
effect: "NoSchedule"
둘의 내용이 같다면, 경량화된 이미지를 선택하는 것이 바람직하다.
webserver-deploy.yaml 파일을 이용한 Deployment 생성
kubectl apply -f webserver-deploy.yam
webui라는 Deployment를 외부에서 접근할 수 있도록 LoadBalancer 타입의 서비스(service)로 노출.
--port=80 옵션은 서비스가 외부와 통신할 포트를 설정하는 옵션으로, 클라이언트는 이 포트를 통해 서비스에 접근할 수 있다.
kubectl expose deployment webui --port=80 --type=LoadBalancer
새로운 Deployment webserver를 생성.
이 Deployment는 지정된 도커 이미지(예: 도커허브계정/이미지명)를 사용하는 파드를 생성하며, --replicas=3 옵션을 통해 3개의 파드를 생성한다. --port=80은 컨테이너 내에서 사용할 포트를 설정한다.
kubectl create deployment webserver --port=80 --image=도커허브계정/이미지명 --replicas=3
간단한 파드를 생성하여 nginx:1.14 이미지를 사용하여 실행.
이 명령어는 주로 테스트나 간단한 사용을 위한 새로운 파드를 만들 때 사용된다.
kubectl run nginx --image=nginx:1.14
클러스터 내의 모든 Deployment를 삭제 (실행 중인 애플리케이션의 모든 Deployment)
kubectl delete deployments.apps --all
현재 네임스페이스 내의 모든 리소스(파드, 서비스, Deployment 등)를 삭제
kubectl delete --all all
새로운 Deployment web를 생성
▶ nginx:1.14 이미지를 사용하여 파드를 만들고, 컨테이너의 포트를 80으로 설정
web이라는 Deployment의 파드 수를 3개로 조정
kubectl create deployment web --image=nginx:1.14 --port=80
# kubectl scale deployment [Deployment 이름] --replicas=파드 수
kubectl scale deployment web --replicas=3
[그 외 주요 명령어들]
◆ 목록 조회
kubectl get pods # 모든 파드 목록 조회 (현재 네임스페이스에서)
kubectl get pods -n <namespace> # 특정 네임스페이스의 파드 목록 조회
kubectl get deployments # Deployment 목록 조회
kubectl get services # Service 목록 조회
◆ 상세 정보 조회
kubectl describe pod <pod-name> # 특정 파드 정보 조회
kubectl describe deployment <deployment-name> # 특정 Deployment의 상세 정보 조회
◆ 리소스 생성
kubectl create deployment nginx --image=nginx # Deployment 생성
kubectl expose deployment nginx --port=80 --type=LoadBalancer # 서비스 생성
◆ 리소스 수정
kubectl label pod <pod-name> key=value # 파드 수정
kubectl apply -f <filename>.yaml # Kubernetes 객체 설정 파일로 리소스 생성 또는 수정
◆ 리소스 삭제
kubectl delete pod <pod-name> # 파드 삭제
kubectl delete deployment <deployment-name> # deployment 삭제
kubectl delete pods --all -n <namespace> # 네임스페이스 내 모든 파드 삭제
◆ 로그 확인
kubectl logs <pod-name> # 특정 파드의 로그 조회
kubectl logs <pod-name> -c <container-name>
# 특정 컨테이너의 로그 조회 (하나의 파드 내 여러 컨테이너 있을 경우)
◆ 실시간 모니터링
kubectl get pods --watch
◆ 파드 내 쉘 접속
kubectl exec -it <pod-name> -- /bin/sh
[도움되는 링크]
AWS CLI
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-awscli.html
eksctl
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/getting-started-eksctl.html
ekcstl 명령어 안내
https://eksctl.io/usage/creating-and-managing-clusters/
kubectl 명령어 안내
https://kubernetes.io/ko/docs/reference/kubectl/
다음 내용
[Cloud] aws: Network LoadBalancer (feat. AWS CLI + yaml 파일)
'프로그래밍 및 기타 > Cloud : AWS' 카테고리의 다른 글
[Cloud] aws: Network LoadBalancer (feat. AWS CLI + yaml 파일) (1) | 2025.03.04 |
---|---|
[Cloud] aws : aws cli 로 쿠버네티스 클러스터 만들기 (0) | 2025.03.01 |
[Cloud] 쿠버네티스(Kubernetes) 란? (0) | 2025.03.01 |
[Cloud] aws: ECR(Amazon Elastic Container Registry) (0) | 2025.02.27 |
[Cloud] 도커로 DB 연결하기 (0) | 2025.02.27 |