Kubernetes時代のCI/CD Jenkins Xとは?-中編

Kubernetes時代の CI/CD Jenkins Xとは?|前編 で予告した通り、本記事では実際に Jenkins X をインストールし、どのような構成でクラスタが構築されるのかを見ていきたいと思います。

前提

本記事では、GKE (Google Kubernetes Engine) へ Jenkins X をデプロイする手順を紹介していきますので、まず Jenkins X をインストールする前に以下の事項を確認してください。

  1. GKE でクラスタを作成できるアカウント・権限を持っていること
  2. MacOS や Linux などのターミナル環境上で gcloud, kubectl コマンドがインストールされていること
    3 gcloud コマンドで 1. のアカウントでコマンドが実行できる状態になっている

    • gcloud auth login でログインている状態であれば問題ありません
    • 2., 3. については、Google Cloud Console 上で提供されている Google Cloud Shell を使うことで代替することもできます

この辺については、以下の記事が参考になります。

また、本記事では Git Provider として Jenkins X インストール時のデフォルト設定である GitHub を利用します。jx コマンドは、Jenkins X のインストール途中で、構築した Kubernetes クラスタ上に staging/production 環境としてアプリケーションを起動できるようにするための情報を GitHub 上のリポジトリとして登録するため、GitHub アカウントが必要となります。

インストールしてみよう

jx のインストール

jx コマンドとは、Jenkins X のインストールやプロジェクト管理などを行える、CLI ツールです。Jenkins X を使い始めるためには、まずこのツールを用意する必要があります。
jx コマンドをインストールするには、gcloud/kubectl が揃っている環境で以下を実行します。

$ curl -L https://github.com/jenkins-x/jx/releases/download/v1.3.167/jx-linux-amd64.tar.gz | tar xzv 
$ sudo mv jx /usr/local/bin
  • 1.3.167 の部分については、jx コマンドのリリースページから最新のものを選択してください

上記を実行すると、システム上で jx コマンドを実行することができるようになります。
ついでに、bash や zsh の Tab キーを用いた補完機能にも対応させてみましょう。
Ubuntu の bash 環境下では以下を実行してログインしなおすと、 jx コマンドと打った後に Tab キーを押すとコマンド候補が表示され、便利です。

$ jx completion bash | sudo tee /etc/bash_completion.d/jx
$ exit
(再度ログインする)
$ jx [Tab]
cloudbees    compliance   context      create       edit         gc           import       install      namespace    preview      prompt       rsh          start        step         sync         uninstall    upgrade
completion   console      controller   delete       environment  get          init         logs         open         promote      repository   shell        status       stop         team         update       version

Kubernetes クラスタの構築

それでは、クラスタを構築していきましょう。
まず、以下のコマンドを打ちます。

$ jx create cluster gke --skip-login

すると、以下のように GCP 上のプロジェクト選択肢が表示されますので、クラスタを構築するプロジェクトを矢印キーで選択して Enter を押します。

? Google Cloud Project:  [Use arrows to move, type to filter, ? for more help]
  project-a
  project-b
❯ project-c

いくつか jx 側で処理が実行されたのちに、以下のようなゾーン選択画面が表示されます。
東京リージョンであれば、 asia-northeast1 のいずれかのリージョンを選択しましょう。

? Google Cloud Zone:  [Use arrows to move, type to filter, ? for more help]
  asia-east1-a
  asia-east1-b
  asia-east1-c
❯ asia-northeast1-a
  asia-northeast1-b
  asia-northeast1-c
  asia-south1-a
  asia-south1-b
  asia-south1-c
  asia-southeast1-a

次に、起動するマシンタイプを選択画面が表示されます。Jenkins X では、最小でも n1-standard-2 を推奨しているようですので、 n1-standard-2 を選択します。
(「?」キーを押すと、選択肢に関する情報が出てきます)

ⓘ We recommend a minimum of n1-standard-2 for Jenkins X,  a table of machine descriptions can be found here https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-architecture
? Google Cloud Machine Type:  [Use arrows to move, type to filter]
  g1-small
  n1-standard-1
❯ n1-standard-2
  n1-standard-4
  n1-standard-8
  n1-standard-16
  n1-standard-32
  n1-standard-64
  n1-standard-96
  n1-highmem-2

次に、Kubernetes Node 最小数・最大数を入力します。Jenkins X では 3 Node を推奨していますが、今回はお試しのため最小 1・最大 2 に設定します。

ⓘ We recommend a minimum of 3 for Jenkins X,  the minimum number of nodes to be created in each of the cluster's zones
? Minimum number of Nodes (3)
? Maximum number of Nodes [? for help] (5)

ここまで入力すると、 Creating cluster... と表示され、実際にクラスタの構築が開始されます。(数分で終わると思います)
GKE 管理画面 を確認すると、クラスタが構築されている様子を確認できると思います。

Kubernetes クラスタの設定

クラスタ作成が完了すると、 jx はすかさずクラスタの準備に取り掛かってくれます。
この準備作業では、Kubernetes クラスタ上で Jenkins X が稼働するために必要となる Role/ServiceAccount の用意や、helm のインストールが行われます。

Initialising cluster ...
Git configured for user: Hoge Hogeo and email *******
Trying to create ClusterRoleBinding **********-cluster-admin-binding for role: cluster-admin for user *******
: clusterrolebindings.rbac.authorization.k8s.io "**********-cluster-admin-binding" not foundCreated ClusterRoleBinding **********-cluster-admin-binding
Created ServiceAccount tiller in namespace kube-system
Trying to create ClusterRoleBinding tiller for role: cluster-admin and ServiceAccount: kube-system/tiller
Created ClusterRoleBinding tiller
Initialising helm using ServiceAccount tiller in namespace kube-system
helm installed and configured

それが終わると、次は以下のような質問を聞かれます。ingress controller とは、Kubernetes クラスタ内で稼働するアプリケーションを、外部に公開するために必要なアプリケーションのことです。今回は、Jenkins X をインターネットからアクセスできるようにするため、 y と入力しましょう。
(GKE の場合は本来 ingress-gce が稼働しているはずなので、nginx-ingress-controller は不要なはずですが、ここで n を選択するとクラスタ上にインストールされたサービスへのアクセス経路がなぜか設定されないため、ここでは y とします)

? No existing ingress controller found in the kube-system namespace, shall we install one? [? for help] (Y/n)

入力すると、ingress controller のインストールが行われた後、構築した Kubernetes クラスタに対してアクセスするためのドメイン名について聞かれますが、今回はそのまま [Enter] を押します。

Waiting for external loadbalancer to be created and update the nginx-ingress-controller service in kube-system namespace
Note: this loadbalancer will fail to be provisioned if you have insufficient quotas, this can happen easily on a GKE free account. To view quotas run: gcloud compute project-info describe
External loadbalancer created
Waiting to find the external host name of the ingress controller Service in namespace kube-system with name jxing-nginx-ingress-controller
You can now configure a wildcard DNS pointing to the new loadbalancer address XXX.XXX.XXX.XXX

If you do not have a custom domain setup yet, Ingress rules will be set for magic dns nip.io.
Once you have a customer domain ready, you can update with the command jx upgrade ingress --cluster
If you don't have a wildcard DNS setup then setup a new CNAME and point it at: XXX.XXX.XXX.XXX.nip.io then use the DNS domain in the next input...
? Domain [? for help] (XXX.XXX.XXX.XXX.nip.io)

Jenkins X のインストール

ここまで完了すると、次はいよいよ Jenkins X のインストールです。
GitHub アカウント名について聞かれるので、前提で用意した GitHub アカウント名を入力します。

Lets set up a git username and API token to be able to perform CI/CD

? GitHub username for CI/CD pipelines:

次に、API token を発行するよう表示されるので、出力された URL へブラウザでアクセスして token を作成し、作成した token を入力しましょう。

To be able to create a repository on GitHub we need an API Token
Please click this URL https://github.com/settings/tokens/new?scopes=repo,read:user,read:org,user:email,write:repo_hook,delete_repo

Then COPY the token and enter in into the form below:

? API Token:

入力すると以下のように、Jenkins X が予め用意したクラウド環境向けの設定が入ったリポジトリが手元にクローンされ、Jenkins X のインストールが開始されます。

Cloning the Jenkins X cloud environments repo to /home/hoge/.jx/cloud-environments
Counting objects: 805, done.
Compressing objects: 100% (6/6), done.
Total 805 (delta 2), reused 6 (delta 2), pack-reused 797
Generated helm values /home/hoge/.jx/extraValues.yaml
Installing Jenkins X platform helm chart from: /home/hoge/.jx/cloud-environments/env-gke
waiting for install to be ready, if this is the first time then it will take a while to download images

ここまでメッセージが出ると少し時間がかかります。(10分程度)
やがて、インストールが終わると、以下のようなメッセージが続いて出力されます。指示の通り URL へアクセスし、admin/表示されているパスワードで Jenkins へログインしてください。ログイン後、ページ内に「APIトークンを表示」というボタンがありますので、それを押して出てきた API トークンを入力してください。

Jenkins X deployments ready in namespace jx

        ********************************************************

             NOTE: Your admin password is: XXXXXXXX

        ********************************************************

Getting Jenkins API Token
using url http://jenkins.jx.XXX.XXX.XXX.XXX.nip.io/me/configure
unable to automatically find API token with chromedp using URL http://jenkins.jx.XXX.XXX.XXX.XXX.nip.io/me/configure
Please go to http://jenkins.jx.XXX.XXX.XXX.XXX.nip.io/me/configure and click Show API Token to get your API Token
Then COPY the token and enter in into the form below:

? API Token:

API token を入力し終わると、staging/production 環境用の設定ファイルが置かれるリポジトリが GitHub 上に作成されます。

Created user admin API Token for Jenkins server jenkins.jx.XXX.XXX.XXX.XXX.nip.io at http://jenkins.jx.XXX.XXX.XXX.XXX.nip.io
Updating Jenkins with new external URL details http://jenkins.jx.XXX.XXX.XXX.XXX.nip.io
Creating default staging and production environments
Using git provider GitHub at https://github.com

About to create repository environment-speakerglow-staging on server https://github.com with user XXXXXX

Creating repository XXXXXX/environment-speakerglow-staging
Creating git repository XXXXXX/environment-speakerglow-staging
Pushed git repository to https://github.com/XXXXXX/environment-speakerglow-staging

Created environment staging
Created Jenkins Project: http://jenkins.jx.XXX.XXX.XXX.XXX.nip.io/job/XXXXXX/job/environment-speakerglow-staging/

Note that your first pipeline may take a few minutes to start while the necessary images get downloaded!

Creating github webhook for XXXXXX/environment-speakerglow-staging for url http://jenkins.jx.XXX.XXX.XXX.XXX.nip.io/github-webhook/
Using git provider GitHub at https://github.com

About to create repository environment-speakerglow-production on server https://github.com with user XXXXXX

Creating repository XXXXXX/environment-speakerglow-production
Creating git repository XXXXXX/environment-speakerglow-production
Pushed git repository to https://github.com/XXXXXX/environment-speakerglow-production

Created environment production
Created Jenkins Project: http://jenkins.jx.XXX.XXX.XXX.XXX.nip.io/job/XXXXXX/job/environment-speakerglow-production/

Note that your first pipeline may take a few minutes to start while the necessary images get downloaded!

Creating github webhook for XXXXXX/environment-speakerglow-production for url http://jenkins.jx.XXX.XXX.XXX.XXX.nip.io/github-webhook/

ここで作成される GitHub リポジトリには、今回インストールした Jenkins X の webhook 用エンドポイントにアクセスするような webhook 設定が予め追加されます。
つまり、このリポジトリに対して push すると、自動的に Jenkins X 上のジョブが実行されるように設定されます。

Jenkins X installation completed successfully

        ********************************************************

             NOTE: Your admin password is: XXXXXXXX

        ********************************************************

Your kubernetes context is now set to the namespace: jx
To switch back to your original namespace use: jx ns default
For help on switching contexts see: https://jenkins-x.io/developing/kube-context/

To import existing projects into Jenkins:       jx import
To create a new Spring Boot microservice:       jx create spring -d web -d actuator
To create a new microservice from a quickstart: jx create quickstart

そして、ここまでで、インストールは完了です!お疲れさまでした!!

Jenkins X へのアクセス

インストール完了時に出るメッセージ中に記載された http://jenkins.jx.XXX.XXX.XXX.XXX.nip.io/ にアクセスすると、Jenkins X へアクセスすることができます。
アクセスすると、ユーザ名・パスワードを求められますが、ユーザ名は admin 、パスワードはインストール完了後に出てくるパスワードを入力すればログインできます。
もし万が一パスワードを忘れたとしても、jx コマンドで構築した際に以下のディレクトリに設定ファイルが残っていますので、そのファイルを見ることでパスワードを確認できます。

$ cat ~/.jx/jenkinsAuth.yaml
servers:
- url: http://jenkins.jx.XXX.XXX.XXX.XXX.nip.io
  users:
  - username: admin
    apitoken: XXXXXXXXXX
    bearertoken: ""
    password: XXXXXXXXXX
    ^^^^^^^^^^^^^^^^^^^^ これが admin のパスワードです
  name: jenkins.jx.XXX.XXX.XXX.XXX.nip.io
  kind: ""
  currentuser: ""
defaultusername: ""
currentserver: http://jenkins.jx.XXX.XXX.XXX.XXX.nip.io

インストール後の Jenkins X・その他コンポーネントの構成

jx コマンドでクラスタ構築が完了した後、クラスタ上では以下の様な Pod が稼働し、Ingress 経由でサービス公開されます。

$ kubectl get pod --all-namespaces
NAMESPACE     NAME                                                   READY     STATUS      RESTARTS   AGE
jx            jenkins-6dc7ff9cfd-f28gf                               1/1       Running     0          2d
jx            jenkins-x-chartmuseum-7b95b777b-r7qhs                  1/1       Running     0          2d
jx            jenkins-x-docker-registry-dcb6d6d44-w9c6q              1/1       Running     0          2d
jx            jenkins-x-gc-activities-1534714200-rwm2p               0/1       Completed   0          4h
jx            jenkins-x-gc-activities-1534723200-bcdwj               0/1       Completed   0          2h
jx            jenkins-x-gc-activities-1534725000-5pk5c               0/1       Completed   0          1h
jx            jenkins-x-gc-previews-1534701600-bqcbn                 0/1       Completed   0          8h
jx            jenkins-x-gc-previews-1534712400-5kd6j                 0/1       Completed   0          5h
jx            jenkins-x-gc-previews-1534723200-wprdp                 0/1       Completed   0          2h
jx            jenkins-x-heapster-96bd95dcf-bgxps                     2/2       Running     0          2d
jx            jenkins-x-mongodb-6c84f866dc-hp2bc                     1/1       Running     0          2d
jx            jenkins-x-monocular-api-8499d45598-s5gxn               1/1       Running     3          2d
jx            jenkins-x-monocular-prerender-6d8897856-x87lh          1/1       Running     0          2d
jx            jenkins-x-monocular-ui-967d8d8d9-h7h6p                 1/1       Running     1          2d
jx            jenkins-x-nexus-7c6c4579fd-9jws7                       1/1       Running     0          2d
jx            pipelinecontroller-5dbc96bbd4-hmrsr                    1/1       Running     0          2d
kube-system   event-exporter-v0.1.9-5c8fb98cdb-zrbs8                 2/2       Running     0          2d
kube-system   fluentd-gcp-v2.0.17-gsw5d                              2/2       Running     0          2d
kube-system   fluentd-gcp-v2.0.17-pbdd6                              2/2       Running     0          24m
kube-system   heapster-v1.5.2-5fc46bc685-mz9bj                       3/3       Running     0          2d
kube-system   jxing-nginx-ingress-controller-86c769695f-ndkw4        1/1       Running     0          2d
kube-system   jxing-nginx-ingress-default-backend-5dbcb4b48b-csjzn   1/1       Running     0          2d
kube-system   kube-dns-5dcfcbf5fb-9z8bm                              4/4       Running     0          2d
kube-system   kube-dns-5dcfcbf5fb-9zbkr                              4/4       Running     0          24m
kube-system   kube-dns-autoscaler-69c5cbdcdd-kgtm8                   1/1       Running     0          2d
kube-system   kube-proxy-gke-speakerglow-pool-1-6c92678d-cjxx        1/1       Running     0          2d
kube-system   kube-proxy-gke-speakerglow-pool-1-6c92678d-j1c2        1/1       Running     0          24m
kube-system   kubernetes-dashboard-bf9c699db-64df7                   1/1       Running     0          2d
kube-system   l7-default-backend-57856c5f55-8r9dx                    1/1       Running     0          2d
kube-system   metrics-server-v0.2.1-7f8dd98c8f-9jlrf                 2/2       Running     0          2d
kube-system   tiller-deploy-5cd7c76b66-pph9h                         1/1       Running     0          22m

$ kubectl get ing --all-namespaces
NAMESPACE   NAME              HOSTS                                       ADDRESS          PORTS     AGE
jx          chartmuseum       chartmuseum.jx.XXX.XXX.XXX.XXX.nip.io       XXX.XXX.XXX.XXX   80        2d
jx          docker-registry   docker-registry.jx.XXX.XXX.XXX.XXX.nip.io   XXX.XXX.XXX.XXX   80        2d
jx          jenkins           jenkins.jx.XXX.XXX.XXX.XXX.nip.io           XXX.XXX.XXX.XXX   80        2d
jx          monocular         monocular.jx.XXX.XXX.XXX.XXX.nip.io         XXX.XXX.XXX.XXX   80        2d
jx          nexus             nexus.jx.XXX.XXX.XXX.XXX.nip.io             XXX.XXX.XXX.XXX   80        2d

簡単に見ていくと、稼働しているソフトウェアの概要は以下です。

まとめ

本記事では、Jenkins X をインストールするために必要な jx ツールをインストールし、実際に GKE 上に Jenkins X が稼働するクラスタを構築するステップをご紹介しました。
次回は、構築した Jenkins X を利用し、サンプルとして用意されている quickstart プロジェクトを立ち上げて、Jenkins X がどのように CI/CD を実施するのかを見ていく予定です

関連記事と次編

Kubernetes時代のCI/CD Jenkins Xとは?-前編

CircleCI 2.1とkubernetesで動作するアプリケーションの CI/CD 事始め

KubernetesのCI/CD Jenkins Xとは?|後編

Kubernetes時代のCI/CD Jenkins Xとは?|最終回