kubectl コマンド一覧と Kubernetes の用語

Kubernetes コースで覚えるサービスとオプションの一覧です。ファイルの操作・シェルの構文・curl は最初から使えます。

kubectlKubernetes を操作するLv1 で覚える

kubectl <サブコマンド> [種類] [名前] [フラグ]
kubectl version / cluster-info

~/.kube/config に書かれたクラスターに接続して操作します。-n で名前空間、-A ですべての名前空間。

$ kubectl get nodes

kubectl get / describe一覧と詳しい情報Lv1 で覚える

kubectl get pods [-o wide|yaml|json|name] [-l ラベル] [-n 名前空間 | -A]
kubectl get deploy,svc,pods
kubectl describe pod 名前
kubectl get events / kubectl wait --for=condition=Ready pod/名前
kubectl api-resources / kubectl explain pod.spec

describe のいちばん下の Events には、スケジュール・イメージの取得・起動の失敗など、原因の手がかりが出ます。

$ kubectl get pods -o wide
$ kubectl describe pod web

クラスターコントロールプレーンとワーカーLv2 で覚える

コントロールプレーン: API サーバー・スケジューラー・コントローラー
ワーカー: kubelet が Pod を動かす

kubectl は API サーバーに頼み、コントロールプレーンが Pod をどのワーカーで動かすかを決めます。

ノードPod を動かすサーバーLv3 で覚える

kubectl get nodes -o wide
kubectl describe node 名前

CPU とメモリの容量と、そこで動いている Pod の requests の合計(Allocated resources)が見られます。

kubectl runPod を 1 つ作るLv4 で覚える

kubectl run 名前 --image=イメージ [--port] [--labels] [--env]
kubectl run tmp --image=busybox --rm -it --restart=Never -- コマンド
--dry-run=client -o yaml(作らずに YAML を表示)

練習や調査のための Pod を作ります。--rm -it --restart=Never で、コマンドを 1 回動かして結果を見たら消える使い捨ての Pod になります。

$ kubectl run tmp --image=busybox --rm -it --restart=Never -- wget -qO- http://web

kubectl delete消すLv5 で覚える

kubectl delete 種類 名前...
kubectl delete -f ファイル
kubectl delete pods -l app=web

Deployment を消すと ReplicaSet と Pod も、Namespace を消すと中のものが全部消えます。Deployment の Pod だけ消すと作り直されます。

$ kubectl delete pod web

Podいちばん小さな単位Lv6 で覚える

1 つ以上のコンテナ・IP を 1 つ持つ
STATUS: Pending → ContainerCreating → Running

Pod は消えると作り直されません(Deployment などが管理していれば、そちらが新しく作ります)。IP は作り直すたびに変わります。

kubectl logsコンテナのログLv7 で覚える

kubectl logs Pod [-c コンテナ] [--tail=N] [--previous]
kubectl logs deploy/名前 / job/名前 / -l app=web

--previous で、再起動する前のコンテナのログを見ます(CrashLoopBackOff の原因探し)。

$ kubectl logs web --previous

kubectl exec / port-forward中でコマンドを動かす・手元へつなぐLv8 で覚える

kubectl exec Pod [-c コンテナ] -- コマンド
kubectl port-forward svc/名前 8080:80

port-forward はクラスターの中の Service や Pod を手元の localhost につなぎます。

$ kubectl exec web -- cat /etc/resolv.conf
$ kubectl port-forward svc/web 8080:80

kubectl apply / patchマニフェストのとおりにするLv9 で覚える

kubectl apply -f ファイル | ディレクトリ
kubectl replace -f ファイル
kubectl patch 種類 名前 -p '{"spec":{…}}'

無ければ作り(created)、あれば違うところを直し(configured)、同じなら何もしません(unchanged)。--- で区切って 1 つのファイルに複数書けます。

$ kubectl apply -f web.yaml

マニフェストYAML で書く設計図Lv10 で覚える

apiVersion / kind / metadata / spec
--- で区切って複数
kubectl explain で項目を調べる

あるべき姿を書いて apply すると、Kubernetes がその姿に近づけます(宣言的)。

kubectl label / annotateラベル・注釈を付けるLv11 で覚える

kubectl label 種類 名前 key=value [--overwrite]
kubectl label 種類 名前 key-(外す)
kubectl annotate 種類 名前 key=value

ラベルは選ぶための名札、注釈はメモ(説明・変更の理由など)です。

$ kubectl label pod web tier=frontend

ラベルとセレクター選ぶための名札Lv12 で覚える

app=web,tier=frontend
-l app=web / -l 'env in (dev,stg)'

Service・Deployment・NetworkPolicy は、ラベルで相手の Pod を選びます。

kubectl create種類ごとに作るLv14 で覚える

kubectl create deployment 名前 --image --replicas
kubectl create configmap / secret generic 名前 --from-literal=k=v --from-file
kubectl create namespace / serviceaccount / job / cronjob / role / rolebinding / ingress
kubectl create -f ファイル

既にあるとエラー(AlreadyExists)になります。--dry-run=client -o yaml でマニフェストのひな形を作れます。

$ kubectl create deployment web --image=nginx --replicas=3

Deployment同じ Pod を決まった数だけLv15 で覚える

Deployment → ReplicaSet → Pod
replicas・selector・template

Pod が消えたり壊れたりしても、決まった数になるように作り直します(自己修復)。

kubectl scale / autoscale数を変えるLv16 で覚える

kubectl scale deployment 名前 --replicas=N
kubectl autoscale deployment 名前 --min --max --cpu-percent

autoscale は HorizontalPodAutoscaler を作ります。

$ kubectl scale deployment web --replicas=5

kubectl rollout更新を見守る・戻すLv17 で覚える

kubectl rollout status deployment/名前
kubectl rollout history deployment/名前 [--revision=N]
kubectl rollout undo deployment/名前 [--to-revision=N]
kubectl rollout restart / pause / resume

履歴の CHANGE-CAUSE は kubernetes.io/change-cause の注釈から出ます。

$ kubectl rollout undo deployment/web

kubectl set一部を変えるLv18 で覚える

kubectl set image deployment/名前 コンテナ=イメージ
kubectl set env deployment/名前 KEY=値 | --from=configmap/名前
kubectl set resources deployment/名前 --requests=cpu=100m --limits=memory=128Mi
kubectl set serviceaccount deployment/名前 SA

テンプレートが変わるとローリングアップデートが始まります。

$ kubectl set image deployment/web nginx=nginx:1.27

ローリングアップデート少しずつ入れ替えるLv19 で覚える

maxSurge: 増やしてよい数
maxUnavailable: 減ってよい数

新しい Pod が Ready になってから古い Pod を減らすので、止めずに更新できます。

kubectl exposeService を作るLv24 で覚える

kubectl expose deployment 名前 --port=80 [--target-port=8080] [--type=NodePort|LoadBalancer] [--name]

Deployment や Pod のラベルを selector にした Service を作ります。

$ kubectl expose deployment web --port=80 --type=NodePort

ServicePod への決まった入口Lv25 で覚える

ClusterIP(中だけ)・NodePort(ノードのポート)・LoadBalancer(外部 IP)
selector に合う Ready な Pod へ振り分け

Pod の IP が変わっても、Service の名前と ClusterIP は変わりません。

Ingressホスト名とパスで振り分けるLv29 で覚える

host: shop.example.com / path: /api → Service

1 つの入口(Ingress コントローラー)から、ホスト名とパスで複数の Service に振り分けます。

クラスターの DNS名前で呼ぶLv30 で覚える

サービス名・サービス名.名前空間・….svc.cluster.local
StatefulSet の Pod: db-0.db

CoreDNS が Service の名前を ClusterIP に変えます。

ConfigMap設定を外に出すLv32 で覚える

kubectl create configmap 名前 --from-literal=k=v
env.valueFrom.configMapKeyRef / envFrom

イメージを作り直さずに設定を変えられます。Pod の作り直しで反映されます。

ボリュームPod にファイルを渡すLv33 で覚える

volumes(configMap・secret・emptyDir・persistentVolumeClaim)
containers[].volumeMounts(mountPath・subPath)

ConfigMap をボリュームにすると、キーがファイル名、値が中身になります。

Secretパスワードなどを渡すLv34 で覚える

kubectl create secret generic 名前 --from-literal=password=…
env.valueFrom.secretKeyRef

data は base64 で書かれているだけで暗号ではありません。RBAC で読める人を絞ります。

Namespace区画Lv35 で覚える

kubectl create namespace 名前
-n 名前 / -A

チームやアプリごとに分けて、名前の重なりを避け、権限を分けます。

kubectl config接続先と名前空間を切り替えるLv36 で覚える

kubectl config get-contexts / current-context
kubectl config use-context 名前
kubectl config set-context --current --namespace=名前
kubectl config view [--minify]

コンテキストはクラスター・ユーザー・名前空間の組です。

$ kubectl config set-context --current --namespace=shop

PersistentVolumeClaim消えない保存場所Lv37 で覚える

accessModes・resources.requests.storage・storageClassName
Pending → Bound

StorageClass が PV を用意して PVC に結びつけます。Pod を作り直しても中身は残ります。

StatefulSet名前と保存場所が決まった PodLv38 で覚える

名前-0・名前-1 と順に作る
serviceName(Headless Service)・volumeClaimTemplates

データベースのように、1 つ 1 つの Pod に決まった名前と PVC が必要なものに使います。

Probe健康診断Lv40 で覚える

readinessProbe: Ready になったら Service へ
livenessProbe: 失敗したら再起動
httpGet・tcpSocket・exec・initialDelaySeconds

起動に時間がかかるアプリでは、liveness の猶予を長くしないと再起動をくり返します。

requests と limitsCPU とメモリの予約と上限Lv41 で覚える

requests: スケジュールに使う
limits: 超えると CPU は絞られ、メモリは OOMKilled

requests が入るノードが無いと Pod は Pending のままです。

kubectl top使用量を見るLv42 で覚える

kubectl top nodes
kubectl top pods [-A] [--sort-by=cpu|memory]

metrics-server が要ります。HPA もこの値を使います。

$ kubectl top pods --sort-by=memory

HorizontalPodAutoscaler負荷で数を変えるLv43 で覚える

kubectl autoscale deployment 名前 --cpu-percent=50 --min=1 --max=5

CPU の使用率(requests に対する割合)を見て、Pod の数を増やしたり減らしたりします。

Job終わるまで動かすLv44 で覚える

completions・parallelism・backoffLimit
restartPolicy: Never / OnFailure

成功するまで(backoffLimit まで)Pod を作り直します。

CronJob時刻を決めて Job を作るLv45 で覚える

schedule: "*/5 * * * *"(分 時 日 月 曜日)
kubectl create job 名前 --from=cronjob/名前

決まった時刻に Job を作ります。

DaemonSet と initContainers全ノードに 1 つ・準備の係Lv46 で覚える

DaemonSet: 各ノードに 1 つ(ログ集め・監視)
initContainers: 本体の前に順に動いて終わる

init コンテナが終わるまで、本体のコンテナは起動しません(Init:0/1)。

kubectl auth can-i権限を確かめるLv48 で覚える

kubectl auth can-i 動詞 リソース [-n 名前空間] [--as ユーザー]
kubectl auth can-i --list

yes / no で答えます。--as=system:serviceaccount:ns:名前 で ServiceAccount としても確かめられます。

$ kubectl auth can-i delete pods --as jane -n dev

RBAC誰が何をできるかLv49 で覚える

Role / ClusterRole: できること(apiGroups・resources・verbs)
RoleBinding / ClusterRoleBinding: 誰に与えるか

許されていない操作は Forbidden になります。必要な分だけ与えます(最小権限)。

ServiceAccountPod のための身分Lv51 で覚える

spec.serviceAccountName
system:serviceaccount:名前空間:名前

Pod の中から Kubernetes を操作するときの身分です。

NetworkPolicy通信の許可Lv53 で覚える

podSelector(対象)・policyTypes・ingress.from・egress.to・ports
podSelector: {} と ingress: [] で全部止める

ポリシーが 1 つでも当たる Pod は、許したもの以外は通しません。

kubectl cordon / drain / taintノードの保守Lv56 で覚える

kubectl cordon / uncordon ノード
kubectl drain ノード --ignore-daemonsets [--force]
kubectl taint nodes ノード key=value:NoSchedule(最後に - で外す)

drain は cordon してから Pod を追い出します。

$ kubectl drain node-1 --ignore-daemonsets

ノードの保守Pod を逃がしてから作業するLv57 で覚える

cordon → drain → 作業 → uncordon

drain で Deployment の Pod は別のノードに作り直されます。

配置のルールどのノードに置くかLv58 で覚える

taint(ノード)と tolerations(Pod)
ノードのラベルと nodeSelector

taint のあるノードには、それを許す Pod しか置かれません。

jsonpath と custom-columns必要なところだけ取り出すLv61 で覚える

-o jsonpath='{.items[*].metadata.name}'
'{range .items[*]}{.metadata.name}{"\t"}{.status.phase}{"\n"}{end}'
-o custom-columns=NAME:.metadata.name,NODE:.spec.nodeName

シェルのスクリプトと組み合わせると、運用の作業を自動にできます。