読者です 読者をやめる 読者になる 読者になる

ScaleSets のインスタンスを増やしたら自動で Azure DC/OS のノードに追加された(∩´∀`)∩ワーイ

もう、タイトルが全てでありますー。

ScaleSets のインスタンスを追加

以前に「Azure DC/OSに、もう1つノード追加したいな!」ってなって、AzureもDC/OSも初心者の僕は「はて?どうやるんだろう?」ってなったのだった。そういえばAgentノードのインスタンスはScaleSetsっていうリソースなんだけど、名前から察するに増やせそうだよな、って見てみたら増やせたのであった。

例えば、プライベートノード用のScaleSetsにインスタンスが3つある状態で↓

f:id:bufferings:20161217093805p:plain

Scalingを選んで編集↓

f:id:bufferings:20161217093842p:plain

4つにして保存↓

f:id:bufferings:20161217093820p:plain

4つになった(∩´∀`)∩ワーイ↓

f:id:bufferings:20161217093910p:plain

って、以前はGUIからポチポチするのなかったから、なんかテンプレートみたいなのでやったんだけど、見落としてただけなのか、最近追加されたのかどっちか分かんないけど、どっちにしても今はGUIからポチポチできるみたいね。便利。

新しいインスタンスをDC/OSのAgentノードとして参加させる

インスタンスは増えたけど、DC/OSのノードとして認識させるにはどうしたらいいのかな?勝手に追加されるといいな。って思ってたら2,3分したらほんとに勝手に追加された。

下の3つがAgentノードね↓

f:id:bufferings:20161217094729p:plain

ScaleSetでインスタンスを増やしてしばらくぼーっとしてたら、増えた!そしてすぐさま待機中のタスクが動き始めた。(∩´∀`)∩ワーイ↓

f:id:bufferings:20161217094834p:plain

次はKafkaでも動かしてみようかなー。

Connect to Azure DC/OS nodes via SSH

Azure DC/OS は、SSHトンネルを作って、GUIとかAPIとかで操作するのが基本ぽい。

docs.microsoft.com

SSHで中に入るのは非推奨って書いてる。

SSH セッションは、クラスター管理システムとの間で作成することができます。 ただし、これは推奨されません。 管理システムで直接作業すると、構成を意図せず変更してしまうおそれがあります。

確かにそうだなー。でも、勉強中の今は、つなぎたいときもある。「どんな感じで動いてるのか知りたいなー?」ってときとか。なので、忘れないうちにメモしとく。

すなば

今回の記事用にsandboxっていう名前でDC/OSを立ち上げといた。

$ MASTER_FQDN=sandboxmgmt.japanwest.cloudapp.azure.com

DC/OS CLI from local

トンネルつないだ状態でローカルからDC/OS CLIを叩くと、叩ける。便利。

$ sudo ssh -L 80:localhost:80 -f -N azureuser@${MASTER_FQDN} -p 2200

$ dcos auth login
Login successful!

$ dcos marathon app list
ID          MEM  CPUS  TASKS  HEALTH  DEPLOYMENT  CONTAINER  CMD
/first-app  128   1     0/1    ---      scale       DOCKER   None

"dcos node ssh" from local

「ちょっと中がどんな感じなのか入って見てみたいなー」と思ったので、ここを読みながら、ふむふむ。

docs.mesosphere.com

こうか

$ dcos node ssh --master-proxy --leader

つながらない。。。(´;ω;`)ブワッ

Connect to Master

直接つないでみるとつながる。

$ sudo ssh azureuser@${MASTER_FQDN} -p 2200
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-28-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

78 packages can be updated.
0 updates are security updates.


*** System restart required ***
Last login: Thu Dec 15 23:11:17 2016 from 
azureuser@dcos-master:~$

Connect to Agent

マスターノードにはつながったから、次はエージェントノードにつなぎたいな。マスターからエージェントに入ればいいのかな。じゃ、一回マスターから出て、こんな感じで繋げばいけるかな。

$ sudo ssh -A azureuser@${MASTER_FQDN} -p 2200

azureuser@dcos-master:~$ ssh azureuser@10.32.0.5

azureuser@dcos-agent-private:~$

あぁ、つながった。(∩´∀`)∩ワーイ

Install DC/OS CLI into Master Node

ところで Azure DC/OSの場合、ローカルからだと使える機能と使えない機能があるみたい?だから、マスターノードにDC/OS CLI入れてみよっかな。

docs.mesosphere.com

azureuser@dcos-master:~$ curl -O https://downloads.dcos.io/binaries/cli/linux/x86-64/dcos-1.8/dcos
azureuser@dcos-master:~$ chmod +x dcos
azureuser@dcos-master:~$ ./dcos config set core.dcos_url http://localhost
[core.dcos_url]: set to 'http://localhost'
azureuser@dcos-master:~$ ./dcos auth login
Login successful!

で、AgentにつなぐときはMesos IDをとってきて

f:id:bufferings:20161216083003p:plain

こうかな

azureuser@dcos-master:~$ ./dcos node ssh --user=azureuser --mesos-id=18a6d7ad-d8a9-4832-a2ed-51ca8e0c3946-S0

azureuser@dcos-agent-public:~$

つながった。dockerコマンドでも叩いてみるか。

azureuser@dcos-agent-public:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
3f85c267f8a4        nginx               "nginx -g 'daemon off"   32 minutes ago      Up 32 minutes                           mesos-18a6d7ad-d8a9-4832-a2ed-51ca8e0c3946-S0.169cb095-d115-4519-a51a-a01313e2fb2a

見れた。良かった。

てことで

ノードに入ることができて良かった。んで、CLIをマスターノードに入れとくのもついでにやってみたけど、悪くないかもなぁ。

Azure Container Services の DC/OS に Marathon が一体化して使いやすくなってた

「Azure の DC/OS が使いやすくなった」っていうより「Azure の使ってる DC/OS のバージョンが上がったから使いやすくなってた」って感じなのかな。DC/OS GUI のダッシュボードはこんな画面で

f:id:bufferings:20161213170519p:plain

今僕は、Publicノード1つ、Privateノード3つの合計4ノードを使ってるんだけど、その全部のリソースを1台のマシンのように扱う事ができる感じ。CPU8個、メモリ23GB、Disk25GB。

これまではアプリをデプロイする時には DC/OS GUI とは別に Marathon GUI を開いて操作してたんよね。いや、むしろ DC/OS GUI は開かずに Marathon GUI だけ開いてたかも。

f:id:bufferings:20161213170919p:plain

それが気づくと DC/OS GUI の「Service」ってところに Marathon が一体化してた。

f:id:bufferings:20161213171210p:plain

Marthon GUI にある機能は全部あるっぽい。しかも見た目が好きな感じ。これは詳細画面↓

f:id:bufferings:20161213171548p:plain

ログも画面上で tail -f っぽい動きする。

f:id:bufferings:20161213171930p:plain

これまでは「DC/OS って言っても、結局 Mesos と Marathon じゃん」って感じだったんだけど、画面見ても分かる通り Services と Jobs というところで Marathon と Metronome が一体化してて、いよいよ DC/OS 感が出てきたのかなー。ちな、これまで通りに Marthon GUI を使いたい人は使えます。APIについても勉強しなきゃなー。

参照:

bufferings.hatenablog.com

bufferings.hatenablog.com

Spring Boot アプリを Maven で Docker Hub に push

僕はSpring Cloudに関して、Kennyのこのリポジトリを参照しまくってるんだけど。

github.com

Dockerの設定が入ってるので参考にした。

Repository

ここでやっといたよ。

github.com

やることは

  1. pom.xml にビルド設定を書く
  2. Dockerfile を書く
  3. push する

これだけ。

1. pom.xmlにビルド設定を書く

例えば僕のリポジトリの config-service ならここ

https://github.com/bufferings/msa/blob/master/config-service/pom.xml#L61-L77

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>0.4.13</version>
  <configuration>
    <useConfigFile>true</useConfigFile>
    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
    <dockerDirectory>${basedir}/src/main/docker</dockerDirectory>
    <resources>
      <resource>
        <targetPath>/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>${project.build.finalName}.jar</include>
      </resource>
    </resources>
  </configuration>
</plugin>

spotifyのdocker-maven-plugin使ってるす。

github.com

useConfigFile

useConfigFile についてはここに書いてる。

https://github.com/spotify/docker-maven-plugin#using-docker-config-file-for-authentication

Another option to authenticate with private repositories is using dockers ~/.docker/config.json.

ログインしといたら ~/.docker/config.json を使ってくれるってことね。

${docker.image.prefix}

プロパティを bufferings1 で定義しといた。

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
  <docker.image.prefix>bufferings1</docker.image.prefix>
</properties>

finalName

Dockerfileでプロジェクト毎にとか、バージョンが変わる毎に内容を書き換えるの面倒だったので finalName を固定しといた。僕は今回特に finalName を使ってないから別にいっかなって思って。

<finalName>app</finalName>

2. Dockerfileを書く

dockerDirectory で指定した src/main/docker の下に Dockerfile を置いとく。

FROM anapsix/alpine-java:8
VOLUME /tmp
ADD app.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

3. push する

ここを参考にして

https://github.com/spotify/docker-maven-plugin#usage

docker login したあとに、こうしたら

mvn clean package docker:build -DpushImage

Docker Hub に push される。(∩´∀`)∩ワーイ

おまけ .travis.yml

.travis.yml にこんな感じで書いといた

sudo: required

language: java
jdk:
  - oraclejdk8

cache:
  directories:
  - $HOME/.m2

services:
  - docker

script:
  - docker login -e="$DOCKER_EMAIL" -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
  - mvn -f auth-service clean package docker:build -DpushImage
  - mvn -f config-service clean package docker:build -DpushImage
  - mvn -f discovery-service clean package docker:build -DpushImage
  - mvn -f edge-service clean package docker:build -DpushImage
  - mvn -f kaiten-sushi-web clean package docker:build -DpushImage
  - mvn -f user-service clean package docker:build -DpushImage

https://hub.docker.com/u/bufferings1

f:id:bufferings:20161212071742p:plain

(∩´∀`)∩ワーイ

Prometheusを触ってみる。のをDockerでやってみる。のとgrafana。

昨日の朝、ぼーっとしてたらこんな記事があったので

qiita.com

Prometheusっていうモニタリングツールがあるのかぁと思って。

prometheus.io

触ってみようかなと思ったのでした。

まずは動かす

Dockerで動くとあんまり何も考えなくていいなぁって思ってたら、ちゃんとあった( Installing | Prometheus )。(∩´∀`)∩ワーイ

docker run -p 9090:9090 prom/prometheus

で、9090にアクセスしたらとりあえず動いてる。

f:id:bufferings:20161210230541p:plain

自分自身を監視してみる

さっきのは起動しただけで何も情報がないので、実際に監視してみるとどんな感じになるのか。サンプルとして自分自身を監視できるみたいなのでやってみよう。

Getting started を読みながらprometheus.ymlってファイルを作って

global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:9090']

その設定ファイルをDockerイメージに渡して起動

docker run -p 9090:9090 -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

なんか色々出てくるようになったので適当に選んでみる

f:id:bufferings:20161211120810p:plain

なんかいい気分だ

f:id:bufferings:20161211120852p:plain

grafanaにしてみる

このままじゃあんまりやる気出ないのでgrafanaにできるっぽいのでしてみよう。

ここを参考にした↓

Monitoring with Prometheus, Grafana & Docker Part 1 — finestructure

こんな感じでdocker-composeファイル作れば良さそうかな。

version: '2'
services:
  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    expose:
      - "9090"
  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"

docker-compose up して 3000 にアクセス。起動してた。

f:id:bufferings:20161211125308p:plain

データソースをPrometheusにする必要があるっぽいので

f:id:bufferings:20161211125347p:plain

こんな感じ。Nameは適当。Urlはcomposeファイルに書いたサービス名ね。

f:id:bufferings:20161211125359p:plain

でダッシュボードを作るっぽい

f:id:bufferings:20161211125531p:plain

Graphを選んで

f:id:bufferings:20161211125641p:plain

最初はサンプルが表示されてるんだけど、パネルをクリックしてでてきたポップアップからEdit

f:id:bufferings:20161211125822p:plain

メトリクスの部分でさっきのデータソース(ここでは My prometheus)を選んで、適当にクエリを書く

f:id:bufferings:20161211130035p:plain

とグラフがでてきた。(∩´∀`)∩ワーイ

f:id:bufferings:20161211130117p:plain

ちょこちょこ触ってみよっと。

Doma2 を Spring Boot と Maven と Eclipse(STS) で使ってみたよ

これまた楽ちんだった。

JJUG CCCの発表用に作ったデモアプリ( #jjug_ccc DDDとMicroservicesについて喋ってきましたー(∩´∀`)∩ - Mitsuyuki.Shiiba )で、Doma2を使ってみた。Doma1は以前に使ったことあるけどDoma2は初めて。っても、Doma2の機能の話じゃなくて、Doma2をSpring BootとMavenEclipseで使ってみたよ。って話ね。

pom.xml

Spring Bootのアプリにこれを追加すればいいだけ。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
  <groupId>org.seasar.doma.boot</groupId>
  <artifactId>doma-spring-boot-starter</artifactId>
  <version>1.1.0</version>
</dependency>

Doma は Annotation Processor を使ってるから、pomのビルド設定を書くのが面倒くさかったんだけど、doma-spring-boot-starterが良いようにやってくれてるっぽい!素敵だ。

Eclipse: m2e

僕はSTSを使ったからMaven周りのプラグインが最初から入ってるんだけど、ここに m2e を追加で入れておく。で、プロジェクトをインポートすると、自動的に Annotation Processor が設定される。素敵だ。

@Transactional

SpringのTransactionalアノテーションが特に何も考えなくても使える。素敵だ。(パッケージプライベートなメソッドにつけててトランザクションかからなくて???ってなってたのは内緒)

設定ファイル

h2を使ったので application.ymldoma.dialect: h2 をつけといたらDialectがh2になった。素敵だ。

Eclipse: Doma Plugin

SQLファイルとDaoの間を行ったり来たりするプラグイン。入れとくと便利。

http://doma.readthedocs.io/ja/stable/getting-started/#eclipse-doma-tools

いっこはまったこと: META-INFの場所

特に何も考えずにSQLファイルを src/main/java/META-INF の下に入れてて。Eclipseで動かすときは問題なかったんだけど、Mavenでビルドしようとすると「SQLファイルが見つからない」って怒られて。「はて?」ってなってたんだけど、これ src/main/resources/META-INF の下に入れなきゃいけないっぽい。ま、SQLファイルなんだし、そのほうが自然だな。

全然関係ないけど、Entity クラスのフィールドとして LocalDateTime が何も考えずに使えるところに幸せを感じた。

参照

Welcome to Doma — Doma 2.0 ドキュメント

Spring Boot + Doma2を使おう - BLOG.IK.AM

GitHub - domaframework/doma-spring-boot

JJUG CCC カテゴリーの記事一覧 - Mitsuyuki.Shiiba

Spring BootでLombokを使ってみたら楽だった

好き嫌いの分かれるLombok。僕は好き。

使うアノテーション

使い始めは @Data とか使って「便利!」とか思ってたけど。最近は使わなくなった。というのも、DDDスタイル好きなのでモデルでは setter を公開しなくて、なので、使うのはこの3つくらいかな。

@Getter
@EqualsAndHashCode
@ToString

@Accessors にfluentの設定を入れると例えば firstName フィールドに対する getter が firstName() になるので、こっちの方が好みではあるんだけど、getXxxの方がJSON関係とか色んなライブラリで使いやすいから普通に getter で使う方が良さそうかな。あと、単なるDTOだったら使うかな?とも思ったんだけど結局 public フィールド使うから @Data 使わなくて @EqualsAndHashCode@ToString を使うくらい。使いすぎには注意したい。

Spring Boot + Lombok

ただ、Lombokはアノテーションプロセッサーを使ってることもあり。ビルド周りの設定が面倒、特にMavenの設定。すぐ忘れる。って気持ちだったんだけど。そこはさすがSpring Boot。楽だった。pomに↓の依存関係を追加するだけ。親pomがいい具合にやってくれてるんだろうなぁ。

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <scope>provided</scope>
    </dependency>

Eclipseの方は普通にlombokをインストールすればよくて

java -jar lombok.jar

こんな感じになる

f:id:bufferings:20161209074337p:plain

Spring Boot使うとLombokも簡単に使えて良いなー。