ようへいの日々精進XP

よかろうもん

第9回 コンテナ型仮想化の情報交換会@福岡に参加してお話させて頂いたのでメモ

ども、精進不足のかっぱです。

tl;dr

大雪の為に延期になっていた「コンテナ型仮想化の情報交換会@福岡」が満を持して開催されました。

ct-study.connpass.com

まずは、主催、運営された @ten_forward さん、会場を提供して下さった GMO ペパボの皆さんにお礼を申し上げたいと思います。また、登壇された皆さん、参加された皆さん、大変お疲れ様でした。

ということで、著名な登壇者の方々の合間を縫って Amazon ECS と ECR のお話をさせて頂いたので、他の登壇者の方の資料と聴講メモ、自分の発表の言い訳等を少し書いてみたいと思います。


発表

プログラム

13:50 - 14:00    オープニング・勉強会の紹介 
14:00 - 14:40   Linux コンテナの基礎 (仮)   @ten_forward
14:40 - 14:50   alpineの基礎についてなにか    tahira さん
14:50 - 15:30   CI における Docker の使いかた〜ヌーラボの場合〜 ( 仮 )   @ikikko さん
15:30 - 15:50   休憩  
15:50 - 16:30   人間たちとsystemd (仮)    @udzura さん
16:30 - 16:50   Amazon ECS と Amazon ECR 超概要+時間があったら Demo    @inokara さん
16:50 - 17:00   休憩  
17:00 - 17:20   Dockerとchrootによるアプリケーションデプロイ    @y_uuk1 さん
17:20 - 17:50   rcon and capcon internals   @matsumotory さん

上記にあわせて LT もありました。

資料群

資料について、個別に掲載しようと試みましたが、ほとんどの資料については以下のページに纏まっていますので御覧ください。

ct-study.connpass.com

Linux コンテナの基礎 (仮)

@ten_forward さんの Linux コンテナの基礎技術に関するお話。何度か聴講させて頂いたことがありますが、毎回とても解りやすく Linux コンテナの基礎技術について理解を深めることが出来ています。今回はデモを交えて Namespece や cgroup の挙動について解説して頂き、自分でも試してみたいと考えています。

alpineの基礎についてなにか

最近の Docker コンテナダイエットブームの火付け役である(と自分は思っている)Alpine Linux と既存の CentOS コンテナイメージについて各種観点で比較、計測、検証の内容を紹介頂きました。

Alpine Linux 自身のイメージは 5MB という小ささにも関わらず、やりたいことを実現しようとすると結局は太る(リバウンド問題)という問題をどのように解決していくかが今度の課題であるとのこと。確かに、リバウンド問題あるよなあ。

CI における Docker の使いかた〜ヌーラボの場合〜 ( 仮 )

公私共に Backlog や Cacoo でお世話になっている Cacoo さんがどのように Docker を利用しているのかのディープなお話。Jenkins のスレーブサーバーで CI / CD の実行環境として主に利用されているとのことで、ハマりポイントやその解決策等を具体的に解説頂いてとても参考になりました。

人間たちとsystemd (仮)

タイトルのインパクトに負けない位 systemd の濃いお話を聞けました。自分自身、CentOS 7 を少し触る機会がありましたが、systemd を理解しておらず Apache を起動することが出来なかった一人間としてはこれからの systemd との関わりについて再考する良い機会となりました。

Amazon ECS と Amazon ECR 超概要+時間があったら Demo

後ほど。

Dockerとchrootによるアプリケーションデプロイ

@y_uuk1 さん自身が作られた droot という docker build からイメージを吸い上げて、任意のストレージ(レジストリ)から chroot 環境にデプロイするツールについて、作った経緯や実装、使い方を紹介頂きました。

github.com

droot 自体は利用したことはありませんが、Docker がもてはやされている中で Docker の良い部分と悪い部分を的確に見極めて、良い部分だけを適切に利用して自身の課題を改善されている姿勢が素晴らしいと思いますし、Docker や Linux のコンテナ技術についてちゃんと理解されているからこその結果なんだろうなと感心しかありませんでした。

droot 試してみたいと思います。

rcon and capcon internals

@matsumotory さん自身が作れた rcon という動的にコマンドのリソース制御を行う mruby コマンドラインツールの実装とその基礎技術について紹介頂きました。また、capcon は任意のコマンドの特権を限定するツールとのことですが、実装に至っていない経緯等もなぜ動かないかまでを詳細にお話頂きました。

github.com

Linuxカーネルやコンテナの要素技術をしっかりと抑えていらっしゃるからこその詳細なお話で改めて資料を読み返して少しでも理解を深めたいと思います。

ちなみに Linux Capability という言葉についてちゃんとした認識が無かったので man してみたけど...

おおってなりました(汗。

rcon 試してみたいと思います。

LT: LXC コンテナのモニタリングと schroot について

schroot 知らなかった...。本当に奥深いと思います。

LXC コンテナのモニタリングについては以下のように @ten_forward さんが言及されています。

LT: STNSとDocker

Dockerfile のテンプレートを ERB で書くという発想は無かったので試してみたいと思います。

ちなみに STNS については以下の記事も一緒に読ませて頂きました。

ten-snapon.com

ten-snapon.com

STNS は Toml ファイルで SSH 公開鍵とユーザーグループを管理する LDAP のようなツールとのことです。


自分の発表について

まずは反省点

一晩寝て、冷静に考えてみると...素晴らしい発表の狭間で自分の発表のダメさがとても目立ったので反省点を整理。

  • 時間を意識する(発表に一生懸命になって時間超過してしまい運営者の方に迷惑を掛けてしまった...タイトルには「時間があったら Demo」って書いてあったのに...)
  • 声量(言葉が出てこない、噛む→自信喪失→声が小さくなる...)
  • デモはしっかりとした事前準備と文字は大きめに(以前にデモで失敗していたので動画撮っておいてドヤ顔で再生したら文字がちっちゃくなっていて何やっているか解らない状態だったかも)

そして、やっぱり内容がなあ...実際に何かを作ったり、ちゃんと調べたり、運用して死ぬような思いをされたりした方の発表には重みがあって聴き応えがあるし、参考に出来る部分も多いが、自分の発表は薄い、そして、薄いことを小ネタで誤魔化そうとするのが更に良くない...。

改めて、発表の時のしゃべり方や進め方等を振り返ると聞いてくださる方に対して失礼な感じになっていなかったかとても不安であるが、以下の記事を改めて読んで今後の糧にしたいと思う。とにかく反省。

shin1x1.hatenablog.com

資料

speakerdeck.com

冒頭のアンケートで ECS や ECR を実際に運用されている方がいらっしゃってマサカリ覚悟でお話させて頂きました。これを機会に ECS や ECR ユーザーが増えて、色々なユースケースや知見が聞けるようになると嬉しいなあと思います。

デモについて

デモで使った各種ファイルは以下にアップしている。

github.com

ecs-cliAWS SDK を rake コマンドで叩けるようにしてみたもの。詳しくは README を...。


おまけ

全てまとめきれていないけど...聴講メモ。

第9回 コンテナ型仮想化の情報交換会@福岡

# コンテナ型仮想化の情報交換会の経緯

- 福岡初開催
- Docker に偏らない
- Linux に偏らない

# Linux コンテナの基礎 (仮)

## 自己紹介

- tenforward さん
- ファーストサーバー
- Plamo Linux メンテナ
- LXC / LXD の開発に参加

## 今日の目標

- コンテナの概要を理解する
- Linux カーネルが持つコンテナ機能について

## コンテナとは

- カーネルの機能
- 隔離された空間でプロセスを実行する
- リソース制限
- カーネルから見ると普通にプロセスが起動するだけ
 - 起動の際に隔離を指示
- 複数の独立した空間をつくり、リソースを分割、配分する
- 隔離化

## コンテナのメリット

- 高密度化
- オーバーヘッド小
- プロセスを隔離するだけなのでアプリケーションプロセスだけを起動することが出来る

## デメリット

- 仕組上の仕様
- 異なる OS のアプリケーションを動かすことが出来ない

## Linux におけるコンテナの仕組み

### 実現するための機能

- Namespce
 - OS リソースの隔離
- cgroup
 - 物理リソースに対する制限
- その他

### Linux のコンテナ実装例

- Docker
 - libcontainer
- LXC / LXD
 - システムコンテナ
 - init が立ち上がる
- OpenVZ
 - 古くからある実装の一つ(2000 年くらいから...)
- rkt
- systemd
- MINCS
 - シェルスクリプトで書かれたコンテナ実装
- libcontainer

### Namespace

- Mount Namespace(カーネル 2.4.19 から)
- PID Namespace(カーネル 2.6.24 から)
 - PID 1 
 - ホストから見ると別の PID を持つ
- IPC Namespace
- User Namespace
 - 独立した UID/GID 空間と外部空間のマッピング
- cgroup

### Namspace の操作 / Demo

### Namespace の demo

- unshare
- 各リソースのネームスペースを作成
- mount --make-private
- unshare -U → User Namespace を作成する unshare -U --map-root-user -- /bin/bash → ファイル作成 → ホスト側から見ると一般ユーザー権限となっている

### cgroup とは

- プロセスをグループ化し、グループに対してリソース制限を行う
- コンテナ専用の仕組みではない
- プロセスグループに対してリソースの制限

- サブシステム
 - cpu
 - cpuset
 - device
 - memory
 - blkio
 - net_cls
  - パケットに識別子をつけて tc と netfilter でコントロール可能になる
 - pids
  - fork() や clone() の回数を制限することが出来る

### demo

### cgroup v2

- cgroup には問題がある
 - 複雑過ぎ
 - サブシステム同士の連携が取れない

## まとめ

- Namespace
 - OS リソースの隔離
- Cgroup
 - ホストのリソース隔離

## 質問

- メモリの割当
 - カウンターがある

# alpineの基礎についてなにか

## 自己紹介

- tahira さん

## Alpine Linux とは

## 使ってみる

## Alpine はチョーちっちゃい

- 5MB
- pull 速い(6 秒)
- 100 回ビルドしたら CentOS と比較すると差異は無かった
- 1000 個起動しても差異は無かった

## Alpine を使う理由

- デプロイやビルドの頻度が高い場合
- 常に最新の状態が保てる
- Blue Green デプロイメント

## tips

- apk コマンド
 - --no-cache 
 - --virtual
- 結局太る

# CI における Docker の使いかた〜ヌーラボの場合〜 ( 仮 ) 

## 自己紹介

- @ikikko
- nulab
- Cacoo は Flash から HTML5 等に移行中

## CI で使う Docker

- ジョブの実行
- CI のクラスタ

## CI を取り巻く環境

### サービスで使っている技術

- JVM が基本
- 他、色々あります

### Ci / CD の概要

- Backlog Git で管理
- インフラも Code
- Packer + Ansbile → Serverspec

### Jenkins の仕事

- 全てのジョブを Dockernize した
- 170 ジョブ/day
- 260 ビルド/day

### Jenkins Typetalk Plugin

- Hubot 止めた
- Typetalk plugin

## CI でのユースケース

### Jenkins Backlog Plugin
### メンバーやサービスが増えた

- テストするブランチが増えた
- テスト実行に必要な環境がバラバラ

### CI における問題

- スローテスト
- スレーブのメンテが大変

### Docker が解決したこと

- スローテスト
 - ブランチ毎に独立した Docker コンテナを動かすことで待つ必要がなくなった
- スレーブのメンテ
 - スレーブには docker を入れるだけ

### 5 tips(5 つのキーポイント)

- スレーブの構築方法をシンプルに保つ
 - プロジェクトに必要なものは Dockerfile に
 - 最低限のインストール
 - EC2 インスタンスはオンデマンド?スポット?インスタンスサイズは?
 - スレーブの起動が速い
 - どこでもスレーブが立てられる
- コンテナ内で複数プロセスを実行する
 - ローカル開発環境と同じ設定でテストが可能
 - バージョンの維持は? → Dockerfile をメンテナンスするということで割りきっているのか?
- イメージをキャッシュする
 - 依存ライブラリのキャッシュをどうするか
  - ホストディレクトリをマウントする
   - 複数ジョブ間で共有することが出来る(メリ)
   - パーミッション、ロック問題(デメ)
  - 事前ビルド
   - パーミッションに関わる問題がない
   - 依存関係を変更した場合にはビルドし直す
  - 外部キャッシュ
   - 初回実行でもちょっぱや(メリ)
   - 外部キャッシュをメンテしなければいけない(デメ)
- ビルド後にコンテナを削除する
 - 成果物の保持
  - ボリュームオプション
  - --rm オプションを付ける
   - パーミッション問題
  - 成果物をコンテナから取り出す
- 必要なツールを Dockernize する
 - アーカイブを S3 にアップする等
 - Docker 化しておく

### Docker を導入した結果...

- ビルド時間が早くなりました
- CI プロセスがポータブルに

## まとめ

- CI を Docker を始めるのに良いスタート

# 人間たちとsystemd (仮)

## 自己紹介

- @udzura
- YAO(Yat Another OpenStack Library)

## systemd 概要

- init プロセスが立ち上がる
- init のその代替
- upstart
- systemd
- Rethinking of PID 1

## systemd を使ってみる

- Unit ファイル
- cron っぽい使い方も出来る
- logging は journald

## systemd とリソース制限

### ulimit

- リソースを制限するやつ
- cpu やメモリ
- systemd.exec
 - unit ファイルに宣言的に書く
- CPUQuota

### systemd とファイルシステム

- PrivateTmp 設定

### まとめ

- ただの init 代替ではない
- cgroup や Linux namespace と組み合わせるといろいろと出来そう 

## container vs systemd

- systemd だけで出来ることは結構ある

# Dockerとchrootによるアプリケーションデプロイ

## Droot

- https://github.com/yuuki/droot
- tarball デプロイメント支援ツール
- symlink による atomick deploy
- mount -o bind /var/log /var/containe...

## Linux ケーパビリティ

- chroot は特権プロセスでないと...

## コンテナツール向けパッケージ

- https://github.com/docker/docker/tree/master/pkg

## まとめ

- Docker でイメージを作って chroot で実行
- コンテナは自分で作れる

## 質問

- はてな内で少しずつ使われている

# rcon and capcon internals

## コンテナ要素技術

### cgroup

- プロセスグループのリソース制御
- CPU や I/O やメモリ
- cgroupfs

### cgroup の活用例

- mod_mruby による Apache のリソース制御

### アクセス制御モデルの復習

- 任意アクセス制御
- 強制アクセス制御

### Linux capability

- 従来の DAC 権限の拡張
- 約 40 グループに分割されている
 - uid / gid 変更の特権

### Permitted と Effective

- Permitted は許可
- Effective は実効

### Capability の活用例

- mod_process_security
 - Apache httpd の suEXEC スレッド版

## rcon

- コマンドのリソース制御
- cgroup のゴミ掃除
- ワンラインで制御出来る
- mruby でワンバイナリ

## schroot

- chroot のラッパー
- overlayfs