Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Jenkins 基于 Kubernetes 的动态和静态节点

Jenkins 基于 Kubernetes 的动态和静态节点

作者头像
我是阳明
发布于 2023-09-25 00:49:31
发布于 2023-09-25 00:49:31
75700
代码可运行
举报
文章被收录于专栏:k8s技术圈k8s技术圈
运行总次数:0
代码可运行

提到基于 Kubernetes 的 CI/CD,可以使用的工具有很多,比如 Jenkins、Gitlab CI、Drone 之类的,我们这里会使用大家最为熟悉的 Jenkins 来做 CI/CD 的工具。

安装

既然要基于 Kubernetes 来做 CI/CD,我们这里最好还是将 Jenkins 安装到 Kubernetes 集群当中,安装的方式也很多,我们这里仍然还是使用手动的方式,这样可以了解更多细节,对应的资源清单文件如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# jenkins.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-local
  labels:
    app: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  storageClassName: local-storage
  local:
    path: /data/k8s/jenkins
  persistentVolumeReclaimPolicy: Retain
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - node2
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pvc
  namespace: kube-ops
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
  namespace: kube-ops
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: jenkins
rules:
  - apiGroups: ["extensions", "apps"]
    resources: ["deployments", "ingresses"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - 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", "events"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins
  namespace: kube-ops
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: jenkins
subjects:
  - kind: ServiceAccount
    name: jenkins
    namespace: kube-ops
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: kube-ops
spec:
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      serviceAccount: jenkins
      initContainers:
        - name: fix-permissions
          image: busybox:1.35.0
          command: ["sh", "-c", "chown -R 1000:1000 /var/jenkins_home"]
          securityContext:
            privileged: true
          volumeMounts:
            - name: jenkinshome
              mountPath: /var/jenkins_home
      containers:
        - name: jenkins
          image: jenkins/jenkins:lts-jdk11
          imagePullPolicy: IfNotPresent
          env:
            - name: JAVA_OPTS
              value: -Dhudson.model.DownloadService.noSignatureCheck=true
          ports:
            - containerPort: 8080
              name: web
              protocol: TCP
            - containerPort: 50000
              name: agent
              protocol: TCP
          readinessProbe:
            httpGet:
              path: /login
              port: 8080
            initialDelaySeconds: 60
            timeoutSeconds: 5
            failureThreshold: 12
          volumeMounts:
            - name: jenkinshome
              mountPath: /var/jenkins_home
      volumes:
        - name: jenkinshome
          persistentVolumeClaim:
            claimName: jenkins-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: kube-ops
  labels:
    app: jenkins
spec:
  selector:
    app: jenkins
  ports:
    - name: web
      port: 8080
      targetPort: web
    - name: agent
      port: 50000
      targetPort: agent
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jenkins
  namespace: kube-ops
spec:
  ingressClassName: nginx
  rules:
    - host: jenkins.k8s.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: jenkins
                port:
                  name: web

我们这里使用 jenkins/jenkins:lts-jdk11 镜像,这是 jenkins 官方的 Docker 镜像,然后也有一些环境变量,当然我们也可以根据自己的需求来定制一个镜像,比如我们可以将一些插件打包在自定义的镜像当中,可以参考文档:https://github.com/jenkinsci/docker,我们这里使用默认的官方镜像就行,另外一个还需要注意的数据的持久化,将容器/var/jenkins_home 目录持久化即可,我们这里使用的是 Local PV 的方式。

由于我们这里使用的镜像内部运行的用户 uid=1000,所以我们这里挂载出来后会出现权限问题,为解决这个问题,我们同样还是用一个简单的 initContainer 来修改下我们挂载的数据目录。

另外由于 jenkens 会对 update-center.json 做签名校验安全检查,这里我们需要先提前关闭,否则下面更改插件源可能会失败,通过配置环境变量 JAVA_OPTS=-Dhudson.model.DownloadService.noSignatureCheck=true 即可。

另外我们这里还需要使用到一个拥有相关权限的 serviceAccount:jenkins,我们这里只是给 jenkins 赋予了一些必要的权限,当然如果你对 serviceAccount 的权限不是很熟悉的话,我们给这个 sa 绑定一个 cluster-admin 的集群角色权限也是可以的,当然这样具有一定的安全风险。最后就是通过 Ingress 来暴露我们的服务,这个比较简单。

我们直接来创建 jenkins 的资源清单即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl apply -f jenkins.yaml
$ kubectl get pods -n kube-ops -l app=jenkins
NAME                       READY   STATUS    RESTARTS   AGE
jenkins-55c4676f4d-fhmw2   1/1     Running   0          3m5s
$ kubectl logs -f jenkins-55c4676f4d-fhmw2 -n kube-ops
Running from: /usr/share/jenkins/jenkins.war
webroot: /var/jenkins_home/war
# ......
2023-09-07 06:56:26.123+0000 [id=33]    INFO    jenkins.install.SetupWizard#init:

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

278e9dcdcab04d11ae671f7f81f517ba

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

2023-09-07 06:56:38.572+0000 [id=29]    INFO    jenkins.InitReactorRunner$1#onAttained: Completed initialization
2023-09-07 06:56:38.583+0000 [id=23]    INFO    hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
2023-09-07 06:57:02.555+0000 [id=49]    INFO    h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
2023-09-07 06:57:02.556+0000 [id=49]    INFO    hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1

看到上面的 run: Jenkins is fully up and running 信息就证明我们的 Jenkins 应用以前启动起来了。

然后我们可以通过 Ingress 中定义的域名 jenkins.k8s.local(需要做 DNS 解析或者在本地 /etc/hosts 中添加映射)来访问 jenkins 服务:

jenkins unlock

然后可以执行下面的命令获取解锁的管理员密码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl exec -it jenkins-55c4676f4d-fhmw2 -n kube-ops -- cat /var/jenkins_home/secrets/initialAdminPassword
278e9dcdcab04d11ae671f7f81f517ba   # jenkins启动日志里面也有

然后跳过插件安装,选择默认安装插件过程会非常慢(也可以选择安装推荐的插件),点击右上角关闭选择插件。

ignore plugin install

跳过后会直接进入 Jenkins 就绪页面,直接点击开始使用即可:

jenkins ready

然后就可以进入 Jenkins 主页了。

Jenkins Home

首先安装中文插件(如果想要中文界面的话),搜索 Localization: Chinese

Localization: Chinese

安装重启完成后,会自动跳转到登录页面:

Jenkins Login

这里还是使用 admin 和前面的初始密码进行登录。然后可以进入用户管理页面 http://jenkins.k8s.local/user/admin/configure 修改用户密码:

修改密码

然后就可以使用新的密码登录了。

接下来我们可以安装其他需要的插件,比如 Pipeline 插件。Pipeline 是 Jenkins 的一个核心插件,它定义了一套 DSL 语言,可以用来编写 Pipeline 脚本,这个脚本可以实现从代码构建到部署的整个流程。在使用 Pipeline 类型的项目时,需要提前安装 Jenkins 的 Pipeline 插件。

pipeline plugin

安装好插件后新建一个 Pipeline 类型的作业:

新建作业

自由风格项目和 Pipeline 类型的项目区别是,构建部分的操作都是在页面上面完成的。Pipeline 的构建任务描述都是通过代码的方式。

hello

保存后我们可以点击立即构建执行这个任务,也可以查看这个任务的执行结果输出:

执行结果

架构

Jenkins 安装完成了,接下来我们不用急着就去使用,我们要了解下在 Kubernetes 环境下面使用 Jenkins 有什么好处。

我们知道持续构建与发布是我们日常工作中必不可少的一个步骤,目前大多公司都采用 Jenkins 集群来搭建符合需求的 CI/CD 流程,然而传统的 Jenkins Slave 一主多从方式会存在一些痛点,比如:

  • 主 Master 发生单点故障时,整个流程都不可用了
  • 每个 Slave 的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是比较费劲
  • 资源分配不均衡,有的 Slave 要运行的 job 出现排队等待,而有的 Slave 处于空闲状态
  • 资源有浪费,每台 Slave 可能是物理机或者虚拟机,当 Slave 处于空闲状态时,也不会完全释放掉资源。

正因为上面的这些种种痛点,我们渴望一种更高效更可靠的方式来完成这个 CI/CD 流程,而 Docker 虚拟化容器技术能很好的解决这个痛点,又特别是在 Kubernetes 集群环境下面能够更好来解决上面的问题,下图是基于 Kubernetes 搭建 Jenkins 集群的简单示意图:

k8s jenkins slave

从图上可以看到 Jenkins MasterJenkins Slave 以 Pod 形式运行在 Kubernetes 集群的 Node 上,Master 运行在其中一个节点,并且将其配置数据存储到一个 Volume 上去,Slave 运行在各个节点上,并且它不是一直处于运行状态,它会按照需求动态的创建并自动删除。

这种方式的工作流程大致为:当 Jenkins Master 接受到 Build 请求时,会根据配置的 Label 动态创建一个运行在 Pod 中的 Jenkins Slave 并注册到 Master 上,当运行完 Job 后,这个 Slave 会被注销并且这个 Pod 也会自动删除,恢复到最初状态。

那么我们使用这种方式带来了哪些好处呢?

  • 服务高可用,当 Jenkins Master 出现故障时,Kubernetes 会自动创建一个新的 Jenkins Master 容器,并且将 Volume 分配给新创建的容器,保证数据不丢失,从而达到集群服务高可用。
  • 动态伸缩,合理使用资源,每次运行 Job 时,会自动创建一个 Jenkins Slave,Job 完成后,Slave 自动注销并删除容器,资源自动释放,而且 Kubernetes 会根据每个资源的使用情况,动态分配 Slave 到空闲的节点上创建,降低出现因某节点资源利用率高,还排队等待在该节点的情况。
  • 扩展性好,当 Kubernetes 集群的资源严重不足而导致 Job 排队等待时,可以很容易的添加一个 Kubernetes Node 到集群中,从而实现扩展。 是不是以前我们面临的种种问题在 Kubernetes 集群环境下面是不是都没有了啊?看上去非常完美。

Agent 节点

虽然我们上面提到了动态节点的好处,但是还是会有一部分人比较喜欢坚持静态节点的方式,选择静态或者动态的 Jenkins Agent 节点都是可以的。接下来我们就分别来介绍下如何在 Kubernetes 集群中为 Jenkins 提供动静态 Agent 节点。

静态节点

首先在 Jenkins 页面 http://jenkins.k8s.local/computer/new 新建一个节点:

新建节点

点击创建后配置节点信息,然后点击保存:

配置节点

保存后我们可以看到节点已经创建成功了:

节点列表

然后点击列表中的 agent1 名称,进入节点详情页面,在详情页面我们将获取到运行该节点的一些密钥信息,

密钥信息

然后创建一个如下所示的资源清单文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# jenkins-agent.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-agent
  namespace: kube-ops
spec:
  selector:
    matchLabels:
      app: jenkins-agent
  template:
    metadata:
      labels:
        app: jenkins-agent
    spec:
      containers:
        - name: agent
          image: jenkins/inbound-agent
          securityContext:
            privileged: true
          imagePullPolicy: IfNotPresent
          env:
            - name: JENKINS_URL
              value: http://jenkins.k8s.local
            - name: JENKINS_SECRET
              value: 9c4c5159b111083705eed5802ceb021cfad002a18dd59c692aa59a9616e6285a
            - name: JENKINS_AGENT_NAME
              value: agent1
            - name: JENKINS_AGENT_WORKDIR
              value: /home/jenkins/workspace

上面的清单文件中的 JENKINS_URLJENKINS_SECRETJENKINS_AGENT_WORKDIR 这些环境变量的值就是上面我们在节点详情页面获取到的信息,然后我们将这个文件应用到集群中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl apply -f jenkins-agent.yaml

创建后正常该 agent 的 Pod 会启动报错,错误日志如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INFO: Locating server among [http://jenkins.k8s.local/]
Sep 07, 2023 7:55:51 AM hudson.remoting.jnlp.Main$CuiListener error
SEVERE: Failed to connect to http://jenkins.k8s.local/tcpSlaveAgentListener/: jenkins.k8s.local
java.io.IOException: Failed to connect to http://jenkins.k8s.local/tcpSlaveAgentListener/: jenkins.k8s.local
        at org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.resolve(JnlpAgentEndpointResolver.java:216)
        at hudson.remoting.Engine.innerRun(Engine.java:760)
        at hudson.remoting.Engine.run(Engine.java:543)
Caused by: java.net.UnknownHostException: jenkins.k8s.local
        at java.base/java.net.AbstractPlainSocketImpl.connect(Unknown Source)
        at java.base/java.net.Socket.connect(Unknown Source)
        at java.base/sun.net.NetworkClient.doConnect(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.openServer(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.openServer(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.<init>(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.New(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.New(Unknown Source)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
        at org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.resolve(JnlpAgentEndpointResolver.java:213)
        ... 2 more

这其实是因为我们配置的 jenkins.k8s.local 域名是一个自定义的域名,需要在 K8s 集群中解析的话,我们还需要在 CoreDNS 中去添加一条 hosts 映射:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl edit cm coredns -n kube-system

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        hosts {
          10.206.16.10 jenkins.k8s.local
          fallthrough
        }
#  ......
kind: ConfigMap

但其实还有更简单的方式,那就是直接将 JENKINS_URL 值替换为 Jenkins 的 Service 地址 http://jenkins.kube-ops.svc.cluster.local:8080 即可,这样就不需要在 CoreDNS 中添加 hosts 映射了。

正常现在的 Jenkins Agent Pod 应该是正常运行的,我们可以通过下面的命令查看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pods -n kube-ops -l app=jenkins-agent
NAME                             READY   STATUS    RESTARTS   AGE
jenkins-agent-76884cd44c-dd9ds   1/1     Running   0          2m32s

再次查看节点列表,我们可以看到节点已经在线了:

agent

接下来我们再创建一个 Pipeline 类型的作业,然后在 Pipeline 脚本中添加下面的内容:

流水线

这里我们定义的流水线脚本中,我们使用到了 agent 关键字,这个关键字的作用就是指定这个流水线的运行环境,这里我们指定的是 build 这个标签,也就是我们上面创建的 agent1 这个节点,这样这个流水线就会在这个节点上运行。

点击保存后,我们可以点击立即构建来执行这个流水线,然后我们可以查看这个流水线的执行结果:

执行结果

这样我们就可以在 Jenkins 中使用这个静态节点来构建任务了。

动态节点

除了静态节点之外,我们还可以使用动态节点的方式来构建任务,这样可以更好的利用资源,我们这里使用的是 Kubernetes 的方式来创建动态节点,这样我们就可以在 Jenkins 中使用动态节点来构建任务了。

第 1 步. 首先需要安装 kubernetes 插件。

kubernetes plugin

第 2 步. 安装完毕后,进入 http://jenkins.k8s.local/manage/cloud/ 页面:

new kubernetes plugin config

在该页面点击 New cloud 新建一个 Cloud 服务:

kubernetes plugin config

这里注意一定要选择上 Kubernetes 这个 Type,然后点击 Create 按钮,然后我们就可以看到下面的配置页面了:

create cloud

首先配置连接 Kubernetes APIServer 的地址,由于我们的 Jenkins 运行在 Kubernetes 集群中,所以可以使用 Service 的 DNS 形式进行连接 https://kubernetes.default.svc.cluster.local

jenkins k8s apiserver

命名空间这里填 kube-ops,然后点击 连接测试,如果出现 Connected to Kubernetes v1.26.2 这样的提示信息证明 Jenkins 已经可以和 Kubernetes 系统正常通信了。

然后下方的 Jenkins URL 地址为 http://jenkins.kube-ops.svc.cluster.local:8080,根据上面创建的 jenkins 的服务名填写,包括下面的 Jenkins 通道,默认是 50000 端口(要注意是 TCP,所以不要填写 http):

jenkins url

然后点击最后的 save 按钮保存配置。到这里我们的 Kubernetes 插件就算配置完成了。

测试

Kubernetes 插件的配置工作完成了,接下来我们就来添加一个 Job 任务,看是否能够在 Slave Pod 中执行,任务执行完成后看 Pod 是否会被销毁。

在 Jenkins 首页点击 新建任务,创建一个测试的任务,同样还是选择 Pipeline 类型的任务,这次我们需要使用的流水线脚本就更复杂了,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pipeline{
    agent{
        kubernetes{
            label "test01"
            cloud 'Kubernetes'
            yaml '''
---
kind: Pod
apiVersion: v1
metadata:
  labels:
    k8s-app: jenkins-agent
  name: jenkins-agent
  namespace: kube-ops
spec:
containers:
  - name: jenkinsagent
    image: jenkins/inbound-agent
    imagePullPolicy: IfNotPresent
'''
        }
    }

    stages{
        stage("Hello"){
          steps{
            script{
              echo "Hello Slave Pod on Kubernetes!"
            }
          }
        }
    }
}

这次的脚本中定义的执行 agent 就比较复杂了,通过一个 kubernetes 属性来指定这个流水线的运行环境,然后通过 yaml 属性来定义这个运行 Pod 的清单文件,这里我们定义的是一个简单的 Pod,然后我们将这个 Pod 部署到 kube-ops 这个命名空间中,这样我们就可以在这个 Pod 中运行我们的 Jenkins Slave 了,需要注意 cloud 后面的值需要和前面我们定义的 Cloud 服务名称一致。

最后点击保存,同样我们可以点击左侧的 立即构建 来执行这个任务,然后我们可以查看这个任务的执行结果:

slave pod execute command

虽然我们在这里的脚本中定义的 Pod 非常简单,但可以看到 Jenkins 会帮我们配置一些默认的环境变量。当任务执行的过程中我们也可以观察 Kubernetes 集群中的 Pod 变化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pods -n kube-ops -w
NAME                              READY   STATUS        RESTARTS      AGE
jenkins-55c4676f4d-fhmw2          1/1     Running       3 (12m ago)   91m
jenkins-agent-76884cd44c-dd9ds    1/1     Running       0             22m
test01-jnzmb-ht0n7                0/1     Pending       0             0s
test01-jnzmb-ht0n7                0/1     Pending       0             0s
test01-jnzmb-ht0n7                0/1     ContainerCreating   0             0s
test01-jnzmb-ht0n7                1/1     Running             0             1s
test01-jnzmb-ht0n7                1/1     Terminating         0             3s
test01-jnzmb-ht0n7                0/1     Terminating         0             4s
test01-jnzmb-ht0n7                0/1     Terminating         0             4s
test01-jnzmb-ht0n7                0/1     Terminating         0             4s

我们可以看到在我们点击立刻构建的时候可以看到一个新的 Pod:test01-jnzmb-ht0n7 被创建了,这就是我们的 Jenkins Slave。当任务构建完抽这个 Slave Pod 也会自动删除。

到这里我们就完成了使用 Kubernetes 动态生成 Jenkins Slave 的方法。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-14 19:48,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 k8s技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用反向代理加速 Jenkins 插件下载
训练营进行到 DevOps 部分了,上节课讲解 Jenkins 动态 Slave 的时候翻车了,我们知道 Jenkins 安装的时候会让我们选择安装一些推荐的插件,但是由于默认的官方源下载实在是太慢,对于我们直播这种场景来说实在是太不友好了。之前的版本中我反复测试过将 Jenkins 目录下面的 default.json 文件里面的源地址更改成清华大学的源,以及将 google 更改成 baidu,然后重启 Jenkins,安装插件的时候就非常快了。结果这一次直播的时候更改完成之后,重启就直接跳转到了 Jenkins 的主页去了,几乎就没有安装什么插件,所以在做试验的时候非常麻烦。最后是通过优先安装中文插件,然后使用中文社区的插件更新源来解决的,但是在获取插件列表的时候还是非常卡,安装的时候倒是快了不少,不知道是不是我使用的姿势不对,总之直播翻车了,浪费了很多时间,所以我们得重新讲解一次。
我是阳明
2020/06/15
1.4K0
Jenkins在kubernetes上的落地实践
创建pv/pvc对象,这里我们要注意nfs提供给jenkins的存储目录的权限问题,否则服务因为权限无法写入数据:
公众号: 云原生生态圈
2020/06/15
8300
Jenkins在kubernetes上的落地实践
基于 Kubernetes 构建企业 Jenkins 持续集成平台
3、Jnekins Pipeline 介绍与动态生成 Jenkins Slave
DevOps持续交付
2020/05/29
2.4K0
基于 Kubernetes 构建企业 Jenkins 持续集成平台
TKE上动态部署jenkins slaves
本章我们来讲一下如何在TKE上搭建jenkins这个CI/CD工具,这边我们在进行构建的时候可以自动生成一个slave pod来进行走流水线,流水线跑完之后会自动销毁。
聂伟星
2020/08/18
6770
【Kubernetes系列】第8篇 CI/CD之组件部署
应对敏捷开发的需求,对CI(持续集成))/CD(持续交付)的提出了更高的标准,今天来讨论下,如何基于开源组件(gitlab/jenkins/harbor/kubernetes)使用CI/CD,赋能团队的开发、运维。
HankerCloud
2019/10/24
7940
【Kubernetes系列】第8篇 CI/CD之组件部署
4.Jenkins进阶之分布式架构环境配置
描述: 我们在使用Jenkins的时候一般都会分为server节点与agent节点(也可以叫 slave 节点)。
全栈工程师修炼指南
2022/09/29
2.8K0
4.Jenkins进阶之分布式架构环境配置
云原生(三十八) | Kubernetes篇之Jenkins入门和安装
点击《系统管理》—>《Configure System》—>《配置一个云》—>《kubernetes》,如下:
Lansonli
2022/10/30
6980
云原生(三十八) | Kubernetes篇之Jenkins入门和安装
在kubernetes中部署Jenkins并简单使用
之前我们都是在物理机或者虚拟机上部署jenkins,但是这种部署方式会有一些难点,如下:
极客运维圈
2020/06/16
2K0
在kubernetes中部署Jenkins并简单使用
kubernetes(十四) 基于kubernetes的jenkins持续集成
-参考:https://github.com/jenkinsci/kubernetes
alexhuiwang
2020/09/23
2.3K0
kubernetes(十四) 基于kubernetes的jenkins持续集成
基于K8s的Jenkins持续集成实战(上)
Jenkins是一款广泛受到的欢迎的持续集成工具,有着丰富的插件以及扩展能力,基本上能够满足大多数团队的需求。本文将从工具使用的角度,来讲述如何在kubernetes集群中使用Jenkins作为持续集成工具。
100000798482
2020/03/25
5290
Kubernetes配合Jenkins实现轻量自动持续集成
之前写的Spinnaker自动化部署,部署复杂,依赖环境多,所以才有这一篇比较轻量级的自动化持续集成,需要用到的环境有Kubernetes-1.23、harbor、Jenkins、Helm、gitlab都是devops常见组件。
王先森sec
2023/04/24
2.9K0
Kubernetes配合Jenkins实现轻量自动持续集成
利用 Kubernetes 内置 PodTemplate 管理 Jenkins 构建节点
Jenkins 可以很好地与 Kubernetes 集成,不管是控制器(controller)还是构建节点(agent),都能以 Pod 的形式运行在 Kubernetes 上。 熟悉 Jenkins 的用户,都知道 Jenkins 支持多种类型的构建节点,例如:固定配置、动态配置。而节点与控制器连接的方式, 又包括:JNLP、SSH 等。对于已经在全面拥抱容器技术的用户,大多数是通过连接 Kubernetes 集群并动态启动、销毁 Pod 的方式来使用构建节点。 而随着构建节点的种类、数量增多后,如何更有效地维护这些基于 Kubernetes 的节点,则逐渐成为一个问题。而在这篇文章中, 我将会介绍一种基于配置即代码的方案来管理、维护构建节点。
LinuxSuRen
2022/12/01
1.4K0
使用 Jenkins Pipeline 流水线部署 Kubernetes 应用
要实现在 Jenkins 中的构建工作,可以有多种方式,我们这里采用比较常用的 Pipeline 这种方式。Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
我是阳明
2021/06/25
5.3K0
使用 Jenkins Pipeline 流水线部署 Kubernetes 应用
我要在k8s上部署jenkins(简单)
ServiceAccount它代表一个应用程序或者组件,并具有访问集群中Kubernetes API的令牌
dgds
2023/05/25
3K0
kubernetes 基于jenkins spinnaker的ci/cd实践二sonarqube的安装与简单使用
顺序有点乱了在ci/cd过程中应该是先进行代码的静态扫描再去进行扫描镜像的呢,就佛系的写了。反正步骤都是独立的。这里写一下sonarqube的安装与集成,估计实践的我还要好好研究一下!
对你无可奈何
2021/11/23
1.1K0
三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/12/24
6K2
三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境!!
如何使用 Jenkins Pipeline 流水线优雅的部署 Kubernetes 应用
虽然云原生时代有了 JenkinsX[1]、Drone[2]、Tekton[3] 这样的后起之秀,但 Jenkins 这样一个老牌的 CI/CD 工具仍是各大公司主流的使用方案。比如我司的私有云产品打包发布就是用这老家伙完成的。然而传统的 Jenkins Slave 一主多从方式会存在一些痛点,比如:
iMike
2021/07/01
2.2K0
Jenkins Pipeline 流水线部署 Kubernetes 应用
虽然云原生时代有了Jenkins X、Drone、Tekton 这样的后起之秀,但 Jenkins 这样一个老牌的 CI/CD 工具仍是各大公司主流的使用方案。
DevOps时代
2021/12/05
1.7K0
Jenkins Pipeline 流水线部署 Kubernetes 应用
Gitlab CI 在 Kubernetes 中的 Docker 缓存
前面我们有文章介绍过如何在 Kubernetes 集群中使用 GitLab CI 来实现 CI/CD,在构建镜像的环节我们基本上都是使用的 Docker On Docker 的模式,这是因为 Kubernetes 集群使用的是 Docker 这种容器运行时,所以我们可以将宿主机的 docker.sock 文件挂载到容器中构建镜像,而最近我们在使用 Kubernetes 1.22.X 版本后将容器运行时更改为了 Containerd,这样节点上没有可用的 Docker 服务了,这个时候就需要更改构建镜像的模式了,当然要实现构建镜像的方式有很多,我们这里还是选择使用 Docker 来构建我们的 Docker 镜像,也就是使用 Docker IN Docker 的模式。
我是阳明
2021/11/17
1.6K0
第2章 Jenkins Server的安装部署方式
本章阐述Jenkins Server的安装部署方式。基于Tomcat、CentOS、MacOS、Docker、Kubernetes、Windows部署。部署后的基础配置。
DevOps云学堂
2020/07/24
1.2K0
第2章 Jenkins Server的安装部署方式
推荐阅读
相关推荐
使用反向代理加速 Jenkins 插件下载
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验