Kubernetes初心者がトラブルシューティング時に打つコマンド

# はじめに
- Kubernetesを使ってアプリケーションをデプロイする中で問題が起きた際  
  トラブルシューティングの最初の段階でよく打つコマンドをまとめました   
  Kubernetes初学者の役に立てばと思います

# コマンド
- [kubectl get](#-kubectl-get)
- [kubectl get -o yaml](#-kubectl-get--o-yaml)
- [kubectl describe](#-kubectl-describe)
- [kubectl logs](#-kubectl-logs)
- [kubectl exec](#-kubectl-exec)
- [kubectl get event](#-kubectl-get-event)

## ・ kubectl get
リソース全体のサマリを確認する

- コマンド内容

```
$ kubectl get [リソース種別] -n [namespace名]
```
:::note info
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 [コンテナ名]
``` 
:::note info
コンテナが一つ場合は-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 [コンテナ名] -- [実行コマンド]
``` 
:::note info
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`を指定することで、コンテナに入って操作することができる

:::note warn
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"
```