kubectl
Kubernetesクラスタを制御するCLI.
Documentation
- https://kubernetes.io/docs/reference/kubectl/overview/
- リファレンス: https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
- kubectl Cheat Sheet - Kubernetes
- https://kubectl.docs.kubernetes.io/
参考:
周辺ツール
- Krew … kubectl plugin manager
- kubectx … context, namespaceの切替を簡単にしてくれる
- kustomize … Kubernetesのマニフェスト管理ツール。kubectl 1.14からkubectlに取り込まれた
- lbolla/kube-secret-editor … secretをデコードした状態で編集することを可能にし、編集後にエンコードして保存してくれる
設定
kubeconfig
環境設定ファイルkubeconfigを参照する順番:
--kubeconfig
フラグで指定されたパス$KUBECONFIG
環境変数に指定されたパス一覧~/.kube/config
See Organizing Cluster Access Using kubeconfig Files - Kubernetes
NOTE:
$KUBECONFIG
は:
区切りで複数ファイル設定可能で、その場合、複数ファイルがマージされた内容を扱うことができる
参考:
ユースケース
環境設定 - config & context
## kubeconfig 表示
kubectl config view
### 現在のcontextだけを表示
kubectl config view --minify
## context
### 一覧表示
kubectl config get-contexts
#### ヘッダ無しで名前だけ表示
kubectl config get-contexts --no-headers -o=name
### 現在のcontext
kubectl config current-context
### 切替え
kubectl config use-context <context-name>
### rename
kubectl config rename-context <old-name> <new-name>
参考:
Namespaceの操作・設定
Examples:
# コンテキストのデフォルトnamespaceを設定する
kubectl config set-context $(kubectl config current-context) --namespace=NAMESPACE
参考:
実行・公開
- run … コンテナイメージを実行する。deploymentまたはjobが作られる。
- expose … リソースをクラスタ外にServiceとして公開する。
## run
### 例
kubectl run nginx --image=nginx
## expose
### 例
kubectl expose deployment <deployment-name> --port=80 --target-port=8000
kubectl run <deployment-name> --image=<image-name> --port=<port>
kubectl expose deployment <deployment-name> --type=NodePort
App Management
- autoscale
- scale … 次のリソースのサイズを設定する:
- Deployment, ReplicaSet, Replication Controller, StatefulSet
## scale
### ReplicaSet 'foo' を3に
kubectl scale --replicas=3 rs/foo
kubectl scale --replicas=3 -f foo.yml
### 今のサイズが2だったら3にする
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql
リソース管理
作成・更新
- create/apply/replace … JSON or YAMLのリソース定義ファイルを適用して、リソースを作成/更新する。
- patch … YAML/JSONのマージを用いて、リソース定義を差分更新する
# create
kubectl create -f <Path or URL of config file>
## ファイルから Secret を作成
kubectl create secret generic my-secret --from-file=./secret/secret.json
## ファイルから ConfigMap を作成
kubectl create configmap my-config --from-file=./config/config.json
# apply
kubectl apply -f <Path or URL of config file>
## 例
kubectl apply -f https://k8s.io/docs/tasks/run-application/deployment.yaml
kubectl apply -f ./pod.json
# replace
kubectl replace -f <Path or URL of config file>
# patch
kubectl patch <Resource Type> <Name> --patch <YAML Content>
## 例
kubectl patch deployment patch-demo --patch "$(cat patch-file.yaml)"
参考:
- Update API Objects in Place Using kubectl patch - Kubernetes
- Kubernetes 上で Credentials を扱う | tellme.tokyo
- Kubernetes道場 23日目 - kubectlを網羅する - Toku’s Blog
- kubectl applyとkubectl replaceの違いは何ですか - コードログ
Pod操作
- exec … コマンドをコンテナ内で実行する
- cp … ファイルをクライアント環境とPod間でやりとり
## exec
kubectl exec <pod> -- <command> [args...]
### podにbashでログイン
kubectl exec -it <pod> -- /bin/bash -l
## cp
kubectl cp path/to/localfile <pod>:/path/to/remotefile
kubectl cp <pod>:/path/to/remotefile /path/to/localfile
参考:
Node操作
- cordon … ノードへのスケジュールを停止
- drain … ノードからPodを削除
## cordon
kubectl cordon <node-name>
## drain
kubectl drain <node-name>
### DaemonSetで管理されてPodを停止するとき
kubectl drain <node-name> --ignore-daemonsets
参考:
表示
- get … 単一・複数リソースの情報を表示する。
- describe … 単一リソース or グループの情報を表示
- diff … リソースファイルとクラスタの状態を差分表示
# get
kubectl get deploy[ments]
kubectl get po[ds] [-o json|yaml]
## フィルタの例
kubectl get pods -l app=nginx
## ヘッダ無し + 出力フィールド指定
kubectl get namespaces --no-headers --output "custom-columns=NAME:.metadata.name"
# describe
kubectl describe pods # all pods
kubectl describe pod <pod-name>
kubectl describe deploy[ment] <deployment-name>
# diff
kubectl diff -f foo.yml
## kustomizeバージョン
kubectl diff -k .
削除
## delete
kubectl delete deployment <deployment-name>
サブコマンド
apply
基本的な利用イメージはユースケース > リソース管理 > 作成更新を見よ。
オプション:
オプション | デフォルト | 機能 |
---|---|---|
--prune | false | α in 2020-0505. 指定されてないリソースを削除する。ただし、 --save-config オプション付きで作られたものは除く。-l フィルタか --all オプションと同時に使うべし |
--prune-whitelist | [] | --prune で使うデフォルトのホワイトリストを上書きする |
Examples:
# app=nginxラベルのリソースにマニフェストを適用し、マニフェスト外のリソースを削除する
kubectl apply --prune -f manifest.yaml -l app=nginx
# マニフェストに書かれていないConfigMapを全て削除
kubectl apply --prune -f manifest.yaml --all --prune-whitelist=core/v1/ConfigMap
logs
## 基本構文
kubectl logs <Pod名> [Options]
## 10行 tail -f
kubectl logs <Pod名> --tail=10 -f
port-forward
# Syntax
kubectl port-forward TYPE/NAME [options] [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N]
# Examples
## サービスの80番ポートをローカルの8080番ポートにforward
kubectl port-forward service/myservice 8080:80
## Deploymentの5000, 6000番ポートをローカルの5000, 6000番ポートにforward
kubectl port-forward deployment/mydeployment 5000 6000
## Pod指定
kubectl port-forward pod/mypod 8080
proxy
API Proxyサーバを起動する
kubectl proxy --port=8080 &
curl http://localhost:8080/api/
See https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/
How-to
EvictedなPodを一括削除するワンライナー
EvictionしたPodは手動削除しないといけないっぽい。
kubectl get pods | awk '{if ($3 ~ /Evicted/) system ("kubectl delete pods " $1)}'
PodのEvictionについてはSee Concept#pod-eviction
参考:
全てのマニフェストを取得したい
これでよさそう:
kubectl get all --export -o yaml
NOTE:
- ※v1.14で
--export
オプションはdeprecateされているが、2020-05-07, 代替手段は見つけられていない。 - 上だとPodもexport対象になるので、使い勝手悪いかも?
参考:
- Is there a way to generate yml files that will produce the existing cluster? · Issue #24873 · kubernetes/kubernetes
- Deprecate –export flag from get command by soltysh · Pull Request #73787 · kubernetes/kubernetes
- Kubernetes 1.14: Urgent Upgrade Notes, Deprecations, Removed and deprecated metrics, API Changes - Qiita
- Dump Kubernetes cluster resources as YAML … シェルスクリプトで頑張っている事例