Kubernetes、コンテナ技術を活用したCI/CD基盤におけるサービス開発について、リクルートテクノロジーズの事例を基に解説する連載。今回は、インフラエンジニア視点からKubernetesを前提としたCI/CDの具体例について解説します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載「コンテナベースのCI/CD本番事例大解剖」では、リクルートテクノロジーズが取り組んだ事例を基に、Kubernetes、コンテナ技術を活用したCI/CD(継続的インテグレーション/継続的デリバリー)基盤におけるサービス開発について解説します。第1〜3回では、「Kubernetes、Dockerをコア技術に据えてサービスを構築した際に、開発、保守運用においてどのような影響があったのか」について、インフラアーキテクト、アプリエンジニア、インフラエンジニアそれぞれの視点から紹介します。
連載第2回の前回はアプリ開発者の視点から紹介しました。今回は、インフラエンジニア視点から、Kubernetesを前提としたCI/CDの具体例について解説します。
Kubernetesを利用する上で最も重要な準備の一つとして、CI/CD環境があります。Kubernetesにアプリケーションをデプロイするには、最低でも下記の手順を踏む必要があります。
これらを毎回手動で行うのは、現実的ではありません。そこで、これらの作業を自動化するために、CD環境が必要になります。
今回のプロジェクトではCI/CDツールとして「Concourse CI」を選択しました。選定した理由、他ツールとの比較に関しては連載第1回で解説しています。
Concourse CIはPivotal社によるオープンソースソフトウェア(OSS)のCI/CDツールです。yamlを使ってパイプラインを記述し、コンテナベースで各タスクが実行されます。
基本的な機能に関しては、こちらのチュートリアルにまとまっているため、本連載では割愛します。ここでは、Kubernetes(コンテナ環境)で利用する上で最低限必要なCI/CDのフローと、連載第2回の「パイプラインの高速化」の項で解説したパイプラインを組むための具体的な方法を紹介します。
上記のパイプライン模式図を基にConcourse CI上へデプロイすると、下記サンプルのように表示されます。
groups: - name: test jobs: - build-image - unit-test - lint - success-notify resource_types: - name: kubernetes type: docker-image source: repository: zlabjp/kubernetes-resource tag: "1.12" - name: slack-notification type: docker-image source: repository: cfcommunity/slack-notification-resource tag: latest - name: slack-alert type: docker-image source: repository: arbourd/concourse-slack-alert-resource - name: pull-request type: docker-image source: repository: teliaoss/github-pr-resource tag: latest resources: - name: repository type: pull-request source: repository: ((repository)) access_token: ((access-token)) - name: app-docker-image-base type: docker-image source: repository: asia.gcr.io/example-project/app/base username: _json_key password: ((gcp-service-account)) - name: app-docker-image type: docker-image source: repository: asia.gcr.io/example-project/app username: _json_key password: ((gcp-service-account)) - name: notify type: slack-alert source: url: ((slack-webhook)) - name: deploy-notify type: slack-notification source: url: ((slack-webhook)) jobs: - name: build-image plan: - get: repository trigger: true version: every - put: app-docker-image-base params: cache_from: - api-docker-image-base cache: true additional_tags: repository/.git/ORIG_HEAD build: repository dockerfile: repository/app/Dockerfile target_name: base on_failure: ## 失敗時の通知 - put: app-docker-image get_params: skip_download: true params: cache_from: - app-docker-image-base cache: true additional_tags: repository/.git/ORIG_HEAD build: repository dockerfile: repository/app/Dockerfile target_name: app on_failure: ## 失敗時の通知 - name: unit-test plan: - aggregate: - get: repository trigger: true passed: - build-image - get: app-docker-image - task: unit-test image: app-docker-image # unit-testの実行 on_failure: ## 失敗時の通知 on_success: ## 成功時の通知 - name: lint plan: - aggregate: - get: repository trigger: true passed: - build-image - get: app-docker-image - task: lint image: app-docker-image ## lintの実行 on_failure: ## 失敗時の通知 on_success: ## 成功時の通知 - name: success-notify plan: - get: repository trigger: true passed: - lint - unit-test - task: notify-msg ## 成功時の通知
Concourse CIのパイプラインは大きく以下の3つの定義に分かれています。
このパイプライン全体の流れの概略は、下記のようになります。
Copyright © ITmedia, Inc. All Rights Reserved.