kubectl
kubectl
インストール
brew install kubectl
他に brew で入れるツール kube-ps1 に参照されたり
$ gcloud components install kubectl
gcloud components update したときに他の kubectl が PATH にあると警告が出る
$ kubectl config
set-coluster / set-credentials / set-context ~/.kube/config への操作
get-contexts で一覧
use-context CONTEXT で切り替え
current-context で今の context、ちょくちょく打つか kube-ps1 で出しておく
実際は krew で kubectx 入れて k ctx する
リソースの確認
$ kubectl get pods
s $ kubectl get pods -l label1=val1,label2 s $ kubectl get pods -L val1 $ kubectl get pod NAME
$ kubectl get pod NAME -o yaml
$ kubectl get nodes
出力フォーマット
--show-labels
-o, --output=FORMAT
wide, json, jsonpath, いろいろ
custom-columns=GO_TEMPLATE
--watch, --output-watch-events
$ kubectl describe
pod sample-pod でイベントや状態、クラスタ情報など
node gke-k8s-default-pool-xxx で Node のリソース状況など
$ kubectl top node
$ kubectl top pod
マニフェストの適用
$ kubectl apply -f sample-pod.yaml
* 常に create ではなく apply, --server-side で適用するのがよい --force-conflicts
$ kubectl apply -f ./dir でディレクトリ下のマニフェストを適用、-R で再帰的
$ kubectl apply --prune で削除されたリソースを自動で処分
* --all すると渡していないマニフェストのリソースも全消えになるので、label と同時に使う $ kubectl diff -f sample-pod.yaml で差分を見る
$ kubectl wait --for=condition=Ready pod/sample-pod
$ kubectl wait --for=condition=PodScheduled pod --all
スケジューリングを待つ
実行
s $ kubectl exec -it sampe-pod -- /bin/bash s $ kubectl run -it --rm --image=curlimages/curl --restart=Never test-pod http://curlmyip.org デバッグコンテナ
$ kubectl alpha debug sample-pod --image=... --container debug-container
$ kubectl exec -it existing-pod -c existing-container -- bash
よくつかう
ポートフォワーディング
$ kubectl port-forward sample-pod 8888:80
ファイルのコピー
$ kubectl cp sample-pod:etc/hostname ./hostname
ログ
$ kubectl logs sample-pod
$ kubectl logs sample-pod -f
-f で follow
--since=1h, --timestamp=true --tail=10, --selector=env=prod
verbose
-v=level
$ kubectl -v=6 apply -f sample-pod.yaml
-v=6 は API Request / Reponse
$ kubectl -v-8 apply -f sample-pod.yaml
-v=8 は API Request Body / Reponse Body レベル
-w で watch できる
$ k get event -w --field-selector involvedObject.name=foo
などである name の object のイベントを tail
Failed な pod の name だけのリスト
$ k get pods --field-selector 'status.phase=Failed' --template '{{range .items}}pod/{{.metadata.name}}{{"\n"}}{{end}}'
pod で使われている image
$ kubectl get pods -o jsonpath="{range .items*}{.metadata.name}{' '}{.status.phase}{' '}{.spec.containers*.image}{'\n'}{end}" | column -t -s " " job からならこう
$ kubectl get jobs -o jsonpath="{range .items*}{.metadata.name}{' '}{.spec.template.spec.containers*.image}{'\n'}{end}" | column -t -s " " 単に image だけならもっと雑に
$ kubectl get pods -o 'jsonpath={..image}' | tr ' ' '\n' | sort | uniq
--field-selector で選択に使えるキーのリスト
involvedObject.name
? involvedObject 便利そう? pod/ とか job/ とかprefixが無いものが取れる??
値については $ kubectl get ... -o json とかで見るのがいい
job の pod だけ表示
$ k get pods --selector=job-name
metadata.labels.job-name に入っている、キーだけあるものを選択する
$ k get pods --selector=job-name --field-selector=status.phase=Failed
で失敗したものだけ
失敗した job を全部けす
$ k get jobs -o json | jq '.items[] | select(.status.failed==1) | .metadata.name' | xargs k delete job
filter とかだり〜全部 json でいいんじゃい!
job 消したら pod も消える
cronjob から job を作って実行
$ kubectl create job --from=cronjob.batch/NAME JOBNAME
イベントを watch する
$ kubectl get events -w
全体が流れていく
$ kubectl get event --field-selector involvedObject.name=POD_NAME
特定の pod のみ
s $ kubectl get events --field-selector type!=Normal Normal でないイベントを見る、めちゃええやん
CPU使用率やメモリの様子を眺める
$ kubectl top node
$ kubectl top pod
状態が変わるのを待つ
$ kubectl wait --for=condition=Ready pod/POD_NAME
condition は Complete, PodScheduled などなど
Ready で起動を待ったり Complete で Job が終わるのを待ったり
削除を待つのは condition ではなく --for=delete
--timeout=60s なども使える
Pod の Node 再配置
$ kubectl cordon [Node]
node を unschedulable にする
$ kubectl drain [Drain] --ignore-daemonsets
Pod を evict しつつ unschedulable にする
DaemonSet によって作られた Pod は unschedulable を考慮しない(Node にあるのが前提になる)
PodDistruptionBudget にしたがって先に Pod が作られてから Terminate される
$ kubectl uncordon [Node]
node を schedulable にする
drain → uncordon でいい
node が schedulable か確認するには
describe して Unschedurable: false かを見る
get nodes して taint の中を見る
kubectl get nodes -o jsonpath="{range .items[*]}{.metadata.name} {.spec.taints[?(@.effect=='NoSchedule')].effect}{\"\n\"}{end}" | awk 'NF==1 {print $0}'
pod の分散を確認する
pod の配置されている node を出す
$ kubectl get pods -o custom-columns=NAME:.metadata.name,NODE:.spec.nodeName
node の配置されている zone を出す
$ kubectl get nodes --label-columns topology.kubernetes.io/zone
これ custom columns でうまく出せない気がする
node, pod, zone をくっつけて出す
めんどいな
$ join --header -a 1 -1 1 -2 1 -o 0 1.2 2.6 -e NULL <(kubectl get pods -o custom-columns=NODE:.spec.nodeName,POD:.metadata.name --field-selector=status.phase=Running | sort) <(kubectl get nodes --label-columns topology.kubernetes.io/zone | sort) | tr ':blank:' \\t CronJob まとめて suspend
$ kubectl get cronjob --output=custom-columns=NAME:metadata.name --no-headers | xargs -ICRONJOB kubectl patch cronjob CRONJOB -p '{"spec":{"suspend":true}}'
patch でリソース要求増やす
サッとリソース上げ下げしたい時に
補完
code:.zshenv
if type kubectl &>/dev/null; then
source <(kubectl completion zsh)
fi