ํ•ด๋‹น ๋ฌธ์„œ์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „: v1.31

Kubernetes v1.31 ๋ฌธ์„œ๋Š” ๋” ์ด์ƒ ์ ๊ทน์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Œ. ํ˜„์žฌ ๋ณด๊ณ ์žˆ๋Š” ๋ฌธ์„œ๋Š” ์ •์  ์Šค๋ƒ…์ƒท์ž„. ์ตœ์‹  ๋ฌธ์„œ๋ฅผ ์œ„ํ•ด์„œ๋Š”, ๋‹ค์Œ์„ ์ฐธ๊ณ . ์ตœ์‹  ๋ฒ„์ „.

kubectl ์น˜ํŠธ ์‹œํŠธ

์ด ํŽ˜์ด์ง€๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” kubectl ์ปค๋งจ๋“œ์™€ ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ๋ชฉ๋ก์„ ํฌํ•จํ•œ๋‹ค.

Kubectl ์ž๋™ ์™„์„ฑ

BASH

source <(kubectl completion bash) # bash-completion ํŒจํ‚ค์ง€๋ฅผ ๋จผ์ € ์„ค์น˜ํ•œ ํ›„, bash์˜ ์ž๋™ ์™„์„ฑ์„ ํ˜„์žฌ ์…ธ์— ์„ค์ •ํ•œ๋‹ค
echo "source <(kubectl completion bash)" >> ~/.bashrc # ์ž๋™ ์™„์„ฑ์„ bash ์…ธ์— ์˜๊ตฌ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค

๋˜ํ•œ, kubectl์˜ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์•ฝ์นญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

alias k=kubectl
complete -o default -F __start_kubectl k

ZSH

source <(kubectl completion zsh)  # ํ˜„์žฌ ์…ธ์— zsh์˜ ์ž๋™ ์™„์„ฑ ์„ค์ •
echo '[[ $commands[kubectl] ]] && source <(kubectl completion zsh)' >> ~/.zshrc # ์ž๋™ ์™„์„ฑ์„ zsh ์…ธ์— ์˜๊ตฌ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

--all-namespaces ์— ๋Œ€ํ•œ ๋…ธํŠธ

--all-namespaces๋ฅผ ๋ถ™์—ฌ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, --all-namespaces์˜ ์ถ•์•ฝํ˜•์„ ์•Œ์•„ ๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

kubectl -A

Kubectl ์ปจํ…์ŠคํŠธ์™€ ์„ค์ •

kubectl์ด ํ†ต์‹ ํ•˜๊ณ  ์„ค์ • ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์„ค์ • ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” kubeconfig๋ฅผ ์ด์šฉํ•œ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„ ์ธ์ฆ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

kubectl config view # ๋ณ‘ํ•ฉ๋œ kubeconfig ์„ค์ •์„ ํ‘œ์‹œํ•œ๋‹ค.

# ๋™์‹œ์— ์—ฌ๋Ÿฌ kubeconfig ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ณ‘ํ•ฉ๋œ ๊ตฌ์„ฑ์„ ํ™•์ธํ•œ๋‹ค
KUBECONFIG=~/.kube/config:~/.kube/kubconfig2

kubectl config view

# e2e ์‚ฌ์šฉ์ž์˜ ์•”ํ˜ธ๋ฅผ ํ™•์ธํ•œ๋‹ค
kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'

kubectl config view -o jsonpath='{.users[].name}'     # ์ฒซ ๋ฒˆ์งธ ์‚ฌ์šฉ์ž ์ถœ๋ ฅ
kubectl config view -o jsonpath='{.users[*].name}'    # ์‚ฌ์šฉ์ž ๋ฆฌ์ŠคํŠธ ์กฐํšŒ
kubectl config get-contexts                           # ์ปจํ…์ŠคํŠธ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ
kubectl config current-context                        # ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ์ถœ๋ ฅ
kubectl config use-context my-cluster-name            # my-cluster-name๋ฅผ ๊ธฐ๋ณธ ์ปจํ…์ŠคํŠธ๋กœ ์„ค์ •

kubectl config set-cluster my-cluster-name            # kubeconfig์— ํด๋Ÿฌ์Šคํ„ฐ ์—”ํŠธ๋ฆฌ๋ฅผ ์„ค์ •

# kubeconfig์— ์ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐœ์ƒ์‹œํ‚จ ์š”์ฒญ์— ์‚ฌ์šฉํ•  ํ”„๋ก์‹œ ์„œ๋ฒ„์˜ URL์„ ๊ตฌ์„ฑํ•œ๋‹ค.
kubectl config set-cluster my-cluster-name --proxy-url=my-proxy-url

# ๊ธฐ๋ณธ ์ธ์ฆ์„ ์ง€์›ํ•˜๋Š” ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ kubeconf์— ์ถ”๊ฐ€ํ•œ๋‹ค
kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword

# ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ ๋ชจ๋“  ํ›„์† kubectl ์ปค๋งจ๋“œ์— ๋Œ€ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•œ๋‹ค
kubectl config set-context --current --namespace=ggckad-s2

# ํŠน์ • ์‚ฌ์šฉ์ž์™€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…์ŠคํŠธ ์„ค์ •
kubectl config set-context gce --user=cluster-admin --namespace=foo \
  && kubectl config use-context gce

kubectl config unset users.foo                       # foo ์‚ฌ์šฉ์ž ์‚ญ์ œ

# ์ปจํ…์ŠคํŠธ/๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์„ค์ •/์กฐํšŒํ•˜๋Š” ๋‹จ์ถ• ๋ช…๋ น (bash ๋ฐ bash ํ˜ธํ™˜ ์…ธ์—์„œ๋งŒ ๋™์ž‘ํ•จ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์„ค์ •์„ ์œ„ํ•ด kn ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๊ฐ€ ์„ค์ •๋˜์–ด์•ผ ํ•จ)
alias kx='f() { [ "$1" ] && kubectl config use-context $1 || kubectl config current-context ; } ; f'
alias kn='f() { [ "$1" ] && kubectl config set-context --current --namespace $1 || kubectl config view --minify | grep namespace | cut -d" " -f6 ; } ; f'

Kubectl apply

apply๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ํŒŒ์ผ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•œ๋‹ค. kubectl apply๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•  ๋•Œ ๊ถŒ์žฅ๋œ๋‹ค. Kubectl Book์„ ์ฐธ๊ณ ํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” JSON์ด๋‚˜ YAML๋กœ ์ •์˜๋œ๋‹ค. ํŒŒ์ผ ํ™•์žฅ์ž๋Š” .yaml , .yml, .json ์ด ์‚ฌ์šฉ๋œ๋‹ค.

kubectl apply -f ./my-manifest.yaml            # ๋ฆฌ์†Œ์Šค(๋“ค) ์ƒ์„ฑ
kubectl apply -f ./my1.yaml -f ./my2.yaml      # ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ€ํ„ฐ ์ƒ์„ฑ
kubectl apply -f ./dir                         # dir ๋‚ด ๋ชจ๋“  ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์—์„œ ๋ฆฌ์†Œ์Šค(๋“ค) ์ƒ์„ฑ
kubectl apply -f https://git.io/vPieo          # url๋กœ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค(๋“ค) ์ƒ์„ฑ
kubectl create deployment nginx --image=nginx  # nginx ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ์ž‘

# "Hello World"๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์žก(Job) ์ƒ์„ฑ
kubectl create job hello --image=busybox:1.28 -- echo "Hello World"

# ๋งค๋ถ„๋งˆ๋‹ค "Hello World"๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํฌ๋ก ์žก(CronJob) ์ƒ์„ฑ
kubectl create cronjob hello --image=busybox:1.28   --schedule="*/1 * * * *" -- echo "Hello World"

kubectl explain pods                           # ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋ฌธ์„œ๋ฅผ ์กฐํšŒ

# stdin์œผ๋กœ ๋‹ค์ˆ˜์˜ YAML ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    args:
    - sleep
    - "1000000"
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep-less
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    args:
    - sleep
    - "1000"
EOF

# ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ‚ค๋กœ ์‹œํฌ๋ฆฟ ์ƒ์„ฑ
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: $(echo -n "s33msi4" | base64 -w0)
  username: $(echo -n "jane" | base64 -w0)
EOF

๋ฆฌ์†Œ์Šค ์กฐํšŒ ๋ฐ ์ฐพ๊ธฐ

# ๊ธฐ๋ณธ ์ถœ๋ ฅ์„ ์œ„ํ•œ Get ์ปค๋งจ๋“œ
kubectl get services                          # ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด ๋ชจ๋“  ์„œ๋น„์Šค์˜ ๋ชฉ๋ก ์กฐํšŒ
kubectl get pods --all-namespaces             # ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด ๋ชจ๋“  ํŒŒ๋“œ์˜ ๋ชฉ๋ก ์กฐํšŒ
kubectl get pods -o wide                      # ํ•ด๋‹นํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด ๋ชจ๋“  ํŒŒ๋“œ์˜ ์ƒ์„ธ ๋ชฉ๋ก ์กฐํšŒ
kubectl get deployment my-dep                 # ํŠน์ • ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ๋ชฉ๋ก ์กฐํšŒ
kubectl get pods                              # ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด ๋ชจ๋“  ํŒŒ๋“œ์˜ ๋ชฉ๋ก ์กฐํšŒ
kubectl get pod my-pod -o yaml                # ํŒŒ๋“œ์˜ YAML ์กฐํšŒ

# ์ƒ์„ธ ์ถœ๋ ฅ์„ ์œ„ํ•œ Describe ์ปค๋งจ๋“œ
kubectl describe nodes my-node
kubectl describe pods my-pod

# Name์œผ๋กœ ์ •๋ ฌ๋œ ์„œ๋น„์Šค์˜ ๋ชฉ๋ก ์กฐํšŒ
kubectl get services --sort-by=.metadata.name

# ์žฌ์‹œ์ž‘ ํšŸ์ˆ˜๋กœ ์ •๋ ฌ๋œ ํŒŒ๋“œ์˜ ๋ชฉ๋ก ์กฐํšŒ
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}'

# ๋ฐ‘์ค„(`_`) ๋Œ€์‹  ๋Œ€์‹œ(`-`)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ base64 ์ธ์ฝ”๋”ฉ๋œ ๊ฐ’์„ ์กฐํšŒ
kubectl get secret my-secret --template='{{index .data "key-name-with-dashes"}}'

# ๋ชจ๋“  ์›Œ์ปค ๋…ธ๋“œ ์กฐํšŒ (์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 'node-role.kubernetes.io/control-plane'
# ์œผ๋กœ ๋ช…๋ช…๋œ ๋ผ๋ฒจ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ œ์™ธ)
kubectl get node --selector='!node-role.kubernetes.io/control-plane'

# ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ชจ๋“  ์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ๋ฅผ ์กฐํšŒ
kubectl get pods --field-selector=status.phase=Running

# ๋ชจ๋“  ๋…ธ๋“œ์˜ ์™ธ๋ถ€IP๋ฅผ ์กฐํšŒ
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

# ํŠน์ • RC์— ์†ํ•ด์žˆ๋Š” ํŒŒ๋“œ ์ด๋ฆ„์˜ ๋ชฉ๋ก ์กฐํšŒ
# "jq" ์ปค๋งจ๋“œ๋Š” jsonpath๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งค์šฐ ๋ณต์žกํ•œ ๋ณ€ํ™˜์— ์œ ์šฉํ•˜๋‹ค. https://stedolan.github.io/jq/ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?}
echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name})

# ๋ชจ๋“  ํŒŒ๋“œ(๋˜๋Š” ๋ ˆ์ด๋ธ”์„ ์ง€์›ํ•˜๋Š” ๋‹ค๋ฅธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ)์˜ ๋ ˆ์ด๋ธ” ์กฐํšŒ
kubectl get pods --show-labels

# ์–ด๋–ค ๋…ธ๋“œ๊ฐ€ ์ค€๋น„๋๋Š”์ง€ ํ™•์ธ
JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \
 && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"

# ์™ธ๋ถ€ ๋„๊ตฌ ์—†์ด ๋””์ฝ”๋”ฉ๋œ ์‹œํฌ๋ฆฟ ์ถœ๋ ฅ
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

# ๋ชจ๋“  ํŒŒ๋“œ์˜ ์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ(initContainer)์˜ ์ปจํ…Œ์ด๋„ˆID ๋ชฉ๋ก ์กฐํšŒ
# ์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ(initContainer)๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ์ •์ง€๋œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
kubectl get pods --all-namespaces -o jsonpath='{range .items[*].status.initContainerStatuses[*]}{.containerID}{"\n"}{end}' | cut -d/ -f3

# ํƒ€์ž„์Šคํƒฌํ”„๋กœ ์ •๋ ฌ๋œ ์ด๋ฒคํŠธ ๋ชฉ๋ก ์กฐํšŒ
kubectl get events --sort-by=.metadata.creationTimestamp

# ๋ชจ๋“  Warning ํƒ€์ž… ์ด๋ฒคํŠธ ์กฐํšŒ
kubectl events --types=Warning

# ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ์ ์šฉ๋œ ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ˜„์žฌ ์ƒํƒœ์™€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•œ๋‹ค.
kubectl diff -f ./my-manifest.yaml

# ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜๋œ ๋ชจ๋“  ํ‚ค์˜ ๋งˆ์นจํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
# ๋ณต์žกํ•œ ์ค‘์ฒฉ JSON ๊ตฌ์กฐ ๋‚ด์—์„œ ํ‚ค๋ฅผ ์ฐพ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค.
kubectl get nodes -o json | jq -c 'paths|join(".")'

# ํŒŒ๋“œ ๋“ฑ์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜๋œ ๋ชจ๋“  ํ‚ค์˜ ๋งˆ์นจํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
kubectl get pods -o json | jq -c 'paths|join(".")'

# ๋ชจ๋“  ํŒŒ๋“œ์— ๋Œ€ํ•ด ENV๋ฅผ ์ƒ์„ฑํ•œ๋‹ค(๊ฐ ํŒŒ๋“œ์— ๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๊ณ , ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์žˆ๊ณ , `env` ๋ช…๋ น์–ด๊ฐ€ ๋™์ž‘ํ•œ๋‹ค๊ณ  ๊ฐ€์ •).
# `env` ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์ง€์›๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ๋ชจ๋“  ํŒŒ๋“œ์— ์‹คํ–‰ํ•  ๋•Œ์—๋„ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค.
for pod in $(kubectl get po --output=jsonpath={.items..metadata.name}); do echo $pod && kubectl exec -it $pod -- env; done

# ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ status ์„œ๋ธŒ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐํšŒํ•œ๋‹ค.
kubectl get deployment nginx-deployment --subresource=status

๋ฆฌ์†Œ์Šค ์—…๋ฐ์ดํŠธ

kubectl set image deployment/frontend www=image:v2               # "frontend" ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ "www" ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋กค๋ง ์—…๋ฐ์ดํŠธ
kubectl rollout history deployment/frontend                      # ํ˜„ ๋ฆฌ๋น„์ „์„ ํฌํ•จํ•œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ์ด๋ ฅ์„ ์ฒดํฌ
kubectl rollout undo deployment/frontend                         # ์ด์ „ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋กœ ๋กค๋ฐฑ
kubectl rollout undo deployment/frontend --to-revision=2         # ํŠน์ • ๋ฆฌ๋น„์ „์œผ๋กœ ๋กค๋ฐฑ
kubectl rollout status -w deployment/frontend                    # ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ "frontend" ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ๋กค๋ง ์—…๋ฐ์ดํŠธ ์ƒํƒœ๋ฅผ ๊ฐ์‹œ
kubectl rollout restart deployment/frontend                      # "frontend" ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ๋กค๋ง ์žฌ์‹œ์ž‘


cat pod.json | kubectl replace -f -                              # stdin์œผ๋กœ ์ „๋‹ฌ๋œ JSON์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ๋“œ ๊ต์ฒด

# ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ•์ œ ๊ต์ฒด, ์‚ญ์ œ ํ›„ ์žฌ์ƒ์„ฑํ•จ. ์ด๊ฒƒ์€ ์„œ๋น„์Šค๋ฅผ ์ค‘๋‹จ์‹œํ‚ด.
kubectl replace --force -f ./pod.json

# ๋ณต์ œ๋œ nginx๋ฅผ ์œ„ํ•œ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 80 ํฌํŠธ๋กœ ์„œ๋น„์Šคํ•˜๊ณ , ์ปจํ…Œ์ด๋„ˆ๋Š” 8000 ํฌํŠธ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.
kubectl expose rc nginx --port=80 --target-port=8000

# ๋‹จ์ผ-์ปจํ…Œ์ด๋„ˆ ํŒŒ๋“œ์˜ ์ด๋ฏธ์ง€ ๋ฒ„์ „(ํƒœ๊ทธ)์„ v4๋กœ ์—…๋ฐ์ดํŠธ
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

kubectl label pods my-pod new-label=awesome                      # ๋ ˆ์ด๋ธ” ์ถ”๊ฐ€
kubectl label pods my-pod new-label-                             # ๋ ˆ์ด๋ธ” ์ œ๊ฑฐ
kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq       # ์–ด๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€
kubectl autoscale deployment foo --min=2 --max=10                # ๋””ํ”Œ๋กœ์ด๋จผํŠธ "foo" ์˜คํ† ์Šค์ผ€์ผ

๋ฆฌ์†Œ์Šค ํŒจ์น˜

# ๋…ธ๋“œ๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ
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}}'

๋ฆฌ์†Œ์Šค ํŽธ์ง‘

์„ ํ˜ธํ•˜๋Š” ํŽธ์ง‘๊ธฐ๋กœ ๋ชจ๋“  API ๋ฆฌ์†Œ์Šค๋ฅผ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl edit svc/docker-registry                      # docker-registry๋ผ๋Š” ์„œ๋น„์Šค ํŽธ์ง‘
KUBE_EDITOR="nano" kubectl edit svc/docker-registry   # ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ ์‚ฌ์šฉ

๋ฆฌ์†Œ์Šค ์Šค์ผ€์ผ๋ง

kubectl scale --replicas=3 rs/foo                                 # 'foo'๋ผ๋Š” ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ 3์œผ๋กœ ์Šค์ผ€์ผ
kubectl scale --replicas=3 -f foo.yaml                            # "foo.yaml"์— ์ง€์ •๋œ ๋ฆฌ์†Œ์Šค์˜ ํฌ๊ธฐ๋ฅผ 3์œผ๋กœ ์Šค์ผ€์ผ
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql  # mysql์ด๋ผ๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ํ˜„์žฌ ํฌ๊ธฐ๊ฐ€ 2์ธ ๊ฒฝ์šฐ, mysql์„ 3์œผ๋กœ ์Šค์ผ€์ผ
kubectl scale --replicas=5 rc/foo rc/bar rc/baz                   # ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ ์Šค์ผ€์ผ

๋ฆฌ์†Œ์Šค ์‚ญ์ œ

kubectl delete -f ./pod.json                                      # pod.json์— ์ง€์ •๋œ ์œ ํ˜• ๋ฐ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋“œ ์‚ญ์ œ
kubectl delete pod unwanted --now                                 # ์œ ์˜ˆ ์‹œ๊ฐ„ ์—†์ด ์ฆ‰์‹œ ํŒŒ๋“œ ์‚ญ์ œ
kubectl delete pod,service baz foo                                # "baz", "foo"์™€ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํŒŒ๋“œ์™€ ์„œ๋น„์Šค ์‚ญ์ œ
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

์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉ

kubectl logs my-pod                                 # ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (stdout)
kubectl logs -l name=myLabel                        # name์ด myLabel์ธ ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (stdout)
kubectl logs my-pod --previous                      # ์ปจํ…Œ์ด๋„ˆ์˜ ์ด์ „ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์— ๋Œ€ํ•œ ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (stdout)
kubectl logs my-pod -c my-container                 # ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (stdout, ๋ฉ€ํ‹ฐ-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl logs -l name=myLabel -c my-container        # name์ด myLabel์ธ ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (stdout)
kubectl logs my-pod -c my-container --previous      # ์ปจํ…Œ์ด๋„ˆ์˜ ์ด์ „ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์— ๋Œ€ํ•œ ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (stdout, ๋ฉ€ํ‹ฐ-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl logs -f my-pod                              # ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆผ ํŒŒ๋“œ ๋กœ๊ทธ(stdout)
kubectl logs -f my-pod -c my-container              # ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆผ ํŒŒ๋“œ ๋กœ๊ทธ(stdout, ๋ฉ€ํ‹ฐ-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl logs -f -l name=myLabel --all-containers    # name์ด myLabel์ธ ๋ชจ๋“  ํŒŒ๋“œ์˜ ๋กœ๊ทธ ์ŠคํŠธ๋ฆฌ๋ฐ (stdout)
kubectl run -i --tty busybox --image=busybox:1.28 -- sh  # ๋Œ€ํ™”ํ˜• ์…ธ๋กœ ํŒŒ๋“œ๋ฅผ ์‹คํ–‰
kubectl run nginx --image=nginx -n mynamespace      # mynamespace ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ nginx ํŒŒ๋“œ 1๊ฐœ ์‹คํ–‰
kubectl run nginx --image=nginx --dry-run=client -o yaml > pod.yaml
                                                    # nginx ํŒŒ๋“œ์— ๋Œ€ํ•œ spec์„ ์ƒ์„ฑํ•˜๊ณ , pod.yaml์ด๋ผ๋Š” ํŒŒ์ผ์— ํ•ด๋‹น ๋‚ด์šฉ์„ ๊ธฐ๋กํ•œ๋‹ค.
kubectl attach my-pod -i                            # ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐ
kubectl port-forward my-pod 5000:6000               # ๋กœ์ปฌ ๋จธ์‹ ์˜ 5000๋ฒˆ ํฌํŠธ๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜๊ณ , my-pod์˜ 6000๋ฒˆ ํฌํŠธ๋กœ ์ „๋‹ฌ
kubectl exec my-pod -- ls /                         # ๊ธฐ์กด ํŒŒ๋“œ์—์„œ ๋ช…๋ น ์‹คํ–‰(ํ•œ ๊ฐœ ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl exec --stdin --tty my-pod -- /bin/sh        # ์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ๋กœ ๋Œ€ํ™”ํ˜• ์…ธ ์•ก์„ธ์Šค(1 ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl exec my-pod -c my-container -- ls /         # ๊ธฐ์กด ํŒŒ๋“œ์—์„œ ๋ช…๋ น ์‹คํ–‰(๋ฉ€ํ‹ฐ-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl top pod POD_NAME --containers               # ํŠน์ • ํŒŒ๋“œ์™€ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋ฉ”ํŠธ๋ฆญ ํ‘œ์‹œ
kubectl top pod POD_NAME --sort-by=cpu              # ์ง€์ •ํ•œ ํŒŒ๋“œ์— ๋Œ€ํ•œ ๋ฉ”ํŠธ๋ฆญ์„ ํ‘œ์‹œํ•˜๊ณ  'cpu' ๋˜๋Š” 'memory'๋ณ„๋กœ ์ •๋ ฌ

์ปจํ…Œ์ด๋„ˆ๋กœ/์ปจํ…Œ์ด๋„ˆ์—์„œ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ณต์‚ฌ

kubectl cp /tmp/foo_dir my-pod:/tmp/bar_dir            # ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ /tmp/foo_dir ๋ฅผ ํ˜„์žฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ my-pod ํŒŒ๋“œ ์•ˆ์˜ /tmp/bar_dir ๋กœ ๋ณต์‚ฌ
kubectl cp /tmp/foo my-pod:/tmp/bar -c my-container    # ๋กœ์ปฌ ํŒŒ์ผ /tmp/foo ๋ฅผ my-pod ํŒŒ๋“œ์˜ my-container ์ปจํ…Œ์ด๋„ˆ ์•ˆ์˜ /tmp/bar ๋กœ ๋ณต์‚ฌ
kubectl cp /tmp/foo my-namespace/my-pod:/tmp/bar       # ๋กœ์ปฌ ํŒŒ์ผ /tmp/foo ๋ฅผ my-namespace ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ my-pod ํŒŒ๋“œ ์•ˆ์˜ /tmp/bar ๋กœ ๋ณต์‚ฌ
kubectl cp my-namespace/my-pod:/tmp/foo /tmp/bar       # my-namespace ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ my-pod ํŒŒ๋“œ ์•ˆ์˜ ํŒŒ์ผ /tmp/foo ๋ฅผ ๋กœ์ปฌ์˜ /tmp/bar ๋กœ ๋ณต์‚ฌ
tar cf - /tmp/foo | kubectl exec -i -n my-namespace my-pod -- tar xf - -C /tmp/bar           # ๋กœ์ปฌ ํŒŒ์ผ /tmp/foo ๋ฅผ my-namespace ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ my-pod ํŒŒ๋“œ ์•ˆ์˜ /tmp/bar ๋กœ ๋ณต์‚ฌ
kubectl exec -n my-namespace my-pod -- tar cf - /tmp/foo | tar xf - -C /tmp/bar    # my-namespace ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ my-pod ํŒŒ๋“œ ์•ˆ์˜ ํŒŒ์ผ /tmp/foo ๋ฅผ ๋กœ์ปฌ์˜ /tmp/bar ๋กœ ๋ณต์‚ฌ

๋””ํ”Œ๋กœ์ด๋จผํŠธ, ์„œ๋น„์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉ

kubectl logs deploy/my-deployment                         # ๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ๋Œ€ํ•œ ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (๋‹จ์ผ-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)
kubectl logs deploy/my-deployment -c my-container         # ๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ๋Œ€ํ•œ ํŒŒ๋“œ ๋กœ๊ทธ ๋คํ”„ (๋ฉ€ํ‹ฐ-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)

kubectl port-forward svc/my-service 5000                  # ๋กœ์ปฌ ๋จธ์‹ ์˜ 5000๋ฒˆ ํฌํŠธ๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜๊ณ , my-service์˜ ๋™์ผํ•œ(5000๋ฒˆ) ํฌํŠธ๋กœ ์ „๋‹ฌ
kubectl port-forward svc/my-service 5000:my-service-port  # ๋กœ์ปฌ ๋จธ์‹ ์˜ 5000๋ฒˆ ํฌํŠธ๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜๊ณ , my-service์˜ <my-service-port> ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ํฌํŠธ๋กœ ์ „๋‹ฌ

kubectl port-forward deploy/my-deployment 5000:6000       # ๋กœ์ปฌ ๋จธ์‹ ์˜ 5000๋ฒˆ ํฌํŠธ๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜๊ณ , <my-deployment> ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํŒŒ๋“œ์˜ 6000๋ฒˆ ํฌํŠธ๋กœ ์ „๋‹ฌ
kubectl exec deploy/my-deployment -- ls                   # <my-deployment> ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์ฒซ๋ฒˆ์งธ ํŒŒ๋“œ์˜ ์ฒซ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ์— ๋ช…๋ น์–ด ์‹คํ–‰ (๋‹จ์ผ- ๋˜๋Š” ๋‹ค์ค‘-์ปจํ…Œ์ด๋„ˆ ๊ฒฝ์šฐ)

๋…ธ๋“œ, ํด๋Ÿฌ์Šคํ„ฐ์™€ ์ƒํ˜ธ ์ž‘์šฉ

kubectl cordon my-node                                                # my-node๋ฅผ ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์—†๋„๋ก ํ‘œ๊ธฐ
kubectl drain my-node                                                 # ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด์„œ my-node๋ฅผ ์ค€๋น„ ์ƒํƒœ๋กœ ๋น„์›€
kubectl uncordon my-node                                              # my-node๋ฅผ ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ํ‘œ๊ธฐ
kubectl top node my-node                                              # ์ฃผ์–ด์ง„ ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋ฉ”ํŠธ๋ฆญ ํ‘œ์‹œ
kubectl cluster-info                                                  # ๋งˆ์Šคํ„ฐ ๋ฐ ์„œ๋น„์Šค์˜ ์ฃผ์†Œ ํ‘œ์‹œ
kubectl cluster-info dump                                             # ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ stdout์œผ๋กœ ๋คํ”„
kubectl cluster-info dump --output-directory=/path/to/cluster-state   # ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ /path/to/cluster-state์œผ๋กœ ๋คํ”„

# ํ˜„์žฌ ๋…ธ๋“œ์— ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” ํ…Œ์ธํŠธ(taint)๋“ค์„ ํ™•์ธ
kubectl get nodes -o='custom-columns=NodeName:.metadata.name,TaintKey:.spec.taints[*].key,TaintValue:.spec.taints[*].value,TaintEffect:.spec.taints[*].effect'

# ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” key์™€ effect๋ฅผ ๊ฐ–๋Š” ํ…Œ์ธํŠธ์˜ ๊ฒฝ์šฐ, ์ง€์ •ํ•œ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
kubectl taint nodes foo dedicated=special-user:NoSchedule

๋ฆฌ์†Œ์Šค ํƒ€์ž…

๋‹จ์ถ•๋ช…, API ๊ทธ๋ฃน๊ณผ ํ•จ๊ป˜ ์ง€์›๋˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์œ ํ˜•๋“ค, ๊ทธ๊ฒƒ๋“ค์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ์ข…๋ฅ˜(Kind)๋ฅผ ๋‚˜์—ด:

kubectl api-resources

API ๋ฆฌ์†Œ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ฅธ ์ž‘์—…:

kubectl api-resources --namespaced=true      # ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค
kubectl api-resources --namespaced=false     # ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค
kubectl api-resources -o name                # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์˜ ๋‹จ์ˆœํ•œ (๋ฆฌ์†Œ์Šค ์ด๋ฆ„๋งŒ) ์ถœ๋ ฅ
kubectl api-resources -o wide                # ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์˜ ํ™•์žฅ๋œ ("wide"๋กœ ์•Œ๋ ค์ง„) ์ถœ๋ ฅ
kubectl api-resources --verbs=list,get       # "list"์™€ "get"์˜ ์š”์ฒญ ๋™์‚ฌ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ถœ๋ ฅ
kubectl api-resources --api-group=extensions # "extensions" API ๊ทธ๋ฃน์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค

์ถœ๋ ฅ ํ˜•์‹ ์ง€์ •

ํŠน์ • ํ˜•์‹์œผ๋กœ ํ„ฐ๋ฏธ๋„ ์ฐฝ์— ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ถœ๋ ฅํ•˜๋ ค๋ฉด, ์ง€์›๋˜๋Š” kubectl ๋ช…๋ น์— -o (๋˜๋Š” --output) ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ถœ๋ ฅ ํ˜•์‹ ์„ธ๋ถ€ ์‚ฌํ•ญ
-o=custom-columns=<๋ช…์„ธ> ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์—ด ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ์ถœ๋ ฅ
-o=custom-columns-file=<ํŒŒ์ผ๋ช…> <ํŒŒ์ผ๋ช…>ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์—ด ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ์ถœ๋ ฅ
-o=json JSON ํ˜•์‹์˜ API ์˜ค๋ธŒ์ ํŠธ ์ถœ๋ ฅ
-o=jsonpath=<ํ…œํ”Œ๋ฆฟ> jsonpath ํ‘œํ˜„์‹์— ์ •์˜๋œ ํ•„๋“œ ์ถœ๋ ฅ
-o=jsonpath-file=<ํŒŒ์ผ๋ช…> <ํŒŒ์ผ๋ช…> ํŒŒ์ผ์—์„œ jsonpath ํ‘œํ˜„์‹์— ์ •์˜๋œ ํ•„๋“œ ์ถœ๋ ฅ
-o=name ๋ฆฌ์†Œ์Šค ๋ช…๋งŒ ์ถœ๋ ฅํ•˜๊ณ  ๊ทธ ์™ธ์—๋Š” ์ถœ๋ ฅํ•˜์ง€ ์•Š์Œ
-o=wide ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์ผ๋ฐ˜-ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๊ณ , ํŒŒ๋“œ์˜ ๊ฒฝ์šฐ ๋…ธ๋“œ ๋ช…์ด ํฌํ•จ
-o=yaml YAML ํ˜•์‹์˜ API ์˜ค๋ธŒ์ ํŠธ ์ถœ๋ ฅ

-o=custom-columns ์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ:

# ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  ์ด๋ฏธ์ง€
kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'

# `default` ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ํŒŒ๋“œ๋ณ„๋กœ ๊ทธ๋ฃน์ง€์–ด ์ถœ๋ ฅ
kubectl get pods --namespace default --output=custom-columns="NAME:.metadata.name,IMAGE:.spec.containers[*].image"

 # "registry.k8s.io/coredns:1.6.2" ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์ด๋ฏธ์ง€
kubectl get pods -A -o=custom-columns='DATA:spec.containers[?(@.image!="registry.k8s.io/coredns:1.6.2")].image'

# ์ด๋ฆ„์— ๊ด€๊ณ„์—†์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์•„๋ž˜์˜ ๋ชจ๋“  ํ•„๋“œ
kubectl get pods -A -o=custom-columns='DATA:metadata.*'

๋” ๋งŽ์€ ์˜ˆ์ œ๋Š” kubectl ์ฐธ์กฐ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

Kubectl ์ถœ๋ ฅ ๋กœ๊ทธ ์ƒ์„ธ ๋ ˆ๋ฒจ(verbosity)๊ณผ ๋””๋ฒ„๊น…

Kubectl ๋กœ๊ทธ ์ƒ์„ธ ๋ ˆ๋ฒจ(verbosity)์€ -v ๋˜๋Š”--v ํ”Œ๋ž˜๊ทธ์™€ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๋กœ ์ œ์–ด๋œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋กœ๊น… ๊ทœ์น™๊ณผ ๊ด€๋ จ ๋กœ๊ทธ ๋ ˆ๋ฒจ์ด ์—ฌ๊ธฐ์— ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค.

๋กœ๊ทธ ๋ ˆ๋ฒจ ์„ธ๋ถ€ ์‚ฌํ•ญ
--v=0 ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ ์šด์˜์ž(operator)์—๊ฒŒ ํ•ญ์ƒ ๋ณด์—ฌ์ง€๊ฒŒ ํ•˜๊ธฐ์—๋Š” ์œ ์šฉํ•จ.
--v=1 ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์ ์ ˆํ•œ ๊ธฐ๋ณธ ๋กœ๊ทธ ์ˆ˜์ค€.
--v=2 ์„œ๋น„์Šค์™€ ์‹œ์Šคํ…œ์˜ ์ค‘์š”ํ•œ ๋ณ€ํ™”์™€ ๊ด€๋ จ์ด์žˆ๋Š” ์ค‘์š”ํ•œ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์œ ์šฉํ•œ ์ •์ƒ ์ƒํƒœ ์ •๋ณด. ์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์—์„œ ๊ถŒ์žฅ๋˜๋Š” ๊ธฐ๋ณธ ๋กœ๊ทธ ์ˆ˜์ค€์ด๋‹ค.
--v=3 ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํ™•์žฅ ์ •๋ณด.
--v=4 ๋””๋ฒ„๊ทธ ์ˆ˜์ค€ ์ƒ์„ธํ™”.
--v=5 ํŠธ๋ ˆ์ด์Šค ์ˆ˜์ค€ ์ƒ์„ธํ™”.
--v=6 ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ‘œ์‹œ.
--v=7 HTTP ์š”์ฒญ ํ—ค๋”๋ฅผ ํ‘œ์‹œ.
--v=8 HTTP ์š”์ฒญ ๋‚ด์šฉ์„ ํ‘œ์‹œ.
--v=9 ๋‚ด์šฉ์„ ์ž˜๋ผ ๋‚ด์ง€ ์•Š๊ณ  HTTP ์š”์ฒญ ๋‚ด์šฉ์„ ํ‘œ์‹œ.

๋‹ค์Œ ๋‚ด์šฉ

์ตœ์ข… ์ˆ˜์ • February 23, 2023 at 9:03 AM PST: [ko] Update outdated files in dev-1.26-ko.1 (M112-M125) (41aeff23ce)