핵심만 콕! 쿠버네티스
쿠버네티스 첫 만남
이번에는 쿠버네티스 클러스터와 대화하는 방법에 대해 알아볼 것이다. 쿠버네티스 클러스터는 kubectl을 사용해 컨트롤을 하게 된다. kubectl의 기본적인 사용방법을 익혀 쿠버네티스에 익숙해져 보자.
기본 명령
쿠버네티스는 여러 컨테이너를 관리해주는 컨테이너 오케스트레이션 플랫폼이다. 기본적으로 도커 컨테이너와 마찬가지로 컨테이너의 실행과 삭제, 조회 등을 할 수 있다. 가장 기본적은 컨테이너 조작법부터 살펴볼 것이다.
컨테이너 실행
kubectl run <NAME> --imgae <IMAGE>
# mynignx라는 이름의 컨테이너를 nginx 이미지를 이용하여 생성
kubectl run mynginx --image nginx
컨테이너 조회
kubectl get pod
NAME READY STATUS RESTARTS AGE
mynginx 1/1 Running 0 15s
쿠버네티스에서는 프로세스를 실행할 때 pod이라는 단위로 실행을 하게 된다. 그래서 get pod
으로 pod 정보를 조회한 것이다. STATUS
라는 컬럼은 pod의 상태 정보를 나타내는데, pod이 가질 수 있는 상태 정보는 다음과 같다.
- pending : 쿠버네티스 마스터에 생성 명령은 전달되었지만 아직 실행되지 않은 상태
- container creating : 특정 노드에 스케줄링되어 컨테이너를 생성 중인 단계
- running : pod가 정상적으로 실행되고 있는 상태
- completed : 계속 실행되고 있는 프로세스가 아닌 한 번 실행하고 완료되는 배치작업 pod에서 작업이 완료된 상태
- error : pod에 문제가 생겨 에러가 발생한 상태
- crash loop back off : 지속적으로 에러 상태로 있어 crash가 반복되는 상태
특정 pod의 상태 정보를 더 자세히 보고 싶다면 다음과 같이 입력하면 된다.
kubectl get pod mynginx -o yaml
pod의 IP를 확인하려면 다음과 같이 입력한다.
kubectl get pod -o wide
컨테이서 상세정보 확인
describe는 get과 비슷하게 pod의 상태 정보를 조회하지만, pod에 대한 이벤트 기록까지 확인할 수 있다.
kubectl describe pod <NAME>
# mynginx의 상세정보 확인
kubectl describe pod mynginx
컨테이너 로깅
도커 컨테이너 로깅과 유사하게 쿠버네티스에서도 로그 정보를 확인할 수 있다.
kubectl logs <NAME>
# mynginx 컨테이너의 로그 정보를 확인
kubectl logs -f mynginx
컨테이너 명령 전달
실행중인 컨테이너에 명령을 전달하기 위해 exec를 사용할 수 있다. docker의 exec와 유사하지만, --
로 전달할 명령을 구분한다는 차이점이 있다.
kubectl exec <NAME> -- <CMD>
# mynginx에 apt-get update 명령을 전달
kubectl exec mynginx -- apt-get update
-it
옵션을 이용하면 컨테이너 내부로 접속할 수 있다.
kubectl exec -it mynginx -- bash
컨테이너/호스트간 파일 복사
kubectl cp <TARGET> <SOURCE>
# <HOST> --> <CONTAINER>
kubectl cp /etc/passwd mynginx:/tmp/
# 확인
kubectl exec mynginx -- cat /tmp/passwd
컨테이너 정보 수정
kubectl edit pod <NAME>
실행된 컨테이너의 정보를 수정할 수도 있다. edit 명령을 실행하면 vim과 같은 텍스트 에디터가 열리면서 kubectl get pod <NAME> -o yaml
에서 살펴본 내용과 동일한 구조가 보인다. 여기에서 사용자가 vim을 통해 수정한 내용이 실제 컨테이너에 반영된다.
kubectl edit pod mynginx
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2022-06-25T09:06:55Z"
labels:
run: mynginx
hello: world # hello: world label을 추가
name: mynginx
namespace: default
resourceVersion: "600"
# 변경 내용 확인
kubectl get pod mynginx -o yaml
컨테이너 삭제
kubectl delete pod <NAME>
# mynginx 삭제
kubectl delete pod mynginx
생성한 컨테이너를 삭제하기 위한 명령어다.
선언형 명령 정의서(YAML) 기반의 컨테이너 생성
kubectl apply -f <FILE_NAME>
YAML을 이용해서 컨테이너를 만들 수도 있다. 이를 위해 다음과 같은 YAML 파일을 먼저 만들어 준다.
touch mynginx.yaml
vim mynginx.yaml
# mynginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: mynginx
spec:
containers:
- name: mynginx
image: nginx
kubectl get <NAME> -o yaml
명령어를 사용했을 때 볼 수 있는 정보와 동일한 구조를 가지고 있다. 쿠버네티스에서는 YAML에 필수적인 정보(컨테이너 이름, 이미지 주소 등)만 입력하면 나머지 값들을 채워주기 때문에 이렇게 입력해도 컨테이너를 실행할 수 있다.
# mynginx.yaml 기반 컨테이너 실행
kubectl apply -f mynginx.yaml
# pod 확인
kubectl get pod
# 상세정보 확인
kubectl get pod mynginx -o yaml
mynginx.yaml 파일에 라벨을 추가하고 이미지 주소를 수정한다.
# mynginx.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
hello: world
name: mynginx
spec:
containers:
- name: mynginx
image: nginx:1.17.2
# mynginx.yaml 기반 컨테이너 실행
kubectl apply -f mynginx.yaml
# pod 확인
kubectl get pod
# 상세정보 확인
kubectl get pod mynginx -o yaml
mynginx.yaml
파일을 수정하고 나서 apply 명령을 사용하면 변경 내역에 따라 출력되는 메시지가 달라진다.
고급 명령
리소스별 명령
쿠버네티스는 모든 것이 리소스로 표현된다. 위에서 살펴본 명령은 pod이라는 리소스를 기준으로 설명했는데, 쿠버네티스에는 pod 외에도 service, replicaSet, deployment 등 다양한 리소스가 존재한다. pod이 아닌 다른 리소스에 대한 명령을 사용하려면 pod 대신 다른 리소스의 이름을 적어주면 된다.
# pod 목록 조회
kubectl get pod
# service 목록 조회
kubectl get service
# pod 상세 정보 조회
kubectl describe pod mynginx
# service 상세 정보 조회
kubectl describe service kubernetes
네임스페이스(namespace)
네임스페이스는 쿠버네티스를 논리적으로 나누는 역할을 한다. pod, service, node와 같은 리소스가 네임스페이스별로 생성되고, 사용자 접근제어, 네트워크 접근제어 정책을 네임스페이스마다 다르게 설정할 수 있다.
# 네임스페이스 목록 조회
kubectl get namespace
NAME STATUS AGE
default Active 15h
kube-node-lease Active 15h
kube-public Active 15h
kube-system Active 15h
# 네임스페이스 상세 정보 조회
kubectl describe namespace kube-system
네임스페이스 목록을 조회하면 기본적으로 다음의 정보를 확인할 수 있다.
- default : 기본 네임스페이스다. 아무런 옵션 없이 컨테이너를 만들게 되면 default 네임스페이스에 생성된다.
- kube-system : 쿠버네티스 핵심 컴포넌트가 들어있는 네임스페이스다. 네트워크 설정, DNS 서버 등 중요한 역할을 하는 컨테이너가 존재한다.
- kube-public : 외부로 공개 가능한 리소스를 가지고 있는 네임스페이스다.
- kube-node-lease : 노드가 살아있는지 마스터에 알리는 용도로 존재하는 네임스페이스다.
mynginx
컨테이너를 실행할 때, 아무런 옵션을 주지 않았기 때문에 default 네임스페이스에 생성되어 있을 것이다. 이를 확인하기 위한 명령어는 다음과 같다.
# 특정 네임스페이스에 존재하는 pod 확인
kubectl get pod <NAME> --namespace <NAMESPACE_NAME>
# default 네임스페이스에 있는 mynginx 확인
kubectl get pod mynginx --namespcae defalut
kubectl get pod mynginx -n defalut # --namespace == -n
# default는 생략해도 기본으로 적용됨
# kubectl get pod == kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
mynginx 1/1 Running 1 (10m ago) 15h
컨테이너를 특정 네임스페이스에서 실행하려면 다음과 같이 입력해주면 된다.
# kube-system 네임스페이스에 mynginx-ns 컨테이너 실행
kubectl run mynginx-ns --image nginx --n kube-system
pod/mynginx-ns created
# kube-system 네임스페이스 있는 mynginx-ns 조회
kubectl get pod mynginx-ns -n kube-system
NAME READY STATUS RESTARTS AGE
mynginx-ns 1/1 Running 0 46s
# kube-system 네임스페이스에 있는 mynginx-ns 삭제
kubectl delete pod mynginx-ns -n kube-system
pod "mynginx-ns" deleted
자동완성 기능
kubectl은 간단하게 쿠버네티스에 명령을 내릴 수 있는 도구이지만, 명령을 매번 일일이 입력하는 것은 귀찮을 수도 있다. 그래서 쿠버네티스에서는 이를 해결하기 위해 자동으로 명령을 완성시켜주는 스크립트를 제공한다.
https://kubernetes.io/ko/docs/tasks/tools/included/optional-kubectl-configs-bash-linux/
bash 쉘에서 자동완성 기능을 추가하는 방법이다.
# 현재 사용하는 shell 확인
echo $SHELL
/bin/bash
# bash 쉘에 자동완성 기능 추가
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc
# 자동완성 기능으로 컨테이너 조회
kubectl get pod <TAB>
mynginx yournginx
즉석 리소스 생성
YAML을 이용하여 리소스를 생성하려면 매번 YAML 파일을 만들어야 한다고 생각할 수 있지만, cat & here document
명령 조합을 사용하면 즉석으로 리소스를 생성할 수 있다.
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: cat-nginx
spec:
containers:
- image: nginx
name: cat-nginx
EOF
# 확인
kubectl get pod
NAME READY STATUS RESTARTS AGE
cat-nginx 1/1 Running 0 14s
mynginx 1/1 Running 1 (44m ago) 16h
리소스 특정 정보 추출
--jsonpath
라는 옵션을 이용하면 리소스의 특정 정보만 골라서 추출할 수 있다.
# node 리소스 조회
kubectl get node
# docker-desktop 노드의 yaml 확인
kubectl get node docker-desktop -o yaml
...
status:
addresses:
- address: 10.0.1.1
type: InternalIP
- address: docker-desktop
type: Hostname
...
docker-desktop의 세부 정보를 보면 해당 노드의 IP 주소(192.168.65.4)를 확인할 수 있다. 이 값은 다음의 명령어를 실행해서 나오는 INTERNAL-IP의 값과 동일하다.
kubectl get node docker-desktop -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP ...
docker-desktop Ready control-plane 16h v1.24.0 10.0.1.1 ...
이 값을 --jsonpath
명령어를 사용해서 추출하는 명령어는 다음과 같다.
kubectl get node docker-desktop -o jsonpath="{.status.addresses[0].address}"
모든 리소스 조회
pod을 포함한 쿠버네티스의 다양한 리소스를 한 번에 조회하는 방법이다.
kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
nodes no v1 false node
pods po v1 true Pod
결과값의 네 번째 컬럼인 NAMESPACED에는 해당 리소스가 네임스페이스 레벨 리소스인지, 클러스터 레벨 리소스인지를 나타낸다.
- 네임스페이스 리소스: 해당 리소스가 반드시 특정 네임스페이스에 속해야 한다.
- 클러스터 리소스: 네임스페이스와 상관없이 클러스터 레벨에 존재하는 리소스다.
네임스페이스 레벨의 API 리소스만 탐색하기 위해선 다음과 같이 입력한다.
kubectl api-resources --namespaced=true
리소스 정의 설명
리소스의 간단한 정의를 살펴보려면 다음과 같은 명령을 사용한다.
# Pod에 대한 정의 확인
kubectl explain pods
# node에 대한 정의 확인
kubectl explain node
클러스터 상태 확인
쿠버네티스 클러스터가 정상적으로 동작하고 있는지 확인하고 싶을 때가 있다. 전반적인 클러스터의 헬스 체크를 확인하고 싶을 때 다음 명령을 사용한다.
# 쿠버네티스 API 서버 작동 여부 확인
kubectl cluster-info
# 전체 노드 상태 확인
kubectl get node
# 쿠버네티스 핵심 컴포넌트의 pod 상태 확인
kubectl get pod -n kube-system
클라이언트 설정 파일
kubectl config <SUBCOMMAND>
kubectl은 내부적으로 KUBECONFIG ($HOME/.kube/config)
설정 파일을 참조하여 마스터 주소, 인증 정보 등을 관리한다. kubectl의 설정값을 바꾸기 위해서 해당 파일을 직접 수정하거나, kubectl config 명령을 사용할 수 있다.
먼저 view 명령을 통해 클라이언트 설정 파일값들을 확인해보자.
kubectl config view
아니면 cat 명령을 사용해서 직접 KUBECONFIG 설정 파일의 내용을 확인할 수 있다.
cat ~/.kube/config
KUBECONFIG 설정 파일은 크게 세 영역으로 나눌 수 있다.
- clusters : kubectl이 바라보는 클러스터 정보를 입력한다.
- users : 쿠버네티스 클러스터에 접속하는 사용자를 정의한다.
- contexts : 클러스터와 유저를 연결해주는 것을 context라고 한다. kubectl에서 여러 클러스터나 여러 사용자를 관리할 경우 유용하게 사용할 수 있다.
kubectl 명령 치트시트
clean up
kubectl delete pod --all
'쿠버네티스' 카테고리의 다른 글
쿠버네티스 네트워킹(Service 리소스) (0) | 2022.07.13 |
---|---|
Pod 살펴보기 (0) | 2022.06.30 |
쿠버네티스 설치 (0) | 2022.06.24 |
쿠버네티스 소개 (0) | 2022.06.07 |
도커 기초 (0) | 2022.05.31 |