Kubernetesの踏み台環境構築後に最初にすること

Kubernetesクラスタを触る際の踏み台環境を構築した際に、最初にやっておきたいことの備忘録的メモ。
なお、Linuxでの想定でやっているので、非Linux環境の場合はバイナリの取得部分は自環境に併せて修正すること。

インストール後、ダウンロードしたり解凍したファイルが色々散らかった状態になるので、適当にworking directoryを作って作業するのがオススメ。
また、ここにないものでオススメあれば是非コメントいただけるとありがたいです。

## Helm CLIのインストール
Helmは何かと使うので入れておく。
```
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
```

## completionとalias設定
kubectlにタブ補完が効くようにcompletionを入れるのと、kでkubectlが叩けるようにaliasを張る。
```sh
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo "alias k=kubectl" >> ~/.bashrc
echo "complete -o default -F __start_kubectl k" >> ~/.bashrc
. ~/.bashrc
```

## krewのインストール
kubectl pluginが使えるように[krew](https://github.com/kubernetes-sigs/krew)をインストールしておく。
```sh
(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)

echo 'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"'>> ~/.bashrc
. ~/.bashrc
```

## kubectx, kubensのインストール
[kubectx](https://github.com/ahmetb/kubectx)はクラスタの切り替え、kubensはNamespaceの切り替えを1コマンドで実現するコマンドである。
クラスタやNamespaceの切り替えに`kubectl config`を毎回叩くのは面倒なので、とりあえず入れる。ついでに対話型で切り替えるための[fzf](https://github.com/junegunn/fzf)もインストールする。
```sh
sudo git clone https://github.com/ahmetb/kubectx /opt/kubectx
sudo ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
sudo ln -s /opt/kubectx/kubens /usr/local/bin/kubens

wget https://github.com/junegunn/fzf/releases/download/v0.57.0/fzf-0.57.0-linux_amd64.tar.gz
tar xvzf ./fzf-*
sudo install ./fzf /usr/local/bin
```
よく使うのでkx, knで叩けるようにaliasも設定する。
```sh
echo "alias kx=kubectx" >> ~/.bashrc
echo "alias kn=kubens" >> ~/.bashrc
. ~/.bashrc
```
なお、knativeを使う人はknコマンドがバッティングするので注意。

## sternのインストール
[stern](https://github.com/stern/stern)は複数のPodのログを色付けして見やすく出力してくれるツールである。
kubernetesで複数のPodのログを見る時、sternがないとかなり見づらいのでsternを入れておく。
```sh
wget https://github.com/stern/stern/releases/download/v1.31.0/stern_1.31.0_linux_amd64.tar.gz
tar xvzf ./stern_*
sudo install stern /usr/local/bin/stern
```

## kubecolorのインストール
[kubecolor](https://github.com/kubecolor/kubecolor)はkubectlに色をつける。すごく見やすくなるので自分は入れている。
```sh
wget https://github.com/kubecolor/kubecolor/releases/download/v0.4.0/kubecolor_0.4.0_linux_amd64.tar.gz
tar xzf kubecolor_*
rm -f kubecolor_0.4.0_linux_amd64.tar.gz
sudo install kubecolor /usr/local/bin
```
これの注意点として、kubectl neat pluginを挟むと`-oyaml`してリダイレクトでファイル出力すると文字化けみたいなのが起きるので、kubectlにaliasは張らないこと。自分は以下のようにしている。
```sh
echo "alias k='kubecolor'" >> ~/.bashrc
```
kubectl neatを使う際は以下のような感じで使う。
```
k get pod nginx -o yaml | kubectl neat -f - > ./nginx.yaml
```

## PS1にクラスタ名、Namespaceの出力
PS1とは待受プロンプトみたいな奴。↓でいう`ubuntu@jumphost:~$`の部分。
```
ubuntu@jumphost:~$
```
クラスタ名やNamespaceを常時プロンプトに表示しないと、思ってるクラスタやNamespaceでないところでdeleteしてしまったりすることがあり得るので、これは必ずやった方がいいと思う。
簡単な方法としては、`kubectl config current-context`をPS1に書いておけばよい。
あと、有名どころのツールとしては[kube-ps1](https://github.com/jonmosco/kube-ps1)なんかもあるが、自分は[powerline-go](https://github.com/justjanne/powerline-go)が好きなので、これを使う。

※'24/12/25追記
最近は[Starship](https://starship.rs/)に乗り換えてるので、末尾にStarshipの導入方法を追記。

```sh
wget https://github.com/justjanne/powerline-go/releases/download/v1.24/powerline-go-linux-amd64
sudo install powerline-go-linux-amd64 /usr/local/bin/powerline-go
```
.bashrcに設定を追記するために以下を実行する。
```sh
cat << 'EOF' >> ~/.bashrc
function _update_ps1() {
    PS1="$(/usr/local/bin/powerline-go -newline -cwd-mode plain  -modules "time,kube,venv,user,host,cwd,perms,hg,jobs,exit,root" -colorize-hostname -theme low-contrast -error $?)"
}
PROMPT_COMMAND="_update_ps1; $PROMPT_COMMAND"
EOF
. ~/.bashrc
```
フォントが入っていなくて表示が変になった場合は自PC(not 踏み台)にフォントもあわせてインストールしておく。
```sh
git clone https://github.com/powerline/fonts.git --depth=1
cd fonts
./install.sh
```
フォントのインストール後、ターミナル側でのフォント変更もお忘れなく。

## k9sのインストール
[k9s](https://github.com/derailed/k9s)はインタラクティブにk8sリソースが触れるツール。initコンテナがコケた時に中を見たい時などに使っているで、こちらもとりあえず入れておく。
```sh
wget https://github.com/derailed/k9s/releases/download/v0.32.7/k9s_Linux_amd64.tar.gz
tar xvzf k9s_Linux_amd64.tar.gz
sudo install k9s /usr/local/bin/
```

## 追記：starshipのインストール
powerline-goの利用を止めて[Starship](https://starship.rs/ja-JP/guide/)を使ってるので、こちらの導入方法をメモがてら記載。
以下でインストール。
```sh
curl -sS https://starship.rs/install.sh | sh
```
bashrcに設定の読み込みを追記。
```sh
echo 'eval "$(starship init bash)"' >> ~/.bashrc
```
Starshipの設定ファイルを置くディレクトリを作成。
```
mkdir ~/.config/
```
Starshipの設定ファイルを記述。Qiitaで上手く書けなかったので、GitHubにuploadしたものをダウンロードして利用。
```sh
wget https://raw.githubusercontent.com/imurata/public_misc/refs/heads/main/starship.toml -O ~/.config/starship.toml
```
設定をロード。
```sh
. ~/.bashrc
```
問題なければ以下のような感じのターミナルになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/bd829e3f-dc79-de48-1d7d-98a4e5d71900.png)
表示内容はざっくり以下となっている。
- 現在時刻
- ユーザ名
- IP
- カレントディレクトリ
- クラスタ名　（*）
- Namespace名　（*）
*：Gitやコードがあるディレクトリだと表示が変化

ここは好みに応じて`starship.toml`を修正するとターミナルライフがより楽しくなるはずだ。