一. 在node节点上安装软件. 具体软件内容如下
- 1. 下载jdk
- 下载tar包,上传到node https://pan.baidu.com/s/18IicPYf7W0j-sHBXvfKyyg
配置环境变量
export JAVA_HOME=/home/jdk1.8.0_161
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH
- 2. 下载tomcat,到node的/home目录下
- wget https:mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz
- 3. 下载jenkins 到/home
- wget http:mirrors.jenkins-ci.org/war/latest/jenkins.war
将jenkins的war放到tomcat的webaap目录下
mv jenkins.war /home/tomcat9/webapps
启动tomcat
- 4. 下载git,直接在node执行命令
- apt-get install get
- 5. 下载maven,到/home目录
- wget https:mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
解压,mv maven... maven3
配置环境变量
export M2_HOME=/home/maven3
export CLASSPATH=$CLASSPATH:$M2_HOME/lib
export PATH=$PATH:$M2_HOME/bin
修改maven仓库,maven3/conf/settings.xml
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
二. jenkins配置
1. 在浏览器输入http://192.168.1.104:8080/jenkins/
然后,在服务器找到初始密码,填入
2. 选择手动安装插件
3. 选择安装的插件
- ssh/publish over ssh
- git/git parameter
- maven Integration plugin
管理-->插件管理-->搜索maven Integration
4. jenkins全局工具配置中,配置jdk/git/maven
进入系统配置-->全局工具配置
配置jdk和git
三. jenkins + k8s发布实例
三个目标:
- Registry安装配置和使用
- jenkins项目创建和配置
- jenkins项目构建
1. docker的Registry的安装和配置
在node节点上,获取registry镜像
- docker pull registry
启动容器
- docker run -p 5000:5000 -v /home/registry_images:/var/lib/registry -d registry
这里将registry挂载到了本地目录,避免docker重启后,镜像丢失
2. registry的使用
修改master机器上的registry容器为所在的宿主机
- /etc/docker/daemon.json
- {
- "insecure-registries":["192.168.1.104:5000"],//修改为registry所在容器的宿主机
- "registry-mirrors": [https://w52p8twk.mirror.aliyuncs.com"]
- }
我的registry在node节点上,node的ip是192.168.1.104
重启docker
- systemctl daemon-reload
- systemctl restart docker
尝试把 192.168.1.104:5000/Nginx:test上传到我们的Registry仓库
- docker push 5000/Nginx:test
可以成功push,说明我们的仓库是创建成功了.
下面在node上做同样的操作. 修改/etc/docker/daemon.json文件
- {
- insecure-registries":[192.168.1.104:5000],]
- }
重启docker
- systemctl daemon-reload
- systemctl restart docker
3. 在Jenkins上构建项目
-
创建一个maven项目
-
勾选丢弃旧的构建, 保持构建的天数为2天,最大构建个数为2个
目的是: 可以根据分支进行构建.或者标签进行构建
https://github.com/solochen84/SpringBootDemo
-
下面开始构建项目
项目地址: https://github.com/solochen84/SpringBootDemo
git项目地址: https://github.com/solochen84/SpringBootDemo.git
这个项目是public的,所以,不需要配置Credentials
-
添加maven构建
@H_668_403@
-
设置构建后,将jar包打包成docker镜像,并推送到Registry
设置构建完之后执行的动作
脚本内容
- #!/bin/sh
- jarName=spring-boot-demo-0.0.1-SNAPSHOT.jar
- jarFolder=ph
- projectName=ph
- docker_path=${WORKSPACE}
- cp ${WORKSPACE}/target/${jarName} ${docker_path}
- sh /root/docker_dir/deploy_docker.sh ${projectName} ${docker_path} ${jarName}
- chmod 775 deploy_docker.sh
- #!/bin/sh
- # maven01 $workspace $jarname
- # ${projectName} ${docker_path} ${jarName}
- set -e
- projectName=$
- docker_path=$
- appName=$3
- #user_name=
- #password=
- tag=$(date +%s)
- server_path=5000
- target_image=${projectName}:${tag}
- #${BUILD_NUMBER}
- echo ${target_image}
- cd ${docker_path}
- docker build --build-arg app=${appName} -t ${target_image} .
- docker tag ${target_image} ${server_path}/${projectName}
- echo The name of image is ${server_path}\/${target_image}"
-
设置jenkins服务器到k8s master ssh免密登录
设置了免密登录,jenkins就可以到k8s上运行脚本,执行命令
-
- 在jenkins所在服务器上执行
- 生成秘钥
- ssh-keygen -t rsa
- 拷贝公钥
- ssh-copy-id -i ~/.ssh/id_rsa.pub root@1.106
-
- 测试免密登录
ssh root@192.168.1.106
-
设置构建后操作,将yaml文件拷贝到k8s master 上并运行应用
yaml文件的位置,是在项目里面的.
- e
- echo ok
- echo ${WORKSPACE}
- docker_path=${WORKSPACE}
- scp ${WORKSPACE}/*.yaml 192.168.1.106:/root/
- ssh 192.168.1.106 '/usr/bin/kubectl apply -f /root/kube.yaml'
- ssh 192.168.1.106 '/usr/bin/kubectl get svc|grep maven'
这里的ip地址填master的ip地址
-
Jenkins项目构建
构建的过程中,会出现各种各样的问题
1. no matches for kind "Deployment" in version "extensions/v1beta1"
参考文章: https://www.cnblogs.com/nnylee/p/11779653.html
修改对应的shell脚本
- .yaml 192.168.1.106:/root/
- ssh 192.168.1.106 'sed -i "s|extensions/v1beta1|apps/v1|" /root/kube.yaml'
- ssh 192.168.1.106 'sed -i "s|192.168.0.108|192.168.1.104|" /root/kube.yaml'
- ssh 192.168.1.106 '/usr/bin/kubectl apply -f /root/kube.yaml --validate=false'
- ssh 192.168.1.106 '/usr/bin/kubectl get svc|grep maven'
2. spec.template.Metadata.labels: Invalid value: map[string]string{"app":"maven"}: `selector` does not match template `labels`.
Build step 'Execute shell' marked build as failure
参考的是这篇文章: https://www.cnblogs.com/robinunix/p/11155860.html
我修改后的配置
- apiVersion: v1
- kind: Service
- Metadata:
- name: maven-service
- spec:
- type: NodePort
- ports:
- - name: maven
- port: 8080
- nodePort: 31002
- targetPort:
- protocol: TCP
- selector:
- app: maven
- ---
- apiVersion: apps/v1
- kind: Deployment
- Metadata:
- #name: maven-deployment
- name: maven
- spec:
- selector:
- matchLabels:
- app: maven
- replicas:
- template:
- Metadata:
- labels:
- app: maven
- spec:
- containers:
- - name: maven
- image: 192.168.1.104:5000/maven:latest
- ports:
- - containerPort:
- env:
- - name: key
- value: value"
然后重新启动,成功!
- kubectl get deployments --all-namespaces
发现,name为maven的deployment的Ready状态是0个
查看pod
- kubectl get pod --all-namespaces
发现有一个pending状态
查看pod的日志
- kubectl describe pod maven-7589958577-5ms68 -n default