Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KubernetesのマニフェストをそれなりにCIしたい

stormcat24
December 10, 2019

 KubernetesのマニフェストをそれなりにCIしたい

CircleCI ユーザーコミュニティミートアップ #2

stormcat24

December 10, 2019
Tweet

More Decks by stormcat24

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. 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クラスタに適用=デプロイ

    View Slide

  10. Kubernetesにおける
    CI/CD

    View Slide

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

    View Slide

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

    View Slide

  13. GitOpsスタイルのCD
    デリバリ用リポジトリ

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

    View Slide

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

    View Slide

  15. 課題感

    View Slide

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

    View Slide

  17. 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での人力レビューには限界がある

    View Slide

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

    View Slide

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

    View Slide

  20. +

    View Slide

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

    View Slide

  22. 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インストール
    クラスタ起動 
    クラスタ起動待ち

    View Slide

  23. クラスタ起動

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  28. おわり

    View Slide