はじめに
Jenkinsは継続的インテグレーションです ソフトウェア開発プロセスの大部分を自動化するツール。複雑なマイクロサービス環境で複数のプロジェクトに取り組んでいる複数の開発チームは、限られたリソースに負担をかける可能性があります。 Jenkinsは、完璧な最終製品をスケジュールどおりに納品するお手伝いをします。
Kubernetesクラスターは、Jenkinsに新しい自動化レイヤーを追加します。 Kubernetesは、リソースが効果的に使用され、サーバーと基盤となるインフラストラクチャが過負荷にならないようにします。
このチュートリアルでは、KubernetesクラスターにJenkinsをインストールする方法を説明します。
前提条件
- コマンドライン/ターミナルへのアクセス
- Kubernetesクラスター
- ローカルマシンで完全に構成されたkubectlコマンドラインツール
KubernetesクラスターへのJenkinsのインストール
コンテナのデプロイを調整するKubernetesの機能により、Jenkinsは常に適切な量のリソースを利用できます。以下の例は、YAMLファイルのセットを使用してKubernetesクラスターにJenkinsをインストールする方法を示しています。 。 YAMLファイルは簡単に追跡、編集でき、無期限に再利用できます。
Jenkinsデプロイメントの名前空間を作成する
個別の名前空間は、分離の追加レイヤーを提供し、継続的インテグレーション環境をより詳細に制御します。ターミナルで次のコマンドを入力して、Jenkinsデプロイメントの名前空間を作成します。
kubectl create namespace jenkins
名前空間の名前は、DNS互換のラベルである必要があります。この例では、 jenkinsという名前を使用しています。 。
次のコマンドを使用して、既存のネームスペースを一覧表示します。
kubectl get namespaces
出力は、 jenkins 名前空間が正常に作成されました。
サービスアカウントを作成する
サービスアカウントは、ポッドプロセスを制御するために使用されるIDを提供します。テキストエディタを使用して、サービスアカウント宣言を保存するYAMLファイルを作成します。
nano sa-jenkins.yaml
このファイルは、管理者権限を持つクラスターの役割を定義します。また、 admin
という名前の新しいサービスアカウントを作成します 以前に定義したクラスターの役割とバインドします。
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: admin
rules:
- apiGroups: [""]
resources: ["*"]
verbs: ["*"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: jenkins
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: admin
subjects:
- kind: ServiceAccount
name: admin
namespace: jenkins
ファイルを保存して終了します。 kubectl apply
を使用して構成を適用します 。
kubectl apply -f sa-jenkins.yaml
Jenkins永続ボリュームと永続ボリュームクレームの作成
永続ボリュームの役割は、基本的なJenkinsデータを保存し、ポッドの存続期間を超えて保存することです。デプロイのストレージ関連コンポーネントを定義するYAMLファイルを作成します:
nano volume-jenkins.yaml
最初のセクションで、ファイルは local-storage
を宣言します ストレージクラス。 2番目のセクションでは、 jenkins-pv
を定義します 永続ボリューム、3番目は永続ボリュームクレームを作成します jenkins-pvc
これはjenkins-pv
にバインドされます 音量。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-pv
labels:
type: local
spec:
storageClassName: local-storage
claimRef:
name: jenkins-pvc
namespace: jenkins
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- minikube
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-pvc
namespace: jenkins
spec:
storageClassName: local-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
ファイルを保存して終了します。次に、ファイルを適用します。
kubectl apply -f volume-jenkins.yaml
Jenkinsデプロイメントファイルを作成して適用する
Jenkinsのデプロイ情報を保存するYAMLファイルを作成します。
nano deploy-jenkins.yaml
この例のデプロイメントファイルは、 jenkins / jenkins:ltsを利用しています。 Dockerイメージと1つのレプリカを作成します ポート8080で公開されます 。
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins-server
template:
metadata:
labels:
app: jenkins-server
spec:
securityContext:
fsGroup: 1000
runAsUser: 1000
serviceAccountName: admin
containers:
- name: jenkins
image: jenkins/jenkins:lts
resources:
limits:
memory: "2Gi"
cpu: "1000m"
requests:
memory: "500Mi"
cpu: "500m"
ports:
- name: httpport
containerPort: 8080
- name: jnlpport
containerPort: 50000
livenessProbe:
httpGet:
path: "/login"
port: 8080
initialDelaySeconds: 90
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 5
readinessProbe:
httpGet:
path: "/login"
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
volumeMounts:
- name: jenkins-data
mountPath: /var/jenkins_home
volumes:
- name: jenkins-data
persistentVolumeClaim:
claimName: jenkins-pvc
volumeMounts
ファイルのセクションは、前の手順で作成された永続ボリュームをマウントします。 livenessProbe
およびreadinessProbe
セクションは、失敗したポッドを再起動し、ポッドの準備ができたことを検出するプローブを宣言します。
ファイルを終了し、変更を保存します。新しく作成したファイルを使用してJenkinsをデプロイします:
kubectl apply -f deploy-jenkins.yaml
Jenkinsサービスファイルを作成して適用する
Kubernetesサービスは、Jenkinsをより広いネットワークに公開する抽象化です。これにより、クラスター内で行われている変更に関係なく、ポッドへの永続的な接続を維持できます。
サービスを定義するYAMLファイルを作成します:
nano service-jenkins.yaml
次のコンテンツを追加します:
apiVersion: v1
kind: Service
metadata:
name: jenkins-svc
namespace: jenkins
annotations:
prometheus.io/scrape: 'true'
prometheus.io/path: /
prometheus.io/port: '8080'
spec:
selector:
app: jenkins-server
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 44000
ファイルを保存して終了します。次に、次のように入力してサービスを作成します。
kubectl apply -f jenkins-service.yaml
これで、Jenkinsダッシュボードにアクセスできます。
Jenkinsダッシュボードにアクセス
Jenkinsの起動に進む前に、デプロイしたすべてのコンポーネントが意図したとおりに機能しているかどうかを確認してください。 kubectl get all
を使用します コマンドを実行し、正しい名前空間を指定します:
kubect get all -n jenkins
この例は、適切に機能するデプロイメントを示しています。
- ポッドは
READY
としてマークされています およびRunning
。 - サービスのクラスターIPとポートが正常に割り当てられました。
- デプロイメントは
READY
としてマークされます およびAVAILABLE
。 - 必要なレプリカ数(1)に達しました。
ブラウザに移動し、IPアドレスとサービスファイルで定義したポートを使用してノードにアクセスします。ノードのIPアドレスがわからない場合は、次のコマンドの出力で見つけてください。
kubectl get nodes -o yaml
ノードのIPアドレスはstatus
にあります 出力のセクション。
例の情報を使用すると、Jenkinsダッシュボードのアドレスは次のようになります。
http://192.168.49.2:44000
Jenkinsにアクセスするには、最初にクレデンシャルを入力する必要があります。新規インストールのデフォルトのユーザー名はadminです 。
パスワードを取得するには:
1. kubectl get all
の出力でポッドの名前を見つけます 上記のコマンド。
2.ポッドの名前を見つけたら、それを使用してポッドのログにアクセスします。
kubectl logs jenkins-56c9d59dc-pv8kc --namespace jenkins
3.ログの最後にある長い英数字の文字列としてフォーマットされたパスワードを見つけます。
これで、JenkinsがKubernetesクラスターに正常にインストールされ、それを使用して新しい効率的な開発パイプラインを作成できます。