( 참고 : [교재] 핵심만 콕! 쿠버네티스 )
쿠버네티스 첫 만남
- 쿠버네티스 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
- ex)
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