쿠버네티스 기본 명령

yoongyum·2022년 5월 2일
1
post-thumbnail

쿠버네티스에서 가장 기본적인 컨테이너 조작법에 대해서 공부해보겠습니다.


컨테이너 실행

$ kubectl run <name> --image <IMAGE>

mynginx라는 이름의 컨테이너를 nginx이미지를 이용하여 생성하는 명령을 했습니다.




컨테이너 조회

$ kubectl get pod

위에서 생성한 mynginx라는 컨테이너가 Running된 상태라면 정상적으로 실행되고 있는 것을 확인 할 수 있습니다.

여기서 get명령 뒤에 pod을 썼습니다.

pod이란 이전포스트에서 설명했다시피 쿠버네티스에서 최소 실행 단위입니다.

컨테이너와 pod이 같은 의미정도라고 이해하시면 됩니다.


STATUS 종류

  • Pending : 쿠버네티스 마스터에 생성 명령은 전달되었지만 아직 실행되지 않은 상태입니다.

  • ContainerCreating : 특정 노드에 스케줄링되어 컨테이너를 생성 중인 단계입니다.

  • Running : pod가 정상적으로 실행되는 상태입니다.

  • Completed : 한 번 실행되고 완료되는 배치작업 pod에서 작업이 완료된 상태입니다.

  • Error : pod에 에러가 발생한 상태입니다.

  • CrashLoopBackOff : 지속적인 에러로인해 crash가 반복되는 상태입니다.


POD 상세정보

$ kubectl get pod mynginx -o yaml

특정 POD정보를 더 자세히 볼 수도 있습니다.


위의 명령은 너무 정보가 많이 나오기 때문에 아래 명령으로 간단하게 POD IP를 확인할 수 있습니다.

$ kubectl get pod -o wide

도커 명령 비교 : docker ps


POD에 생겼던 이벤트들까지 볼 수 있는 명령어도 있습니다.

이벤트를 확인함으로써 문제가 생겼을 때 디버깅용으로 활용이 가능합니다.

$ kubectl describe pod mynginx

도커 명령 비교 : docker inspect




컨테이너 로깅

$ kubectl logs <NAME>

컨테이너 로그를 확인하는 명령어입니다.

-f (--follow) 옵션은 지속적으로 로그를 출력합니다.

ContainerCreating 상태일때는 로거가 작동안하니 기다리셨다가 하시면 됩니다.

도커 명령 비교 : docker logs




컨테이너 명령 전달

$ kubectl exec <NAME> -- <CMD>

실행 중인 컨테이너에 명령을 전달하는 명령어 입니다.

도커 명령 비교 : docker exec




컨테이너 / 호스트간 파일 복사

$ kubectl cp <TARGET> <SOURCE>

컨테이너에서 호스트 or 호스트에서 컨테이너로 파일 복사 하는 명령어입니다.

$ kubectl cp /etc/passwd mynginx:/tmp/passwd # 호스트 -> 컨테이너

$ kubectl exec mynginx -- ls /tmp/passwd # 복사 되었는 지 확인

$ kubectl exec mynginx -- cat /tmp/passwd

도커 명령 비교 : docker cp




컨테이너 정보 수정

$ kubectl edit pod <NAME>

실행 중인 컨테이너의 정보를 수정합니다.
텍스트에디터가 열려서 수정할 수 있습니다.

라벨에 hello: world를 추가했습니다.

get pod -oyaml해서 추가되었는 지 확인합니다.

도커 명령 비교 : docker update




컨테이너 삭제

$ kubectl delete pod <NAME>

생성된 컨테이너를 삭제 합니다.

도커 명령 비교 : docker rm




선언형 명세서 기반의 컨테이너 생성


YAML기반의 명세서로 명령어를 실행해보겠습니다.

mynginx.yaml파일을 생성해보겠습니다.

mynginx.yaml

apiVersion: v1
kind: Pod
metadata:
	name: mynginx
spec:
	containers:
    - name: mynginx
    image: nginx

위의 형식은 사용가가 가장 기본이 되는 정보만 입력하면, 쿠버네티스가 나머지값들을 알아서 채워줍니다.

kubectl run은 명령형 스타일의 실행 명령이고, kubectl apply는 선언형 스타일의 명령어 입니다.

apply의 장점은 로컬 파일시스템에 위치한 YAML 정의서 뿐만 아니라,
인터넷상에 위치한 YAML 정의서도 손쉽게 가져다 사용할 수 있습니다.

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/pods/simple-pod.yaml


mynginx.yaml을 수정해보겠습니다.

수정했는 지 수정하지 않았는 지 알 수 있습니다.

동일한 명령어를 여러번 입력해도 멱등성을 보장하기 때문에 최종결과가 달라지지 않게 해줍니다.




리소스별 명령

쿠버네티스는 pod, service, replicaset, deployment 등 모든 것이 리소스입니다.

지금까지는 pod을 기준으로 명령어를 사용하였습니다.
다른 리소스들도 pod이라고 적은 부분을 다른 리소스로 변경만하면 됩니다.

클러스터 구축하면서 생성했던 노드 또한 리소스입니다.




네임스페이스 (Namespace)

쿠버네티스에서 네임스페이스는 클러스터를 논리적으로 나누는 역할을 합니다.

Pod, Service 같은 리소스가 네임스페이스별로 생성되고 사용자 접근제어,

Network 접근제어 정책을 다르게 가져갈 수 있습니다.

마찬가지로 네임스페이스 역시 리소스로 표현됩니다.

  • default : 컨테이너 생성 시 아무 옵션을 주지 않으면 default 네임스페이스에 생성됩니다.

  • kube-system : 쿠버네티스시스템에서 생성된 컴포넌트들이 들어있는 네임스페이스입니다.
    해당 네임스페이스에 네트워크 설정, DNS 서버 등 중요한 역할을 담당하는 컨테이너가 존재합니다.

  • kube-public : 외부로 공개 가능한 리소스를 담고 있는 네임스페이스입니다.

  • kube-node-lease : 마스터노드가 장애를 탐지할 수 있게 해줍니다.

명령어 실행 시 --namespace (-n)을 사용하여 특정 네임스페이스에 리소스를 생성할 수 있습니다.

네임스페이스 옵션을 생략하면 default 네임스페이스로 설정이 됩니다.




즉석 리소스 생성

YAML 명세서를 통해 매번 리소스를 생성하지 않고 cat & here document 명령 조합을 활용할 수 있습니다.




리소스 특정 정보 추출

--jsonpath라는 옵션을 이용하여 리소스의 특정 정보만을 골라서 추출할 수 있습니다.

status.addresses[0].address 위치에 출력되는 ip가 -o wide 옵션을 사용할 때 나오는 IP와 동일합니다.

이 값을 --jsonpath 옵션을 이용하여 추출해보겠습니다.




모든 리소스 조회

리소스들이 존재하는 지 확인하기 위해 다음의 명령을 사용합니다.

4번째 컬럼의 NAMESPACED의 값을 이용해서 네임스페이스 레벨의 API 리소스만 탐색하기 위한 명령어는 다음과 같습니다.




리소스 정의 설명

리소스의 간단한 정의를 살펴보려면 다음과 같은 명령을 사용합니다.




클러스터 상태 확인

쿠버네티스 클러스터가 정상적으로 동작하고 있는지 확인하고 싶을 때가 있습니다.
전반적인 클러스터의 health check을 확인하고 싶을 때 다음 3가지 명령을 사용합니다.




클라이언트 설정 파일

$ kubectl config <SUBCOMMAND>

kubectl 툴은 내부적으로 KUBECONFIG ($HOME/.kube/config) 설정 파일을 참조하여 마스터 주소, 인증 정보 등을 관리합니다.

위 명령어를 통해서 설정값을 수정할 수 있습니다.

view명령을 통해 설정 파일값들을 확인합니다.

KUBECONFIG을 직접 출력 할 수도 있습니다.

KUBECONFIG 설정 파일 3가지

clusters : kubectl 툴이 바라보는 클러스터 정보를 입력합니다.

users : 쿠버네티스 클러스터에 접속하는 사용자를 정의합니다.

contexts : cluster와 user를 연결해주는 것을 context라고 합니다.




Pod 전체 삭제

$ kubectl delete pod --all

다음 포스트에서는 Pod를 더 살펴보겠습니다.

0개의 댓글