k8sを触ってみる- pod を立てるまで

k8s(minikube)を使って、nginxをpodとして立てるまでやってみたときのメモです。

# k8sとは
これまでのdockerなどによるコンテナの運用や監視、実行などを自動で行ってくれるツールです。
これまでは、特定のタイミングでサーバー台数をスケールしたりという行為はホストが複数ある場合はネットワークなどの関係で非常に難易度が高い。

↑の問題を解決するためにできたのがk8s。
複数のhostを一つの環境として扱い、操作したり、状態検知をして自動で復旧したりなどが出来る。

ただ、その分扱う難易度というか、概念や考え方がが非常に独特なため、先に用語の解説をしていきます。

# ざっくり用語解説

## 概念
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179800/c4db5e0d-da02-cd9f-6da7-7145cfe47c2f.png)
公式サイトより引用

### cluster
以下の機能を包括的を管理するもの
masterというものがクラスターを管理している。

### node 
podを起動して、リソース管理をする機構のこと。一つの物理サーバーやEC２のようなサーバーだと考えれば良いと思います。

### pod
k8s上で考えられる最小単位のアプリケーションのこと。podはnodeの中で起動する。podの中には自分のアプリケーションだったり、DBだったりを入れる。大体dockerのコンテナと同じだが、podの場合は複数のコンテナを一つのpodとして扱うときもある。

### controller
podに対して操作を行ったり、監視をしたりするものの総称だと考えてください。コントローラーは独自のライフサイクルを持っていて、
コントローラーの種類ごとに監視や更新など用途が違いそれごとにライフサイクルも違います。

### service
各pod同士やnodeが疎通するためのネットワークの概念
podのIPアドレスはアーキテクチャ上一定になることがなく、直IP打ちで疎通するのもしんどいので、
単一の疎通のエンドポイントを提供する機能
## ツール

# minikube
今回はminikubeという簡易版k8sのようなツールで環境を構築していきます。

minikubeとは単一nodeのクラスターを提供するツールで、概念や一通りの使い方を学びやすいので採用しました。
## install 

ここから自分のOSに合わせてインストール

https://kubernetes.io/docs/tasks/tools/install-minikube/

## driver の設定
コンテナに何のツールを使うかを指定する必要があります。
driver の一覧
https://minikube.sigs.k8s.io/docs/reference/drivers/

今回は、使い慣れているdockerを使用します。

```bash
minikube config set vm-driver docker
```

## 起動

```bash
minikube start 
```
起動したらこんな感じで色々出てきます。

```
😄  minikube v1.7.3 on Ubuntu 18.04
    ▪ KUBECONFIG=~/.kube/config
✨  Using the docker (experimental) driver based on user configuration
🔥  Creating Kubernetes in docker container with (CPUs=2), Memory=2000MB (7864MB available) ...
🐳  Preparing Kubernetes v1.17.3 on Docker 19.03.2 ...
    ▪ kubeadm.pod-network-cidr=10.244.0.0/16
🚀  Launching Kubernetes ... 
🌟  Enabling addons: default-storageclass, storage-provisioner
⌛  Waiting for cluster to come online ...
🏄  Done! kubectl is now configured to use "minikube"
```
これでクラスターとnodeが作れたので、次はnodeやpodなどをいじっていきます。

# クラスターを操作するツール
minikubeはクラスターを創ることはできますが、それを操作したり、状態を確認したりはできません。
なので、クラスターを操作するツールが必要です。

それが `kubectl` となります。

## install 
下記参照
https://kubernetes.io/docs/tasks/tools/install-kubectl/

## nodeを確認
インストールしたら以下をnodeを確認します。
minikubeは単一nodeのclusterを創るツールなので、正常に動作していれば、すでにnode立ち上がっているはずです。


```bash
kubectl get nodes
```
正常であればこんな感じになるはずです。

```
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   14h   v1.17.3
```

これでnodeがちゃんと存在していることが確認できたので次はnodeにpodを設置します。

# pod を設置する。
podを設置するために、まずpodの中身を定義する必要があります。
というわけでまずは設定ファイルを設定します。

## マニフェストの定義
今回はシンプルにnginx を創るだけですので、以下のような定義にしました。

nginx.yaml↓

```yaml
apiVersion: v1
kind: Pod # 何に対しての設定ファイルかを指定
metadata:
  name: nginx
  labels:
    name: loadBalancer
spec:
  containers:
    - name: lb
      image: nginx
      resources:
        limits:
          memory: "128Mi"
          cpu: "500m"
      ports:
        - containerPort: 8888
```

## pod を設置する
設置するには以下のコマンドを叩きます。

```bash
kubectl apply -f ./nginx.yaml
```

確認してみよう

```
kubectl get pods
```

こうなっていたら成功です。

```
NAME                     READY   STATUS    RESTARTS   AGE
nginx                    1/1     Running   0          32m
```

# おわりに
pod までできましたが、podのnginx　にcurl を叩いたり、ローカルからport接続して見れるようにしたいので、
また続きを書こうと思います。

それでは良いk8sライフを