原文はこちら。
https://blogs.oracle.com/cloud-infrastructure/cicd-on-steroids%3a-announcing-container-engine-for-kubernetes-as-a-jenkins-x-provider
Kubernetesが分散コンテナアプリケーションの管理ツールのデファクトになりました。今日クラウドアプリケーションを作って本当にマルチクラウドに対応させ、かつ可搬性を持たせたいのであれば、Kubernetesを選択するかしないかはあなた次第です。
Kubernetesはすばらしいものですが、継続的デリバリ(CD)スタイルでKubernetes上にアプリケーションを作成したい場合や開発者に生産性を高めて欲しい場合には、課題がいくつかあります。これまでのJenkins(Jenkins 2.0)を使うと、継続的デリバリシステムをKuberenetesで実装できますが、以下のような手順があり面倒です。
Jenkins Xでは以下の操作が簡単になります。
2018年7月現在、Oracle Cloud InfrastructureはJenkins Xのオフィシャルなクラウドで、Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE)でのJenkins Xの実行をネイティブサポートしています。このプロジェクトに参画、貢献してくれたChenghao Shi、Hui Liuおよび彼らのチームの皆様に感謝します。
以下は新規OKEクラスタを作成し、Jenkins Xをクラスタにインストールする手順です。
注意: 実行前に、OKEクラスタデプロイのための必要なサブネットやセキュリティ・リスト・ルール、IAMポリシーが構成済みであることを確認してください。現リリースのjxはこれらを作成しません。これらのリソースの作成方法の詳細は、以下のドキュメントをご覧ください。
既存のプロジェクトで以下のコマンドを実行すると、いま取り組んでいるプロジェクトの種類を迅速にjxコマンドが検知します(例えば、Spring BootとかJHipsterとか、といった具合です)
https://blogs.oracle.com/cloud-infrastructure/cicd-on-steroids%3a-announcing-container-engine-for-kubernetes-as-a-jenkins-x-provider
Kubernetesが分散コンテナアプリケーションの管理ツールのデファクトになりました。今日クラウドアプリケーションを作って本当にマルチクラウドに対応させ、かつ可搬性を持たせたいのであれば、Kubernetesを選択するかしないかはあなた次第です。
Kubernetesはすばらしいものですが、継続的デリバリ(CD)スタイルでKubernetes上にアプリケーションを作成したい場合や開発者に生産性を高めて欲しい場合には、課題がいくつかあります。これまでのJenkins(Jenkins 2.0)を使うと、継続的デリバリシステムをKuberenetesで実装できますが、以下のような手順があり面倒です。
- Kubernetes用のJenkinsプラグインの設定
- KubernetesクラスタおよびKubernetes環境の設定
- パイプラインの設定
- Kubernetesへのコンテナのデプロイ
- YAMLやHelm Chartの生成
- 継続的デリバリの採用と推進
Jenkins X
Jenkins Xは、Jenkinsの主要なCI/CDの専門知識と業界の顧客層を活用し、Kubernetes環境に自然に適合するCI/CDソリューションを提供します。Jenkins Xでは、Kubernetesオペレーションの総合的な理解や実行は不要で、Kubernetes環境での製品(=アプリケーション)の出荷速度を大幅に向上させることができます。Dockerfileを扱ったり、Helm Chartを調整したり、jenkinsfileを書いたりする必要はありません。ただ、アプリケーションを作成すれば、それでOKです。すべてのCI/CDが自動実行されます。Jenkins Xでは以下の操作が簡単になります。
- Kubernetesの展開に必要なツールのインストールとアップグレードを自動化します。これらのツールはすべてKubernetes向けに構成および最適化されています。ツールには以下のものを含みます。
- Helm(Kubernetesのパッケージマネージャ)
- Draft(Kubernetes上でビルド、実行するためのアプルケーションを起動する際に使われるビルドパック)
- Skaffold(RAD開発を可能にし、イメージのビルドやプッシュを簡素化)
- Kaniko
- Jenkins
- Ksync
- Monocular
- Nexus
- KuberenetesでアプリケーションのCI/CDを自動化
- Dockerイメージ
- Helm charts
- パイプライン
- GitOpsを利用し、(テストからステージング、本番)
2018年7月現在、Oracle Cloud InfrastructureはJenkins Xのオフィシャルなクラウドで、Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE)でのJenkins Xの実行をネイティブサポートしています。このプロジェクトに参画、貢献してくれたChenghao Shi、Hui Liuおよび彼らのチームの皆様に感謝します。
Run Jenkins X in OKE
Jenkins XをOKEで実行するには2方法あります。このエントリでは、jxというJenkins Xコマンドラインツールの利用方法とこれらの操作の実行方法を紹介します。- Jenkins Xがインストールされた新規のOKEクラスタを作成(jx create コマンドを利用)
- 既存のOKEクラスタにJenkins Xをインストール(jx install コマンドを利用)
Create a New OKE Cluster and Install Jenkins X
jxツールはOracle Cloud Infrastructure CLIを使ってOKEと通信します。CLIがクラスタ作成時点で未インストールの場合、jxは依存関係のあるCLIがないと判断し、実行時にCLIをインストールします。以下は新規OKEクラスタを作成し、Jenkins Xをクラスタにインストールする手順です。
注意: 実行前に、OKEクラスタデプロイのための必要なサブネットやセキュリティ・リスト・ルール、IAMポリシーが構成済みであることを確認してください。現リリースのjxはこれらを作成しません。これらのリソースの作成方法の詳細は、以下のドキュメントをご覧ください。
Preparing for Container Engine for Kubernetesこれらの必要なリソースを迅速にプロビジョニングするためにTerraformのコードを使うこともできます(訳注:原文にはリンクがありますが、空っぽなので訳文ではリンクを掲載していません)。これらのリソースが準備できたら、jxを使ってingress controller、PVCなどを作成してから、Kubernetesに関連するユーティリティやJenkins Xのインストールを始めます。
https://docs.cloud.oracle.com/iaas/Content/ContEng/Concepts/contengprerequisites.htm?tocpath=Services%7CContainer%20Engine%7CPreparing%20for%20Container%20Engine%20for%20Kubernetes%7C_____0
- 開発タスクを実行するようGitを構成します。
sudo yum install git -y
- kubectlをインストールします。
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl - jxがどのOCIリソースを使うのかわかるよう、oci configファイルを構成します。CLIはこの時点ではインストールされません(実行中にインストールされます)。
mkdir ~/.oci
vi ~/.oci/config
vi ~/.oci/oci_api_key.pem
chmod 600 ~/.oci/config ~/.oci/oci_api_key.pem - OKEクラスタにインストールされるHelmサーバのtillerと会話できるよう、Helmクライアントをインストールします。
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-linux-amd64.tar.gz
tar -xvf helm-v2.9.1-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/ - jx コマンドラインツールをインストールします。
curl -L https://github.com/jenkins-x/jx/releases/download/v1.3.52/jx-linux-amd64.tar.gz | tar xzv
sudo mv jx /usr/local/bin - jxを使い、Jenkins XがインストールされたOKEクラスタを作成します。
多数のフラグを指定できます。これらのフラグの一部はOracle Cloud Infrastructureに固有のもので、残りはjxの汎用的なフラグです。例えば、次のフラグを使用してOKEクラスタを作成することも、 jx create cluster okeコマンドだけを実行して、実行時に必要なOCIDを入力することもできます。jx create cluster oke [flags]
このコマンドは、OKEに新規Kubernetesクラスタを作成し、必要なローカルの依存関係をインストールし、Jenkins Xプラットフォームをプロビジョニングします。$HOME/binを$PATHに追加してください。 そうしないと、jxはCLIコマンドを呼び出し時に問題が発生します。すでにCLIをインストールしている場合は、CLIが$PATHにあることを確認してください。jx create cluster oke --name shoulderroad --compartment-id ocid1.tenancy.oc1..l3d6xxx4gziexn5sxnldyhja --vcn-id ocid1.vcn.oc1.phx.ofu4bbmfhj5ijidyde3gpdocybghidrmbq --kubernetes-version v1.10.3 --wait-for-state SUCCEEDED --serviceLbSubnetIds file:///tmp/oke_cluster_config.json --tiller-enabled false
コマンドが完了すると、Jenkins、Nexus、Dockerレジストリ、ChartMuseum、Monocularなどを含む開発環境と、その他の環境(ステージングや本番)ができあがります。通常は、これらのgitリポジトリのHelm chartを使用して、インストール対象のchartやバージョン、任意の環境固有の構成や追加リソースを定義します。 - 以下のコマンドを実行して環境を確認します。
以下のような出力結果を確認できるはずです。kubectl get svc --all-namespaces
Install Jenkins X on an Existing OKE Cluster
既存のOKEクラスタがある場合、jxコマンドを使ってJenkins Xをインストールできます。- まず、以下のコマンドを実行して環境の準備をします。
chmod +x ~/get-kubeconfig.sh
export ENDPOINT=containerengine.us-phoenix-1.oraclecloud.com
~/get-kubeconfig.sh ocid1.cluster.oc1.phx.rdsztcmnstcnjsgy4taytcmctdqyrzheyw > ~/kubeconfig
export KUBECONFIG=~/kubeconfig
git config --global user.email "user.name@gmail.com"
git config --global user.name "userName" - jxがどのOCIリソースを使うのかわかるよう、oci configファイルを構成します。CLIはこの時点ではインストールされません(実行中にインストールされます)。
mkdir ~/.oci
vi ~/.oci/config
vi ~/.oci/oci_api_key.pem
chmod 600 ~/.oci/config ~/.oci/oci_api_key.pem - kubeconfig ファイルをエクスポートします。
export KUBECONFIG=~/kubeconfig
- まだインストールしていない場合は、Gitをインストールします。
sudo yum install git -y
- kubectlをインストールします。
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl - jxコマンドラインツールをインストールします。Linux以外のOSにインストールする場合、以下のインストール手順を確認してください。
Get jx
https://jenkins-x.io/getting-started/install/curl -L https://github.com/jenkins-x/jx/releases/download/v1.3.52/jx-linux-amd64.tar.gz | tar xzv
sudo mv jx /usr/local/bin - Helmクライアントをインストールし、すでにOKEクラスタにHelmサーバのtillerがインストールされていれば、それと会話できるようにします。
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-linux-amd64.tar.gz
tar -xvf helm-v2.9.1-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/
helm init - jxを使ってJenkins Xをインストールします。
インストールには数分かかります。この間に、GitHubのユーザー名のような必要なパラメータを設定できます。インストール完了後、2個のパイプライン(stagingとproduction)がJenkinsダッシュボード上に生成され、コードがGitHubにチェックインされます。jx install --provider=oke
Other Jenkins X Options
ここまでで、Jenkins XをOKE上で実行するためのjx createやjx installコマンドを見てきました。任意の言語でプロジェクトを素早く立ち上げたり(jxは多言語の統合に対応しています)、パイプラインを構築したりするのが簡単になるようなjxコマンドがいくつかあります。既存のプロジェクトで以下のコマンドを実行すると、いま取り組んでいるプロジェクトの種類を迅速にjxコマンドが検知します(例えば、Spring BootとかJHipsterとか、といった具合です)
以下のアクションも実行します。jx import <app_name>
- ビルドパイプラインの作成
- (GirHubの資格証明を使い)GitHubのようなリモートのGitサービスにプロジェクトの設定と、必要なWebhookの作成
- Helm ChartやMonocularといったKubernetes固有のツールのインストール
- 最終的にビルドを実行して、ステージング環境にデプロイ
既存のプロジェクトがない場合、組み込みのCI/CD(jxコマンドを利用)を使ってプロジェクトを立ち上げるなら、(再度ですが)jx createを使うのが最も簡単ですが、例えばSpring Bootアプリケーションを作成したい場合、生成されたコードをGitリポジトリにインポートし、JenkinsをCI/CDで利用し、以下のコマンドを実行します。jx promote --env production --version 1.0.1 <app_name>
このコマンドは以下の操作を実行します。jx create spring [flags]
- デフォルトの新しいSpring Bootアプリケーションを作成
- コードをGitリポジトリにチェックイン
- リモートのGitリポジトリ(GitHubなど)にコードをプッシュ
- Dockerfile、jenkinsfile、Helm Chartのdefaultを追加
- ビルドを実行し、staging環境にデプロイ
More Information
- Overview of Container Engine for Kubernetes (OKE)
https://docs.cloud.oracle.com/iaas/Content/ContEng/Concepts/contengoverview.htm?tocpath=Services%7CContainer%20Engine%7C_____0 - Installing jx on other OSs
https://jenkins-x.io/getting-started/install/ - jx create cluster oke
https://jenkins-x.io/commands/jx_create_cluster_oke/