k8s集群中部署 jenkins master slave


前提:已有分布式存储方案,准备1个 存储类StorageClass

第一步:创建pvc 

vim jenkins-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkinshome-pvc
  namespace: devops
spec:
  storageClassName: storage-jenkins
  accessModes:
    - ReadWriteMany
  resources: 
    requests:
      storage: 200Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mavenrepository-pvc
  namespace: devops
spec:
  storageClassName: storage-jenkins
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Gi

  

应用

kubectl apply -f jenkins-pvc.yaml

第二步:部署master。

(1)下载最新版的 jenkins.war 和 jdk 文件

(2)编写Dockerfile

vim Dockerfile

FROM centos:latest

ADD jdk-8u261-linux-x64.tar.gz /usr/java/jdk/
ADD jdk-7u80-linux-x64.tar.gz /usr/java/jdk/
ADD jenkins.war /usr/java/jenkins.war
ADD apache-maven /usr/local/tools/apache-maven

ENV LANG C.UTF-8
ENV TZ "Asia/Shanghai"
ENV JAVA_HOME /usr/java/jdk/jdk1.8.0_261
ENV PATH $PATH:$JAVA_HOME/bin
RUN yum -y install  unzip git subversion

ENTRYPOINT ["java","-Xms2048m", "-Xmx2048m","-Duser.home=/var/jenkins_home","-Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Shanghai", "-Duser.timezone=Asia/Shanghai","-Djenkins.model.Jenkins.slaveAgentPort=50000","-jar","/usr/java/jenkins.war"]

 

 (3)构建镜像 

docker build -t yourImageName .

(4)推送镜像

push yourImageName

(5)编写rabc权限文件

vi jenkins-rabc.yaml

 

 

 

 

# In GKE need to get RBAC permissions first with
# kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin [--user=<user-name>|--group=<group-name>]

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: yourname
  namespace: yournamespace

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: yourname
  namespace: yournamespace
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
  resources: ["pods/exec"]
  verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
  resources: ["pods/log"]
  verbs: ["get","list","watch"]
- apiGroups: [""]
  resources: ["events"]
  verbs: ["watch"]
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get"]

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: yourname
  namespace: yournamespace
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: yourname
subjects:
- kind: ServiceAccount
  namespace: yournamespace
  name: yourname

  kubectl apply -f  jenkins-rabc.yaml

(6)编写部署文件

vim jenkins-master.yaml

apiVersion: v1
kind: Service
metadata:
  name: yourname
  namespace: yournamespace
  labels:
    k8s.eip.work/layer: web
    k8s.eip.work/name: yourname
spec:
  selector:
    app: yourname
    release: canary
  #type: NodePort
  ports:
  - name: http
    targetPort: 8080
    port: 8080
    #nodePort: 30888
  - name: agent
    targetPort: 50000
    port: 50000
    #nodePort: 30500
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: yourname
  namespace: yournamespace
  labels:
    k8s.eip.work/layer: web
    k8s.eip.work/name: yourname
spec:
  replicas: 1
  selector: 
    matchLabels:
      app: yourname
      release: canary
  template:
    metadata:
      labels:
        app: yourname
        release: canary
    spec:
      #nodeName: k8s-node1
      serviceAccount: yourcount
      imagePullSecrets:
      - name: yoursecret
      containers:
      - name: yourname
        image: yourimage
        ports: 
        - name: http
          containerPort: 8080
          hostPort: 5088
          protocol: TCP
        - name: agent
          containerPort: 50000
          #hostPort: 50000
          protocol: TCP
        volumeMounts:
        - name: mavenrepository
          mountPath : /usr/local/tools/apache-maven/repository
        - name: jenkinshome
          mountPath : /var/jenkins_home
        - name: docker
          mountPath : /usr/bin/docker
        - name: docker-sock
          mountPath : /var/run/docker.sock
      volumes:
        - name: mavenrepository
          persistentVolumeClaim:
            claimName: mavenrepository-pvc
        - name: jenkinshome
          persistentVolumeClaim:
            claimName: jenkinshome-pvc
        - name: docker
          hostPath:
            path: /usr/bin/docker
        - name: docker-sock
          hostPath:
            path: /var/run/docker.sock

  kubectl apply -f jenkins-master.yaml

第三步:构建slave镜像

(1)下载好slave.jar jdk jenkins-slave kubectl

(2)编写构建文件

vim Dockerfile

FROM centos:7
MAINTAINER diodonfrost <diodon.frost@diodonfrost.me>

ENV HOME=/home/jenkins
ARG VERSION=4.5

# Install systemd -- See https://hub.docker.com/_/centos/
RUN yum -y swap -- remove fakesystemd -- install systemd systemd-libs
#RUN yum -y update; \
#(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
#rm -f /lib/systemd/system/multi-user.target.wants/*; \
#rm -f /etc/systemd/system/*.wants/*; \
#rm -f /lib/systemd/system/local-fs.target.wants/*; \
#rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
#rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
#rm -f /lib/systemd/system/basic.target.wants/*; \
#rm -f /lib/systemd/system/anaconda.target.wants/*;

RUN yum -y install epel-release
RUN yum -y install unzip git subversion sudo 

RUN sed -i -e 's/^\(Defaults\s*requiretty\)/#--- \1/'  /etc/sudoers

ADD jdk-8u261-linux-x64.tar.gz /usr/java/jdk/
ADD jdk-7u80-linux-x64.tar.gz /usr/java/jdk/
ADD apache-maven /usr/local/tools/apache-maven
COPY kubectl /usr/bin/kubectl

ENV LANG C.UTF-8
ENV TZ "Asia/Shanghai"
ENV JAVA_HOME /usr/java/jdk/jdk1.8.0_261
ENV MAVEN_HOME /usr/local//usr/local/tools/apache-maven
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH ${JAVA_HOME}/bin:${MAVEN_HOME}/bin:${PATH}

# Add Jenkins user and group
RUN groupadd -g 10000 jenkins \
    && useradd -d $HOME -u 10000 -g jenkins jenkins

# Install jenkins jnlp
#RUN curl --create-dirs -sSLo /usr/share/jenkins/slave.jar https://repo.jenkins-ci.org/public/org/jenkins-ci/main/remoting/${VERSION}/remoting-${VERSION}.jar \
#    && chmod 755 /usr/share/jenkins \
#    && chmod 644 /usr/share/jenkins/slave.jar
ADD slave.jar /usr/share/jenkins/slave.jar
RUN  chmod 755 /usr/share/jenkins && chmod 644 /usr/share/jenkins/slave.jar
COPY jenkins-slave /usr/local/bin/jenkins-slave
RUN chmod 755 /usr/local/bin/jenkins-slave && chown jenkins:jenkins /usr/local/bin/jenkins-slave

RUN mkdir /home/jenkins/.jenkins \
    && mkdir -p /home/jenkins/agent \
    && chown -R jenkins:jenkins /home/jenkins

VOLUME /home/jenkins/.jenkins
VOLUME /home/jenkins/agent

# Systemd volume
VOLUME ["/sys/fs/cgroup"]

WORKDIR /home/jenkins

ENTRYPOINT ["/usr/local/bin/jenkins-slave"]

  (3)构建镜像

docker build -t yourimagename .

第四步:赋予 slave rabc权限

vim slave.rabc.yaml

# In GKE need to get RBAC permissions first with
# kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin [--user=<user-name>|--group=<group-name>]

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: yourname

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: yourname
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
  resources: ["pods/exec"]
  verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
  resources: ["pods/log"]
  verbs: ["get","list","watch"]
- apiGroups: [""]
  resources: ["events"]
  verbs: ["watch"]
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get"]

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: yourname
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: yourname
subjects:
- kind: ServiceAccount
  name: yourname

  kubectl apply -f slave.rabc.yaml

第五步:配置jenkins master

(1)安装kubernetes插件

(2)配置云

 

 

 

 

 

 

第六步:使用slave部署 

vim Jenkinsfile

pipeline {
    agent {label 'yourLabelName'}
    stages {
      stage("build"){

    }
}

  

要注意的一些点:

1,创建master的rabc权限生成ServiceAccount账户,以生成的ServiceAccount账户身份启动 master容器,master账户就有了 对应的 kubectl执行权限。

2,每次增加新的namespace需要给 ServiceAccount 和 imagePullSecrets 绑定新的 namespace权限。

3,配置的slave的标签要记住 后面 Jenkinsfile会用到。

4,slave.jar 下载地址  http://yourserver:port/jnlpJars/slave.jar

 

参考文档

https://github.com/diodonfrost/docker-jenkins-slave


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM