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シェルのスクリプトと組み合わせると、運用の作業を自動にできます。