基于jenkins+k8s实现devops

1、背景

由于jenkins运行在k8s上能够更好的利用动态agent进行构建。所以写了个部署教程,亲测无坑

2、部署

1、创建ns
kubectl create namespace devops

2、kubectl apply -f jenkins.yml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
  namespace: devops
---
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: devops
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: jenkins
subjects:
  - kind: ServiceAccount
    name: jenkins
    namespace: devops
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: devops
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:2.414.1-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
            - name: localtime
              mountPath: /etc/localtime  
      volumes:
        - name: jenkinshome
          hostPath:
            path: /opt/jenkins/jenkins_data
        - name: localtime
          hostPath:
            path: /etc/localtime
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: devops
  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: devops
spec:
  ingressClassName: nginx
  rules:
    - host: jenkins.k8s.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: jenkins
                port:
                  name: web


注意:镜像建议使用最新版本,因为jenkin平台默认提供了最新的插件,且无法选择版本,所以如果jenkins版本过低会导致插件不兼容问题

3、本地电脑配置host解析后,就可以用域名访问

4、查看pod日志获取初始化密码,也可以查看/opt/jenkins/jenkins_data/secrets/initialAdminPassword

5、安装必要插件
中文插件: Localization: Chinese
pipeline插件:Pipeline
k8s插件: Kubernetes
代码库管理插件:Git

6、配置k8s连接信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

填写 以下内容 ,然后点击测试。
k8s地址 :https://kubernetes.default.svc.cluster.local
命名空间:devops
jenkins地址:http://jenkins.devops.svc.cluster.local:8080

由于之前部署的时候已经给jenkins用户访问k8s 的devops命名空间的权限,所以这里不需要配置kubeconfig认证也可直接访问

3、编写一条pipeline

这里用一个java项目的ci过程作为案例

def createVersion() {
    // 定义一个版本号作为当次构建的版本,输出结果 20191210175842_69
    return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
}

pipeline{
    agent{
        kubernetes{
          defaultContainer 'maven'
          yaml '''
apiVersion: v1
kind: Pod
spec:
  containers:
    - name: maven
      image: maven:3.8.1-jdk-8
      command: ["sleep"]
      args: ["99d"]
    - name: docker
      image: docker
      command: ["sleep"]
      args: ["99d"]
      volumeMounts:
        - mountPath: /var/run/docker.sock
          name: docker-socket
  volumes:
    - name: docker-socket
      hostPath:
        path: /var/run/docker.sock
'''
        }
    }
    environment {
        tag = createVersion()
    }
    stages{
        stage("pull code"){
          steps{
            script{
              git 'https://gitee.com/uuei/java-devops-demo.git'
            }
          }
        }
        stage("mvn"){
          steps{
            script{
              sh 'mvn clean package'
            }
            container('docker') {
              script {
              sh 'docker build -t java-demo:${tag} .'
            }
        }
          }
        }
    }
}
Kubernetes 环境中配置 Jenkins 实现 DevOps 自动化部署,主要涉及 Jenkins 的安装、与 Kubernetes 的集成、以及构建自动化流水线。以下是详细的配置步骤: ### 安装 Jenkins 1. **使用 Helm 安装 Jenkins** Jenkins 可以通过 Helm Chart 快速部署到 Kubernetes 集群中。Helm 是 Kubernetes 的包管理工具,可以简化 Jenkins 的安装和配置过程。 使用以下命令安装 Jenkins Helm Chart: ```bash helm repo add jenkins https://charts.jenkins.io helm repo update helm install jenkins jenkins/jenkins ``` 2. **持久化存储配置** Jenkins 需要持久化其配置和构建数据,因此建议在安装时配置持久卷(Persistent Volume)和持久卷声明(Persistent Volume Claim),以防止数据丢失。 3. **访问 Jenkins UI** 安装完成后,可以通过 Service 或 Ingress 暴露 Jenkins 的 Web 界面。如果集群中已部署了 Ingress 控制器(如 ingress-nginx),可以使用 Ingress 配置访问路径[^5]。 ### 配置 JenkinsKubernetes 集成 1. **安装 Kubernetes 插件** 在 Jenkins UI 中,进入“Manage Jenkins” > “Plugins” > “Available”,搜索并安装 `Kubernetes plugin`。该插件允许 JenkinsKubernetes 集群中动态创建 Jenkins Agent(即构建节点)[^2]。 2. **配置 Kubernetes 云环境** 在 Jenkins 的“Manage Jenkins” > “Nodes and Clouds”中添加 Kubernetes 云配置。需要提供 Kubernetes 集群的 API 地址、凭证(如 kubeconfig 文件)、以及 Jenkins Agent 的镜像等信息。 3. **配置 Jenkins Agent Pod 模板** 为 Jenkins Agent 定义 Pod 模板,指定所需的容器镜像(如带有 `kubectl` 和 `docker` 的自定义镜像)、卷挂载(如 `/var/run/docker.sock`)等。确保 Jenkins 用户有权限访问 Docker 套接字文件,并将 Jenkins 用户加入相应的用户组(如 `docker` 或 `daemon` 组)[^4]。 ### 构建 DevOps 自动化流水线 1. **创建 Jenkins Pipeline** 创建一个新的 Pipeline 项目,并在 `Jenkinsfile` 中定义构建、测试、部署等阶段。例如: ```groovy pipeline { agent { kubernetes { label 'my-agent' defaultContainer 'jnlp' yaml """ apiVersion: v1 kind: Pod metadata: labels: app: jenkins-agent spec: containers: - name: jnlp image: jenkins/inbound-agent:latest - name: docker image: docker:latest volumeMounts: - name: docker-socket mountPath: /var/run/docker.sock volumes: - name: docker-socket hostPath: path: /var/run/docker.sock """ } } stages { stage('Build') { steps { sh 'echo Building...' } } stage('Deploy') { steps { sh 'kubectl apply -f deployment.yaml' } } } } ``` 2. **使用 Kubernetes 命令部署应用** 在 Pipeline 的部署阶段,可以使用 `kubectl` 命令将应用部署到 Kubernetes 集群中。通常使用 `deployment.yaml` 文件定义应用的部署规范[^2]。 3. **自动化测试与回滚机制** 可以在 Pipeline 中集成自动化测试脚本,确保每次提交的代码都经过验证。若测试失败,可配置自动回滚策略,恢复到上一个稳定版本。 ### 验证与调试 - **查看 Jenkins Agent 状态**:确保 Jenkins Agent Pod 正常运行,并且能够访问 Kubernetes API。 - **日志分析**:通过 Jenkins 的构建日志分析部署过程中的问题。 - **权限问题排查**:若遇到权限问题,检查 Jenkins 用户是否加入正确的用户组,并确认 Docker 套接字文件的权限设置[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值