
「SpringCloud」Docker+k8s打包部署——集群环境部署
作者 AI全栈程序猿
来源 | 今日头条
一、集群环境规划配置
生产环境不要使用一主多从,要使用多主多从。这里使用三台主机进行测试一台Master(172.16.20.111),两台Node(172.16.20.112和172.16.20.113)
1、设置主机名
CentOS7安装完成之后,设置固定ip,三台主机做相同设置
三台主机ip分别设置好之后,修改hosts文件,设置主机名
2、时间同步
开启chronyd服务
设置开机启动
测试
3、禁用firewalld和iptables(测试环境)
4、禁用selinux
5、禁用swap分区
注释掉 /dev/mapper/centos-swap swap
6、修改linux的内核参数
7、配置ipvs
安装ipset和ipvsadm
添加需要加载的模块(整个执行)
添加执行权限
执行脚本
查看是否加载成功
以上完成设置之后,一定要执行重启使配置生效
二、Docker环境安装配置
1、安装依赖
docker依赖于系统的一些必要的工具:
2、添加软件源
3、安装docker-ce
4、启动服务
5、查看安装版本
启动服务使用docker version查看一下当前的版本:
6、 配置镜像加速
通过修改daemon配置文件/etc/docker/daemon.json加速,如果使用k8s,这里一定要设置 "exec-opts": ["native.cgroupdriver=systemd"]。 "insecure-registries" : ["172.16.20.175"]配置是可以通过http从我们的harbor上拉取数据。
7、安装docker-compose
如果网速太慢,可以直接到
https://github.com/docker/compose/releases 选择对应的版本进行下载,然后上传到服务器/usr/local/bin/目录。
注意:(非必须设置)开启Docker远程访问 (这里不是必须开启的,生产环境不要开启,开启之后,可以在开发环境直连docker)
修改ExecStart,添加 -H tcp://0.0.0.0:2375
修改后执行以下命令:
测试是否能够连得上:
三、Harbor私有镜像仓库安装配置(重新设置一台服务器172.16.20.175,不要放在K8S的主从服务器上)
首先需要按照前面的步骤,在环境上安装Docker,才能安装Harbor。
1、选择合适的版本进行下载,下载地址:
https://github.com/goharbor/harbor/releases
2、解压
3、配置
4、将hostname改为当前服务器地址,注释掉https配置。
5、执行安装命令
6、查看安装是否成功
7、harbor的启动停止命令
8、访问harbor管理台地址,上面配置的hostname,http://172.16.20.175(默认用户名/密码: admin/Harbor12345):
三、Kubernetes安装配置
1、切换镜像源
2、安装kubeadm、kubelet和kubectl
3、配置kubelet的cgroup
4、启动kubelet并设置开机启动
5、初始化k8s集群(只在Master执行)
初始化
创建必要文件
6、加入集群(只在Node节点执行)
在Node节点(172.16.20.112和172.16.20.113)运行上一步初始化成功后显示的加入集群命令
在Master查看集群状态
7、安装网络插件(只在Master执行)
镜像加速:修改kube-flannel.yml文件,将
quay.io/coreos/flannel:v0.15.0 改为 quay.mirrors.ustc.edu.cn/coreos/flannel:v0.15.0 执行安装
再次查看集群状态,(需要等待一段时间大概1-2分钟)发现STATUS都是Ready。
8、集群测试
使用kubectl安装部署nginx服务
查看服务
服务显示service/nginx的PORT(S)为80:32605/TCP, 我们在浏览器中访问主从地址的32605端口,查看nginx是否运行
http://172.16.20.111:32605/ http://172.16.20.112:32605/ http://172.16.20.113:32605/ 成功后显示如下界面:
9、安装Kubernetes管理界面Dashboard
Kubernetes可以通过命令行工具kubectl完成所需要的操作,同时也提供了方便操作的管理控制界面,用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。
1、下载安装配置文件recommended.yaml ,注意在https://github.com/kubernetes/dashboard/releases查看Kubernetes 和 Kubernetes Dashboard的版本对应关系。
2、修改配置信息,在service下添加 type: NodePort和nodePort: 30010
注释掉以下信息,否则不能安装到master服务器
新增nodeName: master,安装到master服务器
3、执行安装部署命令
4、查看运行状态命令,可以看到service/kubernetes-dashboard 已运行,访问端口为30010
5、创建访问Kubernetes Dashboard的账号
6、查询访问Kubernetes Dashboard的token
7、在页面访问Kubernetes Dashboard,注意一定要使用https,https://172.16.20.111:30010 ,输入token登录成功后就进入了后台管理界面,原先命令行的操作就可以在管理界面进操作了
四、GitLab安装配置
GitLab是可以部署在本地环境的Git项目仓库,这里介绍如何安装使用,在开发过程中我们将代码上传到本地仓库,然后Jenkins从仓库中拉取代码打包部署。
1、下载需要的安装包,下载地址
https://packages.gitlab.com/gitlab/gitlab-ce/ ,我们这里下载最新版gitlab-ce-14.4.1-ce.0.el7.x86_64.rpm,当然在项目开发中需要根据自己的需求选择稳定版本
2、点击需要安装的版本,会提示安装命令,按照上面提示的命令进行安装即可
3、配置并启动Gitlab
4、查看Gitlab状态
5、设置初始登录密码
5、浏览器访问服务器地址,默认是80端口,所以直接访问即可,在登录界面输入我们上面设置的密码root/root1234。
6、设置界面为中文
User Settings ----> Preferences ----> Language ----> 简体中文 ----> 刷新界面
7、Gitlab常用命令
五、使用Docker安装配置Jenkins+Sonar(代码质量检查)
实际项目应用开发过程中,单独为SpringCloud工程部署一台运维服务器,不要安装在Kubernetes服务器上,同样按照上面的步骤安装docker和docker-compose,然后使用docker-compose构建Jenkins和Sonar。
1、创建宿主机挂载目录并赋权
2、新建Jenkins+Sonar安装脚本jenkins-compose.yml脚本,这里的Jenkins使用的是Docker官方推荐的镜像jenkinsci/blueocean,在实际使用中发现,即使不修改插件下载地址,也可以下载插件,所以比较推荐这个镜像。
3、在jenkins-compose.yml文件所在目录下执行安装启动命令
安装成功后,展示以下信息
4、查看服务的启动情况
我们发现 jenkins端口映射到了18081 ,但是sonarqube没有启动,查看日志发现sonarqube文件夹没有权限访问,日志上显示容器目录的权限不够,但实际是宿主机的权限不够,这里需要给宿主机赋予权限
执行重启命令
再次使用命令查看服务启动情况,就可以看到jenkins映射到18081,sonarqube映射到19000端口,我们在浏览器就可以访问jenkins和sonarqube的后台界面了
5、Jenkins登录初始化 从Jenkins的登录界面提示可以知道,默认密码路径为
/var/jenkins_home/secrets/initialAdminPassword,这里显示的事Docker容器内部的路径,实际对应我们上面服务器设置的路径为/data/docker/ci/jenkins/home/secrets/initialAdminPassword ,我们打开这个文件并输入密码就可以进入Jenkins管理界面
6、选择安装推荐插件,安装完成之后,根据提示进行下一步操作,直到进入管理后台界面
备注:
- sonarqube默认用户名密码: admin/admin
- 卸载命令:docker-compose -f jenkins-compose.yml down -v
六、Jenkins自动打包部署配置
项目部署有多种方式,从最原始的可运行jar包直接部署到JDK环境下运行,到将可运行的jar包放到docker容器中运行,再到现在比较流行的把可运行的jar包和docker放到k8s的pod环境中运行。每一种新的部署方式都是对原有部署方式的改进和优化,这里不着重介绍每种方式的优缺点,只简单说明一下使用Kubernetes 的原因:Kubernetes 主要提供弹性伸缩、服务发现、自我修复,版本回退、负载均衡、存储编排等功能。 日常开发部署过程中的基本步骤如下:
- 提交代码到gitlab代码仓库
- gitlab通过webhook触发Jenkins构建代码质量检查
- Jenkins需通过手动触发,来拉取代码、编译、打包、构建Docker镜像、发布到私有镜像仓库Harbor、执行kubectl命令从Harbor拉取Docker镜像部署至k8s
1、安装Kubernetes plugin插件、Git Parameter插件(用于流水线参数化构建)、 Extended Choice Parameter 插件(用于多个微服务时,选择需要构建的微服务)、 Pipeline Utility Steps插件(用于读取maven工程的.yaml、pom.xml等)和 Kubernetes Continuous Deploy(一定要使用1.0版本,从官网下载然后上传) ,Jenkins --> 系统管理 --> 插件管理 --> 可选插件 --> Kubernetes plugin /Git Parameter/Extended Choice Parameter ,选中后点击Install without restart按钮进行安装
Blueocean目前还不支持Git Parameter插件和Extended Choice Parameter插件,Git Parameter是通过Git Plugin读取分支信息,我们这里使用Pipeline script而不是使用Pipeline script from SCM,是因为我们不希望把构建信息放到代码里,这样做可以开发和部署分离。
2、配置Kubernetes plugin插件,Jenkins --> 系统管理 --> 节点管理 --> Configure Clouds --> Add a new cloud -> Kubernetes
3、增加kubernetes证书
系统管理-->凭据-->系统-->全局凭据
4、添加访问Kubernetes的凭据信息,这里填入上面登录Kubernetes Dashboard所创建的token即可,添加完成之后选择刚刚添加的凭据,然后点击连接测试,如果提示连接成功,那么说明我们的Jenkins可以连接Kubernetes了
5、jenkins全局配置jdk、git和maven jenkinsci/blueocean镜像默认安装了jdk和git,这里需要登录容器找到路径,然后配置进去。 通过命令进入jenkins容器,并查看JAVA_HOEM和git路径
通过命令查询可知,JAVA_HOME=/opt/java/openjdk GIT= /usr/bin/git , 在Jenkins全局工具配置中配置
Maven可以在宿主机映射的
/data/docker/ci/jenkins/home中安装,然后配置时,配置容器路径为/var/jenkins_home下的Maven安装路径
在系统配置中设置MAVEN_HOME供Pipeline script调用,如果执行脚本时提示没有权限,那么在宿主Maven目录的bin目录下执行chmod 777 *
6、为k8s新建harbor-key,用于k8s拉取私服镜像,配置在代码的k8s-deployment.yml中使用。
7、新建pipeline流水线任务
8、配置流水线任务参数
9、配置pipeline发布脚本 在流水线下面选择Pipeline script
常见问题:
1、Pipeline Utility Steps 第一次执行会报错Scripts not permitted to use method或者Scripts not permitted to use staticMethod
org.codehaus.groovy.runtime.DefaultGroovyMethods getProperties java.lang.Object 解决:系统管理-->In-process Script Approval->点击 Approval
2、通过NFS服务将所有容器的日志统一存放在NFS的服务端 3、Kubernetes Continuous Deploy,使用1.0.0版本,否则报错,不兼容 4、解决docker注册到内网问题
5、配置ipvs模式,kube-proxy监控Pod的变化并创建相应的ipvs规则。ipvs相对iptables转发效率更高。除此以外,ipvs支持更多的LB算法。
修改mode: "ipvs"
重新加载kube-proxy配置文件
查看ipvs规则
6、k8s集群内部访问外部服务,nacos,redis等
a、内外互通模式,在部署的服务设置hostNetwork: true
b、Endpoints模式
c、service的type: ExternalName模式,“ExternalName” 使用 CNAME 重定向,因此无法执行端口重映射,域名使用
以上外部新建yaml,不要用内部的,这些需要在环境设置时配置好。
源码地址:
Gitee: GitEgg: GitEgg 是一款开源免费的企业级微服务应用开发框架,旨在整合目前主流稳定的开源技术框架,集成常用的最佳项目解决方案,实现可直接使用的微服务快速开发框架。
GitHub: https://github.com/wmz1930/GitEgg
