jenkins安装部署、主从架构、slave镜像、K8S对接

发布时间 2023-10-23 11:37:08作者: 蕝戀

介绍

CI/CD工具,自动化持续集成和持续部署,用于构建各种自动化任务。

官方提供了docker镜像https://hub.docker.com/r/jenkins/jenkins

使用Deployments部署镜像,然后通过暴露jenkins的8080端口(web端口)和50000端口(slave 通信端口),另外容器启动后所有数据都是存储在容器内的/var/jenkins_home目录,所以要将该目录做持久卷,确保数据持久化。

使用K8S安装部署

部署yaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      name: jenkins 
  template:
    metadata:
      name: jenkins
      labels:
        name: jenkins
    spec:
      nodeName: k8s-node2
      serviceAccountName: jenkins** # 指定服务账号**
      containers:
        - name: jenkins
          image: jenkins/jenkins:2.414.1-lts
          ports:
            - containerPort: 8080
            - containerPort: 50000
          volumeMounts: **# 持久化jenkins的数据。**
            - name: jenkins-home
              mountPath: /var/jenkins_home
      securityContext:
        fsGroup: 1000
      volumes:
      - name: jenkins-home
        persistentVolumeClaim:
          claimName: jenkins2
          
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins2
spec:
  storageClassName: "managed-nfs-storage"
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

---
apiVersion: v1
kind: Service
metadata:
  name: jenkins **# 创建一个NodePort类型的service,并设定将jenkins的8080端口暴露到节点的30008端口**
spec:
  selector:
    name: jenkins
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 8080
      protocol: TCP
      nodePort: 30008
    - name: agent
      port: 50000 # 50000端口是jenkins slave的通信端口,不需要暴露。
      protocol: TCP
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins # 创建一个名为jenkins的服务账号

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: jenkins # 创建一个名为jenkins的Role,并且该Role在default命名空间
rules:
- apiGroups: [""]
  resources: ["pods","events"]
  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: ["secrets","events"]
  verbs: ["get"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: jenkins # 创建一个名为jenkins的RoleBinding,并且该RoleBinding在default命名空间
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role # 引用指定Role进行绑定,这里时绑定名为jenkins的role
  name: jenkins
subjects:
- kind: ServiceAccount # 绑定的主体类型,这里是服务账号
  name: jenkins # 服务账号的名字是jenkins

初始化jenkins:

安装后使用kubectl log jenkins-podxxxx来查看jenkins安装的初始密码,或者根据提示进入到它的持久化目录中找到相应的文件获取初始密码。

然后设定你自己的用户名和密码。

第二步:跳过所有插件的安装,因为都是国外源,先跳过,修改后再安装插件

第三步:修改源

cd /var/lib/jenkins/updates

 
[root@localhost updates]# sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json

sed -i 's#https://updates.jenkins.io/download#https://mirrors.cloud.tencent.com/jenkins#g' default.json

[root@localhost updates]# sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json

重启jenkins

直接在地址栏后面加入restart即可,或者在安装插件的时候勾选安装后重启jenkins

http://10.0.1.141:30008/restart

第四步:登录然后进入配置中心将更新地址换一下(这个改了可能会装插件失败。不该了。。)

Manager jenkins > manage plugins > advanced > upgrade url重新填写 URL :
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json

安装常用插件:

git  # 拉代码
git parameter # 用于生成git拉取参数的插件
pipeline # 自动化流水线
pipeline stage view # 自动化流水线执行过程中每个步骤的log可视化视图插件
kubernetes # 与k8s对接,用于生成jenkins slave的pod。减轻构建自动化任务的压力
config file provider # 存储配置文件的插件
extended choice parameter # 扩展选择框的一个插件

其他插件:

chinses 语言包(这个我一般不装..)
Folders
Build Timeout
Workspace Cleanup
github branch source
email extensionmailer
ssh build agents

jenkins主从架构-与k8s对接

和大部分主从架构一样,都是为了缓解master节点的压力,提高性能。

当触发jenkins任务时,jenkins会调用k8s-api,创建多个slave的pod,并使用slave来构建和执行任务。

配置与k8s对接

1、在dashboard中找到Manage Nodes and Clouds。(管理节点和云)

2、再点击Configure Clouds

3、选中kubernetes,然后再点detail,这样可以设置更多属性

4、将kubernetes的地址填写为:https://kubernetes.default(因为容器内部可以通过svc的dns方式访问,再svc章节学过了)

5、将jenkins的地址填写为:http://jenkins.default(道理同上,但是注意你部署的jenkins的svc是否叫jenkins,以自己的为准)

上面说的svc的dns地址通过get svc也可以看到,可以发现k8s默认有一个叫kubenetes的svc,就是用来给集群内部的其他POD访问k8s-api的。

[root@k8s-master jenkins]# k get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                        AGE
**jenkins**      NodePort    10.97.253.10    <none>        80:30008/TCP,50000:31587/TCP   10h
**kubernetes **  ClusterIP   10.96.0.1       <none>        443/TCP                        11h

自定义slave镜像

jenkins默认是有slave镜像,但是一般是不够用的,有些工具什么的也没有,不同业务系统开发语言也不一样(如、go、java、python等,使用的环境也不一致)

所以我们一般会自定义一个slave镜像,根据不同的平台构建不同的版本,

如:jenkins-slave-java:1.8、jenkins-slave-go:xxxx 、

当然也可以全部语言的环境都放到一个镜像中,但是体积太大,浪费,没必要。。。

构建slave镜像要考虑的东西:

  • jenkins是帮我们自动化部署,我们手动部署时候需要的任何工具如:maven、jdk环境、kubectl等待都是需要出现再slave镜像中的,不然它怎么帮你去执行?

示例:构建java环境的slave镜像

/usr/share/jenkins/slave.jar 这个slave.jar要从jenkins中下载:http://192.168.2.6:30008/jnlpJars/slave.jar 或者 http://192.168.2.6:30008/jnlpJars/agent.jar (你懂的,不需用slave这种名词...)

jenkins-slave从github上下载(没错也变成agent了,不叫slave...):https://github.com/jenkinsci/docker-inbound-agent/blob/master/jenkins-agent

Dockerfile编写:

FROM centos:7
RUN yum install -y java-1.8.0-openjdk maven curl git libtool-ltdl-devel unzip && \ 
    yum clean all && \
    rm -rf /var/cache/yum/* && \
    mkdir -p /usr/share/jenkins

COPY slave.jar /usr/share/jenkins/slave.jar # jenkins的agent端程序,接受master下发的任务。
COPY jenkins-slave /usr/bin/jenkins-slave # 这个文件就是用来执行slave.jar这个agent程序的
COPY settings.xml /etc/maven/settings.xml # 这里配置的maven的镜像加速
RUN chmod +x /usr/bin/jenkins-slave # 授权可执行权限
COPY kubectl /usr/bin/ # 赋值kubectl是因为后面要用kubectl来创建给你构建的app创建deploy\svc等资源
RUN chmod +x /usr/bin/kubectl # 授权可执行权限

ENTRYPOINT ["jenkins-slave"] # ENTRYPOINT 和CMD差不多,具体可以看汇DOCKERFILE的章节

新版本dockerfile

FROM centos:7
RUN yum install -y java-1.8.0-openjdk maven curl git libtool-ltdl-devel unzip && \ 
    yum clean all && \
    rm -rf /var/cache/yum/* && \
    mkdir -p /usr/share/jenkins

COPY agent.jar /usr/share/jenkins/agent.jar # jenkins的agent端程序,接受master下发的任务。
COPY jenkins-agent/usr/bin/jenkins-agent # 这个文件就是用来执行slave.jar这个agent程序的
COPY settings.xml /etc/maven/settings.xml # 这里配置的maven的镜像加速
RUN chmod +x /usr/bin/jenkins-agent # 授权可执行权限
COPY kubectl /usr/bin/ # 赋值kubectl是因为后面要用kubectl来创建给你构建的app创建deploy\svc等资源
RUN chmod +x /usr/bin/kubectl # 授权可执行权限

ENTRYPOINT ["jenkins-agent"] # ENTRYPOINT 和CMD差不多,具体可以看汇DOCKERFILE的章节



### ubuntu版本 ,python环境(这个slave环境就是下次你调用时帮你执行pipeline的环境了。所以需要什么都可以提前设置好)
FROM ubuntu
COPY agent.jar /usr/share/jenkins/agent.jar # jenkins的agent端程序,接受master下发的任务。
COPY jenkins-agent.sh /usr/bin/jenkins-agent # 这个文件就是用来执行slave.jar这个agent程序的
COPY kubectl /usr/bin/ # 复制kubectl,因为要用kubectl来创建给你构建的app创建deploy\svc等资源
RUN apt update && \
    apt install -y git openjdk-8-jdk && \ 
    chmod +x /usr/bin/kubectl && \
    chmod +x /usr/bin/jenkins-agent # 授权可执行权限
ENTRYPOINT ["jenkins-agent"] # ENTRYPOINT 和CMD差不多,具体可以看汇DOCKERFILE的章节

构建镜像并推送到harbor仓库:

[root@k8s-master jenkins]# ll
总用量 46128
-rw-r--r-- 1 root root      436 11月 16 09:30 Dockerfile
-rw-r--r-- 1 root root     1980 11月 16 09:30 jenkins-slave
-rw-r--r-- 1 root root 46437056 11月 16 09:30 kubectl
-rw-r--r-- 1 root root    10409 11月 16 09:30 settings.xml
-rw-r--r-- 1 root root   770802 11月 16 09:30 slave.jar

# 构建镜像
[root@k8s-master jenkins]# docker build -t 10.0.1.140/library/jenkins-slave-jdk:1.8 .

nerdctl -n k8s.io build -t 

# 推送镜像
[root@k8s-master jenkins]# docker push 10.0.1.140/library/jenkins-slave-jdk:1.8


测试自定义slave镜像部署是否正常

新建一个项目

输入项目名称,选中pipeline,点击ok按钮。

点击pipeline,然后添加代码

代码如下:

// Uses Declarative syntax to run commands inside a container.
pipeline {
    agent {
        kubernetes {
            label "jenkins-slave"
            yaml """
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: jnlp
    image: "10.0.1.140/library/jenkins-slave-jdk:1.8" # 引用刚刚构建的slave镜像,
    command:
"""
        }
    }
    stages {
        stage('Main') { # 定义一个阶段,阶段名称为Main
            steps { # 定义阶段Main中的第一个步骤steps,steps中就是编写各种命令。
                sh 'hostname' # 简单的输出一下主机名
            }
        }
    }
}


docker pull 192.168.2.6/library/jenkins-slave@sha256:e9f63cf7551b8970645fa61aaa0c9819152f45bb02e5dc4ba8114acb3f5b0564

然后回到项目首页,点击build now即可,然后观察log,查看是否成功。