NECネッツエスアイ

コンテナ基盤上でZabbixを自動設定してみた(連載⑤:AnsibleコンテナイメージをKubernetes上にデプロイ)

はじめに

こんにちは!
事業開発推進部インフラ運用SLチームの樊です。
本連載シリーズでは、コンテナ基盤上で、Zabbixの構築や設定を素早く簡単に実現する方法について紹介してきました。
連載第4回目で、GitLabを用いてビルドされたイメージをリポジトリにプッシュする手順について紹介しました。
最終回の連載第5回目ではGitLabリポジトリ上のイメージをKubernetes上へダウンロードし、コンテナを構築する手順について紹介します。

〇目次
①認証トークンを含めた cluster 接続用 Secret の作成
②Secret を使った Job の作成
③ConfigMapの作成
④作成したJobとConfigMapのマウント
⑤Kubernetes上にデプロイ
⑥確認

〇これまでの連載で準備したもの
・Kubernetes環境上にZabbixを構築するためのyamlファイル(連載第1回)
・対象サーバーへのAgent登録とZabbixに監視対象サーバーの登録を自動実行するためのPlaybook(連載第2回)
・Dockerfileを用いて作成したPlaybookを含めたコンテナイメージ(連載第3回)
・GitLabのコンテナレポジトリ上に保存されているコンテナイメージ(連載第4回)

〇実行環境
・Kubernetes
・GitLab

〇イメージ図

①認証トークンを含めた cluster 接続用 Secret の作成

Kubernetesは、パスワードやトークン、キーなどの機密データを記載している Secret を使用することで コンテナレジストリを認証し、イメージが取得できます。
そのため、Kubernetes上でSecretを作成する必要があります。

kubectl create secret docker-registry <secret name> --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

 <secret name>:作成するSecretの名前(任意)
<your-registry-server>:接続するリポジトリのFQDNを記載 (GitLab上のコンテナリポジトリの例 https://registry.gitlab.com)
<your-name>:GitLabのアカウント名を記載
<your-pword>:GitLabのアカウント名に紐付くパスワードを入力
<your-email>:GitLabのアカウント名に紐付くメールアドレスを入力

②Secret を使った Job の作成

Jobは1つまたは複数のpodを作成し、指定された数のpodが正常に終了することを保証します。 指定された数のpodが正常に完了すると、Job自体も完了となります。 Jobを削除すると、作成したpodがクリーンアップされます。
今回はイメージをダウンロードすることが目的のため、podが正常に実行できれば完了です。
以上のことを前提にJobのyamlファイルを作成します。

vim job.yml

作成されたjob.ymlファイルに以下の内容を書込みます。

apiVersion: batch/v1
kind: Job
metadata:
  name: ******(例:ansible-zabbix)
  namespace: ******(例:k8szabbix)
spec:
  template:
    spec:
      containers:
      - name:  ******(例:ansible-zbxlnxagt)
        image:******(例: イメージ名:latest)    
        imagePullPolicy: Always
      restartPolicy: Never
      imagePullSecrets: 
      - name: ******(例:git-docker-secret)

以上でJobが作成されました。

③ConfigMapの作成

自動的に監視対象へZabbixAgentのインストールや監視項目の設定を行うには、監視対象の接続情報(ip/passwordなど)や設定情報をPlaybookに書込む必要があります。
事前に監視対象や監視項目ごとにimageを新しく作成することもできますが、作業や管理に手間がかかる場合があります。そのため今回はKubernetesの機能であるConfigMapを利用します。
ConfigMapは 機密性のないデータをキーと値のペアで保存するためAPIオブジェクトを使用します。Podは、環境変数、コマンドライン引数、またはボリューム内の設定ファイルとしてConfigMapを使用できます。
ConfigMapを使用すると、環境固有の設定をコンテナイメージから分離できるため、アプリケーションを簡単に移植できるようになります。
configmap.ymlファイルを作成します。

vim configmap.yml

作成されたconfigmap.ymlファイルに以下の内容を書込みます。

apiVersion: v1
kind: ConfigMap
metadata:
  name: ******(例: config-ansible)
data:
   inventory: |-
 (例:
        [all:vars]
        ansible_user=root
        ansible_port=22

#登録を行う対象サーバーの情報用変数
        [Linux_Server]
        <19*.***.***.**3> hostname=<kanshi11> ansible_ssh_pass=<pass>

#Playbook内の値の変数一覧(監視項目やグループなどzabbix側の設定)
        [Linux_Server:vars]
        hostgroups=Linux servers
        linktemplates=Linux by Zabbix agent
        zabbix_agent_package=zabbix-agent-6.0.10-release1.el8.x86_64.rpm
        zabbix_server_ip=<1**.***.**1>
        zabbix_host_name=Zabbix server
        serverurl=http://zabbix-web:**/api_jsonrpc.php
        loginuser=<BBB>
        loginpassword=<pass_BBB>
)

inventory:編集していくファイル名

④作成したJobとConfigMapのマウント

ConfigMapを反映したいコンテナイメージの情報を記述したJobに、マウント情報を追加する必要があります。
Jobのspec.template.spec.containersの配下にvolumeMountsを追加します。
Jobのspec.template.specの配下にvolumesを追加します。
マウント情報を手順②で作成したjob.ymlに追加します。

apiVersion: batch/v1
kind: Job
metadata:
  name: ansible-zbxlnxagt
  namespace: dragon
spec:
  template:
    spec:
      containers:
      - name: ansible-zbxlnxagt
        image: <GitLab上のイメージのパス>
        imagePullPolicy: Always
        volumeMounts:
          - mountPath: /root/files-clone/inventory
            name: inventory-conf
      restartPolicy: Never
      imagePullSecrets: 
      - name: regcred
      volumes:
      - name: inventory-conf
        configMap:
          name: config-ansible 

mountPath: /root/files-clone/inventory: inventoryファイルのコンテナ内のパス
注意すべき点は三つあります。
1)containers.volumeMounts.name と volumes.name が一致している必要がある(赤字)
2)volumes.configMap.name が先ほど作成したConfigMapの名前と一致している(緑字)
→以上の設定ができていないと、PodはいつまでもContainerCreatingを繰り返すことになってしまいます。
3)mountPathを指定する際、編集したいファイルを指定する必要がある
→ConfigMapで指定したファイル以外は削除されてしまうため、ディレクトリ内には他のファイルを置かないようにします。

⑤Kubernetes上にデプロイ

上記の手順より、「Jobが記載されているyamlファイル」と「ConfigMapが記載されているyamlファイル」が作成されました。
それらのyamlファイルをKubernetes上に配置します。

kubectl apply -f job.yml -f configmap.yml 

以上の手順でJobが実行され、コンテナイメージをKubernetes上にダウンロードし実行することで、Zabbixの監視対象や監視項目を追加することができます。

⑥確認

Ⅰ:kubectlでのポートフォワード
作成したpodを取得します。

kebectl get pod

以下のコマンドでpodにport-forwardし、ZabbixのGUI画面が表示されることを確認します。

kubectl port-forward <webのpod's_name> <任意port>:80
例)kubectl port-forward zabbix-web-6d8c7cd59-8n98l 18888:80


Ⅱ:Zabbix画面上での確認
ブラウザを開き、以下のURLにアクセスします。

http://localhost:<上のコマンドで入力したport番号>

以下のログイン画面が表示されます。
UsernameとPasswordを入力します。(デフォルトはAdminとzabbix)

Sign Inを押すと、Zabbixのメイン画面に遷移します。
メニューからホストを選択します。
画面に手順③で対象サーバーの情報用変数に設定された”kanshi11“というサーバーが登録されていることを確認できます。

また、メニューから最新データを選択し、ホストに”kanshi11″を選択します。
画面にホスト”kanshi11″の各情報が取得されていることを確認できます。

まとめ

以上の手順を通し、GitLabのコンテナレポジトリ上にプッシュしたコンテナイメージをKubernetes上にダウンロードし、適用することができました。
また、手順②③④で作成したyamlファイルの内容を連載①で作成したZabbixを構築するためのyamlファイルに追記することで、実際に構築する際に一つのコマンドだけでZabbixの構築、監視対象のサーバーへのAgentインストール、監視対象のサーバーをZabbix上の登録をまとめて実行することが可能です。

最後に

本連載は以上で終了となります。今回はKubernetes、GitLab、Ansible、コンテナなどを利用し、Zabbixの構築及び設定にかかる時間やミスを削減するための方法を紹介しました。また、本連載に関して、不明点やコメントがありましたらお気軽に下記のメールアドレスにご連絡をいただければ幸いです!

事業開発推進部インフラ運用SLチーム
nesic_2cs_jisui@ml.nesic.com 

〇参考記事
kubernetesのConfigMapを理解する – Qiita
ConfigMap | Kubernetes
Jobs | Kubernetes
【kubernetes】プライベートリポジトリから image を Pull する方法(翻訳) – Qiita

関連記事

TOP