Kubernetesでよく使うkubectlコマンド集

#本記事の目的
自分が検証でKubernetesをいじる際によく使う、便利なkubectlコマンドについてまとめる。

#kubectlコマンド
####kubectl create <リソース名> <オブジェクト名> --dry-run=client -o yaml > <マニフェストファイル名>

対象のリソースに関するマニフェストファイルを作成する。
自分の場合は、以下のリソースで使用する頻度が高い。
(以下で挙げているリソース以外にも、様々なリソースを作成可能)

- deployment
- service
- namespace
- job
- configmap
- secret

```terminal
$ kubectl create deployment nginx --image=nginx --replicas=2 --dry-run=client -o yaml > nginx.yaml

$ cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}
```


リソースに応じて、適宜オプションを追加すると良い。
ちなみに--dry-runのオプションの使い分けについては、[公式ドキュメント](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands)では以下のように説明がある。

>"none"、"server"、"client "のいずれかでなければならない。"client"の場合、送信されるオブジェクトを送信せずに出力するだけである。"server"の場合、リソースを永続化することなく、サーバーサイドのリクエストを送信する。



#### kubectl apply -f <マニフェストファイル名>
作成したマニフェストファイルに沿ってリソースを生成・変更する。
上記の"kubectl create"コマンドと一緒に用いられる事が多い。

```terminal
$ kubectl apply -f nginx.yaml
deployment.apps/nginx created

$ kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           5m44s
```



#### kubectl get <リソース名> -o wide

通常の"kubectl get"コマンドより多くの情報を取得できる。
特にリソースをpodで実行すると、オブジェクト名やステータスに加えて、IPアドレスや稼働ノードの情報も得られるため使い勝手が良い。

```terminal
$ kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP         NODE     ...         
nginx-6799fc88d8-bhqj6   1/1     Running   0          2m34s   10.1.0.6   worker1  ...
nginx-6799fc88d8-s5qrp   1/1     Running   0          28s     10.1.0.7   worker2  ...
```


#### kubectl describe <リソース名>　<オブジェクト名>
特定のオブジェクトに関する詳細情報を取得する。
"kubectl get"コマンドでは入手できない詳細なステータスやイベントを入手する事が可能なため、リソースが想定通りに稼働しているかどうかを調査する際に用いる事が多い。

```terminal
$ kubectl describe deployment nginx
Name:                   nginx
Namespace:              default
CreationTimestamp:      xxx
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-6799fc88d8 (2/2 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  5m59s  deployment-controller  Scaled up replica set nginx-6799fc88d8 to 1
  Normal  ScalingReplicaSet  3m53s  deployment-controller  Scaled up replica set nginx-6799fc88d8 to 2
```


#### kubectl edit　<リソース名>　<オブジェクト名>
エディタを用いて、既に生成済のオブジェクトの設定を更新する。
通常はマニフェストファイルを修正し、applyコマンドで適用する事で変更を反映するが、このコマンドを使えば簡易的に設定を更新できる。
ただしマニフェストファイルには変更が反映されないため、きちんとマニフェストファイルで管理したい場合は使用しない事が推奨される。


```terminal
$ kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           5m44s

$ kubectl edit deployment nginx   # replicasを2→3に変更
deployment.apps/nginx edited

$ kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           12m
```



#感想
他に便利なコマンドがあれば、適宜更新予定。


#参考文献
- 公式ドキュメント：[kubernetes.io](https://kubernetes.io/)
- Udemy講座：[Certified Kubernetes Administrator (CKA) with Practice Tests](https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/)