【k8s】YAMLでNginxをクベってみた【kubernetes】


![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275273/e62571f5-ce07-0ffb-512a-bda6d9fd37ec.png)

[前回の記事](https://qiita.com/joe_hirata/items/2d8f569c4d60bcaed469)では、kubernetesのさわりの部分を紹介しました。
今回はYAMLを利用して構築してみました。

##目次

1. [準備](#準備)
2. [デプロイメントの作成](#デプロイメントの作成)
3. [サービスの作成](#サービスの作成)
4. [もしminikubeでloadbalancerが利用できなかった場合](#もしminikubeでloadbalancerが利用できなかった場合)
5. [参考にしたリンク](#参考にしたリンク)

##準備

minikubeの稼働状況を確認、ダッシュボードを起動する。

```bash
$ minikube status 
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.114

$ minikube dashboard
Opening http://127.0.0.1:53536/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/ in your default browser...
```

##デプロイメントの作成

デプロイメントの作成をしてみましょう。
デプロイメントは、レプリカセットなどのリリースに関する管理を行います。

[こちら](https://kubernetes.io/docs/tasks/run-application/run-stateless-application-deployment/)を参考にマニフェストファイル(yaml)を作成。レプリカはなんとなく「１」にしました。

```yaml:nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
```

作成した`nginx-deployment.yaml`を指定して[kubectl apply](https://qiita.com/tkusumi/items/0bf5417c865ef716b221)する。

```bash
$ kubectl apply -f ./nginx-deployment.yaml 
```

ダッシュボードで確認してみると、「デプロイメント」「ポッド」「レプリカセット」が立ち上がっているのが分かる。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275273/7a18a286-da3f-fb1b-b3fb-ff441ac6459b.png)

もし「反映されて困るが結果だけ知りたい」という場合は、`kubectl apply`コマンドに`--dry-run`オプションをつけて実行しましょう。

##サービスの作成

サービスを作成しましょう。
サービスでは、Podとの通信ポリシーを定義します。

ports.portに記載したポート番号をports.targetPortのポート番号へ転送します。
今回の場合だと、8080番ポートへアクセスすると80番ポート(Nginxコンテナで利用するように指定したポート)へ転送するようになってます。

```yaml:nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - name: http
      port: 8080
      targetPort: 80 ##nginx-deployment.yamlのcontainerPortと同値
```

`type`の項目に注目してみると、`LoadBalancer`と記載があります。
サービス作成時にLoadBalancerタイプを指定するとホストから直接アクセスが可能となります。

ブラウザを開き、http://localhost:8080/ へアクセスすると、NginxのWelcomeページが表示されました。

やったぜ(☝︎ ՞ਊ ՞)☝︎
![Welcome_to_nginx_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275273/9c1bca19-9f56-f388-83f9-3189d6546434.png)


##もしminikubeでLoadBalancerが利用できなかった場合

[minikubeではLoadBalancerタイプをサポートしていない](https://kubernetes.io/ja/docs/setup/minikube/#%E6%97%A2%E7%9F%A5%E3%81%AE%E5%95%8F%E9%A1%8C)という情報をちょろっと見かけました。

僕の場合は特に問題なくMacのminikubeでLoadBalancerタイプが利用できていたのですが、もしできなかった場合は以下をお試しください。

※追記2019/08/02
[コメント](https://qiita.com/joe_hirata/items/0c4073f2cc39027d1c32#comment-e3b26008d8a99cc383e3)に記載してしまいましたが、僕が実施していた時、実はdocker-for-desctopで稼働していたから問題なく動作していた可能性があります。
試しにdocker-for-desktopをcontextsに設定し、nodeもminikubeではなくdocker-for-desktopであることを確認。
`localhost:8080`に接続したら正常にアクセスできました。

逆にminikubeをnodeにして起動すると、localhost~ではアクセスできず、`minikube service サービス名 --url`のURLでアクセスできました。
(「localhost」ではなく、ポート番号も30000番台のポート番号になってました。これはこれで正しい。)

もしminikubeでLoadBalancerタイプを利用していた場合は以下を参考にdocker-for-desktopへ切り替えましょう。

- [こちら](https://qiita.com/joe_hirata/items/2d8f569c4d60bcaed469#kubernetes%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)の手順に従って、dicker-for-desktopのkubernetesを起動しましょう。
- そうしましたら以下のコマンドでnodeが「docker-for-desktop」となるように設定。

```bash
## 変更前===================
$ kubectl config get-contexts
CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
          docker-for-desktop   docker-for-desktop-cluster   docker-for-desktop   
*         minikube             minikube                     minikube

$ kubectl get node
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     master    4d        v1.10.0


## 変更===================
$ kubectl config use-context  docker-for-desktop


## 変更後===================
$ kubectl config get-contexts
CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
*         docker-for-desktop   docker-for-desktop-cluster   docker-for-desktop   
          minikube             minikube                     minikube

$ kubectl get node
NAME                 STATUS    ROLES     AGE       VERSION
docker-for-desktop   Ready     master    21d       v1.10.11
```

nodeが切り替わったので多分きっと恐らくLoadBalancerがローカルで使えます。

##参考にしたリンク

- [Run a Stateless Application Using a Deployment](https://kubernetes.io/docs/tasks/run-application/run-stateless-application-deployment/)
- [Kubernetes: kubectl apply の動作](https://qiita.com/tkusumi/items/0bf5417c865ef716b221)
- [Kubernetes で 複数の nginx インスタンスを手元の Mac に立ち上げる](https://qiita.com/propella/items/c6e7a45b65b10a4e7e57)

次回はYAMLを拡張して複数コンテナの配置やAutoScalingなど色々やってみます。