Notice
Recent Posts
Recent Comments
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

SYDev

[Docker & Kubernetes] 5주차 정리 (1) - Chapter 9. 쿠버네티스 기초 본문

KHUDA 6th/Study

[Docker & Kubernetes] 5주차 정리 (1) - Chapter 9. 쿠버네티스 기초

시데브 2024. 8. 20. 18:31

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 레코드 타입

 

+ 추가 예정..

 


참고자료

 

[kubernetes] nodeport, port, targetport 정리

Kubernetes에서 서비스 연결을 위해 사용하는 port 유형을 정리 1. Port 유형 정리 NodePort - 외부에...

blog.naver.com

 

DNS에서 CNAME과 A 레코드의 차이

가비아, 후이즈, 고대디 등의 DNS를 이용해서 커스텀 도메인을 사용할 때, 서브 도메인을 등록하기 위해서 CNAME과 A 레코드 같은 정보를 DNS 서비스 홈페이지에 등록해야한다. 둘 다 서브 도메인을

dev.plusblog.co.kr