【初心者】kubernetesとは

# 目的
業務で kubernetes の理解が必要になりました。
机上調査結果をまとめます。

# 手段
1. 机上調査(概要理解を目的に)
1. 検証(セットアップ、基本設定理解)

### まずは机上調査
[公式ドキュメント](https://kubernetes.io/ja/docs/home/)を読んでいきます。

##### kubernetes とは
コンテナ化されたアプリケーションの展開、スケーリング、管理の自動化をするためのオープンソースコンテナプラットフォーム。
つまり、多数のコンテナ稼働環境で良い感じに動かしてくれる OSS ですね。

Google は 2014 年に kubernetes プロジェクトをオープンソース化した。



- 基本を理解する
    - 過去を振り返ると
        - 仮想化ができる前の時代におけるデプロイ
            - 物理サーバ上でアプリのリソースを制限する設定はない→リソース割り当て問題が発生
            - リソース確保のために物理サーバ増加→運用・維持管理の手間
        - 仮想化を使ったデプロイ
            - アプリを NW 毎に隔離可能→アプリ間のセキュリティレベルを提供
            - 物理リソースの使用率向上→ H/W コスト削減、スケーラビリティ向上
        - コンテナを使ったデプロイ
            - VMと同様に、コンテナは各自のファイルシステム、CPUの共有、メモリ、プロセス空間を持っている
            - 基盤インフラストラクチャからの分離→実行環境の移動が容易
    - Kubernetes が必要な理由と提供する機能
        - サービスディスカバリーと負荷分散；k8s は負荷分散してくれる
        - 自動化されたロールアウトとロールバック：マニュフェストで増減を自動化
        - 自動ビンパッキング：リソース活用
        - 自己修復：コンテナ増減
        - 機密情報と構成管理：OAuthトークンなどちゃんと管理してくれる
    - Kubernetes にないもの
        - 構成言語など特に指定はない、と言っている



#### Kubernetes のコンポーネント
いくつが用語が出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/a255b4e5-4e9a-2e7d-1dcd-9957bce4bdca.png)
[出典](https://kubernetes.io/ja/docs/concepts/overview/components/)
- 用語
    - クラスター
    - ノード：ワーカーマシンの集合
    - マスターノード：クラスター内のワーカーノードとPodを管理
    - ワーカーノード：Pod をホストする
    - Pod：
    - コントロールプレーン：クラスター内のワーカーノードとPodを管理

最初のスライドだとイマイチよくわかりません。

- コントロールプレーンコンポーネント
    - クラスターに関する全体的な決定(スケジューリング)とイベント検出/応答を行う
    - kube-apiserver : Kubernetest API を外部に提供する Kubernetest コントロールプレーンのコンポーネント。また、Kubernetest API コントロールプレーンのフロントエンドになる
    - etcd : 一貫性、高可用性を持ったキーバリューストア。Kubernetes 全てのクラスター情報の保存場所として利用する。バックアップ要
    - kube-scheduler : コントロールプレーン上で動作するコンポーネント。新規に作成された Pod にノード割り当て有無を監視、ノード無ければ Pod 内で実行するノードを選択する
    - kube-controller-manager : 複数のコントローラープロセスを実行する？(ちょっと何言ってるか...)
    - cloud-controller-manager : クラウド特有の制御ロジックを組み込む Kubernetes の control plane コンポーネント
- ノードコンポーネント
    - kubelet : クラスター内の各ノードで実行されるエージェント。各コンテナがPodで実行されていることを保証する
    - kube-proxy : クラスター内の各 node で動作しているネットワークプロキシ。Node のネットワークルールをメンテナスする
    - コンテナランタイム : コンテの実行を担当する S/W。Dokcer, containerd,等をサポートする
- アドオン
    - DNS : クラスター DNS を持つべき
    - Web UI : GUI のこと
    - コンテナリソース監視 : 監視データを閲覧可能
    - クラスターレベルログ : ログ管理
 

#### Kubernetes API
control palne は API server。API サーバは、エンドユーザ、クラスター、外部コンポーネントが相互通信できるように HTTP API を公開する。(詳細は必要になれば参照)


#### Kubernetes オブジェクトを理解する
YAML フォーマットでオブジェクトを理解するコーナー！！

- Kubernetesオブジェクトを理解する
    - アプリ実行、リソース割り当て、ポリシー設定可能(再起動、アップグレード、耐障害性ポリシーなど)
    - クラスターの望ましい状態を宣言し、kubernetest はそれを維持してくれる
    - 基本的に設定変更等は Kubernetes API を実行する。CLIツール(kubectl)を Kubernetes API 命令にコンバートして実行される
- オブジェクトのspec(仕様)とstatus(状態)
    - 要するに yaml で書いた状態を維持してくれる
- Kubenetesオブジェクトを記述する


```yaml:applicaton/deployment.ymall
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 #バージョン指定
kind: Deployment # 種類？
metadata:
  name: nginx-deployment # 名前
spec:
  selector:
    matchLabels:
      app: nginx # アプリ指定
  replicas: 2 # tells deployment to run 2 pods matching the template #Pod数指定
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2 # イメージ指定
        ports:
        - containerPort: 80 # nginx の公開ポート
```



#### Pod
Pod は Kubernetes 内で作成・管理可能なコンピューティングの最小デプロイユニット。

Pod は1つまたは複数のコンテナグループであり、ストレージやネットワークの共有リソースを持ち、コンテナの実行方法に関する仕様を持っている。

- Podとは何か？
    - Dockerの概念を使って説明すると、Pod は共有の名前空間と共有ファイルシステムのボリュームを持つDockerコンテナグループに似ている。(コンテナ群+名前空間と共有ファイルシステム)
- Podを使用する
    - 単一コンテナを実行するPod と 複数コンテナを実行するPodがある
    - アプリを水平スケールさせる場合は複数Podを使用するべき
- Podが複数コンテナを管理する方法
    - サイドカーとか使おうね
- Podを利用する
    - Podはある程度一時的で使い捨てできる存在として設計されている
- Pod とコンテナコントローラー
    - コントローラーはノード動作停止を検知し、代わりのPod を作成する
- Pod テンプレート
    - workload リソース向けのコントローラーは、PodをPodテンプレートを元に作成し、代わりにPodを管理する


```yaml:podtemplate-sample
apiVersion: batch/v1
kind: Job
metadata:
  name: hello
spec:
  template:
    # これがPodテンプレートです
    spec:
      containers: # コンテナ指定
      - name: hello # 名前
        image: busybox # イメージ指定
        command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600'] # コマンド
      restartPolicy: OnFailure # 復旧ポリシー？
    # Podテンプレートはここまでです
```

- リソースの共有と通信
    - Pod内のストレージ
        - Pod は共有ストレージであるボリュームの集合を指定可能
    - Pod ネットワーク
        - 各 Pod には、各アドレスファミリーごとにユニークなIPアドレスがアサインされる。ここはdocker に似ている
    - コンテナの特権モード
        - priviledge フラグで特権モードを有効化可能
    - static Pod
        - static Pod は、API サーバーに管理されない、特定ノード上でkubelet デーモンによって直接管理される Pod を指す


#### Pod の概観
- Pod について理解する
    - Kubernetes アプリケーションの基本的な実行単位
    - Pod はクラスターで実行されているプロセスを表す
- ネットワーキング
    - 各Pod は固有のIPアドレスを割り当てられる
- ストレージ
    - ストレージぼりゅーのセットを指定可能
- Pod を利用する
    - Kubernetesはコントローラーと呼ばれる高レベルの中小概念を使用し、それは比較的使い捨て可能なPodインスタンスの管理を行う
- Podとコントローラー
    - 1つまたはそれ以上のPodを含むコントローラーの例は3つ。
        - Deployment
        - StatefulSet
        - DaemonSet
- Podテンプレート
    - Podテンプレートはクッキーの抜き型のようなもの
# ここまでの感想
正直早いタイミングで手を動かし始めた方が良いと思いました。

ざっくり概念は伝わってきますが、登場人物は多すぎて "Pod は最小実行単位" くらいしか記憶に残っていない感じです。

ブラウザで実行可能なチュートリアルがあるようなのでそちらに進みたいと思います。