1、准备
1.1、安装k8s集群
每个docker机器
1 | vi /etc/docker/daemon.json |
1.2、harbor 启动
1 | docker-compose -f /data/tools/harbor/docker-compose.yml stop |
2. k8s中部署jenkins
2.1、制作jenkins镜像
https://hub.docker.com/r/jenkins/jenkins/tags
1 | docker pull jenkins/jenkins:2.251-alpine |
dockerfile
1 | FROM jenkins/jenkins:2.251-alpine |
编译镜像
1 | docker build -t czharbor.com/devops/cz-jenkins:lts-alpine . |
2.2、共享存储NFS部署
NFS服务部署:https://www.jianshu.com/p/26003390626e
创建NFS 动态供给参考:https://www.jianshu.com/p/092eb3aacefc
centos7-hub(192.168.145.130):磁盘所在机器
k8s-dn1():使用centos7-hub共享的磁盘
k8s-dn2():使用centos7-hub共享的磁盘
k8s-dn1():使用centos7-hub共享的磁盘
2.2.1、在 centos7-hub 上设置
1、关闭防火墙
1 | $ systemctl stop firewalld.service |
2、安装配置 nfs
1 | $ yum -y install nfs-utils rpcbind |
3、共享目录设置权限:
1 | $ mkdir -p /data/nfs/jenkins/ |
4、配置 nfs,nfs 的默认配置文件在 /etc/exports 文件下,在该文件中添加下面的配置信息:
1 | $ vi /etc/exports |
5、配置说明:
/data/nfs/jenkins/:是共享的数据目录
*:表示任何人都有权限连接,当然也可以是一个网段,一个 IP,也可以是域名
rw:读写的权限
sync:表示文件同时写入硬盘和内存
no_root_squash:当登录 NFS 主机使用共享目录的使用者是 root 时,其权限将被转换成为匿名使用者,通常它的 UID 与 GID,都会变成 nobody 身份
启动服务 nfs 需要向 rpc 注册,rpc 一旦重启了,注册的文件都会丢失,向他注册的服务都需要重启
1 | vi /etc/netconfig |
注意启动顺序,先启动 rpcbind
1 | $ systemctl start rpcbind.service |
看到上面的 Started 证明启动成功了。
然后启动 nfs 服务:
1 | $ systemctl start nfs.service |
同样看到 Started 则证明 NFS Server 启动成功了。
另外还可以通过下面的命令确认下:
1 | $ rpcinfo -p|grep nfs |
查看具体目录挂载权限:
1 | $ cat /var/lib/nfs/etab |
到这里nfs server就安装成功了,接下来在节点 k8s-n1
上来安装 nfs 的客户端来验证下 nfs
2.2.2、在 k8s-n1上设置
安装 nfs 当前也需要先关闭防火墙:
1 | $ systemctl stop firewalld.service |
然后安装 nfs
1 | $ yum -y install nfs-utils rpcbind |
禁用ipv6
1 | vi /etc/netconfig |
安装完成后,和上面的方法一样,先启动 rpc、然后启动 nfs:
1 | systemctl start rpcbind.service |
挂载数据目录 客户端启动完成后,在客户端来挂载下 nfs 测试下:
首先检查下 nfs 是否有共享目录:
1 | $ showmount -e 192.168.145.130 |
然后我们在客户端上新建目录:
1 | $ mkdir /data |
将 nfs 共享目录挂载到上面的目录:
1 | $ mount -t nfs 192.168.145.130:/data/nfs/jenkins /data |
挂载成功后,在客户端上面的目录中新建一个文件,然后观察下 nfs 服务端的共享目录下面是否也会出现该文件:
1 | $ touch /data/test.txt |
然后在 nfs 服务端查看:
1 | $ ls -ls /data/nfs/jenkins |
如果上面出现了 test.txt 的文件,那么证明 nfs 挂载成功了。
2.3、部署jenkins到k8s
jenkins-pv-pvc.yaml
1 | apiVersion: v1 |
jenkins-service-account.yaml
1 | apiVersion: v1 |
jenkins-statefulset.yaml
1 | apiVersion: apps/v1 |
问题1:jenkins镜像里已经安装了docker,千万不能把 主机的 /usr/bin/docker 挂载到 docker 里去,否则会出错:
1
2
3 bash-4.4# docker ps
bash: /usr/bin/docker: No such file or directory
问题2:Jenkinsfile中运行docker 挂载 父容器的数据卷的时候,会继承父容器的网络,将 jenkins的网络模式指定为
hostNetwork: true
表示使用主机的网络和iptables,这样kubectl发布应用才能正常运行
jenkins-service.yaml
1 | apiVersion: v1 |
jenkins-ingress.yaml
1 | apiVersion: extensions/v1beta1 |
执行部署动作
1 | [root@k8s-dn1 ~]# kubectl create ns devops |
访问
在hosts文件中添加
1 | 192.168.145.151 cz-jenkins.dev |
访问jenkins
admin/123456
1 | cat /data/nfs/jenkins/secrets/initialAdminPassword |
2.4、Jenkins初始化
2.5、Jenkins配置
系统管理 –> 插件管理 –> available,安装需要的插件,有的插件下载不下来可以去官网下载之后上传安装。
系统管理——》插件管理——》可选插件——》安装
Git
Git Parameter
Pipeline
Kubernetes
Kubernetes Continuous Deploy
Gitee
3、构建Jenkins Slave镜像
参考:https://github.com/jenkinsci/docker-jnlp-slave
1. 构建Jenkins Slave镜像环境准备
构建Jenkins Slave镜像环境准备:
代码拉取:git,安装git命令
单元测试:忽略,这不是我们擅长的,如果公司有可以写进来
代码编译:maven,安装maven包
构建镜像:Dockerfile文件、docker命令(通过挂载宿主机docker)
推送镜像:docker命令(通过挂载宿主机docker)
镜像启动后支持slave: 下载官方slave.jar包(获取:http://10.40.6.213:30006/jnlpJars/slave.jar)
启动 slave.ja包:jenkins-slave启动脚步(通过参考文档URL)
maven配置文件:settings.xml (这里配置阿里云的仓库源)
获取相关文件:
Dockerfile
jenkins-slave 启动脚步
settings.xml
slave.jar
创建目录并进入:
mkdir jenkins-slave && cd jenkins-slave
1 | [root@centos7cz jenkin]# pwd |
2. jenkins-slave启动脚本
1 | [root@centos7cz jenkins-slave]# vi jenkins-slave |
1 | cat jenkins-slave |
3、maven源配置文件settings.xml
maven源配置文件settings.xml,这里配置阿里云的源。
1 | [root@centos7cz jenkins-slave]# vi settings.xml |
1 | cat settings.xml |
4. Dockerfile配置文件
1 | [root@centos7cz jenkins-slave]# vi Dockerfile |
1 | FROM alpine:latest |
5. 构建镜像, 并推送至私有镜像仓库
1 | [root@centos7cz jenkins-slave]# docker build -t czharbor.com/devops/jenkins-slave:2.249 . |
4、构建maven镜像
4.1、Dockerfile
1 | FROM alpine:latest |
为了调用protoc,一定要安装glibc
https://github.com/sgerrand/alpine-pkg-glibc
否则会碰到如下问题:
用Alpine跑了JDK8的镜像结果发现,JDK还是无法执行.后来翻阅文档才发现
Java是基于GUN Standard C library(glibc)
Alpine是基于MUSL libc(mini libc)所以Alpine需要安装glibc的库,以下是官方给出wiki
https://wiki.alpinelinux.org/wiki/Running_glibc_programs
1
2 > [ERROR] Failed to execute goal org.xolstice.maven.plugins:protobuf-maven-plugin:0.6.1:compile (default) on project nacos-grpc-iface: An error occurred while invoking protoc: Error while executing process.: Cannot run program "/var/jenkins_home/workspace/nacos-grpc-k8s@2/nacos-grpc-iface/target/protoc-plugins/protoc-3.12.2-linux-x86_64.exe": error=2, No such file or directory -> [Help 1]
>
4.2、构建运行
1 | docker build -t czharbor.com/devops/cz-maven:3.6.3-alpine . |
5、构建kubectl镜像
dockerfile
1 | FROM alpine:latest |
1 | docker build -t czharbor.com/devops/kubectl:1.18.6-alpine . |
6、SpringBoot项目准备
关键文件:
nacos-grpc-srv 本身的 Dockerfile
deployment.yaml的模板文件 k8s-deployment.tpl
jenkins Pipeline 文件 Jenkinsfile
deployment.yaml
1 | apiVersion: apps/v1 |
Jenkinsfile
1 | // 需要在jenkins的Credentials设置中配置jenkins-harbor-creds、jenkins-k8s-config参数 |
7、使用jenkins部署项目到k8s
gitee秘钥
kubeconfig配置
1 | [root@k8s-dn1 ~]# base64 ~/.kube/config > kube-config.txt |
然后类似上一步,在jenkins凭据中增加配置文件内容。在凭据设置界面,类型选择为“Secret text”,ID设置为“jenkins-kubeconfig”(此处的ID必须与Jenkinsfile中的保持一致),Secret设置为上面经过base64编码后的配置文件内容。
开始构建
在k8s中查看
1 | kubectl logs -f pod/nacos-grpc-srv-deployment-66fbb6c749-vmm8s |
8、暴露nacos
1 | [root@k8s-dn1 nacos]# vi nacos-ingress.yaml |
1 | kubectl apply -f /data/nacos-grpc/nacos-ingress.yaml |
9、问题总结
1 | Unable to connect to the server: x509: certificate signed by unknown authority |