前提:已有分布式存储方案,准备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
参考文档