Slide 1

Slide 1 text

CI/CD最新事情 Oracle Cloud Hangout Cafe – Season 4 #3 Yutaka Ichikawa Solutions Architect Oracle Corporation Japan Jun 09, 2021

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Copyright © 2021, Oracle and/or its affiliates 4 CI/CD これまでを見る CIOps

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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.ロールバックするにも、マニフェストの更新履歴を追うなど、 迅速性に欠けてしまう。。

Slide 19

Slide 19 text

Copyright © 2021, Oracle and/or its affiliates 19 CI/CD 今を見る GitOps

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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化

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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 オペレーターによりデプロイされるので人によるコ マンド操作が不要

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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の課題を解消

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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ツールを組み合わせるケース。

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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 動画 スライド

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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/

Slide 36

Slide 36 text

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)するイメージ。

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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"}}'

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

49 Copyright © 2021, Oracle and/or its affiliates Demo

Slide 50

Slide 50 text

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デーモンでイメージビルドする方法

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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プロジェクト

Slide 56

Slide 56 text

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/

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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) ⑤ 許可であれば登録

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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)

Slide 63

Slide 63 text

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を実行さ れます。

Slide 64

Slide 64 text

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のイベントをベースとした依存関係マネージャー、複数のイベントソースを定義してトリガーを管理

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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 ⑧ ⑨

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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トリガー

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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 トリガー

Slide 73

Slide 73 text

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で公開可能。

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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すると抑止

Slide 76

Slide 76 text

76 Copyright © 2021, Oracle and/or its affiliates Demo

Slide 77

Slide 77 text

Copyright © 2021, Oracle and/or its affiliates 77 CI/CD これからを見る Progressive Delivery & Oracle’s DevOps

Slide 78

Slide 78 text

78 Copyright © 2021, Oracle and/or its affiliates Progressive Deliveryについて Progressive Deliveryとは? 主なツール Flaggerから見るProgressive Delivery

Slide 79

Slide 79 text

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 からセッションで発表。

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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の次のステップです。新しいバージョンがユーザーのサブセットにデプロイされ、ユーザー 全体にロールバックする前に正確性とパフォーマンスの観点から評価され、主要なメトリクスと一致しない場合はロールバックされます。」 正確性とパフォーマンス:メトリクスを取得してそれをベースに評価、判断。

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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 動画 スライド

Slide 87

Slide 87 text

87 Copyright © 2021, Oracle and/or its affiliates OCI DevOps Service Introduction OCI DevOps Service Other Service Cooperation

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

Copyright © 2021, Oracle and/or its affiliates 93 最後に

Slide 94

Slide 94 text

94 Copyright © 2021, Oracle and/or its affiliates 最後に CIOps、GitOps、Progressive Deliveryの流れで、コンテナアプリケーション開発におけるCI/CDのこれま で、今、これからの大枠を見てきました。 あくまでも、これらは技術手段の一部に過ぎません。 大切なのは、こうした手段を利用して実現する目的です。

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

96 Copyright © 2021, Oracle and/or its affiliates 最後に 2021年9月3日(金) オンライン開催 Continuous 〜 技術を知り、試して、取り入れる 〜 たくさんのプロポーザルお待ちしております!! https://event.cloudnativedays.jp/cicd2021

Slide 97

Slide 97 text

Copyright © 2021, Oracle and/or its affiliates 97 参考資料

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

Thank you 101 Copyright © 2021, Oracle and/or its affiliates

Slide 102

Slide 102 text

No content