KubernetesとEKSの学習記録 Part 1

# 概要
仕事でKubernetes(AWSのEKS)を利用する機会が出てきたため学習します。

学習ステップとしては以下のようにしてみようと思っています。
1. Kubernetesの基本用語の理解
2. Kubernetes公式チュートリアルやってみる
3. EKSの基本用語理解
4. EKSでサービスを作ってみる

今回はステップ1 「Kubernetesの基本用語の理解」

この記事はそのメモやまとめです。
すでに設定済みの項目がいくつかある。
試行錯誤しながらやったので、手順として不要かもしれない。**あくまでメモ用。**

## 基本的な用語
- Node(ノード)
仮想マシンだったり実物のサーバだったり、実際のサーバー部分に当たります。Node = 1台のサーバーの認識。
Podを稼働させているワーカーノードと、それを管理するためのマスターノードの2種類があります。

- Pod
Podは常にノード上で動作します。Podの中にコンテナがあり、Podでは最低一つ以上のコンテナが稼働します。
https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/explore/explore-intro/

## クラスターとコントロールプレーン、データプレーン
まずは一番大きな枠について理解します。

https://aws.amazon.com/jp/blogs/startup/techblog-container-k8s-1/
Kubernetes クラスターはマスターノードから成る「コントロールプレーン」と、実際にコンテナ稼働するワーカーノードから成る「データプレーン」から構成されます。
上記では以下のように定義されています。
- コントロールプレーン
> コントロールプレーンにはクラスターの情報を保持する etcd や、どのノードで Pod を動かすかをコントロールする kube-scheduler 、API を提供する kube-apiserver などが含まれます。
- データプレーン
> 各ワーカーノード上には kubelet と呼ばれるエージェントが動いており、各 Pods はこの kubelet を介して実行されます。

![kubernetes.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185852/5db62370-f203-a001-d4ad-c34fcacd296c.png)

## DeploymentとReplicaSet
まずはデータプレーン側のdeploymentについて理解を深めていく。
- DeploymentはReplicaSetと生成・管理し、ReplicaSetはPodを生成・管理する。
- ReplicaSetのみでも作成は可能だが、DeploymentでReplicaSetを作成できるので、手動でReplicaSetを作成するような利用する場面はほとんどないらしい

まずは上記を理解し、ReplicaSetから確認していきます。

![kubernetes_deployment.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185852/24c7e59d-ffda-a56a-62a2-be71d28ed4fd.png)

### ReplicaSet
ReplicaSetはPodの数を管理します。RSと略される場合があるようです。
https://kubernetes.io/ja/docs/concepts/workloads/controllers/replicaset/
例えば`replicas: 3`でPodを3つに維持するようにした場合、もしPodの数が足りなく/多くなった場合は3つになるように自動で調整してくれます。

マニフェストファイルは以下のようになるようです。
```yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  # ケースに応じてレプリカを修正する
  replicas: 3 #起動したいpod数
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3
```
基本的にDeploymentを利用するためにここらへんにします。

### Deployment
DeploymentはreplicaSetを管理します。
https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/
- Containerのイメージが更新されたら新しいReplicaSetを作成し、ReplicaSetの新旧入れ替えをローリングアップデートで行ってくれる
- 過去のReplicaSetを保持させ、必要であればロールバックさせることができる

などが機能としてあります。
マニフェストファイルは以下のようになるようです。
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
```
ReplicateSetを更新する場合は以下のようになるかと理解しています。
nginxのversionを1.25.0 → 1.25.3に上げる場合
以下のような感じになります。

![kubernetes_deployment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185852/4812d1aa-9e92-eaaf-dfbd-0682ce95b4e8.png)


この場合、切替後もv1のRecplicaSetは残っていますので、切り戻しが可能です。

## Service
ServiceはどのPodにトラフィックをルーティングするか、を決めます。
「SVC」と略されることがあるようです。
https://kubernetes.io/ja/docs/concepts/services-networking/service/
https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/expose/expose-intro/
どのPodにルーティングするかは主にラベルを利用して決められます。
ラベルはkey/valueであり、例えば
- 開発、テスト、および本番用のオブジェクトを指定する
- バージョンタグを埋め込む
- タグを使用してオブジェクトを分類する

といった分け方ができます。
ここは公式の画像がわかりやすかったのでそのまま引用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185852/ea218c6d-3faa-fd84-5a4f-ccf3601b3e05.png)


## 
ふんわりとですが、それぞれの用語について理解できました。
足りていない用語もあるはずですので、手を動かしつつわからない用語があればまたメモしたいと思います。

draw.ioで図形を作ったのですが、アイコンに名前がついてなかったのでちょっと以下の記事を見ながら作りました。
https://qiita.com/yosshi_/items/2db0a0e66a16711bfe5f