# kube

ここでは Wantedly の社内ツールである `kube` の概要について解説します。 `kube` というツール自体に着目し、Kubernetes やその運用方法については扱いません。

この章を Wantedly に存在する `kube` に関するルートドキュメントと位置づけます。 したがって説明は概論にとどめて細かい利用方法などは他のドキュメントで保管していくものとします。 現在各所に散らばる `kube` に関するドキュメントをこの章に集約している段階です。

## 想定読者

主に下のような人を想定しています。

* `kube` というツールを初めて使う人
* `kube` をなんとなく使っているが全体像がよくわからない人

## kube とはなにか

`kube` は [wantedly/kube-go (internal)](https://github.com/wantedly/kube-go) で管理されている Wantedly の Kubernetes クラスタのリソースを操作するためのユーティリティです。Kubernetes を操作するための標準 CLI ツールとして用意されている kubectl の機能に加え、いくつかの便利機能とサブコマンド、および権限に応じたアクセス制御の仕組みを持ちます。

このため `kube` の理解には最低限の Kubernetes の理解が必要です。 理解に不安がある場合は [プロダクト開発のための Kubernetes 入門](/fields/infrastructure/kubernetes-introduction.md) を参照してください。

### 責務

主に下の責務を担っています。

* `kubectl` の各種設定隠蔽
* `kubectl` の拡張
* 一般的な開発用 utility

### 実装概要

基本的には「`kube` は引数を parse して適切に変換して `kubectl` に渡している」と考えて問題ありません。

より厳密には、コマンド・機能によっては、下記のように `kubectl` の単純なラッパー以外の操作を行う場合があります。

* `kubectl` 以外の `gcloud`, `stern`, `telepresence`, `argo` などの Kubernetes 関連ツールに渡すこともある
* 各種ツールを組み合わせたり複数回呼び出すこともある
* 稀にどのツールにも依存しない機能も存在する

## セットアップ

### インストール

```bash
# latest
bash <(curl -sL https://get.wantedlyapp.com/kube)

# specific version
KUBE_VERSION=4.2.0 bash <(curl -sL https://get.wantedlyapp.com/kube)
```

### 設定

下の例のように `PATH` を通した後に `kube setup` を実行してプロンプトの指示に従ってください。

```bash
export PATH=$HOME/.wantedly/bin:$PATH
```

### コマンド体系

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

#### クラスタ依存

Wantedly で管理する複数の Kubernetes クラスタのうち特定の一つに対して実行するコマンドです。 ミスを避けるためにクラスタを第一引数で明示する手法をとっています。 Wantedly では 1 クラスタ 1 環境で運用しているため、`prod`, `qa` などの環境名を第一引数に指定することになります。

```bash
# 例 (sandbox / qa / prod が環境名)
kube sandbox fork
kube qa get pod
kube prod history
```

ここで提供されているコマンド群は `kube` の責務のうち主に下の 2 つを担当します。

* `kubectl` の各種設定隠蔽
* `kubectl` の拡張

#### 非クラスタ依存

一部のコマンドはクラスタに依存しない形式で存在します。 `setup`, `version`, `self-update` などの管理用のコマンドに加えて、 CI で適切な形式の Docker image を build する `ci-build` や Kubernetes manifest を生成する `generate` などのコマンドがあります。

ここで提供されているコマンド群は `kube` の責務のうち主に「一般的な開発用 utility」を担当します。

Kubernetes に関わらないコマンドも一部ありますが、下のような事情からこのような運用も一定の範囲で行っています。

* 全開発者がインストールしている
* インストール方法が簡単
* インストールが認証されている

## 機能

### Kubefork

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

### Kubectl にできること

前述の通り `kube` は `kubectl` の wrapper として機能するため、`kubectl` で行える任意のオペレーションを実行可能です。 コマンドはすべて `kubectl` を `kube [env]` に読み替えることでそのまま実行できます。 したがって `kubectl get pods` は `kube qa get pods` や `kube sandbox get pods` などと読み替えることで実行ができます。

```bash
# kubectl
kubectl [command] [TYPE] [NAME] [flags]
# kube での読み替え
kube [env] [command] [TYPE] [NAME] [flags]
```

`kubectl` については [Overview of kubectl](https://kubernetes.io/docs/reference/kubectl/overview/) などを参照してください。

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

`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)](https://dev-docs.wantedly.com/deploy/kube-usage) を参照してください。

#### もっと知りたい

* [プロダクト開発のための Kubernetes 入門](/fields/infrastructure/kubernetes-introduction.md)
* [kube English version (internal)](https://dev-docs.wantedly.com/tools/kube)
* [Non-infra Engineers' Infrastructure at Wantedly (internal)](https://dev-docs.wantedly.com/beginners/infra)
* [wantedly/kube-go (internal)](https://github.com/wantedly/kube-go)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.wantedly.dev/fields/dev-tools/kube.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
