KubernetesにJenkinsをインストールする方法
著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
継続的インテグレーション/継続的デプロイ(CI / CD)パイプラインは、DevOps環境のコアコンポーネントの1つです。 複数のチーム間のワークフローを合理化し、生産性を向上させるのに役立ちます。 Jenkinsは、CI/CDパイプラインをセットアップできる広く使用されているオープンソース自動化サーバーです。
このチュートリアルでは、KubernetesにJenkinsをインストールします。 次に、Jenkins UIにアクセスし、サンプルパイプラインを実行します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- 動作中のKubernetesクラスタと
kubectl
がワークステーションにセットアップされています。 Kubernetesクイックスタートに従って、DigitalOceanにKubernetesクラスターをセットアップします。
ステップ1—KubernetesへのJenkinsのインストール
Kubernetesには宣言型APIがあり、YAMLまたはJSONファイルを使用して目的の状態を伝えることができます。 このチュートリアルでは、YAMLファイルを使用してJenkinsをデプロイします。 クラスタにkubectl
コマンドが設定されていることを確認してください。
まず、kubectl
を使用して、Jenkins名前空間を作成します。
- kubectl create namespace jenkins
次に、JenkinsをデプロイするYAMLファイルを作成します。
nano
またはお好みのエディタを使用して、jenkins.yaml
という名前の新しいファイルを作成して開きます。
- nano jenkins.yaml
次に、次のコードを追加して、Jenkinsイメージ、そのポート、およびその他のいくつかの構成を定義します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
containers:
- name: jenkins
image: jenkins/jenkins:lts
ports:
- name: http-port
containerPort: 8080
- name: jnlp-port
containerPort: 50000
volumeMounts:
- name: jenkins-vol
mountPath: /var/jenkins_vol
volumes:
- name: jenkins-vol
emptyDir: {}
このYAMLファイルは、 Jenkins LTSイメージを使用してデプロイメントを作成し、ポート8080
と50000
も開きます。 これらのポートを使用して、Jenkinsにアクセスし、Jenkinsワーカーからの接続をそれぞれ受け入れます。
次に、jenkins
名前空間にこの展開を作成します。
- kubectl create -f jenkins.yaml --namespace jenkins
クラスターに数分待って、Jenkinsイメージをプルし、Jenkinsポッドを実行します。
kubectl
を使用して、ポッドの状態を確認します。
- kubectl get pods -n jenkins
次のような出力が表示されます。
NAME READY STATUS RESTARTS AGE
jenkins-6fb994cfc5-twnvn 1/1 Running 0 95s
ポッド名は環境によって異なることに注意してください。
ポッドが実行されたら、サービスを使用して公開する必要があります。 このチュートリアルでは、NodePortサービスタイプを使用します。 また、ワーカーがJenkinsに接続するためのClusterIPタイプのサービスを作成します。
jenkins-service.yaml
という名前の新しいファイルを作成して開きます。
- nano jenkins-service.yaml
次のコードを追加して、NodePortサービスを定義します。
apiVersion: v1
kind: Service
metadata:
name: jenkins
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 30000
selector:
app: jenkins
---
apiVersion: v1
kind: Service
metadata:
name: jenkins-jnlp
spec:
type: ClusterIP
ports:
- port: 50000
targetPort: 50000
selector:
app: jenkins
上記のYAMLファイルでは、NodePortサービスを定義してから、Jenkinsポッドのポート8080
をポート30000
に公開します。
次に、同じ名前空間にサービスを作成します。
- kubectl create -f jenkins-service.yaml --namespace jenkins
サービスが実行されていることを確認します。
- kubectl get services --namespace jenkins
次のような出力が表示されます。
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jenkins NodePort your_cluster_ip <none> 8080:30000/TCP 15d
NodePortとJenkinsが動作しているので、JenkinsUIにアクセスして探索を開始する準備が整います。
ステップ2—JenkinsUIへのアクセス
このステップでは、JenkinsUIにアクセスして探索します。 NodePortサービスには、クラスターノード全体のポート30000
からアクセスできます。 Jenkins UIにアクセスするには、ノードIPを取得する必要があります。
kubectl
を使用して、ノードIPを取得します。
- kubectl get nodes -o wide
kubectl
は、外部IPを使用して出力を生成します。
OutputNAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
your_node Ready <none> 16d v1.18.8 your_internal_ip your_external_ip Debian GNU/Linux 10 (buster) 4.19.0-10-cloud-amd64 docker://18.9.9
your_node Ready <none> 16d v1.18.8 your_internal_ip your_external_ip Debian GNU/Linux 10 (buster) 4.19.0-10-cloud-amd64 docker://18.9.9
your_node Ready <none> 16d v1.18.8 your_internal_ip your_external_ip Debian GNU/Linux 10 (buster) 4.19.0-10-cloud-amd64 docker://18.9.9
your_external_ip
値の1つをコピーします。
次に、Webブラウザーを開き、http://your_external_ip:30000
に移動します。
管理者パスワードと、Jenkinsポッドログからこのパスワードを取得する手順を尋ねるページが表示されます。
kubectl
を使用して、これらのログからパスワードを取得してみましょう。
まず、ターミナルに戻り、ポッド名を取得します。
- kubectl get pods -n jenkins
次のような出力が表示されます。
NAME READY STATUS RESTARTS AGE
jenkins-6fb994cfc5-twnvn 1/1 Running 0 9m54s
次に、ポッドのログで管理者パスワードを確認します。 強調表示されたセクションをポッド名に置き換えます。
- kubectl logs jenkins-6fb994cfc5-twnvn -n jenkins
パスワードを見つけるには、上下にスクロールする必要がある場合があります。
Running from: /usr/share/jenkins/jenkins.war
webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
. . .
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
your_jenkins_password
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
. . .
your_jenkins_password
をコピーします。 ブラウザに戻り、JenkinsUIに貼り付けます。
パスワードを入力すると、Jenkinsはプラグインをインストールするように促します。 異常なことは何もしていないので、推奨プラグインのインストールを選択します。
インストール後、Jenkinsは新しいページをロードし、管理者ユーザーを作成するように求めます。 フィールドに入力するか、スキップを押してこの手順をスキップし、adminリンクとして続行します。 これにより、ユーザー名は admin のままになり、パスワードはyour_jenkins_password
のままになります。
インスタンス構成について尋ねる別の画面が表示されます。 今ではないリンクをクリックして続行します。
この後、Jenkinsは選択内容の概要を作成し、 Jenkinsの準備ができました! Jenkinsの使用を開始をクリックすると、Jenkinsのホームページが表示されます。
クラスターにJenkinsをインストールして構成したので、その機能をデモンストレーションし、サンプルパイプラインを実行しましょう。
ステップ3—サンプルパイプラインの実行
Jenkinsは、パイプラインの作成とCI/CDワークフローの管理に優れています。 このステップでは、Jenkinsのサンプルパイプラインの1つを構築します。
Jenkinsのホームページから、左側のメニューの新しいアイテムリンクをクリックします。
新しいページが表示されます。 パイプラインを選択し、OKを押します。
Jenkinsはパイプラインの構成にリダイレクトします。 パイプラインセクションを見つけて、サンプルパイプラインドロップダウンメニューから HelloWorldを選択します。 このメニューは右側に表示されます。 Hello World を選択したら、保存ボタンをクリックします。
Jenkinsはパイプラインのホームページにリダイレクトします。 左側のメニューから今すぐビルドをクリックし、パイプラインが実行を開始するのを確認します。 #1 は、これが最初のビルドであることを示します。 タスクが完了すると、ビルドに関するいくつかの統計が表示されます。
コンソール出力をチェックして、パイプラインの実行中に何が起こったかを確認することもできます。 #1 にカーソルを合わせると、ドロップダウンメニューが表示されます。 コンソール出力を選択して、ビルドの詳細を表示します。
Hello World パイプラインはそれほど洗練されていませんが、JenkinsがCI/CDワークフローをどれだけうまく作成および管理できるかを示しています。
結論
このチュートリアルでは、KubernetesクラスターにJenkinsをインストールして構成してから、サンプルパイプラインを実行しました。 Jenkinsには、非常に複雑な操作を実行するのに役立つプラグインの大規模なリポジトリがあります。 GitHubリポジトリ、複数の種類のワーカーインスタンスなどを追加することもできます。 Jenkinsの使用方法の詳細については、Jenkinsの公式ドキュメントを参照してください。