EC2 で kubernetes の基礎 

コンテナの概要についてはまずこちら👇
[AWSにおけるコンテナサービス](https://qiita.com/leomaro7/items/1dcebca03a1023169ad3)

---

#1.kubernetesが動く仕組み#

|k8s||
|---|---|
|Node|サーバーのこと。コンテナはこのNODEの上で実行されます。|
|Cluster |Nodeを一纏めにしたグループのこと。1台のNodeが故障しても、他のNodeで処理を実行できます。1台のNodeに処理が集中しないように負荷分散することもできます。|
|Master |Clusterを管理するサーバー。誰がどのグループに所属しているか、Nodeが正常か監視したりする。|


#2.kubernetesの構成部品#

`Users`

🔽　API/CLI/UIで命令


`Contorol Plane`   →　マスターノードのこと。

🔽　apiserver/scheduler/controllersといった部品が受け取る。

`Nodes`

🔽　kubnet という部品で受け取る。

もう少し詳しく、、、

|Master ||
|---|---|
|API Server |実行命令を受け取り、Nodeに対して命令をだす。|
|etcd |k8sに関する情報が保管される。|
|Scheduler |コンテナの配置を管理する。|
|Controller Manger |監視し必要に応じて足りないものを生成してくれる。|

|Node ||
|---|---|
|ContainerRuntime |DockerEnngineなどのコンテナを動かすためのソフトウェア|
|Kubelet |K8sのエージェント　ContainerRuntimeと連携してコンテナの起動停止を行う。API Serverと通信して命令を受け取る。|


#3.Minikube を動かしてみる#

- EC2環境
 - ubuntu
 - t3.micro

基本的な設定は、[Running Minikube in AWS EC2 (Ubuntu)](https://www.radishlogic.com/kubernetes/running-minikube-in-aws-ec2-ubuntu/)


kubectl　インストール

```
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl

chmod +x ./kubectl

sudo mv ./kubectl /usr/local/bin/kubectl
```

docker インストール

```
sudo apt-get update && \
    sudo apt-get install docker.io -y
```

minikube インストール

```
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

minikube version
```

管理者権限にして、minikube をスタート

```
sudo -i

minikube start --vm-driver=none
```

が、conntrack がないとかエラーになる。

`minikube v1.9.2 on Ubuntu 18.04
✨  Using the none driver based on user configuration
💣  Sorry, Kubernetes v1.18.0 requires conntrack to be installed in root's path
`

conntrack をインストールすると、minikube スタートが成功する。

```
apt-get install conntrack
```



#4 deployment#

nginxイメージでmy-nginxという名前のdeploymentを作成。

```
kubectl create deployment --image nginx my-nginx
```

podが作成されていることがわかる。

```
kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
my-nginx-9b596c8c4-dcw9x   1/1     Running   0          43h
```

**Pod**
1つ以上のコンテナを纏めた単位のこと。
IPアドレスはPod単位で付与されます。
なので宛先をローカルホストとすることで、Pod内のコンテナは通信可能ということです。
また、同じポート番号を共有することはできません。

*複数のコンテナを1つの単位に纏めるとどんないいことがあるのか?*
例えば、ローカルボリュームとgitを同期させるgit syncのコンテナを入れるだけで簡単に設定変更することなどができる。

もしもPod化しない場合、どのコンテナがどれと紐づくか管理しなければ行けなくなったり、管理が複雑になる。ネットワークを共有しているPodと纏めることで管理が楽になリます。

最初は1podに1コンテナで構成することをおすすめします。


*Replica Set*
Podを作成したり管理したりするもの。
これは、deploymentによって作成される。
システムを入れ替える場合は、Replica Setとpodが入れ替わることになります。


podの数を増やすには↓

```
kubectl scale deployment --replicas 2 my-nginx
```

podが増えていることがわかる。

```
kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
my-nginx-9b596c8c4-dcw9x   1/1     Running   0          43h
my-nginx-9b596c8c4-gcfrg   1/1     Running   0          43h
```

次にサービスを作成して、外からアクセスできるようにしてみる。

```
kubectl expose deployment my-nginx --port=80 --type=LoadBalancer
```

```
kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        3d17h
my-nginx     LoadBalancer   10.106.179.40   <pending>     80:32343/TCP   28s
```

ここでEC2のセキュリティグループを許可することを忘れないようにしましょう。
![スクリーンショット 2020-04-11 14.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/581a9f27-b66b-9aaa-0458-2b8eaf126e07.png)

最後に`EC2のパブリックIPアドレス:32343`にアクセスして表示されるか確認！

EC2のパブリックIP ➡️　EC2のプライベートIP:32343 →　Services  10.106.179.40:80 →　pod 172.17.0.4 172.17.0.5

なので、サービスはロートバランサーの役割もしてくれる。