SpringCloud微服务实战教你如何搭建企业级开发框架
一、集群环境规划配置
生产环境不要使用一主多从,要使用多主多从。这里使用三台主机进行测试一台Master(172。16。20。111),两台Node(172。16。20。112和172。16。20。113)1、设置主机名
CentOS7安装完成之后,设置固定ip,三台主机做相同设置vietcsysconfignetworkscriptsifcfgens33在最下面ONBOOT改为yes,新增固定地址IPADDR,172。16。20。111,172。16。20。112,172。16。20。113ONBOOTyesIPADDR172。16。20。111
三台主机ip分别设置好之后,修改hosts文件,设置主机名master机器上执行hostnamectlsethostnamemasternode1机器上执行hostnamectlsethostnamenode1node2机器上执行hostnamectlsethostnamenode2vietchosts172。16。20。111master172。16。20。112node1172。16。20。113node22、时间同步
开启chronyd服务systemctlstartchronyd
设置开机启动systemctlenablechronyd
测试date3、禁用firewalld和iptables(测试环境)systemctlstopfirewalldsystemctldisablefirewalldsystemctlstopiptablessystemctldisableiptables4、禁用selinuxvietcselinuxconfigSELINUXdisabled5、禁用swap分区
注释掉devmappercentosswapswapvietcfstab注释掉devmappercentosswapswap6、修改linux的内核参数vietcsysctl。dkubernetes。confnet。bridge。bridgenfcallip6tables1net。bridge。bridgenfcalliptables1net。ipv4。ipforward1重新加载配置sysctlp加载网桥过滤模块modprobebrnetfilter查看网桥过滤模块lsmodgrepbrnetfilter7、配置ipvs
安装ipset和ipvsadmyuminstallipsetipvsadmy
添加需要加载的模块(整个执行)catEOFetcsysconfigmodulesipvs。modules!binbashmodprobeipvsmodprobeipvsrrmodprobeipvswrrmodprobeipvsshmodprobenfconntrackipv4EOF
添加执行权限chmodxetcsysconfigmodulesipvs。modules
执行脚本binbashetcsysconfigmodulesipvs。modules
查看是否加载成功lsmodgrepeipvsenfconntrackipv4
以上完成设置之后,一定要执行重启使配置生效reboot二、Docker环境安装配置1、安装依赖
docker依赖于系统的一些必要的工具:yuminstallyyumutilsdevicemapperpersistentdatalvm22、添加软件源yumconfigmanageraddrepohttp:mirrors。aliyun。comdockercelinuxcentosdockerce。repoyumcleanallyummakecachefast3、安装dockerce查看可以安装的docker版本yumlistdockerceshowduplicates选择安装需要的版本,直接安装最新版,可以执行yumyinstalldockerceyuminstallsetoptobsoletes0dockerce19。03。133。el7y4、启动服务通过systemctl启动服务systemctlstartdocker通过systemctl设置开机启动systemctlenabledocker5、查看安装版本
启动服务使用dockerversion查看一下当前的版本:dockerversion6、配置镜像加速
通过修改daemon配置文件etcdockerdaemon。json加速,如果使用k8s,这里一定要设置execopts:〔native。cgroupdriversystemd〕。insecureregistries:〔172。16。20。175〕配置是可以通过http从我们的harbor上拉取数据。vietcdockerdaemon。json{execopts:〔native。cgroupdriversystemd〕,logdriver:jsonfile,logopts:{maxsize:100m},registrymirrors:〔https:eiov0s1n。mirror。aliyuncs。com〕,insecureregistries:〔172。16。20。175〕}sudosystemctldaemonreloadsudosystemctlrestartdocker7、安装dockercompose
如果网速太慢,可以直接到https:github。comdockercomposereleases选择对应的版本进行下载,然后上传到服务器usrlocalbin目录。sudocurlLhttps:github。comdockercomposereleasesdownloadv2。0。1dockercompose(unames)(unamem)ousrlocalbindockercomposesudochmodxusrlocalbindockercompose注意:(非必须设置)开启Docker远程访问(这里不是必须开启的,生产环境不要开启,开启之后,可以在开发环境直连docker)vilibsystemdsystemdocker。service
修改ExecStart,添加Htcp:0。0。0。0:2375
ExecStartusrbindockerdHfd:Htcp:0。0。0。0:2375containerdruncontainerdcontainerd。sock
修改后执行以下命令:systemctldaemonreloadservicedockerrestart
测试是否能够连得上:curlhttp:localhost:2375version
三、Harbor私有镜像仓库安装配置(重新设置一台服务器172。16。20。175,不要放在K8S的主从服务器上)
首先需要按照前面的步骤,在环境上安装Docker,才能安装Harbor。1、选择合适的版本进行下载,下载地址:
https:github。comgoharborharborreleases2、解压tarzxfharborofflineinstallerv2。2。4。tgz3、配置cdharbormvharbor。yml。tmplharbor。ymlviharbor。yml4、将hostname改为当前服务器地址,注释掉https配置。。。。。。。TheIPaddressorhostnametoaccessadminUIandregistryservice。DONOTuselocalhostor127。0。0。1,becauseHarborneedstobeaccessedbyexternalclients。hostname:172。16。20。175httprelatedconfighttp:portforhttp,defaultis80。Ifhttpsenabled,thisportwillredirecttohttpsportport:80httpsrelatedconfighttps:httpsportforharbor,defaultis443port:443Thepathofcertandkeyfilesfornginxcertificate:yourcertificatepathprivatekey:yourprivatekeypath。。。。。。5、执行安装命令mkdirvarlogharbor。install。sh6、查看安装是否成功〔rootlocalhostharbor〕dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESde1b702759e7goharborharborjobservice:v2。2。4harborentrypoint。13secondsagoUp9seconds(health:starting)harborjobservice55b465d07157goharbornginxphoton:v2。2。4nginxgdaemonof13secondsagoUp9seconds(health:starting)0。0。0。0:808080tcp,:::808080tcpnginxd52f5557fa73goharborharborcore:v2。2。4harborentrypoint。13secondsagoUp10seconds(health:starting)harborcore4ba09aded494goharborharbordb:v2。2。4dockerentrypoint。13secondsagoUp11seconds(health:starting)harbordb647f6f46e029goharborharborportal:v2。2。4nginxgdaemonof13secondsagoUp11seconds(health:starting)harborportal70251c4e234fgoharborredisphoton:v2。2。4redisserveretcr13secondsagoUp11seconds(health:starting)redis21a5c408afffgoharborharborregistryctl:v2。2。4homeharborstart。13secondsagoUp11seconds(health:starting)registryctlb0937800f88bgoharborregistryphoton:v2。2。4homeharborentryp13secondsagoUp11seconds(health:starting)registryd899e377e02bgoharborharborlog:v2。2。4binshcusrloc13secondsagoUp12seconds(health:starting)127。0。0。1:151410514tcpharborlog7、harbor的启动停止命令dockercomposedown停止dockercomposeupd启动8、访问harbor管理台地址,上面配置的hostname,http:172。16。20。175(默认用户名密码:adminHarbor12345):四、Kubernetes安装配置1、切换镜像源catEOFetcyum。repos。dkubernetes。repo〔kubernetes〕nameKubernetesbaseurlhttps:mirrors。aliyun。comkubernetesyumreposkubernetesel7x8664enabled1gpgcheck1repogpgcheck1gpgkeyhttps:mirrors。aliyun。comkubernetesyumdocyumkey。gpghttps:mirrors。aliyun。comkubernetesyumdocrpmpackagekey。gpgEOF2、安装kubeadm、kubelet和kubectlyuminstallykubeletkubeadmkubectl3、配置kubelet的cgroupvietcsysconfigkubeletKUBELETCGROUPARGScgroupdriversystemdKUBEPROXYMODEipvs4、启动kubelet并设置开机启动systemctlstartkubeletsystemctlenablekubelet5、初始化k8s集群(只在Master执行)
初始化kubeadminitkubernetesversionv1。22。3apiserveradvertiseaddress172。16。20。111imagerepositoryregistry。aliyuncs。comgooglecontainersservicecidr10。20。0。016podnetworkcidr10。222。0。016
创建必要文件mkdirpHOME。kubesudocpietckubernetesadmin。confHOME。kubeconfigsudochown(idu):(idg)HOME。kubeconfig6、加入集群(只在Node节点执行)
在Node节点(172。16。20。112和172。16。20。113)运行上一步初始化成功后显示的加入集群命令kubeadmjoin172。16。20。111:6443tokenfgf380。einr7if1eb838mpediscoverytokencacerthashsha256:fa5a6a2ff8996b09effbf599aac70505b49f35c5bca610d6b5511886383878f7
在Master查看集群状态〔rootmaster〕kubectlgetnodesNAMESTATUSROLESAGEVERSIONmasterNotReadycontrolplane,master2m54sv1。22。3node1NotReadynone68sv1。22。3node2NotReadynone30sv1。22。37、安装网络插件(只在Master执行)wgethttps:raw。githubusercontent。comcoreosflannelmasterDocumentationkubeflannel。yml
镜像加速:修改kubeflannel。yml文件,将quay。iocoreosflannel:v0。15。0改为quay。mirrors。ustc。edu。cncoreosflannel:v0。15。0
执行安装kubectlapplyfkubeflannel。yml
再次查看集群状态,(需要等待一段时间大概12分钟)发现STATUS都是Ready。〔rootmaster〕kubectlgetnodesNAMESTATUSROLESAGEVERSIONmasterReadycontrolplane,master42mv1。22。3node1Readynone40mv1。22。3node2Readynone39mv1。22。38、集群测试
使用kubectl安装部署nginx服务kubectlcreatedeploymentnginximagenginxreplicas1kubectlexposedeploynginxport80targetport80typeNodePort
查看服务〔rootmaster〕kubectlgetpod,svcNAMEREADYSTATUSRESTARTSAGEpodnginx6799fc88d8z5tm811Running026sNAMETYPECLUSTERIPEXTERNALIPPORT(S)AGEservicekubernetesClusterIP10。20。0。1none443TCP68mservicenginxNodePort10。20。17。199none80:32605TCP9s
服务显示servicenginx的PORT(S)为80:32605TCP,我们在浏览器中访问主从地址的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完成所需要的操作,同时也提供了方便操作的管理控制界面,用户可以用KubernetesDashboard部署容器化的应用、监控应用的状态、执行故障排查任务以及管理Kubernetes各种资源。1、下载安装配置文件recommended。yaml,注意在https:github。comkubernetesdashboardreleases查看Kubernetes和KubernetesDashboard的版本对应关系。
执行下载wgethttps:raw。githubusercontent。comkubernetesdashboardv2。4。0aiodeployrecommended。yaml2、修改配置信息,在service下添加type:NodePort和nodePort:30010virecommended。yaml。。。。。。kind:ServiceapiVersion:v1metadata:labels:k8sapp:kubernetesdashboardname:kubernetesdashboardnamespace:kubernetesdashboardspec:新增nodeName:Master新增type:NodePortports:port:443targetPort:8443新增nodePort:30010。。。。。。
注释掉以下信息,否则不能安装到master服务器CommentthefollowingtolerationsifDashboardmustnotbedeployedonmastertolerations:key:noderole。kubernetes。iomastereffect:NoSchedule
新增nodeName:master,安装到master服务器。。。。。。kind:DeploymentapiVersion:appsv1metadata:labels:k8sapp:kubernetesdashboardname:kubernetesdashboardnamespace:kubernetesdashboardspec:replicas:1revisionHistoryLimit:10selector:matchLabels:k8sapp:kubernetesdashboardtemplate:metadata:labels:k8sapp:kubernetesdashboardspec:nodeName:mastercontainers:name:kubernetesdashboardimage:kubernetesuidashboard:v2。4。0imagePullPolicy:Always。。。。。。3、执行安装部署命令kubectlapplyfrecommended。yaml4、查看运行状态命令,可以看到servicekubernetesdashboard已运行,访问端口为30010〔rootmaster〕kubectlgetpod,svcnkubernetesdashboardNAMEREADYSTATUSRESTARTSAGEpoddashboardmetricsscraperc45b7869d6k87n01ContainerCreating010spodkubernetesdashboard576cb95f94zfvc901ContainerCreating010sNAMETYPECLUSTERIPEXTERNALIPPORT(S)AGEservicedashboardmetricsscraperClusterIP10。20。222。83none8000TCP10sservicekubernetesdashboardNodePort10。20。201。182none443:30010TCP10s5、创建访问KubernetesDashboard的账号kubectlcreateserviceaccountdashboardadminnkubernetesdashboardkubectlcreateclusterrolebindingdashboardadminrbclusterroleclusteradminserviceaccountkubernetesdashboard:dashboardadmin6、查询访问KubernetesDashboard的token〔rootmaster〕kubectlgetsecretsnkubernetesdashboardgrepdashboardadmindashboardadmintoken84gg6kubernetes。ioserviceaccounttoken364s〔rootmaster〕kubectldescribesecretsdashboardadmintoken84gg6nkubernetesdashboardName:dashboardadmintoken84gg6Namespace:kubernetesdashboardLabels:noneAnnotations:kubernetes。ioserviceaccount。name:dashboardadminkubernetes。ioserviceaccount。uid:2d93a5896b0b4ed6adc39a2eeb5d1311Type:kubernetes。ioserviceaccounttokenDataca。crt:1099bytesnamespace:20bytestoken:eyJhbGciOiJSUzI1NiIsImtpZCI6ImRmbVVfRy15QzdfUUF4ZmFuREZMc3dvd0IxQ3ItZm5SdHVZRVhXV3JpZGcifQ。eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tODRnZzYiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMmQ5M2E1ODktNmIwYi00ZWQ2LWFkYzMtOWEyZWViNWQxMzExIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9。xsDBLeZdn7IO0Btpb4LlCD1RQ2VYsXXPabir91VXIqRrL1BewYAyFfZtxU8peU8KebaJiRIaUeF813x6WbGG9QKynL1fTARN5XoHarkBTVlcjHQ5GBziLDEKU255veVqORF7J5XtB38Ke2n2pi8tnnUUSbIJpMTF1shV0aLlqUzt3PauPmDshtoerz4iafWK0u9oWBASQDPPoE8IWYU1KmSkUNtoGzf0c9vpdlUw4j0UZE4zSoMFXkrfQDLD32LrG56Wgpr6E8SeipKRfgXvx7ExD54b8Lq9DyAltrnQVvRicIEiQGdbeCu9dwzGyhgcDucULTx7TUgA7、在页面访问KubernetesDashboard,注意一定要使用https,https:172。16。20。111:30010,输入token登录成功后就进入了后台管理界面,原先命令行的操作就可以在管理界面进操作了
五、GitLab安装配置
GitLab是可以部署在本地环境的Git项目仓库,这里介绍如何安装使用,在开发过程中我们将代码上传到本地仓库,然后Jenkins从仓库中拉取代码打包部署。
1、下载需要的安装包,下载地址https:packages。gitlab。comgitlabgitlabce,我们这里下载最新版gitlabce14。4。1ce。0。el7。x8664。rpm,当然在项目开发中需要根据自己的需求选择稳定版本
2、点击需要安装的版本,会提示安装命令,按照上面提示的命令进行安装即可curlshttps:packages。gitlab。cominstallrepositoriesgitlabgitlabcescript。rpm。shsudobashsudoyuminstallgitlabce14。4。1ce。0。el7。x8664
3、配置并启动Gitlabgitlabctlreconfigure
4、查看Gitlab状态gitlabctlstatus
5、设置初始登录密码cdoptgitlabbinsudo。gitlabrailsconsole进入控制台之后执行uUser。where(id:1)。firstu。passwordroot1234u。passwordconfirmationroot1234u。save!quit
5、浏览器访问服务器地址,默认是80端口,所以直接访问即可,在登录界面输入我们上面设置的密码rootroot1234。
6、设置界面为中文
UserSettingsPreferencesLanguage简体中文刷新界面
7、Gitlab常用命令gitlabctlstopgitlabctlstartgitlabctlrestart
六、使用Docker安装配置JenkinsSonar(代码质量检查)
实际项目应用开发过程中,单独为SpringCloud工程部署一台运维服务器,不要安装在Kubernetes服务器上,同样按照上面的步骤安装docker和dockercompose,然后使用dockercompose构建Jenkins和Sonar。
1、创建宿主机挂载目录并赋权mkdirpdatadockercinexusdatadockercijenkinslibdatadockercijenkinshomedatadockercisonarqubedatadockercipostgresqlchmodR777datadockercinexusdatadockercijenkinslibdatadockercijenkinshomedatadockercisonarqubedatadockercipostgresql
2、新建JenkinsSonar安装脚本jenkinscompose。yml脚本,这里的Jenkins使用的是Docker官方推荐的镜像jenkinsciblueocean,在实际使用中发现,即使不修改插件下载地址,也可以下载插件,所以比较推荐这个镜像。version:3networks:prodnetwork:driver:bridgeservices:sonardb:image:postgres:12。2restart:alwaysports:5433:5432networks:prodnetworkvolumes:datadockercipostgresql:varlibpostgresqlenvironment:POSTGRESUSERsonarPOSTGRESPASSWORDsonarsonar:image:sonarqube:8。2communityrestart:alwaysports:19000:900019092:9092networks:prodnetworkdependson:sonardbvolumes:datadockercisonarqubeconf:optsonarqubeconfdatadockercisonarqubedata:optsonarqubedatadatadockercisonarqubelogs:optsonarqubelogsdatadockercisonarqubeextension:optsonarqubeextensionsdatadockercisonarqubebundledplugins:optsonarqubelibbundledpluginsenvironment:TZAsiaShanghaiSONARQUBEJDBCURLjdbc:postgresql:sonardb:5432sonarSONARQUBEJDBCUSERNAMEsonarSONARQUBEJDBCPASSWORDsonarnexus:image:sonatypenexus3restart:alwaysports:18081:8081networks:prodnetworkvolumes:datadockercinexus:nexusdatajenkins:image:jenkinsciblueoceanuser:rootrestart:alwaysports:18080:8080networks:prodnetworkvolumes:varrundocker。sock:varrundocker。socketclocaltime:etclocaltime:roHOME。ssh:root。sshdatadockercijenkinslib:varlibjenkinsusrbindocker:usrbindockerdatadockercijenkinshome:varjenkinshomedependson:nexussonarenvironment:NEXUSPORT8081SONARPORT9000SONARDBPORT5432capadd:ALL
3、在jenkinscompose。yml文件所在目录下执行安装启动命令dockercomposefjenkinscompose。ymlupd
安装成功后,展示以下信息〔〕Running55NetworkrootprodnetworkCreated0。0sContainerrootsonardb1Started1。0sContainerrootnexus1Started1。0sContainerrootsonar1Started2。1sContainerrootjenkins1Started4。2s
4、查看服务的启动情况〔rootlocalhost〕dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES52779025a83ejenkinsjenkins:ltssbintiniusr4minutesagoUp3minutes50000tcp,0。0。0。0:180808080tcp,:::180808080tcprootjenkins12f5fbc25de58sonarqube:8。2community。binrun。sh4minutesagoRestarting(0)21secondsagorootsonar14248a8ba71d8sonatypenexus3shc{SONATYPEDI4minutesagoUp4minutes0。0。0。0:180818081tcp,:::180818081tcprootnexus1719623c4206bpostgres:12。2dockerentrypoint。s4minutesagoUp4minutes0。0。0。0:54335432tcp,:::54335432tcprootsonardb12b6852a57cc2goharborharborjobservice:v2。2。4harborentrypoint。5daysagoUp29seconds(health:starting)harborjobserviceebf2dea994fbgoharbornginxphoton:v2。2。4nginxgdaemonof5daysagoRestarting(1)46secondsagonginxadfaa287f23bgoharborharborregistryctl:v2。2。4homeharborstart。5daysagoUp7minutes(healthy)registryctl8e5bcca3aaa1goharborharbordb:v2。2。4dockerentrypoint。5daysagoUp7minutes(healthy)harbordbebe845e020dcgoharborharborportal:v2。2。4nginxgdaemonof5daysagoUp7minutes(healthy)harborportal68263dea2cfcgoharborharborlog:v2。2。4binshcusrloc5daysagoUp7minutes(healthy)127。0。0。1:151410514tcpharborlog
我们发现jenkins端口映射到了18081,但是sonarqube没有启动,查看日志发现sonarqube文件夹没有权限访问,日志上显示容器目录的权限不够,但实际是宿主机的权限不够,这里需要给宿主机赋予权限chmod777datadockercisonarqubelogschmod777datadockercisonarqubebundledpluginschmod777datadockercisonarqubeconfchmod777datadockercisonarqubedatachmod777datadockercisonarqubeextension
执行重启命令dockercomposefjenkinscompose。ymlrestart
再次使用命令查看服务启动情况,就可以看到jenkins映射到18081,sonarqube映射到19000端口,我们在浏览器就可以访问jenkins和sonarqube的后台界面了
5、Jenkins登录初始化
从Jenkins的登录界面提示可以知道,默认密码路径为varjenkinshomesecretsinitialAdminPassword,这里显示的事Docker容器内部的路径,实际对应我们上面服务器设置的路径为datadockercijenkinshomesecretsinitialAdminPassword,我们打开这个文件并输入密码就可以进入Jenkins管理界面
6、选择安装推荐插件,安装完成之后,根据提示进行下一步操作,直到进入管理后台界面
备注:sonarqube默认用户名密码:adminadmin卸载命令:dockercomposefjenkinscompose。ymldownv
七、Jenkins自动打包部署配置
项目部署有多种方式,从最原始的可运行jar包直接部署到JDK环境下运行,到将可运行的jar包放到docker容器中运行,再到现在比较流行的把可运行的jar包和docker放到k8s的pod环境中运行。每一种新的部署方式都是对原有部署方式的改进和优化,这里不着重介绍每种方式的优缺点,只简单说明一下使用Kubernetes的原因:Kubernetes主要提供弹性伸缩、服务发现、自我修复,版本回退、负载均衡、存储编排等功能。
日常开发部署过程中的基本步骤如下:提交代码到gitlab代码仓库gitlab通过webhook触发Jenkins构建代码质量检查Jenkins需通过手动触发,来拉取代码、编译、打包、构建Docker镜像、发布到私有镜像仓库Harbor、执行kubectl命令从Harbor拉取Docker镜像部署至k8s
1、安装Kubernetesplugin插件、GitParameter插件(用于流水线参数化构建)、
ExtendedChoiceParameter
插件(用于多个微服务时,选择需要构建的微服务)、PipelineUtilitySteps插件(用于读取maven工程的。yaml、pom。xml等)和KubernetesContinuousDeploy(一定要使用1。0版本,从官网下载然后上传),Jenkins系统管理插件管理可选插件KubernetespluginGitParameterExtendedChoiceParameter,选中后点击Installwithoutrestart按钮进行安装
Blueocean目前还不支持GitParameter插件和ExtendedChoiceParameter插件,GitParameter是通过GitPlugin读取分支信息,我们这里使用Pipelinescript而不是使用PipelinescriptfromSCM,是因为我们不希望把构建信息放到代码里,这样做可以开发和部署分离。
2、配置Kubernetesplugin插件,Jenkins系统管理节点管理ConfigureCloudsAddanewcloudKubernetes
3、增加kubernetes证书cat。kubeconfig以下步骤暂不使用,将certificateauthoritydata、clientcertificatedata、clientkeydata替换为。kubeconfig里面具体的值echocertificateauthoritydatabase64dca。crtechoclientcertificatedatabase64dclient。crtechoclientkeydatabase64dclient。key执行以下命令,自己设置密码opensslpkcs12exportoutcert。pfxinkeyclient。keyinclient。crtcertfileca。crt
系统管理凭据系统全局凭据
4、添加访问Kubernetes的凭据信息,这里填入上面登录KubernetesDashboard所创建的token即可,添加完成之后选择刚刚添加的凭据,然后点击连接测试,如果提示连接成功,那么说明我们的Jenkins可以连接Kubernetes了
5、jenkins全局配置jdk、git和maven
jenkinsciblueocean镜像默认安装了jdk和git,这里需要登录容器找到路径,然后配置进去。
通过命令进入jenkins容器,并查看JAVAHOEM和git路径〔rootlocalhost〕dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES0520ebb9cc5djenkinsciblueoceansbintiniusr2daysagoUp30hours50000tcp,0。0。0。0:180808080tcp,:::180808080tcprootjenkins1〔rootlocalhost〕dockerexecit0520ebb9cc5dbinbashbash5。1echoJAVAHOMEoptjavaopenjdkbash5。1whichgitusrbingit
通过命令查询可知,JAVAHOMEoptjavaopenjdkGITusrbingit,在Jenkins全局工具配置中配置
Maven可以在宿主机映射的datadockercijenkinshome中安装,然后配置时,配置容器路径为varjenkinshome下的Maven安装路径
在系统配置中设置MAVENHOME供Pipelinescript调用,如果执行脚本时提示没有权限,那么在宿主Maven目录的bin目录下执行chmod777
6、为k8s新建harborkey,用于k8s拉取私服镜像,配置在代码的k8sdeployment。yml中使用。kubectlcreatesecretdockerregistryharborkeydockerserver172。16。20。175dockerusernamerobotgiteggdockerpasswordJqazyv7vvZiL6TXuNcv7TrZeRdL8U9n3
7、新建pipeline流水线任务
8、配置流水线任务参数
9、配置pipeline发布脚本
在流水线下面选择Pipelinescript
pipeline{agentanyparameters{gitParameterbranchFilter:origin(。),defaultValue:master,name:Branch,type:PTBRANCH,description:请选择需要构建的代码分支choice(name:BaseImage,choices:〔openjdk:8jdkalpine〕,description:请选择基础运行环境)choice(name:Environment,choices:〔dev,test,prod〕,description:请选择要发布的环境:dev开发环境、test测试环境、prod生产环境)extendedChoice(defaultValue:gitegggateway,giteggoauth,giteggplugingiteggcodegenerator,giteggservicegiteggservicebase,giteggservicegiteggserviceextension,giteggservicegiteggservicesystem,description:请选择需要构建的微服务,multiSelectDelimiter:,,name:ServicesBuild,quoteValue:false,saveJSONParameterToFile:false,type:PTCHECKBOX,value:gitegggateway,giteggoauth,giteggplugingiteggcodegenerator,giteggservicegiteggservicebase,giteggservicegiteggserviceextension,giteggservicegiteggservicesystem,visibleItemCount:6)string(name:BuildParameter,defaultValue:none,description:请输入构建参数)}environment{PRONAMEgiteggBuildParameter{params。BuildParameter}ENV{params。Environment}BRANCH{params。Branch}ServicesBuild{params。ServicesBuild}BaseImage{params。BaseImage}k8stoken7696144b3b774588beb0db4d585f5c04}stages{stage(Cleanworkspace){steps{deleteDir()}}stage(Processparameters){steps{script{if({params。ServicesBuild}。trim()!){defServicesBuildString{params。ServicesBuild}ServicesBuildServicesBuildString。split(,)for(serviceinServicesBuild){printlnnowgot{service}}}if({params。BuildParameter}。trim()!{params。BuildParameter}。trim()!none){BuildParameter{params。BuildParameter}}else{BuildParameter}}}}stage(PullSourceCodePlatform){steps{echo{BRANCH}gitbranch:{Branch},credentialsId:gitlabTest,url:http:172。16。20。188:2080rootgiteggplatform。git}}stage(InstallPlatform){steps{echoStartPlatformBuildsh{MAVENHOME}binmvnDskipTeststruecleaninstall{BuildParameter}echoEndPlatformBuild}}stage(PullSourceCode){steps{echo{BRANCH}gitbranch:{Branch},credentialsId:gitlabTest,url:http:172。16。20。188:2080rootgiteggcloud。git}}stage(Build){steps{script{echoStartCloudParentInstallsh{MAVENHOME}binmvnDskipTeststruecleaninstallP{params。Environment}{BuildParameter}echoEndCloudParentInstalldefworkspacepwd()for(serviceinServicesBuild){stage(buildCloud{service}){echoStartCloudBuild{service}shcd{workspace}{service}{MAVENHOME}binmvnDskipTeststruecleanpackageP{params。Environment}{BuildParameter}jib:buildDjib。httpTimeout200000DsendCredentialsOverHttptruefpom。xmlechoEndCloudBuild{service}}}}}}stage(Synctok8s){steps{script{echoStartSynctok8sdefworkspacepwd()mainpomreadMavenPomfile:pom。xmlprofilesmainpom。getProfiles()defversionmainpom。getVersion()defnacosAddrdefnacosConfigPrefixdefnacosConfigGroupdefdockerHarborAddrdefdockerHarborProjectdefdockerHarborUsernamedefdockerHarborPassworddefserverPortdefcommonDeployment{workspace}k8sdeployment。yamlfor(profileinprofiles){获取对应配置if(profile。getId(){params。Environment}){nacosAddrprofile。getProperties()。getProperty(nacos。addr)nacosConfigPrefixprofile。getProperties()。getProperty(nacos。config。prefix)nacosConfigGroupprofile。getProperties()。getProperty(nacos。config。group)dockerHarborAddrprofile。getProperties()。getProperty(docker。harbor。addr)dockerHarborProjectprofile。getProperties()。getProperty(docker。harbor。project)dockerHarborUsernameprofile。getProperties()。getProperty(docker。harbor。username)dockerHarborPasswordprofile。getProperties()。getProperty(docker。harbor。password)}}for(serviceinServicesBuild){stage(Sync{service}ToK8s){echoStartSync{service}tok8sdir({workspace}{service}){pomreadMavenPomfile:pom。xmlechogroup:artifactId:{pom。artifactId}defdeployYamlk8sdeployment{pom。artifactId}。yamlyamlreadYamlfile:。srcmainresourcesbootstrap。ymlserverPort{yaml。server。port}if(fileExists({workspace}{service}k8sdeployment。yaml)){commonDeployment{workspace}{service}k8sdeployment。yaml}else{commonDeployment{workspace}k8sdeployment。yaml}script{shseds{APPNAME}{pom。artifactId}g;s{IMAGEURL}{dockerHarborAddr}g;s{IMAGEPROGECT}{PRONAME}g;s{IMAGETAG}{version}g;s{APPPORT}{serverPort}g;s{SPRINGPROFILE}{params。Environment}g{commonDeployment}{deployYaml}kubernetesDeployconfigs:{deployYaml},kubeconfigId:{k8stoken}}}echoEndSync{service}tok8s}}echoEndSynctok8s}}}}}常见问题:
1、PipelineUtilitySteps第一次执行会报错Scriptsnotpermittedtousemethod或者ScriptsnotpermittedtousestaticMethodorg。codehaus。groovy。runtime。DefaultGroovyMethodsgetPropertiesjava。lang。Object
解决:系统管理InprocessScriptApproval点击Approval
2、通过NFS服务将所有容器的日志统一存放在NFS的服务端
3、KubernetesContinuousDeploy,使用1。0。0版本,否则报错,不兼容
4、解决docker注册到内网问题spring:cloud:inetutils:ignoredinterfaces:docker0
5、配置ipvs模式,kubeproxy监控Pod的变化并创建相应的ipvs规则。ipvs相对iptables转发效率更高。除此以外,ipvs支持更多的LB算法。kubectleditcmkubeproxynkubesystem
修改mode:ipvs
重新加载kubeproxy配置文件kubectldeletepodlk8sappkubeproxynkubesystem
查看ipvs规则ipvsadmLn
6、k8s集群内部访问外部服务,nacos,redis等a、内外互通模式,在部署的服务设置hostNetwork:truespec:hostNetwork:trueb、Endpoints模式kind:EndpointsapiVersion:v1metadata:name:nacosnamespace:defaultsubsets:addresses:ip:172。16。20。188ports:port:8848apiVersion:v1kind:Servicemetadata:name:nacosnamespace:defaultspec:type:ClusterIPports:port:8848targetPort:8848protocol:TCPc、service的type:ExternalName模式,ExternalName使用CNAME重定向,因此无法执行端口重映射,域名使用EndPoints和type:ExternalName
以上外部新建yaml,不要用内部的,这些需要在环境设置时配置好。
7、k8s常用命令:
查看pod:kubectlgetpods
查看service:kubectlgetsvc
查看endpoints:kubectlgetendpoints
安装:kubectlapplyfXXX。yaml
删除:kubectldeletefxxx。yaml
删除pod:kubectldeletepodpodName
删除service:kubectldeleteserviceserviceName
进入容器:kubectlexecitpodsNamexxxxxxndefaultbinsh