仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Jujuでデプロイするサービスを追加する方法

これまで説明したように、YAMLファイルにデプロイするアプリケーション、サービス同士の繋がり、オプションを設定すれば記述した通りJujuが環境をセットアップしてくれます。Canonicalが提供するUbuntu Jujuは非常に便利なデプロイツールです。

次のYAMLは私がよく使うKubernetesをデプロイするJuju YAMLの例です。

% cat k8s-deploy.yml

# Kubernetes Calico 123 base
description: A 2-machine Kubernetes cluster, appropriate for PoC. Includes a 1 Kubernetes worker nodes.
machines:
  '0':
    series: xenial
    constraints: "arch=amd64 tags=node1" 
  '1':
    series: xenial
    constraints: "arch=amd64 tags=node2"

services:
  easyrsa:
    annotations:
      gui-x: '450'
      gui-y: '550'
    charm: cs:~containers/easyrsa-45
    num_units: 1
    to: 
    - 0
  etcd:
    annotations:
      gui-x: '800'
      gui-y: '550'
    charm: cs:~containers/etcd-90
    num_units: 1
    options:
      channel: 3.2/stable
    to:
    - 0
  calico:
    annotations:
      gui-x: '450'
      gui-y: '750'
    charm: cs:~containers/calico-41
  kubeapi-load-balancer:
    annotations:
      gui-x: '450'
      gui-y: '250'
    charm: cs:~containers/kubeapi-load-balancer-64
    expose: true
    num_units: 1
    options:
      proxy_read_timeout: 6000
    to:
    - 0
  kubernetes-master:
    annotations:
      gui-x: '800'
      gui-y: '850'
    charm: cs:~containers/kubernetes-master-116
    num_units: 1
    options:
      channel: 1.11/stable
      enable-nvidia-plugin: auto
    to:
    - 0
  kubernetes-worker:
    annotations:
      gui-x: '100'
      gui-y: '850'
    charm: cs:~containers/kubernetes-worker-131
    expose: true
    num_units: 1
    options:
      channel: 1.11/stable
    to:
    - 1
relations:
- - kubernetes-master:kube-api-endpoint
  - kubeapi-load-balancer:apiserver
- - kubernetes-master:loadbalancer
  - kubeapi-load-balancer:loadbalancer
- - kubernetes-master:kube-control
  - kubernetes-worker:kube-control
- - kubernetes-master:certificates
  - easyrsa:client
- - etcd:certificates
  - easyrsa:client
- - kubernetes-master:etcd
  - etcd:db
- - kubernetes-worker:certificates
  - easyrsa:client
- - kubernetes-worker:kube-api-endpoint
  - kubeapi-load-balancer:website
- - kubeapi-load-balancer:certificates
  - easyrsa:client
- - calico:etcd
  - etcd:db
- - calico:cni
  - kubernetes-master:cni
- - calico:cni
  - kubernetes-worker:cni

Kubernetesのデプロイ後に監視ツールとしてPrometheusを導入したいという話になった場合に、Prometheusをセットアップするにはいくつか方法がありますが、JujuにはPrometheus Charmが用意されていますし、そもそもKubernetesをJujuでデプロイしたのであれば、PrometheusもJujuでデプロイすると簡単です。

なぜなら、Jujuは冪等性のあるデプロイツールであるため、その環境をデプロイするときに使ったJujuのYAMLファイルにPrometheusサービスを追加して、もういちどそのYAMLファイルを使ってjuju deployコマンドを実行するとデプロイ済みの環境にサービスをあとから追加できるからです。

YAMLのservices:の項目に例えば以下のような記述を追加します。

  prometheus:
    charm: "cs:xenial/prometheus-6"
    num_units: 1
    expose: true
    storage metrics-filesystem: rootfs
    options:
      install_method: snap
      web-listen-port: 9090
      snap_channel: stable
    to:
    - 0

追加後にjuju deployコマンドを実行します。Jujuは変化のあった部分のみを処理します。今回の場合はprometheus-6サービスのデプロイです。

% juju deploy k8s-deploy.yml
Resolving charm: cs:xenial/prometheus-6
Executing changes:
- upload charm cs:prometheus-6
- deploy application prometheus using cs:prometheus-6
- add unit prometheus/0 to existing machine 0

Jujuは監視対象のサーバーを事前に定義することができます。k8s-deploy.ymlに監視対象のサーバーを追記してみます。

  prometheus:
    charm: "cs:xenial/prometheus-6"
    num_units: 1
    expose: true
    storage metrics-filesystem: rootfs
    options:
      static-targets: 172.28.17.19:9100,172.28.17.20:9100  #追記した行
      install_method: snap
      web-listen-port: 9090
      snap_channel: stable
    to:
    - 0

追記し終わったらもう一度juju deployコマンドを実行します。やはりJujuは変化のあった部分のみを処理します。

%  juju deploy k8s-bundle.yml
Resolving charm: cs:xenial/prometheus-6
Executing changes:
- set application options for prometheus
Deploy of bundle completed.

数分程度まてばこの通りです!

f:id:virtualtech:20180704120824p:plain

ちなみに今回はPrometheusを追加するのを例としてあげましたが、 普段常用環境では、別のJuju Modelに監視系をデプロイして、各サーバーの監視に利用しています。