前面的文章中已经涵盖了大部分的互联网开发中使用的工具和中间件的安装,给大家一个印象并在自己做个简单的测试使用应该没有问题。后面我们会讲到具体在项目中的使用。这里我们先阐述下自动化运维的准备工作
我们大体的思路是通过git的webhook触发jenkins操作。Jenkins执行maven的操作把java项目打包放到k8s私有仓库中.执行java项目下的dockerfile打成镜像。K8s执行运行执行镜像的脚本。项目运行在k8s的项目编排成功。
1.创建docker私有镜像仓库
执行命令docker pull registry拉取镜像
通过上面的镜像创建一个docker容器,命令如下:
docker run -d -v /Users/hfguan/self/docker/registry:/var/lib/registry -p 5000:5000 --restart=always --name private-registry registry
执行命令curl http://127.0.0.1:5000/v2/_catalog 验证私有镜像仓库是否启动成功。执行结果如下图所示:
修改docker私有镜像地址为我们刚才启动的服务的地址。
使用命令:vim /etc/docker/daemon.json在该文件下放入如下的内容
{"insecure-registries":["192.168.218.138:5000"]}
执行下面的命令重启docker
systemctl daemon-reload
systemctl restart docker
因为restart会造成容器停掉
我们使用命令 docker start f66 启动刚才停掉的容器
使用docker tag registry 192.168.218.138:5000/registry:v1打tag
把刚才打好的tag的image push到私有镜像仓库里面.命令如下:
docker push 192.168.218.138:5000/registry:v1
验证私有镜像是否启动成功
使用命令:curl http://127.0.0.1:5000/v2/_catalog 结果如下:
2.通过webhook关联gitlab和jenkins
在jenkins上新增一条流水线:
点击jenkins左上角新建任务如下图所示:
点击确定后如下图所示:
在gitlab生成access token:
打开http://192.168.218.138:10004请求我们gitlab的地址。
我们第一次打开的时候 会让我们重置登录密码。(我设置的为yusong*******)
然后使用root用户登录如下图所示:
分别点击用户设置->访问令牌
点击之后填写相关信息如下图所示:
点击下面的create personal access token 生成token.如下图所示:
生产的token为21czi-g_kvsYepTN78Fk。如下图:
jenkins配置访问git的访问凭证:
打开http://192.168.218.138:10002/jenkins/如下图所示:
依次点击jenkins->系统管理.拉到下方找到系统配置。如下图所示:
点击系统配置。如下图所示:
下拉找到gitlab 如果没有请自行安装gitlab的插件。如下图所示:
依次填写name和url然后点击添加选择jenkins如下图所示:
启动api token 为刚才在gitlab中生产的token.完成之后点击添加。如下图所示:
点击右下角的test connection 发现一直提示no route to host
这个是因为网络不通。经过本人的调试发现两个都是docker镜像的时候不能使用宿主机的ip和做了映射的端口号。修改Gitlab host URL的值为http://172.17.0.4:8080。该值的来源为gitlab服务器的IP如下图所示:
修改了请求的地址 我们再次点击的时候 如下图:
点击左下角的保存。经过以上的操作,jenkins访问gitlab这条单线通了,接下来需要配置gitlab触发jenkins这个方向畅通的配置了。
gitlab配置webhook:
我们点开之前创建的k8s-pipeline项目
点击构建触发器页面会滚动到到构建触发器的位置.我们勾选如下图所示:
点击高级如下图所示:
点击右下角generate生成token。Token的值如下:
e19bcc36304c5e595f3395538eb19efb
新增一个webhook:
我们打开gitlab并用管理员帐号登录。create一个demo的项目
点开我们刚才创建的demo项目依次点击设置->集成如下图所示:
http://172.17.0.4:8080/jenkins/project/k8s-gitlab
填写好相关的配置往下拉点击add webhook 如下图所示
(如果该地址为局域网的地址add会失败说补允许本地地址的添加)
我们先点击管理中心 如下图所示:
依次点击设置->网络->外发请求的展开->allow request to the local network from hooks and services.如下图所示:
再次点击add webhook如下图
点击test右边的三角如下图:
选择push events如下图所示:
因为我们的项目是刚创建的项目还没有提交记录。我们在ide中新建一个demo的项目并提交到刚才在gitlab中创建的项目。请自行操作
我们再次进行push events的操作发现
这个时候 说明我们可以触发提交的事件了。
流水线的创建(pipeline):
回到jenkins点击流水线如下图所示:
我们选择pipeline script from SCM
scm 下选择选择git.我们填写好相关的配置如下图:
点击左下角的保存
dockerfile的创建:
在demo的项目的根目录下创建dockerfile文件.
# openjdk:lastest 可从https://hub.docker.com/官方镜像仓库去查找你想要的镜像
FROM openjdk:11
COPY ./build/libs/scaffold-1.0-SNAPSHOT.jar docker-scaffold.jar
#JAVA_OPTS 是用来设置JVM相关运行参数的变量
ENV JAVA_OPTS="-Dserver.port=8081"
EXPOSE 8081
ENTRYPOINT exec java $JAVA_OPTS -jar docker-scaffold.jar
Jenkinsfile的创建 文件内容如下:
pipeline {
agent any
stages {
stage('Build'){steps{sh './gradlew clean build'}}
stage('Build Docker image'){steps{sh '/usr/local/bin/docker build -f ./Dockerfile . -t 192.168.1.8:5000/scaffold:v5'}}
stage('Docker push image'){steps{sh '/usr/local/bin/docker push 192.168.1.8:5000/scaffold:v4'}}
stage('kubectl create pod'){steps{sh '/usr/local/bin/kubectl apply -f ./deploy/application.yaml '}}
}
}
k8s 创建pod文件的创建内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: backnd
labels:
name: backnd
spec:
replicas: 2
selector:
matchLabels:
name: backnd
template:
metadata:
labels:
name: backnd
spec:
containers:
- name: scaffold
image: 192.168.1.8:5000/scaffold:v5
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8081
imagePullSecrets:
- name: regsecret
---
apiVersion: v1
kind: Service
metadata:
name: scaffold
spec:
type: NodePort
ports:
- port: 8081
nodePort: 30011
targetPort: 8081
selector:
name: backnd
我们提交代码发现jenkins开始build了。但是构建未成功。这个是因为dockfile和流水的问题。如下图所示: