首页 > 其他分享 >jenkins安装部署、主从架构、slave镜像、K8S对接

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

时间:2023-10-23 11:47:11浏览次数:44  
标签:slave name agent usr jenkins K8S root

介绍

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,查看是否成功。

标签:slave,name,agent,usr,jenkins,K8S,root
From: https://www.cnblogs.com/juelian/p/17782043.html

相关文章

  • K8S集群搭建
    集群搭建的几种方式kubeadm通过kubeadminit、kubeadmjoin快速部署集群。二进制包下载官方编译好的二进制文件,手动部署,比较麻烦。。第三方工具、web端第三方提供的部署工具、web部署端。kubeadm部署k8s集群实验环境master节点:IP:10.0.1.140worker节点1:IP:10......
  • k8s-命名空间namespace
    查看namespace:kubectlgetnamespaces#namespaces可以简写为namespace或ns创建namespace:kubectlcreatenamespace命名空间名称kubectlcreatenamespacenamespace1删除namespace:kubectldeletenamespace命名空间名称kubectldeletenamespacenamespace1可以通过......
  • k8s-pod
    Pod是Kubernetes最小的管理单位,一个Pod可以封装一个容器或多个容器一个Pod里的多个容器可以共享存储和网络,可以看作一个逻辑的主机获取pod帮助方法:kubectlexplainpod查看pod信息:kubectlgetpod-nnamespace-owide查看pod的yaml文件:kubectlgetpodpod名-nnam......
  • k8s-节点标签label
    查看节点标签信息:kubectlgetnode--show-labels设置节点标签信息:kubectllabelnode节点名标签值kubectllabelnodenode2region=huanaizone=Aenv=testbussiness=game显示节点的相应用标签:kubectlgetnodes-Lregion,zone修改节点标签信息:kubectllabelnode......
  • k8s网络-service
    k8s网络Kubernetes本身并不负责网络通信,Kubernetes提供了容器网络接口CNI(ContainerNetworkInterface),具体的网络通信交给CNI插件来负责,开源的CNI插件非常多,像Flannel、Calico。Kubernetes虽然不负责网络,但要求集群中的Pod能够互相通信,且Pod必须通过非NAT网络连接,即收到的数据包......
  • Yarn on K8S可行性调研
    1.背景一般离线Hadoop集群和在线Hadoop集群都是分开部署的,他们的计算资源互相隔离。离线集群一般0:00~08:00作业较多,集群压力大,其他时间段集群较为空闲。实时集群高峰期一般为10:00~20:00,其他时间段较为空闲。空闲时资源利用率低,是对资源的浪费,而离线/实时集群在高峰期资源紧张时......
  • Jmeter集成到jenkins
    Jmeter集成到JenkinsJmeter集成到Jenkins.1软件下载...4一:环境配置...41.JDK安装:...4配置JDK环境变量...52.Jmeter安装:...5配置jmeter环境变量...63.安装Ant7配置Ant环境变量...74.Git安装:...8配置git环境变量...95.Github设置...11创建github账号...11创建组织...1......
  • k8s-pod版本更新
    pod版本更新⭐️⭐️在实际应用中,升级是一个常见的场景,Deployment能够很方便的支撑应用升级。Deployment可以设置不同的升级策略,有如下两种。RollingUpdate:滚动升级,即逐步创建新Pod再删除旧Pod,为默认策略。Recreate:替换升级,即先把当前Pod删掉再重新创建Pod。Deployment的升级可......
  • K8S使用开源CEPH作为后端StorageClass
    1引言K8S在1.13版本开始支持使用Ceph作为StorageClass。其中云原生存储Rook和开源Ceph应用都非常广泛。本文主要介绍K8S如何对接开源Ceph使用RBD卷。K8S对接Ceph的技术栈如下图所示。K8S主要通过容器存储接口CSI和Ceph进行交互。https://docs.ceph.com/en/reef/rbd/rbd-kuber......
  • Jenkins 新建项目
    https://www.cnblogs.com/n00dle/p/16853084.html1、新建任务点击【新建任务】,输入任务名称(如:update_cwy),选择【构建一个自由风格的软件项目】,点击【确定】来完成创建 2、General配置1)勾选“Thisprojectisparameterized”,【添加参数】,选择“GitParameter”,填写【名称】......