( 참고 : [교재] 핵심만 콕! 쿠버네티스 )

쿠버네티스 첫 만남

  • 쿠버네티스 cluster와 대화하는 방법은?
  • 쿠버네티스 cluster를 컨트롤 하기 위한 kubectl 명령 툴


1. 기본 명령

쿠버네티스 = 컨테이너 오케스트레이션 플랫폼

  • 컨테이너의 실행/삭제/조회 가능
  • CLI : ( kubectl = kube + control )


(1) 컨테이너 실행 : run

kubectl run <CONTAINER이름> --image <IMAGE이름>

example )

kubectl run mynginx --image nginx


(2) 컨테이너 조회 : get

1) 실행 중인 컨테이너 조회하기

kubectl get pod
  • pod란?
    • 쿠버네티스의 실행 최소 단위 ( 컨테이너 \(\approx\) pod )
    • 쿠버네티스에서는, 프로세스를 실행할 때 “컨테이너를 사용하지 않고”, “Pod라는 리소스를 사용”한다
  • STATUS : 해당 컨테이너(pod)가 현재 동작중인 상태
    • Pending : 생성 명령 O, 실행은 X
    • ContainerCreating : 생성 중
    • Running : 정상 실행 중
    • Completed : 한번 실행하고 완료된 상태
    • Error : 에러
    • CrashLoopBackOff : 지속적인 에러 상태로 있어 crash가 반복 중


2) 실행 중인 컨테이너 (자세히) 조회하기

  • 뒤에 -o yaml를 붙여야함
  • 추가 정보 :
    • PodIP, nodeName 등
kubectl get pod mynginx -o yaml


3) 실행 중인 컨테이너 (간단히) 조회하기

  • 뒤에 -o wide를 붙여야함
kubectl get pod -o wide


(3) 컨테이너 상세 정보 확인 : describe

kubectl describe pod <POD 이름>

kubectl get과의..

  • 공통점 : Pod의 상태 정보
  • 차이점 : Pod에 대한 event의 기록까지 확인 가능
    • 문제 발생 시, debugging 용도로 사용 가능

example )

kubectl describe pod mynginx


(4) 컨테이너 로깅 : logs

  • 컨테이너의 로그 정보 확인 가능
  • -f ( = --follow ) : 출력 스트림이 종료되지 않고, 지속적으로 로그를 보여줌
kubectl logs -f mynginx


(5) 컨테이너 명령 전달 : exec

  • 실행 중인 컨테이너에 명령을 전달할 때
  • 도커의 docker exec와 유사
    • 차이점 : “구분자 (–)”로 명령어 전달
kubectl exec <NAME> -- <CMD>


example)

kubectl exec mynginx -- apt-get update


컨테이너 내부로 들어가고 싶은 경우 : -it

kubectl exec -it mynginx --bash


(6) 컨테이너 / 호스트 간 파일 복사 : cp

<TARGET><SOURCE> 로 복사하고 싶을 경우

kubectl cp <TARGET> <SOURCE>


example )

  • cases )
    • 컨테이너 \(\rightarrow\) 호스트
    • 호스트 \(\rightarrow\) 컨테이너
  • 컨테이너 안의 파일을 표현할 때 :
    • <CONTAINER_NAME>:<PATH> 형식으로!
  • ex) 호스트의 /etc/password 파일 \(\rightarrow\) mynginx 컨테이너의 /tmp/passwd로 복사하려면
kubectl cp /etc/password mynginx:/tmp/passwd


잘 복사가 되었는지 확인하기! ( 컨테이너 안으로 들어가야 한다 )

kubectl exec mynginx -- ls /tmp/passwd


(7) 컨테이너 정보 수정 : edit

kubectl edit pod <CONTAINER 이름>
  • vim과 같은 editor가 열리면서,

    kubectl get pod <NAME> -o yaml에서 확인했던 내용 확인 가능


(8) 컨테이너 삭제 : delete

kubectl delete pod <CONTAINER 이름>


example)

kubectl delete pod mynginx


(9) 선언형 명령 정의서 (YAML) 기반의 컨테이너 생성 : apply

kubectl apply -f <FILE_NAME>
  • 쿠버네티스는 “선언형 명령”을 지향한다
  • YAML = 선언형 명령 정의서
  • kubectl run의 대안
    • kubectl run : 명령형의 컨테니어 실행 명령
    • kubectl apply: 선언형의 컨테니어 실행 명령


example) (YAML파일) mynginx.yaml

  • kubectl get pod <NAME> -o yaml에서 확인했던 내용의 “간단한 version”

  • 가장 기본이 되는 정보 ( = 컨테이너 이름, 이미지 주소 등) 만 입력을 하면,

    쿠버네티스가 나머지는 알아서 채워줌!

# mynginx.yaml
apiVersion : v1
kind : Pod
metadata :
	name : mynginx
spec :
	containers :
	- name : mynginx
	  image : nginx
kubectl apply -f mynginx.yaml


잘 실행(생성)된 것을 알 수 있다

kubectl get pod mynginx -o yaml


선언형 (apply) 명령의 장점

  • 로컬 파일시스템에 위치한 YAML 정의서 뿐만 아니라,

    인터넷 상에 위치한 YAML 정의서도 쉽게 활용 가능

  • 멱등성을 보장

    ( 여러 번 실행하더라도, 항상 YAML 정의서에 선언된 내용과 동일한 결과 보장 )

kubectl apply -f https:// ~~~~/simple-pod.yaml

kubectl delete -f https:// ~~~~/simple-pod.yaml


2. 고급 명령

(1) 리소스 별 명령

  • 쿠버네티스의 모든 것은 “리소스”로 표현됨

  • 지금까지 다룬 리소스 : Pod

    ( 그 밖에도 다양한 리소스들이 있음 )

  • 위에서 한 것과 동일! pod 대신 다른리소스를 적으면 됨


Service 리소스

kubectl get service
kubectl describe service kubernetes


Node 리소스

kubectl get node
kubectl describe node kubernetes


(2) 네임 스페이스 (Namespace)

네임스페이스 :

쿠버네티스 cluster를 논리적으로 나누는 역할

( 네임스페이스도 일종의 “리소스”이다 )

kubectl get namespace
kubectl describe namespace kube-system


네임스페이스의 종류

  • 1) default : 기본 Namespace
  • 2) kube-system : 쿠버네티스의 핵심 컴포넌트들이 들어있는 Namespace
  • 3) kube-public : 외부로 공개 가능한 리소스를 담고 있는 Namespace
  • 4) kube-node-lease : 노드가 살아있는지, 마스터에 알리는 용도로 존재하는 Namespace


특정 네임스페이스를 생성 (run) 하기 위해선?

  • --namespace ( = -n ) 옵션 사용하기
    • ex) --namespace kube-system
    • ex) -n kube-system
kubectl run mynginx-ns --image nginx --namespace kube-system


kube-system 네임스페이스에서 Pod 확인하기

  • 기존 : kubectl get pod mynginx-ns
kubectl get pod mynginx-ns -n kube-system


kube-system 네임스페이스에서 Pod 삭제하기

kubectl delete pod mynginx-ns -n kube-system


(3) 자동완성 기능

  • kubectl을 매번 입력하기 귀찮…..
  • 쉘에 맞게 스크립트 세팅하기~


ex) bash 쉘의 경우

echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

\(\rightarrow\) 이제 “TAB”눌러서 자동완성 가능하다!


(4) 즉석 리소스 생성

매번 YAML 파일을 만들어서 생성할 필요 X

\(\rightarrow\) cat & here document 명령 조합을 활용하여 즉석으로 빠르게 리소스 생성 가능!


(5) 리소스 특정 정보 추출

--jsonpath 옵션

  • 리소스의 “특정 정보”만을 골라서 추출 가능


ex) 마스터 노드의 IP는?

  • 기존 (전부 가져오기)
kubectl get node master -o yaml
  • 특정 정보만 가져오기
    • 해당 내용의 위치는, 위 기존 (전부 가져오기)를 한번 실행하면 확인 가능!
kubectl get node master -o `jsonpath="{.status.addresses[0].address}"


(6) 모든 리소스 조회

  • Pod 리소스 외에 다양한 리소스들 존재


어떤 리소스들이 들이 존재하는지 확인하기 위해…

kubectl api-resources


결과

# NAME SHORTNAMES APIGROUP NAMESPACED KIND
# ...
# ... 


참고 : 쿠버네티스의 리소스는, 크게 다음과 같이 둘로 구분된다.

  • 1) Namespace 레벨 리소스

    ( = 반드시 특정 Namespace에 속해야하는 리소스 )

    • ex) Pod
  • 2) Cluster 레벨 리소스

    ( = Namespace와 상관 없이, Cluster레벨에 존재하는 리소스 )

    • ex) Node

NAMESPACED 칼럼 : 해당 리소스가 “Namespace 레벨 리소스 “인지 알려주는 칼럼


Namespace 레벨의 API 리소스만 확인하려면?

kubectl api-resource --namespaced=true


(7) 리소스 정의 설명

리소스 (ex. pods) 의 간단한 정의를 확인하려면..

kubectl explain pods


(8) 클러스터 상태 확인

쿠버네티스의 cluster가 정상적으로 동작하고 있는지? ( = health check )


3가지 명령어

# API 서버 작동여부 확인
kubectl cluster-info

# 전체 노드 상태 확인
kubectl get node

# 핵심 컴포넌트의 Pod 상태 확인
kubectl get pod -n kube-system


(9) 클라이언트 설정 파일

kubectl은, 내부적으로 KUBECONFIG 설정 파일을 참조하여 각종 관리를 수행함.

kubectl의 설정값을 바꾸기 위해…

  • 1) KUBECONFIG 파일 직접 수정하기
  • 2) kubectl config 명령어 사용


현재 설정 파일값들 확인하기

  • 방법 1) view
kubectl config view
  • 방법 2) KUBECONFIG 설정 파일 직접 출력
cat $$HOME/.kube/config


KUBECONFIG 설정 파일의 3가지 영역

  • 1) clusters : 클러스터 정보
  • 2) users : 클러스터에 접속하는 사용자 정의
  • 3) contexts : cluster와 user를 연결해줌


3. 요약

쿠버네티스 cluster를 제어하기 위한 기본적인 kubectl 명령어를 확인함.


전부 지우기

kubectl delete pod --all