4.2.3.6. Jenkins Kubernetes 플러그인 구성
OpenShift Container Platform Jenkins 이미지에는 Kubernetes 및 OpenShift Container Platform을 사용하여 여러 컨테이너 호스트에서 Jenkins 에이전트를 동적으로 프로비저닝할 수 있는 사전 설치된 Kubernetes 플러그인이 포함되어 있습니다.
Kubernetes 플러그인을 사용하도록 OpenShift Container Platform은 Jenkins 에이전트로 사용하기에 적합한 5개의 이미지( 기본, Maven, Node.js )를 제공합니다. 자세한 내용은 Jenkins 에이전트 를 참조하십시오.
jenkins-slave-maven-* 및 jenkins-slave-nodejs-* 이미지는 v3.10 릴리스 주기 동안 더 이상 사용되지 않는 것으로 표시됩니다. 사용자가 애플리케이션을 최신 jenkins-agent-maven-* 및 jenkins-agent-nodejs-* 이미지로 마이그레이션할 수 있도록 이미지가 중간에 계속 존재합니다.
Maven 및 Node.js 에이전트 이미지 둘 다 OpenShift Container Platform Jenkins 이미지의 쿠버네티스 플러그인 구성에서 쿠버네티스 포드 템플릿 이미지로 자동 구성됩니다. 해당 구성에는 "이 프로젝트를 실행할 수 있는" 설정에 따라 모든 Jenkins 작업에 적용할 수 있는 각 이미지의 레이블이 포함됩니다. 레이블이 적용되면 해당 에이전트 이미지를 실행하는 OpenShift Container Platform Pod에서 지정된 작업 실행이 수행됩니다.
Jenkins 이미지는 Kubernetes 플러그인의 추가 에이전트 이미지 자동 검색 및 자동 구성 기능도 제공합니다. OpenShift 동기화 플러그인 을 사용하면 Jenkins 시작 시 Jenkins 이미지가 실행 중인 프로젝트 또는 플러그인 구성에 구체적으로 나열된 프로젝트에서 다음을 검색합니다.
-
role
레이블이jenkins-slave
로 설정된 이미지 스트림 -
role
주석이jenkins-slave
로 설정된 이미지 스트림 태그 -
role
레이블이jenkins-slave
로 설정된 ConfigMap
적절한 레이블이 있는 이미지 스트림 또는 적절한 주석이 있는 이미지 스트림 태그를 찾으면 해당 Kubernetes 플러그인 구성이 생성되므로 이미지 스트림에서 제공하는 컨테이너 이미지를 실행하는 포드에서 Jenkins 작업을 실행하도록 할당할 수 있습니다.
이미지 스트림 또는 이미지 스트림 태그의 이름 및 이미지 참조는 Kubernetes 플러그인 pod 템플릿의 이름 및 이미지 필드에 매핑됩니다. slave-label
키로 이미지 스트림 또는 이미지 스트림 태그 오브젝트에 주석을 설정하여 Kubernetes 플러그인 pod 템플릿의 레이블 필드를 제어할 수 있습니다. 그러지 않으면 이름이 레이블로 사용됩니다.
적절한 레이블이 있는 ConfigMap을 찾으면 ConfigMap의 키-값 데이터 페이로드에 있는 값에 Jenkins 및 Kubernetes 플러그인 pod 템플릿의 구성 형식과 일치하는 XML이 포함되어 있다고 가정합니다. 이미지 스트림 또는 이미지 스트림 태그 대신 ConfigMap을 사용할 때 유의해야 할 중요한 차이점은 Kubernetes 플러그인 pod 템플릿의 모든 다양한 필드를 제어할 수 있다는 것입니다.
다음은 예제 ConfigMap입니다.
kind: ConfigMap apiVersion: v1 metadata: name: jenkins-agent labels: role: jenkins-slave data: template1: |- <org.csanchez.jenkins.plugins.kubernetes.PodTemplate> <inheritFrom></inheritFrom> <name>template1</name> <instanceCap>2147483647</instanceCap> <idleMinutes>0</idleMinutes> <label>template1</label> <serviceAccount>jenkins</serviceAccount> <nodeSelector></nodeSelector> <volumes/> <containers> <org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate> <name>jnlp</name> <image>openshift/jenkins-agent-maven-35-centos7:v3.10</image> <privileged>false</privileged> <alwaysPullImage>true</alwaysPullImage> <workingDir>/tmp</workingDir> <command></command> <args>${computer.jnlpmac} ${computer.name}</args> <ttyEnabled>false</ttyEnabled> <resourceRequestCpu></resourceRequestCpu> <resourceRequestMemory></resourceRequestMemory> <resourceLimitCpu></resourceLimitCpu> <resourceLimitMemory></resourceLimitMemory> <envVars/> </org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate> </containers> <envVars/> <annotations/> <imagePullSecrets/> <nodeProperties/> </org.csanchez.jenkins.plugins.kubernetes.PodTemplate>
시작된 후 OpenShift 동기화 플러그인 은 OpenShift Container Platform의 API 서버를 모니터링하여 ImageStreams
,ImageStreamTags
, ConfigMaps
에 대한 업데이트를 확인하고 Kubernetes 플러그인의 구성을 조정합니다.
특히 다음 규칙이 적용됩니다.
-
ConfigMap
,ImageStream
또는ImageStreamTag
에서 레이블 또는 주석을 제거하면 Kubernetes 플러그인 구성에서 기존PodTemplate
이 삭제됩니다. - 마찬가지로 이러한 오브젝트가 제거되면 Kubernetes 플러그인에서 해당 구성이 제거됩니다.
-
반대로 적절히 레이블 또는 주석이 달린
ConfigMap
,ImageStream
또는ImageStreamTag
오브젝트를 생성하거나 초기 생성 후 레이블을 추가하면 쿠버네티스 플러그인 구성에PodTemplate
이 생성됩니다. -
ConfigMap
양식을 통한PodTemplate
의 경우PodTemplate
의ConfigMap
데이터에 대한 변경 사항이 Kubernetes 플러그인 구성의PodTemplate
설정에 적용되며ConfigMap
변경 간에 Jenkins UI를 통해 변경한PodTemplate
변경 사항이 재정의됩니다.
컨테이너 이미지를 Jenkins 에이전트로 사용하려면 이미지가 슬레이브 에이전트를 진입점으로 실행해야 합니다. 이 작업에 대한 자세한 내용은 공식 Jenkins 문서를 참조하십시오.
4.2.3.6.1. 권한 고려 사항
이전 ConfigMap 예에서 Pod 템플릿 XML의 < serviceAccount
> 요소는 결과 Pod에 사용되는 OpenShift Container Platform 서비스 계정입니다. 서비스 계정과 연결된 권한을 사용하여 Pod에 마운트된 서비스 계정 인증 정보는 포드에서 허용되는 OpenShift Container Platform 마스터 작업을 제어합니다.
다음은 OpenShift Container Platform Jenkins 이미지에서 실행되는 Kubernetes 플러그인에서 시작되는 Pod에 사용되는 서비스 계정을 고려합니다.
-
OpenShift Container Platform에서 제공하는 Jenkins에 대한 템플릿 예를 사용하는 경우 Jenkins가 실행되는 프로젝트에 대해
jenkins
서비스 계정이edit
역할로 정의되고 마스터 Jenkins 포드에 해당 서비스 계정이 마운트됩니다. - Jenkins 구성에 삽입된 두 개의 기본 Maven 및 NodeJS 포드 템플릿도 마스터와 동일한 서비스 계정을 사용하도록 설정됩니다.
- 필요한 레이블 또는 주석이 있는 이미지 스트림 또는 이미지 스트림 태그의 결과로 OpenShift 동기화 플러그인에서 자동으로 검색하면 해당 서비스 계정이 마스터의 서비스 계정으로 설정됩니다.
- Jenkins 및 쿠버네티스 플러그인에 포드 템플릿 정의를 제공할 수 있는 그 밖의 방법에서는 사용할 서비스 계정을 명시적으로 지정해야 합니다.
-
다른 방법으로는 Jenkins 콘솔을 사용하거나 쿠버네티스 플러그인에서 제공하는
podTemplate
파이프라인 DSL을 포함하거나 포드 템플릿의 XML 구성 데이터가 있는 ConfigMap에 레이블을 지정하는 방법이 있습니다. -
서비스 계정의 값을 지정하지 않으면
default
서비스 계정이 사용됩니다. - 사용 중인 모든 서비스 계정이 OpenShift Container Platform 내에 정의된 필요한 권한, 역할 등을 가지고 포드 내에서 조작할 수 있는 모든 프로젝트를 조작해야 합니다.