rbenvを使っている場合のremote-debug-ideの注意点

  • このエントリーをはてなブックマークに追加

Windows10でvscodeを起動し、Remote Development(WSL)で実行しています。
WSL(ubuntu18.04)ではanyenv->rbenvでrubyの環境を構築してあり、アプリケーションはsinatraを利用しています。

普段実行してるコマンドであるbundle exec rackup config.ruをdebug実行するにはbundle exec rdebug-ide --host 0.0.0.0 --port 1234 -- bundle exec rackup config.ruであるが、実行してもNo Such File ErrorかSyntaxErrorが発生します。前者はbundleをフルパスで指定していないから。後者はrbenvのbundleコマンドはruby実装ではなくshell scriptで実装されたラッパーだからである。
現在利用しているbundleコマンドの最終的なパスはrbenv which bundleで取得できるので、以下のように実行するとOKである。

bundle exec rdebug-ide --host 0.0.0.0 --port 1234 -- $(rbenv which bundle) exec rackup config.ru

設定手順一覧

1. VSCodeのRemote Development (WSL)を構築する

ここは本筋とは違うので省略。Remote DevelopmentがONの場合はフッタがこんな感じで表示されます。

2. VSCodeのExtensionをインストールする

Extensionをインストール後はVSCodeの再起動が必要。

3. VSCodeのデバッグ設定の追加

VSCodeのメニューから、デバッグ > 構成の追加 > Ruby > Listen for rdebug-ideを選択。

次のファイルが生成される。

.vscode/launch.json
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [

{
"name": "Listen for rdebug-ide",
"type": "Ruby",
"request": "attach",
"remoteHost": "127.0.0.1",
"remotePort": "1234",
"remoteWorkspaceRoot": "${workspaceRoot}"
}
]
}

RemoteDevelopment先がWSLの場合は、remoteWorkspaceRootを書き換えなくてもOKでした。

4. Gemfileに必要なgemを追加

開発環境の時だけ。

group :development do
gem "ruby-debug-ide"
gem "debase"
end

bundle install

5. 実行

Terminalを立ち上げると、bashが起動するはずなので、次のコマンドを実行。

プログラムの実行
bundle exec rdebug-ide --host 0.0.0.0 --port 1234 -- $(rbenv which bundle) exec rackup config.ru
実行結果
Fast Debugger (ruby-debug-ide 0.7.0, debase 0.2.4.1, file filtering is supported) listens on 0.0.0.0:1234

VSCodeのメニューから、デバッグ > デバッグの開始を実行。次のようにアプリが実行されたログが出れば成功。

アプリ起動ログ
[2020-03-06 14:32:50] INFO  WEBrick 1.4.2
[2020-03-06 14:32:50] INFO ruby 2.6.3 (2019-04-16) [x86_64-linux]
[2020-03-06 14:32:50] INFO WEBrick::HTTPServer#start: pid=31802 port=9292

後は、VSCode上でブレークポイントを設定するなどして、いつものようにデバッグできる。

参考

動かなくなったMovableType4をアップグレードする その1

  • このエントリーをはてなブックマークに追加

XREAのサーバでMovableType4.01を動かしていたのですが、すごい放置をしていたらサーバの更新でPerlのバージョンが上がり、動かなくなってしました。このMovableTypeをアップグレードして、次の対応します。

  • テンプレートを変更し、モバイル対応する
  • HTTPS対応
  • Canonical URLは変わらないようにする (HTTP -> HTTPSはするけど)

無理矢理動くようにする

  • definedの部分のコードを書き換える
  • mt-config.cgiSQLSetNames 1を追加する(文字化けするので)

これで動くようにはなります。
しかしMT4のテンプレートでレスポンシブ対応しているものを見つけるのは大変。元々使っていたテンプレートのサイトも閉鎖されていました。

再現環境を手元に作る / XREAの情報

今動いているXREAのサーバでは次のものが動いています。

  • Apache 2.4
  • Perl 5.16.3
  • MySQL 5.7.27

Perlのdefined関連がおかしいので、Perl5.10よりも前のもので動いていたのだと思います。XreaはSSHできるので、他にも情報を集めます。

/etc/my.cnf
[client]
default-character-set = utf8
[mysqld]
character-set-server = utf8
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8
mysql> show variables like '%chara%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.11 sec)

環境をUbuntu18.04で作る

もっと古いubuntuを使った方が良いのかもしれませんが。

apt update
apt install build-essential mysql-server libmysqlclient-dev perlbrew apache2
perlbrew install --notest perl-5.8.6   # 元の環境
perlbrew install --notest perl-5.16.3 # 今の環境
perlbrew use perl-5.8.6

cpan
> notest install Digest::SHA Devel::CheckLib
> notest install CGI Image::Size File::Spec CGI::Cookie DBI DBD::mysql HTML::Entities LWP::UserAgent XML::Atom MIME::Base64 IO::Compress:Gzip IO::Uncompress:Gunzip Crypt::DSA


perlbrew switch perl-5.16.3

cpan
notest install CGI Image::Size File::Spec CGI::Cookie DBI DBD::mysql HTML::Entities LWP::UserAgent XML::Atom MIME::Base64 IO::Compress:Gzip IO::Uncompress:Gunzip Crypt::DSA

ローカルで適当に動けばいいやレベルの設定。

/etc/apache2/sites-enabled/100-mt.orz.at.conf
<VirtualHost *:80>
ServerName mt.orz.at
DirectoryIndex index.html

ServerAdmin webmaster@localhost
LogLevel info

ErrorLog ${APACHE_LOG_DIR}/error_orz.log
CustomLog ${APACHE_LOG_DIR}/access_orz.log combined

AddHandler cgi-script .cgi .pl
DocumentRoot "/data/mt.orz.at/"
<Directory "/data/mt.orz.at/">
AllowOverride All
Options +ExecCGI
Require all granted
</Directory>
</VirtualHost>

/etc/hosts127.0.0.1 mt.orz.atを追加します。良くない方法だけど、VMの閉じた環境だし手っ取り早く動かしたいので。

XREAのコンソールからMySQLのDumpを取りローカルに持ってきます。

create database mydb default character set utf8;
CREATE USER 'myuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypassword';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';

XREAサーバにあるファイル群をTARで固めてローカルに持ってきます。
mt.cgiのパスをperlbrewのパスに変更します。

これでローカルで動くようになりました。

ひとまずここまで。
MT4からMT7にはアップグレードできないため、次はこれを新しい環境にMT5を経由してMT7まであげます。
その後、それをXREAに持って行くか、XREA上でアップグレード作業をするかのどちらかをします。

リゲッタの靴が素晴らしい

  • このエントリーをはてなブックマークに追加

リゲッタ直営店が自由が丘にあり、そこに靴を買いに行きました。今回は、ちょっとヒールがあるブーツで履きやすいものを探してました。個人的に好きなデザインが多く、気になっていたブランドです。
私の足は左24cm, 右24.3cm、幅が3Eくらいで甲がちょっと高い感じ。このサイズだとレディース、メンズ共になかなか合うサイズが無いのです。

リゲッタ:https://www.regeta.co.jp/brand/index.html

天気が悪かったせいかお客さんがあまり多くない時間に行ったようで、たくさんの靴を試すことが出来ました。このリゲッタの靴、土踏まずが気持ちよく、今まで履いたどの靴よりも履き心地が良いです。しかも、いろんな靴で全部履き心地が微妙に違うのが分かって面白い。

全部履き心地が違うので、全部欲しくなる。

またヒールがある靴であっても、ヒール感はなくフラットな履き心地です。走れます。試しに9cmというパンプスを履かせてもらったのですが、体感は7cmくらいとの事で、しかも普通に走れるくらいの履き心地でした。

実際に履いてみるのが一番。リゲッタの場合、私はメンズよりもレディースの方が足がぴったり合うらしい。
店員さんの接客もとても気持ちよく、こちらの悩みや疑問にも答えてくれて、今度から靴はリゲッタで買おうと思います。

実際購入したのはこちらのCJAL-4102。この色の在庫が無かったので、大阪から送ってもらいました。

さらに、店舗には色が無かったのでネットでCJAW-4305も購入しました。こちらは履き心地の特徴が一番感じられる靴でした。

本当に素晴らしいブランドだと思います。

入院しました

  • このエントリーをはてなブックマークに追加

体調不良が治ったと言ったな。アレは嘘だ。
というのは嘘で、体調不良自体は回復しているのですが、それとは別に腸閉塞で8日間入院しました。

12/17に腹痛がとても激しく朝6時前に目が覚めました。おへその周りの断続的な痛み、刺すような痛みと雑巾を絞っているようなぎゅーっとなる痛みがありました。少しすれば治るかなと思ったのですが、9時過ぎても全然良くならなく、軽い吐き気も出てきました。

近所の病院に行ったらかなり待たされて、結果的に大学病院の紹介状をもらいました。そこは通院している大学病院だったので、そもそも最初から大学病院に行けば良かったという話でもあります。実際、先生になんで最初からこっち来ないのと言われました。

調べてみると、腸閉塞と胃腸炎のダブルパンチで緊急入院になりました。回腸がものすごく膨張していたみたいです。点滴で痛み止めを打ってもらい、1時間くらいしたら痛みは無くなりました。私の既往歴から、腸閉塞に定期的にかかっていること、胃腸炎の頻度がかなり高い(今年だけで4回以上やらかしている)事から、クローン病の疑いがあるとのことで検査をする事になりました。

https://www.min-iren.gr.jp/?p=4165
このページにある検査を全部やりました。ほぼ毎日検査。

絶飲食がなかなかつらい。お水も飲めません。全部で点滴は7.5リットル打ちました。特にやる事も無く、ずっと本を読んだりゲームをしたりしてました。腸閉塞が治った後はずっと検査入院のような感じだったので、外出1回、外泊(大量の荷物受け取り)を1回しました。
結果的にクローン病の疑いはありませんでした。

入院すると、いろんな役割の人が居て、外来をやっていない時間に先生は何をやっているのかが分かって新しい気づきがあり面白かったです。

そうそう、入院中に宝くじをネットで買ったのですが、10万円当たりました🙌

入院費も10万円くらいでした😭

健康を大きく崩したのでその記録 その2 / 原因分かりました

  • このエントリーをはてなブックマークに追加

その後も体調を崩しまくりでした。
毎日体調を崩し、1日の中でも数時間体調不良により吐き気や目眩が止まりませんでした。食事に行っても、ついさっきまでは元気だったのに注文後急に体調を崩して、一切食事が取れなくなる事もありました。
座っていても目がぐるぐるまわる感じで、横になって目を閉じないと吐き気を催してしまう感じで、送別会に行っても途中で寝込んでしまったり。

そこに追い打ちをかけるように、胃腸炎や扁桃炎になる事も多く、QoLはかなり下がり、いくつか病院にも行きました。11月の症状のメモを見るだけでも、胃腸炎、扁桃炎、高熱、倦怠感、下痢、吐き気、冷や汗、耳が遠くなる、目眩 などなど。

自律神経失調症の症状が全部出ていた感じなのですが、ある人に「それ更年期障害と似たような症状だね」と言われ、それがヒントになりました。飲んでいたサプリを全部やめたら12月の上旬には症状が収まり始めました。調べてみると健康被害もそれなりに出ているらしく、完全にコレのせいです。

再現テストは怖くてしていませんが、ひとまず2019年後半から続いていた体調不良の原因が分かりました。

健康を大きく崩したのでその記録

  • このエントリーをはてなブックマークに追加

2019年5月下旬から大きく健康を害しまして、今も完治はしていません。何が起きてどう対処したのか、今後再発した時の自分のためのメモです。

発症まとめ

  • 熱中症を4回ほど起こした。うち1回は救急車。その熱中症と胃腸炎を併発した。
  • 発症した症状
    • 不眠症
    • 食事をすると体調が崩れる
    • 微熱が続き、時々低体温になる
    • 便秘と下痢を繰り返す
    • お腹の気持ち悪さ
    • お腹にガスがたまり、なかなか下の方に降りてこない
    • 呼吸が浅くなる(速くなる)
    • 横になって目を瞑らないと駄目になる
    • 実際に嘔吐はしていないが、吐き気が非常に出る
    • IBS+PD
    • 胆石症の症状

時系列

5/26

  • 渋谷にて熱中症。救急車で運ばれた。
    • 急に気持ち悪くなったというよりも、なんか違和感を感じて、呼吸が浅くなり立ってられなくなった。
    • しばらく様子を見て水分補給をしたが改善せず。
    • 吐き気や手足の痺れが出た。
    • Taxiで家まで帰ろうとしたがTaxiを捕まえるために大きな道まで出られず、救急車を呼んだ。

6/4

会社から知人の家まで移動後、熱中症に。

  • 徒歩20分くらいを移動。
  • 移動後、水を飲んだらお腹に違和感が出てきた。
  • だんだん気持ち悪くなり、熱中症のような感じになった。呼吸が浅くなり、気持ち悪くなった。
  • 吐き気と手足の痺れに加えて、顔の痺れも出た。顔は特に左側。
  • 頭の左後ろがぼあーとする感じがあった。
  • 横になっても目眩がずっと続く。
  • 動くと非常に気持ち悪い。
  • 目を開けてると気持ち悪く、目を瞑ると少し楽なった。
  • 深呼吸をすると気持ち悪くなる。
  • Taxiで家に帰る。病院に連絡はした。
  • 帰宅しても気持ち悪さがとれず。

6/5

  • 4時頃起床
    • 気持ち悪さが続いていた。
    • 食事が全然とれず、ウィダーインゼリーなどで補給。
    • 震えるほど寒かった。
  • 10時頃
    • 気持ち悪さが続く。
    • トイレで排尿と排便(Not下痢)は出た。
  • 胃が荒れている感じがあった。
  • 経口補水液で水分補給。
  • 手に力が入らない。
  • 胃の下(へその下あたり)がむあーとする
  • 12時 熱は36.5~37.1
  • 13時
    • 体温は37.5
    • 下痢気味の便が出る
    • 気持ち悪さ、吐き気に波がある
    • 背中の痛みが出る
    • 横になると目眩が時々発生する
    • 汗が時々噴き出るように出る
  • 病院へ
  • 帰宅しても気持ち悪さが引き続き発生
  • 食事はおにぎりを食べる
  • 22時 まで寝まくる
    • 胃が荒れている感じ
    • 気持ち悪さが無くなる
    • 頭が重い
    • 背中の痛みは続く

6/6

  • 起き上がると気持ち悪い
  • 12時 体温 37.1
  • 14時 体温 37.1 下痢
    • 気持ち悪さ。特に立つと気持ち悪い。胃がムカムカする。
  • 16時 体温 37.1
    • 締め付けられる感じの頭痛が発生する。M字のてっぺんのところ2カ所が非常に痛い
  • 22時 体温 37.1
    • 目を開けていると気持ち悪い

6/7

  • 6:30 起床 体温は平熱で36.4 背中の痛みが軽減
  • 胃に何か食べ物が入ってくるとむあーとしたのが続く
  • 体を動かすと座っていても立ちくらみのような目眩と気持ち悪さが出る
  • みぞおちが痛い
  • 無心になり目を閉じると楽になる

夜は少し調子が良かった

6/8

  • 体温は平熱に戻り、 36.4
  • タール状の便
  • 11時頃 気持ち悪さが出る
  • 13時頃 下痢。体温は37.1。
  • 夜まで微熱が続く

6/9

  • 微熱が続く。
  • 下痢
  • 何か食べると気持ち悪くなるので、ほぼ水分補給のみ

6/10

  • 微熱が続く 体温 37.0
  • この時点で体重が2.5kgほど減少。
  • 健康診断があったのでなんとか外出して受けてくる。

6/14

  • 体調が回復傾向にありAWSのイベントに参加していた
  • 熱中症っぽくなり医務室で2時間ほど横になる
  • なんとか幕張から帰宅して家で横になる

6/18

  • 背中が痛くて目が覚める。胆石症のような症状。

6/20

  • 微熱が出る。お腹が気持ち悪い。便秘

6/21

  • 背中が痛く、微熱が続く。
  • お腹が気持ち悪い。この日は下痢。

6/22

  • 背中の痛みで25時頃目が覚めてしまう
  • お腹が気持ち悪い。排便有り。
  • 微熱が続く。
  • お店の予約があったので渋谷まで移動したが、ふらつきや脱水症状が出てしまった。呼吸が浅くなり気持ち悪くなり、帰宅
  • 体温は35.6
  • 腕とふくらはぎが重い
  • 19:30に体温を測ると37.4

6/23

  • 体が非常にだるく、不眠が続く。夜中の3時頃に目が覚めてしまう。
  • おへその下の不快が続く。
  • 食事をするとおへその上あたりに違和感を感じ、おへその下にぬるま湯が入っている感じの不快感が出る。
  • 吐き気が凄い

6/24

  • 表参道に移動したが、気分が悪くなる。
  • 吐き気、呼吸が浅くなる。
  • 体に力が入らなくなってだるくなる。目を瞑って横になると少し楽になる。
  • 水分補給をするとお腹が不快な感じになる
  • Taxiで大崎の病院へ

過敏性腸症候群(IBS)+パニック症候群(PD)と言われる。

6/25

  • 不眠症になり1時、4時に目が覚める。
  • お腹の不快はお風呂で体を温めることで解消
  • 便秘
  • 夜になると微熱と頭痛が出る

6/26

  • 排便有り
  • お腹が気持ち悪い
  • 移動で気持ち悪くなる
  • 帰宅後気持ち悪くなる
  • 夜 下痢になる

6/27

  • 体がだるいが胃は治った感じがする
  • 下痢が続く
  • 食事がつらいのでコンソメスープ+おにぎり

7/6

  • みぞおちが痛すぎて眠れなくなる

kube-dnsがCrashLoopBackOffで起動しなくなった

  • このエントリーをはてなブックマークに追加

突然いろいろなサービスの名前解決が出来なくなってPODがエラーを吐き始めました。GKEのConsoleで見ていたら、しばらく経つとエラーは無くなりましたがkube-dnsだけCrashLoopBackOffでステータスがDoes not have minimum availabilityと表示されていました。

調べたこと

kube-dnsはnamespaceがkube-systemDeployment,Replica=2として動くように定義されています。

# kubectl -n kube-system get pod | grep kube-system

4/4 Running 0 45m 10.4.0.132 gke-pn-cluster-2-pn-pool-1-efba661f-pz54 <none>
kube-dns-76dbb796c5-9gljt 3/4 CrashLoopBackOff 13 45m 10.4.0.134 gke-pn-cluster-2-pn-pool-1-efba661f-pz54 <none>
kube-dns-autoscaler-67c97c87fb-rj4fq 1/1 Running 0 45m 10.4.0.135 gke-pn-cluster-2-pn-pool-1-efba661f-pz54 <none>

このpodの定義を見ると、4つのcontainerが含まれており、kubedns, dnsmasq, sidecar, prometheus-to-sdがありました。

# kubectl -n kube-system describe pod kube-dns-76dbb796c5-9gljt

Name: kube-dns-76dbb796c5-9gljt
Namespace: kube-system
Priority: 2000000000
PriorityClassName: system-cluster-critical
Node: gke-pn-cluster-2-pn-pool-1-efba661f-pz54/10.146.0.2
Start Time: Sun, 05 May 2019 14:46:19 +0900
Labels: k8s-app=kube-dns
pod-template-hash=3286635271
Annotations: scheduler.alpha.kubernetes.io/critical-pod=
seccomp.security.alpha.kubernetes.io/pod=docker/default
Status: Running
IP: 10.4.0.134
Controlled By: ReplicaSet/kube-dns-76dbb796c5
Containers:
kubedns:
Container ID: docker://2e341ab157aee24b63d95eefb4da434c79306229055d135abf6b730708589d68
Image: k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.13
Image ID: docker-pullable://k8s.gcr.io/k8s-dns-kube-dns-amd64@sha256:618a82fa66cf0c75e4753369a6999032372be7308866fc9afb381789b1e5ad52
Ports: 10053/UDP, 10053/TCP, 10055/TCP
Host Ports: 0/UDP, 0/TCP, 0/TCP
Args:
--domain=cluster.local.
--dns-port=10053
--config-dir=/kube-dns-config
--v=2
State: Running
Started: Sun, 05 May 2019 14:46:42 +0900
Ready: True
Restart Count: 0
Limits:
memory: 170Mi
Requests:
cpu: 100m
memory: 70Mi
Liveness: http-get http://:10054/healthcheck/kubedns delay=60s timeout=5s period=10s #success=1 #failure=5
Readiness: http-get http://:8081/readiness delay=3s timeout=5s period=10s #success=1 #failure=3
Environment:
PROMETHEUS_PORT: 10055
Mounts:
/kube-dns-config from kube-dns-config (rw)
/var/run/secrets/kubernetes.io/serviceaccount from kube-dns-token-jdksn (ro)
dnsmasq:
Container ID: docker://5cc16055a401b91bd15ba6507c9f2b7b4e4b20647496746d978cb211e1a0555d
Image: k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.13
Image ID: docker-pullable://k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64@sha256:45df3e8e0c551bd0c79cdba48ae6677f817971dcbd1eeed7fd1f9a35118410e4
Ports: 53/UDP, 53/TCP
Host Ports: 0/UDP, 0/TCP
Args:
-v=2
-logtostderr
-configDir=/etc/k8s/dns/dnsmasq-nanny
-restartDnsmasq=true
--
-k
--cache-size=1000
--no-negcache
--log-facility=-
--server=/cluster.local/127.0.0.1#10053
--server=/in-addr.arpa/127.0.0.1#10053
--server=/ip6.arpa/127.0.0.1#10053
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: Error
Exit Code: 255
Started: Sun, 05 May 2019 15:28:15 +0900
Finished: Sun, 05 May 2019 15:28:16 +0900
Ready: False
Restart Count: 13
Requests:
cpu: 150m
memory: 20Mi
Liveness: http-get http://:10054/healthcheck/dnsmasq delay=60s timeout=5s period=10s #success=1 #failure=5
Environment: <none>
Mounts:
/etc/k8s/dns/dnsmasq-nanny from kube-dns-config (rw)
/var/run/secrets/kubernetes.io/serviceaccount from kube-dns-token-jdksn (ro)
sidecar:
Container ID: docker://f8c87600c704dd709d27c518d0b3ce20d944608be16f1436442970454715977a
Image: k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.13
Image ID: docker-pullable://k8s.gcr.io/k8s-dns-sidecar-amd64@sha256:cedc8fe2098dffc26d17f64061296b7aa54258a31513b6c52df271a98bb522b3
Port: 10054/TCP
Host Port: 0/TCP
Args:
--v=2
--logtostderr
--probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local,5,SRV
--probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local,5,SRV
State: Running
Started: Sun, 05 May 2019 14:46:50 +0900
Ready: True
Restart Count: 0
Requests:
cpu: 10m
memory: 20Mi
Liveness: http-get http://:10054/metrics delay=60s timeout=5s period=10s #success=1 #failure=5
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-dns-token-jdksn (ro)
prometheus-to-sd:
Container ID: docker://82d84415443253693be30368ed14555ff24ba21844ae607abf990c369008f70e
Image: k8s.gcr.io/prometheus-to-sd:v0.4.2
Image ID: docker-pullable://gcr.io/google-containers/prometheus-to-sd@sha256:aca8ef83a7fae83f1f8583e978dd4d1ff655b9f2ca0a76bda5edce6d8965bdf2
Port: <none>
Host Port: <none>
Command:
/monitor
--source=kubedns:http://localhost:10054?whitelisted=probe_kubedns_latency_ms,probe_kubedns_errors,dnsmasq_misses,dnsmasq_hits
--stackdriver-prefix=container.googleapis.com/internal/addons
--api-override=https://monitoring.googleapis.com/
--pod-id=$(POD_NAME)
--namespace-id=$(POD_NAMESPACE)
--v=2
State: Running
Started: Sun, 05 May 2019 14:46:51 +0900
Ready: True
Restart Count: 0
Environment:
POD_NAME: kube-dns-76dbb796c5-9gljt (v1:metadata.name)
POD_NAMESPACE: kube-system (v1:metadata.namespace)
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-dns-token-jdksn (ro)
Conditions:
Type Status
Initialized True
Ready False
PodScheduled True
Volumes:
kube-dns-config:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: kube-dns
Optional: true
kube-dns-token-jdksn:
Type: Secret (a volume populated by a Secret)
SecretName: kube-dns-token-jdksn
Optional: false
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: CriticalAddonsOnly
node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 46m default-scheduler Successfully assigned kube-system/kube-dns-76dbb796c5-9gljt to gke-pn-cluster-2-pn-pool-1-efba661f-pz54
Normal SuccessfulMountVolume 46m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 MountVolume.SetUp succeeded for volume "kube-dns-config"
Normal SuccessfulMountVolume 46m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 MountVolume.SetUp succeeded for volume "kube-dns-token-jdksn"
Normal Pulling 46m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 pulling image "k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.13"
Normal Pulled 46m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Successfully pulled image "k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.13"
Normal Created 46m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Created container
Normal Started 46m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Started container
Normal Pulling 46m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 pulling image "k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.13"
Normal Pulled 46m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Successfully pulled image "k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.13"
Normal Pulling 46m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 pulling image "k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.13"
Normal Created 45m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Created container
Normal Pulled 45m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Successfully pulled image "k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.13"
Normal Pulling 45m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 pulling image "k8s.gcr.io/prometheus-to-sd:v0.4.2"
Normal Started 45m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Started container
Normal Created 45m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Created container
Normal Started 45m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Started container
Normal Pulled 45m kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Successfully pulled image "k8s.gcr.io/prometheus-to-sd:v0.4.2"
Normal Created 45m (x2 over 46m) kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Created container
Normal Started 45m (x2 over 46m) kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Started container
Normal Pulled 45m (x2 over 45m) kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Container image "k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.13" already present on machine
Warning BackOff 1m (x211 over 45m) kubelet, gke-pn-cluster-2-pn-pool-1-efba661f-pz54 Back-off restarting failed container

Logを見ますが、普通に起動できている(ように見えてました)。

# kubectl -n kube-system logs kube-dns-76dbb796c5-9gljt -c kubedns

I0505 05:46:42.318712 1 dns.go:48] version: 1.14.13
I0505 05:46:42.322157 1 server.go:69] Using configuration read from directory: /kube-dns-config with period 10s
I0505 05:46:42.322453 1 server.go:121] FLAG: --alsologtostderr="false"
I0505 05:46:42.322508 1 server.go:121] FLAG: --config-dir="/kube-dns-config"
I0505 05:46:42.322517 1 server.go:121] FLAG: --config-map=""
I0505 05:46:42.322636 1 server.go:121] FLAG: --config-map-namespace="kube-system"
I0505 05:46:42.322718 1 server.go:121] FLAG: --config-period="10s"
I0505 05:46:42.322739 1 server.go:121] FLAG: --dns-bind-address="0.0.0.0"
I0505 05:46:42.322746 1 server.go:121] FLAG: --dns-port="10053"
I0505 05:46:42.322756 1 server.go:121] FLAG: --domain="cluster.local."
I0505 05:46:42.322856 1 server.go:121] FLAG: --federations=""
I0505 05:46:42.322878 1 server.go:121] FLAG: --healthz-port="8081"
I0505 05:46:42.322886 1 server.go:121] FLAG: --initial-sync-timeout="1m0s"
I0505 05:46:42.322895 1 server.go:121] FLAG: --kube-master-url=""
I0505 05:46:42.322983 1 server.go:121] FLAG: --kubecfg-file=""
I0505 05:46:42.323003 1 server.go:121] FLAG: --log-backtrace-at=":0"
I0505 05:46:42.323016 1 server.go:121] FLAG: --log-dir=""
I0505 05:46:42.323099 1 server.go:121] FLAG: --log-flush-frequency="5s"
I0505 05:46:42.323117 1 server.go:121] FLAG: --logtostderr="true"
I0505 05:46:42.323123 1 server.go:121] FLAG: --nameservers=""
I0505 05:46:42.323129 1 server.go:121] FLAG: --stderrthreshold="2"
I0505 05:46:42.323137 1 server.go:121] FLAG: --v="2"
I0505 05:46:42.323144 1 server.go:121] FLAG: --version="false"
I0505 05:46:42.323253 1 server.go:121] FLAG: --vmodule=""
I0505 05:46:42.323511 1 server.go:169] Starting SkyDNS server (0.0.0.0:10053)
I0505 05:46:42.331087 1 server.go:179] Skydns metrics enabled (/metrics:10055)
I0505 05:46:42.331168 1 dns.go:188] Starting endpointsController
I0505 05:46:42.331375 1 dns.go:191] Starting serviceController
I0505 05:46:42.331754 1 dns.go:184] Configuration updated: {TypeMeta:{Kind: APIVersion:} Federations:map[] StubDomains:map[] UpstreamNameservers:[]}
I0505 05:46:42.335926 1 logs.go:41] skydns: ready for queries on cluster.local. for tcp://0.0.0.0:10053 [rcache 0]
I0505 05:46:42.337525 1 logs.go:41] skydns: ready for queries on cluster.local. for udp://0.0.0.0:10053 [rcache 0]
I0505 05:46:42.835211 1 dns.go:222] Initialized services and endpoints from apiserver
I0505 05:46:42.835268 1 server.go:137] Setting up Healthz Handler (/readiness)
I0505 05:46:42.835298 1 server.go:142] Setting up cache handler (/cache)
I0505 05:46:42.835317 1 server.go:128] Status HTTP port 8081

Containerに入って、色々と確認してみます。
Livenessを手動で確認するという事をしてみます。curlがインストールされていないImageだったのでwgetを使っています。すると、dnsmasqのエラーが出てきました。

# kubectl exec -n kube-system -c kubedns -it kube-dns-76dbb796c5-9gljt sh

wget -O - http://localhost:10054/healthcheck/dnsmasq
Connecting to localhost:10054 (127.0.0.1:10054)
wget: server returned error: HTTP/1.1 503 Service Unavailable

dnsmasqにはLoginできないのでこっちがこけているっぽい。

kubectl exec -n kube-system -c dnsmasq -it kube-dns-76dbb796c5-9gljt sh
# kubectl -n kube-system logs kube-dns-76dbb796c5-9gljt -c dnsmasq

I0505 06:38:30.432185 1 main.go:74] opts: {{/usr/sbin/dnsmasq [-k --cache-size=1000 --no-negcache --log-facility=- --server=/cluster.local/127.0.0.1#10053 --server=/in-addr.arpa/127.0.0.1#10053 --server=/ip6.arpa/127.0.0.1#10053] true} /etc/k8s/dns/dnsmasq-nanny 10000000000}
I0505 06:38:30.432498 1 nanny.go:94] Starting dnsmasq [-k --cache-size=1000 --no-negcache --log-facility=- --server=/cluster.local/127.0.0.1#10053 --server=/in-addr.arpa/127.0.0.1#10053 --server=/ip6.arpa/127.0.0.1#10053]
I0505 06:38:30.992206 1 nanny.go:119]
W0505 06:38:30.992278 1 nanny.go:120] Got EOF from stdout
I0505 06:38:30.992242 1 nanny.go:116]
I0505 06:38:30.992337 1 nanny.go:116] dnsmasq: failed to create inotify: No file descriptors available
I0505 06:38:30.992385 1 nanny.go:123]
E0505 06:38:30.992407 1 nanny.go:124] Error reading from stderr: read |0: file already closed
F0505 06:38:30.992583 1 nanny.go:190] dnsmasq exited: exit status 5

dnsmasq: failed to create inotify: No file descriptors available とても怪しい。

# cat /proc/sys/fs/inotify/max_user_instances
128
# cat /proc/sys/fs/inotify/max_user_watches
8192

nodeが2つ(GCEのVMが2つ)あって、VMのログなどを見ると1つのVMで以下のログを発見。

sudo journalctl -f
Failed to get journal fd: Too many open files

YAMLの定義を抜き出してきて、直接VM上で起動してみると起動できるVMとできないVMがあり、できないVMではjournallogに上記のログが出ていました。

docker run -it --rm k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.13 \
-v=2 \
-logtostderr \
-configDir=/etc/k8s/dns/dnsmasq-nanny \
-restartDnsmasq=true \
-- \
-k \
--cache-size=1000 \
--no-negcache \
--log-facility=- \
--server=/cluster.local/127.0.0.1#10053 \
--server=/in-addr.arpa/127.0.0.1#10053 \
--server=/ip6.arpa/127.0.0.1#10053 \

対策

NodePoolを作ってそっちに全部移動させるか、NodePoolのNode数を増やしてdrainさせるか等を考えました。今回はVMで消費しているFDを見て、怪しいプロセスを消したり再起動したりする事にしました。
もう使っていないPODを消したり、ResourceLeakしてそうなPodを再起動したり。

これを行ったら、なんとか復旧しました。

その他メモ

GKEでNodePoolを作るときにubuntuではなくCOSにしていましたが、lsofが使えませんでした。toolkitを使ってapt-get update && apt-get install lsofで使えるようになりました。

ref: https://cloud.google.com/container-optimized-os/docs/how-to/toolbox

参考

NTPDがSyncできなかった理由

  • このエントリーをはてなブックマークに追加

とあるサーバのNTPDの同期ができていなかったので調べたメモ。

ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
169.254.169.123 .INIT. 16 u - 1024 0 0.000 0.000 0.000

*が付いていないしreachも0なので同期できていない。

ntpdcで該当NTPサーバとの通信の状況を見てみる。サーバはAWSのTimeServerを利用しています。

# ntpdc -c 'showpeer 169.254.169.123'
remote 169.254.169.123, local 10.0.103.31
hmode client, pmode unspec, stratum 16, precision -22
leap 11, refid [73.78.73.84], rootdistance 0.00000, rootdispersion 0.00000
ppoll 10, hpoll 10, keyid 0, version 4, association 35382
reach 000, unreach 213, flash 0x1600, boffset 0.00000, ttl/mode 0
timer 0s, flags config, bclient, prefer
reference time: 00000000.00000000 Mon, Jan 1 1900 0:00:00.000
originate timestamp: e0754e65.00000000 Thu, May 2 2019 11:09:25.000
receive timestamp: 00000000.00000000 Mon, Jan 1 1900 0:00:00.000
transmit timestamp: 00000000.00000000 Mon, Jan 1 1900 0:00:00.000
filter delay: 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000
filter offset: 0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000
filter order: 0 1 2 3
4 5 6 7
offset 0.000000, delay 0.00000, error bound 3.99217, filter error 0.00000

unreach 213, flash 0x1600 unreachのカウンタが増えていますし、flashの値にも何か記録されています。

ntp.hの定義を見ると、次のようになっています。0x1600ということはTEST10|TEST11|TEST13ということ?

ntp.h
#define TEST10          0x0200  /* peer bad synch or stratum */
#define TEST11 0x0400 /* peer distance exceeded */
#define TEST12 0x0800 /* peer synchronization loop */
#define TEST13 0x1000 /* peer unreacable */

NICが2枚刺さっているサーバらしい

eth0が10.0.103.31, eth1が10.0.100.111でeth1がDEFROUTE=1
ntpdがlistenしているのはeth0のみ。

netstat -tulpn | grep :123
udp 0 0 10.0.103.31:123 0.0.0.0:* 2995/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 2995/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 2995/ntpd

設定ファイルを見ると、listenはeth0のみ。なのでここにinterface listen eth1を追加してntpdを再起動しました。

/etc/ntp.conf
interface listen eth0
interface ignore ipv6

結果、同期されるようになりました。

疑問点

NICは同じネットワークアドレスを持っている。そして、ip routerouteを見ると、eth1のFlags=Gが2つあるのがすごい怪しい。

route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.100.1 0.0.0.0 UG 0 0 0 eth1
0.0.0.0 10.0.100.1 0.0.0.0 UG 10001 0 0 eth1
10.0.100.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
10.0.100.0 0.0.0.0 255.255.252.0 U 0 0 0 eth1
169.254.169.254 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0

どういう設定をしたサーバなのか調査する時間がないので、ここまで。

参考

Javaで複数のRange検索を比較的高速に行うコード

  • このエントリーをはてなブックマークに追加

複数のCIDR形式で記されたネットワークに該当するか、複数の定義された時間帯に現時刻が該当するか、などなどRange検索をしたい事がそれなりにあります。

単純なRange検索であれば、from <= v && v <= toのような単純なコードで判定できますが、Rangeの定義が複数ある場合、愚直に実装するとO(N)になります。それはとても嫌なのでO(log N)で判定できるようにします。全部自前で書いてやろうと思ったのですが、ライブラリに任せることにしました。

Guavaのコードを見ると、追加するたびにRangeをMergeするという方法を取っていました。あるクエリにHitする定義はどれだみたいな事は出来ないのですが、今回は含まれるか(contains)を判定できれば良いので妥協します。

実際のコード その1

ライブラリはデータ構造としてguavaRangeSet、CIDRの扱いとしてcommons-netSubnetUtilsを使います。コードの記述を減らすためにLombok、JSONの処理にはgsonを使いました。

pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>at.orz</groupId>
<artifactId>sample-range-checker</artifactId>
<version>1.0.0-SNAPSHOT</version>

<name>sample-range-checker</name>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.1-jre</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
App.java
public class App {

@Data
public static class AWSIpRanges implements Serializable {
private String syncToken;
private String createDate;
private List<IPv4Prefix> prefixes;
private List<IPv6Prefix> ipv6Prefixes;
@Data
public static class IPv4Prefix implements Serializable {
private String ipPrefix;
private String region;
private String service;
}
@Data
public static class IPv6Prefix implements Serializable {
private String ipv6Prefix;
private String region;
private String service;
}
}

public static class ImmutableIntRangeChecker {
@Delegate
private final ImmutableRangeSet<Integer> rangeSet;
public ImmutableIntRangeChecker(List<Range<Integer>> ranges) {
this.rangeSet = ImmutableRangeSet.unionOf(ranges);
}
public boolean isIPAddrContains(String ipAddr) {
int query = InetAddresses.coerceToInteger(InetAddresses.forString(ipAddr));
return rangeSet.contains(query);
}
}

public static void main(String[] args) throws IOException, InterruptedException {

URI awsIpRangesURI = URI.create("https://ip-ranges.amazonaws.com/ip-ranges.json");

// get aws-ip json file
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(awsIpRangesURI).build();
String json = client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)).body();

// parse json
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
AWSIpRanges ipRanges = gson.fromJson(json, AWSIpRanges.class);

List<Range<Integer>> ranges = ipRanges.getPrefixes().stream()
.map(AWSIpRanges.IPv4Prefix::getIpPrefix) // List<IP-String>にする
.map(ip -> ip.contains("/") ? ip : ip + "/32") // SubnetUtilsでエラーにならないように
.map(ip -> {
// CIDR形式をパースし、ネットワークアドレスの範囲を求め、そのIPアドレスを32ビット変数に変換
SubnetUtils subnet = new SubnetUtils(ip);
subnet.setInclusiveHostCount(true);
SubnetUtils.SubnetInfo info = subnet.getInfo();
return Range.closed(info.asInteger(info.getLowAddress()), info.asInteger(info.getHighAddress()));
})
.collect(Collectors.toList());

ImmutableIntRangeChecker checker = new ImmutableIntRangeChecker(ranges);
System.out.println(checker.isIPAddrContains("35.172.155.127")); // -> true
System.out.println(checker.isIPAddrContains("8.8.8.8")); // -> false

}
}

実際のコード その2

Intで扱わない場合です。RangeクラスはComparatorの実装を要求しますがInetAddrクラスは実装していないので、ラッパークラスを作成します。

またCheckerクラスを汎用的に実装し、FunctionクラスによってKeyの変換も定義します。今回はStringからComparableInetAddrに変換する関数を定義します。

App2.java

public static class ComparableInetAddr implements Serializable, Comparable<ComparableInetAddr> {
@Delegate
private final InetAddress inetAddress;
private final int intIP;
private ComparableInetAddr(InetAddress inetAddress) {
this.inetAddress = inetAddress;
this.intIP = InetAddresses.coerceToInteger(inetAddress);
}
public ComparableInetAddr(String ipAddr) {
this(InetAddresses.forString(ipAddr));
}
@Override
public int compareTo(ComparableInetAddr o) {
return Integer.compare(this.intIP, o.intIP);
}
}

public static class ImmutableRangeChecker<T, C extends Comparable> {
@Delegate
private final ImmutableRangeSet<C> rangeSet;
private final Function<T, C> queryTransformer;
public ImmutableRangeChecker(List<Range<C>> ranges, Function<T, C> queryTransformer) {
this.rangeSet = ImmutableRangeSet.unionOf(ranges);
this.queryTransformer = queryTransformer;
}
public boolean contains(T value) {
C query = queryTransformer.apply(value);
return rangeSet.contains(query);
}
}

差分のコードだけ。ComparableIntAddrをRangeクラスに入れるようにした

List<Range<ComparableInetAddr>> ranges = ipRanges.getPrefixes().stream()
.map(AWSIpRanges.IPv4Prefix::getIpPrefix)
.map(ip -> ip.contains("/") ? ip : ip + "/32")
.map(ip -> {
SubnetUtils subnet = new SubnetUtils(ip);
subnet.setInclusiveHostCount(true);
SubnetUtils.SubnetInfo info = subnet.getInfo();
// ここを変更した
return Range.closed(new ComparableInetAddr(info.getLowAddress()), new ComparableInetAddr(info.getHighAddress()));
})
.collect(Collectors.toList());

ImmutableRangeChecker<String, ComparableInetAddr> checker =
new ImmutableRangeChecker<>(
ranges,
ipString -> new ComparableInetAddr(InetAddresses.forString(ipString)));

System.out.println(checker.contains("35.172.155.127")); // false
System.out.println(checker.contains("8.8.8.8")); // true

時間の範囲を判定する場合

例えば、1日のうちの10時から12時と14時から16時。とか。1週間のうちの月曜日の午前中と火曜日の午前中とか。前者の場合は0から86400の整数として扱えば良いし、後者は月曜始まりの0時を0とした整数として扱うとかすれば良いと思います。

もしくは上記のコードでComparableが実装されているDate系のクラスを使えば良いと思います。

その他

今回はImmutableRangeSetを使いましたが、他にもTreeRangeSetの実装があります。こっちはInstanceを生成後にRangeを追加することができます。個人的にはIntegerではなくPrimitiveのintで扱いたいです。

RangeがMergeされるのを確認したコード

@Test
public void rangeSample1() {
ImmutableList<Range<Integer>> x = ImmutableList.of(Range.open(1, 100), Range.open(200, 300)).asList();
TreeRangeSet<Integer> im = TreeRangeSet.create();
im.addAll(x);
im.add(Range.open(50, 250));
System.out.println(im); // [(1..300)]
}
@Test
public void rangeSample2() {
ImmutableList<Range<Integer>> x = ImmutableList.of(Range.closed(1, 100), Range.closed(200, 300)).asList();
TreeRangeSet<Integer> im = TreeRangeSet.create();
im.addAll(x);
im.add(Range.open(50, 150)); // [[1..150), [200..300]]
System.out.println(im);
}

参考

CIDRに限ってしまえばもっと高速にできるみたいです。

AWSで特定のサーバの時刻が急激にずれていく

  • このエントリーをはてなブックマークに追加

NTPDの設定をしているにも関わらず、急激に時間がずれていった時の話。

ntpqで確認したらoffsetが大きくずれていたが、**dateでみると時間はずれていなかった。**正確には私が見る前に時間が大きくずれていたので1回ntpdateをして時間を合わせたのだが、offsetはそのままでまた時間がすごい勢いでずれていくという現象が発生しました。

ntpqで状態を確認。

ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*169.254.169.123 10.66.1.54 3 u 47 64 377 0.098 531.046 12.220

driftファイル(/var/lib/ntp/drift)を見ると、ほかのサーバは-0.403,0.013,-0.090といった小さい数字(正しくは0に近い値)なのに対して、このサーバは-499.822と極端に大きな値(0から大きくかけ離れた値)が記載されていた。

解決方法

  1. ntpd stop
  2. driftファイルを削除(実際にはmove)
  3. ntpdate -b (大きくずれていたのでslewモードではなくstepモードで一気に設定)
  4. ntpd start

これはVMのImage(AMI)を作るときには削除しておくのが良いファイルの1つです。

この操作によって大きく時間がずれていくことがなくなりました。

ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*169.254.169.123 10.66.1.54 3 u 23 256 377 0.117 0.890 1.268

参考