Zsh
GoogleCloudPlatform
kubernetes

はじめに

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

GCPのプロジェクト、アカウント切り替えを快適に

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

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

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

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

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

$ gcloud config get-value project

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

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を切り替える場合は、このコマンドを実行します。

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

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

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

また、fzfがインストールされている際はインタラクティブにcontextやnamespaceを切り替えることができます。

プロンプトに現在のプロジェクトを表示して快適に

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

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

kubctlの補完を有効にして快適に

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

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

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

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

Kubernetesのリソースの指定を快適に

kubectl getkubectl describeなどで指定するリソース名は省略することができます。

$ 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も合わせて登録してます。

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

ロギングを快適に

複数のログをまとめて見る場合は、Stackdriver loggingが便利ですが、CLIで手軽に見たい場合があります。

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

sternを使うとPodのラベルを指定して手軽にログを出力することができます。

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

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

まとめ

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