No SSH
KMC関東例会 at Cybozu
野島 裕輔 (@nojima)
自己紹介
@nojima (Yusuke Nojima)
blog: nojima.hatenablog.com
github: github.com/nojima
twitter: twitter.com/nojima
Cybozu でインフラエンジニアをやっています。
元競プロ勢。
インフラの自動化について話します
そもそも何で自動化しないといけないのか?
前提:
サービスが成長していく
サービスが成長していくと…
• 使用するメモリ量、ディスクIO、CPU使用量などが
増加していく。
• そして、いつかサーバーの物理的な限界に到達する。
スケーリング
• スケールアップ
• より強いサーバーを投入することで、より多くの計算資源を確保する。
• 一定の性能を超えると、性能あたりの値段が指数関数的に増大する。
• スケールアウト
• サーバーを大量に並べることで、必要な計算資源を確保する。
• 値段は全体の性能に比例する。
• 大量のサーバーを並べることになるので、管理が大変
サーバー管理
• サーバーの投入のために、サーバーの役割に応じて
パッケージのインストールや設定の配置を行う。
• サービスのリリースのために、APサーバーの
ローリングアップデートを行う。
• 脆弱性対応のために、インストールされたパッケージを
更新する。
• などなど
サーバー職人の朝は早い
• 感覚的には、サーバーが10台ぐらいなら手動でも管理できる。
• しかし、サーバーが1000台になると、手動では絶対に無理。
• したがって、スケールアウトには自動化が必須。
どうやって自動化する?
ナイーブなやり方:
1. 手動での手順を確立する。
2. (Optional) 手順を手順書に起こす。
3. 手順をシェルスクリプトやPythonで書く。
DB
例1: AP のローリングアップデート
• アプリケーションの新しいバージョンをリリースしたい。
• アプリケーションは次のような3層構成になっているとする。
nginx
nginx
AP
AP
AP
User
# AP サーバをローリングアップデートする
for ap in ${AP_SERVERS}; do
# ロードバランシング対象から外す
for nginx in ${NGINX_SERVERS}; do
ssh ${nginx} sudo detach-from-load-balancer ${ap}
done
# APサーバの更新
cat ${ARTIFACT_TGZ} | ssh ${ap} sudo tar -z -x -C /
ssh ${ap} sudo systemctl restart ap-service
# ロードバランシング対象に戻す
for nginx in ${NGINX_SERVERS}; do
ssh ${nginx} sudo attach-to-load-balancer ${ap}
done
done
例2: ロードバランサの更新
• 脆弱性対応とかでロードバランサに入っている
パッケージを更新したいとする。
• Ubuntu の場合は apt dist-upgrade した後にサーバーを
再起動する手順になる。
# ロードバランサの更新を行う
# (本当は L4LB からの切り離しを行うべきだけど煩雑なので省略)
for nginx in ${NGINX_SERVERS}; do
# パッケージの更新
ssh ${nginx} sudo apt update
ssh ${nginx} sudo apt dist-upgrade -y
# 再起動
ssh ${nginx} sudo reboot
(${nginx} が起動するまで待つ)
done
この調子で自動化していけば
いくらでもスケールアウトできる?
残念ながら
No
例: APとLBの並列更新
オペレータAがAPをローリングアップデートしている最中に、
別のオペレータBがロードバランサを更新しようとしたとする。
# AP をローリングアップデートする
for ap in ${AP_SERVERS}; do
# ロードバランシング対象から外す
for nginx in ${NGINX_SERVERS}; do
ssh ${nginx} ...
done
# APサーバの更新
cat ${ARTIFACT} | ssh ${ap} ...
ssh ${ap} sudo systemctl ...
# ロードバランシング対象に戻す
for nginx in ${NGINX_SERVERS}; do
ssh ${nginx} ...
done
done
# ロードバランサの更新を行う
for nginx in ${NGINX_SERVERS}; do
# パッケージの更新
ssh ${nginx} sudo apt update
ssh ${nginx} sudo apt dist-upgrade
# 再起動
ssh ${nginx} sudo reboot
(${nginx} が起動するまで待つ)
done
単体では問題なく実施できるオペレーションでも
並列に実行すると壊れる場合がある
どうすればいい?
• 同時に実行しないように人が注意する
⇐ チームの規模が大きくなってくると無理
• 2つのスクリプトは「ロードバランサ」という共有リソースを
操作していた。
• 同時に実行してはいけない操作が競合し、問題となった。
• じゃあ排他すればいいじゃん!!
(
flock -x 9
# AP サーバをローリングアップデートする
for ap in ${AP_SERVERS}; do
# ロードバランシング対象から外す
for nginx in ${NGINX_SERVERS}; do
ssh ${nginx} sudo ...
done
# APサーバの更新
cat ${ARTIFACT_TGZ} | ssh ${ap} ...
ssh ${ap} sudo ...
# ロードバランシング対象に戻す
for nginx in ${NGINX_SERVERS}; do
ssh ${nginx} sudo ...
done
done
) 9> /var/lock/nginx-operation
(
flock -x 9
# ロードバランサの更新を行う
for nginx in ${NGINX_SERVERS}; do
# パッケージの更新
ssh ${nginx} sudo apt update
ssh ${nginx} sudo apt dist-upgrade
# 再起動
ssh ${nginx} sudo reboot
(${nginx} が起動するまで待つ)
done
) 9> /var/lock/nginx-operation
( flock -x 9 ... ) 9> /var/lock/nginx-operation って何?
( ... )
サブシェル。
別のプロセスを起動して、その中で括弧の中のコマンドを実行する。
9> filename
リダイレクト。
この場合、filename を書き込みモードで open し、9番の FD に割り当てる。
flock -x 9
9番の FD を使って排他ロックを行う。
ロックはファイルが閉じられるまで保持される。
• これで、AP の更新スクリプトとロードバランサの
更新スクリプトが衝突する系を救えた。
• しかし、ロードバランサに対して行う操作は他にもある。
• static コンテンツのアップロード
• nginx 設定ファイルの更新
• SSL証明書の更新
• …
• 全部調停しないといけない
調停による依存関係の爆発
Operation
5
nginx
nginx
Operation
1
Operation
4
Operation
3
Operation
2
どうすればよかったのか?
• 各スクリプト同士を直接調停させようとすると、
依存関係により破綻する。
• よって、サービスを提供する側(この場合は nginx)で
調停すべき。
やりたいことのイメージ
Operation
5
nginx
nginx
Operation
1
Operation
4
Operation
3
Operation
2
nginx
operator
service
ここで調停
しかし、現在のシェルスクリプトには、
調停者を差し込む余地がない。
# ロードバランサの更新を行う
# (本当は L4LB からの切り離しを行うべきだけど煩雑なので省略)
for nginx in ${NGINX_SERVERS}; do
# パッケージの更新
ssh ${nginx} sudo apt update
ssh ${nginx} sudo apt dist-upgrade -y
# 再起動
ssh ${nginx} sudo reboot
(${nginx} が起動するまで待つ)
done
どうしようもない
No SSH
# 再起動
ssh ${nginx} sudo reboot
そもそも、ここがダメなのでは?
ssh はカプセル化を破壊する
• ssh するとリモートサーバー上のあらゆるファイルを読み書きできる。
• ssh するとリモートサーバー上のあらゆるデーモンを起動・停止できる。
• ssh するとリモートサーバー上のあらゆる状態を取得できる。
ssh は OOP において private 変数を直接読み書きしているようなもの!!
ssh を許可すると、
そのサーバーのあらゆる実装上の詳細を
クライアントに露呈させることになる
ssh をやめて、
インターフェイスで会話しよう
• ssh によるオペレーション自動化を禁止。
• 代わりに、サービスを管理するためのエージェントを作る。
• エージェントの API が、そのサービスの公開インターフェイスとなる。
• オペレーションスクリプトは、公開されたインターフェイスを
叩くだけにする。
インターフェイスをどう設計するか
• 実装上の詳細ができるだけ露呈しないようにする。
• そのサービスを構成するサーバーのリスト、
サーバーのファイルシステムのレイアウト、
そのサービスの実装が利用している外部サービスの仕様
などをクライアントが意識しなくてもよいようにする。
• クライアント同士で調停しなくてもいいようにする。
• 共有リソースの操作はサービス側で適切に排他して行う。
nginx の例だと…
• 「APの切り離し」や「ロードバランサの更新」などが
公開 API になる。
• API を提供するエージェントは Virtual IP などを使って
真の IP アドレスを隠蔽しておく。
• オペレーションの並列度を制御するために、queue + worker
方式で nginx に対するオペレーションを行う。
• 並列度の制御方法はいろいろあるので、別の方法でもいい。
こんな感じ
nginx
nginx
Operation
1
Operation
2
nginx
operator
service
公開インターフェイスで
オペレーションを依頼
queue worker
なんかいい感じにやる
Virtual IP でサービスを提供
まとめ
ssh に頼らず
インターフェイスでオペレーションしよう!!

More Related Content

PDF
Vagrant環境のAnsibleを速くしたい
PDF
AWSをコードで定義する
PPTX
Pythonユーザのための構成管理入門 #pyconapac
PDF
シンプルなシステム構成フレームワークalnair
PDF
Elixir Meetup #1 Loggerの構造と拡張
PDF
Ansible 2.0 のサマライズとこれから
PDF
PostgreSQL on Amazon EC2の可能性
PDF
Ansible 入門 #01 (初心者向け)
Vagrant環境のAnsibleを速くしたい
AWSをコードで定義する
Pythonユーザのための構成管理入門 #pyconapac
シンプルなシステム構成フレームワークalnair
Elixir Meetup #1 Loggerの構造と拡張
Ansible 2.0 のサマライズとこれから
PostgreSQL on Amazon EC2の可能性
Ansible 入門 #01 (初心者向け)

What's hot (20)

PDF
Ansible入門
PDF
DynamoDBのまえにキャッシュおく奴
PPTX
Ansible ではじめるインフラのコード化入門
PDF
ChefとPuppetの比較
PPTX
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
PDF
Webサーバ構築で心がけるべき二つのこと
PDF
Lambdaによるクラウド型言語の実装
PDF
Ansible roleとinventoryの書き方
PDF
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
PPTX
OSC Tokyo fall LT~Dockerで分散処理をやってみた
PDF
Serverspec at Testing Framework Meeting
PDF
BOSHで始めるImmutable Infrastructure
PDF
BOSHでお手軽CFデプロイon AWS
PDF
ECS-CLI in Action
PDF
Ansibleで始めるインフラ構築自動化
PDF
Puppet on AWS
PDF
Processing LTSV by Apache Pig
PPT
Performance and Scalability of Web Service
PDF
JAWSUG版 PostgreSQL on Amazon EC2の可能性
PDF
Ansible tower 構築方法と使い方
Ansible入門
DynamoDBのまえにキャッシュおく奴
Ansible ではじめるインフラのコード化入門
ChefとPuppetの比較
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Webサーバ構築で心がけるべき二つのこと
Lambdaによるクラウド型言語の実装
Ansible roleとinventoryの書き方
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
OSC Tokyo fall LT~Dockerで分散処理をやってみた
Serverspec at Testing Framework Meeting
BOSHで始めるImmutable Infrastructure
BOSHでお手軽CFデプロイon AWS
ECS-CLI in Action
Ansibleで始めるインフラ構築自動化
Puppet on AWS
Processing LTSV by Apache Pig
Performance and Scalability of Web Service
JAWSUG版 PostgreSQL on Amazon EC2の可能性
Ansible tower 構築方法と使い方
Ad

Similar to No SSH (@nojima; KMC関東例会) (20)

PDF
成長を加速する minne の技術基盤戦略
PDF
OpenStack Liberty をインストールしてみた
PPTX
ネットワークエンジニアのための Puppet / Chef
PDF
Openstack SPICE console (icehouse) verification
PDF
テスト駆動インフラ構築-Chefとserverspecを使ったインフラ自動化のすすめ-
ODP
Raspberry Pi 2 誤自宅サーバー移行日記
PPTX
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
KEY
Web Operations and Perl kansai.pm#14
PDF
Ansible ではじめるサーバ作業の自動化
PDF
ゲームのインフラをAwsで実戦tips全て見せます
PDF
第1回 一撃サーバー構築シェルスクリプト勉強会
PDF
nginx入門
PDF
PaaSの作り方 Sqaleの場合
PDF
Apache cloudstack4.0インストール
PPTX
Cloudstack user group meeting in osaka
PDF
サーバー設定のお話
PDF
ArcBox のおさらいと最新情報
PDF
Word press on conoha このべん #3
PPTX
(続) はじめてのCloud Foundry
PPTX
PowerShell de Azure
成長を加速する minne の技術基盤戦略
OpenStack Liberty をインストールしてみた
ネットワークエンジニアのための Puppet / Chef
Openstack SPICE console (icehouse) verification
テスト駆動インフラ構築-Chefとserverspecを使ったインフラ自動化のすすめ-
Raspberry Pi 2 誤自宅サーバー移行日記
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
Web Operations and Perl kansai.pm#14
Ansible ではじめるサーバ作業の自動化
ゲームのインフラをAwsで実戦tips全て見せます
第1回 一撃サーバー構築シェルスクリプト勉強会
nginx入門
PaaSの作り方 Sqaleの場合
Apache cloudstack4.0インストール
Cloudstack user group meeting in osaka
サーバー設定のお話
ArcBox のおさらいと最新情報
Word press on conoha このべん #3
(続) はじめてのCloud Foundry
PowerShell de Azure
Ad

More from 京大 マイコンクラブ (20)

PDF
テキストファイルを読む💪 第1回
PDF
かわいくなろうとしたら語彙力が下がった話
PDF
Common Lisp入門
PDF
多倍長整数の乗算と高速フーリエ変換
PDF
つくってあそぼ ラムダ計算インタプリタ
PDF
Geometry with Unity
PDF
セミコロンレスc++
PDF
エンジニアと健康
PPTX
女の子になれなかった人のために
PDF
Pietで競プロしよう
ODP
もし太陽のコアがIntelCoreだったら
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
PDF
ドット絵でプログラミング!難解言語『Piet』勉強会
PDF
DTM練習会2017第1.5回 「伴奏の付け方」
PPTX
hideya流 テストプレイ観察術
PDF
暗号技術入門 秘密の国のアリス 総集編
PDF
C#でゲームを作る2016 第8回
PDF
C#でゲームを作る2016 第7回
テキストファイルを読む💪 第1回
かわいくなろうとしたら語彙力が下がった話
Common Lisp入門
多倍長整数の乗算と高速フーリエ変換
つくってあそぼ ラムダ計算インタプリタ
Geometry with Unity
セミコロンレスc++
エンジニアと健康
女の子になれなかった人のために
Pietで競プロしよう
もし太陽のコアがIntelCoreだったら
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
プログラムを高速化する話Ⅱ 〜GPGPU編〜
ドット絵でプログラミング!難解言語『Piet』勉強会
DTM練習会2017第1.5回 「伴奏の付け方」
hideya流 テストプレイ観察術
暗号技術入門 秘密の国のアリス 総集編
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第7回

No SSH (@nojima; KMC関東例会)