Slide 1

Slide 1 text

CircleCI + Kind による Kubernetes E2E テスト チェシャ猫 (@y_taka_23) CircleCI User Community Meetup (2019/08/23) #circlecijp

Slide 2

Slide 2 text

Kubernetes 使ってる人? #circlecijp

Slide 3

Slide 3 text

覇権 OSS としての Kubernetes ● Kubernetes を前提とした技術の台頭 ○ 基盤としてのスケーラブルな設計 ○ パーツとしての Kubernetes の機能群 ○ いわば “The Platform of Platforms” ● ユースケースに応じたカスタマイズ ○ Webhook で独自の処理を追加 ○ Operator Pattern で独自リソースを定義 #circlecijp

Slide 4

Slide 4 text

一方で Kubernetes ゆえの闇も ● そもそもシステムとして複雑 ○ 多数のコンポーネントが連携 ○ パーツとして隠蔽されている状況が把握しづらい ○ 変更や故障の影響範囲が 広くなりやすい ● 実際に動かさないと検証が困難 ○ 複数のカスタマイズがお互い干渉しないか? ○ バージョンアップしても大丈夫か? #circlecijp

Slide 5

Slide 5 text

手軽に使い捨てできる テスト用クラスタが欲しくなる #circlecijp

Slide 6

Slide 6 text

Kind https://github.com/kubernetes-sigs/kind #circlecijp

Slide 7

Slide 7 text

Kind でローカルクラスタ構築 ● Multi-Node のクラスタが作成可 ○ 現状、他ツールでは対応不可 ○ コンテナを Kubernetes の Node に見立てる ● 高いカスタマイズ性 ○ Kubernetes のバージョン指定 ○ クラスタの設定項目もほぼ自由に上書き可能 ● Kubernetes 本体のテストでも使用 #circlecijp

Slide 8

Slide 8 text

Kubernetes IN Docker https://github.com/kubernetes-sigs/kind #circlecijp

Slide 9

Slide 9 text

Docker OS #circlecijp

Slide 10

Slide 10 text

Docker OS Container (K8s Node) Container (K8s Node) (K8s は Kubernetes の略) #circlecijp

Slide 11

Slide 11 text

Docker OS Container (K8s Node) Container (K8s Node) Docker Docker K8s Container K8s Container K8s Container K8s Container (K8s は Kubernetes の略) #circlecijp

Slide 12

Slide 12 text

Kind でローカルクラスタ構築(再掲) ● Multi-Node のクラスタが作成可 ○ 現状、他ツールでは対応不可 ○ コンテナを Kubernetes の Node に見立てる ● 高いカスタマイズ性 ○ Kubernetes のバージョン指定 ○ クラスタの設定項目もほぼ自由に上書き可能 ● Kubernetes 本体のテストでも使用 #circlecijp

Slide 13

Slide 13 text

 CircleCI 上でクラスタが立つ! #circlecijp

Slide 14

Slide 14 text

CircleCI + Kind 利用フロー 1. クラスタのセットアップ ○ Kind で Kubernetes クラスタを立ち上げ 2. テスト対象アプリのビルド ○ Node コンテナ外側で docker build ○ できた Image を Node コンテナ内側に転送 3. テストシナリオの実行 ○ kubectl で Kubernetes クラスタを操作 #circlecijp

Slide 15

Slide 15 text

CircleCI + Kind 利用フロー 1. クラスタのセットアップ ○ Kind で Kubernetes クラスタを立ち上げ 2. テスト対象アプリのビルド ○ Node コンテナ外側で docker build ○ できた Image を Node コンテナ内側に転送 3. テストシナリオの実行 ○ kubectl で Kubernetes クラスタを操作 #circlecijp

Slide 16

Slide 16 text

クラスタ構成の指定 (cluster.yaml) #circlecijp

Slide 17

Slide 17 text

CircleCI ビルド設定 (config.yml) #circlecijp

Slide 18

Slide 18 text

#circlecijp

Slide 19

Slide 19 text

#circlecijp

Slide 20

Slide 20 text

CircleCI + Kind 利用フロー 1. クラスタのセットアップ ○ Kind で Kubernetes クラスタを立ち上げ 2. テスト対象アプリのビルド ○ Node コンテナ外側で docker build ○ できた Image を Node コンテナ内側に転送 3. テストシナリオの実行 ○ kubectl で Kubernetes クラスタを操作 #circlecijp

Slide 21

Slide 21 text

Docker Virtual Machine Executor Image docker build --tag user/myapp . #circlecijp

Slide 22

Slide 22 text

Docker Virtual Machine Executor Container (K8s Node) Container (K8s Node) Docker Docker Image kind load docker-image user/myapp --nodes node1,node2 Image Image #circlecijp

Slide 23

Slide 23 text

CircleCI + Kind 利用フロー 1. クラスタのセットアップ ○ Kind で Kubernetes クラスタを立ち上げ 2. テスト対象アプリのビルド ○ Node コンテナ外側で docker build ○ できた Image を Node コンテナ内側に転送 3. テストシナリオの実行 ○ kubectl で Kubernetes クラスタを操作 #circlecijp

Slide 24

Slide 24 text

https://github.com/onsi/ginkgo #circlecijp

Slide 25

Slide 25 text

まとめ ● Kubernetes のプラットフォーム化 ○ クラスタの現物がないと動作検証が辛い ● Kind でローカルクラスタ構築 ○ コンテナによって Multi-Node を実現 ○ 構成や設定のカスタマイズも容易 ● CircleCI 上でクラスタが動かせる ○ E2E テストを CI フローの中で実行可能 #circlecijp

Slide 26

Slide 26 text

Enjoy E2E Testing with Kind! Presented by チェシャ猫 (@y_taka_23) #circlecijp