kubectl

홍준식·2024년 4월 7일

쿠버네티스

목록 보기
4/5

네임스페이스

쿠버네티스는 클러스터의 객체들을 관리하고자 네임스페이스를 사용한다.
kubectl의 기본 명령어는 기본 네임스페이스와 상호작용한다.

$ kubectl get pods
No resources found in default namespace.

위처럼 아무런 옵션 없이 파드 조회 명령어를 호출하면 기본 네임스페이스에 파드를 조회한다.

$ kubectl get pods --namespace=kube-system
$ kubectl get pods --all-namespaces

네임스페이스로 조회하고 싶다면 --namespace 옵션을 사용하거나 --all-namespaces 옵션을 사용해야한다.

컨텍스트

기본 네임스페이스를 영구적으로 변경하려면 컨텍스트를 사용하면 된다.
기존적으로 kubectl 컨피규레이션 파일인 ~/.kube/config 라는 컨피규레이션 파일에 기록되어있다.

$ kubectl config set-context my-context --namespace=mystuff

위 명령어를 사용하고 ~/.kube/config을 다시 확인해보면 context에 my-context가 추가된 것을 확인할 수 있다.

$ kubectl config use-context my-context

위 명령어를 통해 네임스페이스를 변경하는 컨텍스트를 적요할 수 있다.

쿠버네티스 API 객체 조회

쿠버네티스는 모든 것을 restful 리소스로 API 객체로 제공한다.
예를 들어 https://127.0.0.1:63736/api/v1/namespaces/default/pods는 기본 네임스페이스에 있는 파드를 가져오는 API다.
루트 서버 정보는 ~/.kube/config에 명시되어있다.

브라우저에서 요청하면 403 Forbidden이 뜨기에 관리자 권한을 생성해 API 요청을 해보겠다.

$ kubectl create serviceaccount admin
$ kubectl create clusterrolebinding root-cluster-admin-binding --clusterrole=cluster-admin --serviceaccount=default:admin
$ TOKEN=$(kubectl create token admin)

위 명령어로 생성된 토큰을 jwt 토큰으로 API 요청을 하면 된다.

$ curl -k -H "Authorization: Bearer $TOKEN" https://127.0.0.1:63736/api/v1/namespaces/default/pods/

해당 요청을 통해 default 네임스페이스의 모든 pod를 조회할 수 있다.

kubectl get을 통해 원하는 쿠버네티스 객체를 조회할 수 있다.
또한 -o json 또는 -o yaml 플래그를 통해 json이나 yaml 형식으로 조회할 수 있다.

$ kubectl get pods coredns-5d78c9869d-7s84h --namespace=kube-system -o jsonpath --template={.status.podIP}

위와 같이 dns 서버의 ip를 조회할 수도 있다.

kubectl describe를 통해 객체에 대하여 더 자세한 정보를 얻을 수 있다.

$ kubectl describe pods coredns-5d78c9869d-7s84h --namespace=kube-system

kubectl explain을 통해 객체 타입에 지원되는 필드 목록을 확인할 수 있다.

쿠버네티스 객체 관리

쿠버네티스 객체들은 모두 JSON이나 YAML 파일로 표현되고 관리될 수 있다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        kubernetes.io/change-cause: "Update nginx version"
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        ports:
        - containerPort: 80

위 파일은 간단한 nginx를 배포하는 deployment 객체의 예시이다.

$ kubectl apply -f deployment-example.yaml

위와 같이 deployment-example.yaml에 저장된 객체를 생성할 수 있다.
객체에 변경사항이 발생하여 파일을 수정한 뒤에도 동일한 명령어로 클러스터 내 객체를 수정하여 파일 내 상태와 클러스터의 상태를 일치시킬 수 있다.

클러스터 객체를 실제로 변경하지 않고 명령이 적용되는 것을 확인만 하고 싶다면 --dry-run 옵션을 사용할 수 있다.

--dry-run=none: 실제로 명령을 실행
--dry-run=client: 쿠버네티스 API를 호출하지 않고 클라이언트에서만 확인하기에 실제 동작과 다를 수 있다.
--dry-run=server: 쿠버네티스 API를 호출하지만 객체를 실제로 변경하지 않음
$ kubectl apply -f deployment-example.yaml --dry-run=server -o yaml

위와 같이 명령어를 실행하면 실제로 객체 변경은 되지 않지만 정상 동작 여부 등을 파악할 수 있다.

apply 이외에도 edit 명령을 통해 객체의 최신 상태를 확인하고 정의된 상태를 편집할 수도 있다.

$ kubectl edit deployments nginx-deployment

혹은 apply에 edit-last-applied, view-last-applied 명령을 사용해 적용된 객체 파일 정보를 수정하거나 확인할 수 있다.

$ kubectl apply -f deployment-example.yaml edit-last-applied

delete명령을 통해 객체를 삭제할 수 있다.

$ kubectl delete -f deployment-example.yaml

레이블링 및 어노테이션

쿠버네티스 객체는 레이블을 통하여 객체를 구분할 수 있다.
레이블은 key-value로 구성되어있으며 객체 생성 시점에 메타데이터로 붙일 수 있다.
객체 별로 하나 이상의 레이블을 가질 수 있다.

어노테이션은 레이블과 달리 사용자가 지정하는 것이 아니라 쿠버네티스 시스템에서 지정한다.

특정 파드에 rel=stable이라는 레이블을 달고 싶다면 다음과 같은 명령어를 사용하면 된다.

$ kubectl label pods nginx rel=stable
$ kubectl label pods nginx rel-

위와 같이 레이블을 삭제할 수도 있다.

디버깅

$ kubectl logs {파드 이름}

위와 같이 컨테이너의 로그를 확인할 수 있다.
파드 안에 여러 컨테이너가 존재한다면 -c 옵션을 통해 특정 컨테이너를 선택할 수 있다.

현재 실행중인 컨테이너에 명령어를 실행하려면 exec를 사용한다.

$ kubectl exec -it nginx-deployment-877688448-62gpd -- /bin/bash

위 명령어를 통해 이전에 생성한 nginx 파드에 접속할 수 있다.

0개의 댓글