前ふり

  • kubernetes 1.18.x

tl;dr;

  • 証明書の期限切れ

流れ

  • 2020/07/28 の昼頃から、kubectl を使って pod に処理を実行させる系のジョブがすべてコケる
  • 自分の PC から kubectl コマンドを打つと error: You must be logged in to the server (Unauthorized) がでる
  • ググりまくるもののまったく成果なし。
  • kubectl のバグを踏んだのではないかとおもい、コントロールノードの kubeadm, kubectl, kubelet をアップグレードした(本当は良くない)
  • 再度 kubectl コマンドを自分の端末から打つと、The connection to the server 192.168.10.190:6443 was refused - did you specify the right host or port? となった
  • ここで、kubelet の状態を systemctl status kubelet で確認したところ、activating となっており起動できてないということがわかる
  • kubelet のログを journalctl -u kubelet で見たところ、 part of the existing bootstrap client certificate is expired: 2020-07-27 06:24:58 +0000 UTC というメッセージが出て異常終了していた。

復旧手順

1
2
3
4
<code class="language-sh"># バックアップを取得
sudo su -
mkdir ~/k8s_backup_20200728
cp -rva /etc/kubernetes ~/k8s_backup_20200728/
1
2
<code class="language-sh"># とりあえずkubelet停止。
sudo systemctl stop kubelet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<code class="language-sh"># kubeadm init phase certs all
W0728 00:52:10.502471 3790 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Using existing ca certificate authority
[certs] Using existing apiserver certificate and key on disk
[certs] Using existing apiserver-kubelet-client certificate and key on disk
[certs] Using existing front-proxy-ca certificate authority
[certs] Using existing front-proxy-client certificate and key on disk
[certs] Using existing etcd/ca certificate authority
[certs] Using existing etcd/server certificate and key on disk
[certs] Using existing etcd/peer certificate and key on disk
[certs] Using existing etcd/healthcheck-client certificate and key on disk
[certs] Using existing apiserver-etcd-client certificate and key on disk
[certs] Using the existing "sa" key

この時点ではまだ kubelet が起動してこない

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
`# kubeadm alpha certs renew all
[renew] Reading configuration from the cluster...
[renew] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[renew] Error reading configuration from the Cluster. Falling back to default configuration

W0728 00:58:18.634587 4408 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
certificate for serving the Kubernetes API renewed
certificate the apiserver uses to access etcd renewed
certificate for the API server to connect to kubelet renewed
certificate embedded in the kubeconfig file for the controller manager to use renewed
certificate for liveness probes to healthcheck etcd renewed
certificate for etcd nodes to communicate with each other renewed
certificate for serving etcd renewed
certificate for the front proxy client renewed
certificate embedded in the kubeconfig file for the scheduler manager to use renewed

これでもダメだった

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# cd /etc/kubernetes/pki
# mv {apiserver.crt,apiserver-etcd-client.key,apiserver-kubelet-client.crt,front-proxy-ca.crt,front-proxy-client.crt,front-proxy-client.key,front-proxy-ca.key,apiserver-kubelet-client.key,apiserver.key,apiserver-etcd-client.crt} ~/k8s_backup_20200728/
# kubeadm init phase certs all --apiserver-advertise-address 192.168.10.190

W0728 01:03:46.960780 4926 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Using existing ca certificate authority
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubemaster kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.10.190]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Using existing etcd/ca certificate authority
[certs] Using existing etcd/server certificate and key on disk
[certs] Using existing etcd/peer certificate and key on disk
[certs] Using existing etcd/healthcheck-client certificate and key on disk
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Using the existing "sa" key

# cd /etc/kubernetes
# mv {admin.conf,controller-manager.conf,kubelet.conf,scheduler.conf} ~/k8s_backup_20200728/
# kubeadm init phase kubeconfig all
W0728 01:05:49.334781 5092 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file

これで kubelet が起動するようになった。大量にエラーを吐いているが起動はするようなので、

ここで一度 reboot を行った

1
2
3
4
5
6
7
8
`# ~/.kube/config を置換
$ sudo cp /etc/kubernetes/admin.conf ~/.kube/config

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.6", GitCommit:"dff82dc0de47299ab66c83c626e08b245ab19037", GitTreeState:"clean", BuildDate:"2020-07-15T16:58:53Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:39:24Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}

Server Version が表示されていればOK!

最後に

  • kubectl を使用する端末の ~/.kube/config を置き換えていってください。
  • kubectl get nodes した結果、既存のノードとの接続は切れていませんでした。
  • kubelet が起動していない間もクラスタの管理ができないだけで、起動済みの Pod は正常に可動していました。
  • 正直、肝を冷やしたので勘弁してほしい。

蛇足

証明書の確認

今回の件と関係ないような気もするが、クラスタ内で使用される証明書の期限を一括表示できる。

誕生日

1
2
3
4
5
6
<code class="language-sh">$  kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubemaster Ready master 365d v1.18.6
kubeworker1 Ready <none> 352d v1.18.5
kubeworker2 Ready <none> 352d v1.18.5
kubeworker3 Ready <none> 350d v1.18.5

とんだ誕生日プレゼントだった

前書き

  • なんとなく Mac 使い続けてきたけど Arm になっちゃって開発マシンとして不適切になりそうだし
  • ちょうど Thinkpad X230 が余ってるし
  • 最近は Windows 機で開発する必要もそんなになくなってきたし…
  • なにより試してみたかったし

ElementaryOS

とりあえず美しい見た目で、mac ぽいのできっと macOS に慣れてる私なら違和感がないだろうということで選びました。

インストールは、インストール用 USB メモリをつくってそれから起動しただけ。

とても簡単です。インストール用 USB メモリの作り方は公式に書いてあるのでその通りで OK。

macOS 上の bananaEtcher を使いましたが dd でもなんでもいけると思います。

やったこと

初回起動時点で Wi-Fi、Bluetooth、サウンドはちゃんと動いているっぽい。

キーボードレイアウトは 日本語。

アップデート

アップデートがあるというのでアップデート。そのまま再起動を要求されたので再起動も。

日本語入力の方法がわからない

ctrl+space で mozc に切り替えて、半角/全角キーで日本語と切替ができる。

mozc に切り替わると、言語バー的なものが表示されるのでそれで判断する。

この最中に、システム設定 → 言語と地域 のキーボードレイアウトらしき所に、

日本語と(空欄)がいたので(空欄)を削除して、ログインしなおしている。(意味があるかは不明)

Vivaldi のインストール

公式サイトからダウンロード。vivaldi-*.deb がダウンロードできるので、

ターミナルから sudo dpkg --install vivaldi-*.deb (めっちゃ tab 補完が効くので活用する)

起動はアプリケーションメニューにあるのでそれを使う。

Jetbrains の開発用アプリケーション

Linux 用はすべて tar.gz 形式で配布されているようなので、これを自分で管理するのはあまりやりたくない。

ということで、Jetbrains toolbox をインストールして、全部 toolbox にお任せすることにした。

トラックポイントの感度調整

デフォルトだと、トラックポイント使用時のカーソル速度が速すぎるので、システム設定で調整した。

マウスとして認識されているので、速度を 3 段階くらい落としたら希望の速度になった。

ホームディレクトリの日本語名をやめる

LANG=C xdg-user-dirs-gtk-update

既に存在しているファイルは移動される。ってでているけれども移動されなかった。

新しくディレクトリが作られていたので、古い日本語名のディレクトリは削除した。

最初に

Electron で Twitter クライアントを開発しているときにハマった所をメモしていきます。

と、メモしていたら Electron がついに Ver 1 に到達しました。 早速アップデートしたので

その際に遭遇したエラーもメモしていきます。

追記:Ver1 に到達したあと、日替わりで Electron 周りのバージョンアップが日替わりリリース状態です。

npm outdated すると古いモジュールを洗い出してくれるので便利です。

環境

Electron 0.37.8 => 1.0.2

Typescript 1.8.0

なので、本文中のコードは全て Typescript です。

本文

BrowserWindow のクッキーを消したい

1
2
<code class="language-ts">var loginWindow:Electron.BrowserWindow = new BrowserWindow({width: 800, height: 600});
loginWindow.webContents.session.clearStorageData({ storages: ["cookies"] }, () => {});

Twitter のアカウントを oauth 認証する際に、クッキーが保存されてしまっていると、ログイン画面を

表示せずにそのまま認証が完了してしまうのでクッキーを消したかった。そもそも論で言えば、別のセッションとして

扱って欲しかったが、うまく動かなかった。なので、仕方なくクッキーを全部消してしまうことにした。

1
<code class="language-ts:動かなかったコード">var loginWindow:Electron.BrowserWindow = new BrowserWindow({width: 800, height: 600, webPreferences: { partition: 'TempSession' } });

ブラウザウィンドウ内で jQuery が使えない

Electron で jQuery が undefined になる http://qiita.com/pirosikick/items/72d11a8578c5c3327069

まさにこの状況。 解決策も上の通り。

1
<code class="language-ts">var loginWindow:Electron.BrowserWindow = new BrowserWindow({width: 800, height: 600, 'node-integration': false }

require(‘electron’).app => undefined

npm install -g electron しているとなった。

electron コマンドは electron-prebuilt をインストールすれば一緒に入っている。

なので、正しいのは npm install -g electron-prebuilt である。

require(‘something’) => undefined になった!

require(‘menu’) => require(‘electron’).Menu
require(‘remote’) => require(‘electron’).remote
remote.require(‘dialog’) => remote.require(‘electron’).dialog

要するに、今まで独立していたモジュールが全て electron  の配下に入ったということのようです。

アプリ内でコピペができない

Mac 限定かもしれないけれども、アプリ内でコピペができない。

メニュー内にカット、コピー、ペーストのメニューとそれぞれのショートカットキーを登録すればできるようになる。

http://electron.atom.io/docs/api/menu/

公式ドキュメント参照

3 行で表すと

ESXi 仮想マシンに、GPU と USB 拡張カードをパススルーして
普通の PC とほぼ変わらない使い勝手の仮想マシンを立ち上げた。
参考にしたサイトのほうが詳しいのでそちらを見るべき(末尾)

レシピ

  • VMware ESXi Hypervisor 6.0U2 (無料。 6.5 は別のトラブルがあり NG6.5 でも可)
  • Radeon HD 7750 (別にこれでなくてもよいが、たぶん、77x0 かリネーム品の R7 2x0 が良い)
  • USB 3.0 拡張カード(これがないと事実上使い物にならない)

1 は無料でダウンロード可能なので省略。

2 は、これ以降の Radeon には初期化周りのバグがあり、運用に工夫が必要らしい。

GeForce はドライバが仮想マシン上で動いてると判断すると止まる(回避方法あり)

#普通に ESXi GPU パススルーでぐぐると書いてくれている人がいるので省略

3 は、仮想マシンの操作をするのに vSphere Client / Web Client のコンソールが使えなくなるため、

かならず必要。ESXi の USB パススルーではキーボード、マウスをパススルーすることができないので

USB コントローラーごとパススルーしてしまえという力業。

やりかた

  • BIOS(UEFI)セットアップで、CPU 内蔵 GPU があれば無効化する。

これ、不要だと思って最初は有効のままで進めたけれど、ダメでした(後述)

今時、VT-d が有効になっていないマザーもないと思いますが、有効であることを確認してください。

AMD 系だと IOMMU とかいうらしいですが、最近 AMD 系触ってないのでわからないです。

  • ESXi をインストール

おもしろいことはないので省略

  • Windows 仮想マシンを普通に作る

おなじく省略。強いて言えば、EFI ブートで作る。Secure Boot はオフにしておく。

  • 仮想マシンに遠隔操作系ソフトを入れる(VNC, MirrorDTC, TeamViewer etcetc)

あとで GPU を追加して、マルチディスプレイ状態になると、コンソールからまともに操作できなくなるので必須。

リモートデスクトップではだめ。必要な設定が変更できない。

  • ESXi 上でデバイスパススルー可能なデバイスに GPU、USB カードを指定

これも問題はないはず。通常、GPU 自体と、Audio Device 的なのがあるはずなので、両方とも指定する。

  • Windows 仮想マシンに GPU、USB カードを割り当て

この時点で、ブルースクリーンが出たりすると悪夢。もうなんというかいろいろ試すしかない。

  • Windows 仮想マシンに、遠隔操作系ソフトで入って、GPU 側のディスプレイのみ表示にする。

この変更にコンソールは使えない。マウスカーソルの動きが変になってしまってまともに操作できない。

Windows10 なら、デスクトップを右クリックして、ディスプレイ設定。

複数のディスプレイ →2 番のモニタのみ に変更。

リモートデスクトップだとこの部分の変更はできませんという表示になる。

  • GPU につないだディスプレイに Windows のデスクトップがでる

USB 拡張カードにつないだキーボード、マウスで操作も可能なはず。おつかれさまでした。

2017/06/09 追記 GeForce 1060(6GB) 動作確認しました。

一応、VM の設定の詳細 → 構成パラメータで hypervisor.cpuid.v0 = FALSE を追加しました。

普通にドライバもインストールでき、再起動等もなんら問題ありません。

これで、TensorFlow も行けますね・・・

(TensorFlow の動作確認しました)

はまったポイント

ESXi 6.5 の Web Client でデバイスパススルー可能にする指定ができない

チェックボックスが無効になっていて、Radeon を指定できない。なぜかできない。

これは、vSphere Client 6.0 の C#クライアントを使って指定すると指定可能。

指定してしまえば、仮想マシンに割り当てるのは Web Client から指定できる。

じゃあ、すべてを vSphere Client からやってしまえば…と思ったけれども、残念ながら

vmx-13 の仮想マシンは vSphere Client から一切変更できませんでした。vmx-11 で作れば…

可能かもしれないです。

-> アップデートをあてると修正されました。

ESXi 6.5 を入れたらデータストアを見失ったというログが不定期に出る

原因不明。SATA が 6 ポートあり、1 つが SSD で datastore1 という構成にしているが、この SSD を

見失ったというエラーが不定期に出て、その間ディスクアクセスが止まる。

ESXi6.0 にしたら治ったというか、発生しなかった。

※追記  (少なくとも)6.5d で上記現象は発生しなくなりました

ちなみに、この状態でも GPU パススルー等は上記手順で普通に動きました。

※追記 たまに引っかかる(数秒フリーズする)症状があった為、以下の手順を適用しました。

内蔵 GPU を生かしたまま、GPU パススルーしようとした

起動時にブルースクリーンが発生するか、起動してもデバイスマネージャ上で!マークがついて

動かない。曰く「POST 時のデバイスと異なるデバイスなので起動できない」

ブルースクリーンは  VIDEO TDR FAILURE。 これで正常に動けば、ESXi の表示は内蔵 GPU で、

Windows の表示は外部 GPU みたいなことができて幸せなんだけれども、とにかくダメでした。

-> ただし、GeForce 時にこれが起きるかは試していません。

USB3.0 拡張カードに補助電源をさし忘れた

これで4時間くらい無駄にしました。さし忘れると、USB2.0 だろうが何だろうが認識しません。

SATA の外部電源だったので平べったくて見逃していました…

仮想マシンにパススルーして検証したので、パススルーに失敗していると思い込んで

全然関係ないところを調べた挙句に、電源ささってない落ちだったという。悲しい。

-> ESXi 関係ないポカミス

ちなみに

普通の仮想マシンなので、GPU を外してしまえば普通に使うことができます。

でも、仮想マシンなのでスナップショットも使用可能!

#起動中に取るのは怖いのでシャットダウンしてからとってますが

追記

  • スリープからの復帰は怪しい(戻ってこれないことがある)ので OFF にして使用しています
  • ディスプレイの電源 OFF からの復帰も同様に戻ってこれないことがあるので OFF(常時 ON)で使用しています
  • Steam Link のような特殊なものは上手く動かないかもしれません

備考

PC の構成は以下の通り

  • マザーボード GIGABYTE Z87X-UD3H (BIOS F9)
  • CPU Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz
  • メモリ 16GB
  • USB3.0 カード エアリア OverFender R (ルネサスチップ) SD-PEU3R-2E2IL
  • Sapphire Radeon HD7750

参考にした(ほぼお手本にしたサイト)

以下のサイトを読めば、この文章いりません。(本音)

ESXi 6.0u1 Haswell + Windows10 で GPU パススルー(基本編)

http://silver0480.blog80.fc2.com/blog-entry-409.html

ESXi 6.0u1 GPU パススルーで VM 再起動できない問題の解決

http://silver0480.blog80.fc2.com/blog-entry-411.html>

前書き

S3 の設定をしようとしたが Minio の場合の設定のノウハウがあまり見つからなかったのでメモしておく

Misskey のバージョンは v11.30.0。v11 の最初の頃は yaml で設定だった記述もあったが、

このバージョンでは Web UI から設定可能となっている。

環境

  • misskey が動作するホストとは別に Minio による S3 ストレージサーバーがある
  • Minio のバケットの設定で *read の権限がある

設定値

URL

外から見える URL。

設定例 https://blob.example.com/mymisskey/

バケット名

Minio バケット名。そのままですね。

このバケットを作ってくれるわけではないので事前に Minio の Web UI 等から作成する必要がある。

プレフィックス

指定したプレフィックスのディレクトリ(表現は正しくないですが)が作成される。

オプションなので空欄でも良い。。 当方の設定は drive。

エンドポイント

Minio にアクセスする為の URL。 http(s)は付けない。(SSL を使用チェックボックスで決まる)

ポート番号を指定することもできる。この記事はこの点をメモするために書いた。

設定例 192.168.1.123:9000

リージョン

Minio であれば空欄で OK

ポート

エンドポイントに使用するポートだと思っていたが違うようだ。

とりあえず、エンドポイントのポート番号を入れてある

アクセスキー/シークレットキー

Minio の起動時に表示されている値をそのまま入れれば良い

これは?

ただのメモです。

WebClient はタイムアウト時間が設定できないのですが

  • 設定する場合は、WebClient を継承する必要がある

そもそも、タイムアウト時間ってダウンロードが始まるまでなのか

ダウンロードが完了するまでなのか気になったのでテストしてみました。

テスト方法

HFS http://www.rejetto.com/hfs/?f=dl

を使って、帯域制御した HTTP サーバーをローカルに立ててテストしました。

結論

WebRequest のタイムアウトは、最初の応答が返るまでのタイムアウトで、

ダウンロード完了までのタイムアウトではありませんでした。

そうじゃないと困るので安心しました。

環境

  • Ubuntu 18.04LTS (CentOS6.5 でも同じ)
  • Metricbeat 6.4

TL;DR

リポジトリから metricbeat をインストールすると、 modules.d / kibana ディレクトリが存在しないので、tarball から設定をコピってこなければ何もデータが飛ばない。

詳細

以下の手順に従って、metricbeat をインストールしても思った通りに動作しない

https://www.elastic.co/guide/en/beats/metricbeat/current/setup-repositories.html

インストールは成功するし、metricbeat 自体は動作するが、データが一切送られない。

原因は、 /etc/metricbeat/modules.d/ 以下が存在しないため。

modules.d 以下にはどのメトリックを送るかの設定ファイルが存在しなければならないが存在しないので何も送信されない。

対応

https://www.elastic.co/downloads/beats

ここから tarball をダウンロードして、展開すると modules.dkibana ディレクトリがあるので、中身ごと、/etc/metricbeat/ 以下にコピーする。

その後、metricbeat を再起動するとメトリックが送信されるようになる。

蛇足

modules.d が入らないのは、もしかすると、あえてこうしているのかもしれません。

バージョンアップの時に conf が上書きされると割と気づきにくい事故になってしまうので、それを避ける狙いなのかも。。

前置き

de:code で聞いた TIPS。念のため自分の所のテスト機を調べたら

主題の通り、Swapoff だったっぽいのでメモ。

細かい話

Azure 上の Linux には必ず、Azure 用エージェントをインストールするように

なっている。

で、その Azure 用エージェントが Linux 起動時に自動的にディスクをマウントしている。

と言うことは起動時にはディスクがないので Swap も設定できない。

(起動時のシーケンスがよく分からんけど、PXE みたいな雰囲気で起動してる?)

というわけで、ディスクをマウントした後であれば、Swap を設定できるものの、

デフォルト値では、Swap はオフになっているので、設定を変更すべき。とのこと。

#スピーカー氏は、NoSwap という漢らしい設定ですが、やめて下さい。

#YesSwap で使ってください。っていうなかなかナイスな表現をしてた。

どうすればいいか

/etc/waagent.conf というファイルがあるのでそこを編集。

以下のような行を確認する。うちの環境では、それぞれ n , 0 と設定されていた。

1
2
3
4
5
<code class="language-apache:/etc/waagent.conf">    # Create and use swapfile on resource disk.
ResourceDisk.EnableSwap=y

# Size of the swapfile.
ResourceDisk.SwapSizeMB=1024

やってみた。

編集前

1
2
3
4
5
6
7
8
9
10
11
`              total        used        free      shared  buff/cache   available
Mem: 1678 343 179 88 1154 1010
Swap: 0 0 0

-------------------
reboot
-------------------

total used free shared buff/cache available
Mem: 1678 205 252 8 1220 1263
Swap: 1023 0 1023

と言うわけで、ちゃんと Swap が確保された。

めでたしめでたし。

2015/07/28 追記

セッション動画が一般公開されたので URL を追記しておきます。

https://channel9.msdn.com/events/de-code/decode-2015/CDP-012

環境

Springboot 1.3.5

Java 8

やりたかったこと

アプリ内の例外を補足してエラー画面に飛ばしたかった。

ハマったこと

参考 URL のスライドを参考にして、ErrorController を実装したところ、GET で例外が発生した

場合は、想定通りエラー処理が行われるが、POST 中に例外が起きるとエラー画面どころか Tomcat のエラー画面

が表示された。

対策

1
2
3
4
5
6
`@RequestMapping(value = PATH)
public String errorGet(HttpServletRequest request, HttpServletResponse response) { 略 }

// これを追加した。
@RequestMapping(value = PATH, method = RequestMethod.POST))
public String errorPost(HttpServletRequest request, HttpServletResponse response) { 略 }

GET の時と、POST の時はそれぞれに対して RequestMapping を書かないと捕捉されない模様。

POST 時は、更新ボタンによる再 POST を防ぐため、エラー画面の URL に redirect させる実装にした。

参考

Spring Boot で Boot した後に作る Web アプリケーション基盤/spring-boot-application-infrastructure // Speaker Deck

https://speakerdeck.com/sinsengumi/spring-boot-application-infrastructure

date: “2019-12-09 13:52:00 +0900”

環境

  • zabbix 4.0 (日本語追加済み)
  • Ubuntu 18.04LTS (ただし OS はほぼ無関係)

何でこの記事を書いたのか

新規に zabbix 4.0 のサーバーを立てたが、アラートが飛ばず、色々と悩みまくったので調査手順をメモしたかった。

調査

調査は以下の順で行います。全て zabbix の画面上から確認できます。

調査順であって、ひとつを解決して再度テストしてもダメであれば、修正の項を上から確認すると良いかもしれません。

調査 1:通知レポート

通知レポートは、通知を誰に、どのような手段で行ったかの記録です。

メニューから、レポート → 通知レポート で参照することができます。

上記の画面は私の環境の実際の表示ですが、上から 4 回は、誰にも通知がされていないことが確認できます。

ここで確認ができない場合、考えられる原因は、

  • 障害発生時のアクションが設定されていない

※ なお、デフォルトでは設定されていません

調査 2:アクションログ

通知レポートに上がったイベントを誰にどの手段で通知したかのログです。

ここにエラーが表示されている場合、マウスオーバーで原因が表示されます。

考えられる要因は、スクリプトのパスがおかしい、ユーザー設定のメディアが指定されていない です。

調査 3: これでもダメなら

ログを見るときが来たかもしれません。

/var/log/zabbix/zabbix-server.log を見て、必要であればデバッグモード等を使うことになるかと思います。

修正

修正 1: 障害発生時のアクションの設定

設定 → アクション で表示される画面です。障害(に限らずですが今回は障害に限って記述します)が発生した時、

何を行うかを設定する画面です。デフォルトでは、 Report problems to Zabbix administrators が登録されていますが

無効になっています。

チェックポイントは、

  • 一番下の 有効 にチェックが入っていること
  • 実行条件欄に実行条件が登録されていること(デフォルトでは登録されていません)

なお、この設定だと全ての障害でアラートが飛ぶように見えますが、実際はユーザーの通知設定で必要な障害レベルを限定できるので問題ありません。

修正 2: 通知メディアの指定

管理 → ユーザー → ユーザーを選択 して、メディア をクリックすることで確認できます。

どの手段で障害を通知して欲しいかという設定です。

有効な時間帯は、 1-7 (毎日), 00:00-24:00 (24 時間) です。

指定した深刻度ののチェックボックスで、どの深刻度の時に通知が欲しいかを制御できます。

ここでメディアがひとつも指定されていないユーザーに通知をしようとした場合、アクションログ画面で、!マークが表示され、通知するメディアが登録されていない旨のエラーが表示されます。

蛇足

以下、蛇足です。

障害を発生させる方法

  • 適当なホストに適当な項目を追加(数字が良いと思います)
  • 上記で追加した項目にトリガーをセット。最新値 = 1 なら障害のような
  • zabbix_sender -s zabbixホスト -z 登録したホスト名 -k 登録したキー -o 1 で障害発生
  • zabbix_sender -s zabbixホスト -z 登録したホスト名 -k 登録したキー -o 0 で障害解除

障害を二度連続で発生させてもアラートが飛ばないので一度解除する必要あります

蛇足 2:設定ミス集

  • zabbix_server.conf の AlertScriptPath の指定が間違っていた
  • AlertScriptPath にスクリプトを置いたが、実行可能にしていなかった
  • 管理 → メディアタイプ でスクリプトを設定したが、スクリプト名が間違っていた
  • 管理 → メディアタイプ でスクリプトを設定したが、パラメタが間違っていた (スクリプトにログ仕込みましょう)
  • メールを飛ばすようにしていたが、ローカルの postfix がエラーを出していた (see /var/log/mail.log)