kube
ここでは Wantedly の社内ツールである kube の概要について解説します。 kube というツール自体に着目し、Kubernetes やその運用方法については扱いません。
この章を Wantedly に存在する kube に関するルートドキュメントと位置づけます。 したがって説明は概論にとどめて細かい利用方法などは他のドキュメントで保管していくものとします。 現在各所に散らばる kube に関するドキュメントをこの章に集約している段階です。

想定読者

主に下のような人を想定しています。
  • kube というツールを初めて使う人
  • kube をなんとなく使っているが全体像がよくわからない人

kube とはなにか

kube は wantedly/kube-go (internal) で管理されている Wantedly の Kubernetes クラスタのリソースを操作するためのユーティリティです。Kubernetes を操作するための標準 CLI ツールとして用意されている kubectl の機能に加え、いくつかの便利機能とサブコマンド、および権限に応じたアクセス制御の仕組みを持ちます。
このため kube の理解には最低限の Kubernetes の理解が必要です。 理解に不安がある場合は プロダクト開発のための Kubernetes 入門 を参照してください。

責務

主に下の責務を担っています。
  • kubectl の各種設定隠蔽
  • kubectl の拡張
  • 一般的な開発用 utility

実装概要

基本的には「kube は引数を parse して適切に変換して kubectl に渡している」と考えて問題ありません。
より厳密には、コマンド・機能によっては、下記のように kubectl の単純なラッパー以外の操作を行う場合があります。
  • kubectl 以外の gcloud, stern, telepresence, argo などの Kubernetes 関連ツールに渡すこともある
  • 各種ツールを組み合わせたり複数回呼び出すこともある
  • 稀にどのツールにも依存しない機能も存在する

セットアップ

インストール

1
# latest
2
bash <(curl -sL https://get.wantedlyapp.com/kube)
3
​
4
# specific version
5
KUBE_VERSION=4.2.0 bash <(curl -sL https://get.wantedlyapp.com/kube)
Copied!

設定

下の例のように PATH を通した後に kube setup を実行してプロンプトの指示に従ってください。
1
export PATH=$HOME/.wantedly/bin:$PATH
Copied!

コマンド体系

kube には大きく分けて 2 種類のコマンドが存在します。

クラスタ依存

Wantedly で管理する複数の Kubernetes クラスタのうち特定の一つに対して実行するコマンドです。 ミスを避けるためにクラスタを第一引数で明示する手法をとっています。 Wantedly では 1 クラスタ 1 環境で運用しているため、prod, qa などの環境名を第一引数に指定することになります。
1
# 例 (sandbox / qa / prod が環境名)
2
kube sandbox fork
3
kube qa get pod
4
kube prod history
Copied!
ここで提供されているコマンド群は kube の責務のうち主に下の 2 つを担当します。
  • kubectl の各種設定隠蔽
  • kubectl の拡張

非クラスタ依存

一部のコマンドはクラスタに依存しない形式で存在します。 setup, version, self-update などの管理用のコマンドに加えて、 CI で適切な形式の Docker image を build する ci-build や Kubernetes manifest を生成する generate などのコマンドがあります。
ここで提供されているコマンド群は kube の責務のうち主に「一般的な開発用 utility」を担当します。
Kubernetes に関わらないコマンドも一部ありますが、下のような事情からこのような運用も一定の範囲で行っています。
  • 全開発者がインストールしている
  • インストール方法が簡単
  • インストールが認証されている

機能

Kubefork

擬似的に Kubernetes クラスタをコピーし、自分専用のデプロイ先として用いることで開発を簡単にする機能です。 詳しくは Kubefork (internal) を参照してください。

Kubectl にできること

前述の通り kube は kubectl の wrapper として機能するため、kubectl で行える任意のオペレーションを実行可能です。 コマンドはすべて kubectl を kube [env] に読み替えることでそのまま実行できます。 したがって kubectl get pods は kube qa get pods や kube sandbox get pods などと読み替えることで実行ができます。
1
# kubectl
2
kubectl [command] [TYPE] [NAME] [flags]
3
# kube での読み替え
4
kube [env] [command] [TYPE] [NAME] [flags]
Copied!
kubectl については Overview of kubectl などを参照してください。

知っておくと良いコマンド

kube はカレントディレクトリから操作対象の Namespace を決定します。 したがって、原則操作対象のマイクロサービスのリポジトリがあるディレクトリに移動してからコマンドを実行するのが良いでしょう。
  • コマンドを実行したい: kube <env> sh <-c, -d, branch_name> COMMAND
    • e.g. 今のブランチで sandbox に DB migration したい kube sandbox sh -c rails db:migrate
    • e.g. 今デプロイされてる QA で Rails console を使いたい kube qa sh -d rails c
  • デプロイしたい: kube <env> deploy <-c, -d, branch_name>
  • 環境変数をセットしたい: kube <env> dotenv set FOO=bar
  • 今動いている Pod 一覧が見たい: kube <env> get po
  • ログが見たい: kube <env> tail
  • クラスタをコピーし自分専用のものとして利用する: kube <env> fork
より詳細な使い方は kube の使い方 (internal) を参照してください。

もっと知りたい