kubernetesを学ぶ～その３：kubectl～

# 目次
1. 前回のあらすじ
2. kubectlの実行
3. 用語について
4. あとがき

# 前回のあらすじ
　前回の[kubernetesを学ぶ～その２～](https://qiita.com/shintoshin_se/items/9290f96821f3870f14d8)は、宅内LANの環境設定に費やした回でした。vagrantの設定でブリッジ用のアダプタを追加したり、vagrantのことを理解しないとイケないんだよ！！という反省点もありました。毎回躓きながらやっていけばいいと思っています。失敗こそ力になる！と思っているんで。
※人命に関わること以外。

# kubectlの実行
　kubectlは、Kubernetesクラスターを制御できます。と、公式ドキュメントに記載があります。ぐ、具体的には！？だったので、リファレンスに沿って運用でよく使いそうだなーって思ったコマンドを試してみることにしました。

まずは、構文を把握しましょう。英語も構文がわからないと何言ってんのかわかんねってなるので、構文は必須ですね。※英語がわかるとは言っていない。

```
kubectl [command] [TYPE] [NAME] [flags]
```

|パラメータ  |意味 |
|---|---|
|command |必須。リソースに対して実行したい操作を指定する。 |
|TYPE|必須。リソースのタイプを指定する。大文字小文字を区別しない。|
|NAME  |リソースの名前を指定する。大文字小文字を区別する。|
|flags  |オプションのフラグを指定する。|

うん。はっきり言って、これだけじゃわからんし、見返したい時にも使えん！！
ということで。

## commandの詳細
### get
　1行に１オブジェクトといったリスト形式で表示する。ちょっとした情報確認に使うかな。

```
使用例
kubectl get [TYPE]
kubectl get [TYPE] [NAME]
kubectl get [TYPE] [NAME] [flags]
kubectl get -f [マニフェスト or ディレクトリ]

nodeの一覧取得
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   20h   v1.14.10
node1    Ready    <none>   20h   v1.14.10
node2    Ready    <none>   20h   v1.14.10
```

### describe
　getより詳細な情報を表示する。なので、nodeとか情報収集！ってときは、こっちですね。

```
使用例
kubectl describe [TYPE]
kubectl describe [TYPE] [NAME]
kubectl describe [TYPE] [NAME] [flags]
kubectl describe -f [マニフェスト or ディレクトリ]

D:\Repository\kubernetes\vagrant-kubernetes>kubectl describe node
Name:               master
Roles:              master
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=master
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/master=
Annotations:        flannel.alpha.coreos.com/backend-data: {"VtepMAC":"be:02:42:8d:f8:a1"}
                    flannel.alpha.coreos.com/backend-type: vxlan
                    flannel.alpha.coreos.com/kube-subnet-manager: true
                    flannel.alpha.coreos.com/public-ip: 172.16.20.11
                    kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Mon, 01 Feb 2021 19:19:39 +0900
Taints:             node-role.kubernetes.io/master:NoSchedule
Unschedulable:      false
Lease:
  HolderIdentity:  master
  AcquireTime:     <unset>
  RenewTime:       Tue, 02 Feb 2021 16:14:14 +0900
Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  MemoryPressure   False   Tue, 02 Feb 2021 16:13:25 +0900   Tue, 02 Feb 2021 07:57:37 +0900   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     False   Tue, 02 Feb 2021 16:13:25 +0900   Tue, 02 Feb 2021 07:57:37 +0900   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure      False   Tue, 02 Feb 2021 16:13:25 +0900   Tue, 02 Feb 2021 07:57:37 +0900   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready            True    Tue, 02 Feb 2021 16:13:25 +0900   Tue, 02 Feb 2021 13:16:55 +0900   KubeletReady                 kubelet is posting ready status. AppArmor enabled
Addresses:
  InternalIP:  172.16.20.11
  Hostname:    master
Capacity:
  cpu:                2
  ephemeral-storage:  40593612Ki
  hugepages-2Mi:      0
  memory:             2040788Ki
  pods:               110
Allocatable:
  cpu:                2
  ephemeral-storage:  37411072758
  hugepages-2Mi:      0
  memory:             1938388Ki
  pods:               110
System Info:
  Machine ID:                 fe17ffbebd914d0caddb55c160e155bd
  System UUID:                2C843C62-0958-874D-A5CD-E808C1F91549
  Boot ID:                    ef62e7c4-0e2d-4ea4-89bf-e5494fae1752
  Kernel Version:             4.15.0-135-generic
  OS Image:                   Ubuntu 18.04.5 LTS
  Operating System:           linux
  Architecture:               amd64
  Container Runtime Version:  docker://18.6.1
  Kubelet Version:            v1.14.10
  Kube-Proxy Version:         v1.14.10
PodCIDR:                      10.244.0.0/24
Non-terminated Pods:          (10 in total)
  Namespace                   Name                                          CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                   ----                                          ------------  ----------  ---------------  -------------  ---
  kube-system                 coredns-6dcc67dcbc-fc5tf                      100m (5%)     0 (0%)      70Mi (3%)        170Mi (8%)     20h
  kube-system                 coredns-6dcc67dcbc-s7bxw                      100m (5%)     0 (0%)      70Mi (3%)        170Mi (8%)     20h
  kube-system                 etcd-master                                   0 (0%)        0 (0%)      0 (0%)           0 (0%)         20h
  kube-system                 kube-apiserver-master                         250m (12%)    0 (0%)      0 (0%)           0 (0%)         20h
  kube-system                 kube-controller-manager-master                200m (10%)    0 (0%)      0 (0%)           0 (0%)         20h
  kube-system                 kube-flannel-ds-amd64-s7kgq                   100m (5%)     100m (5%)   50Mi (2%)        50Mi (2%)      20h
  kube-system                 kube-proxy-75l8x                              0 (0%)        0 (0%)      0 (0%)           0 (0%)         20h
  kube-system                 kube-scheduler-master                         100m (5%)     0 (0%)      0 (0%)           0 (0%)         20h
  kubernetes-dashboard        cluster-admin-74867ffb65-k6txp                0 (0%)        0 (0%)      0 (0%)           0 (0%)         20h
  kubernetes-dashboard        dashboard-metrics-scraper-69fcc6d9df-jrcn2    0 (0%)        0 (0%)      0 (0%)           0 (0%)         20h
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests     Limits
  --------           --------     ------
  cpu                850m (42%)   100m (5%)
  memory             190Mi (10%)  390Mi (20%)
  ephemeral-storage  0 (0%)       0 (0%)
  hugepages-2Mi      0 (0%)       0 (0%)
Events:              <none>

※node1、node2は省略
```

### create
　マニフェストや標準出力に書かれたオブジェクトを生成する。オブジェクト作ったりするので、これもよく使いそう。

```
使用例
kubectl create -f [ファイル名]

URLからオブジェクトを作成
D:\Repository\kubernetes\vagrant-kubernetes>kubectl create -f ここにURLとYAMLファイル指定
deployment.extensions/memory-eater created

作成を確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
memory-eater-7889865958-r7p5z   1/1     Running   2          89s
```

### apply
　ここで、さきほどcreateしたYAMLファイルを再度実行すると同じオブジェクトが既に作成されているので、エラーになります。なので、存在しなければ作成、存在すれば更新するというコマンドのapplyは役に立ちそう。

```
使用例
kubectl apply -f [ファイル名]

状態確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
memory-eater-7889865958-r7p5z   1/1     Running   2          89s

消します。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl delete -f ここにURLとYAMLファイル指定
deployment.extensions "memory-eater" deleted

消えたか確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pod
No resources found in default namespace.

applyは？
D:\Repository\kubernetes\vagrant-kubernetes>kubectl apply -f ここにURLとYAMLファイル指定
deployment.extensions/memory-eater created

確認します。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
memory-eater-7889865958-lvc55   1/1     Running   1          46s

いた。
```

### DELETE
さっきDELETEもやっちゃた。

```
使用例
kubectl DELETE -f [ファイル名]
```


## TYPEの詳細
 リソースタイプを指定するのですが、調べると結構な量がありました。なので、必要そうだなーっていうのに絞ってます。詳しくは公式ドキュメントを見るとよいですね。
[リソースタイプ一覧へ](https://kubernetes.io/ja/docs/reference/kubectl/overview/#resource-types)
kubectlでも一覧が見れます。

```
kubectl api-resources
```


### pod（短縮名：po）
　コンテナの最小単位。K8sクラスタ内のネットワーク上にIPアドレスを持つ。単一または複数のコンテナを起動する。
podでもpodsでもOKみたいですが、場合によって複数形がダメなものもありますね。

### service（短縮名：svc）
　Podの集合で実行されているアプリケーションをネットワークサービスとして公開する方法。
　nodeのIPアドレスは一定にならないのと、PodがNodeに散らばっているため、通信する時にIPアドレス指定だと急に繋がんねーってことになる。そこでIPアドレスを接続元が意識せずに単一の接続先を提供するのが役目。

### ingress（短縮名：ing）
　Serviceに対して、外部疎通できるURL、負荷分散トラフィック、SSL/TLS終端の機能や、名前ベースの仮想ホスティングを提供することができる。バランサな役割をするのかな。

### deployment（短縮名：deploy）
　アップデートやロールバックといったデプロイ管理の仕組みを提供することができる。

## flagsの詳細
　公式は出力オプションが中心だったので、探すのに時間がかかったが、名前空間を指定することもできるようですね。

### -n 名前空間
　指定の名前空間にする。

### --all-namespace
　すべてに名前空間を対象にする。

### -o=yaml
　YAMLフォーマットでAPIオブジェクトを表示する。

### -o=json
　JSON形式でAPIオブジェクトを表示する。

# 用語について
　書いといたら、あーそうそうと思い出すのに必要な用語をまとめ。
　
　・オブジェクト
　　K8sのオブジェクトは、K8sクラスタ内の実体でポッドやサービスを指すものです。
　・マニフェスト
　　K8sオブジェクトを生成するのに利用する宣言書です。　　

# あとがき
　今回は、コマンドを調べたり実際に打ち込んだりと結構時間がかかったなーと思う。しかし、身体を使って打ち込んだり動作を確認したり内容をまとめたりと身についたかなと思う。次回は、マニフェストの書き方について学ぼうと思う。
※B'zのCD聴きながらやってるのでたまにハイになっている自分がいた。冷静じゃないとエラー引き起こしそう。

## 参考文献
[kubernetesドキュメント](https://kubernetes.io/ja/docs/home/)
[15Stepで習得Dockerから入るKubernetes](https://www.amazon.co.jp/dp/4865941614)