ํด๋น ๋ฌธ์์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฒ์ : 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 ๋ก ๋ณต์ฌ
์ฐธ๊ณ :
kubectl cp
๋ช
๋ น์ ์ฌ์ฉํ๋ ค๋ฉด ์ปจํ
์ด๋ ์ด๋ฏธ์ง์ 'tar' ๋ฐ์ด๋๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ด์ผ ํ๋ค. 'tar'๊ฐ ์์ผ๋ฉด, kubectl cp
๋ ์คํจํ ๊ฒ์ด๋ค.
์ฌ๋ณผ๋ฆญ ๋งํฌ, ์์ผ๋์นด๋ ํ์ฅ, ํ์ผ ๋ชจ๋ ๋ณด์กด๊ณผ ๊ฐ์ ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด์๋ kubectl exec
๋ฅผ ๊ณ ๋ คํด ๋ณผ ์ ์๋ค.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 ์์ฒญ ๋ด์ฉ์ ํ์. |
๋ค์ ๋ด์ฉ
-
kubectl ๊ฐ์๋ฅผ ์ฝ๊ณ JsonPath์ ๋ํด ๋ฐฐ์๋ณด์.
-
kubectl ์ต์ ์ ์ฐธ๊ณ ํ๋ค.
-
์ฌ์ฌ์ฉ ์คํฌ๋ฆฝํธ์์ kubectl ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ดํดํ๊ธฐ ์ํด kubectl ์ฌ์ฉ ๊ท์น์ ์ฐธ๊ณ ํ๋ค.
-
๋ ๋ง์ ์ปค๋ฎค๋ํฐ kubectl ์นํธ์ํธ๋ฅผ ํ์ธํ๋ค.