Empowered by expect

希望は体力

ギブアップしたLTネタを供養するエントリー

近日LTでの発表を予定していたのですが、都合により無理っぽくなったので話す予定だった内容を図やコード無しの台詞だけ書いて供養しておきます。
予定変更によりご迷惑をおかけする関係のみなさまには深くお詫びいたします。

その1 グラフを印刷したい
Prometheusで採ったメトリクスデータはGrafanaで見てる人が多いと思いますが
・折れ線グラフを見てるだけで仕事してる気になっていけない
・CI環境とかでなければ安定してくると見所が減る
・SIヤーにとってはWebでダークテーマでインタラクティブにグラフが見られることよりも印刷して月次報告書としてご提出したい
・月次 > 15日 ということで保管期間もそれなりに必要
ということでInfluxDBとかも使っているのですが、研究やってたころのツールでもがいてみました。

Prometheus --remote storage -> postgresql(仮受け) -> NetCDFファイル <- GMTで折れ線グラフ画像作成
GMT: http://gmt.soest.hawaii.edu/

長期時系列データということで(位置情報は無いのですが)NetCDFに突っ込んでみました。そこの仕組みが現段階では非常にnot secureなのでイケナイのですが。
まだ数ヶ月しか動いてませんが、バッチで画像書くには問題無く動いています。
InfluxDBとかPostgreSQLとかで充分事足りている気もしますけど、ね。


その2 グラフから目で読み取るのか
その1で挙げた4つの課題を言うと「普段から折れ線グラフを眺めて通常時の値や定期変動を把握しておくべきだ」と言ってくる人がいます。
ベースラインの値や周期変動って数式で表せるべきじゃないですか?目のフィーリングではなくて。
私くらいになると目で数式書けますけどね。
(ここでデモ。Grafana じゃん、と突っ込まれる)

https://hastic.io/

去年の Monitorama AMD で LT されていたツールですが、見た目に分かりやすいのがいいです。
Hastic に検出させてから、GMTでデータプロットと数式線を重ねて描画すると分かりやすかったり。
最近 Beta になったばかりでまだいろいろとありますが期待のツールです。
hastic-server がそれなりにメモリを必要とするのがお試しにはネックになるかもです。


重ね重ね、ご迷惑おかけする方面の皆様すみません。
時間が足りないーー

sash -stand alone shell

年も明けて、基盤対応等々で今年は使うツールがだいぶ変わっていきそうな予感がしています。ということで現状使っているツールたちを整理がてら紹介しておこうと思います。

最初はsashです。
15年ほど前、「なぜか /usr/bin 以下のバイナリがいくつか消えた」というサーバーの対応をすることが何度かあり(おそらくパイプかfindかで間違った操作が行われたと思われます)、その時から自分が構築するサーバーには保険のためにsashを導入しています。
sashはstand alone shellの名の通り、基本コマンドを組み込みコマンドとして持つので緊急時の作業に役立ちます。

http://members.tip.net.au/~dbell/

More importantly, however, is that many of the standard system commands are built-in to sash. These built-in commands
are:

-ar, -chattr, -chgrp, -chmod, -chown, -chroot, -cmp,
-cp, -dd, -echo, -ed, -grep, -file, -find, -gunzip,
-gzip, -kill, -losetup, -ln, -ls, -lsattr, -mkdir,
-mknod, -more, -mount, -mv, -pivot_root, -printenv, -pwd,
-rm, -rmdir, -sum, -sync, -tar, -touch, -umount, -where
(manより抜粋)

Ubuntuならばuniverseにパッケージがあるのでaptで導入できます。
CentOSの場合はソースからの導入になります。
組み込みコマンドとするために、いくつかライブラリの -static パッケージが必要になります。(RHELの場合は optional-rpms のレポジトリを有効化する必要があります)
以下にitamaeレシピで導入手順を載せておきます。

package "zlib-static" do
  action :install
end

package "glibc-static" do
  action :install
end

package "e2fsprogs-devel" do
  action :install
end

directory "/usr/man/man1"

[
  "wget http://members.tip.net.au/~dbell/programs/sash-3.8.tar.gz",
  "tar xf sash-3.8.tar.gz",
  "cd /opt/local/src/sash-3.8 && make && make install",
].each do |command|
  execute command do
    cwd "/opt/local/src"
  end
end

とはいえ、その後は幸いsashに救われるような危機は経験していません。
そもそも今どきの環境であればロールバックしたり再デプロイしたり、OSのシステム部分が壊れた場合でも力業で直す以外の方法があるだろうとも思います。
そろそろ sash 保険から脱出できるでしょうか...

Pharos 2.0を試す -とっかかり

Kubernetes ディストリビューションである Kontena Pharos のバージョン2.0がリリースされました。
ひとまずセットアップに挑んでみます。

公式ドキュメントはこちら。
https://pharos.sh/docs/install.html

(1) Kontena アカウントを持っていない人は先に作成しておきます。
https://account.kontena.io/signup

(2) 手元のマシンないしデプロイサーバーで、以下のコマンドを実施します。

# curl -s https://get.pharos.sh | bash

(3) Pharos(kubernetes)をインストールするサーバにアカウントを作成し、sudoersに登録します。
手元のマシンからssh-copyidを行いパスワード入力無しで ssh ログインできるようにしておきます。

(4) 手元のマシンにツールを導入します。

$ source /usr/local/share/chpharos/chpharos.sh
$ chpharos --version
chpharos 0.4.0
$ chpharos login
Log in using your Kontena Account credentials
Visit https://account.kontena.io/ to register a new account.

Username: (kontena account名)
Password: (kontena accountのパスワード)
Logged in
$ chpharos install latest
Downloading 'pharos-cluster' (23768560 bytes) from https://get.pharos.sh/versions/download/pharos-cluster-linux-amd64-2.0.0+oss ..
######################################################################## 100.0%
Verifying download SHA256 checksum.. OK
Downloading 'kubectl' (55422633 bytes) from https://storage.googleapis.com/kubernetes-release/release/v1.11.4/bin/linux/amd64/kubectl ..
######################################################################## 100.0%
Verifying download SHA256 checksum.. OK
Downloading 'pharos_license' (869 bytes) from https://raw.githubusercontent.com/kontena/pharos-cluster/v2.0.0/LICENSE ..
######################################################################## 100.0%
Verifying download SHA256 checksum.. OK
Downloading 'kubectl_license' (11358 bytes) from https://raw.githubusercontent.com/kubernetes/kubernetes/v1.11.4/LICENSE ..
######################################################################## 100.0%
Verifying download SHA256 checksum.. OK
Installed version 2.0.0+oss. To set as current, use: chpharos use 2.0.0+oss
The following license files were downloaded, by continuing to use the tools, you agree to the terms:
  /home/sysop/.pharos/chpharos/versions/2.0.0+oss/pharos_license
  /home/sysop/.pharos/chpharos/versions/2.0.0+oss/kubectl_license
$ chpharos list
2.0.0+oss
$ chpharos use 2.0.0+oss
using pharos version 2.0.0+oss
$ chpharos current
2.0.0+oss (set via chpharos use command)
$ pharos --version
pharos-cluster 2.0.0+oss

(5) 手元のマシンで cluster.yml を作成します。ここでは最小構成で(pluginを欲張ってますが)。

hosts:
  - address: "10.0.0.hoe"
    user: kontenaadmin   (インストール先サーバで作成&sudoers登録したアカウント) 
    role: master
network:
  provider: weave
addons:
  ingress-nginx:
     enabled: true
  openebs:
     enabled: true
  host-upgrades:
     enabled: true
     schedule: "0 6 * * *"
     schedule_window: 1h
     reboot: true

(6) 手元のマシンで以下コマンドを実施します。

$ pharos up -c cluster.yml
==> KONTENA PHAROS v2.0.0+oss (Kubernetes v1.11.4)
==> Reading instructions ...
==> Sharpening tools ...
==> Check for Pharos upgrade @ localhost
    [localhost] Checking for a new version ...
==> Gather host facts @ 10.0.0.hoge
    [10.0.0.hoge] Checking sudo access ...
    [10.0.0.hoge] Gathering host facts ...
==> Configure kube client @ foo-bar
==> Validate hosts @ foo-bar
    [foo-bar] Validating current role matches ...
    [foo-bar] Validating distro and version ...
    [foo-bar] Validating host configuration ...
    [foo-bar] Validating hostname uniqueness ...
    [foo-bar] Validating host routes ...
    [foo-bar] Validating localhost dns resolve ...
    [foo-bar] Validating peer address ...
==> Validate cluster version @ foo-bar
==> Using following software versions:
    cfssl: 1.2
    docker: 1.13.1
    etcd: 3.2.18
    kubernetes: 1.11.4
    metrics-server: 0.2.1
    weave-net: 2.4.1
==> Using following addons:
    ingress-nginx: 0.17.1
    openebs: 0.5.3
    host-upgrades: 0.3.0
==> Configuration is generated and shown below:
---
hosts:
- address: 10.0.0.hoge
  private_address:
  private_interface:
  role: master
  user: sysop
  container_runtime: docker
network:
  provider: weave
  service_cidr: 10.96.0.0/12
  pod_network_cidr: 10.32.0.0/12
kube_proxy:
  mode: iptables
api: {}
authentication: {}
audit:
  file:
    path: "/var/log/kubernetes/audit.json"
    max_age: 30
    max_backups: 20
    max_size: 100
kubelet:
  read_only_port: false
telemetry:
  enabled: true
pod_security_policy:
  default_policy: 00-pharos-privileged
image_repository: registry.pharos.sh/kontenapharos
addon_paths: []
addons:
  ingress-nginx:
    enabled: true
  openebs:
    enabled: true
  host-upgrades:
    enabled: true
    schedule: 0 6 * * *
    schedule_window: 1h
    reboot: true
container_runtime:
  insecure_registries: []

Continue?     (インストール概要が表示された後ここで確認が入るので Y を回答して Enter で決定します)

Continue? Yes
==> Starting to craft cluster ...
==> Migrate master @ foo-bar
==> Configure hosts @ foo-bar
    [foo-bar] Configuring script helpers ...
    [foo-bar] Configuring essential packages ...
    [foo-bar] Configuring package repositories ...
    [foo-bar] Configuring netfilter ...
    [foo-bar] Configuring container runtime (docker) packages ...
==> Configure kube client @ foo-bar
==> Configure cfssl @ foo-bar
    [foo-bar] Installing cfssl ...
==> Configure etcd certificate authority @ foo-bar
    [foo-bar] Configuring etcd certificate authority ...
    [foo-bar] Caching certificate authority files to memory ...
==> Configure etcd member changes @ foo-bar
==> Configure etcd @ foo-bar
    [foo-bar] Configuring etcd certs ...
    [foo-bar] Configuring etcd ...
    [foo-bar] Waiting for etcd to respond ...
==> Configure secrets encryption @ foo-bar
    [foo-bar] Generating new encryption keys ...
    [foo-bar] Creating secrets encryption configuration ...
==> Setup master configuration files @ foo-bar
==> Upgrade master @ foo-bar
    [foo-bar] Kubernetes control plane is up-to-date.
==> Configure kubelet @ foo-bar
    [foo-bar] Configuring Kubernetes packages ...
    [foo-bar] Configuring kubelet ...
==> Configure master @ foo-bar
    [foo-bar] Checking if Kubernetes control plane is already initialized ...
    [foo-bar] Kubernetes control plane is not initialized.
    [foo-bar] Initializing control plane (v1.11.4) ...
    [foo-bar] Initialization of control plane succeeded!
==> Configure kube client @ foo-bar
    [foo-bar] Fetching kubectl config ...
==> Load cluster configuration @ foo-bar
==> Configure pod security policies @ foo-bar
    [foo-bar] Configuring default pod security policies ...
==> Configure DNS @ foo-bar
    [foo-bar] Patching coredns deployment with 1 replicas (max-surge 0, max-unavailable 1)...
==> Configure Weave network @ foo-bar
    [foo-bar] Configuring overlay network shared secret ...
    [foo-bar] Configuring overlay network ...
==> Configure bootstrap tokens @ foo-bar
    [foo-bar] No new nodes, skipping bootstrap token creation ...
==> Label nodes @ foo-bar
    [foo-bar] No labels or taints set ...
==> Configure metrics @ foo-bar
    [foo-bar] Configuring metrics server ...
==> Configure telemetry @ foo-bar
    [foo-bar] Configuring telemetry service ...
==> Configuring addons ...
==> Enabling addon ingress-nginx
==> Enabling addon openebs
==> Enabling addon host-upgrades
==> Store cluster configuration @ foo-bar
    [foo-bar] Storing cluster configuration to configmap ...
==> Cluster has been crafted! (took 4 minutes 5 seconds)
    To configure kubectl for connecting to the cluster, use:
      pharos-cluster kubeconfig -c cluster.yml > kubeconfig
      export KUBECONFIG=./kubeconfig

以上でインストール先サーバに kubernetes 環境が構築できました。
試しにインストール先サーバのプロセスを見るとこのような感じです。

systemd,1 --switched-root --system --deserialize 22
  |-NetworkManager,458 --no-daemon
  |   |-dhclient,597 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-eth0.pid -lf...
  |   |-{NetworkManager},470
  |   `-{NetworkManager},474
  |-acpid,335
  |-agetty,433 --noclear tty1 linux
  |-agetty,435 --keep-baud 115200 38400 9600 ttyS0 vt220
  |-auditd,274
  |   `-{auditd},275
  |-chronyd,332,chrony
  |-crond,422 -n
  |-dbus-daemon,327,dbus --system --address=systemd: --nofork --nopidfile --systemd-activation
  |   `-{dbus-daemon},362
  |-dockerd-current,13708 --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc ...
  |   |-docker-containe,13713 -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0--start-timeo
  |   |   |-docker-containe,14162 c8bb700dcaf9b432433e10ae4c17593fbeb14055192a3307dacb473cf4da4f23/var/run/docker/libcontaine
  |   |   |   |-pause,14179
  |   |   |   |-{docker-containe},14163
  |   |   |   |-{docker-containe},14164
  |   |   |   |-{docker-containe},14165
  |   |   |   |-{docker-containe},14166
  |   |   |   |-{docker-containe},14167
  |   |   |   |-{docker-containe},14168
  |   |   |   |-{docker-containe},14169
  |   |   |   `-{docker-containe},14171
  |   |   |-docker-containe,14248 7c3a13ec3aab3104f50ab4e95a31d50ff5681c69e3e7725c9f4edd20ccfcef01/var/run/docker/libcontaine
  |   |   |   |-etcd,14263 --name=foo-bar --cert-file=/etc/kubernetes/pki/etcd/server.pem ...
  |   |   |   |   |-{etcd},14283
  |   |   |   |   |-{etcd},14284
  |   |   |   |   |-{etcd},14285
  |   |   |   |   |-{etcd},14286
  |   |   |   |   |-{etcd},14287
  |   |   |   |   |-{etcd},14296
  |   |   |   |   |-{etcd},14298
  |   |   |   |   |-{etcd},15238
  |   |   |   |   `-{etcd},15416
  |   |   |   |-{docker-containe},14249
  |   |   |   |-{docker-containe},14250
  |   |   |   |-{docker-containe},14251
  |   |   |   |-{docker-containe},14252
  |   |   |   |-{docker-containe},14253
  |   |   |   |-{docker-containe},14255
  |   |   |   |-{docker-containe},14259
  |   |   |   `-{docker-containe},14276
  |   |   |-docker-containe,15064 856d720ac41fa01b32bac59df1f1857429fd97199aa855261dbed902f3fac93c/var/run/docker/libcontaine
  |   |   |   |-kube-controller,15088 --horizontal-pod-autoscaler-use-rest-clients=true --address=127.0.0.1 ...
  |   |   |   |   |-{kube-controller},15170
  |   |   |   |   |-{kube-controller},15171
  |   |   |   |   |-{kube-controller},15172
  |   |   |   |   |-{kube-controller},15173
  |   |   |   |   |-{kube-controller},15208
  |   |   |   |   |-{kube-controller},15210
  |   |   |   |   |-{kube-controller},15409
  |   |   |   |   `-{kube-controller},15410
  |   |   |   |-{docker-containe},15065
  |   |   |   |-{docker-containe},15066
  |   |   |   |-{docker-containe},15067
  |   |   |   |-{docker-containe},15068
  |   |   |   |-{docker-containe},15070
  |   |   |   |-{docker-containe},15071
  |   |   |   |-{docker-containe},15072
  |   |   |   `-{docker-containe},15152
  |   |   |-docker-containe,15077 0f6089a1281eae2594a9ffa4cee203255e60a1188c39653af6751d05c1b46256/var/run/docker/libcontaine
  |   |   |   |-kube-apiserver,15102 --audit-log-maxage=30 --audit-log-maxbackup=20 --audit-log-maxsize=100...
  |   |   |   |   |-{kube-apiserver},15147
  |   |   |   |   |-{kube-apiserver},15148
  |   |   |   |   |-{kube-apiserver},15149
  |   |   |   |   |-{kube-apiserver},15166
  |   |   |   |   |-{kube-apiserver},15191
  |   |   |   |   |-{kube-apiserver},15201
  |   |   |   |   |-{kube-apiserver},15202
  |   |   |   |   |-{kube-apiserver},15236
  |   |   |   |   `-{kube-apiserver},15237
  |   |   |   |-{docker-containe},15078
  |   |   |   |-{docker-containe},15079
  |   |   |   |-{docker-containe},15080
  |   |   |   |-{docker-containe},15083
  |   |   |   |-{docker-containe},15084
  |   |   |   |-{docker-containe},15086
  |   |   |   |-{docker-containe},15089
  |   |   |   `-{docker-containe},15090
  |   |   |-docker-containe,15108 ca8aa1b5e49cb945eefdc43c24dc154dfdf59c022a3a153fe8bc8078809cdf24/var/run/docker/libcontaine
  |   |   |   |-kube-scheduler,15139 --address=127.0.0.1 --kubeconfig=/etc/kubernetes/scheduler.conf --leader-elect=true
  |   |   |   |   |-{kube-scheduler},15183
  |   |   |   |   |-{kube-scheduler},15184
  |   |   |   |   |-{kube-scheduler},15185
  |   |   |   |   |-{kube-scheduler},15192
  |   |   |   |   |-{kube-scheduler},15204
  |   |   |   |   |-{kube-scheduler},15205
  |   |   |   |   |-{kube-scheduler},15206
  |   |   |   |   |-{kube-scheduler},15207
  |   |   |   |   `-{kube-scheduler},16512
  |   |   |   |-{docker-containe},15116
  |   |   |   |-{docker-containe},15117
  |   |   |   |-{docker-containe},15118
  |   |   |   |-{docker-containe},15119
  |   |   |   |-{docker-containe},15120
  |   |   |   |-{docker-containe},15125
  |   |   |   |-{docker-containe},15126
  |   |   |   `-{docker-containe},15177
  |   |   |-docker-containe,15417 8ceea0be2708072d1394d067db26f6739e9902e951682a5585f6b8e9d783325f/var/run/docker/libcontaine
  |   |   |   |-pause,15439
  |   |   |   |-{docker-containe},15418
  |   |   |   |-{docker-containe},15419
  |   |   |   |-{docker-containe},15420
  |   |   |   |-{docker-containe},15421
  |   |   |   |-{docker-containe},15422
  |   |   |   |-{docker-containe},15423
  |   |   |   |-{docker-containe},15424
  |   |   |   `-{docker-containe},15534
  |   |   |-docker-containe,15429 4bacdf4f148c70734705c9211ea14a20ca84e60984de5b2c11b11b4c3537ea20/var/run/docker/libcontaine
  |   |   |   |-pause,15456
  |   |   |   |-{docker-containe},15434
  |   |   |   |-{docker-containe},15435
  |   |   |   |-{docker-containe},15436
  |   |   |   |-{docker-containe},15441
  |   |   |   |-{docker-containe},15445
  |   |   |   |-{docker-containe},15447
  |   |   |   |-{docker-containe},15448
  |   |   |   `-{docker-containe},15472
  |   |   |-docker-containe,15574 c55bec88bdca6133bf8e0265e54a13662a71e92cc40d613ae7de39b041f6915e/var/run/docker/libcontaine
  |   |   |   |-kube-proxy,15598 --config=/var/lib/kube-proxy/config.conf
  |   |   |   |   |-{kube-proxy},15638
  |   |   |   |   |-{kube-proxy},15639
  |   |   |   |   |-{kube-proxy},15640
  |   |   |   |   |-{kube-proxy},15651
  |   |   |   |   |-{kube-proxy},15789
  |   |   |   |   `-{kube-proxy},17157
  |   |   |   |-{docker-containe},15576
  |   |   |   |-{docker-containe},15577
  |   |   |   |-{docker-containe},15578
  |   |   |   |-{docker-containe},15579
  |   |   |   |-{docker-containe},15580
  |   |   |   |-{docker-containe},15581
  |   |   |   |-{docker-containe},15586
  |   |   |   `-{docker-containe},15594
  |   |   |-docker-containe,16006 790a065c54977e569b9af0c73e7a272ae933b2065543c0339966a67078fcaf30/var/run/docker/libcontaine
  |   |   |   |-launch.sh,16022 /home/weave/launch.sh
  |   |   |   |   `-weaver,16092 --port=6783 --datapath=datapath --name=2a:58:7f:c9:a6:8e --host-root=/host ...
  |   |   |   |       |-{weaver},16094
  |   |   |   |       |-{weaver},16095
  |   |   |   |       |-{weaver},16096
  |   |   |   |       |-{weaver},16097
  |   |   |   |       |-{weaver},16099
  |   |   |   |       |-{weaver},16100
  |   |   |   |       |-{weaver},16101
  |   |   |   |       |-{weaver},16191
  |   |   |   |       |-{weaver},16192
  |   |   |   |       |-{weaver},16193
  |   |   |   |       |-{weaver},16194
  |   |   |   |       |-{weaver},16202
  |   |   |   |       |-{weaver},16210
  |   |   |   |       `-{weaver},16211
  |   |   |   |-{docker-containe},16007
  |   |   |   |-{docker-containe},16008
  |   |   |   |-{docker-containe},16009
  |   |   |   |-{docker-containe},16010
  |   |   |   |-{docker-containe},16011
  |   |   |   |-{docker-containe},16012
  |   |   |   |-{docker-containe},16013
  |   |   |   `-{docker-containe},16034
  |   |   |-docker-containe,16376 0093170521f5093cc2e67ac168dc30407ebee4d9472f295522b82962165ca432/var/run/docker/libcontaine
  |   |   |   |-weave-npc,16393
  |   |   |   |   |-ulogd,16422 -v
  |   |   |   |   |-{weave-npc},16408
  |   |   |   |   |-{weave-npc},16409
  |   |   |   |   |-{weave-npc},16410
  |   |   |   |   |-{weave-npc},16411
  |   |   |   |   |-{weave-npc},16412
  |   |   |   |   |-{weave-npc},16413
  |   |   |   |   |-{weave-npc},16435
  |   |   |   |   |-{weave-npc},16436
  |   |   |   |   `-{weave-npc},16456
  |   |   |   |-{docker-containe},16377
  |   |   |   |-{docker-containe},16378
  |   |   |   |-{docker-containe},16379
  |   |   |   |-{docker-containe},16380
  |   |   |   |-{docker-containe},16381
  |   |   |   |-{docker-containe},16383
  |   |   |   |-{docker-containe},16387
  |   |   |   `-{docker-containe},16388
  |   |   |-docker-containe,16513 5983cab6d9bf5f7f9bed8a5fea3d7f47491d8fa89fe10e6cc8434cda11315b21/var/run/docker/libcontaine
  |   |   |   |-pause,16530
  |   |   |   |-{docker-containe},16514
  |   |   |   |-{docker-containe},16515
  |   |   |   |-{docker-containe},16516
  |   |   |   |-{docker-containe},16517
  |   |   |   |-{docker-containe},16518
  |   |   |   |-{docker-containe},16520
  |   |   |   |-{docker-containe},16521
  |   |   |   `-{docker-containe},16548
  |   |   |-docker-containe,16618 faf3a7049527895a7d1393ea73aaca0e14696284c9cf045cbf319263a5b02e4d/var/run/docker/libcontaine
  |   |   |   |-pause,16634
  |   |   |   |-{docker-containe},16619
  |   |   |   |-{docker-containe},16620
  |   |   |   |-{docker-containe},16621
  |   |   |   |-{docker-containe},16622
  |   |   |   |-{docker-containe},16623
  |   |   |   |-{docker-containe},16624
  |   |   |   |-{docker-containe},16625
  |   |   |   `-{docker-containe},16651
  |   |   |-docker-containe,16720 hogehogehogehoge/var/run/docker/libcontaine
  |   |   |   |-pause,16736
  |   |   |   |-{docker-containe},16721
  |   |   |   |-{docker-containe},16722
  |   |   |   |-{docker-containe},16723
  |   |   |   |-{docker-containe},16724
  |   |   |   |-{docker-containe},16725
  |   |   |   |-{docker-containe},16727
  |   |   |   |-{docker-containe},16728
  |   |   |   `-{docker-containe},16753
  |   |   |-docker-containe,16786 takotako/var/run/docker/libcontaine
  |   |   |   |-coredns,16802 -conf /etc/coredns/Corefile
  |   |   |   |   |-{coredns},16821
  |   |   |   |   |-{coredns},16822
  |   |   |   |   |-{coredns},16823
  |   |   |   |   |-{coredns},16824
  |   |   |   |   |-{coredns},16832
  |   |   |   |   |-{coredns},16833
  |   |   |   |   |-{coredns},16835
  |   |   |   |   |-{coredns},16837
  |   |   |   |   `-{coredns},17085
  |   |   |   |-{docker-containe},16787
  |   |   |   |-{docker-containe},16788
  |   |   |   |-{docker-containe},16789
  |   |   |   |-{docker-containe},16790
  |   |   |   |-{docker-containe},16791
  |   |   |   |-{docker-containe},16793
  |   |   |   |-{docker-containe},16797
  |   |   |   `-{docker-containe},16798
  |   |   |-docker-containe,16877 foobarfoobar/var/run/docker/libcontaine
  |   |   |   |-metrics-server,16894...
  |   |   |   |   |-{metrics-server},16912
  |   |   |   |   |-{metrics-server},16913
  |   |   |   |   |-{metrics-server},16914
  |   |   |   |   |-{metrics-server},16923
  |   |   |   |   |-{metrics-server},16924
  |   |   |   |   `-{metrics-server},23149
  |   |   |   |-{docker-containe},16878
  |   |   |   |-{docker-containe},16879
  |   |   |   |-{docker-containe},16880
  |   |   |   |-{docker-containe},16881
  |   |   |   |-{docker-containe},16882
  |   |   |   |-{docker-containe},16883
  |   |   |   |-{docker-containe},16884
  |   |   |   `-{docker-containe},16886
  |   |   |-docker-containe,17029 b0hogehogehogehoge/var/run/docker/libcontaine
  |   |   |   |-pharos-host-upg,17045 --schedule=0 6 * * * --schedule-window=3600s --reboot --drain
  |   |   |   |   |-{pharos-host-upg},17063
  |   |   |   |   |-{pharos-host-upg},17064
  |   |   |   |   |-{pharos-host-upg},17065
  |   |   |   |   |-{pharos-host-upg},17066
  |   |   |   |   |-{pharos-host-upg},17077
  |   |   |   |   |-{pharos-host-upg},17078
  |   |   |   |   `-{pharos-host-upg},17079
  |   |   |   |-{docker-containe},17030
  |   |   |   |-{docker-containe},17031
  |   |   |   |-{docker-containe},17032
  |   |   |   |-{docker-containe},17033
  |   |   |   |-{docker-containe},17034
  |   |   |   |-{docker-containe},17035
  |   |   |   |-{docker-containe},17036
  |   |   |   `-{docker-containe},17057
  |   |   |-{docker-containe},13714
  |   |   |-{docker-containe},13715
  |   |   |-{docker-containe},13716
  |   |   |-{docker-containe},13717
  |   |   |-{docker-containe},13718
  |   |   |-{docker-containe},13719
  |   |   |-{docker-containe},13722
  |   |   |-{docker-containe},14191
  |   |   |-{docker-containe},14278
  |   |   |-{docker-containe},14282
  |   |   |-{docker-containe},15037
  |   |   |-{docker-containe},15059
  |   |   |-{docker-containe},15063
  |   |   |-{docker-containe},15151
  |   |   |-{docker-containe},15155
  |   |   |-{docker-containe},15474
  |   |   |-{docker-containe},15482
  |   |   |-{docker-containe},15540
  |   |   |-{docker-containe},15556
  |   |   |-{docker-containe},15627
  |   |   |-{docker-containe},16549
  |   |   |-{docker-containe},16656
  |   |   |-{docker-containe},16657
  |   |   |-{docker-containe},16816
  |   |   |-{docker-containe},16905
  |   |   |-{docker-containe},16907
  |   |   |-{docker-containe},17147
  |   |   `-{docker-containe},19213
  |   |-{dockerd-current},13709
  |   |-{dockerd-current},13710
  |   |-{dockerd-current},13711
  |   |-{dockerd-current},13712
  |   |-{dockerd-current},13720
  |   |-{dockerd-current},13721
  |   |-{dockerd-current},13723
  |   |-{dockerd-current},13725
  |   |-{dockerd-current},14238
  |   |-{dockerd-current},14955
  |   |-{dockerd-current},14962
  |   |-{dockerd-current},14963
  |   `-{dockerd-current},15488
  |-kubelet,14881 --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf...
  |   |-{kubelet},14883
  |   |-{kubelet},14884
  |   |-{kubelet},14885
  |   |-{kubelet},14886
  |   |-{kubelet},14887
  |   |-{kubelet},14888
  |   |-{kubelet},14889
  |   |-{kubelet},14892
  |   |-{kubelet},14905
  |   |-{kubelet},14921
  |   |-{kubelet},14922
  |   |-{kubelet},14939
  |   |-{kubelet},14942
  |   |-{kubelet},15200
  |   `-{kubelet},15607
  |-lvmetad,13575 -f
  |-master,1092 -w
  |   |-pickup,12724,postfix -l -t unix -u
  |   `-qmgr,1122,postfix -l -t unix -u
  |-polkitd,320,polkitd --no-debug
  |   |-{polkitd},349
  |   |-{polkitd},369
  |   |-{polkitd},392
  |   |-{polkitd},396
  |   `-{polkitd},401
  |-rsyslogd,891 -n
  |   |-{rsyslogd},895
  |   `-{rsyslogd},897
  |-sshd,1095 -D
  |   `-sshd,12476
  |-systemd-journal,231
  |-systemd-logind,375
  |-systemd-udevd,260
  `-tuned,892 -Es /usr/sbin/tuned -l -P
      |-{tuned},1187
      |-{tuned},1188
      |-{tuned},1191
      `-{tuned},1218

Monitorama AMS 2018の資料リンク集

今週はバタバタだったのでまだ咀嚼できていませんが。
PDX2018に続いて社会派セッションがありましたが、PDXと比べてPrometheusとかAIとかが多めでAlert Fatigueが少なめかなという違いも感じました。
EU開催は5年ぶりということで溜まってたネタもあったのでしょうか。
LTやパネルディスカッションもかなり面白かったです。

一日目(9/4)

You don’t look like an Engineer

Monica Sarbu
https://speakerdeck.com/monicasarbu/you-dont-look-like-an-engineer-2

Nagios, Sensu, Prometheus - Why a change of the framework does not change the mindset

Rick Rackow

Is observability good for our brain? How about post-mortems?

Radu Gheorghe, Rafa? Ku?
https://www.slideshare.net/sematext/is-observability-good-for-your-brain

Monitoring what you don't own

Stephen Strowes
https://sdstrowes.co.uk/talks/20180904-sdstrowes-monitorama.pdf

What the NTSB teaches us about incident management & postmortems

Michael Kehoe, Nina Mushiana
https://www.slideshare.net/MichaelKehoe3/what-the-ntsb-teaches-us-about-incident-management-postmortems

A thousand and one postmortems: lessons learned from running complex systems at scale

Alexis Le-Quoc
https://speakerdeck.com/alq/1-001-postmortems-lessons-learned-from-running-complex-systems-at-scale

Lightning Talks

Samplerr - RRDTool 2018
Prometheus at Adobe
Defining Alerting

Nita

Live monitoring and automatic remediation in self care of diabetess
How to become a CTO by killing

二日目(9/5)

Prometheus for Practitioners: Migrating to Prometheus at Fastly

Marcus Barczak
https://speakerdeck.com/ickymettle/prometheus-for-practitioners-migrating-to-prometheus-at-fastly

Rethinking UX for AI-driven Monitoring Tools

Stephen Boak
https://github.com/DataDog/MonitoramaEUDesignForAI

Building a monitoring strategy and gaining consensus

Gregory Parker, Trevor Morgan

Self-hosted & open-source time series analysis for your infrastructure

Alexey Velikiy

Monitoring Serverless Things

Mandy Waite

How AI Helps Observe Decentralised Systems

Dominic Wellington
https://www.slideshare.net/DominicWellington/how-ai-helps-observe-decentralised-systems

Incremental-decremental Methods For Real-Time Monitoring

Joe Ross
https://www.slideshare.net/secret/Bl0af5OKPy3eYP

Panel Discussion

Marcus Barczak, Rick Rackow, Denys Zhdanov, Brad Lhotsky

Monitorama2018のスライドへのリンク集(更新中)

先週はMonitoramaでした。今年も名言名スライドが生まれました。
ひとまずタイムテーブルに沿って公開された資料へのリンクを集めていきます。

Day1

・Optimizing for Learning
Logan McDonald

https://speakerdeck.com/loganmeetsworld/optimizing-for-learning?slide=1

・Serverless and CatOps: Balancing trade-offs in operations and instrumentation
Pam Selle

https://thewebivore.com/serverless-and-catops-slides/

・Mentoring Metrics Engineers: How to Grow and Empower Your Own Monitoring Experts
Zach Musgrave, Angelo Licastro



・The Power of Storytelling
Dawn Parzych



・Principia SLOdica - A Treatise on the Metrology of Service Level Objectives
Jamie Wilkinson



・On-call Simulator! - Building an interactive game for teaching incident response
Franka Schmidt



・Observability: the Hard Parts
Peter Bourgon

https://peter.bourgon.org/observability-the-hard-parts/

・Warning: This Talk Contains Content Known to the State of California to Reduce Alert Fatigue
Aditya Mukerjee

https://speakerdeck.com/chimeracoder/warning-this-talk-contains-content-known-to-the-state-of-california-to-reduce-alert-fatigue?slide=1

・Monitory Report: I Have Seen Your Observability Future. You Can Choose a Better One.
Ian Bennett


Day2

・Want to solve Over-Monitoring and Alert Fatigue? Create the right incentives!
Kishore Jalleda


SRECon https://www.usenix.org/conference/srecon17europe/program/presentation/jalleda

・Next-Generation Observability for Next-Generation Data: Video, Sensors, Telemetry
Peter Bailis



・Coordination through community: A swarm of friendly slack bots to improve knowledge sharing
Aruna Sankaranarayanan



・Automate Your Context
Andy Domeier

https://www.youtube.com/watch?v=5vbqwTXSvjY


・Slack in the Age of Prometheus
George Luong



Sparky the fire dog: incident response as code
Tapasweni Pathak



・Reclaim your Time: Automating Canary Analysis
Megan Kanne

https://speakerdeck.com/megankanne/reclaim-your-time-automating-canary-analysis?slide=1

Lightning Talks



Day3

・Achieving Google-levels of Observability into your Application with OpenCensus
Morgan McLean



・The present and future of Serverless observability
Yan Cui

https://www.slideshare.net/theburningmonk/the-present-and-future-of-serverless-observability-100983842

・Putting billions of timeseries to work at Uber with autonomous monitoring
Prateek Rungta



・Building Monitoring tools when you don't own applications or infrastructure
Mercedes Coyle

https://www.slideshare.net/MercedesCoyle/building-open-source-monitoring-tools


・Autoscaling Containers... with Math
Allan Espinosa


KubeCon2016 http://schd.ws/hosted_files/cnkc16/8c/espinosa-autoscaling-presentation.pdf

・Assisted Remediation: By trying to build an autoremediation system, we realized we never actually wanted one
Kale Stedman



・Security through Observability
Dave Cadwallader


blog https://www.honeycomb.io/blog/2018/02/security-through-observability/

・How to include Whistler, Kate Libby, and appreciate that our differences make our teams better.
Beth Cornils



Posts

http://johan.org.uk/sysadmin/blog/2018/06/06/monitorama-2018-pdx-day-1/

https://hackernoon.com/highlights-of-monitorama-pdx-day-1-d07ed6dc816f

https://github.com/joncav/monitorama-pdx2018-notes

https://github.com/sohonet/monitorama2018

Tech Night @ Shiodome # 8 に行ってきました

f:id:w4yh:20170329213053j:plain
※資料が公開されたら後日アップデートします

techsio.connpass.com

StackStorm 勉強会としては4回目の位置付けでいいんですかね。
汐留のステキな会場と撮影機材の中で行われました。ソフトバンク様、ありがとうございます!

今回も興味深い発表連発でした。それぞれの用途を踏まえた具体的なお話で、かつ「なぜStackStormを選んだか」にも触れていたのが印象的でした。
ツールとして何と競合する位置付けなのか明確になって、使いどころやストロングポイントが実感されるようになってきた、ということでしょうか。

明日からできる、st2のActionの作り方 by @_manji0 さん

speakerdeck.com

中級者?くらいをターゲットにした自作 Action ガイドのお話でした。
定義とインターフェース情報の metadata と実際の処理の action を書けばできるよ!とサンプルを交えて解説していただきました。

Q: 実際にはどんな Action を書いてますか?
A: 仕事ではネットワーク機器操作用のを書いてます
(補足: 以前NTT tech conf #02の展示でもご紹介されてました)

なお10分巻いた原因はこちらのようですw


データの民主化のためにStackStormを活用した事例 by @laclefyoshi さん

www.slideshare.net

事業部をまたいだデータ活用のためにStackStormを採用したという事例のご紹介でした。
解析処理部分のワークフローだとDigdagが思い浮かびますが、Telendとかが使われそうなフェーズも含めた段階に採用した感じでしょうか。こちらの資料でいう Subscription ~ Deliver に相当する部分とのお話でした。
( A Look Under the Hood – How Amazon.com Uses AWS Services for Analytic… )

採用理由として
耐障害性 / Scheduker機能 / リトライも容易 / ワークフローが再利用しやすい / REST APIがある
という点が挙げられました。
REST APIによってEntry pointが統一できるという意味では、第2回勉強会で @shusugmt さんが発表された内容も思い出しました。

Q: StackStorm OSS版では権限分離(RBAC)が無いが公開先を限定したいデータの扱いは?
A: 今回は扱う対象から外した。もしくはマスキングを行うなどデータ側で対応

3万台のリスクから会社を守る。st2で24時間リモートワイプ by 森 さん

www.slideshare.net

自動化すると人力と違って すぐ | 深夜でも休日でも | 多数でも 処理できますからね。

採用理由には
学習コストが低そう / 様々なサービスとの連携機能
が挙げられました。でもRedmineとの連携部分は独自開発、というのもすごい。

Q: Google SpreadSheetからは更新された内容だけ取得できるのか?
A: JSON形式で毎回全部読んでいる。最終行番号を見て差分のところだけ拾うようにしている

Q: 自動化したことによって他の人の証明書を無効化する悪用もできるのでは?
A: 悪意の無い証明書ID間違いでも、自動化する前から起こりうるので....

Q: RedmineのPluginはぜひ StackStorm Exchange に公開を!

NW機器・サーバ機器の設定自働化に向けたst2機能の活用案 by 福田 さん

www.slideshare.net


NW工事の作業をStackStormのワークフローで流す際に pause | resume で停止をかける方法と tips についてデモを交えての発表でした。
StackStorm 2.4で導入された機能です。
What's This? StackStorm 2.4 Already? - StackStorm

スライド中で多数の Action と 子Workflow を持った大きなワークフローが図示されましたが、実際にあのような大きさのワークフローを運用されているのでしょうか。キニナル

参考: 発表でも触れられましたが、あらかじめ予定されていてワークフローに組み込めるシェルスクリプトで言う read みたいな待機は StackStorm 2.5で入ったinquiriesで実現できます。
stackstorm.com

st2-docker ことはじめ by @shusugmt さん

www.slideshare.net

StackStormはコンポーネントが多く割と大きな仕組みですが、導入を容易にするために Ansible とか Vagrant、Docker イメージなどの方式が用意されています。
st2-docker は docker-composeで簡単に起動できる、けどデータストア系は別コンテナで用意する必要があるとのこと。まあそうですよねー
とは言え小~中規模であれば十分運用できる感じで、また helm chart も目下PRが出ているようで StackStorm のコンテナ化も進みそうです。

他のツールとかで Kubernetes 基盤をすでに持っているならいいですが、新規に基盤を立てるとなるとパーシステントボリュームをどうするかが悩みどころです。自分も Docker 環境で使ってた Open vStorage 部分を k8s でどうするかまだ決めかねてます。

蛇足ですが、去年私が内部で行った発表で「StackStorm は様々なツールとの連携に対応していて、ヘテロな環境で強みを発揮する。では世界が例えば kubernetes で統一されたらどうなるだろう」という考察をしました。この辺議論してみたいです。
f:id:w4yh:20180530063413j:plain

StackStorm アップデート&ロードマップ by @LindsayHill さん

www.slideshare.net

スケジュール
2018/06 StackStorm 2.8) Python3化、WebUI刷新、k8s HA対応、メトリクス framework、新ワークフローエンジン Orchestra(beta)
2018/08 2.9
2018/10 3.0) ChatOps RBAC、Orchestra(GA)

WebUI: また色が変わるようですw 左右の比率が変わって、右側の詳細表示やパラメータフォームの欄が大きくなる事が強調されてました。うんうん

SupportOS: Ubuntu18.04 が出て RHEL8 も見えてきたので Ubuntu 14.04 や RHEL6 の対応は終わる予定とのことです。「でもまだ時間あるから。それまでには移行できるよな?」というメッセージでした。 アッハイ

Orchestra: 独自に新たなワークフローエンジンを用意するとのことです。「Mistral は非常に良いが OpenStack のプロジェクトなので開発ペースや優先事項もあっちで決まる。独自にやりたい。ちなみに PostgreSQL は不要になる」という意欲的なメッセージでした。なんか、Nutanix が独自ハイパーバイザー(現AHV)を発表した時に似てる空気感です。
....代わりにどれかワークフローエンジンが外れるのかな....CloudSlangも使ってるけどピンチかな....Javaだしなあ.... st2ctl で管理してないしなあ....

買収が続いて不透明な部分もありましたが、StackStorm チームは順調かつ意欲的に開発も進められているようで安心しました。

StackStormユーザ会からのお知らせ by @user_localhost さん


ユーザー会サイト https://stackstorm.jp/ の告知&ブログ執筆の募集
ドキュメント日本語訳のご協力募集

をいつもよりゆっくりめのトークでご案内いただきました。

5月29日*総括

全体的に慌ただしい感じになってしまったのが残念でした。テクシオで StackStorm は2回目なのでイントロな話は無しでしたがそこは大丈夫だと信じてます。
なぜか日本ではネットワーク機器を対象とした事例が多いので、今回のデータ解析基盤のお話は非常に良かったです。

「使ってみるぞー」「セットアップしてから放置してたけど Action 書いて使っていくぞー」という気持ちになった方がたくさんいるといいなあ、と思います。
次回は CloudSlang 追悼 LT かなあ

(2018/06/03 福田さんの発表資料へのリンクを追加しました)
(2018/06/06 森さんの発表資料へのリンクを追加しました)

2017年ふりかえり

年末らしく一年のふりかえりエントリをざっと書きます。

今年残念だったもの

ついった

今年の初めは「ノーリターンでも課金していいぞ」という気持ちでしたが、一連の凍結騒動でちょっと引いた感があります。発言に対して法律や公序良俗による規制をかけるのは当然としてアカウント自体を規制せずに済む方向だと嬉しいのですが。
凍結騒動の時には付随して"人は遠くの出来事と身近に起きたことでは反応が変わるものだなあ"、というのも観測しました。自分自身も遠く安全地帯からスカした発言を気取らないように気をつけねば、と感じさせられました。

Questetra

ダウンロード版が4月で公開終了してしまいました。高機能さと簡易さを兼ね備えたとても優れたワークフローツールなので残念でした。SaaS版が引き続き進化を続けているので、豊富なサンプルと今後の連携サービスの拡大に期待です。

今年なぜか行けなかったイベント

rancher meetup

去年は割と参加できていましたが、今年は日程かぶりが調整できずあまり参加できませんでした。第一回がコンテナSIGとかぶった伝統かもしれませんが来年はもうちょっと参加したいです。

Nutanix Community meetup

こちらはなぜか当日になると障害が起きたり体調に問題が起きたりでほぼ全滅でした。たまたまだと思いますが来年は参加してチョコレートのお供えもしたいです(?)。

今年印象的だったイベント

builderscon

builderscon tokyo 2017 - Aug 3, 4, 5 2017

チケットゲットできました。王道なものも道を外れたものも道を引き返すものも、どのお話も突き詰めた感にあふれていて技術的な刺激が非常に強いイベントでした。次回もチケットを買い逃さないようにしなければです。

Zulip & PGroonga Night

Zulip & PGroonga Night - connpass

2年前くらいからチームで使っているZulip。まさか日本で特化したイベントが行われるとは。開発者Gregさん、PGroongaとの統合で日本語検索環境をぐっと改善してくれた須藤さんによるコアなお話が聞けてとても良かったです。今年はZulipがコミュニティ活動も活発になり、開発の勢いもぐっと上がった感があります。

Internetweek

H3 運用自動化ハンズオン ~StackStormで実践するインフラ運用革命~ - IW2017

推しの卒業公演の翌日という最悪な日程でしたがStackStormハンズオンセッションでTAをしました。一年ちょいでこんなに興味を持つ人が増えたのか、と感慨深くまた期待を持つことができるセッションでした。使う人が増えて、使用例やつらみがどんどん発表&議論されていくといいなあ。

今年良かった記事

Web+DB vol.98

WEB+DB PRESS Vol.98|技術評論社

特集2の"これからはじめるDocker"が印象的でした。yak shavingとも言える部分ですが、sshの鍵登録やパスワード無しのsudoなどについてしっかり記されていて"ありそうで無かった"感がありました。初心者向けにも多く説明の場数を踏んでいるエバンジェリストの方々らしい優れた記事だったと思います。

今年便利だったツール

holo2

Holo - Minimalistic Configuration Management

ほぼ一人で開発されていたHolo-cmに救世主が現れ、大幅に改善が行われた2.0がリリースされました。これは良いです。holo scan -> holo applyの流れが固まり非常にすっきりしました。Holo 1系を使っている人がもしいたら必ず2系を試して欲しいです。

GitLab

どんどん高機能化が進むGitLabですが9.台からはどっぷり依存した使い方をするようになりました。今後もCEを見捨てずにお願いしたいです。そう言えばOctotree的なものを統合する話はどうなったんでしょう。

今年印象的だったコンテンツ

スキマから聴こえてくるラジオスペシャル 『AIか、人間か~ラジオパーソナリティの未来~』

スキマから聴こえてくるラジオスペシャル 『AIか、人間か~ラジオパーソナリティの未来~』|JFN PARK

AIについて技術的な面ではなく、生活への影響や言葉、コミュニケーションの切り口で迫った番組。情報としての言葉とコミュニケーションとしての言葉との境目を考えさせられました。りんなとじゃれたりする緩さと、いのちの電話の理事長さんへのインタビューなどの真摯さと、すべてが一人語りで投げかけられてくるラジオとしての迫力に満ちた番組でした。

{code}のreading-suggest channel (Slack)

Slackで読んでいるチャンネルも増えてきましたが、流量は少ないながらも面白い記事が流れてくるこのチャンネルは良い情報源でした。最近だとkubeconの注目セッションなんかも流れていました。

2018年期待するもの

Podcastイベント

rebuildが200回に迫っていたり、engineer meeting podcastが100回までにカードゲームができあがらなかったり、年明けにはPodcast系のイベントがあるんじゃないかなと期待しています。

レジリエンスエンジニアリング/Safety-II

論説自体は以前からあったそうですが、去年他業界の知り合いから聞いて知りNHKの番組きっかけで学び始めて、今年というか最近になって社内発表したりついったで言及したところ反響があったテーマです。これまでとは考え方からがらっと変えることを求められるので理解も実践への落とし込みも大変なテーマですが、引き続き学んで発信していきたいと思います。