ギブアップした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 じゃん、と突っ込まれる)
去年の 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
Unquantified Serendipity: Diversity in Development
Quintessence Anx
https://github.com/quintessence/presentations/blob/master/unquantified-serendipity/unquantified-serendipity.pdf
How to build observability into a serverless application
Yan Cui
https://www.slideshare.net/theburningmonk/how-to-build-observability-into-a-serverless-application
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
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
・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
・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
Tech Night @ Shiodome # 8 に行ってきました
※資料が公開されたら後日アップデートします
StackStorm 勉強会としては4回目の位置付けでいいんですかね。
汐留のステキな会場と撮影機材の中で行われました。ソフトバンク様、ありがとうございます!
今回も興味深い発表連発でした。それぞれの用途を踏まえた具体的なお話で、かつ「なぜStackStormを選んだか」にも触れていたのが印象的でした。
ツールとして何と競合する位置付けなのか明確になって、使いどころやストロングポイントが実感されるようになってきた、ということでしょうか。
明日からできる、st2のActionの作り方 by @_manji0 さん
中級者?くらいをターゲットにした自作 Action ガイドのお話でした。
定義とインターフェース情報の metadata と実際の処理の action を書けばできるよ!とサンプルを交えて解説していただきました。
Q: 実際にはどんな Action を書いてますか?
A: 仕事ではネットワーク機器操作用のを書いてます
(補足: 以前NTT tech conf #02の展示でもご紹介されてました)
なお10分巻いた原因はこちらのようですw
完全に1920までだと思って発表してた #テクシオ
— まんじまる (@_manji0) 2018年5月29日
データの民主化のために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 で統一されたらどうなるだろう」という考察をしました。この辺議論してみたいです。
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
特集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の注目セッションなんかも流れていました。