背景 : Motivation
Jenkins Xは、Kubernetes上のクラウドアプリケーションのための自動化されたCI/CDソリューションです。Jenkins Xはツールのインストール、構成、およびアップグレードを自動化するので、ユーザーは使い始めからたくさんの知識を詰め込む必要がなく、自分のペースで学ぶことができるため、ユーザーエクスペリエンスが非常にシンプルになります。
すでに用意されたオートメーション機能を使えば、チームは品質と安全性の高いソフトウェアを頻繁に、また予定どおりに顧客にリリースすることに集中でき、その背後の仕組みを気にする必要がありません。CloudBeesでは、舞台裏の要素についてユーザーが考えるようになる前に、個々の要素を説明しておくのは、理解の助けになると考えています。このブログでは、Jenkinsをはじめとするいくつかの「秘密のエージェント」を紹介し、ユーザーがCI/CDの旅をスムーズに続けることができるようにします。
Jx
Jenkins Xではjxコマンドラインが導入されました。Jxは、すべてを統御するコマンドです。
次のいずれかの方法でjxを実行できます。
- ローカルマシンに “jx”バイナリをインストールする
- Google Cloudシェルを使用する。Google Cloudシェルは、Git、gcloud、kubectlなどの必要なツールの多くに付属しています。
jxの使用方法の例は次のとおりです。
- “jx create cluster gke “ はGoogle Cloud上に新しいKubernetesクラスターを作成します
- “jx create quickstart” は新しいアプリケーションを作成し、生成されたコードをGitおよびJenkinsにCI/CD用にインポートします
- “jx open jenkins” はJenkinsをブラウザーで開きます
- “jx sync” はローカルファイルをdevpodに同期します
- “jx cloudbees” は、ブラウザーでCloudBees CD for Kubernetesアプリケーションを開きます
- その他
“jx help” と入力すると、Jenkins Xで実行できるさまざまな操作を参照できます。
Helm
Helm chart とは:
- 予測可能かつ反復可能な方法でKubernetesアプリケーションを管理する。つまり、以下を行います。
- アプリケーションを定義する
- アプリケーションをインストールする
- アプリケーションをアップグレードする
- ソース管理システムでバージョン管理されているため、監査が可能
- 作成と公開が容易なため、コミュニケーションのオーバーヘッドを削減できる
- 最後の安定バージョンへのストレスのない(そして予想外のことが起こらない)ロールバックを可能にする
私たちのささやかなサンプルでは、Jenkins XはGitに以下のHelm chartアセットを作成します。
ChartMuseum
最初にchartリポジトリの基本を理解しましょう。
chartリポジトリとは:
- index.yamlファイルおよびパッケージ化されたchart(オプション)を格納するHTTPサーバー
- パッケージ化されたchartを保存して共有できる場所
ChartMuseum:
- オープンソースのHelm chartリポジトリ。Goで書かれている
- 以下のクラウドストレージバックエンドと互換性あり
- ストレージにあるパッケージに基づいて、リポジトリインデックス(index.yaml)を生成
- 独自のindex.yamlを維持する必要がない
- 独自のindex.yamlを保存しても、完全に無視される
- 以下を行うCLIを提供
- インストール
- 設定
- その他
- 以下を行うAPIを提供
- 新しいchartバージョンのアップロード
- chartバージョンの削除
- 新しいchartパッケージをストレージにアップロードする
- すべてのchartの一覧表示
- その他
Skaffold
Skaffoldは以下を行うためのコマンドラインツールです。
- KubernetesアプリケーションのCDを容易にする
- アプリケーションのソースコードのイテレートをローカルで行い、その後ローカルまたはリモートのKubernetesクラスターにデプロイする
- アプリケーションをビルド、プッシュ、デプロイするためのワークフローを管理し、自動化されたパイプラインでワークフローを活用して、テストからステージングまでアプリケーションをプロモートする
Jenkins Xは、Skaffoldを使用して以下のビルドおよびデプロイメントワークフローを作成します。
Jenkins
Jenkinsは以下の特徴を持つオープンソースの自動化ツールです。
- シンプルなCIサーバーとして使用でき、また継続的デリバリーのハブにもなる自己完結型のJavaベースのプログラム
- 任意のプロジェクトのビルド、テスト、およびデプロイをサポートするプラグインのエコシステムを持つ
- Jenkinsfileが必要。Jenkinsfileは次の2つの形式のpipeline-as-code構文をサポートします。
- 宣言的構文(推奨)
- スクリプト構文
Jenkins Xは、さまざまなステージにわたってプロモートを行う次のパイプラインを生成します。
Docker
Docker:
- コンテナを使用してアプリケーションを構築、管理、保護する方法を標準化し自動化する
- アプリケーションとインフラストラクチャ間の真の独立性を確立する
- 開発者、QA、リリース、運用、セキュリティ担当者間のより良いコラボレーションとイノベーションのためのモデルを確立する
Jenkins Xは、コンテナ化されたアプリケーション用に次のイメージを作成します。
Kubernetes
KubernetesはGoogleで運用ワークロードを実行しており、毎週何十億ものコンテナが稼働しています
Kubernetesの主な機能:
- コンテナ化されたアプリケーションのデプロイメント、スケーリング、および管理を自動化
- アプリケーションを構成するコンテナを論理的ユニットにグループ化して、管理と発見を容易にする
- オンプレミス、ハイブリッド、またはパブリックのクラウドインフラストラクチャを自由に活用でき、ワークロードを簡単に移行できる
- 失敗したコンテナを再起動する
- ノードが消滅したときにコンテナの置換と再スケジュールを行う
- ヘルスチェックに反応しないコンテナをキルする
- アプリケーションをスケールアップまたはスケールダウンする
- CPU使用率に基づいて自動的に
- コマンドまたはUIから手動で
Ksync
Ksync とは:
- ローカルファイルシステムとKubernetesクラスター間でファイルを同期
- クラスター上で実行されているコンテナをローカルチェックアウトから透過的に更新
- 開発者は好みのIDEを使用して、クラスターの外部からではなく内部から作業できる。数秒で結果を見ることができるので、コードの変更をテストするために何分も待つ必要はありません。
Jenkins Xの “jx sync”を使用すると、ローカルファイルシステムとKubernetesクラスターのdevpodとの間でファイルを同期できます。これにより、運用環境に問題があるのが明白な場合でさえ、「自分のマシンでは動きます!」というよくある問題によってビジネスが停滞するのを防ぎます。
クラウド
Kubernetesをいじったことがある人なら、セットアップと管理が難しいことを知っています。Jenkins Xは、そのような苦痛を軽減し、主要なクラウドプロバイダーが提供する管理されたKubernetesソリューションを活用します。
- Google Cloud (GKE)
- Amazon Web Services (EKS)
- Microsoft Azure (AKS)
- Oracle Cloud (OKE)
- その他
Google Cloudの例を見てみましょう。Google Cloud SDKは、次のようなGoogle Cloud Platform製品とサービスのコマンドラインインターフェイスを提供します。
- Gcloud: 認証、ローカル設定、開発者ワークフロー、インタラクションを管理する
- kubectl:gecoud上のKubernetesコンテナクラスターの展開と管理を統括する
- その他
まとめ
Jenkins Xは、Kubernetes上のクラウドアプリケーションのCI/CDを自動化します。エンジニアが世界を驚かせるような製品の開発とテストに集中できるように、Jenkins Xは開発者の時間とエネルギーを奪う多くの仕組みを抽象化して隠します。
Jenkins Xを使えば迅速にスタートできますが、徐々に細部を学習し、最終的にはこれらの基礎となる詳細を理解する必要があるでしょう。これをお読みの方は、弾力性のあるパイプラインの設計と実装への道を順調に進んでいらっしゃることと思いますが、上記でご紹介したような技術の詳細をしっかりと理解していただけるよう、今回の記事を作成しました。
パイプラインはもはや阿片のパイプの見せるような夢想の産物ではありません。それでは楽しいコーディングを!
(この記事は、CloudBees社 Blog 「Under The Hood Of Jenkins X – A CI/CD Solution For Cloud Applications On Kubernetes」2018年7月12日 Juni Mukherjee 投稿の翻訳記事です。)