Kubernetesを始める前に必要そうな知識をまとめてみた

# 概要
Kubernetesは、コンテナを基としたインフラのオーケストレーションツールです。

非常に多機能で、宣言的な記法でのインフラコード管理によって、柔軟かつ堅牢なインフラストラクチャを構築することができます。その一方で、(Kubernetesのみの知識に関わらず)非常に学習コストが高いという側面も持ち合わせています。

このエントリーでは、Kubernetesを知る上でその前提知識として必要そうなキーワードと、なぜ必要なのかという簡単な説明を書いていきます。

項目については、自分自身がハマったり困ったことがベースになっているため、もしかしたら足りない/多すぎるという意見もあるかもしれません。

**※筆者は偉そうに書きますが、筆者の理解が深いわけではないので悪しからず。**

ツイッターにて募集をかけてみたところ予想を上回る反響をいただいたので、今回まとめるに至りました。

↓元ネタツイート

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【緩募】K8sを始めるために理解が必要なドメイン知識<br>REST、アジャイル、Git、docker(コンテナ)、IaC、クラウドインフラの基本的な構成、分散処理、マイクロサービス、認証認可<br><br>他にもある気がするが、あと何があるだろう？</p>&mdash; inductor@技術書典「う47」 (@_inductor_) <a href="https://twitter.com/_inductor_/status/1103100820881457152?ref_src=twsrc%5Etfw">2019年3月6日</a></blockquote>

# 必要そうな知識一覧

## 開発手法/ツール

### Docker(コンテナ)
KubernetesはかつてはDockerに強い依存関係を持っていましたが、今はそうでもありません。しかしながら、コンテナというエコシステムを理解するうえでDockerの基本的な構想を知っておくことは必須ですし、Dockerを理解したうえでなぜKubernetesを使うのかというところへの理解に繋げていくのがよいかと思います。

### Git
Gitである必要性は必ずしもないかもしれませんが、コードのバージョン管理は必須です。業界標準であるということを踏まえGitとしています。これがないとKubernetesの構成管理は成り立たないですし、アプリケーションのデプロイ自動化などもできないので必須です。

### アジャイル
Kubernetesに限らず、コンテナベースのアプリケーションとアジャイルな開発は切っても切り離せないくらい密接な関係を持っていると自分は考えているので加えました。仮にアジャイル開発をしていないとしても、コンテナとアジャイルはなぜ相性がいいのか知っておくべきだとは思います。

### マイクロサービス
マイクロサービスはアプリケーション自体の設計もさることながら、インフラ側の構成も非常に重要です。疎結合で分散されたアプリケーションを管理する上では、コンテナやそれを管理するKubernetesは非常に相性が良いものであると言えます。（ちょっとうまく説明できないので誰か代わりにお願いします）

### DevOps
Kubernetes(というかコンテナ)を利用したいというモチベーションの1つに、DevOpsを実現するためのプラットフォームとして選定することがあります。
クラウドネイティブとDevOpsにも密接な関係性があると筆者は考えており(要出典)、知らない人は勉強しておきましょう。

### Infrastructure as Code(IaC)
Kubernetesの構成管理は原則yamlファイルで行います。IaCの理解は必須でしょう。

### CI/CD
テスト書きましょうテスト(吐血)
Kubernetesに限った話ではありませんが、抽象化されたインフラを最大限に生かすための戦略として、テストやデプロイの自動化、それに伴ったパイプラインの構築はもはや必須レベルだと思います。

## プロトコル

### REST(HTTP)
Kubernetesでは、CLIでの操作を含め、多くの処理がAPI Serverによってハンドリングされています。そのため、HTTP通信の超基本と、それを応用したREST APIの知識は必須とも言えるでしょう。
必須ではないですが、ついででも良いのでHTTP/2についてふわっと知っておくとプラスかもしれません。ついでにgRPCも（なにもわからないけど）

## サーバの基本

### クラウドインフラの基本的な構成
Kubernetesのプロジェクトを現在管理しているのはCloud Native Computing Foundationという団体ですが、彼らの掲げるCloud Nativeという概念を実現する最も大きなコンポーネントの1つがKubernetesです。
逆に言えば、Cloud Nativeとは何か、クラウドによって実現できるインフラにはどんな特徴があるかといった理解を持っておくことは非常に重要だと思います。

### ストレージ
インフラの基盤であるKubernetesにおいて、データ格納先であるストレージも非常に重要な概念です。ただ、オンプレとパブリッククラウドでは必要になる知識がちょっと違うかもしれません。

### *NIX OSの基本
コンテナはカーネルの機能であるcgroupsやnamespaceを利用したisolationを行っています。カーネルはLinuxのものを使いますので、みなさんLinuxチョットデキルエンジニアになりましょう（自戒）
というかこれが大体わかったらもうそれだけで勝利な予感がします。

### 分散処理
分散処理なにもわからない。
Kubernetesはコンテナオーケストレータという立ち位置が非常に強いですが、分散処理の基盤という側面も持ち合わせています。GPUを使った機械学習基盤の構築や、大規模なワークフローをKubernetesのPodを使って動かすなど、単なるアプリケーション基盤に限らず、様々なユースケースもありますので、その特徴は理解しておくとよいでしょう。

## セキュリティ
※ただし、これは事前に知っておくべきと言うよりは、こういうものが待ち受けているんだなあくらいに思っておくのがよさそうです。

### 認証認可
マイクロサービスにおけるセキュリティといえば認証認可ですね（？）
Kubernetesにおいても認証認可の概念は非常に重要で、必要な権限を適切に振り分けるのは永遠の課題ではありますが、Kubernetesの運用者のみならず開発者も基本的な理解はしておくべきだと思います（自戒）

### 機密情報の管理方法
機密情報の管理は、コンテナ化における最も重要な課題の1つです。
いろいろなツールもありますが、当然サービスや環境の要件によって大きく左右されますので、どんなものがあるのかを知っておくとよりよいと思います。

## ネットワーク
インフラ基盤というくらいですから、当然ネットワークの知識も必要です。TCP/IPモデルをベースに、特にL3/L4/L7の基本的な理解はしておきたいですね(筆者無事死亡)

### DNS(名前解決)
Kubernetesはサービスディスカバリを目的として内部DNSを抱えています。少なくとも浸透したと言わない程度には知っておくべきでしょう。

# 雑なまとめ
いやー、多いですね。
SREだとかDevOpsだとか言った組織を実現していくには、多かれ少なかれこれらのスキルセットをベースに持つエンジニアたちが求められます。
もちろん、全てを理解してからなんて話はないと思いますが、こういう世界があるんだなあという大雑把な景色が見えているだけでも、Kubernetes完全理解への一歩に繋がるのかもしれません。

Kubernetesやっていきたいインフラの皆さん、コード書いていきましょう！
Kubernetesやっていきたいバックエンドの皆さん、Linux完全に理解しましょう！


書いてて自分の知識のなさに辛くなってきたのでそろそろおわりにします！！！！！