GKEの快適なオペレーション

## はじめに

最近、業務でGKEを使いはじめたので、gcloudコマンドやkubectlコマンドを使ったオペレーションが増えてきました。
gcloudコマンドやkubectlコマンドはそのまま使っても便利ですが、より快適なオペレーションを実現するために自分が工夫していることを書いておきます。

## GCPのプロジェクト、アカウント切り替えを快適に
業務では複数のGCPプロジェクトを切り替えて作業します。
gcloudを使う場合、以下のコマンドを実行します。

```sh

# プロジェクトのリストを表示
$ gcloud projects list
# プロジェクトの切り替え
$ gcloud config set project PROJECT_ID
```

頻繁に切り替えることが多いので、この手順は結構手間になります。
そこで[fzf](https://github.com/junegunn/fzf)でプロジェクトをインタラクティブに選択できる関数を作成し、alias登録してあります。

```sh
function _gcloud_change_project() {
  local proj=$(gcloud projects list | fzf --header-lines=1 | awk '{print $1}')
  if [ -n $proj ]; then
    gcloud config set project $proj
    return $?
  fi
}
alias gcp=_gcloud_change_project
```

現在のプロジェクトは以下のコマンドで確認できます。

```sh
$ gcloud config get-value project
```

こちらもプロジェクトと同じように、アカウント切り替えもalias登録してあります。

```sh
function _gcloud_change_account() {
  local account=$(gcloud auth list --format="value(account)" | fzf | awk '{print $1}')
  if [[ -n $account ]]; then
    gcloud config set account $account
    return $?
  fi
}
alias gca=_gcloud_change_account
```

## kubectlのcontextとnamespaceの切り替え快適に
通常、kubectlを使ってcontextを切り替える場合は、このコマンドを実行します。

```sh
# contextのリストを表示
$ kubectl config get-contexts
# contextを切り替え
$ kubectl config use-context CONTEXT
```

また、namespaceはコマンド実行時に`--namespace`オプションで指定することが多いと思います。

こういった手順が面倒なときは、こちらの[kubectx/kubens](https://github.com/ahmetb/kubectx)というコマンドを使うとcontextやnamespaceを補完してくれるので、切り替えが楽になります。

また、[fzf](https://github.com/junegunn/fzf)がインストールされている際はインタラクティブにcontextやnamespaceを切り替えることができます。

## プロンプトに現在のプロジェクトを表示して快適に
複数のプロジェクトやcontextを切り替えているとどのコンテキストで作業しているか分かりづらいので、
常にプロンプトに表示するようにしています。

自分は以下のプラグインを参考にフォーマットを変えて表示しています。
- https://github.com/jonmosco/kube-ps1
- https://github.com/katsew/zsh-gkeadm-prompt

## kubctlの補完を有効にして快適に
標準でbashとzsh用の補完機能が提供されているので、ぜひ有効にしましょう。

```sh
# bash
source <(kubectl completion bash)
# zsh
source <(kubectl completion zsh)
```

自分は.zshrcに以下を追加してあります。

```sh
if [ $commands[kubectl] ]; then
  source <(kubectl completion zsh)
fi
```

## Kubernetesのリソースの指定を快適に
`kubectl get`や`kubectl describe`などで指定するリソース名は省略することができます。

```sh
$ kubectl get pod
$ kubectl get po

$ kubectl get deployment
$ kubectl get deploy

$ kubectl get service
$ kubectl get svc
```

以下が、リソース名と省略形の対応関係の一覧です。
`kubectl api-resources` で確認することができます。


|リソース名|省略形|
|---|---|
|certificatesigningrequests|csr|
|clusterrolebindings||
|clusterroles||
|componentstatuses|cs|
|configmaps|cm|
|controllerrevisions||
|cronjobs||
|customresourcedefinition|crd|
|daemonsets|ds|
|deployments|deploy|
|endpoints|ep|
|events|ev|
|horizontalpodautoscalers|hpa|
|ingresses|ing|
|jobs||
|limitranges|limits|
|namespaces|ns|
|networkpolicies|netpol|
|nodes|no|
|persistentvolumeclaims|pvc|
|persistentvolumes|pv|
|poddisruptionbudgets|pdb|
|podpreset||
|pods|po|
|podsecuritypolicies|psp|
|podtemplates||
|replicasets|rs|
|replicationcontrollers|rc|
|resourcequotas|quota|
|rolebindings||
|roles||
|secrets||
|serviceaccounts|sa|
|services|svc|
|statefulsets|sts|
|storageclasses|sc|

## kubectlを省略して快適に
kubectl自体も毎回入力するのは手間なので省略しちゃいましょう。
こちらは好みも別れますが、以下のようなaliasを登録してます。
kubectxとkubensも合わせて登録してます。

```sh
alias k=kubectl
alias kx=kubectx
alias kn=kubens
```

## ロギングを快適に
複数のログをまとめて見る場合は、[Stackdriver logging](https://cloud.google.com/logging/)が便利ですが、CLIで手軽に見たい場合があります。

また、kubectlには標準で`kubectl -f logs POD_ID`でログを出力することができますが、PodのIDを個別に指定してしなければいけないので面倒です。

[stern](https://github.com/wercker/stern)を使うとPodのラベルを指定して手軽にログを出力することができます。

こちらも補完を有効にしておくとさらに便利です。

```sh
if [ $commands[stern] ]; then
  source <(stern --completion=zsh)
fi
```

## まとめ

他にも良いTipsがあればぜひ教えていただきたいです！
快適なGKEライフを！