# Jenkins部署k8s应用

> 作者/来源: UCloud 运营管理员
> 发布时间: 2023-01-11T05:20:00.000Z
> 分类: 解决方案
> 标签: AI, Kubernetes, Docker
> 原文链接: http://117.50.162.249:3000/yun/articles/1061

---

# Jenkins部署k8s应用

> 来源: https://www.ucloud.cn/yun/129801.html
> 作者: IT那活儿
> 发布日期: 发布于2023-01-11 13:20

Jenkins部署k8s应用

## **Jenkins Pipeline 流水线部署 Kubernetes 应用**

使用 kubeadm 来创建一个单 master 节点的 kubernets 集群

kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.20.11

查看节点状态和 pod 都已经正常

```
kubectl get pod -ANAMESPACE NAME                                          READY     STATUS     RESTARTS    AGEkube-system   coredns-f9fd979d6-9t6qp             1/1            Running      0                  89skube-system   coredns-f9fd979d6-hntm8            1/1            Running      0                  89skube-system   etcd-jenkins                                 1/1            Running      0                 106skube-system   kube-apiserver-jenkins                 1/1            Running      0                 106skube-system   kube-controller-manager-jenkins  1/1            Running      0                 106skube-system   kube-proxy-8pzkz                         1/1            Running      0                 89skube-system   kube-scheduler-jenkins                 1/1            Running     0                  89s
```

去除 master 节点上的污点，允许其他的 pod 调度在 master 节点上，不然后面 Jenkins 所创建的 pod 将无法调度在该节点上。

```
kubectl taint nodes $(hostname) node-role.kubernetes.io/master:NoSchedule-
```

## 

## 

## **Jenkins master**

建议使用docker-compose来部署。运行在kubernetes集群集群中也没什么毛病，但是将Jenkins master独立于kubernetes集群部署比较方便.

```
docker-compose.yaml:version: 3.6services:  jenkins:    image: jenkins/jenkins:2.263.4-lts-slim    container_name: jenkins    restart: always    volumes:      - ./jenkins_home:/var/jenkins_home    network_mode: host    user: root    environment:      - JAVA_OPTS=-Duser.timezone=Asia/Shanghai
```

使用docker-compose up来启动，成功启动后会提示，日志输出的密钥就是admin用户的默认密码，使用它来第一次登录 Jenkins。

登录上去之后，建议选择 “选择插件” 来安装，尽可能少地安装插件，按需安装即可。在Jenkins的插件管理那里安装上kubernetes插件。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129801/images/129801_000.png)

**接下来开始配置Jenkin与kubernetes**

配置 kubernets 的地方是在 系统管理 > 节点管理 > Configure Clouds。点击 Add a new cloud，来添加一个 kubernetes 集群。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129801/images/129801_001.png)

在 Jenkins 的凭据那里添加上 kubeconfig 文件，凭据的类型选择为 Secret file，然后将上面使用 kubeadm 部署生成的 kubeconfig 上传到这里。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129801/images/129801_002.png)

点击连接测试，如果提示 Connected to Kubernetes v1.19.8 就说明已经成功连接上了 kubernetes 集群。

## **Jenkinsfile**

流水线 Jenkinsfile，下面是一个简单的任务，用于构建 webp-server-go 项目的 docker 镜像。

```
// Kubernetes pod template to run.def JOB_NAME = "${env.JOB_NAME}"def BUILD_NUMBER = "${env.BUILD_NUMBER}"def POD_NAME = "jenkins-${JOB_NAME}-${BUILD_NUMBER}"podTemplate(# 这里定义 pod 模版){ node(POD_NAME) {    container(JOB_NAME) {      stage("Build image") {        sh """#!/bin/bash          git clone https://github.com/webp-sh/webp_server_go /build          cd /build          docker build -t webps:0.3.2-rc.1 .        """      }    }  }}
```

pod 模版如下，将模板的内容复制粘贴到上面的 Jenkinsfile 中。在容器中构建镜像，使用 dind 的方案：将 pod 所在宿主机的 docker sock 文件挂载到 pod 的容器内，pod 容器内只要安装好 docker-cli 工具就可以像宿主机那样直接使用 docker 了。

```
podTemplate(  cloud: "kubernetes",  namespace: "default",  name: POD_NAME,  label: POD_NAME,  yaml: """apiVersion: v1kind: Podspec:  containers:  - name: ${JOB_NAME}    image: "debian:buster-docker"    imagePullPolicy: IfNotPresent    tty: true    volumeMounts:    - name: dockersock      mountPath: /var/run/docker.sock  - name: jnlp    args: ["$(JENKINS_SECRET)", "$(JENKINS_NAME)"]    image: "jenkins/inbound-agent:4.3-4-alpine"    imagePullPolicy: IfNotPresent  volumes:  - name: dockersock    hostPath:      path: /var/run/docker.sock""",)
```

构建 debian:buster-docker 镜像，使用它来在 pod 的容器内构建 docker 镜像，使用的 Dockerfile 如下：

```
FROM debian:busterRUN apt update     && apt install -y --no-install-recommends         vim         curl         git         make         ca-certificates         gnupg     && rm -rf /var/lib/apt/lists/*RUN curl -fsSL "https://download.docker.com/linux/debian/gpg" | apt-key add -qq - >/dev/null     && echo "deb [arch=amd64] https://download.docker.com/linux/debian buster stable" > /etc/apt/sources.list.d/docker.list     && apt update -qq     && apt-get install -y -qq --no-install-recommends docker-ce-cli     && rm -rf /var/lib/apt/lists/*
```

定义好 jenkinsfile 文件并且构建好 pod 模板中的镜像后，接下来开始使用它来创建流水线任务。

## 

## **流水线**

在 Jenkins 上新建一个任务，选择任务的类型为 流水线

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129801/images/129801_003.png)

将定义好的 Jenkinsfile 内容复制粘贴到流水线定义 Pipeline script 中并点击保存。在新建好的 Job 页面点击 立即构建 来运行流水线任务。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129801/images/129801_004.png)

在 kubernetes 集群的机器上使用 kubectl 命令查看 pod 是否正常 Running

```
kubectl get podNAME                                       READY    STATUS      RESTARTS   AGEjenkins-webps-9-bs78x-5x204    2/2           Running      0                   66s
```

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129801/images/129801_005.png)

END

更多精彩干货分享

点击下方名片关注

IT那活儿

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129801/images/129801_006.png)