Kubernetes 이야기

kubectl 활용 팁 본문

Kubernetes/일반

kubectl 활용 팁

kmaster 2022. 9. 11. 21:49
반응형

Kubectl는 Kubernetes에서 엔지니어들이 가장 많이 사용하는 도구일 것이다. Kubectl에서 자주 사용되는 명령어들을 알아보자.

 

명령 자동 완성

명령 자동 완성을 사용하면 Tab 키를 사용하여 kubectl 명령의 개별 부분을 자동 완성할 수 있다. 자동 완성을 위해서는 .bashrc 파일에 아래를 추가한다.

source <(kubectl completion bash)
만약 bash-completion 이 설치되어 있지 않으면 리눅스에 설치를 진행해야 한다.
ubuntu : sudo apt-get install bash-completion
redhat : yum install bash-completion

 

리소스 사양 조회

yaml을 만들 때 Kubernetes의 리소스 사양을 조회하고자 하는 경우가 있다. 이때는 kubectl explain [resource] 로 조회할 수 있다.

$ kubectl explain deployments --recursive | more
KIND:     Deployment
VERSION:  apps/v1

DESCRIPTION:
     Deployment enables declarative updates for Pods and ReplicaSets.

FIELDS:
   apiVersion   <string>
   kind <string>
   metadata     <Object>
      annotations       <map[string]string>
      creationTimestamp <string>
      deletionGracePeriodSeconds        <integer>
      deletionTimestamp <string>
      finalizers        <[]string>
      generateName      <string>
      generation        <integer>
      labels    <map[string]string>
      managedFields     <[]Object>
         apiVersion     <string>
         fieldsType     <string>
         fieldsV1       <map[string]>
         manager        <string>
         operation      <string>
         subresource    <string>
         time   <string>
      name      <string>
      namespace <string>
...

apiserver의 resource들은 다음 명령을 통해 조회할 수 있다.

$ kubectl api-resources
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus
configmaps                        cm           v1                                     true         ConfigMap
endpoints                         ep           v1                                     true         Endpoints
...

 

Context

기본 Namespace 변경

# kubectl config set-context $(kubectl config current-context) --namespace=<namespace>

현재 Context 조회 및 변경

# kubectl config current-context
# kubectl config use-context <context>

 

Yaml 생성

Pod 생성

kubectl run pod --image=nginx:latest \
    --labels type=web \
    --dry-run=client -o yaml > pod.yaml

Service 생성

kubectl expose pod mypod \
    --port=80 \
    --name mypod-service \
    --type=NodePort \
    --dry-run=client -o yaml > mypod-service.yaml

deployment 생성

kubectl create deployment mydeployment \
    --image=nginx:latest \
    --dry-run=client -o yaml > mydeployment.yaml

생성된 deployment의 service 생성

kubectl expose deployment mydeployment \
    --type=NodePort \
    --port=8080 \
    --name=mydeployment-service \
    --dry-run=client -o yaml > mydeployment-service.yaml

Job 생성

kubectl create job myjob \
    --image=nginx:latest \
    --dry-run=client -o yaml

Cronjob 생성

kubectl create cj mycronjob \
    --image=nginx:latest \
    --schedule="* * * * *" \
    --dry-run=client -o yaml

 

Labels 정보 조회

$ kubectl get pods --show-labels
NAME                          READY   STATUS    RESTARTS   AGE     LABELS
canary-58dc8b498f-bbrss       1/1     Running   0          8d      app=canary,pod-template-hash=58dc8b498f
hello-84695987b6-l2rkh        1/1     Running   0          3d      app=hello,pod-template-hash=84695987b6
...

특정 Label을 가진 Pod 조회

# kubectl get pods -l 'app in (production,hello),region notin (busan)'

 

JSONPath 표현식

특정 필드의 값을 조회하는 경우 custom-columns 를 사용한다.

# Select all elements of a list
kubectl get pods -o custom-columns='NAME:metadata.name,DATA:spec.containers[*].image'

# Select a specific element of a list
kubectl get pods -o custom-columns='DATA:spec.containers[0].image'

# Select those elements of a list that match a filter expression
kubectl get pods -o custom-columns='DATA:spec.containers[?(@.image!="nginx")].image'

# Select all fields under a specific location, regardless of their name
kubectl get pods -o custom-columns='DATA:metadata.*'

# Select all fields with a specific name, regardless of their location
kubectl get pods -o custom-columns='DATA:..image'

 

Go-template

# range fetch fields
kubectl get pod -n kube-system -ogo-template='{{range .items}}{{ .metadata.name }}{{end}}'
# printf change format
kubectl get pod -n kube-system -ogo-template='{{range .items}}{{ printf "%s\n" .metadata.name }}{{end}}'
# printf multi fields
kubectl get pod -n kube-system -ogo-template='{{range .items}}{{ printf "%-20s%-50s\n" .metadata.namespace .metadata.name }}{{end}}'
# get nodePort if exists
kubectl get svc -nkube-system -o go-template='{{range .items}}{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{"\n"}}{{end}}{{end}}{{end}}'

 

Kubectl get

# Name으로 정렬된 서비스의 목록 조회
kubectl get services --sort-by=.metadata.name

# 원시 출력
kubectl get --raw=/apis/apps/v1/deployments

# metrics 정보
kubectl get --raw /metrics

# 모든 Namespace의 Warning이벤트만 조회
kubectl get events -w --field-selector=type=Warning -A

# 재시작 횟수로 정렬된 파드의 목록 조회
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'

# PersistentVolumes을 용량별로 정렬해서 조회
kubectl get pv --sort-by=.spec.capacity.storage

# app=cassandra 레이블을 가진 모든 파드의 레이블 버전 조회
kubectl get pods --selector=app=cassandra -o \
  jsonpath='{.items[*].metadata.labels.version}'
  
# 'ca.crt'와 같이 점이 있는 키값을 검색한다
kubectl get configmap myconfig \
  -o jsonpath='{.data.ca\.crt}'
  
# 네임스페이스의 모든 실행 중인 파드를 조회
kubectl get pods --field-selector=status.phase=Running

# 모든 노드의 외부IP를 조회
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

# 외부 도구 없이 디코딩된 시크릿 출력
kubectl get secret my-secret -o go-template='{{range $k,$v := .data}}{{"### "}}{{$k}}{{"\n"}}{{$v|base64decode}}{{"\n\n"}}{{end}}'

# 파드에 의해 현재 사용되고 있는 모든 시크릿 목록 조회
kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq

# 타임스탬프로 정렬된 이벤트 목록 조회
kubectl get events --sort-by=.metadata.creationTimestamp

 

 

리소스 패치

# 노드를 부분적으로 업데이트
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'

# 컨테이너의 이미지를 업데이트. 병합(merge) 키이므로, spec.containers[*].name이 필요
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'

# 위치 배열을 이용한 json 패치를 사용하여, 컨테이너의 이미지를 업데이트
kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'

# 위치 배열을 이용한 json 패치를 사용하여 livenessProbe 디플로이먼트 비활성화
kubectl patch deployment valid-deployment  --type json   -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'

# 위치 배열에 새 요소 추가
kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]'

# 디플로이먼트의 scale 서브리소스를 패치하여 레플리카 수 업데이트
kubectl patch deployment nginx-deployment --subresource='scale' --type='merge' -p '{"spec":{"replicas":2}}'

 

리소스 삭제

kubectl delete pods,services -l name=myLabel                      # name=myLabel 라벨을 가진 파드와 서비스 삭제
kubectl -n my-ns delete pod,svc --all                             # my-ns 네임스페이스 내 모든 파드와 서비스 삭제
# awk pattern1 또는 pattern2에 매칭되는 모든 파드 삭제
kubectl get pods  -n mynamespace --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs  kubectl delete -n mynamespace pod

 

RBAC 권한 조회

# kubectl auth can-i --list
# kubectl -n kube-system auth can-i --list --as system:serviceaccount:kube-system:default

 

kubectl plugin 만들기

/usr/local/bin/kubectl-xxx 이름으로 bash나 python, go 실행프로그램을 작성한다.

#!/bin/bash
for argv in "$*"
do
  kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' $argv
done

해당 shell 이름이 kubectl-img인 경우 chmod +x kubectl-img 로 변경한다. 이제 다음과 같이 kubectl 명령을 수행하면 image이름을 출력하는 plugin이 된다.

# kubectl img -n test
NAME                          IMAGES
canary-58dc8b498f-bbrss       mirrorgooglecontainers/echoserver:1.10
hello-84695987b6-l2rkh        docker.io/kmaster8/helloworld:2.0
production-846769889f-g2dck   mirrorgooglecontainers/echoserver:1.10
production-846769889f-t8bwv   mirrorgooglecontainers/echoserver:1.10

 

 

참고

https://kubernetes.io/ko/docs/reference/kubectl/cheatsheet/

반응형

'Kubernetes > 일반' 카테고리의 다른 글

minikube 설치  (0) 2022.10.03
kubernetes 1.24에서 service accounts와 secret  (0) 2022.10.01
Kubernetes EndpointSlices  (0) 2022.09.06
Kubernetes에서 NodeLocal DNSCache 사용  (0) 2022.09.06
Finalizers, ownerReferences  (0) 2022.08.30
Comments