ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [핵심만 콕! 쿠버네티스] 쿠버네티스 첫만남 / 도커와 비교한 쿠버네티스 명령어 총정리(feat. kubectl)
    📚 개발 도서/핵심만 콕! 쿠버네티스 2023. 7. 15. 22:59

    이번 글에서는 도커 기초 에 이어 쿠버네티스 클러스터와 대화하는 방법을 알아보자!

    쿠버네티스 기본/고급 명령어를 정리해볼 예정이다.

     

    쿠버네티스 클러스터를 컨트롤하기 위해 클라이언트 툴인 kubectl 명령툴을 사용한다.

    쿠버네티스 API 서버는 REST API로 통신을 한다.

    기본 명령

    기본적으로 도커 컨테이너와 마찬가지로 컨테이너의 실행과 삭제, 조회 등을 할 수 있다.

    컨테이너 실행

    # <NAME> 이름의 컨테이너를 <IMAGE> 를 이용하여 생성하라
    kubectl run <NAME> --image <IMAGE>
    
    • 도커 명령 비교 docker run

    컨테이너 조회

    # 컨테이너 확인
    kubectl get pod
    
    NAME      READY   STATUS    RESTARTS   AGE
    mynginx   1/1     Running   0          90s
    
    # 특정 pod 상태 정보를 더 자세히 보고 싶다면?
    kubectl get pod -o yaml
    
    # 간단하게 Pod의 IP를 바로 확인하고 싶다면?
    kubectl get pod -o wide
    
    NAME      READY   STATUS    RESTARTS   AGE   IP          NODE           NOMINATED NODE   READINESS GATES
    mynginx   1/1     Running   0          13m   10.42.1.2   0c0c150d7ee2   <none>           <none>
    

    kubectl get container가 아니라 kubectl get pod인 이유는 다음장에서 알려준다. 지금은 컨테이너와 Pod이 같다는 정도로 이해하고 넘어가자.

    • 도커 명령 비교 docker ps

     

    STATUS 목록

    • Pending: 쿠버네티스 마스터에 생성 명령은 전달되었지만 아직 실행되지 않은 상태
    • ContainerCreating: 특정 노드에 스케줄링되어 컨테이너를 생성 중인 단계 (이미지 다운로드 중 등)
    • Running: Pod이 정상적으로 실행되고 있는 상태
    • Completed: 계속 실행되고 있는 프로세스가 아닌 한번 실행하고 완료되는 배치작업 Pod에서 작업이 완료된 상태
    • Error: Pod에 문제가 생겨 에러가 발생한 상태
    • CrashLoopBackOff: 지속적으로 에러 상태로 있어 crash가 반복되는 상태

    컨테이너 상세정보 확인

    get 명령어와 유사하지만, get과는 조금 다르게 Pod에 대한 Events 기록까지 확인할 수 있다. 이는 디버깅 용도로 자주 사용된다.

    kubectl describe pod <NAME>
    

    컨테이너 로깅

    도커 컨테이너 로깅과 마찬가지로 컨테이너 로그 정보를 확인할 수 있다. --follow 옵션은 출력 스트림이 종료되지 않고 지속적으로 로그를 출력한다.

    kubectl logs <NAME>
    
    # 지속적으로 로그 출력하고 싶은 경우?
    kubectl logs -f <NAME>
    
    • 도커 명령 비교 docker logs

     

    [참고] kubectl wait --for condition=Ready pod <NAME> Pod이 완료되기 까지 기다린다.

    kubectl wait --for condition=Ready pod mynginx
    
    pod/mynginx condition met
    

     

    컨테이너 명령 전달

    kubectl exec  -- 
    
    # 예시
    kubectl exec mynginx -- apt-get update
    
    Get:1 <http://deb.debian.org/debian> bookworm InRelease [147 kB]
    Get:2 <http://deb.debian.org/debian> bookworm-updates InRelease [52.1 kB]
    Get:3 <http://deb.debian.org/debian-security> bookworm-security InRelease [48.0 kB]
    Get:4 <http://deb.debian.org/debian> bookworm/main arm64 Packages [8802 kB]
    Get:5 <http://deb.debian.org/debian-security> bookworm-security/main arm64 Packages [39.3 kB]
    Fetched 9088 kB in 2s (4724 kB/s)
    Reading package lists...
    
    • 도커 명령 비교 docker exec -it mynginx -- bash

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

    컨테이너에서 호스트로 또는 호스트에서 컨테이너로 파일을 복사할 때 사용한다.

    컨테이너 안의 파일 위치를 표현할 때는 <CONTAINER_NAME>:<PATH> 와 같은 형식을 사용한다.

    kubect cp <TARGET> <SOURCE>
    
    # <HOST> --> <CONTAINER>
    kubect cp /etc/passwd mynginx:/tmp/passwd
    

    [예시]

    / # vi test.txt
    / # kubectl cp test.txt mynginx:/tmp/
    / # kubectl exec mynginx -- ls /tmp
    test.txt
    / # kubectl exec mynginx -- cat /tmp/test.txt
    this is test.

     

    컨테이너 정보 수정

    kubectl edit pod <NAME>
    

    edit 명령을 실행하면 vim과 같은 텍스트 에디터가 열린다.

    • 도커 명령 비교 docker update

    컨테이너 삭제

    kubectl delete pod <NAME>
    

     

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

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

    위처럼 가장 기본이 되는 정보만 입력하면, 쿠버네티스가 알아서 나머지 값들을 채운다.

    apply라는 선언형 명령은 멱등성을 보장하여 여러번 실행하더라도 항상 YAML 정의서에 선언된 내용과 동일한 결과를 얻을 수 있게 한다.

    kubectl apply -f mynginx.yaml
    
    pod/mynginx unchanged
    

     

    고급 명령

    리소스별 명령어

    kubectl get service
    
    NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.43.0.1    <none>        443/TCP   56m
    
    # 클러스터를 구축하기 위해 사용한 Node
    kubectl get node
    
    NAME           STATUS   ROLES                  AGE   VERSION
    0c0c150d7ee2   Ready    <none>                 52m   v1.26.6+k3s1
    0f1774cf65bf   Ready    control-plane,master   57m   v1.26.6+k3s1
    
    # 클러스터를 논리적으로 나누는 역할을 하는 namespace
    kubectl get namespace
    
    NAME              STATUS   AGE
    # 기본 네임스페이스. 아무런 옵션 없이 컨테이너를 만드는 경우
    default           Active   58m 
    # 쿠버네티스 핵심 컴포넌트들이 들어있는 네임스페이스. 네트워크 설정, DNS 서버 등 중요한 역할을 담당하는 컨테이너가 존재한다.
    kube-system       Active   58m 
    # 외부로 공개 가능한 리소스를 담고 있는 네임스페이스.
    kube-public       Active   58m
    # 노드가 살아있는지 마스터에 알리는 용도로 존재하는 네임스페이스.
    kube-node-lease   Active   58m
    

    자동완성 기능

    <https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion>
    
    echo 'source <(kubectl completion bash)' >>~/.bashrc
    source ~/.bashrc
    

    즉석 리소스 생성

    cat & here document 명령 조합을 활용해 즉석으로 리소스를 생성할 수 있다.

    cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
    	name: cat-mynginx
    spec:
    	containers:
    	- name: cat-mynginx
    		image: ngin
    EOF
    
    pod/cat-nginx created
    

    리소스 특정 정보 추출

    kubectl get node master -o jsonpath="{.status.addresses[0].address}"
    # 10.0.1.1
    

    모든 리소스 조회

    kubectl api-resources
    kubectl api-resources --namespaced=true # 네임스페이스 레벨의 API 리소스만 탐색하기 위한 명령어
    

    클러스터 상태 확인

    # 쿠버네티스 API 서버 작동 여부 확인
    kubectl cluster-info
    
    # 전체 노드 상태 확인
    kubectl get node
    
    # 쿠버네티스 핵심 컴포넌트의 Pod 상태 확인
    kubectl get pod -n kube-system
    
    반응형

    댓글

Designed by Tistory.