1.6. Jenkins Kubernetes 플러그인 구성
OpenShift Jenkins 이미지에는 Jenkins용 사전 설치된 Kubernetes 플러그인이 포함되어 Kubernetes 및 OpenShift Dedicated를 사용하여 여러 컨테이너 호스트에서 Jenkins 에이전트를 동적으로 프로비저닝할 수 있습니다.
Kubernetes 플러그인을 사용하기 위해 OpenShift Dedicated는 Jenkins 에이전트로 사용하기에 적합한 OpenShift 에이전트 기본 이미지를 제공합니다.
OpenShift Dedicated 4.11은 OpenShift Jenkins 및 OpenShift Agent 기본 이미지를 registry.redhat.io
의 ocp-tools-4
리포지토리로 이동하여 Red Hat이 OpenShift Dedicated 라이프 사이클 외부에서 이미지를 생성하고 업데이트할 수 있습니다. 이전에는 이러한 이미지가 OpenShift Dedicated 설치 페이로드에 있고 registry.redhat.io
의 openshift4
리포지토리에 있었습니다.
OpenShift Jenkins Maven 및 NodeJS Agent 이미지는 OpenShift Dedicated 4.11 페이로드에서 제거되었습니다. Red Hat은 더 이상 이러한 이미지를 생성하지 않으며 registry.redhat.io
의 ocp-tools-4
리포지토리에서 사용할 수 없습니다. Red Hat은 OpenShift Dedicated 라이프사이클 정책에 따라 중요한 버그 수정 또는 보안 CVE에 대해 4.10 및 이전 버전의 이미지를 유지 관리합니다.
자세한 내용은 다음 "추가 리소스" 섹션의 "OpenShift Jenkins 이미지에 대한 중요한 변경 사항" 링크를 참조하십시오.
Maven 및 Node.js 에이전트 이미지는 Kubernetes 플러그인의 OpenShift Dedicated Jenkins 이미지 구성에서 Kubernetes pod 템플릿 이미지로 자동 구성됩니다. 해당 구성에는 Restrict where this project can be run
아래의 모든 Jenkins 작업에 적용할 수 있는 각 이미지의 레이블이 포함됩니다. 라벨이 적용되면 해당 에이전트 이미지를 실행하는 OpenShift Dedicated Pod에서 작업이 실행됩니다.
OpenShift Dedicated 4.10 이상에서는 Kubernetes 플러그인을 사용하여 Jenkins 에이전트를 실행하는 데 권장되는 패턴은 jnlp
및 사이드카
컨테이너가 모두 있는 pod 템플릿을 사용하는 것입니다. jnlp
컨테이너는 OpenShift Dedicated Jenkins Base 에이전트 이미지를 사용하여 빌드에 대해 별도의 Pod를 쉽게 시작할 수 있습니다. sidecar
컨테이너 이미지에는 시작된 별도의 Pod 내에서 특정 언어로 빌드하는 데 필요한 툴이 있습니다. Red Hat Container Catalog의 많은 컨테이너 이미지는 openshift
네임스페이스의 샘플 이미지 스트림에서 참조됩니다. OpenShift Dedicated Jenkins 이미지에는 이 방법을 보여주는 사이드카 컨테이너가 있는 java-build
라는 pod 템플릿이 있습니다. 이 pod 템플릿은 openshift
네임스페이스의 java
이미지 스트림에서 제공하는 최신 Java 버전을 사용합니다.
Jenkins 이미지는 Kubernetes 플러그인의 추가 에이전트 이미지 자동 검색 및 자동 구성 기능도 제공합니다.
OpenShift Dedicated 동기화 플러그인을 사용하면 Jenkins 시작 시 Jenkins 이미지가 실행 중인 프로젝트 또는 플러그인 구성에 나열된 프로젝트 내에서 다음 항목을 검색합니다.
-
role
라벨이jenkins-agent
로 설정된 이미지 스트림입니다. -
role
주석이jenkins-agent
로 설정된 이미지 스트림 태그입니다. -
role
레이블이jenkins-agent
로 설정된 구성 맵입니다.
Jenkins 이미지에서 적절한 레이블이 있는 이미지 스트림 또는 적절한 주석이 있는 이미지 스트림 태그를 찾으면 해당 Kubernetes 플러그인 구성이 생성됩니다. 이렇게 하면 이미지 스트림에서 제공하는 컨테이너 이미지를 실행하는 포드에서 Jenkins 작업을 실행하도록 할당할 수 있습니다.
이미지 스트림 또는 이미지 스트림 태그의 이름 및 이미지 참조는 Kubernetes 플러그인 pod 템플릿의 이름 및 이미지 필드에 매핑됩니다. agent-label
키로 이미지 스트림 또는 이미지 스트림 태그 오브젝트에 주석을 설정하여 Kubernetes 플러그인 pod 템플릿의 레이블 필드를 제어할 수 있습니다. 그러지 않으면 이름이 레이블로 사용됩니다.
Jenkins 콘솔에 로그인하지 말고 pod 템플릿 구성을 변경합니다. pod 템플릿이 생성된 후 이 작업을 수행하고 OpenShift Dedicated Sync 플러그인에서 이미지 스트림 또는 이미지 스트림 태그와 연결된 이미지가 변경되었음을 감지하면 pod 템플릿을 교체하고 해당 구성 변경 사항을 덮어씁니다. 새 구성은 기존 구성과 병합할 수 없습니다.
보다 복잡한 구성이 필요한 경우 구성 맵 접근 방법을 고려하십시오.
적절한 레이블이 있는 구성 맵을 찾으면 Jenkins 이미지는 구성 맵의 키-값 데이터 페이로드에 있는 값에 Jenkins 및 Kubernetes 플러그인 pod 템플릿의 구성 형식과 일치하는 XML(Extensible Markup Language)이 포함되어 있다고 가정합니다. 이미지 스트림 및 이미지 스트림 태그에 대한 구성 맵의 한 가지 주요 장점은 모든 Kubernetes 플러그인 pod 템플릿 매개변수를 제어할 수 있다는 것입니다.
jenkins-agent
의 예제 구성 맵은 다음과 같습니다.
kind: ConfigMap apiVersion: v1 metadata: name: jenkins-agent labels: role: jenkins-agent 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
네임스페이스에서 이미지 스트림을 참조하는 두 개의 컨테이너를 보여줍니다. 하나의 컨테이너는 Jenkins 에이전트로 포드를 시작하기 위한 JNLP 계약을 처리합니다. 다른 컨테이너에서는 특정 코딩 언어로 코드를 빌드하는 데 툴이 포함된 이미지를 사용합니다.
kind: ConfigMap apiVersion: v1 metadata: name: jenkins-agent labels: role: jenkins-agent data: template2: |- <org.csanchez.jenkins.plugins.kubernetes.PodTemplate> <inheritFrom></inheritFrom> <name>template2</name> <instanceCap>2147483647</instanceCap> <idleMinutes>0</idleMinutes> <label>template2</label> <serviceAccount>jenkins</serviceAccount> <nodeSelector></nodeSelector> <volumes/> <containers> <org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate> <name>jnlp</name> <image>image-registry.openshift-image-registry.svc:5000/openshift/jenkins-agent-base-rhel8:latest</image> <privileged>false</privileged> <alwaysPullImage>true</alwaysPullImage> <workingDir>/home/jenkins/agent</workingDir> <command></command> <args>\$(JENKINS_SECRET) \$(JENKINS_NAME)</args> <ttyEnabled>false</ttyEnabled> <resourceRequestCpu></resourceRequestCpu> <resourceRequestMemory></resourceRequestMemory> <resourceLimitCpu></resourceLimitCpu> <resourceLimitMemory></resourceLimitMemory> <envVars/> </org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate> <org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate> <name>java</name> <image>image-registry.openshift-image-registry.svc:5000/openshift/java:latest</image> <privileged>false</privileged> <alwaysPullImage>true</alwaysPullImage> <workingDir>/home/jenkins/agent</workingDir> <command>cat</command> <args></args> <ttyEnabled>true</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>
Jenkins 콘솔에 로그인하지 말고 pod 템플릿 구성을 변경합니다. pod 템플릿이 생성된 후 이 작업을 수행하고 OpenShift Dedicated Sync 플러그인에서 이미지 스트림 또는 이미지 스트림 태그와 연결된 이미지가 변경되었음을 감지하면 pod 템플릿을 교체하고 해당 구성 변경 사항을 덮어씁니다. 새 구성은 기존 구성과 병합할 수 없습니다.
보다 복잡한 구성이 필요한 경우 구성 맵 접근 방법을 고려하십시오.
OpenShift Dedicated 동기화 플러그인이 설치되면 이미지 스트림, 이미지 스트림 태그 및 구성 맵에 대한 업데이트를 위해 OpenShift Dedicated의 API 서버를 모니터링하고 Kubernetes 플러그인의 구성을 조정합니다.
적용되는 규칙은 다음과 같습니다.
-
구성 맵, 이미지 스트림 또는 이미지 스트림 태그에서 레이블 또는 주석을 제거하면 Kubernetes 플러그인 구성에서 기존
PodTemplate
이 삭제됩니다. - 이러한 오브젝트가 제거되면 Kubernetes 플러그인에서 해당 구성이 제거됩니다.
-
레이블 또는 주석이 적절히 지정된
ConfigMap
,ImageStream
또는ImageStreamTag
오브젝트를 생성하거나 초기 생성 후 라벨을 추가하면 Kubernetes-plugin 구성에PodTemplate
이 생성됩니다. -
구성 맵 형식별
PodTemplate
의 경우PodTemplate
의 구성 맵 데이터에 대한 변경 사항이 Kubernetes 플러그인 구성의PodTemplate
설정에 적용됩니다. 변경 사항은 구성 맵 변경 사이에 Jenkins UI를 통해PodTemplate
의 변경 사항도 덮어씁니다.
컨테이너 이미지를 Jenkins 에이전트로 사용하려면 이미지가 에이전트를 진입점으로 실행해야 합니다. 자세한 내용은 공식 Jenkins 설명서를 참조하십시오.