k8sでnginxを起動してWelcome to nginxする

## ゴール
[公式ドキュメント](https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/#creating-a-deployment)に記載されているNginxのマニフェストをデプロイして外部からアクセスできるようにする
<img width="573" alt="スクリーンショット 2020-04-25 15.20.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433567/6637931f-9428-7085-7873-58df2694deed.png">

## 推奨環境
* EC2
* Kubeadm

## 作成するファイル一覧
```
work
├─ debug.yaml
├─ Dockerfile
├─ nginx-deployment.yaml
└─ nginx-service.yaml
```

## debug用のPod作成
### Dockerfile作成（Cent OS）

```dockerfile:Dockerfile
FROM centos:7
```

```bash
# コンテナイメージ作成
docker build -t debug .

# イメージが作成されたか確認
docker images | grep debug

# コンテナ動作確認
docker run -it debug bash
```

### Pod作成
マニフェストを作成する

```yaml:debug.yaml
apiVersion: v1
kind: Pod
metadata:
  name: debug
  namespace: default
spec:
  containers:
    - name: debug
      image: debug
      imagePullPolicy: Never # ローカルに存在するコンテナイメージを取得する
      command:
        - "sh"
        - "-c"
      args:
        - |
          while true
          do
            sleep 5
          done
```

マニフェストをk8sにデプロイする

```bash
kubectl apply -f debug.yaml
```

Podの起動を確認する

```
kubectl get pod
```

## NginxのDeployment作成（[公式ドキュメント](https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/#creating-a-deployment)のもの）

```yaml:nginx-deployment.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
```

マニフェストをk8sにデプロイする

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

Depoymentsの確認

```bash
kubectl get deployments
```

Podの起動とIPアドレスを確認する

```bash
kubectl get pod -o wide

NAME                                READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
debug                               1/1     Running   0          16m     192.168.29.97    k8s.master   <none>           <none>
nginx-deployment-6b474476c4-djqqv   1/1     Running   0          3m48s   192.168.29.98    k8s.master   <none>           <none>
nginx-deployment-6b474476c4-dww8l   1/1     Running   0          3m48s   192.168.29.99    k8s.master   <none>           <none>
nginx-deployment-6b474476c4-gjm29   1/1     Running   0          3m48s   192.168.29.100   k8s.master   <none>           <none>
```

debug用Podを使って疎通確認

```bash
# Podの中に入る
kubectl exec -it debug bash

# curlコマンド実行
curl 192.168.29.98
curl 192.168.29.99
curl 192.168.29.100
```

## NginxのService作成（k8sクラスタ外からアクセスできるようにするためのもの）
[公式ドキュメント](https://kubernetes.io/ja/docs/concepts/services-networking/connect-applications-service/#service%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E3%81%99%E3%82%8B)参考

```yaml:nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30000
  type: NodePort
```

マニフェストをk8sにデプロイする

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

Serviceの確認

```bash
kubectl get svc
```

Serviceの詳細確認

```
kubectl describe service nginx-svc

Name:                     nginx-svc
Namespace:                default
Labels:                   <none>
Annotations:              Selector:  app=nginx
Type:                     NodePort
IP:                       10.96.67.76
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30000/TCP
Endpoints:                192.168.29.100:80,192.168.29.98:80,192.168.29.99:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
```

debug用Podを使って3つ動いているPodを自動的に割り当てるか確認

```bash
# Podの中に入る
kubectl exec -it debug bash

# curlコマンド実行
# curl <サービス名>
curl nginx-svc
```

クラスタ外部から疎通確認(DebugPodに入っていない状態)

```
# kubectl describe service nginx-svcで表示される「IP」の値
curl 10.96.67.76
```

## ブラウザからも表示できるようにする

仮想マシン上のポート番号30000を開放する
AWSの場合、セキュリティグループのインバウンドのルールを編集してポートを開放する

## ブラウザにアクセスする

```
http://<仮想マシンのIPアドレス>:30000
```

<img width="573" alt="スクリーンショット 2020-04-25 15.20.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433567/31f01779-a5d3-4263-0bdc-815bc24d0584.png">