首先说一下我的环境,首先准备一台ubuntu18.4虚拟机,安装docker, 然后用docker 安装gitlab[大家可以参考 Ubuntu Docker搭建GitLab以及常规配置使用]  和harbor【大家可以参考 Ubuntu18 安装搭建Harbor】,关于k8s的安装大家 可以参考 Ubuntu 18 Kubernetes集群的安装和部署 以及Helm的安装 和 Centos 使用kubeadm安装Kubernetes 1.15.3 关于harbor 程序手动更新到k8s 参考 Windows docker k8s asp.net core.我尝试过通过docker来安装jenkins,jenkins容器里面在安装docker和harbor通信,但是后面还是遇到很多问题 不好解决, docker默认是无状态的 需要保存的数据都要挂在的虚拟机上, 比如jenkins里面下载的golang镜像,jenkins重启就丢失了, 所以后面彩用jenkins直接安装到虚拟机上。

jenkins安装

go项目

为了省事我们把必要脚本都放到项目里面,项目结构如下:

 我们的Dockerfile文件如下:

build.sh文件是把docker镜像推到harbor上的【已经测试通过】

buildtest.sh是在jenkins上直接运行docker实例

在jenkins上创建一个 自由风的项目 gavintest, 调用shell脚本:

 jenkins构建结果:

访问结果:

 

 修改配置

 重启docker restart gavintest然后访问

k8s部署

准备【手动部署一次】

这里需要用到pvc,关于pvc的搭建我就省略了, 大家可以参考 ubuntu kubernetes中使用NFS创建pv_pvc  ,以下都是在k8s master上执行,[我为了方便把 端口改为80了而不在是8080]

命令空间1.准备namespace.yaml

创建mypv.yaml (kubectl apply -f mypvc.yaml)

和mypvc.yaml (kubectl apply -f mypvc.yaml)

和deploy.yaml (kubectl apply -f deploy.yaml)

我们可以用kubectl exec -it  podnamexxx   -n gobash 进入pod验证以下

 或者  kubectl get pod -o wide -n go 查看ip直接访问

 service.ymal  (kubectl apply -f service.ymal)

 ingress.yaml  (kubectl apply -f ingress.yaml )  可以参考 https://www.cnblogs.com/fanqisoft/p/11609172.html

 配置域名host 然后访问:

 手动部署结果成功:

修改配置文件 然后手动重启 以下pod 看看配置是否更新

 

推送到harbor的效果图:

 现在我们搞一个rollout.sh文件【需要和gavintest_dm.yaml同级目录】, 就是根据现有的deploy.yaml文件来生成新的部署文件,然后调用/data/k8s/rollout.sh 38 [38是harbor里面镜像版本号,如果有权限问题
chmod 777 /data/k8s/rollout.sh]

 

那么jenkins就可以用过ssh 192.168.100.11 "cd /data/k8s   && sh rollout.sh ${BUILD_NUMBER}"  来调用shell了

错误Host key verification failed 的解决

a.jenkins普通用户无法执行某些系统命令;

b.我们并没有为jenkins生成过密钥对,也没有将他的公钥拷到目标服务器上.

  在安装jenkins后,系统生成了jenkins这个普通用户,但是在/etc/passwd中,他的shell是/bin/false,所以他不能登录系统,也没有家目录;

  首先我们修改他的登录权限,将/bin/false改为/bin/bash,切换到jenkins用户,su - jenkins,他的终端显示为-bash-4.2$,修改终端显示.

终端修改完之后长这个样子

生成密钥对

具体步骤

3.使用sudo提升普通用户权限

  此时是完成了第二步,但还没有操作第一步,在文件末尾添加一行,就这么一行就有很多要注意的地方,首先修改文件权限为600,然后用viduso去修改文件,中间的空隙不是空格,而是tab,命令和命令之间要用逗号,保存退出后,将权限改为440,而不是400,最后用visudo -c检查语法是否出错.

jenkins        ALL=(ALL)    NOPASSWD: /usr/bin/ssh, /usr/bin/rsync

jenkins        ALL=(ALL)    NOPASSWD: ALL

这两行内容任意选一个都行.

需要确保k8s master 的vi /etc/ssh/sshd_config 配置

重启 sudo systemctl restart jenkins,至于如何带哦用远程的sh我这里比较偷懒 直接用插件SSH remote hosts

 

 

 

注意事项

1.jenkins账号运行docker 没有权限提示 :dial unix /var/run/docker.sock: connect: permission denied 解决办法

2.jenkins在王harbor上推送失败,提示push: unauthorized to access repository,解决办法

 3

main.go

default.go