【メモ】Kubernetesのよく使うリソースまとめ【初心者】

# 概要
- PodやらDeploymentやら、k8sのリソースは種類がいっぱいあってよくわからないのでまとめてみる
- 基本的に以下の書籍の内容をなぞる
- Docker/Kubernetes 実践コンテナ入門
  - github: https://github.com/yoskeoka/gihyo-docker-kuberbetes


## Node
- k8sクラスタが最も大きいリソース単位
- クラスタの管理下にNodeがある
  - AWSでいうEC2のインスタンス 

```bash
$ kubectl get nodes
```
でクラスタ内nodeを確認

## Namespace

- クラスタ内ではnamespaceごとに仮想的なクラスタを作成できる。

namespaceの一覧を見るには

```bash
$ kubectl get namespace
```
と打てばいい。
今後出てくるコマンドでnamespaceを指定したい場合は基本的に

```
-n {namespame}
```
のオプションをつければどうにかなる。



## Pod

- 1個以上のコンテナの集合体

例

```yaml:myPod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-echo
spec:
  containers: 
  - name: nginx
    image: gihyodockernginx
  ports:
    - containerPort: 80
  - name: echo
    image: gihyodocker/echo:latest
  ports:
  - containerPort: 8080
``` 

kindでリソースの種類を指定。今回はPod
metadata.nameにPodの名前をつける
spec.containers以下にコンテナとそのイメージを書いていく。
上の場合だとnginxとechoという2つのコンテナを1つのPodとしてまとめている。

### Pod関連のコマンド

podを作成する際は

```bash
$ kubectl apply -f myPod.yaml
```

-fオプションの場合はyaml fileを指定、-kの場合はdirectoryを指定。
削除する場合は

```bash
$ kubectl delete pod my-echo
```

ログを表示したい場合は

```bash
$ kubectl logs -f my-echo -c echo
```

-cでコンテナを指定する。
-fはなくても実行できた。

とは打てばよい。
できたPodを確認するには

```bash
$ kubectl get pods
```

とうつ。

```bash
$ kubectl describe pod my-echo
```
でPodの内容を詳細に表示。
PodはどこかのNodeに配置され、1つのPodが複数Nodeにまたがることはない。

## ReplicaSet
- 上記のPodの場合は1つのPodしか作成できないが、実際には何個も作りたいことが多い
- その場合はReplicaSetを使う
  - コード参考：https://github.com/yoskeoka/gihyo-docker-kuberbetes/blob/master/ch05/ch05_07/simple-replicaset.yaml 

```yaml:myReplicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet # リソースの名前
metadata:
  name: echo # ReplicaSetに名前をつける
  labels:
    app: echo 
spec: # 以下Podの設定
  replicas: 3 # いくつPodをつくるか
  selector:
    matchLabels:
      app: echo 
  template: # template以下はPodリソースにおけるspec定義と同じ
    metadata:
      labels:
        app: echo
    spec: # 以下Podを構成するコンテナの設定（さっきと同じ）
      containers:
      - name: nginx 
        image: gihyodocker/nginx:latest 
        env: 
        - name: BACKEND_HOST
          value: localhost:8080
        ports:
        - containerPort: 80 
      - name: echo
        image: gihyodocker/echo:latest
        ports:
        - containerPort: 8080
```

こんな感じで書く。
envの部分は環境変数を設定してる。
kubecltコマンドを使った作成の仕方はさっきと同様なので割愛。

## Deployment
- ぱっと見ReplicaSetと似てる
- ReplicaSetの世代管理を行う
  - コード参考：https://github.com/yoskeoka/gihyo-docker-kuberbetes/blob/master/ch05/ch05_08/simple-deployment.yaml 

```yaml:myDeployment.yaml

apiVersion: apps/v1
kind: Deployment # ここの名前が変わってる以外はほぼReplicasetと同じ
metadata:
  name: echo 
  labels:
    app: echo 
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echo 
  template: # template以下はPodリソースにおけるspec定義と同じ
    metadata:
      labels:
        app: echo
    spec:
      containers:
      - name: nginx 
        image: gihyodocker/nginx:latest 
        env: 
        - name: BACKEND_HOST
          value: localhost:8080
        ports:
        - containerPort: 80 
      - name: echo
        image: gihyodocker/echo:patched
        env: 
        - name: HOGE 
          value: fuga 
        ports:
        - containerPort: 8080

```

こんな感じで書く。
Deploymentは名前の通りデプロイの単位として使われ、ReplicaSetがそのまま使われることはあまりない。
Deploymentはリビジョンを使ってReplicaSetの世代管理を行える。
そのため問題があった場合に一つ前のversionにロールバックしたりとかできる。
Podの数を増やしたり減らしたりとかもよしなにやってくれて便利。


## Service
- Podを複数つくった場合、一つ一つのPodには別々のIPが割り当てられる
- Serviceを使えばそれらのアクセスポイントをひとつにまとめあげられる
  - コード参考：https://github.com/yoskeoka/gihyo-docker-kuberbetes/blob/master/ch05/ch05_09/simple-service.yaml 

```yaml:myService.yaml

apiVersion: v1
kind: Service # リソースの名前
metadata:
  name: echo # Serviceの名前
spec:
  selector:
    app: echo # appの名前。これに一致するapp, releaseを指定したPodと疎通できる
    release: summer
  ports:
    - name: http
      port: 80 # 80番ポートを公開

```

こんな感じで書く。
これで`http://echo/`にHTTPリクエストを通してPodに疎通できる。
厳密には`http://echo.{namespace}.svc.local`だが、svc.localは省略可能。
namespaceはデフォルトだとdefaultになる。

## Ingress
- Serviceはクラスター外には公開されない
- 外部に公開するにはIngressを使う
  - コード参考：https://github.com/yoskeoka/gihyo-docker-kuberbetes/blob/master/ch05/ch05_10_1/simple-ingress.yaml

```yaml:myIngress.yaml

apiVersion: extensions/v1beta1
kind: Ingress # リソースの名前
metadata:
  name: echo # Ingress名前
spec:
  rules:
  - host: ch05.gihyo.local # ここに外部からアクセスできる
    http:
      paths:
      - path: /
        backend:
          serviceName: echo # echoという名前のサービスの80番ポートを公開する
          servicePort: 80

```


## まとめ
- 本の内容を自分なりにまとめた