일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- LG Aimers 4th
- 분류
- supervised learning
- 해커톤
- 회귀
- Classification
- 티스토리챌린지
- deep learning
- PCA
- LG
- ChatGPT
- regression
- LG Aimers
- OpenAI
- AI
- 머신러닝
- 지도학습
- 딥러닝
- Machine Learning
- 오블완
- LLM
- gpt
- GPT-4
- Today
- Total
SYDev
[Docker & Kubernetes] 5주차 정리 (1) - Chapter 9. 쿠버네티스 기초 본문
9.1. 쿠버네티스 둘러보기
9.1.1. 쿠버네티스 구성
- 마스터 노드: client의 API 요청을 받고 워커 노드를 다루는 역할
- 워커 노드: 실제 컨테이너를 실행하는 역할
kubectl cluster-info
kubectl get nodes
kubectl get pod
kubectl get pod -o wide
kubectl delete pod <pod 이름>
- kubectl cluster-info: 쿠버네티스 클러스터 정보 확인
- kubectl get nodes: 쿠버네티스 클러스터 구성 노드 정보 확인
- kubectl get pod: 파드 목록 확인 -> -o wide 옵션: 더 자세한 정보
- kubectl delete pod: 파드 삭제
9.1.2. 파드 실행
kubectl run hello-world --image=hello-world --restart=Always pod/hello-world created
kubectl get all
sudo kubectl delete pod hello-world
-> hello-world 이미지를 활용해 파드를 실행
- kubectl get all: 파드 & 서비스 정보 확인
- CrashLoopBackOff: 컨테이너가 재시작되기 전에 대기하고 있는 상태
9.1.3. manifest를 활용한 파드 실행
- Manifest: kubernetes object를 생성하기 위한 메타 정보(YAML 혹은 JSON 형식)
apiVersion: v1
kind: Pod
metadata:
name: nginx01
spec:
containers:
- name: nginx-test01
image: nginx:latest
- nginx-test01.yml 파일 생성
- apiVersion: v1
- kind: 생성할 object의 종류
- metadata: 생성할 오브젝트의 메타 정보 작성
- name: 다른 오브젝트와 구분할 수 있는 식별자
- spec: 앞으로 생성할 파드의 상태를 지정하는 구문
- containers: 파드에 포함될 컨테이너들을 지정
- > nignx-test01을 nginx:latest 이미지를 통해 생성
kubectl apply -f nginx-test01.yml
kubectl get pod
- apply -f [파일이름]: -f 옵션은 filename을 의미
9.2. Deployment
9.2.1. Deployment 개념
- Replicaset: 원하는 파드 개수만큼 유지시켜주는 역할을 하는 컨트롤러
- Deployment: replicaset을 관리하는 controller
9.2.2. Deployment 실행
kubectl create deployment deploy-hello --image=hello-world
kubectl get all
- kubectl get pod
- kubectl get replicaset
- kubectl get deployment
9.2.3. Replicaset 조정
kubectl create deployment deploy-nginx --image=nginx --replicas=3
kubectl get deploy,rs,po
- replicas: 파드 개수 설정
- deployment, replicaset, pod 정보 확인
-> 3개의 pod 실행
- wide -o: 상세정보
-> pod를 하나 삭제해도 3개를 유지하기 위해 pod를 하나 새로 생성
9.2.4. Manifest를 활용한 Deployment 실행
파일명: deploy-test01.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-test01
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: web-deploy
template:
metadata:
labels:
app.kubernetes.io/name: web-deploy
spec:
containers:
- name: nginx
image: nginx:latest
kubectl apply -f deploy-test01.yml
-> manifest를 이용하여 deployment 실행
9.2.5. Scale
- 스케일: deployment YAML 파일을 수정해서 파드 개수를 조정하는 것
-> 위 manifest 파일에서 replicas를 5로 변경
-> 5개의 pod 유지
9.2.6. Rollout
- Rollout: 쿠버네티스에서 컨테이너 업데이트를 의미
kubectl describe deployment deploy-test01
- describe 명령어로 실행 중인 Nginx의 버전 확인
diff deploy-test03.yml deploy-test04.yml
9.2.7. Rollback
- Rollback: Rollout 이전의 컨테이너 상태로 되돌리는 것
kubectl rollout undo deployment deploy-test01
9.3. Service
9.3.1. 서비스 개념
- 파드가 client에게 서비스를 제공하려면 해당 파드의 IP 주소를 알아야 함 -> pod는 일시적 존재로 수없이 생성 소멸을 반복
- Kubernetes Service: 논리적인 파드 셋을 정의하고, client가 그 파드들에 접근할 수 있는 정책을 정의하는 추상적 개념
- kubernetes service는 외부 트래픽 노출, 로드 밸런싱 및 pod들에 대한 service discovery를 가능하게 함
- Service Discovery: 서비스를 구성하는 개별 인스턴스를 찾는 프로세스
- 쿠버네티스 서비스를 활용하면 pod 내부를 수정하지 않아도 외부로 노출이 가능
- ClusterIP, NodePort, LoadBalancer, ExternalName이 존재 -> YAML의 spec에서 type 형태로 지정 가능
-> worker node에 존재하는 pods -> kubernetes service에 연결하여 kubernetes cluster 외부로 노출
9.3.2. ClusterIP
- ClusterIP: kubernetes service의 기본 설정값, cluster 내에서만 pod에 접근될 수 있도록 하는 유형
- Cluster 내부에서만 접근 가능한 IP 할당, 외부에서는 접근 불가
실습
- kind: service
- selector: 서비스에 연결할 pod
kubectl exec -it nginx01 -- /bin/bash
root@nginx01:/# curl "10.100.185.179"
- exec -it 명령어로 Nginx pod에 접속하여 셀을 실행
- Nginx pod 내부에서 curl 명령어로 kubernetes server IP 주소에 request 전송 -> 정상 수신
9.3.3. NodePort
- NodePort: 각 노드의 특정 포트를 통해 외부 접근을 제공하는 유형
- NAT를 사용하는 클러스터 내에서 각 노드들의 지정된 포트(30000 ~ 23767)를 외부에 노출시킴 -> <NodeIP>:<NodePort>
- clusterIP의 상위 집합
실습
- nodePort: 외부에서 접속하기 위해 사용하는 포트
- port: Cluster 내부에서 사용할 Service 객체의 포트
- targetPort: Service 객체로 전달된 요청을 Pod로 전달할 때 사용하는 포트
-> 포트포워딩 설정 추가
-> 31051 host port로 접속하면 10.0.2.5 노드의 NodePort 31001로 포트포워딩
-> 31061 host port로 접속하면 10.0.2.6 노드의 NodePort 31001로 포트포워딩
-> client에서 포트 31051로 접근하면 myserver02가 위치하는 노드의 NodePort 31001에 접근
-> NodePort 31001에 전달된 트래픽은 cluster NAT에 의해서 NodePort Service의 80번 포트에 전달됨
-> service 객체로 전달된 트래픽은 pod의 target port로 이동
9.3.4. LoadBalancer
- LoadBalancer: 외부용 LoadBalancer를 생성하고 서비스에 고정된 공인 IP를 할당 -> IP 및 포트 번호를 활용해 cluster 외부에서 서비스에 접근 가능
- NodePort의 상위 집합
실습
-> LoadBalancer를 활용하면 cluster 외부에서도 cluster 내부에 존재하는 pod에 접근 가능
9.3.5. ExternalName
- ExternalName: CNAME 레코드를 통해 클러스터 외부 서비스로의 DNS 조회를 제공하는 유형
- 서비스가 클러스터 외부에 있는 외부 도메인을 가리키도록 설정 가능
A record: DNS에 저장되는 정보의 타입으로 도메인 주소와 서버의 IP 주소가 직접 매핑시키는 방법
CNAME record: Canonical Name의 약자로 도메인 주소를 또 다른 도메인 주소로 매핑 시키는 형태의 DNS 레코드 타입
+ 추가 예정..
참고자료
- "한 권으로 배우는 도커 & 쿠버네티스", 장철원, 한빛미디어, 2024.04.29
- https://blog.naver.com/freepsw/221910012471
'KHUDA 6th > Study' 카테고리의 다른 글
[핸즈온 AWS] Chapter 9. AWS 오토 스케일링 서비스 (0) | 2024.08.21 |
---|---|
[핸즈온 AWS] Chapter 6. AWS 데이터베이스 서비스 (1) | 2024.08.14 |
[Docker & Kubernetes] 4주차 정리 (2) - Chapter 8. 쿠버네티스 실습 환경 구축 (0) | 2024.08.13 |
[Docker & Kubernetes] 4주차 정리 (1) - Chapter 7. 쿠버네티스의 기본 구조 (0) | 2024.08.10 |
[핸즈온 AWS] Chapter 5. AWS 스토리지 서비스 (0) | 2024.08.07 |