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

Oracle Cloud Hangout Cafe - CICD最新事情

Oracle Cloud Hangout Cafe - CICD最新事情

oracle4engineer

June 10, 2021
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. CI/CD最新事情 Oracle Cloud Hangout Cafe – Season 4 #3 Yutaka

    Ichikawa Solutions Architect Oracle Corporation Japan Jun 09, 2021
  2. 2 Copyright © 2021, Oracle and/or its affiliates Profile Name

    • Yutaka Ichikawa/市川 豊 Belong • Solutions Architect Role • Principal Solution Engineer SNS • Twitter/GitHub/Qiita:cyberblack28 Blog • https://cyberblack28.hatenablog.com/ Materials • https://speakerdeck.com/cyberblack28/ Community • CloudNative Days Tokyo #cndt • Cloud Native Bright Future #cnbfmeetup Certified • Certified Kubernetes Administrator • Certified Kubernetes Application Developer Publications
  3. CI/CD これまでを見る • CIOps • 1.CI/CDのおさらい • 2.CIOpsについて CI/CD 今を見る

    • GitOps • 1.GitOpsについて • 2.CI & GitOps • 3.手元で始めるGitOps CI/CD これから見る • Progressive Delivery • Progressive Deliveryについて • Oracle’s DevOps • 1.OCI DevOps Service • 2.OKE & DevOps • 最後に • 参考資料 3 Copyright © 2021, Oracle and/or its affiliates Agenda
  4. 5 Copyright © 2021, Oracle and/or its affiliates 1.CI/CDおさらい CI/CDとは?

    CI(継続的インテグレーション)とは? CD(継続的デリバリー)とは? CD(継続的デリバリー)とCD(継続的デプロイ) CI/CDをまとめると! CI/CDのメリット CI/CDの難しさ
  5. 6 Copyright © 2021, Oracle and/or its affiliates CI/CD これまでを見る

    CI/CDとは? 1.CI/CDおさらい CI = Continuous Integration = 継続的インテグレーション CD = Continuous Delivery (or Deployment) = 継続的デリバリー(デプロイ)
  6. 7 Copyright © 2021, Oracle and/or its affiliates CI/CD これまでを見る

    アプリケーション開発に必要となるビルド、テスト、成果物(アーティファクト)の保存までの工程を自動化して、継 続的に行われる状態にすること • ソースコードの変更(更新)を契機に自動的にテストが開始されて、ソースコードの品質を担保 • ソースコードの変更(更新)を契機にアプリケーションビルド、アプリケーションテスト、コンテナイメージビルド、コンテナ イメージレジストリへの格納(プッシュ) CI環境を整備することで、早期バグの発見による品質向上、検証時間の短縮によるリリーススピード向上、開発者 が開発に集中できる環境でより良い開発サイクルを実現。 (etc.) CI(継続的インテグレーション)とは? 1.CI/CDおさらい
  7. 8 Copyright © 2021, Oracle and/or its affiliates CIOps CD(継続的デリバリー)とは?

    CI(継続的インテグレーション)によって生み出された成果物(アーティファクト)を、実際の環境(ステージングや プロダクション)へ自動的に配置すること • CIで生成された成果物をステージングやプロダクション環境へ反映 • CIでコンテナレジストリに格納したコンテナイメージをKubernetesクラスタへ反映 CD環境を整備することで、エンドユーザに影響を与えることなく、高頻度、安定かつ安全にアプリケーションのリリー スを実現。 (etc.) 1.CI/CDおさらい
  8. 9 Copyright © 2021, Oracle and/or its affiliates CIOps CD(継続的デリバリー)とCD(継続的デプロイ)

    CD(継続的デリバリー)は、CI(継続的インテグレーション)によって生み出された成果物(アーティファクト)を実際 の環境に配置する過程で、人による判断・承認プロセスを導入 1.CI/CDおさらい CD(継続的デプロイ)は、CI(継続的インテグレーション)によって生み出された成果物(アーティファクト)を実際 の環境に配置する過程で、人による判断・承認プロセスが無く、ノンストップ
  9. 10 Copyright © 2021, Oracle and/or its affiliates CIOps CI/CDをまとめると!

    1.CI/CDおさらい ソースコードの更新を契機にビルド、テストが進行して、アプリケーションがデプロイされるまでの工程が自動化された パイプライン ソースコードの修正を コードリポジトリに コミット/プッシュ CI/CDパイプラインによる ビルド、テスト、デプロイ
  10. 11 Copyright © 2021, Oracle and/or its affiliates CIOps CIとCDの範囲

    1.CI/CDおさらい ソースコード 修正 ビルド テスト デプロイ CI CD 「テスト」までがCI、「デプロイ」部分がCDという捉え方が一般的。 ※CIの拡張として「デプロイ」を含めてCDと捉えることもある
  11. 12 Copyright © 2021, Oracle and/or its affiliates CIOps CI/CDのメリット

    1.CI/CDおさらい • リリースサイクルの短縮により、市場ニーズに早く対応できる • テスト工程が組まれていることにより、アプリケーションの品質を担保できる • 各工程が自動化されたパイプラインのため、全体的な工数削減を見込める • 開発者は開発ロジックに集中できるため、開発効率の向上を見込める 最終的には、早く正確により良いサービスを提供できることにより、エンドユーザ様の満足度、企業競争力や収益の向 上につながる。
  12. 13 Copyright © 2021, Oracle and/or its affiliates CIOps CI/CDの難しさ

    1.CI/CDおさらい • CI/CD環境の構築、運用に乗せるまでは試行錯誤 • 多種多様で豊富なCI/CDツールの技術選定 • コストの検討 • 定期的なCI/CD環境のメンテナス 導入において、時間やコストも要するが、長い目で見たときにその分のメリットをどう見込むかが鍵 (etc.)
  13. 14 Copyright © 2021, Oracle and/or its affiliates 2.CIOpsについて Push型(コンテナアプリケーション開発)

    CIOpsにおける主な課題 CIOpsにおけるセキュリティリスクと管理の煩雑化 マニフェストの再現性
  14. 15 Copyright © 2021, Oracle and/or its affiliates CIOps Push型(コンテナアプリケーション開発)

    2.CIOpsについて ソースコードが更新されるたびにCIパイプラインが稼働して、アプリケーションテスト、コンテナイメージビルド、コンテナイメー ジプッシュ、CDパイプラインによるデプロイ。 CI/CD Container Image Registry テスト、イメージビル ド、イメージプッシュ、 デプロイ Dev Code & Config Repository Developer Staging Prod Image Pull CI/CDツールがテスト、ビルド、デプロイまでを実行 コード(マニフェスト含む) をプッシュ CI CD docker push kubectl apply
  15. 16 Copyright © 2021, Oracle and/or its affiliates CIOps CIOpsにおける主な課題

    2.CIOpsについて • CI側で全てのデプロイ先との連携、設定を管理する必要がある • CI側で全てのデプロイ先への権限が必要であるため、セキュリティリスクがある • デプロイ環境(Kubernetesクラスタ)の再現性が保証されない
  16. Dev/Staging/Prod 17 Copyright © 2021, Oracle and/or its affiliates CIOps

    CIOpsにおけるセキュリティリスクと管理の煩雑化 2.CIOpsについて CI/CD Container Image Registry Code & Config Repository Developer Read/Write Read Read/Write Read Read/Write apply Image Pull Kubernetesクラスタが増えるたびにセキュリ ティ含めた設定や権限管理も増えるため、 管理が煩雑となる。。 Kubernetesクラスタ外部での権限管理となるため、セキュリティリスクがある。。 K8S API
  17. 18 Copyright © 2021, Oracle and/or its affiliates CIOps マニフェストの再現性

    2.CIOpsについて CI/CD Container Image Registry Dev Code & Config Repository Developer Staging Prod Image Pull 1.パイプラインの実行順序が保証されるとは限らず、 適用されたクラスタ状態が想定と異なることに。。 2.ロールバックするにも、マニフェストの更新履歴を追うなど、 迅速性に欠けてしまう。。
  18. 20 Copyright © 2021, Oracle and/or its affiliates 1.GitOpsについて CIOpsにおける主な課題(再掲)

    GitOpsとは? Pull型(コンテナアプリケーション開発) GitOpsの課題を解消 GitOpsのメリット
  19. 21 Copyright © 2021, Oracle and/or its affiliates GitOps CIOpsにおける主な課題(再掲)

    GitOpsについて • CI側で全てのデプロイ先との連携、設定を管理する必要がある • CI側で全てのデプロイ先への権限が必要であるため、セキュリティリスクがある • デプロイ環境(Kubernetesクラスタ)の再現性が保証されない
  20. 22 Copyright © 2021, Oracle and/or its affiliates GitOps GitOpsとは?

    GitOpsについて a.はじまり Weaveworks社の実用、ブログ「Operations by Pull Request」(2017/08) https://www.weave.works/blog/gitops-operations-by-pull-request
  21. 23 Copyright © 2021, Oracle and/or its affiliates GitOps GitOpsとは?

    GitOpsについて b.GitOps実践ガイドライン(from Weaveworks) 1.コードとして記述できるものは、すべてGitに保存 2.Kubernetes CLIツール “kubectl”を直接使用しない 3.”オペレータパターン”に従ってKubernetesコントローラを使用 Kubernetes & Containerが前提 OpsのGit化
  22. 24 Copyright © 2021, Oracle and/or its affiliates GitOps GitOpsとは?

    GitOpsについて b.GitOps実践ガイドライン(from Weaveworks) • インフラのリソース構成、マニフェストをGitリポジトリに保存 • Gitリポジトリのマニフェストは、Pull Request経由で変更 • Gitリポジトリのマニフェストが変更されたら、その変更を自動でKubernetesクラスタに適用 • Kubernetesクラスタの状態とGitリポジトリのマニフェストと差異がある場合は、修正する もう少し具体化すると
  23. 25 Copyright © 2021, Oracle and/or its affiliates GitOps Pull型(コンテナアプリケーション開発)

    GitOpsについて Kubernetesクラスタ内に配置されたGitOpsオペレーターがConfigリポジトリを定期的にポーリングして、更新を検知し て更新内容をKubernetesクラスタに反映する仕組み。 CI Pipeline Container Image Registry Dev/Staging/Prod Code Repository Developer Image Pull Config Repository GitOps Operator apply manifest Code & Dockerfile ① Code Change & Git Push ④ Pull Request Merge ⑤ Polling & Sync ③ Pull Request ② Image Build & Test & Image Push CI CD 人による判断、 承認プロセス プルリクエストマージ後、GitOps オペレーターによりデプロイされるので人によるコ マンド操作が不要
  24. 26 Copyright © 2021, Oracle and/or its affiliates GitOps CIOpsの課題を解消

    GitOpsについて CodeとConfigのリポジトリを分けることで、相互の影響を回避および境界線の明確化。特権ユーザの認証情報を外 部に持つ必要が無く、APIを外部に公開する必要もない。 CI Pipeline Container Image Registry Dev/Staging/Prod Code Repository Developer Read Config Repository GitOps Operator apply Read/Write Read CodeとConfig のリポジトリを 分けることで相 互の影響を回避 できて、境界線 が明確。 認証情報を外部に持つ必要がないため、ク ラスタが増えても管理しやすく、スケール もしやすい。 K8S API Read/Write Read Read Read/Write Image Pull Read/Write
  25. 27 Copyright © 2021, Oracle and/or its affiliates GitOps GitOpsについて

    マニフェスト専用のGitリポジトリ上のマニフェストファイルの内容と実環境の状態が同一。マニフェストをGit管理することで、 履歴管理、ロールバック対応などが柔軟に行える。再現性を保証。 CI Pipeline Container Image Registry Code Repository Developer Config Repository Dev Staging Prod manifest Equal マニフェストファイルの内容と稼働しているKubernetes クラスタ状態が同一。 Git管理により履歴管理、ロールバックも容易。 CIOpsの課題を解消
  26. 28 Copyright © 2021, Oracle and/or its affiliates GitOps GitOpsについて

    • マニフェストファイルをGit管理 - デプロイ先に対して「誰が、何時、何」を変更したのか(変更差分)を履歴で追える - デプロイ先をいつでも前の状態に戻すこと(ロールバック)ができる - プルリクエストによるレビュー・マージプロセスを通すことで組織ガバナンスを適用できる • 自動化 - 手動コマンドによるヒューマンエラーの排除 - 運用コストの軽減 GitOpsのメリット
  27. 29 Copyright © 2021, Oracle and/or its affiliates 2.CI&GitOps ツールの傾向

    Kubernetes-nativeなCIツールTEKTON TEKTON Demo CI & CD Security
  28. 30 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    • CIツール ツールの傾向 CircleCI、TravisCI、GitHub Actions、GitLab Runnerなど、これまでも利用され続けているCIツールとGitOps ツールを組み合わせるケース。 KubernetesのCustomResourceとしてパイプラインを定義(Kubernetesマニフェスト)できる、Kubernetes- nativeなCIを実現できるTEKTONとGitOpsツールを組み合わせるケース。
  29. 31 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    • GitOpsツール ツールの傾向 Cloud Native関連のカンファレンスやコミュニティイベントでよく取り上げられているGitOpsツール。
  30. 32 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    ツールの傾向 https://event.cloudnativedays.jp/cndt2020/talks/9 https://speakerdeck.com/masayaaoyama/cndt2020-k8s-amsy810 動画 スライド https://event.cloudnativedays.jp/cndt2020/talks/6 https://speakerdeck.com/makocchi/why-not-find-your-favorite-gitops-tools 動画 スライド
  31. 33 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    Kubernetes-nativeなCIツールTEKTON KubernetesのCustomResourceとしてパイプラインを定義できるため、マニフェストファイルの作成、適用(kubectl apply)の流れで、CI環境を構築。
  32. 34 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    Kubernetes-nativeなCIツールTEKTON TEKTONのコンポーネント CIのワークフロー 基盤を提供 CIのワークフローに イベントトリガー機能を提供 TEKTON専用の CLIツール(tknコマンド) TEKTON専用の Web UI
  33. 35 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    Kubernetes-nativeなCIツールTEKTON TEKTONのコンセプト~Step / Task / Pipeline~ Step Task TEKTONでは実行する処理をStepという単位で設定。 複数のStepをまとめたものがTask。 Kubernetesクラスタ上で各TaskはPod内、Stepがコンテナとして実行 されるイメージ。 Pipeline 複数のTaskをまとめたものがPipeline。 Pipeline Task B Step 1 Step 2 Task A Step 1 Step 2 Step 3 Task D Step 1 Task C Step 1 Step 2 TEKTON公式ドキュメント: https://tekton.dev/docs/concepts/
  34. 36 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTONのCustom Resource Custom Resource名 概要 Task 各Stepの処理内容、パラメータを指定して、Taskを定義 TaskRun 定義したTaskを実行するために利用 Pipeline Pipelineを定義 PipelineRun 定義したPipelineを実行するために利用 PipelineResource Task、Pipelineで利用するリソース(Gitリポジトリやコンテナレジストリなど)を定義 マニフェストファイルの「kind」に、以下Custom Resource名を指定して、各処理内容を定義して適用(kubectl apply)するイメージ。
  35. 37 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTON Demo Pipeline Task OCIR (Oracle Cloud Infrastructure Registry) OKE (Oracle Container Engine for Kubernetes) GitHub Cloud Shell $ kubectl apply ① ② git clone image build image push
  36. 38 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTON Demo 1.Kubernetesクラスタの構築 2.TEKTONのインストール 3.TEKTON Dashboardのインストール $ kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml $ kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/latest/tekton-dashboard-release.yaml 「tekton-dashboard」ServiceのtypeをLoadBalancerに変更 $ kubectl get pods --namespace tekton-pipelines NAME READY STATUS RESTARTS AGE tekton-pipelines-controller-5cf4d4867f-ghdpd 1/1 Running 0 35s tekton-pipelines-webhook-57bfb4b4d7-lzrjn 1/1 Running 0 33s $ kubectl patch service tekton-dashboard -n tekton-pipelines -p '{"spec": {"type": "LoadBalancer"}}'
  37. 39 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTON Demo 4.TEKTON CLIのインストール(OCI Cloud Shellの場合) $ curl -LO https://github.com/tektoncd/cli/releases/download/v0.18.0/tkn_0.18.0_Linux_x86_64.tar.gz $ mkdir $home/bin $ tar xvzf tkn_0.18.0_Linux_x86_64.tar.gz -C $home/bin/ tkn $ export PATH="$PATH:$home/bin" 永続化したい場合は、「.bashrc」に記述 $homeにはホームディレクトリを指定 $ tkn version Client version: 0.18.0 Pipeline version: v0.24.1 Dashboard version: v0.17.0
  38. 40 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTON Demo 5.マニフェストの作成と適用 apiVersion: v1 kind: Secret metadata: name: basic-user-pass annotations: tekton.dev/docker-0: https://index.docker.io/v1/ type: kubernetes.io/basic-auth stringData: username: xxxxxxxxxxxxx password: xxxxxxxxxxxxx --- apiVersion: v1 kind: ServiceAccount metadata: name: build-bot secrets: - name: basic-user-pass ファイル名:01-secret-serviceaccount.yaml 定義内容: コンテナイメージレジストリ接続設定 サービスアカウント設定 適用: $ kubectl apply -f 01-sercret-serviceaccount.yaml
  39. 41 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTON Demo PipelineResource apiVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: hello-world-go-git spec: type: git params: - name: revision value: main - name: url value: https://github.com/xxxxxxx/xxxxxx.git ファイル名:02-gitPipelineRsource.yaml 定義内容:git cloneするコードリポジトリ設定 適用: apiVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: hello-world-go-image spec: type: image params: - name: url value: xxxxxx/hello-world-go ファイル名:03-imagePipelineResource.yaml 定義内容:image pushするイメージレジストリ設定 適用: $ kubectl apply -f 02-gitPipelineRsource.yaml $ kubectl apply -f 03-imagePipelineResource.yaml
  40. 42 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTON Demo Task apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: build-and-push spec: params: - name: pathToDockerFile default: $(resources.inputs.docker-source.path)/Dockerfile - name: pathToContext type: string default: $(resources.inputs.docker-source.path) resources: inputs: - name: docker-source type: git outputs: - name: builtImage type: image steps: - name: build-and-push image: gcr.io/kaniko-project/executor env: - name: "DOCKER_CONFIG" value: "/tekton/home/.docker/" command: - /kaniko/executor args: - --dockerfile=$(params.pathToDockerFile) - --destination=$(resources.outputs.builtImage.url) - --context=$(params.pathToContext) ファイル名:04-task.yaml 定義内容: git clone、kanikoでimage buildしてimage pushするStepを指定して、Taskを 定義 適用: $ kubectl apply -f 04-task.yaml
  41. 43 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTON Demo TaskRun apiVersion: tekton.dev/v1beta1 kind: TaskRun metadata: name: build-push-task-run spec: serviceAccountName: build-bot taskRef: name: build-and-push params: - name: pathToDockerFile value: Dockerfile resources: inputs: - name: docker-source resourceRef: name: hello-world-go-git outputs: - name: builtImage resourceRef: name: hello-world-go-image ファイル名:05-taskrun.yaml 定義内容: Taskを実行する定義 適用: $ kubectl apply -f 05-taskrun.yaml
  42. 44 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTON Demo Pipeline apiVersion: tekton.dev/v1beta1 kind: Pipeline metadata: name: build-push-pipeline spec: resources: - name: docker-source type: git - name: builtImage type: image tasks: - name: build-and-push taskRef: name: build-and-push resources: inputs: - name: docker-source resource: docker-source outputs: - name: builtImage resource: builtImage ファイル名:06-pipeline.yaml 定義内容: 定義したTaskを基に、実行するPipelineを定義 適用: $ kubectl apply -f 06-pipeline.yaml
  43. 45 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTON Demo PipelineRun apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: name: build-push-pr spec: serviceAccountName: build-bot pipelineRef: name: build-push-pipeline resources: - name: docker-source resourceRef: name: hello-world-go-git - name: builtImage resourceRef: name: hello-world-go-image ファイル名:07-pipelinerun.yaml 定義内容: Pipelineを実行する定義 適用: $ kubectl apply -f 07-pipelinerun.yaml
  44. 46 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTON Demo CRDとして確認可能 $ kubectl get crd | grep tekton clustertasks.tekton.dev conditions.tekton.dev extensions.dashboard.tekton.dev pipelineresources.tekton.dev pipelineruns.tekton.dev pipelines.tekton.dev runs.tekton.dev taskruns.tekton.dev tasks.tekton.dev
  45. 47 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTON Demo 6.TEKTON Dashboardで結果を確認
  46. 48 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    TEKTON Demo 7.TEKTON CLIで結果を確認 $ tkn pipelinerun logs build-push-pr CLI
  47. 50 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    CI & CD Security a.イメージビルド BuildKit Dockerfileの命令を並列実行、キャッシュ判定の仕組みで高速にビルド、非Root/非Privilegedな実行によるセキュア なイメージビルドを実現。 Kaniko Dockerデーモンに依存せず、コンテナ内のユーザ空間でビルドすることで、CIで推奨されるDooDでのRoot権限で稼働 しているホスト上へのセキュリティリスクを回避。 ※DooD(Docker outside of Docker):起動したコンテナからホストのDockerデーモンでイメージビルドする方法
  48. 51 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    CI & CD Security b.イメージスキャン Trivy OSパッケージ情報、アプリケーションの依存関係などから脆弱性を検出。ワンバイナリでCIに組み込みやすい脆弱性診 断ツール。診断結果をレポート出力も可能。
  49. 52 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    CI & CD Security dockle CIS BenchmarkのDockerに関する項目、Dockerfileのベストプラクティスをベースにチェック可能な診 断ツール。
  50. 53 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    CI & CD Security c.ポリシーチェック Kubernetesのすべてのリソースは、マニフェストに記述して登録。そのマニフェストの内容が正しいか、許可できるものかを チェックしてセキュリティを向上する必要がある。 マニフェスト $ kubectl apply Check Check
  51. 54 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    CI & CD Security GitOpsではCIにConftestというツールを用いてマニフェストチェック、Gatekeeperというツールを用いてKubernetesクラ スタ登録時にマニフェストチェックを行う方法が利用され、ポリシーチェックにOpen Policy Agentが利用されている。 Conftest Gatekeeper マニフェスト $ kubectl apply Check Check CI CD
  52. 55 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    CI & CD Security Open Policy Agent • 軽量で汎用性のあるOSSのポリシーエンジン • Regoという言語でポリシーを記述してルールを定義 • Kubernetes専用というわけではなく、YAML、JSONなど構造化データのポリシーエンジン • KubernetesではConftest、Gatekeeperとの組み合わせで導入するケースが多い • CNCFのGraduationプロジェクト
  53. 56 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    CI & CD Security Open Policy Agent APIにDataを送信する(Query)と、Policyを参照してDataを評価し て結果(Decision)を返す仕組み。 OPA公式ドキュメント: https://www.openpolicyagent.org/docs/latest/
  54. apiVersion: v1 kind: Pod metadata: name: nginx spec: securityContext: runAsNonRoot:

    true containers: - name: nginx image: nginx:1.20.0 apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx:1.20.0 57 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps CI & CD Security Conftest package main deny[msg] { input.kind == "Pod" not input.spec.securityContext.runAsNonRoot msg := "Containers must not run as root !!" } policy/check-runAsNonRoot.rego opa/pod.yaml $ conftest test opa FAIL - opa/pod.yaml - Containers must not run as root !! 1 test, 0 passed, 0 warnings, 1 failure, 0 exceptions 「runAsNonRoot」が設定されていなければ、 「Containers must not run as root !!」を返す定義をRegoで記述 Conftest GitHub https://github.com/open-policy-agent/conftest Policy Language https://www.openpolicyagent.org/docs/latest/policy-language/ OK NG 1 test, 1 passed, 0 warnings, 0 failures, 0 exceptions OK NG
  55. 58 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    CI & CD Security Gatekeeper Gatekeeperは、Kubernetesの認証認可フローの拡張機能であるAdmission Controlから外部Webhookサーバとし てチェック依頼を受けて、OPAの定義でチェックしてリソース登録の許可/拒否を返す仕組み。 マニフェスト ① $ kubectl apply ②リソース作成・変更リクエスト の許可チェック(Admission Request) Gatekeeper ③ Regoの定義でポリシーチェック ④ 許可/拒否(Admission Response) ⑤ 許可であれば登録
  56. 59 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    CI & CD Security Conftest / Gatekeeper / Open Policy Agent OPAと組み合わせて、ConftestでCI時にマニフェストのポリシーチェックを行い、GatekeeperでKubernetes登録時にポ リシーチェックを行うことでセキュリティリスクの低減につながる。 Conftest Gatekeeper マニフェスト GitOpsでは、ConfigリポジトリへのPush前 に拒否できる マニフェスト マニフェスト Kubernetesへの登録を守る門番 CI CD
  57. 60 Copyright © 2021, Oracle and/or its affiliates GitOps 2.CI&GitOps

    CI & CD Security 補足情報 Kubernetes 1.21 でPod Security Policy(PSP)が非推奨。 Kubernetesオフィシャルブログで、“PSP Replacement Policy“というプロタイプ名でKubernetes 1.22 でAlphaリリース予定(KEP#2579)、そして、OPA GatekeeperやKyvernoなどでの対応を推奨している旨あり。 KEP#2579 https://github.com/kubernetes/enhancements/issues/2579 Kubernetes Blog https://kubernetes.io/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/ Official Site https://kyverno.io/ PSP OPA https://github.com/open-policy-agent/gatekeeper-library/tree/master/library/pod-security-policy
  58. 61 Copyright © 2021, Oracle and/or its affiliates 3.手元で始めるGitOps OKE

    + OCIR + GitHub Actions + ArgoCD GitHub Actions Argo Family ArgoCD Demo構成
  59. 62 Copyright © 2021, Oracle and/or its affiliates GitOps 3.手元で始めるGitOps

    OKE + OCIR + GitHub Actions + ArgoCD Continuous Integreation Continuous Delivery Kubernetes Container Registry OCIR (Oracle Cloud Infrastructure Registry) OKE (Oracle Container Engine for Kubernetes)
  60. 63 Copyright © 2021, Oracle and/or its affiliates GitOps 3.手元で始めるGitOps

    GitHub Actions GitHubに組み込まれたCI/CDシステム。CI/CDに限らず、様々なイベントフックに対応して、イベントをトリガーに自動処 理可能。 以下の各コンポーネントを組み合わせて、YAMLファイルに定義して実行。 Workflow Name Overview Workflow リポジトリに追加する自動化手順 Event Workflowをトリガーする特定のアクティビティ Job Runnerで実行される一連のStep Step Jobでコマンドを実行できる個々のタスク Action Jobを作成するためにステップに結合されるスタンドアロンコマンド Runner GitHub Actionsランナーアプリケーションがインストールされているサーバー GitHub Docs https://docs.github.com/ja/actions/learn-github-actions/introduction-to-github-actions Push Eventをト リガーにJob内の 各Stepを実行さ れます。
  61. 64 Copyright © 2021, Oracle and/or its affiliates GitOps 3.手元で始めるGitOps

    Argo Family Argo https://argoproj.github.io/ Argo Workflows ArgoCD Kubernetesで並列ジョブを調整するオープンソースのコンテナーネイティブワークフローエンジン Kubernetes向けの宣言型継続的デリバリーツール(GitOps) Argo Rollouts KubernetesコントローラーおよびCRDのセットで、Blue-Green、カナリアデプロイ、カナリア分析、実験など、Kubernetesへのプログ レッシブデリバリーのような高度なデプロイ機能を提供 Argo Events Kubernetesのイベントをベースとした依存関係マネージャー、複数のイベントソースを定義してトリガーを管理
  62. 65 Copyright © 2021, Oracle and/or its affiliates GitOps 3.手元で始めるGitOps

    ArgoCD • Kubernetesのコントローラーとして実装 • あらゆるマニフェストに対応(Helm、kustomizeなど) • 専用のWebUIとCLIを実装 • Argo Rolloutsと連携して、Blue-Green、Canaryなどのデプロイ戦略にも対応 manifest Config Repository Kubernetes Cluster Apply equal Polling & Sync
  63. 66 Copyright © 2021, Oracle and/or its affiliates GitOps Demo構成

    Cloud Shell Code Repository Config Repository Code Change & git push PR Merge Image Push Pull Request Polling & Sync Image Pull Image Build Apply 3.手元で始めるGitOps ① ② ④ ③ ⑥ ⑦ Conftest ⑤ Service type: LoadBalancer ⑩ Web Access OKE OCIR Gatekeeper ⑧ ⑨
  64. 67 Copyright © 2021, Oracle and/or its affiliates GitOps Demo構成

    1. BuildKitによるイメージビルド 2. dockleによるイメージ診断 3. Trivyによるイメージスキャン 4. OCIRログイン 5. OCIRにイメージプッシュ 6. GitHub configリポジトリ処理 1. GitHubログイン 2. 「config」リポジトリからクローン 3. 新規ブランチ作成 4. values.yamlファイルのイメージタグ番号更新(Helm利用) 5. 「config」リポジトリへプッシュ処理 6. 「config」リポジトリへプルリクエスト処理 GitHub Actions CI構成 3.手元で始めるGitOps Code Repository Config Repository 1. PR時にConftest
  65. 68 Copyright © 2021, Oracle and/or its affiliates GitOps OKE

    + OCIR + GitHub Actions + ArgoCD GitHub Actions CI構成 3.手元で始めるGitOps Code Repository Buildkitによるイメージビルド GitHub ActionsはActionを実行 する度にナンバリングされるので、そ のナンバーをイメージタグ適用。 Pushトリガー <path> <path> <path>
  66. 69 Copyright © 2021, Oracle and/or its affiliates GitOps Demo構成

    GitHub Actions CI構成 3.手元で始めるGitOps Code Repository Trivyによるイメージスキャン dockleによるイメージ診断 <path> <path>
  67. 70 Copyright © 2021, Oracle and/or its affiliates GitOps Demo構成

    GitHub Actions CI構成 3.手元で始めるGitOps Code Repository OCIRにログイン イメージプッシュ <path>
  68. 71 Copyright © 2021, Oracle and/or its affiliates GitOps OKE

    + OCIR + GitHub Actions + ArgoCD GitHub Actions CI構成 3.手元で始めるGitOps Code Repository Configリポジトリからのマニフェストファイ ルのクローン、イメージタグ名変更、プッ シュ、プルリクエスト処理まで プルリクエスト処理は、ghコマンドを利用 sedコマンドでタグ名変更
  69. 72 Copyright © 2021, Oracle and/or its affiliates GitOps Demo構成

    GitHub Actions CI構成 3.手元で始めるGitOps Config Repository Regoで記述したポリシーファイルとテストするマニフェストのパスを指 定するだけで、Conftestを実行可能。 Regoのポリシーファイル。 values.yamlにlatestタグがある場 合、faildを返す。 gitops-helm/policy/latest-tag-check.rego gitops-helm/values.yaml Check!! Pull Request トリガー <path>
  70. 73 Copyright © 2021, Oracle and/or its affiliates GitOps Demo構成

    GitHub Actions CI構成 3.手元で始めるGitOps Config Repository https://github.com/makocchi-git/actions-k8s-manifests-validate-conftest Actionを自作して、 Marketplaceで公開可能。
  71. 74 Copyright © 2021, Oracle and/or its affiliates GitOps Demo構成

    ArgoCD 設定 3.手元で始めるGitOps Sync Policyは Manual、Automatic を設定可能。 Helmを指定すると values.yamlを読み込む。 Config Reopsitory URLを指定 <path>
  72. 75 Copyright © 2021, Oracle and/or its affiliates GitOps Demo構成

    Gatekeeper 設定 3.手元で始めるGitOps apiVersion: templates.gatekeeper.sh/v1beta1 kind: ConstraintTemplate metadata: name: notlatestimage spec: crd: spec: names: kind: NotLatestImage listKind: NotLatestImageList plural: notlatestimages singular: notlatestimage targets: - target: admission.k8s.gatekeeper.sh rego: | package notlatestimage violation[{"msg": msg}]{ input.review.object.kind == "Pod" imagetag := input.review.object.spec.containers[_].image endswith(imagetag,"latest") msg := "Can't use image of latest tag !!" } apiVersion: constraints.gatekeeper.sh/v1beta1 kind: NotLatestImage metadata: name: notlatestimage spec: match: kinds: - apiGroups: [""] kinds: ["Pod"] constrainttemplate.yaml constraints.yaml Apply OKE apiVersion: v1 kind: Pod metadata: name: pod-nginx-latest spec: containers: - name: nginx-latesttag image: nginx:latest banlatesttag.yaml Error from server ([denied by notlatestimage] Can't use image of latest tag !!): error when creating "banlataest.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [denied by notlatestimage] Can't use image of latest tag !! Latestタグのイメージを applyすると抑止
  73. 78 Copyright © 2021, Oracle and/or its affiliates Progressive Deliveryについて

    Progressive Deliveryとは? 主なツール Flaggerから見るProgressive Delivery
  74. 79 Copyright © 2021, Oracle and/or its affiliates Progressive Delivery

    Progressive Deliveryとは? Progressive Deliveryについて 2019 NA 2020 EU 2020 NA https://www.youtube.com/watch?v=Nv0PPwbIEkY https://www.youtube.com/watch?v=Jf29YXu1Q48 https://www.youtube.com/watch?v=ahLnVkLlQ4U 2019年 KubeCon CloudNativeCon NA 2019 からセッションで発表。
  75. 80 Copyright © 2021, Oracle and/or its affiliates Progressive Delivery

    Progressive Deliveryとは? Progressive Deliveryについて Continuous Delivery + Analysis + Automated Rollback/Release 分析しながらデプロイを実行することで、分析の結果、失敗と判断された場合は自動的にロールバック、成功と判断され た場合はデプロイを継続する仕組み。主にカナリアリリースとの組み合わせ。 Develop Build Test Deploy Analyze OK ? Rollback Promote No Yes Metrics
  76. 81 Copyright © 2021, Oracle and/or its affiliates Progressive Delivery

    Progressive Deliveryとは? Progressive Deliveryについて Carlos Sanchez CloudBees, Inc. “Progressive Delivery is the next step after Continuos Delivery, where new versions are deployed to subset of users and are evaluadet in terms of correctness and performance before rolling them to the totality of the users and rolled back if not matching some key metrics.” Carlos Sanchez's Weblog https://blog.csanchez.org/2019/01/22/progressive-delivery-in-kubernetes-blue-green-and-canary-deployments/ 「プログレッシブデリバリーは、Continuos Deliveryの次のステップです。新しいバージョンがユーザーのサブセットにデプロイされ、ユーザー 全体にロールバックする前に正確性とパフォーマンスの観点から評価され、主要なメトリクスと一致しない場合はロールバックされます。」 正確性とパフォーマンス:メトリクスを取得してそれをベースに評価、判断。
  77. 82 Copyright © 2021, Oracle and/or its affiliates Progressive Delivery

    主なツール Progressive Deliveryについて Argo Rollouts Flagger https://argoproj.github.io/argo-rollouts/ https://flagger.app/ Kayenta Spinnaker https://spinnaker.io/ https://github.com/spinnaker/kayenta
  78. 83 Copyright © 2021, Oracle and/or its affiliates Progressive Delivery

    Flaggerから見るProgressive Delivery Progressive Deliveryについて • Service Mesh native (Istio, SMI etc..) • GitOps native • Multiple Deployment Strategies(Canary, Blue-Green, A/B Testing etc..) • Custom metrics • Alerting
  79. 84 Copyright © 2021, Oracle and/or its affiliates Progressive Delivery

    Flaggerから見るProgressive Delivery Progressive Deliveryについて 以下3つのCRDをベースにFlaggerがカナリア分析、リリース、 メトリクス取得、通知を実施。 ・Canary ・MetricTemplate ・Alertprovider Prometheus、Datadog、New Relicなどメト リクスプロバイダーと連携可能 https://github.com/fluxcd/flagger Query Analysis Promote Alert GitOps Operator Apply
  80. 85 Copyright © 2021, Oracle and/or its affiliates Progressive Delivery

    Canary Release Progressive Deliveryについて V1 V1 V1 V1 V2 V1 V1 V2 V2 V2 V1 V2 V2 V2 V2 V2 V2 V2 V2 V2 V2 ① ② ③ ④ ⑤ ⑥ 5% 10…50% 50% 0% https://static.sched.com/hosted_files/kccncna20/af/Flagger_KubeCon_NA_2020.pdf
  81. 86 Copyright © 2021, Oracle and/or its affiliates Progressive Delivery

    Flagger Maintainer’s Session Progressive Deliveryについて Kubernetes Meetup Tokyo #32 https://www.youtube.com/watch?v=cSYklzCyhJk https://speakerdeck.com/mathetake/introduction-to-flagger 動画 スライド
  82. 87 Copyright © 2021, Oracle and/or its affiliates OCI DevOps

    Service Introduction OCI DevOps Service Other Service Cooperation
  83. 88 Copyright © 2021, Oracle and/or its affiliates Oracle’s DevOps

    OCI DevOps Service Bare Metal Compute Container Engine For Kubernetes Virtual Machine Functions Environments Deployment Pipelines Artifacts Fully-managed OCI DevOps Service Deployment Rollback Introduction OCI DevOps Service
  84. 89 Copyright © 2021, Oracle and/or its affiliates Oracle’s DevOps

    OCI DevOps Service Environments Deployment Pipelines Artifacts OCIRやアーティファクトリポジトリと連 携してアーティファクトを一括管理 Container Registry Object Storage Bare Metal Compute Container Engine For Kubernetes Virtual Machine Functions デプロイ環境の 設定および管理 各処理をStageという 単位で管理して、パイプライ ンを構築及び管理 stage stage stage stage Pipeline Introduction OCI DevOps Service
  85. 90 Copyright © 2021, Oracle and/or its affiliates Oracle’s DevOps

    OCI DevOps Service Notifications Logging Other Service Cooperation Jenkinsプラグインを利用し て、OCI DevOpsと Jenkinsを統合利用可能
  86. 91 Copyright © 2021, Oracle and/or its affiliates Oracle’s DevOps

    OCI DevOps Service https://lmukadam.medium.com/ OKE & DevOps
  87. 92 Copyright © 2021, Oracle and/or its affiliates Oracle’s DevOps

    Oracle は、継続的デリバリー モデルとベスト プラクティスの成長と進化をサポートするために、 Continuous Delivery Foundation (CDF) に参加 https://blogs.oracle.com/oracle4engineer/oci-arm-gitlab
  88. 94 Copyright © 2021, Oracle and/or its affiliates 最後に CIOps、GitOps、Progressive

    Deliveryの流れで、コンテナアプリケーション開発におけるCI/CDのこれま で、今、これからの大枠を見てきました。 あくまでも、これらは技術手段の一部に過ぎません。 大切なのは、こうした手段を利用して実現する目的です。
  89. 95 Copyright © 2021, Oracle and/or its affiliates 最後に CI/CD環境を構築することで、スピード(Agility)、信頼性(Reliability)を高めて、

    品質および生産性の高いアプリケーション開発を実現 リリースサイクルを速め、 エンドユーザ様に最高品質のサービスを提供 これまで時間やコストを要していた箇所の改善、 より良いビジネスロジックに時間やコストを傾ける エンドユーザ様の満足度、企業収益の向上につながる
  90. 96 Copyright © 2021, Oracle and/or its affiliates 最後に 2021年9月3日(金)

    オンライン開催 Continuous 〜 技術を知り、試して、取り入れる 〜 たくさんのプロポーザルお待ちしております!! https://event.cloudnativedays.jp/cicd2021
  91. 98 Copyright © 2021, Oracle and/or its affiliates 参考資料 GitOpsツール徹底比較!あなたにぴったりなGitOpsツールがきっと見つかる(CNDT2020)

    https://speakerdeck.com/makocchi/why-not-find-your-favorite-gitops-tools CI/CDによる自動化でビジネスを加速させよう(CNBF Meetup) https://speakerdeck.com/makocchi/accelerate-your-business-with-ci-cd Kubernetes-native な管理をおこなう CI/CD 2020 https://speakerdeck.com/masayaaoyama/cndt2020-k8s-amsy810 OpenPolicyAgentを使ってベスト・プラクティスをコード化しよう https://speakerdeck.com/makocchi/best-practice-as-code-with-open-policy-agent Leveling Up Your CD: Unlocking Progressive Delivery on Kubernetes - Daniel Thomson & Jesse Suen, Intuit https://static.sched.com/hosted_files/kccncna19/f2/Progressive%20Delivery%20%26%20Argo%20Rollouts.pdf Progressive Delivery in Kubernetes - Carlos Sanchez, Adobe & Viktor Farcic, CloudBees https://static.sched.com/hosted_files/kccnceu20/c4/Progressive%20Delivery%20in%20Kubernetes.pdf Progressive Delivery Techniques with Flagger - Stefan Prodan, Weaveworks https://static.sched.com/hosted_files/kccncna20/af/Flagger_KubeCon_NA_2020.pdf Introduction to Flagger https://speakerdeck.com/mathetake/introduction-to-flagger
  92. 99 Copyright © 2021, Oracle and/or its affiliates 参考資料 TEKTON

    https://tekton.dev/ Kaniko https://github.com/GoogleContainerTools/kaniko Trivy https://github.com/aquasecurity/trivy Buildkit https://github.com/moby/buildkit Open Policy Agent https://www.openpolicyagent.org/ Gatekeeper https://github.com/open-policy-agent/gatekeeper Conftest https://github.com/open-policy-agent/conftest/ GitHub Actions https://github.co.jp/features/actions Argo family https://argoproj.github.io/ Flagger https://docs.flagger.app/ Spinnaker kayenta https://github.com/spinnaker/kayenta Kyverno https://kyverno.io/ dockle https://github.com/goodwithtech/dockle
  93. 100 Copyright © 2021, Oracle and/or its affiliates 参考資料 KEP#2579

    https://github.com/kubernetes/enhancements/issues/2579 PodSecurityPolicy Deprecation: Past, Present, and Future https://kubernetes.io/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/ PSP OPA https://github.com/open-policy-agent/gatekeeper-library/tree/master/library/pod-security-policy Carlos Sanchez's Weblog https://blog.csanchez.org/2019/01/22/progressive-delivery-in-kubernetes-blue-green-and-canary-deployments/ デモで利用した資材 https://github.com/oracle-japan/ochacafe-s4-3