これまで説明したように、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.
数分程度まてばこの通りです!

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