12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-07-31

004.png

前回の記事では、kubernetesのさわりの部分を紹介しました。
今回はYAMLを利用して構築してみました。

##目次

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

##準備

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

$ 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...

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

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

こちらを参考にマニフェストファイル(yaml)を作成。レプリカはなんとなく「1」にしました。

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する。

$ kubectl apply -f ./nginx-deployment.yaml 

ダッシュボードで確認してみると、「デプロイメント」「ポッド」「レプリカセット」が立ち上がっているのが分かる。
002.png

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

##サービスの作成

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

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

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

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

minikubeではLoadBalancerタイプをサポートしていないという情報をちょろっと見かけました。

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

※追記2019/08/02
コメントに記載してしまいましたが、僕が実施していた時、実は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へ切り替えましょう。

  • こちらの手順に従って、dicker-for-desktopのkubernetesを起動しましょう。
  • そうしましたら以下のコマンドでnodeが「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
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がローカルで使えます。

##参考にしたリンク

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

12
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?