使用Jenkins部署K8s项目

说明

持续集成Continuous Integration(CI)和持续交付Continuous Delivery(CD)在项目中也算是比较重要的一部分,在我进行项目容器化的过程中,发现不断的自己去手工操作kubectl实在是太麻烦了,也不容易形成记录,在查找了一下资料后,选用了Jenkins进行CI/CD,下面通过一个具体的实例来记录我使用Jenkins的过程,有问题欢迎讨论( ̄ェ ̄;)。我的K8s是单Master多worker,多Master的话可能有不一样的地方,请酌情查看。

快速开始

Jenkins的安装

这一步网上教程挺多的了,官网->https://www.jenkins.io/zh/有详细的步骤,跳过了。需要注意的是安装Jenkins的服务器需要安装Java8、Git、Maven环境。由于需要使用到Git SSH,所以需要在服务器上生成公钥和私钥

git config --global user.name "yunlingfly"
git config --global user.email "[email protected]"
ssh-keygen -t rsa -C "[email protected]"

另外需要建立一个软连接防止运行构建的时候mvn找不到(Jenkins 通过shell脚本调用mvn 命令的时候,是从/usr/bin 文件夹中找命令的),详细可以戳->jenkins mvn:命令未找到。

mvn help:system # 在/root下生成m2仓库
ln -s /usr/maven/apache-maven-3.6.3/bin/mvn /usr/bin/mvn

Springboot项目

新建一个Springboot的项目,编辑application.yml改个端口

server:
  port: 8888

创建一个Controller

package cn.yunlingfly.springbootjenkins.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 测试类
 *
 * @author yunlingfly
 * @date 2020-7-20
 */
@RestController
public class TestController {
    @GetMapping("/get")
    public String helloWorld() {
        return "Hello world";
    }
}

在根目录下新建build目录,新建build.sh文件内容如下如果没有搭建私有Harbor的话也可以使用dockerhub,但一般来说为了项目的安全还是应该自建镜像仓库的,可以看我之前的博客搭建Harbor->Harbor 1.8的安装和使用

export JENKINS_HOME="/root/.jenkins/workspace/springboot-jenkins"
export JENKINS_VERSION="v0.1"

echo "JENKINS_HOME:${JENKINS_HOME},JENKINS_VERSION:${JENKINS_VERSION}"

echo "开始打包"
mvn clean
mvn package

echo "开始制作镜像"
docker build -t 你的私有Harbor地址/yunlingfly/jenkins:$JENKINS_VERSION $JENKINS_HOME

echo "开始推镜像"
docker push 你的私有Harbor地址/yunlingfly/jenkins:$JENKINS_VERSION

echo "开始运行镜像"
kubectl apply -f $JENKINS_HOME/build/jenkins-svc.yaml
# 使用envsubst传递export的参数
envsubst < $JENKINS_HOME/build/jenkins-deployment.yaml | kubectl apply -f -

编写Dockerfile

# Java8镜像
FROM yunlingfly/base:latest

WORKDIR /

# 将系统编码设置为c.utf-8,默认的POSIX不支持中文
ENV LANG C.UTF-8
ENV LANGUAGE C.UTF-8
ENV LC_ALL C.UTF-8

# 将子项目打包的jar包拷贝到项目根目录
COPY target/springboot-jenkins-0.0.1-SNAPSHOT.jar /jenkins.jar

# 设置容器启动时执行的命令,-Dfile.encoding=utf-8
CMD ["java", "-jar", "jenkins.jar"]

 编写暴露端口的Service:jenkins-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: jenkinks-service
  labels:
    app: jenkinks-service
spec:
  type: NodePort
  ports:
    - port: 8888
      name: jenkinks-service
      targetPort: 8888
      nodePort: 32088
      protocol: TCP
  selector:
    app: jenkinks-service

编写Deployment: jenkins-svc.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkinks-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      name: jenkinks-service
  template:
    metadata:
      labels:
        name: jenkinks-service
        app: jenkinks-service
    spec:
      containers:
        - name: jeecg
          image: 你的私有Harbor地址/yunlingfly/jenkins:$JENKINS_VERSION
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8888

GitLab的配置

新建一个仓库起名springboot-jenkins,把你之前生成的公钥放到你的GitLab上,这样Jenkins就能直接拉代码了

cat /root/.ssh/id_rsa.pub

Jenkins的使用

新建Item->Freestyle project 起名springboot-jenkins

使用Jenkins部署K8s项目_第1张图片

使用Jenkins部署K8s项目_第2张图片

General你可以随意填

源码管理选git,URL填你GitLab仓库的SSH地址,Credentials不需要填了,因为我们之前配过公钥了,其他默认就行

构建触发器,勾选Build when a change is pushed to GitLab,然后会打印出GitLab webhook URL,这个URL等会需要填到GitLab里,点击高级,点击generate生成Secret token,等会在Gitlab需要用到这两个参数

构建环境,不需要配置

构建,添加构建步骤-> execute shell输入下面的命令

# /root/.jenkins/workspace目录是Jenkins构建项目的目录
sh /root/.jenkins/workspace/springboot-jenkins/build/build.sh

构建后操作,不需要设置

然后就可以应用/保存了

Webhooks的设置

下面设置是表示如果有push时间的话会调用你设置的Url,然后Jenkins就会把仓库的代码pull下来构建。先将你的Springboot项目push到仓库里,点击Setting->Integrations/WebHooks,这里的URL填入你 构建触发器 里的那个URL,例如http://你的Jenkins_Ip地址:8080/project/springboot-jenkins/build,Secret Token也是在填入 构建触发器 生成的那个token,然后就可以保存了。测试一下:点击Test->Push Event看看有没有成功,如果出现错误“Requests to the local network are not allowed”,需要使用admin用户设置允许webhooks和本机网络交互,具体查看博客->【GitLab】gitlab上配置webhook后,点击测试报错:Requests to the local network are not allowed

使用Jenkins部署K8s项目_第3张图片

上面的设置表示每一次master分支有push就会触发一次构建,之后就可以在Jenkins查看每一次构建日志输出了,如果出错也可以在这里查看。当然这里只管构建的错误,如果K8s在运行镜像的时候出了错误就不能在这里看到了,例如ERROR ImagePull,这种错误的话还是得通过K8s的日志或是其他的K8s监控工具查看

使用Jenkins部署K8s项目_第4张图片

都没有错误的话可以访问http://Master_Ip:32088/get 即可看到输出Hello world

你可能感兴趣的:(Git,CI/CD,Jenkins,K8s,CI/CD)