基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持续集成交付环境的详细教程
环境搭建概述
亲爱的家人们可以到链接: 下载所需要的yaml文件。
1.k8s是什么?
k8s全称是kubernetes,是一个全新的基于容器技术的分布式架构领先方案,基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心的资源利用率的最大化。
如果我们的系统设计遵循了kubernetes的设计思想,那么传统系统架构中那些和业务没有多大关系的底层代码或功能模块,都可以使用k8s来管理,我们不必再费心于负载均衡的选型和部署实施问题,不必再考虑引入或自己开发一个复杂的服务治理框架,不必再头疼与服务监控和故障处理模块的开发。总之,使用kubernetes提供的解决方案,会大大减少开发成本,同时可以将精力更加集中于业务本身,而且由于kubernetes提供了强大的自动化机制,所以系统后期的运维难度和运维成本大幅降低。
2.为什么要用k8s?
docker 这个新兴的容器化技术当前已经被很多公司所采用,其从单机走向集群已成必然,而云计算的蓬勃发展正在加速这一进程。kubernetes 作为当前唯一被业界广泛认可和看好的 docker 分布式系统解决方案。可以预见,在未来几年内,会有大量的新系统选择它,不管是运行在企业本地服务器上还是被托管到公有云上。
3.使用k8s有哪些好处?
使用kubernetes就是在全面部署微服务架构。微服务架构的核心就是将一个巨大的单体应用分解为很多小的互相连接的微服务,一个微服务背后可能有多个实例副本在支撑,副本的数量可能会随着系统的负荷变化而进行调整,内嵌的负载均衡器在 k8s 平台中有多个实例副本在支撑,副本的数量可能会随着系统的负荷变化而进行调整,内嵌的负载均衡器 在k8s 平台中发挥了重要的作用。微服务架构使得每个服务都可以由专门的开发团队来开发,开发者可以*选择开发技术,这对于大规模团队来说很有价值。另外,每个微服务独立开发、升级、扩展,使得系统具备很高的稳定性和快速迭代进化能力。
4.环境构成
整套环境的搭建包含:docker环境的搭建、docker-compose环境的搭建、k8s集群的搭建、gitlab代码仓库的搭建、svn仓库的搭建、jenkins自动化部署环境的搭建、harbor私有仓库的搭建。
本文档中,整套环境的搭建包括:
- 安装docker环境
- 安装docker-compose
- 安装k8s集群环境
- 重启k8s集群引起的问题
- k8s安装ingress-nginx
- k8s安装gitlab代码仓库
- 安装harbor私有仓库
- 安装jenkins
- 物理机安装svn(推荐)
- 物理机安装jenkins(推荐)
- 配置jenkins运行环境
- jenkins发布docker项目到k8s
服务器规划
ip | 主机名 | 节点 | 操作系统 |
---|---|---|---|
192.168.0.10 | test10 | k8s master | centos 8.0.1905 |
192.168.0.11 | test11 | k8s worker | centos 8.0.1905 |
192.168.0.12 | test12 | k8s worker | centos 8.0.1905 |
安装环境
软件名称 | 软件版本 | 说明 |
---|---|---|
docker | 19.03.8 | 提供容器环境 |
docker-compose | 1.25.5 | 定义和运行由多个容器组成的应用 |
k8s | 1.18.2 | 是一个开源的,用于管理云平台中多个主机上的容器化的应用,kubernetes的目标是让部署容器化的应用简单并且高效(powerful),kubernetes提供了应用部署,规划,更新,维护的一种机制。 |
gitlab | 12.1.6 | 代码仓库 |
harbor | 1.10.2 | 私有镜像仓库 |
jenkins | 2.222.3 | 持续集成交付 |
安装docker环境
docker 是一个开源的应用容器引擎,基于 go 语言 并遵从 apache2.0 协议开源。
docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 linux 机器上,也可以实现虚拟化。
本文档基于docker 19.03.8 版本搭建docker环境。
在所有服务器上创建install_docker.sh脚本,脚本内容如下所示。
在每台服务器上为install_docker.sh脚本赋予可执行权限,并执行脚本,如下所示。
安装docker-compose
compose 是用于定义和运行多容器 docker 应用程序的工具。通过 compose,您可以使用 yml 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 yml 文件配置中创建并启动所有服务。
注意:在每台服务器上安装docker-compose
1.下载docker-compose文件
2.为docker-compose文件赋予可执行权限
3.查看docker-compose版本
安装k8s集群环境
kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,kubernetes的目标是让部署容器化的应用简单并且高效(powerful),kubernetes提供了应用部署,规划,更新,维护的一种机制。
本文档基于k8s 1.8.12版本来搭建k8s集群
安装k8s基础环境
在所有服务器上创建install_k8s.sh脚本文件,脚本文件的内容如下所示。
在每台服务器上为install_k8s.sh脚本赋予可执行权限,并执行脚本
初始化master节点
只在test10服务器上执行的操作。
1.初始化master节点的网络环境
注意:下面的命令需要在命令行手动执行。
2.初始化master节点
在test10服务器上创建init_master.sh脚本文件,文件内容如下所示。
赋予init_master.sh脚本文件可执行权限并执行脚本。
3.查看master节点的初始化结果
(1)确保所有容器组处于running状态
具体执行如下所示。
(2) 查看 master 节点初始化结果
具体执行如下所示。
初始化worker节点
1.获取join命令参数
在master节点(test10服务器)上执行如下命令获取join命令参数。
具体执行如下所示。
其中,有如下一行输出。
这行代码就是获取到的join命令。
注意:join命令中的token的有效时间为 2 个小时,2小时内,可以使用此 token 初始化任意数量的 worker 节点。
2.初始化worker节点
针对所有的 worker 节点执行,在这里,就是在test11服务器和test12服务器上执行。
在命令分别手动执行如下命令。
具体执行如下所示。
根据输出结果可以看出,worker节点加入了k8s集群。
注意:kubeadm join…就是master 节点上 kubeadm token create 命令输出的join。
3.查看初始化结果
在master节点(test10服务器)执行如下命令查看初始化结果。
具体执行如下所示。
注意:kubectl get nodes命令后面加上-o wide参数可以输出更多的信息。
重启k8s集群引起的问题
1.worker节点故障不能启动
master 节点的 ip 地址发生变化,导致 worker 节点不能启动。需要重新安装k8s集群,并确保所有节点都有固定的内网 ip 地址。
2.pod崩溃或不能正常访问
重启服务器后使用如下命令查看pod的运行状态。
发现很多 pod 不在 running 状态,此时,需要使用如下命令删除运行不正常的pod。
注意:如果pod 是使用 deployment、statefulset 等控制器创建的,k8s 将创建新的 pod 作为替代,重新启动的 pod 通常能够正常工作。
其中,pod-name表示运行在k8s中的pod的名称,pod-namespece表示命名空间。例如,需要删除pod名称为pod-test,命名空间为pod-test-namespace的pod,可以使用下面的命令。
k8s安装ingress-nginx
作为反向代理将外部流量导入集群内部,将 kubernetes 内部的 service 暴露给外部,在 ingress 对象中通过域名匹配 service,这样就可以直接通过域名访问到集群内部的服务了。相对于 traefik 来说,nginx-ingress 性能更加优秀。
注意:在master节点(test10服务器上执行)
1.创建ingress-nginx命名空间
创建ingress-nginx-namespace.yaml文件,主要的作用是创建ingress-nginx命名空间,文件内容如下所示。
执行如下命令创建ingress-nginx命名空间。
2.安装ingress controller
创建ingress-nginx-mandatory.yaml文件,主要的作用是安装ingress-nginx。文件内容如下所示。
执行如下命令安装ingress controller。
3.安装k8s svc:ingress-nginx
主要是用来用于暴露pod:nginx-ingress-controller。
创建service-nodeport.yaml文件,文件内容如下所示。
执行如下命令安装。
4.访问k8s svc:ingress-nginx
查看ingress-nginx命名空间的部署情况,如下所示。
在命令行服务器命令行输入如下命令查看ingress-nginx的端口映射情况。
具体如下所示。
所以,可以通过master节点(test10服务器)的ip地址和30080端口号来访问ingress-nginx,如下所示。
也可以在浏览器打开http://192.168.0.10:30080 来访问ingress-nginx,如下所示。
k8s安装gitlab代码仓库
gitlab是由gitlabinc.开发,使用mit许可证的基于网络的git仓库管理工具,且具有wiki和issue跟踪功能。使用git作为代码管理工具,并在此基础上搭建起来的web服务。
注意:在master节点(test10服务器上执行)
1.创建k8s-ops命名空间
创建k8s-ops-namespace.yaml文件,主要作用是创建k8s-ops命名空间。文件内容如下所示。
执行如下命令创建命名空间。
2.安装gitlab-redis
创建gitlab-redis.yaml文件,文件的内容如下所示。
首先,在命令行执行如下命令创建/data1/docker/xinsrv/redis目录。
执行如下命令安装gitlab-redis。
3.安装gitlab-postgresql
创建gitlab-postgresql.yaml,文件内容如下所示。
首先,执行如下命令创建/data1/docker/xinsrv/postgresql目录。
接下来,安装gitlab-postgresql,如下所示。
4.安装gitlab
(1)配置用户名和密码
首先,在命令行使用base64编码为用户名和密码进行转码,本示例中,使用的用户名为admin,密码为admin.1231
转码情况如下所示。
转码后的用户名为:ywrtaw4= 密码为:ywrtaw4umtizmq==
也可以对base64编码后的字符串解码,例如,对密码字符串解码,如下所示。
接下来,创建secret-gitlab.yaml文件,主要是用户来配置gitlab的用户名和密码,文件内容如下所示。
执行配置文件的内容,如下所示。
(2)安装gitlab
创建gitlab.yaml文件,文件的内容如下所示。
注意:在配置gitlab时,监听主机时,不能使用ip地址,需要使用主机名或者域名,上述配置中,我使用的是gitlab.binghe.com主机名。
在命令行执行如下命令创建/data1/docker/xinsrv/gitlab目录。
安装gitlab,如下所示。
5.安装完成
查看k8s-ops命名空间部署情况,如下所示。
也可以使用如下命令查看。
二者效果一样。
接下来,查看gitlab的端口映射,如下所示。
此时,可以看到,可以通过master节点(test10)的主机名gitlab.binghe.com和端口30088就能够访问gitlab。由于我这里使用的是虚拟机来搭建相关的环境,在本机访问虚拟机映射的gitlab.binghe.com时,需要配置本机的hosts文件,在本机的hosts文件中加入如下配置项。
注意:在windows操作系统中,hosts文件所在的目录如下。
接下来,就可以在浏览器中通过链接: 来访问gitlab了,如下所示。
此时,可以通过用户名root和密码admin.1231来登录gitlab了。
注意:这里的用户名是root而不是admin,因为root是gitlab默认的超级用户。
到此,k8s安装gitlab完成。
安装harbor私有仓库
habor是由vmware公司开源的容器镜像仓库。事实上,habor是在docker registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,ad/ldap集成以及审计日志等,足以满足基本企业需求。
注意:这里将harbor私有仓库安装在master节点(test10服务器)上,实际生产环境中建议安装在其他服务器。
1.下载harbor的离线安装版本
2.解压harbor的安装包
解压成功后,会在服务器当前目录生成一个harbor目录。
3.配置harbor
注意:这里,我将harbor的端口修改成了1180,如果不修改harbor的端口,默认的端口是80。
(1)修改harbor.yml文件
修改的配置项如下所示。
(2)修改daemon.json文件
修改/etc/docker/daemon.json文件,没有的话就创建,在/etc/docker/daemon.json文件中添加如下内容。
也可以在服务器上使用 ip addr 命令查看本机所有的ip地址段,将其配置到/etc/docker/daemon.json文件中。这里,我配置后的文件内容如下所示。
4.安装并启动harbor
配置完成后,输入如下命令即可安装并启动harbor
5.登录harbor并添加账户
安装成功后,在浏览器地址栏输入http://192.168.0.10:1180打开链接,输入用户名admin和密码binghe123,登录系统。
接下来,我们选择用户管理,添加一个管理员账户,为后续打包docker镜像和上传docker镜像做准备。
密码为binghe123。点击确,此时,账户binghe还不是管理员,此时选中binghe账户,点击“设置为管理员”。
此时,binghe账户就被设置为管理员了。到此,harbor的安装就完成了。
6.修改harbor端口
如果安装harbor后,大家需要修改harbor的端口,可以按照如下步骤修改harbor的端口,这里,我以将80端口修改为1180端口为例
(1)修改harbor.yml文件
修改的配置项如下所示。
(2)修改docker-compose.yml文件
修改的配置项如下所示。
(3)修改config.yml文件
修改的配置项如下所示。
(4)重启docker
(5)重启harbor
安装jenkins(一般的做法)
jenkins是一个开源的、提供友好操作界面的持续集成(ci)工具,起源于hudson(hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。jenkins用java语言编写,可在tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(scm)、构建工具结合使用。常用的版本控制工具有svn、git,构建工具有maven、ant、gradle。
1.安装nfs(之前安装过的话,可以省略此步)
使用 nfs 最大的问题就是写权限,可以使用 kubernetes 的 securitycontext/runasuser 指定 jenkins 容器中运行 jenkins 的用户 uid,以此来指定 nfs 目录的权限,让 jenkins 容器可写;也可以不限制,让所有用户都可以写。这里为了简单,就让所有用户可写了。
如果之前已经安装过nfs,则这一步可以省略。找一台主机,安装 nfs,这里,我以在master节点(test10服务器)上安装nfs为例。
在命令行输入如下命令安装并启动nfs。
2.创建nfs共享目录
在master节点(test10服务器)上创建 /opt/nfs/jenkins-data
目录作为nfs的共享目录,如下所示。
接下来,编辑/etc/exports文件,如下所示。
在/etc/exports文件文件中添加如下一行配置。
这里的 ip 使用 kubernetes node 节点的 ip 范围,后面的 all_squash
选项会将所有访问的用户都映射成 nfsnobody 用户,不管你是什么用户访问,最终都会压缩成 nfsnobody,所以只要将 /opt/nfs/jenkins-data
的属主改为 nfsnobody,那么无论什么用户来访问都具有写权限。
这个选项在很多机器上由于用户 uid 不规范导致启动进程的用户不同,但是同时要对一个共享目录具有写权限时很有效。
接下来,为 /opt/nfs/jenkins-data
目录授权,并重新加载nfs,如下所示。
在k8s集群中任意一个节点上使用如下命令进行验证:
如果能够看到 /opt/nfs/jenkins-data 就表示 ok 了。
具体如下所示。
3.创建pv
jenkins 其实只要加载对应的目录就可以读取之前的数据,但是由于 deployment 无法定义存储卷,因此我们只能使用 statefulset。
首先创建 pv,pv 是给 statefulset 使用的,每次 statefulset 启动都会通过 volumeclaimtemplates 这个模板去创建 pvc,因此必须得有 pv,才能供 pvc 绑定。
创建jenkins-pv.yaml文件,文件内容如下所示。
我这里给了 1t存储空间,可以根据实际配置。
执行如下命令创建pv。
4.创建serviceaccount
创建service account,因为 jenkins 后面需要能够动态创建 slave,因此它必须具备一些权限。
创建jenkins-service-account.yaml文件,文件内容如下所示。
上述配置中,创建了一个 rolebinding 和一个 serviceaccount,并且将 rolebinding 的权限绑定到这个用户上。所以,jenkins 容器必须使用这个 serviceaccount 运行才行,不然 rolebinding 的权限它将不具备。
rolebinding 的权限很容易就看懂了,因为 jenkins 需要创建和删除 slave,所以才需要上面这些权限。至于 secrets 权限,则是 https 证书。
执行如下命令创建serviceaccount。
5.安装jenkins
创建jenkins-statefulset.yaml文件,文件内容如下所示。
jenkins 部署时需要注意它的副本数,你的副本数有多少就要有多少个 pv,同样,存储会有多倍消耗。这里我只使用了一个副本,因此前面也只创建了一个 pv。
使用如下命令安装jenkins。
6.创建service
创建jenkins-service.yaml文件,主要用于后台运行jenkins,文件内容如下所示。
使用如下命令安装service。
7.安装 ingress
jenkins 的 web 界面需要从集群外访问,这里我们选择的是使用 ingress。创建jenkins-ingress.yaml文件,文件内容如下所示。
这里,需要注意的是host必须配置为域名或者主机名,否则会报错,如下所示。
the ingress "jenkins" is invalid: spec.rules[0].host: invalid value: "192.168.0.10": must be a dns name, not an ip address
使用如下命令安装ingress。
最后,由于我这里使用的是虚拟机来搭建相关的环境,在本机访问虚拟机映射的jekins.binghe.com时,需要配置本机的hosts文件,在本机的hosts文件中加入如下配置项。
注意:在windows操作系统中,hosts文件所在的目录如下。
接下来,就可以在浏览器中通过链接: 来访问jekins了。
物理机安装svn
apache subversion 通常被缩写成 svn,是一个开放源代码的版本控制系统,subversion 在 2000 年由 collabnet inc 开发,现在发展成为 apache 软件基金会的一个项目,同样是一个丰富的开发者和用户社区的一部分。
svn相对于的rcs、cvs,采用了分支管理系统,它的设计目标就是取代cvs。互联网上免费的版本控制服务多基于subversion。
这里,以在master节点(binghe101服务器)上安装svn为例。
1.使用yum安装svn
在命令行执行如下命令安装svn。
2.创建svn库
依次执行如下命令。
3.配置svn
配置authz文件,
配置后的内容如下所示。
配置passwd文件
配置后的内容如下所示。
配置 svnserve.conf
配置后的文件如下所示。
接下来,将/data/svn/conf目录下的svnserve.conf文件复制到/data/svn/test/conf/目录下。如下所示。
4.启动svn服务
(1)创建svnserve.service服务
创建svnserve.service文件
文件的内容如下所示。
接下来执行如下命令使配置生效。
命令执行成功后,修改 /etc/sysconfig/svnserve 文件。
修改后的文件内容如下所示。
(2)启动svn
首先查看svn状态,如下所示。
可以看到,此时svn并没有启动,接下来,需要启动svn。
设置svn服务开机自启动。
接下来,就可以下载安装tortoisesvn,输入链接svn://192.168.0.10/test 并输入用户名binghe,密码binghe123来连接svn了。
docker安装svn
拉取svn镜像
启动svn容器
进入svn容器内部
进入容器后,可以参照物理机安装svn的方式配置svn仓库。
物理机安装jenkins
注意:安装jenkins之前需要安装jdk和maven,我这里同样将jenkins安装在master节点(binghe101服务器)。
1.启用jenkins库
运行以下命令以下载repo文件并导入gpg密钥:
2.安装jenkins
执行如下命令安装jenkis。
接下来,修改jenkins默认端口,如下所示。
修改后的两项配置如下所示。
此时,已经将jenkins的端口由8080修改为18080
3.启动jenkins
在命令行输入如下命令启动jenkins。
配置jenkins开机自启动。
查看jenkins的运行状态。
说明,jenkins启动成功。
配置jenkins运行环境
1.登录jenkins
首次安装后,需要配置jenkins的运行环境。首先,在浏览器地址栏访问链接http://192.168.0.10:18080,打开jenkins界面。
根据提示使用如下命令到服务器上找密码值,如下所示。
将密码71af861c2ab948a1b6efc9f7dde90776复制到文本框,点击继续。会跳转到自定义jenkins页面,如下所示。
这里,可以直接选择“安装推荐的插件”。之后会跳转到一个安装插件的页面,如下所示。
此步骤可能有下载失败的情况,可直接忽略。
2.安装插件
需要安装的插件
- kubernetes cli plugin:该插件可直接在jenkins中使用kubernetes命令行进行操作。
- kubernetes plugin: 使用kubernetes则需要安装该插件kubernetes
- continuous deploy plugin:kubernetes部署插件,可根据需要使用
还有更多的插件可供选择,可点击 系统管理->管理插件进行管理和添加,安装相应的docker插件、ssh插件、maven插件。其他的插件可以根据需要进行安装。如下图所示。
3.配置jenkins
(1)配置jdk和maven
在global tool configuration中配置jdk和maven,如下所示,打开global tool configuration界面。
接下来就开始配置jdk和maven了。
由于我在服务器上将maven安装在/usr/local/maven-3.6.3目录下,所以,需要在“maven 配置”中进行配置,如下图所示。
接下来,配置jdk,如下所示。
注意:不要勾选“install automatically”
接下来,配置maven,如下所示。
注意:不要勾选“install automatically”
(2)配置ssh
进入jenkins的configure system界面配置ssh,如下所示。
找到 ssh remote hosts 进行配置。
配置完成后,点击check connection按钮,会显示 successfull connection。如下所示。
至此,jenkins的基本配置就完成了。
jenkins发布docker项目到k8s集群
1.调整springboot项目的配置
实现,springboot项目中启动类所在的模块的pom.xml需要引入打包成docker镜像的配置,如下所示。
接下来,在springboot启动类所在模块的根目录创建dockerfile,内容示例如下所示。
根据实际情况,自行修改。
注意:from 192.168.0.10:1180/library/java:8的前提是执行如下命令。
在springboot启动类所在模块的根目录创建yaml文件,录入叫做test.yaml文件,内容如下所示。
2.jenkins配置发布项目
将项目上传到svn代码库,例如地址为svn://192.168.0.10/test
接下来,在jenkins中配置自动发布。步骤如下所示。
点击新建item。
在描述文本框中输入描述信息,如下所示。
接下来,配置svn信息。
注意:配置gitlab的步骤与svn相同,不再赘述。
定位到jenkins的“构建模块”,使用execute shell来构建发布项目到k8s集群。
执行的命令依次如下所示。
到此这篇关于基于docker+k8s+gitlab/svn+jenkins+harbor搭建持续集成交付环境(环境搭建篇)的文章就介绍到这了,更多相关docker k8s持续集成交付环境内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!