[Kubernetes] 쿠버네티스 실습 2 - 기본 사용법(1) II

29 Nov 2023 - juno

#cloud  #kubernetes 


2023-11-29 클라우드 프로그래밍 13주차 강의


디플로이먼트

디플로이먼트와 서비스 사용

디플로이먼트

디플로이먼트 배포 전략

디플로이먼트와 서비스 사용하기(실습)

    기존 디플로이먼트 삭제 후 다시 시작
    이미지만 삭제해도 파드들은 종속성이 있기 때문에 그 이미지를 사용한 파드들이 모두 삭제된다.

디플로이먼트 yaml 파일 생성

#nano 텍스트 편집기 사용
nano nginx-deploy.yaml

yaml 파일 내용

apiVersion: apps/v1
kind: Deployment
metadata:               # 디플로이먼트 정보
  name: nginx-deployment    # nginx-deploy라는 이름의 디플로이먼트 생성
  labels:
    app: nginx      # 디플로이먼트의 레이블
spec:       # 디플로이먼트의 spec
  replicas: 2     # 2개의 파드 생성
  selector:     # 디플로이먼트가 관리할 파드를 선택
    matchLabels:
      app: nginx      # 디플로이먼트는 nginx 레이블을 갖는 파드를 선택해 관리
  template:   # template에 정의된 내용에 따라 파드를 생성
    metadata:
      labels:
        app: nginx      # 생성될 파드의 레이블
    spec:     # 컨테이너에 대한 정보, 컨테이너에 대한 spec
      containers:
      - name: nginx   # 컨테이너의 이름
        image: nginx:latest   # 사용할 이미지 (Nginx 웹 서버 이미지)
        ports:
        - containerPort: 80   # 컨테이너가 리스닝하는 포트 (80번 포트로 설정)

Metadata:

Spec (Deployment의 Spec):

※ Kubernetes의 Deployment에서는 기본적으로 ‘RollingUpdate’ 배포 전략을 사용

만약 배포전략을 바꾼다면 이런식으로 써준다.

# Deployment 배포전략 수정
spec:
  strategy:
    type: Recreate #기존파드 삭제 후 새 파드 생성

yaml 파일을 사용하여 디플로이먼트 생성

kubectl apply -f nginx-deploy.yaml

배포한 디플로이먼트 목록 확인

kubectl get deployments

파드 목록 확인

kubectl get pod

※ 외부에서 접속하게 하기 위해서는 서비스를 생성해야한다.

서비스는 파드로 분류되지만 논리적으로는 파드로 생각하지 않아도된다.

서비스 yaml 파일 생성

#nano 텍스트 편집기 사용
nano nginx-svc.yaml

서비스 yaml 내용

apiVersion: v1
kind: Service
metadata:
  name: my-nginx  # 서비스의 이름
  labels:
    run: my-nginx  # 레이블 (run: my-nginx) 설정
spec:
  type: NodePort  # 서비스 유형을 노드포트로 설정, 
  ports:
  - port: 8080  # 서비스가 리스닝하는 포트 (클러스터 내부에서 접근하는 포트)
    targetPort: 80  # 백엔드 파드가 리스닝하는 포트
    protocol: TCP  # 프로토콜 설정 (TCP)
    nodePort: 30000  # 노드포트 번호 지정 (클러스터 외부에서 접근하는 포트)
    name: http  # 포트의 이름
  selector:
    app: nginx  # 파드 선택자 설정 (app: nginx 레이블을 가진 파드와 연결)
  • spec: type: -> ①NodePort, ②LoadBalancer(kubectl get services 로 외부 서비스 IP 확인), ③ClusterIP(클러스터 내부에서만 접속, 외부접속 X)
  • port: 8080 # 서비스가 리스닝하는 포트 (클러스터 내부에서 접근하는 포트)
    • targetPort: 80 # 백엔드 파드가 리스닝하는 포트
    • nodePort: 30000 # 노드포트 번호 지정 (클러스터 외부에서 접근하는 포트)

*클라우드 그림노트 참고하기

※ 기본 서비스 포트 정책 읽어보기

yaml 파일을 사용하여 서비스 생성

kubectl apply -f nginx-svc.yaml

서비스 상태 정보 확인

#서비스 목록 확인 명령어
kubectl get svc

파드 위치 확인하기

#파드 상세 정보 확인하는 명령어
kubectl get pods -o wide

노드 IP 확인

#노드 상세 정보 확인하는 명령어
kubectl get nodes -o wide

웹 브라우저에서 노드의 IP와 서비스의 포트번호를 이용해서 파드에 접속하기

※ 서비스의 노드벨런싱 정책

selector: app: nginx -> 파드 선택자 설정 (app: nginx 레이블을 가진 파드와 연결), 이름기반의 선택을 할 수 있게끔 해준다 이러한 것을 활용하여 같은 포트번호로 특정 pod로 접속할 수 있게끔 할 수 있음

레플리카셋 사용

레플리카셋

레플리카셋 사용(실습)

레플리카셋 yaml 파일 생성

#nano 텍스트 편집기 사용
nano replicaset.yaml

레플리카셋 yaml 내용

apiVersion: apps/v1
kind: ReplicaSet    
metadata:
  name: 3-replicaset    # 레플리카 이름
spec:
  template:
    metadata:
      name: 3-replicaset
      labels:
        app: 3-replicaset
    spec:
      containers:
      - name: 3-replicaset    
        image: nginx
        ports:
        - containerPort: 80
  replicas: 3 # 3개의 파드 생성    
  selector:
    matchLabels:
      app: 3-replicaset

apiVersion: 리소스를 정의하는데 사용되는 Kubernetes API의 버전을 나타냄. apps/v1. kind: 생성하려는 리소스의 종류를 나타냄. ReplicaSet. metadata: 리소스에 대한 메타데이터를 제공함.

yaml 파일을 사용하여 레플리카셋 생성

kubectl apply -f replicaset.yaml

레플리카셋과 파드 정보 확인

#레플리카셋과 파드 목록 확인 명령어
kubectl get replicaset,pods

파드 하나 삭제

#파드 삭제 명령어
kubectl delete pod 3-replicaset-jmv9f

레플리카셋과 파드 목록 재확인

#레플리카셋과 파드 목록 확인 명령어
kubectl get replicaset,pods

레플리카셋 파드 개수 늘리기

#레플리카를 늘리는 명령어
kubectl scale replicaset/3-replicaset --replicas=5

레플리카셋과 파드 정보 확인

#레플리카셋과 파드 목록 확인 명령어
kubectl get replicaset,pods

파드는 유지하되, 레플리카셋만 삭제

#파드는 유지하고 레플리카셋만 삭제해주는 명령어
kubectl delete -f replicaset.yaml --cascade=orphan
    replicaset.yaml 파일에서 레플리카셋의 옵션을 날려준다.
    * 파일 기반이아니라 그냥 없앨 수도 있음
  • 디플로이먼트는 관리자기 때문에 종속성을 가지고 디플로이먼트를 삭제하면 파드전체가 삭제된다.
  • 레플리카셋은 정책 같은 거라서 종속성을 가지지 않음 그래서 레플리카셋을 지워도 파드들이 지워지지 않고 남아있음
    • 하지만 기존처럼 파드를 지워도 더이상 재생성되지는 않음

reference

교수님 강의 및 블로그, hull.kr