LoginSignup
1
0

More than 3 years have passed since last update.

Deploy on Kubernetesをやってみる

Posted at

Deploy on Kubernetesをやってみる

Deploy on Kubernetes のサイトを参考に環境を用意していきます。
https://docs.docker.com/docker-for-mac/kubernetes/

この内容を進めるには、事前にDocker Desktop for Mac > Getting startedをやっておく必要があります。
上記内容については、Qiitaの記事Get started with Docker Desktop for Macをやってみるでも実践してますので、参考までに。

1. docker-compose.ymlを作成

version: '3.3'

services:
  web:
    image: dockersamples/k8s-wordsmith-web
    ports:
     - "80:80"

  words:
    image: dockersamples/k8s-wordsmith-api
    deploy:
      replicas: 5
      endpoint_mode: dnsrr
      resources:
        limits:
          memory: 50M
        reservations:
          memory: 50M

  db:
    image: dockersamples/k8s-wordsmith-db

2. mystackという名前でスタックをデプロイ

docker stack deployコマンドで作成したdocker-compose.ymlファイルを指定して何やらやるらしい。
docker stack deployコマンドが何をするものなのか、わからなかったので調べてみました。

Deploy a new stack or update an existing stack
新しいスタックをデプロイまたは既存のスタックを更新する

ここで指定しているコマンドのオプションについても理解しておきたいと思います。

オプション デフォルト 説明
--namespace Kubernetesで利用される名前空間
--compose-file , -c docker-compose.ymlファイルのパスまたは'-'(stdin(標準入力)からの入力)を指定
--orchestrator 利用するオーケストレータを指定する。(kubernetes/swarm/all)
$ docker stack deploy --compose-file docker-compose.yml --orchestrator=kubernetes mystack
Waiting for the stack to be stable and running...
web: Ready      [pod status: 1/1 ready, 0/1 pending, 0/1 failed]
words: Ready        [pod status: 5/5 ready, 0/5 pending, 0/5 failed]
db: Ready       [pod status: 1/1 ready, 0/1 pending, 0/1 failed]

Stack mystack is stable and running

$ docker stack services --orchestrator kubernetes mystack
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
7a516f2b-250        mystack_db          replicated          1/1                 dockersamples/k8s-wordsmith-db    
7a5850d1-250        mystack_web         replicated          1/1                 dockersamples/k8s-wordsmith-web   *:80->80/tcp
7a765a71-250        mystack_words       replicated          5/5                 dockersamples/k8s-wordsmith-api   

--namespaceオプションを使ったところ以下のメッセージが出たため、とりあえず使わないことにしました。

namespaces "my-app" not found

3. 起動したので動きを確認する

Deploy on Kubernetesには、deployしたあとのことについて触れられていませんでした。

なので実際に使い方が合っているのかは分かりませんが、とりあえず試した内容を記録します。

  web:
    image: dockersamples/k8s-wordsmith-web
    ports:
     - "80:80"

にあるように、80ポートを使用したWebサーバーがあるので、ここにアクセスしてみます。

以下のような画面が表示されます。

screencapture-localhost-2019-12-23-07_24_10.png

画面には特にボタンやリンクなどが無い。。。。

4. dockersampleをどうやって使ったらいいのか確認してみる

どうやら、画面をリロードする度に、WebAPIを実行して単語(word)を取得し、レゴブロックのような見た目のところにバインドして画面に表示しているようです。

/words/noun/words/adjective,/words/verbというAPIが用意されているみたいです。

<!DOCTYPE html>
<html lang="en" ng-app="lab">
<head>
  <meta charset="utf-8">
  <title>dockercon EU 18</title>
  <link rel="stylesheet" href="style.css">
</head>

<body>
  <div class="logo"><img src="images/logo.svg" style="width:50%"/></div>

<div class="sentence" ng-controller="LabCtrl">
  <div class="line line1 slide-in">
  <span class="result adjective slide-in">
    <span class="word slide-in" ng-bind="adjective1.word"></span>
    <span class="hostname" ng-bind="adjective1.hostname"></span>
  </span>
  <span class="result noun slide-in">
    <span class="word" ng-bind="noun1.word"></span>
    <span class="hostname" ng-bind="noun1.hostname"></span>
  </span>
  </div>
  <div class="line line2 slide-in">
  <span class="result verb slide-in">
    <span class="word" ng-bind="verb.word"></span>
    <span class="hostname" ng-bind="verb.hostname"></span>
  </span>
  </div>
  <div class="line line3 slide-in">
  <span class="result adjective slide-in">
    <span class="word" ng-bind="adjective2.word"></span>
    <span class="hostname" ng-bind="adjective2.hostname"></span>
  </span>
  <span class="result noun slide-in">
    <span class="word" ng-bind="noun2.word"></span>
    <span class="hostname" ng-bind="noun2.hostname"></span>
  </span>
  </div>
</div>

<div class="footer"><img src="images/homes.png" /></div>
</body>

<script src="angular.min.js"></script>
<script src="app.js"></script>
</html>
"use strict";

var lab = angular.module('lab', []);

lab.controller('LabCtrl', function ($scope, $http, $timeout) {
  $scope.noun1 = "";
  $scope.noun2 = "";
  $scope.adjective1 = "";
  $scope.adjective2 = "";
  $scope.verb = "";

  getWord($http, $timeout, '/words/noun', function(resp) {
    $scope.noun1 = word(resp);
  });
  getWord($http, $timeout, '/words/noun', function(resp) {
    $scope.noun2 = word(resp);
  });
  getWord($http, $timeout, '/words/adjective', function(resp) {
    var adj = word(resp);
    adj.word = adj.word.charAt(0).toUpperCase() + adj.word.substr(1)
    $scope.adjective1 = adj;
  });
  getWord($http, $timeout, '/words/adjective', function(resp) {
    $scope.adjective2 = word(resp);
  });
  getWord($http, $timeout, '/words/verb', function(resp) {
    $scope.verb = word(resp);
  });
});

function getWord($http, $timeout, url, callback) {
  $http.get(url).then(callback, function(resp) {
    $timeout(function() {
      console.log("Retry: " + url);
      getWord($http, $timeout, url, callback);
    }, 500);
  });
}

function word(resp) {
  return {
    word: resp.data.word,
    hostname: resp.headers()["source"]
  };
}

5. 使い終わったらコンテナを停止する

$ docker stack rm --orchestrator=kubernetes mystack
Removing stack: mystack

以上でDeploy on Kubernetesのお試しは終了です。

1
0
0

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
1
0