はじめに
- Kubernetesを使ってアプリケーションをデプロイする中で問題が起きた際
トラブルシューティングの最初の段階でよく打つコマンドをまとめました
Kubernetes初学者の役に立てばと思います
コマンド
・ kubectl get
リソース全体のサマリを確認する
- コマンド内容
$ kubectl get [リソース種別] -n [namespace名]
Kubernetesではnamespaceを使ってクラスタ内で環境を分離する事ができるが
namespaceを-nで忘れず指定すること
(指定がないと'default'のnamespaceとなる)
実行例①(podの確認)
- コマンド例
$ kubectl get pod -n test
- 出力例
NAME READY STATUS RESTARTS AGE
hello-app-54d4c4c96f-n6kpk 1/1 Running 0 16s
実行例②(serviceの確認)
- コマンド例
$ kubectl get service -n test
または
$ kubectl get svc -n test
- 出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-app-service ClusterIP 0.0.0.0 <none> 80/TCP 11s
・ kubectl get -o yaml
先ほど確認したサマリから特定のリソースの名前を指定してyaml形式で詳細を確認する
- コマンド内容
$ kubectl get [リソース種別] [リソース名] -n [namespace名] -o yaml
実行例
- コマンド例
$ kubectl get pod hello-app-54d4c4c96f-n6kpk -n test -o yaml
- 出力例
apiVersion: v1
kind: Pod
metadata:
generateName: hello-app-54d4c4c96f-
labels:
app: hello-app
pod-template-hash: 54d4c4c96f
name: hello-app-54d4c4c96f-n6kpk
namespace: test
...
spec:
containers:
- image: xxx/hello-repo/hello-app:v1
imagePullPolicy: IfNotPresent
name: hello-app
...
status:
conditions:
...
- lastProbeTime: null
lastTransitionTime: "xxx"
message: 'containers with unready status: [hello-app]'
reason: ContainersNotReady
status: "False"
type: ContainersReady
...
containerStatuses:
- image: xxx/hello-repo/hello-app:v1
imageID: ""
lastState: {}
name: hello-app
ready: false
restartCount: 0
started: false
state:
waiting:
message: Back-off pulling image "xxx/hello-repo/hello-app:v1"
reason: ImagePullBackOff
statusのmessageやreasonを確認したりする
今回はイメージが取得できないImagePullBackOff
が出ているのでイメージ名の指定ミス
・ kubectl describe
先ほどのkubectl get -o yaml
と同じで特定のリソースの名前を指定して詳細を確認する
情報がフィルタされていて見やすく、関連したEventも表示してくれる
ただし情報がフィルタされているので、私は両方使います
- コマンド内容
$ kubectl describe [リソース種別] [リソース名] -n [namespace名]
実行例
- コマンド例
$ kubectl describe pod hello-app-6687b788d-dvff8 -n test
- 出力例
Name: hello-app-6687b788d-dvff8
Namespace: test
Priority: 0
Node: xxx
Start Time: xxx
Labels: app=hello-app
pod-template-hash=6687b788d
...
Containers:
hello-app:
Container ID:
Image: xxx/hello-repo/hello-app:v1
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: ImagePullBackOff
...
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 7m20s default-scheduler Successfully assigned test/hello-app-6687b788d-dvff8 to xxx
Normal Pulling 5m52s (x4 over 7m20s) kubelet Pulling image "xxx/hello-repo/hello-app:v1"
Warning Failed 5m48s (x4 over 7m17s) kubelet Failed to pull image "xxx/hello-repo/hello-app:v1": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/xxx/hello-repo/hello-app:v1": failed to resolve reference "docker.io/xxx/hello-repo/hello-app:v1": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
Warning Failed 5m48s (x4 over 7m17s) kubelet Error: ErrImagePull
Warning Failed 5m22s (x6 over 7m16s) kubelet Error: ImagePullBackOff
Normal BackOff 2m17s (x19 over 7m16s) kubelet Back-off pulling image "xxx/hello-repo/hello-app:v1"
・ kubectl logs
podが作成された後、Readyにならない場合などにコンテナのログを確認する
- コマンド内容
$ kubectl logs [pod名] -n [namespace名] -c [コンテナ名]
コンテナが一つ場合は-cオプションはなくてもOK
実行例
- コマンド例
$ kubectl logs hello-app-54d4c4c96f-n6kpk -n test -c hello-app
- 出力例
2022/xx/xx xx:xx:xx Server listening on port 8080 # コンテナのログ
・ kubectl exec
コンテナに実際に入ってみてデバッグしたい時に使う
- コマンド内容
$ kubectl exec -it [pod名] -n [namespace名] -c [コンテナ名] -- [実行コマンド]
logs同様コンテナが一つ場合は-cオプションはなくてもOK
実行例
- コマンド例
$ kubectl exec -it hello-app-54d4c4c96f-n6kpk -n test -c hello-app -- /bin/sh
または
$ kubectl exec -it hello-app-54d4c4c96f-n6kpk -n test -c hello-app -- /bin/bash
実行コマンドとしてsh
かbash
を指定することで、コンテナに入って操作することができる
sh,bashがないイメージにはできないので注意
・ kubectl get event
KubernetesのEventを確認する
あまり使わないが、詰まった時に見てみると意外と見落としていたエラーが見つかることがある
- コマンド内容
$ kubectl get event --all-namespaces --sort-by=.metadata.creationTimestamp
実行例
- 出力例
NAMESPACE LAST SEEN TYPE REASON OBJECT MESSAGE
test 14m Warning Failed pod/hello-app-6687b788d-dvff8 Failed to pull image "xxx/hello-repo/hello-app:v1": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/xxx/hello-repo/hello-app:v1": failed to resolve reference "docker.io/xxx/hello-repo/hello-app:v1": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
test 14m Warning Failed pod/hello-app-6687b788d-dvff8 Error: ErrImagePull
test 13m Warning Failed pod/hello-app-6687b788d-dvff8 Error: ImagePullBackOff
test 23s Normal BackOff pod/hello-app-6687b788d-dvff8 Back-off pulling image "xxx/hello-repo/hello-app:v1"