本業のエンジニアの収入だけでは物足りない、副業で収入源を増やそうと考えている人は、副業の単価相場がいくらなのか気になりますよね。 自分にはスキルがあり、仕事も早めに切り上げたいのに、何故か他のプロジェクトへ入れられ、残業 […]
Kubernetes 時代の CI/CD「Jenkins X」とは? 〜中編 〜
Kubernetes 時代の CI/CD「Jenkins X」とは? 〜前編〜 で予告した通り、本記事では実際に Jenkins X をインストールし、どのような構成でクラスタが構築されるのかを見ていきたいと思います。
[adinserter block="1"]
目次
前提
本記事では、GKE (Google Kubernetes Engine) へ Jenkins X をデプロイする手順を紹介していきますので、まず Jenkins X をインストールする前に以下の事項を確認してください。
- GKE でクラスタを作成できるアカウント・権限を持っていること
- MacOS や Linux などのターミナル環境上で gcloud, kubectl コマンドがインストールされていること
- 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 アカウントが必要となります。
[adinserter block="1"]
インストールしてみよう
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 コマンドのリリースページから最新のものを選択してください- https://github.com/jenkins-x/jx/releases/
- 本記事では、上記のコマンドの通り 1.3.67 を利用します
上記を実行すると、システム上で 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)
[adinserter block="1"]
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
そして、ここまでで、インストールは完了です!お疲れさまでした!!
[adinserter block="1"]
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
簡単に見ていくと、稼働しているソフトウェアの概要は以下です。
- chartmuseum
- https://github.com/helm/chartmuseum
- private な Helm chart リポジトリを実現するソフトウェア
- docker-registry
- https://docs.docker.com/registry/
- private な Docker レジストリを実現するソフトウェア
- jenkins
- Jenkins X 本体
- monocular
- https://github.com/helm/monocular
- private な Helm chart リポジトリを参照する WebUI
- nexus
- https://github.com/jenkins-x/nexus
- private な Maven/npm リポジトリを実現するソフトウェア
[adinserter block="1"]
まとめ
本記事では、Jenkins X をインストールするために必要な jx ツールをインストールし、実際に GKE 上に Jenkins X が稼働するクラスタを構築するステップをご紹介しました。
次回は、構築した Jenkins X を利用し、サンプルとして用意されている quickstart プロジェクトを立ち上げて、Jenkins X がどのように CI/CD を実施するのかを見ていく予定です。
>Kubernetes 時代の CI/CD「Jenkins X」とは? 〜前編〜