핵심만 콕 쿠버네티스 (3) - kubectl 기초

김정욱·2022년 4월 21일
0
post-thumbnail

Kubectl 기초

[ 개념 ]

  • kubectl은 사용자가 쉽게 마스터와 통신할 수 있게 해주는 k8s 클라이언트 툴
  • k8s 클러스터를 컨트롤하기 위한 명령툴
  • k8s의 api서버는 REST API로 통신하지만, 보다 쉽게 사용자가 k8s를 제어할 수 있게 도와준다
  • 꼭 마스터 노드에 위치할 필요는 없다

[ Pod 생성 ]

[ 개요 ]

  • Pod 및 Object를 생성하는 3가지 방법
    • kubectl run
    • kubectl create
    • kubectl apply

[ kubectl run ]

  • command 형식 : kubectl run <NAME> --image <IMAGE>
  • 설명
    • 명령형 스타일의 단순 명령 / 1개의 단일 Pod를 생성
  • 단점
    • 1개의 단일 파드만 생성하는 사용의 제약이 존재
    • 실행중인 오브젝트의 설정을 변경하려면 ?
      • kubectl edit으로 설정 파일의 내용 변경 -> 실시간 반영?
      • kubectl replace로 컨테이너를 덮어씌우기 -> 중단되는 시간이 생김
/* 컨테이너 이미지를 통해 Pod 생성 */
kubectl run mynginx --image nginx

[ kubectl create ]

  • command 형식 : kubectl create <Object 타입> [<서브 타입>] <NAME>
  • 설명
    • 명령형 스타일 / 선언형 스타일 모두 가능한 명령
    • <서브 타입>Service Object의 ClusterIP / NodePort 같은 것을 의미
  • 단점
    • 명령형 커맨드 방식은 오브젝트 구성 manifest 파일을 기록하는 추가적인 수단이 필요 (관리)
    • 실행중인 오브젝트의 설정을 변경하려면 ?
      • kubectl edit으로 설정 파일의 내용 변경 -> 실시간 반영?
      • kubectl replace로 컨테이너를 덮어씌우기 -> 중단되는 시간이 생김
/* 명령형 스타일 */
kubectl create deployment nginx --image nginx

/* 선언형 스타일 */
kubectl create -f nginx.yaml

/* kubectl replace로 덮어쓰기 */
kubectl replace -f nginx.yaml

[ kubectl apply ]

  • command 형식 : kubectl apply -f <FILE_NAME>
  • 설명
    • 선언형 오브젝트 구성 / 정해진 manifest 파일의 규격으로 Pod 및 Object 생성
    • apply 선언형 명령 하나로 create / replace / scale 등의 명령형 명령의 역할을 수행 가능
      => 가장 선호되는 Object 관리 방식
    • apply로 실행된 Pod 및 오브젝트는 수정이 가능
/* Pod를 정의한 manifest파일을 통해 Pod를 생성 */
kubectl apply -f mynginx.yaml

/* 로컬 뿐만 아니라, 원격에 위치한 yaml 정의서도 가져와 사용할 수 있다 */
kubectl apply -f https:://.../pods/simple-pod.yaml

[ 주의해야할 점 ]

[ Pod 조회 ]

  • kubectl get <Object 타입> 명령을 통해 Pod 및 Object 조회 가능
  • Pod가 가질 수 있는 상태
    • Pending : k8s 마스터에 의해 생성 명령은 전달되었지만, 아직 실행되지 않은 상태
    • ContainerCreating : 특정 노드에 스케줄링되어 컨테이너를 생성중인 단계
    • Running : Pod가 정상적으로 실행되고 있는 상태
    • Completed : 계속 실행되는 프로세스가 아닌, 일회성으로 완료는 Pod의 완료를 의미
    • Error : Pod에 문제가 생겨 에러가 발생한 상태
    • CrashLoopBackOff : 지속적으로 에러 상태로 있어 crash가 반복되는 상태
/* 기본적인 Pod 조회 */
kubectl get pod

/* Pod의 구성 정보(manifest)를 자세히 보는 옵션 */
kubectl get pod mynginx -o yaml

/* Pod의 IP를 확인하는 옵션 */
kubectl get pod -o wide
혹은
kubectl get pod -owide

/* -n 옵션을 통해서 특정 namespace에 해당하는 mynginx 이름의 Pod 조회 */
kubectl get pod mynginx -n kube-system

/* --jsonpath 옵션을 통해 리소스의 특정 정보만 골라서 출력 */
kubectl get node master -o jsonpath="{.status.address[0].address}"

/* 전체 노드 상태 확인 */
kubectl get node

/* 쿠버네티스 핵심 컴포넌트의 Pod 상태 확인 */
kubectl get pod -n kube-system

/* 쿠버네티스 API 서버 작동 여부 확인 */
kubectl cluster-info

[ 모든 리소스 조회 ]

  • command 형식 : kubectl api-resources
  • 설명
    • 존재하는 모든 리소스들을 출력
    • 출력시 보이는 NAMESPACED columnnamespace 레벨의 리소스인지의 여부
      => Pod / Service / Deployment 등은 namespace 레벨의 리소스
/* namespace */
kubectl api-resources --namespaced=true

[ Pod 상세정보 확인 ]

  • command 형식 : kubectl describe pod <NAME>
  • 설명
    • Pod 및 Object에 대한 리소스의 자세한 상태를 표시
    • kubectl get과 유사하지만 Pod에 대한 Events 기록까지 확인 가능
    • kubectl get과 함께 디버깅 용도로 사용
/* 예시 */
kubectl describe pod mynginx

[ Pod의 컨테이너의 로그 확인 ]

  • command 형식 : kubectl logs <NAME>
  • 설명 : Pod에 존재하는 컨테이너에 대한 로그를 출력하는 명령
/* -f옵션으로 출력 스트림이 종료되지 않고 지속적으로 로그를 출력 */
kubectl logs -f mynginx

[ Pod의 컨테이너에 명령 전달 ]

  • command 형식 : kubectl exec <NAME> -- <CMD>
  • 설명
    • 실행중인 컨테이너에 명령을 전달할 때 사용
    • docker exec 명령과 유사하며, 구분자(--)로 전달할 명령을 구분
/* --구분자를 통해 명령어를 전달 */
kubectl exec mynginx -- apt-get update

/* docker와 마찬가지로 -it옵션을 통해 내부로 들어갈 수 있다 */
kubectl exec -it mynginx -- bash

[ 컨테이너 및 호스트간 파일 복사 ]

  • command 형식 : kubectl cp <TARGET> <SOURCE>
  • 설명
    • 컨테이너 안의 파일 위치를 표현할 때는 <CONTAINER_NAME>:<PATH> 형식으로 표기
/* host -> container */
kubectl cp /etc/passwd mynginx:/tmp/passwd

[ Pod manifest 편집 & 업데이트 ]

  • command 형식 : kubectl edit pod <NAME>
  • 설명
    • 실행된 컨테이너의 정보를 수정
    • vim과 같은 에디터가 열리며, kubectl get pod -oyaml 로 확인한 Object의 manifest파일을 수정할 수 있다
    • 파일을 저장하면, 수정한 내용이 실제 컨테이너에 반영된다
/* 예시 */
kubectl edit pod mynginx

[ Pod 삭제 ]

  • command 형식 : kubectl delete <Object 타입> <NAME>
  • 설명
    • 지정한 k8s의 오브젝트(리소스)를 삭제
/* Pod 삭제 */
kubectl delete pod mynginx
/* 특정 파일을 지정해서 Pod 삭제 */
kubectl delete -f pod.yaml
/* '<label-key>=<label-value>' 레이블이 있는 모든 Pod와 Service를 삭제 */
kubectl delte pods,services -l <label-key>=<label-value>
profile
Developer & PhotoGrapher

0개의 댓글