Using Kubernetes on Google Container Engine Etsuji Nakai Cloud Solutions Architect at Google November 11, 2016 ver1.1
Docker and Container Technology
Docker の基本機能 Dockerfile ① コンテナイメージを自動作成 OS ファイル アプリケーション ライブラリー アプリケーション バイナリー イメージの 作成手順を記載 コンテナ イメージ アプリケーション実行に必要な 最低限のファイルを提供 ② コンテナイメージを保存・公開 ③ ホストサーバーに  イメージを配布・実行
Linux コンテナの概要 コンテナ 物理サーバー/仮想マシン アプリケーション アプリケーション ・・・ 物理サーバー/仮想マシン Linux カーネル ・・・ コンテナ 通常の Linux 環境 コンテナで分割した環境 コンテナごとに 見える環境が異なる すべてのアプリケーション から同じ環境が見える ▪ 「 Linux コンテナ」は、プロセスグループごとに独立した OS 環境を見せる技術 ● ローカルディスクの内容(ディレクトリー内のファイル) ● ネットワーク環境( NIC 、 IP アドレス) ● CPU 、メモリー割り当てなど Linux カーネル アプリケーション アプリケーション
Namespace によるリソースの分割 ▪ コンテナによって分離されるリソースにはいくつかの種類がありますが、内部的には、 それぞれ異なる技術で実現されています。 ● ファイルシステムの分離  → Mount namespace (kernel 2.4.19) ● ホストネームの分離 → UTS namespace (kernel 2.6.19) ● IPC の分離 → IPC namespece (kernel 2.6.19) ● ユーザ( UID/GID )の分離 → User namespace (kernel 2.6.23 〜 kernel 3.8) ● プロセステーブルの分離  → PID namespace (kernel 2.6.24)   ● ネットワーク設定の分離  → Network Namepsace (kernel 2.6.24) ● リソース配分の制御 → Control groups ※ 参考資料「 Namespaces in operation, part 1: namespaces overview 」 http://lwn.net/Articles/531114/ ▪ Linux コンテナはこれらの機能を組み合わせて実現されるものであり、「コンテナ」という単一の技 術があるわけではありません。
コンテナイメージの管理機能 ▪ 「コンテナイメージ」の実体は、コンテナ に割り当てるディスクイメージに、ネット ワーク設定などの環境情報を付与したもの にすぎません。 ▪ Docker の特徴は、次のような「イメージ 管理機能」にあります。 ▪ Dockerfile : コンテナイメージを自動作成する仕組み ▪ Image Registry : コンテナイメージを共有・配布する仕組み コンテナー アプリケーション ディレクトリツリー ホスト OS にマウント ルートディレクトリ として割り当て コンテナイメージ
Docker Quick Tour
コンテナとイメージのライフサイクル 参考: Docker におけるコンテナのライフサイクル http://d.hatena.ne.jp/enakai00/20140628/1403933390 保存イメージ スナップ ショット コンテナ起動時に スナップショットを作成 × run commit rm プロセス スナップ ショット stop start 保存イメージ コンテナを停止するとプロセスが停止 (ディスクイメージは残っている) コンテナを削除すると ディスクイメージを破棄 ディスクイメージを複製して 保存イメージとして登録
コンテナとのネットワーク通信 コンテナ ホスト Linux vethXX eth0 docker0 eth0 外部ネットワーク 172.17.42.1 # docker run -d -p 8000:80 ... ホスト Linux の IP アドレスに接続 TCP 8000 TCP 80 ポート フォワー ディング ▪ 外部ネットワークとの通信は、ホスト Linux で NAT が行われます。 ● コンテナから外部へは、デフォルトで IP マスカレードが行われます。 ● 外部からコンテナへは、コンテナ起動時のオプションでポートフォワーディングを設定します。
Docker の基本操作 ▪ Apache HTTP サーバーを起動して index.html を用意する例です。 $ docker search httpd NAME DESCRIPTION STARS OFFICIAL AUTOMATED httpd The Apache HTTP Server Project 780 [OK] centos/httpd 9 [OK] ... $ docker pull httpd $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE httpd latest 3076aa23a73c 9 days ago 193.3 MB $ docker run -d --name webserver -p 8080:80 httpd:latest a101d9d6fbf78a5c1b0fcf1339f1ee1a4f94eb7c9a74e51ea769d2050f84712c $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a101d9d6fbf7 httpd:latest "httpd-foreground" 2 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp webserver $ echo '<h1>Hello, World!</h1>' > /tmp/index.html $ docker cp /tmp/index.html webserver:/usr/local/apache2/htdocs/index.html
Docker の基本操作 ▪ コンテナ内部で bash を起動して、コンテナ内の様子を確認する例です。 $ docker exec -it webserver bash root@a101d9d6fbf7:/usr/local/apache2# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 23:20 ? 00:00:00 httpd -DFOREGROUND daemon 8 1 0 23:20 ? 00:00:00 httpd -DFOREGROUND daemon 9 1 0 23:20 ? 00:00:00 httpd -DFOREGROUND daemon 10 1 0 23:20 ? 00:00:00 httpd -DFOREGROUND root 118 0 2 23:38 ? 00:00:00 bash root 124 118 0 23:38 ? 00:00:00 ps -ef root@a101d9d6fbf7:/usr/local/apache2# ip a ... 5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue state UP group default link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff inet 172.18.0.2/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe12:2/64 scope link valid_lft forever preferred_lft forever root@a101d9d6fbf7:/usr/local/apache2# df Filesystem 1K-blocks Used Available Use% Mounted on none 10188088 5695284 3952236 60% / tmpfs 304344 0 304344 0% /dev tmpfs 304344 0 304344 0% /sys/fs/cgroup /dev/sda1 10188088 5695284 3952236 60% /etc/hosts shm 65536 0 65536 0% /dev/shm root@a101d9d6fbf7:/usr/local/apache2# exit
From Borg to Kubernetes
Google におけるコンテナの活用 ▪ Large-scale cluster management at Google with Borg ● http://research.google.com/pubs/pub43438.html ▪ Borg, Omega, and Kubernetes ● http://research.google.com/pubs/pub44843.html
プラネットスケールのサービスを実現するポイント ▪ 全世界のすべてのデータセンターで共通化されたインフラの提供 ▪ OS レイヤーを隠蔽して、アプリケーションレベルでの管理に集中 ▪ リソーススケジューラーによるアプリケーションデプロイの最適化 ▪ アプリケーションのオートスケールとサービスの抽象化 ▪ データストアとアプリケーションの分離 分散ソフトウェア技術で実現した Datacenter as a Computer Borg/Omega
Borg / Omega の特徴 ▪ コンテナを用いたアプリケーション実行基盤 ▪ OS レイヤーを隠蔽して、アプリケーションレベルでの管理に集中 ▪ リソーススケジューラーによるアプリケーションデプロイの最適化 http://www.hpts.ws/papers/2015/wilkes.pdf
Kubernetes ▪ オープンソースコミュニティで開発されているコンテナオーケストレーションツール ▪ Google におけるコンテナ管理の経験を踏まえて、 Google のエンジニアが設計を主導 ▪ ベアメタルサーバー上のコンテナと仮想マシン上のコンテナを管理可能 ▪ マイクロサービスを効率的にデプロイ、アップデートする機能として、コンテナ (Pod) のオートスケール、 Blue Green Deployment 、 Rolling Update などを提供
Deployment と Service によるマイクロサービス管理 ▪ Deployment :同一の Pod を複数起動してスケールする仕組みを提供 ▪ Service :同一の Pod に代表 IP アドレスを割り当てて抽象化する仕組みを提供 ReplicaSet - replicas: 3 - selector: - app: MyApp - version: v1 Deployment - name: MyApp Virtual IP Service - name: MyService
Blue Green Deployment ▪ 別バージョンの Pod 群を並列稼働して、 Service 定義の変更でアクセス先を切り替え ReplicaSet - replicas: 3 - selector: - app: MyApp - version: v1 ReplicaSet - replicas: 3 - selector: - app: MyApp - version: v2 Virtual IP
Rolling Update ▪ 同一の Deployment 配下の Pod を段階的に新バージョンに入れ替えることでサービスの ライブアップデートを実施 ReplicaSet - replicas: 3 - selector: - app: MyApp - version: v1 ReplicaSet - replicas: 3 - selector: - app: MyApp - version: v2 v2 を追加v1 を削除
GKE : Google Container Engine
GKE : Google Container Engine ▪ Google Cloud Platform で提供される Kubernetes のマネージドサービス環境 ▪ GUI/CUI 操作、 API リクエストにより Kubernetes のクラスタ環境を自動構築 ▪ Cloud SQL 、 Cloud Datastore などのデータストアサービスと連携可能 ▪ Service によるネットワーク管理と Cloud Load Balancing のグローバル・ロードバラン サーを自動連携
デモンストレーションをお楽しみください http://enakai00.hatenablog.com/entry/2016/08/10/152334
Thank You!

Using Kubernetes on Google Container Engine