컨테이너 인프라 환경(3) 쿠버네티스 3.쿠버네티스 오브젝트 & 활용

InSeok·2023년 3월 4일
0

파드 생성

kubectl run nginx-pod(파드이름) --image=nginx(생성할이미지이름)

  • 간단하게 생성가능
  • 단일 파드 1개만 생성되고 관리된다.(과자 1개)

kubectl create deployment 파드이름 이미지이름

  • Deployment라는 관리 그룹내에서 파드가 생성된다. (상자속 과자1개)

오브젝트

  • 파드와 디플로이먼트는 스펙과 상태등의 값을 가지고 있다.
  • 오브젝트 : 파드와 디플로이먼트를 개별 속성을 포함해 부르는 단위

기본 오브젝트

  • 파드
    • 쿠버네티스에서 실행되는 웹 서비스 구동하는데 필요한 최소단위
    • 독립적인 공간과 사용가능한 IP를 가지고있다.
    • 하나의 파드는 1개 이상의 컨테이너를 갖고 있기 때문에 여러기능을 묶어 하나의 목적으로 사용할 수 있다.
  • 네임 스페이스
    • 쿠버네티스 클러스터에서 사용되는 리소스들을 구분해 관리하는 그룹
    • 기본 - default
    • kube-system : 쿠버네티스 시스템에 사용됨
    • metallb-system : 온프레미스에서 쿠버네티스를 사용할 경우 쿠버네티스 클러스터 내부로 접속하게 도와주는 컨테이너들이 속해있다.
  • 볼륨
    • 파드가 생성될 때 파드에서 사용할 수 있는 디렉터리를 제공
    • 파드는 영속되는 개념이 아니라 제공되는 디렉터리도 임시로 사용된다.
    • 하지만, 파드가 사라지더라도 저장과 보존이 가능한 디렉터리를 볼륨 오브젝트를 통해 생성하고 사용할 수있다.
  • 서비스
    • 파드는 클러스터 내에서 유동적이기 때문에 접속 정보가 고정일 수 없다.
    • 파드 접속을 안정적으로 유지하도록 서비스를 통해 내/외부로 연결된다.
    • 서비스는 새로 파드가 생성될 때 부여되는 새로운 IP를 기존에 제공하던 기능과 연결해 준다.
    • 서비스는 쿠버네티스 외부에서 쿠버네티스 내부로 접속할 때 내부가 어떤 구조로 돼 있는지, 파드가 살았는지 죽었는지 신경 쓰지 않아도 이를 논리적으로 연결한다.
    • 로드밸런서, 게이트웨이와 비슷한 역할

디플로이먼트

  • 기본 오브젝트의 한계를 보완하고 좀 더 효율적으로 작동하도록 기능들을 조합하고 추가해 구현한 것
  • 파드에 기반을 두며, 레플리카셋 오브젝트를 합쳐 놓은 형태
  • API 서버와 컨트롤러 매니저는 파드 생성 감시 뿐만아니라 디플로이먼트 처럼 레플리카셋을 포함하는 오브젝트의 생성도 감시한다.
  • kubectl delete deployemnt dpy-hname

레플리카셋으로 파드 수 관리

  • 레플리카 셋은 파드수를 보장하는 기능을 제공한다.
    • 파드의 개수를 지정한대로 맞춰주는 역할
    • ex) 파드수를 3개로 증가
    • kubectl scale deployment dpy-nginx --replicas=3

스펙을 지정해 오브젝트 생성

  • 오브젝트 스펙
    • 일반적으로 yaml 문법으로 생성
    • 파일구조
      • apiVersion: apps/v1 : API 버전
      • kind: Deployment : 오브젝트 종류
      • metadata
        • 디플로이먼트 이름
        • 디플로이먼트의 레이블
      • spec
        • 레플리카셋을 몇 개 생성할지
        • 셀렉터의 레이블 지정
        • 템플릿의 레이블 지정
        • 템플릿에서 사용할 컨테이너 이미지 지정

apply로 오브젝트 생성하고 관리

  • kubectl apply -f ~/파일경로
    • 파일 변경 사항 적용
    • 변경 가능성이 있는 복잡한 오브젝트는 파일로 작성한후 apply로 적용하는 것이 좋다.

파드의 컨테이너 자동 복구

  • 쿠버네티스는 거의 모든 부분이 자동 복구되도록 설계되어있다.
  • 셀프 힐링 : 파드의 자동 복구 기술
    • 제대로 작동하지 않는 컨테이너를 다시 시작하거나 교체해 파드가 정상적으로 작동하게 한다.
    • 파드에 접속하려면 파드 IP를 알아야 한다.
  • kubectl exec -it nginx-pod -- /bin/bash
    • nginx-pod의 컨테이너에서 배시 셸을 실행

kubectl exec에서 — 은 인자값을 나눌 때 사용한다.

파드 동작보증 기능

  • 파드 자체에 문젝 발생하면 파드르 자동 복구해서 파드가 항상 동작하도록 보장한다.
  • 디플로이먼트에 속하지 않은 일반파드는 삭제요청시 정상적으로 삭제된다.
  • 디플로이먼트에 속한 파드의 경우, 임의로 파드를 삭제하면 replicas가 삭제된 파드를 확인하고 파드의 총 개수를 다시 맞추기위해 새로운 파드를 1개 생성한다.
  • 디플로이먼트에 속한 파드는 상위 디플로이먼트를 삭제해야 파드가 삭제된다.

노드 자원 보호

  • 노드는 쿠버네티스 스케줄러에서 파드를 할당받고 처리하는 역할
  • 쿠버네티스는 파드를 각 노드로 공평하게 배분하는 특징이 있다.
  • kubectl cordon 노드이름
    • 해당 노드에 파드가 할당되지 않게 스케줄되지 않는 상태로 변경한다.
  • kubectl uncordon 노드이름
    • 해당 노드를 다시 파드가 할당되게 변경

노드 유지보수

  • 유지보수를 위해 노드를 꺼야할 경우
    • drain 기능을 통해 지정된 노드의 파드를 전부 다른 곳으로 이동 시켜 해당 노드를 유지보수할 수 있게 한다.
    • kubectl drain 명령을 통해 유지보수할 노드를 파드가 없는 상태로 만든다.
      • 실제로 파드를 옮기는 것이아니라 노드에서 파드를 삭제하고 다른 곳에섣 다시 새엉한다.
      • DaemonSet은 각 노드에 1개만 존재하는 파드라서 drain으로는 삭제 할 수없다.
      • kubectl drain w3-k8s --ignore-daemonsets
      • 명령어를 통해 Daemonse을 무시하고 진행
      • 해당 노드는 SchedulingDisabled상태가 되고 uncordon 명령을 실행해 복귀시킬 수 있다.

파드 업데이트

  • --record 배포한 정보의 히스토리를 기록하는 옵션
  • rollout status 명령으로 변경상태 히스토리에 남김
  • rollout history 명령을 실행해 히스토리 확인가능
  • set image 명령으로 업데이트
  • 업데이트시 파드를 하나씩 순차적으로 지우고 업데이트된 버전으로 다시 생성한다.

업데이트 실패시 파드 복구

  • rollout undo 명령얼 명령실행을 취소 할 수 있다.

특정 시점으로 파드 복구

  • --to-revision 옵션으로 특정시점으로 돌아갈 수 있다.
  • kubectl rollout undo deployment rollout-nginx --to-revision=1
  • 새로 생성된 파드들의 IP를 확인

다양한 오브젝트

데몬셋

  • 디플로이먼트의 replicas가 노드 수 만큼 정해져 있는 형태
  • 노드하나당 파드 한개만 생성가능
  • 노드를 관리하는 파드라면 데몬셋으로 만드는게 효율적이다.

컨피그맵

  • 설정을 목적으로 사용하는 오브젝트

kubectl delete pods —all 모든 파드 삭제

PV & PVC

  • 파드에서 생성한 내용을 기록하고 보관하거나 모든 파드가 동일한 설정 값을 유지하고 관리하기 위해 공유된 볼륨으로부터 공통된 설정을 가지고 올수 있도록 설계해야 할때도있다.
  • PVC(persistentVolumeClaim)
    • 지속적으로 사용가능한 볼륨 요청
    • PVC를 사용하려면 PV로 볼륨을 선언해야한다.
    • 준비된 볼륨에서 일정공간을 할당받는다.
  • PV(PersistentVolume)
    • 지속적으로 사용가능한 볼륨
    • 볼륨을 사용할 수 있게 준비하는 단계
  • PV와 PVC가 연결되면 상태가 Bound 로 변경 된다.
  • PV와 PVC를 구성하는 주체가 관리자와 사용자로 나뉘다.
  • 관리자와 사용자가 나뉘어 있지 않다면 PV와 PVC를 통하지 않고 바로 파드에 공유가 가능한 NFS 볼륨을 마운트 할 수 있다.

스테이트풀셋

  • 스테이트 풀셋은 volumeClaimTemplates 기능을 사용해 PVC를 자동으로 생성할 수 있고, 각파드가 순서대로 생성되기 때문에 고정된 이름, 볼륨, 설정등을 가질 수 있다.
  • 스테이트풀셋은 일반적으로 헤드리스 서비스로 노출한다.
    • 상태를 가지고 있는 오브젝트를 모두 노출하지 않고 상태값을 외부에 알리고 싶은 것만 선택적으로 노출하게 할 수 있다.
    • volumeClaimTemplate를 이용해 자동으로 각파드에 독립적인 스토리지를 할당해 구성할 수 있다.
profile
백엔드 개발자

0개의 댓글