kubectl custom-columns, label-columns, field-selector, sort-byを試してみた - その1


##試したこと
元々kubectl get podsでこれを表示したくて
- .spec.containers[*].resources.requests.memory	
- .spec.containers[*].resources.limits.memory

時間があったのでcustom-columns, label-columns, field-selector, sort-byも試してみました。表示できるスペックのまとまっているサイトを見つけることができなかったのでリスト化することに。

以下の#71612でも説明ありますが、現在のcustom-columnsは使いにくい。
kubectl get pods + custom-columnではなくcustom-columnsしか表示されません。

あと検索すると-o=を使っている人と-o+spaceの例があるのですがオフィシャルはスペースでした。


##気になる/kind feature
kubectl - Introduce "custom-columns" variant to add additional columns to output #71612
https://github.com/kubernetes/kubernetes/issues/71612

##References
https://kubernetes.io/docs/reference/kubectl/overview/#custom-columns
https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/
https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/
https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
https://kubernetes.io/docs/reference/kubectl/overview/#sorting-list-objects


##使い方
表示したいものを探すのには
```kubectl get <pod, node, svc etc> -o json```
```kubectl get <pod, node, svc etc> -o yaml```
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

こういうものも見つけました
https://gist.github.com/so0k/42313dbb3b547a0f51a547bb968696ba

基本

```
kubectl get pods -o custom-columns='<表示したいもの>'
```
|    Example - Pod                                                        |
|------------------------------------------------------------|
| CONTAINERS:.spec.containers[].name                         |
| M_LIMITS:.spec.containers[].resources.limits.memory        |
| M_REQUESTS:.spec.containers[].resources.requests.memory    |
| NAME:.metadata.name                                        |
| NAMESPACE:.metadata.namespace                              |
| NODE_IP:.status.hostIP                                     |
| POD_IP:.status.podIP                                       |
| PORTS:.spec.template.spec.containers[].ports.containerPort |
| RESTART_POLICY:.spec.restartPolicy                         |
| RESTARTS:.status.containerStatuses[].restartCount          |
| RSRC:.metadata.resourceVersion                             |
| STATUS:.status.phase                                       |  


##サンプル

###custom-coulmns
```-o custom-columns=<spec>```

**Pods**
デフォルト表示のREADYとAGEもcustom-columnsでは表示できず。

```	
kubectl get pods -o='custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[].name,Images:.spec.containers[].image'

kubectl get pods -o custom-columns='NAME:.metadata.name,STATUS:.status.phase, RESTARTS:.status.containerStatuses[].restartCount,M_REQUESTS:.spec.containers[].resources.requests.memory,M_LIMITS:.spec.containers[].resources.limits.memory,NODE_IP:.status.hostIP,POD_IP:.status.podIP'
```

**Nodes**
AZがわかると便利だと思う。	ポイント".metadata.labels."kubernetes\.io\/role"のようなものはエスケープする。

```
kubectl get nodes -o custom-columns='NAME:metadata.name,ZONE:metadata.labels.failure-domain\.beta\.kubernetes\.io/zone'
```
	

###Use a separate file
```-o custom-columns-file=<filename>```
	
```
NAME	STATUS	M_REQUESTS	M_LIMITS				
.metadata.name	.status.phase	.spec.containers[*].resources.requests.memory	.spec.containers[*].resources.limits.memory
```


###label-columns
```-L or --label-columns <spec>```
	
```
kubectl get nodes --label-columns failure-domain.beta.kubernetes.io/zone
```


###field-selector
```--field-selector <spec>```
	
```
kubectl get pods --field-selector=status.phase=Running,spec.restartPolicy=Always
```
	
###sort-by

```
kubectl get pods -o wide --sort-by=.spec.nodeName
```


##deployment おまけ
deploy.spec.template.spec.containers.ports.containerPort

##Jsonpathの使い方
次にまとめようと思います