Slide 1

Slide 1 text

Kubernetesのマニフェストを それなりにCIしたい CircleCI User Community Meetup #2 Osaka @stormcat24

Slide 2

Slide 2 text

whois ‣ CyberAgent, Inc. ‣ Backend Engineer ‣ OpenSaaS Studio Tech Lead ‣ Docker/Kubernetes 実践コンテナ開発入門 Akinori Yamada stormcat24

Slide 3

Slide 3 text

book 1万部突破ベストセラー Docker/Kubernetes 実践コンテナ開発入門 (技術評論社) ※CircleCIについても触れています

Slide 4

Slide 4 text

この後、紀伊國屋書店へGo

Slide 5

Slide 5 text

場所提供をしたので 喋ることにしました

Slide 6

Slide 6 text

Kubernetesでの アプリケーション開発

Slide 7

Slide 7 text

予備知識:Pod Pod Dockerコンテナの集合体 nginx api

Slide 8

Slide 8 text

Podを複製 Deployment ReplicaSet Pod Pod Pod 予備知識:Deployment ReplicaSetの世代管理 基本的に、開発者はアプリケーションの デプロイ定義として、Deploymentリソースを定義・管理します

Slide 9

Slide 9 text

apiVersion: apps/v1 kind: Deployment metadata: name: echo labels: app: echo spec: replicas: 3 selector: matchLabels: app: echo template: metadata: labels: app: echo spec: containers: - name: echo image: gcr.io/your-organization/your-service:v0.0.1-01-g39f376a env: - name: HOGE value: fuga ports: - containerPort: 8080 マニフェストファイル deployment.yaml ※マニフェストファイルを Kubernetesクラスタに適用=デプロイ

Slide 10

Slide 10 text

Kubernetesにおける CI/CD

Slide 11

Slide 11 text

CIとCDは明確に分離し、 GitOpsなスタイルが潮流 アプリケーション リポジトリ デリバリ用リポジトリ ※Kubernetesの マニフェストファイル群を置く

Slide 12

Slide 12 text

CDの手法は色々ある ‣ CircleCIからkubectl ‣ Spinnaker ‣ ArgoCD ‣ Flux CD ‣ ローカルから直接kubectl

Slide 13

Slide 13 text

GitOpsスタイルのCD デリバリ用リポジトリ ≒ リポジトリへの変更がクラスタへのデプロイ 事実上、クラスタ操作をPRで行うことになる

Slide 14

Slide 14 text

CI CD ユニットテスト アプリケーションビルド Dockerイメージビルド DockerレジストリへPush クラスタの状態をsync マニフェストをクラスタに反映

Slide 15

Slide 15 text

課題感

Slide 16

Slide 16 text

CI CD ユニットテスト アプリケーションビルド Dockerイメージビルド DockerレジストリへPush クラスタの状態をsync マニフェストをクラスタに反映 マニフェストの検証が なされずに反映

Slide 17

Slide 17 text

apiVersion: apps/v1 kind: Deployment metadata: name: echo labels: app: echo spec: replicas: 3 selector: matchLabels: app: echo template: metadata: labels: app: echo spec: containers: - name: echo image: gcr.io/your-organization/your-service:v0.0.1-01-g39f376a env: - name: HOGE value: fuga ports: - containerPort: 8080 PRでの人力レビューには限界がある

Slide 18

Slide 18 text

アプリケーションは ユニットテストを含め検証の手法が豊富

Slide 19

Slide 19 text

マニフェストファイルもそうあるべきでは?

Slide 20

Slide 20 text

+

Slide 21

Slide 21 text

kind = Kubernetes in Docker CircleCI上に Kubernetesクラスタを構築できる

Slide 22

Slide 22 text

version: 2 jobs: kind: machine: image: circleci/classic:201808-01 steps: - checkout - run: name: Install kubernetes cluster with kind command: | curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/download/v0.6.1/kind- linux-amd64 chmod +x kind sudo mv kind /usr/local/bin - run: name: Start cluster command: | kind create cluster --name test-cluster --image kindest/node:v1.14.9 - run: name: Waiting for ready command: | READY="" while [ "$READY" != "True" ] do sleep 2 READY=`kubectl get node -o=jsonpath='{range .items[*]}{range @.status.conditions[? (@.type == "Ready")]}{@.status}{end}{end}'` done echo "Node is ready" echo "Current running pods are the follows:" kubectl get --all-namespaces pod machineモードで kindインストール クラスタ起動  クラスタ起動待ち

Slide 23

Slide 23 text

クラスタ起動

Slide 24

Slide 24 text

これでCircleCIの中で Kubernetesクラスタに いろいろできる

Slide 25

Slide 25 text

考えられるワークロード ‣ マニフェストの反映でエラーでないかチェック ‣ 実行時エラー確認 ‣ マニフェスト反映 → クラスタに対してE2Eテストの実行 ‣ マニフェストの妥当性のチェック ‣ Open Policy Agent(OPA) / gatekeeper ‣ 必須なlabelやannotationのチェック ‣ イメージや環境変数のチェック etc

Slide 26

Slide 26 text

CI (CDのCIと)CD ユニットテスト アプリケーションビルド Dockerイメージビルド DockerレジストリへPush クラスタの状態をsync マニフェストをクラスタに反映 マニフェスト妥当性チェック ※これからはCDのCIが大事

Slide 27

Slide 27 text

まとめ ‣ CircleCI + kindで気軽に揮発的なKubernetesクラスタが作れる ‣ OPAやgatekeeperで、制約を設けることでPRレビューで漏れがちなミ スをチェックしやすくなる ‣ GitOpsの推進と、デプロイの心理的安全性の確保 ‣ アプリケーションが巨大(マイクロサービスとか)になると、CircleCI で全てのリソースを展開することが難しい

Slide 28

Slide 28 text

おわり