kubectl

Kubernetesクラスタを制御するCLI.

Documentation

参考:

周辺ツール

  • Krew … kubectl plugin manager
  • kubectx … context, namespaceの切替を簡単にしてくれる
  • kustomize … Kubernetesのマニフェスト管理ツール。kubectl 1.14からkubectlに取り込まれた
  • lbolla/kube-secret-editor … secretをデコードした状態で編集することを可能にし、編集後にエンコードして保存してくれる

設定

kubeconfig

環境設定ファイルkubeconfigを参照する順番:

  1. --kubeconfig フラグで指定されたパス
  2. $KUBECONFIG 環境変数に指定されたパス一覧
  3. ~/.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)"

参考:

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

基本的な利用イメージはユースケース > リソース管理 > 作成更新を見よ。

オプション:

オプションデフォルト機能
--prunefalseα 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対象になるので、使い勝手悪いかも?

参考: