これまで説明したように、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に監視系をデプロイして、各サーバーの監視に利用しています。