【Kubernetes】k8s関連ツールをざっくり調べてみる【備忘録】

# はじめに
先日参加した「JAWS DAYS 2019」のKubernetesのセッションで聞いた内容をもとに概要を簡単にまとめてみました。

freeeのYusuke Kuokaさんの「Kubernetes on AWS/EKSベストプラクティス」における定番ツールからピックアップしました。
資料は下記です。
https://speakerdeck.com/mumoshu/eksbesutopurakuteisu2019-dot-2-number-jawsdays?slide=45

===追記(2019/4/22)=====
* 業務でマルチクラウドのKubernetesベースのML/DLパイプラインの話が持ち上がったので簡単に調べてみました。
　- ksonnet
　- kubeflow

====================


備忘録程度につらつらと。

# k8s関連ツール
## eksctl
* Go言語製
* 裏でCloudFormationが動いている
* 1コマンドでEKSクラスタ構築可能
* 実行環境(VPC,Subnet,SG,IAM,ロール)とノードグループの作成,スケール,削除が可能
* Weaveworksが開発しているOSS
* k8sのAPIをたたくために必要な認証情報はaws-iam-authenticatorが行う
* https://eksctl.io/
* コマンド例
* 
下記コマンドをたただけでクラスタ構築が可能

```
$ eksctl create cluster \
       --cluster-name my-eks-cluster \
       --nodes 3 \
       --nodes-min 3 \
       --nodes-max 5 \
       --node-type t2.medium \
       --region us-west-2
```
* min,maxを指定することでクラスタのAutoScale時の台数を制御  
→ autoscalingに関するconfigをあらかじめ設定行く必要がある

## minikube
* 手軽に開発・検証のKubernetes環境構築が可能
* シングルノードのKubernetesクラスタを実行
* minikubeコマンドでのインストールでは様々なアドオン機能が利用できる  
→ DNS, ダッシュボード, Dockerレジストリ etc
* https://github.com/kubernetes/minikube
* コマンド例
* 
下記コマンドでKubernetsの仮想環境が起動する

```
$ minikube start
```

## kubens, kubectx
* kubensはネームスペースの切り替えが容易になる
* コマンド例

下記コマンドでネームスペース切り替えが可能

```
$ kubens kube-system
Context "test" set.
Active namespace is "kube-system".

$ kubens -
Context "test" set.
Active namespace is "default".
```

* kubectxはコンテキストの切り替えが容易になる
* コマンド例
* 
下記コマンドでcontext切り替えが可能

```
$ kubectx minikube
Switched to context "minikube".

$ kubectx -
Switched to context "oregon".
```
* https://github.com/ahmetb/kubectx

## helm
* 正式名称：Kubernetes Helm
* Kubernetesのパッケージマネージャー  
→ yum, aptに相当するパッケージマネージャー
* 公式レポジトリが用意されておりStable,Incubatorが存在する  
→ jenkins, mysql, redmine, grafana, etcd などが用意されている
* パッケージはchart,デプロイ用サーバーコンポーネント(podとしてデプロイされる)をtillerと呼ぶ
* HelemClassic(旧Helm)とKubernetesチームが開発deployment-managerの2つが統合されている
* https://helm.sh/docs/helm/

## terraform
* インフラストラクチャ定義ツール  
→ クラウド上のリソースを定義ファイルの状態になるように生成・操作するツール
* HashiCorp社が開発している
* 複数のクラウドベンダ(AWS,GCP,Azure,DigitalOceanなど)に対応している
* 複数のSaaS(DNSimple,Mailgun,Rundeck)にはば広く対応
* ConfigurationFile(拡張子.tf)で状態定義を制御
* https://www.terraform.io/

## aws-iam-authenticator
* AWSの認証情報を利用したKubernetesクラスタへの認証行う為のツール
* https://github.com/kubernetes-sigs/aws-iam-authenticator

## kube2iam, kiam
* IAMと連携したアクセス制御を行う仕組みを提供  
* Pod単位でIAMアクセスポリシーを割り当てる  
→ KubernetesとIAMの中継をしてアクセス権限の管理が行える
* kube2iamは2016年に登場, kiamは2017年に登場
* kiamは「Node自体がIAMロールを持たない」というようなよりセキュアな設計になっている
* セットアップの手軽さはkube2iam
* https://github.com/jtblin/kube2iam
* https://github.com/uswitch/kiam

## kubeflow
* Kubernetes上に機械学習基盤を構築するOSSプロジェクト
* 2018/12にv1.0 リリース
* Kubernetes + ML = Kubeflow @KubeCon2017
* 下記3項目の環境を構築
  * JupyterHub(Jupyterを複数ユーザーで使えるようにしたもの)
  * TensorFlow Training Controller(学習用の分散環境が簡単に構築できる)
  * TensorFlow Serving(構築したモデルを公開できる)
* マルチクラウドでML/DLの分散学習基盤を構築でき、APIとしてのServingも一括で行える
* [https://github.com/kubeflow/kubeflow](https://github.com/kubeflow/kubeflow)

## ksonnet
* Kubernetesのminifestの記述,共有,デプロイをサポートするフレームワーク
* Helmと競合する立ち位置
* Kubernetesの設定ファイルの記述にjsonnet(Googleで開発されたJSONを定義するためのDSL)を採用
* prototype:jsonnetによるtemplate
* parameters:prototypeに具体的な値を与えてcomponentを生成
* enviroment:どの環境,どのクラスタに設定ファイルを適用するか指定する

# おわりに
資料を参考に少しずつ追記しておこうと思います。