data engineering

jenkins in kubernetes RBAC, configure master, slave node

qkqhxla1 2020. 6. 29. 23:23

랜쳐 쿠버네티스에서 젠킨스 앱을 만들어서 젠킨스를 쓰고있다. 최근에 어떠한 이유로 젠킨스를 처음부터 새로 세팅해야 했다. 일반적인 메모리 설정이라던지.. 계정 설정이라던지 등의 일반적인 설정 말고 쿠버네티스와 관련된 설정을 적는다.



1. RBAC.


젠킨스에서 쿠버네티스의 자원에 접근이 필요할 경우 권한이 필요하다.(젠킨스가 쿠버네티스 안에서 설치된거지만 권한 필요.)예로 젠킨스 안에서 kubectl을 설치한 후에 kubectl을 사용해서 자원(pod이라던가.)을 가져오거나 service의 scale을 컨트롤 하는 코드가 있는 경우에 해당한다. 

권한이 없는 경우 이런식으로 에러메시지가 뜬다. 

--------------------------------------------------------------------------------------------------

Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:jenkins:default" cannot list resource "pods" in API group "" in the namespace "jenkins"

--------------------------------------------------------------------------------------------------

관련 이슈 : https://github.com/helm/charts/issues/1092


아래 명령어로 쿠버네티스 안에 있는 kubectl으로 role을 생성한다.


kubectl create clusterrolebinding <role-binding-name> --clusterrole=cluster-admin --user=<user> --user=kubelet --group=system:serviceaccounts:jenkins


이후엔 잘 접근함을 확인할수 있다.



2. Master, slave node설정을 위한 Permanent Agent 세팅.


분마다 도는 잡의 경우, 또는 젠킨스 안에서 도는 프로젝트들이 1개인 경우에 매번 도커이미지를 불러오고, 매번 모듈을 설치하는 코스트가 매우 크다. 어차피 같은 모듈을 사용하는거라면 모듈들을 미리 설치해놓은 젠킨스 Agent를 만들어서 실행하는게 효과적이다. 

아래에서는 젠킨스 slave agent를 kubernetes의 pod으로 만들어서 젠킨스 잡들이 pod에서 실행되도록 설정한다.


분산 빌드 설정을 하는 이유 : https://blog.naver.com/rudnfskf2/221400958621 여기서 그림을 하나 가져왔다.(문제있을시 지우겠습니다.)

-> 위에 적었지만 젠킨스에서는 관리만 하고 미리 환경이 세팅된 slave에서 빌드만 하면 효과적인 빌드 환경을 구축할 수 있다.


그러면 이제 할것은 kubernetes에 pod을 하나 띄운후 거기에 모듈등을 다 설치한 도커이미지를 띄운 후 젠킨스와 연결해서 Slave Node로 쓰도록 설정하는것이다.


1) Jenkins → Jenkins 관리 → configure global security에 들어가서 TCP port for inbound agents의 포트를 설정한다. (난 50000으로 설정)


2) Jenkins → Jenkins 관리 → 노드 관리 → 신규 노드 메뉴에서 Permanent Agent를 만든다.

옵션들은 살펴보고, executors는 말 그대로 slave노드 안에서 돌 executors갯수이다. 2로 해놨는데 마음대로 설정하자.

그리고 Use this node as much as possible으로 젠킨스에서 도는 모든 모든 잡에 대해서 설정한다. 이 옵션말고 label을 설정해서 label이 있는 잡만 해당 slave를 이용하도록 할수 있는데, label을 설정해서 몇몇 잡만 실행시키고 싶은 경우 Labels를 세팅하고, 젠킨스 잡에서는 general탭에서

이걸 설정해주면 된다.


3) 이제 컨테이너를 세팅할 차례이다. 위에서 Permanent agent를 만들면 jar 파일을 다운받아서 실행시키라고 하는데 나는 그 방법이 아니라 다른 방법을 쓸거다.


jenkins jnlp용으로 나온 도커 이미지가 있다. https://hub.docker.com/r/jenkins/jnlp-slave/ 이걸 받아서 사용하면 jar파일을 실행시키는것과 같은 효과로 slave를 실행시킬 수 있다. 도커 이미지를 받아서 알아서 말고 hub에 저장해둔다.


4) 이제 rancher kubernetes에 바로 위에서 만든 도커 이미지로 POD을 띄우면 된다. 알아보기 쉽도록 젠킨스와 같은 namespace안에 띄워준다. 


띄워주면서 환경변수로 

JENKINS_AGENT_NAME, JENKINS_SECRET, JENKINS_TUNNEL, JENKINS_URL 등을 세팅해준다.

이 환경변수는 위의 jnlp image주소인 https://hub.docker.com/r/jenkins/jnlp-slave/ 에 어떠한 역할을 하는지 나와있다.

rancher에 이처럼 환경변수 세팅을 해준다. 이름은 perm-test로 만들었으니 그거고, secret는 만들면 나오고, tunnel은 내가 설정한 포트 50000번과 같이 적어주고 url은 url을 적어준다.


5) 제대로 세팅하고 pod을 올리면 실행되는도중 로그가 제대로 주르륵 올라간다.

그리고 젠킨스에도

perm-test가 잘 올라왔음을 확인할수 있다.



Permanent agent를 생성했을때 Use this node as much as possible옵션을 설정했으므로 어떤 잡이든 빌드할때 이 에이전트를 이용하는것을 확인할수 있다.



참조.

https://blog.naver.com/rudnfskf2/221400958621


https://jonnung.dev/devops/2018/08/15/jenkins-distributed-builds/


https://wiki.jenkins.io/display/JENKINS/Distributed+builds


https://taetaetae.github.io/2019/03/17/jenkins-upgrade-master-slave/