写在前面聊聊CICD的环境搭建以及一个基于Hexo的博客系统在CICD流程中的配置Demo很早就想着写这样一篇博文,但是没有时间,之前写了一半,正好春节假期把剩下的一般写完。本文属于Devpos实战类文章,基本没有理论,所有,小伙伴需要对devops有些基本的了解,博文中讲的CICD属于Devops的一部分当然小伙伴们也可以找一些云服务商提供的商业的Depops平台去学习,一般有免费的体验,比如华为云的软开云平台。博文涉及内容:GitlabJenkinsDockerHarborK8S集群的CICD搭建教程在搭建好的CICD平台上持续集成部署hexo博客系统,Demo有些简陋,仅用于学习。其中GitlabJenkinsHarbor都是通过容器化部署篇幅有限,关于CD环境k8s集群这里用之前部署好的,并且已经做了kubeconfig证书,关于这方便感兴趣小伙伴可以看看我之前的文章下面为涉及到的机器: 用到的机器 ip 域名 客户机 192。168。26。1 本地物理机: GitlabJenkinsDocker 192。168。26。55 虚机:liruilongs。github。io docker镜像仓库:harbor 192。168。26。56 虚机:vms56。liruilongs。github。io k8s集群master节点 192。168。26。81 虚机:vms81。liruilongs。github。io k8s集群node节点 192。168。26。82 虚机:vms82。liruilongs。github。io k8s集群node节点 192。168。26。83 虚机:vms83。liruilongs。github。io 拓扑图 这里客户机用本地的IDE持续编码,然后push代码到gitlab,gitlab中的web钩子触发jenkins中配置好的构建触发器,通过shell命令拉取gitlab仓库中的代码,然后通过拉取的应用源码和Dockerfile文件来构建应用镜像,构建完成后将应用镜像push到harbor私有镜像仓库,然后通过shell命令的方式在jenkins中用kubelet客户端将镜像从私有仓库拉取到k8s集群并更新其deploy中的镜像,默认deploy更新副本的方式为滚动更新,整个流程中,只有客户机push代码是手手动的方式,其他全是自动 上帝借由各种途径使人变得孤独,好让我们可以走向自己。赫尔曼黑塞《德米安》一、CICD服务器环境搭建 CI即为持续集成(ContinueIntegration,简称CI),用通俗的话讲,就是持续的整合版本库代码编译后制作应用镜像。建立有效的持续集成环境可以减少开发过程中一些不必要的问题、提高代码质量、快速迭代等, 常用的工具和平台有: Jenkins:基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。 Bamboo:是一个企业级商用软件,可以部署在大规模生产环境中。 CD即持续交付ContinuousDelivery和持续部署ContinuousDeployment,用通俗的话说,即可以持续的部署到生产环境给客户使用,这里分为两个阶段,持续交付我理解为满足上线条件的过程,但是没有上线,持续部署,即为上线应用的过程 关于CD环境,我们使用以前搭建好的K8s集群,K8s集群可以实现应用的健康检测,动态扩容,滚动更新等优点,关于K8s集群的搭建,小伙伴可以看看我的其他文章 我们来搭建CI服务器:操作服务器:liruilongs。github。io:192。168。26。55docker环境安装 拉取镜像,启动并设置开机自启〔rootliruilongs。github。io〕〔〕yumyinstalldockerce〔rootliruilongs。github。io〕〔〕systemctlenabledockernow 配置docker加速器sudomkdirpetcdockersudoteeetcdockerdaemon。jsonEOF{registrymirrors:〔https:2tefyfv7。mirror。aliyuncs。com〕}EOFsudosystemctldaemonreloadsudosystemctlrestartdocker1。安装GitLab并配置 GitLab不多介绍。一个基于Git的版本控制平台,,提供了Git仓库管理、代码审查、问题跟踪、活动反馈和wiki,当然同时也提供了〔rootliruilongs。github。io〕〔〕dockerpullbeginorgitlabce 创建共享卷目录〔rootliruilongs。github。io〕〔〕mkdirpdatagitlabetcdatagitlablogdatagitlabdata〔rootliruilongs。github。io〕〔〕chmod777datagitlabetcdatagitlablogdatagitlabdata创建gitlab容器〔rootliruilongs。github。io〕〔〕dockerrunitdnamegitlabrestartalwaysprivilegedtruep8443:443p80:80p222:22vdatagitlabetc:etcgitlabvdatagitlablog:varloggitlabvdatagitlabdata:varoptgitlabbeginorgitlabceacc95b2896e8475915275d5eb77c7e63f63c31536432b68508f2f216d4fec634〔rootliruilongs。github。io〕〔〕dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESacc95b2896e8beginorgitlabceassetswrapper53secondsagoUp51seconds(health:starting)0。0。0。0:8080tcp,:::8080tcp,0。0。0。0:22222tcp,:::22222tcp,0。0。0。0:8443443tcp,:::8443443tcpgitlab〔rootliruilongs。github。io〕〔〕〔rootliruilongs。github。io〕〔〕 切记:这里的端口要设置成80,要不push项目会提示没有报错,如果宿主机端口被占用,需要把这个端口腾出来关闭容器修改配置文件〔rootliruilongs。github。io〕〔〕dockerstopgitlabgitlab externalurlhttp:192。168。26。55’〔rootliruilongs。github。io〕〔〕catdatagitlabetcgitlab。rbgrepexternalurl!Formoredetailsonconfiguringexternalurlsee:externalurlGENERATEDEXTERNALURLregistryexternalurlhttps:registry。gitlab。example。compagesexternalurlhttp:pages。example。comgitlabpages〔artifactsserverurl〕nilDefaultstoexternalurlapiv4mattermostexternalurlhttp:mattermost。example。com〔rootliruilongs。github。io〕〔〕sediexternalurlGENERATEDEXTERNALURLaexternalurlhttp:192。168。26。55datagitlabetcgitlab。rb〔rootliruilongs。github。io〕〔〕catdatagitlabetcgitlab。rbgrepexternalurl!Formoredetailsonconfiguringexternalurlsee:externalurlGENERATEDEXTERNALURLexternalurlhttp:192。168。26。55registryexternalurlhttps:registry。gitlab。example。compagesexternalurlhttp:pages。example。comgitlabpages〔artifactsserverurl〕nilDefaultstoexternalurlapiv4mattermostexternalurlhttp:mattermost。example。com〔rootliruilongs。github。io〕〔〕 gitlabrails〔‘gitlabsshhost’〕192。168。26。55’〔rootliruilongs。github。io〕〔〕catdatagitlabetcgitlab。rbgrepgitlabsshhostgitlabrails〔gitlabsshhost〕ssh。hostexample。com〔rootliruilongs。github。io〕〔〕sedigitlabsshhostagitlabrails〔gitlabsshhost〕192。168。26。55datagitlabetcgitlab。rb〔rootliruilongs。github。io〕〔〕catdatagitlabetcgitlab。rbgrepgitlabsshhostgitlabrails〔gitlabsshhost〕ssh。hostexample。comgitlabrails〔gitlabsshhost〕192。168。26。55〔rootliruilongs。github。io〕〔〕 gitlabrails〔gitlabshellsshport〕222〔rootliruilongs。github。io〕〔〕catdatagitlabetcgitlab。rbgrepgitlabshellsshgitlabrails〔gitlabshellsshport〕22〔rootliruilongs。github。io〕〔〕sedigitlabshellsshportagitlabrails〔gitlabshellsshport〕222datagitlabetcgitlab。rb〔rootliruilongs。github。io〕〔〕catdatagitlabetcgitlab。rbgrepgitlabshellsshgitlabrails〔gitlabshellsshport〕22gitlabrails〔gitlabshellsshport〕222〔rootliruilongs。github。io〕〔〕〔rootliruilongs。github。io〕〔〕vimdatagitlabdatagitlabrailsetcgitlab。yml〔rootliruilongs。github。io〕〔〕gitlab:Webserversettings(note:hostistheFQDN,donotincludehttp:)host:192。168。26。55port:80https:false 修改完配置文件之后。直接启动容器〔rootliruilongs。github。io〕〔〕dockerstartgitlab 在宿主机所在的物理机访问,http:192。168。26。55,会自动跳转到修改密码(root用户),如果密码设置的没有满足一定的复杂性,则会报500,需要从新设置 登录进入仪表盘 然后我们简单测试一下,push一个项目上去,这里的项目是一个基于hexo的博客系统 项目成功上传Gitlab 相关的git命令PSF:bloggergitinitInitializedemptyGitrepositoryinF:blogger。gitPSF:bloggergitconfigglobaluser。nameAdministratorPSF:bloggergitconfigglobaluser。emailadminexample。comPSF:bloggergitremoteaddoriginhttp:192。168。26。55rootblog。gitPSF:bloggergitadd。PSF:bloggergitcommitmInitialcommitPSF:bloggergitpushuoriginmasterEnumeratingobjects:322,done。Countingobjects:100(322322),done。Deltacompressionusingupto8threadsCompressingobjects:100(302302),done。Writingobjects:100(322322),11。31MiB9。22MiBs,done。Total322(delta24),reused0(delta0)remote:Resolvingdeltas:100(2424),done。Tohttp:192。168。26。55rootblog。git〔newbranch〕mastermasterBranchmastersetuptotrackremotebranchmasterfromorigin。PSF:blogger2。安装配置远程镜像仓库harbor 下面我们要配置私有的docker镜像仓库,用到的机器为: 操作服务器:vms56。liruilongs。github。io:192。168。26。56 这里仓库我们选择harbor,因为有web页面,当然也可以使用registryharbor的配置 harbor的安装使用步骤 安装并启动docker并安装dockercompose 上传harbor的离线包 导入harbor的镜像 编辑harbor。yml 修改hostname为自己的主机名,不用证书需要注释掉https harboradminpassword登录密码 安装compose 运行脚本。install。sh 在浏览器里输入IP访问 dockerloginIP家目录下会有一个。docker文件夹 下面我们开始安装 首先需要设置selinux、防火墙〔rootvms56。liruilongs。github。io〕〔〕getenforceDisabled〔rootvms56。liruilongs。github。io〕〔〕systemctldisablefirewalld。servicenowRemovedsymlinketcsystemdsystemmultiuser。target。wantsfirewalld。service。Removedsymlinketcsystemdsystemdbusorg。fedoraproject。FirewallD1。service。 安装并启动docker并安装dockercompose,关于dockercompose,这里不用了解太多,一个轻量的docker编排工具〔rootvms56。liruilongs。github。io〕〔〕yuminstallydockerce〔rootvms56。liruilongs。github。io〕〔〕yuminstallydockercompose 解压harbor安装包:harborofflineinstallerv2。0。6。tgz,导入相关镜像〔rootvms56。liruilongs。github。io〕〔〕lsbindevharborofflineinstallerv2。0。6。tgzlibmachineidmntprocrunsrvtmpvarbootetchomelib64mediaoptrootsbinsysusr〔rootvms56。liruilongs。github。io〕〔〕tarzxvfharborofflineinstallerv2。0。6。tgzharborharbor。v2。0。6。tar。gzharborprepareharborLICENSEharborinstall。shharborcommon。shharborharbor。yml。tmpl〔rootvms56。liruilongs。github。io〕〔〕dockerloadiharborharbor。v2。0。6。tar。gz 修改配置文件〔rootvms56。liruilongs。github。io〕〔〕cdharbor〔rootvms56。liruilongs。github。io〕〔harbor〕lscommon。shharbor。v2。0。6。tar。gzharbor。yml。tmplinstall。shLICENSEprepare〔rootvms56。liruilongs。github。io〕〔harbor〕cpharbor。yml。tmplharbor。yml〔rootvms56。liruilongs。github。io〕〔harbor〕lscommon。shharbor。v2。0。6。tar。gzharbor。ymlharbor。yml。tmplinstall。shLICENSEprepare〔rootvms56。liruilongs。github。io〕〔harbor〕vimharbor。yml〔rootvms56。liruilongs。github。io〕〔harbor〕 harbor。yml:设置IP和用户名密码4DONOTuselocalhostor127。0。0。1,becauseHarborneedstobeaccessedbyexternalclients。5hostname:192。168。26。5667httprelatedconfig。。。。。。。12httpsrelatedconfig13https:14httpsportforharbor,defaultis44315port:44316Thepathofcertandkeyfilesfornginx17certificate:yourcertificatepath18privatekey:yourprivatekeypath。。。。33RememberChangetheadminpasswordfromUIafterlaunchingHarbor。34harboradminpassword:Harbor123453536HarborDBconfiguration 。prepare。install。sh〔rootvms56。liruilongs。github。io〕〔harbor〕。preparepreparebasedirissettoharborWARNING:root:WARNING:HTTPprotocolisinsecure。Harborwilldeprecatehttpprotocolinthefuture。PleasemakesuretoupgradetohttpsGeneratedconfigurationfile:configloglogrotate。confGeneratedconfigurationfile:configlogrsyslogdocker。confGeneratedconfigurationfile:confignginxnginx。confGeneratedconfigurationfile:configcoreenvGeneratedconfigurationfile:configcoreapp。confGeneratedconfigurationfile:configregistryconfig。ymlGeneratedconfigurationfile:configregistryctlenvGeneratedconfigurationfile:configregistryctlconfig。ymlGeneratedconfigurationfile:configdbenvGeneratedconfigurationfile:configjobserviceenvGeneratedconfigurationfile:configjobserviceconfig。ymlGeneratedandsavedsecrettofile:datasecretkeyssecretkeySuccessfullycalledfunc:createrootcertGeneratedconfigurationfile:composelocationdockercompose。ymlCleanuptheinputdir〔rootvms56。liruilongs。github。io〕〔harbor〕。install。sh〔Step0〕:checkingifdockerisinstalled。。。Note:dockerversion:20。10。9〔Step1〕:checkingdockercomposeisinstalled。。。Note:stoppingexistingHarborinstance。。。Removingharborjobservice。。。doneRemovingnginx。。。doneRemovingharborcore。。。doneRemovingregistry。。。doneCreatingharborlog。。。doneRemovingharborportal。。。doneRemovingredis。。。doneRemovingnetworkharborharborCreatingregistry。。。doneCreatingharborcore。。。doneCreatingnetworkharborharborwiththedefaultdriverCreatingnginx。。。doneCreatingredis。。。Creatingregistry。。。Creatingharborportal。。。Creatingregistryctl。。。Creatingharbordb。。。Creatingharborcore。。。Creatingharborjobservice。。。Creatingnginx。。。Harborhasbeeninstalledandstartedsuccessfully。〔rootvms56。liruilongs。github。io〕〔harbor〕 查看相关的镜像〔rootvms56。liruilongs。github。io〕〔harbor〕dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES0efcf7b83dcfgoharbornginxphoton:v2。0。6nginxgdaemonof16minutesagoUp16minutes(healthy)0。0。0。0:808080tcp,:::808080tcpnginxee9d418c7ceegoharborharborjobservice:v2。0。6harborentrypoint。16minutesagoUp16minutes(healthy)harborjobservice6052c481dbd0goharborharborcore:v2。0。6harborentrypoint。16minutesagoUp16minutes(healthy)harborcore001ff83b037dgoharborharbordb:v2。0。6dockerentrypoint。17minutesagoUp16minutes(healthy)5432tcpharbordb2ebc81356ef1goharborharborregistryctl:v2。0。6homeharborstart。17minutesagoUp16minutes(healthy)registryctl6ca721c0fa75goharborharborportal:v2。0。6nginxgdaemonof17minutesagoUp16minutes(healthy)8080tcpharborportal2b06e2cf91abgoharborregistryphoton:v2。0。6homeharborentryp17minutesagoUp16minutes(healthy)5000tcpregistry2292a20780e2goharborredisphoton:v2。0。6redisserveretcr17minutesagoUp16minutes(healthy)6379tcpredisa0e3e49cf9dbgoharborharborlog:v2。0。6binshcusrloc17minutesagoUp17minutes(healthy)127。0。0。1:151410514tcpharborlog〔rootvms56。liruilongs。github。io〕〔harbor〕 访问测试 harbor CI服务器的docker配置 这里因为我们要在192。168。26。55(CI服务器)上push镜像到192。168。26。56(私仓),所有需要修改CI服务器上的Docker配置。添加仓库地址 操作服务器:liruilongs。github。io:192。168。26。55〔rootliruilongs。github。io〕〔〕catetcdockerdaemon。json{registrymirrors:〔https:2tefyfv7。mirror。aliyuncs。com〕}〔rootliruilongs。github。io〕〔〕vimetcdockerdaemon。json 修改后的配置文件〔rootliruilongs。github。io〕〔〕catetcdockerdaemon。json{registrymirrors:〔https:2tefyfv7。mirror。aliyuncs。com〕,insecureregistries:〔192。168。26。56〕} 加载使其生效〔rootliruilongs。github。io〕〔〕systemctldaemonreload〔rootliruilongs。github。io〕〔〕systemctlrestartdocker〔rootliruilongs。github。io〕〔〕 CI机器简单测试一下〔rootliruilongs。github。io〕〔〕dockerlogin192。168。26。56Authenticatingwithexistingcredentials。。。WARNING!Yourpasswordwillbestoredunencryptedinroot。dockerconfig。json。Configureacredentialhelpertoremovethiswarning。Seehttps:docs。docker。comenginereferencecommandlinelogincredentialsstoreLoginSucceeded〔rootliruilongs。github。io〕〔〕dockertagbusybox192。168。26。56demobusybox〔rootliruilongs。github。io〕〔〕dockerpush192。168。26。56demobusyboxUsingdefaulttag:latestThepushreferstorepository〔192。168。26。56demobusybox〕cfd97936a580:Pushedlatest:digest:sha256:febcf61cd6e1ac9628f6ac14fa40836d16f3c6ddef3b303ff0321606e55ddd0bsize:527〔rootliruilongs。github。io〕〔〕 push一个镜像,可以在私仓的web页面查看 harbor 到这里。我们配置了镜像仓库3。安装配置jenkins 操作服务器:liruilongs。github。io:192。168。26。55 镜像jenkins拉取〔rootliruilongs。github。io〕〔〕dockerpulljenkinsjenkins:centos7jdk8〔rootliruilongs。github。io〕〔〕dockerhistoryjenkinsjenkins:centos7jdk8IMAGECREATEDCREATEDBYSIZECOMMENTde64a05279ba5daysagoLABELorg。opencontainers。image。vendorJenkin0Bbuildkit。dockerfile。v0missing5daysagoCOPYinstallplugins。shusrlocalbininsta10。6kBbuildkit。dockerfile。v0missing5daysagoARGJENKINSHOMEvarjenkinshome0Bbuildkit。dockerfile。v0missing5daysagoARGagentport500000Bbuildkit。dockerfile。v0missing5daysagoARGhttpport80800Bbuildkit。dockerfile。v0missing5daysagoARGgid10000Bbuildkit。dockerfile。v0missing5daysagoARGuid10000Bbuildkit。dockerfile。v0missing5daysagoARGgroupjenkins0Bbuildkit。dockerfile。v0missing5daysagoARGuserjenkins0Bbuildkit。dockerfile。v0missing5daysagoRUN5TARGETARCHamd64COMMITSHA0b797f02410。4MBbuildkit。dockerfile。v0missing5daysagoCOPYgitlfspub。gpgtmpgitlfspub。gpg62。5kBbuildkit。dockerfile。v0missing5daysagoARGGITLFSVERSION3。0。10Bbuildkit。dockerfile。v0missing5daysagoARGCOMMITSHA0Bbuildkit。dockerfile。v0missing5daysagoARGTARGETARCH0Bbuildkit。dockerfile。v0missing5daysagoRUN2TARGETARCHamd64COMMITSHA0b797f024426MBbuildkit。dockerfile。v0missing5daysagoARGCOMMITSHA0Bbuildkit。dockerfile。v0missing5daysagoARGTARGETARCH0Bbuildkit。dockerfile。v0missing5daysagoENVLANGenUS。UTF8LANGUAGEenUS:enLCAL0Bbuildkit。dockerfile。v0missing7weeksagobinshc(nop)CMD〔binbash〕0Bmissing7weeksagobinshc(nop)LABELorg。labelschema。sc0Bmissing7weeksagobinshc(nop)ADDfile:b3ebbe8bd304723d4204MB〔rootliruilongs。github。io〕〔〕 创建共享卷,修改所属组和用户,和容器里相同 这里为什么要改成1000,是因为容器里是以jenkins用户的身份去读写数据,而在容器里jenkins的uid是1000,〔rootliruilongs。github。io〕〔〕mkdirjenkinschown1000:1000jenkins〔rootliruilongs。github。io〕〔〕这里为什么要改成1000,是因为容器里是以jenkins用户的身份去读写数据,而在容器里jenkins的uid是1000,创建创建jenkins容器〔rootliruilongs。github。io〕〔〕catjenkins。docker。shdockerrunditp8080:8080p50000:50000namejenkinsprivilegedtruerestartalwaysvjenkins:varjenkinshomejenkinsjenkins:centos7jdk8〔rootliruilongs。github。io〕〔〕dockerrunditp8080:8080p50000:50000namejenkinsprivilegedtruerestartalwaysvjenkins:varjenkinshomejenkinsjenkins:centos7jdk839afa098c8a56973ce1559d374b058b8e6091175b5b783d613a9f2e356827684〔rootliruilongs。github。io〕〔〕dockerpsgrepjenkins39afa098c8a5jenkinsjenkins:centos7jdk8sbintiniusr3minutesagoUp2minutes0。0。0。0:80808080tcp,:::80808080tcp,0。0。0。0:5000050000tcp,:::5000050000tcpjenkins 访问jenkins 先打开浏览器打开这个页面,让其初始化一下,直到看到界面 因为要修改jenkins的配置,所以此时关闭jenkins容器〔rootliruilongs。github。io〕〔〕dockerstopjenkinsjenkins 更换国内清华大学镜像,Jenkins下载插件特别慢,更换国内的清华源的镜像地址会快不少〔rootliruilongs。github。io〕〔〕catjenkinshudson。model。UpdateCenter。xmllt;?xmlversion1。1encodingUTF8?sitessiteiddefaultidurlhttps:updates。jenkins。ioupdatecenter。jsonurlsitesites〔rootliruilongs。github。io〕〔〕〔rootliruilongs。github。io〕〔〕sedisupdates。jenkins。ioupdatecenter。jsonmirrors。tuna。tsinghua。edu。cnjenkinsupdatesupdatecenter。jsongjenkinshudson。model。UpdateCenter。xml〔rootliruilongs。github。io〕〔〕catjenkinshudson。model。UpdateCenter。xmllt;?xmlversion1。1encodingUTF8?sitessiteiddefaultidurlhttps:mirrors。tuna。tsinghua。edu。cnjenkinsupdatesupdatecenter。jsonurlsitesites〔rootliruilongs。github。io〕〔〕 http:www。google。com替换为http:www。baidu。comyumyinstalljq〔rootliruilongs。github。io〕〔〕catjenkinsupdatesdefault。jsonjq。connectionCheckUrlhttp:www。google。com〔rootliruilongs。github。io〕〔〕catjenkinsupdatesdefault。jsonjqkeys〔connectionCheckUrl,core,deprecations,generationTimestamp,id,plugins,signature,updateCenterVersion,warnings〕〔rootliruilongs。github。io〕〔〕sedishttp:www。google。comhttp:www。baidu。comgjenkinsupdatesdefault。json 替换后查看〔rootliruilongs。github。io〕〔〕catjenkinsupdatesdefault。jsonjq。connectionCheckUrlhttp:www。baidu。com〔rootliruilongs。github。io〕〔〕catjenkinsupdatesdefault。jsonjqkeys〔connectionCheckUrl,core,deprecations,generationTimestamp,id,plugins,signature,updateCenterVersion,warnings〕〔rootliruilongs。github。io〕〔〕 重启docker,获取登录密匙〔rootliruilongs。github。io〕〔〕dockerstartjenkinsjenkins〔rootliruilongs。github。io〕〔〕〔rootliruilongs。github。io〕〔〕catjenkinssecretsinitialAdminPasswordbe15eaabc4c946de913dd5af8636cae9 需要修改jenkins绑定的docker的启动参数,ExecStartusrbindockerdHtcp:0。0。0。0:2376Hfd:containerdruncontainerdcontainerd。sock 修改镜像库启动参数后需要重启docker〔rootvms56。liruilongs。github。io〕〔〕systemctldaemonreload〔rootvms56。liruilongs。github。io〕〔〕systemctlrestartdocker安装docker插件 jenkins相关配置,这里的配置照着图片就好,需要配置一个docker集群供jenkins来根据Dockerfile构建镜像并push到私仓,这里docker集群即为CI服务器的docker 修改镜像库启动参数,ExecStartusrbindockerdHtcp:0。0。0。0:2376Hfd:containerdruncontainerdcontainerd。sock 关联docker和jenkins jenkins安全设置 后面gitlab要和jenkins进行联动,所以必须要需要对jenkins的安全做一些设置,依次点击系统管理全局安全配置授权策略,勾选匿名用户具有可读权限 添加JVM运行参数Dhudson。security。csrf。GlobalCrumbIssuerConfiguration。DISABLECSRFPROTECTIONtrue运行跨站请求访问〔rootliruilongs。github。io〕〔〕dockerexecurootitjenkinsbash〔root39afa098c8a5〕lsanacondapost。logbindevetchomeliblib64mediamntoptprocrootrunsbinsrvsystmpusrvar〔root39afa098c8a5〕viusrlocalbinjenkins。sh〔root39afa098c8a5〕exitexit〔rootliruilongs。github。io〕〔〕下载kubectl客户端工具 这里的话我们要通过jenkins上的kubectl客户端连接k8s,所以我们需要安装一个k8s的客户端kubectl,下载k8s客户端wgethttps:storage。googleapis。comkubernetesreleasereleasev1。22。2binlinuxamd64kubectl〔rootliruilongs。github。io〕〔〕yuminstallykubectl1。22。20disableexcludeskubernetes拷贝kubeconfig文件 然后拷贝kubeconfig证书,k8s集群中查看证书位置,这里的证书是之前创建好的,小伙伴可以看看我之前的文章〔rootliruilongs。github。io〕〔〕scproot192。168。26。81:rootansiblek8srbaccreatekc1。Warning:Permanentlyadded192。168。26。81(ECDSA)tothelistofknownhosts。root192。168。26。81spassword:kc11005566108。7KBs00:00拷贝证书和k8s集群客户端工具到jenkins容器内〔rootliruilongs。github。io〕〔〕dockercpkc1jenkins:〔rootliruilongs。github。io〕〔〕dockercpkubectljenkins:〔rootliruilongs。github。io〕〔〕kubectl命令测试〔rootliruilongs。github。io〕〔〕dockerexecurootitjenkinsbash〔root39afa098c8a5〕lsanacondapost。logbindevetchomekc1kubectlliblib64mediamntoptprocrootrunsbinsrvsystmpusrvar〔root39afa098c8a5〕。kubectlkubeconfikc1getpodsAError:unknownflag:kubeconfiSeekubectlgethelpforusage。〔root39afa098c8a5〕。kubectlkubeconfigkc1getpodsAErrorfromserver(Forbidden):podsisforbidden:UserliruilongcannotlistresourcepodsinAPIgroupattheclusterscope 发现没有权限,这里我们为了方便,直接赋予集群中的clusteradmin角色〔rootvms81。liruilongs。github。io〕〔ansiblek8srbaccreate〕kubectlcreateclusterrolebindingtestclusterroleclusteradminuserliruilongclusterrolebinding。rbac。authorization。k8s。iotestcreated〔rootvms81。liruilongs。github。io〕〔ansiblek8srbaccreate〕 命令测试没有问题〔root39afa098c8a5〕。kubectlkubeconfigkc1getnodesNAMESTATUSROLESAGEVERSIONvms81。liruilongs。github。ioReadycontrolplane,master51dv1。22。2vms82。liruilongs。github。ioNotReadynone51dv1。22。2vms83。liruilongs。github。ioNotReadynone51dv1。22。2〔root39afa098c8a5〕二、hexo博客系统CICD实战4。k8s集群中配置hexo生产环境高可用 我们要部署Nginx来运行hexo博客系统,hexo编译完后为一堆静态文件,所以我们需要创建一个svc和一个deploy,使用SVC提供服务,使用deploy提供服务能力,使用Nginxhexo的静态文件构成的镜像apiVersion:appsv1kind:Deploymentmetadata:creationTimestamp:nulllabels:app:nginxname:nginxdepspec:replicas:2selector:matchLabels:app:nginxstrategy:{}template:metadata:creationTimestamp:nulllabels:app:nginxspec:containers:image:blogname:webresources:requests:cpu:100mrestartPolicy:Alwaysdeployments创建 这里我们先用一个Nginx镜像来代替hexo博客的镜像〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕kubectlapplyfnginx。yamldeployment。appsnginxdepcreated 查看deployments和pod〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕kubectlgetdeployments。appsgrepnginxdepnginxdep2222109s〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕kubectlgetpodsowidegrepweb〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕kubectlgetpodsowidegrepnginxdepnginxdep645bf755b92w8jv11Running02m22s10。244。171。164vms82。liruilongs。github。iononenonenginxdep645bf755b9jfqxj11Running02m22s10。244。171。157vms82。liruilongs。github。iononenone〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕service创建〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕kubectlexposedeploynginxdepport8888targetport80typeNodePortservicenginxdepexposed〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕kubectlgetsvcowidegrepnginxdepnginxdepNodePort10。106。217。50none8888:31964TCP16sappnginx 访问测试没有问题,之后我们配置好jenkins上的触发器,直接替换就OK〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕curl127。0。0。1:31964!DOCTYPEhtmlhtmlheadtitleWelcometonginx!titlestylehtml{colorscheme:lightdark;}body{width:35em;margin:0auto;fontfamily:Tahoma,Verdana,Arial,sansserif;}styleheadbodyh1Welcometonginx!h1pIfyouseethispage,thenginxwebserverissuccessfullyinstalledandworking。Furtherconfigurationisrequired。pForonlinedocumentationandsupportpleaserefertonginx。org。 Commercialsupportisavailableatnginx。com。pemThankyouforusingnginx。embodyhtml〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕5。k8s集群配置私仓地址 我们通过kubectlset命令更新deploy的镜像时,获取的镜像是通过私仓获取的,所以需要在启动参数添加私仓地址 ExecStartusrbindockerdinsecureregistry192。168。26。56Hfd:containerdruncontainerdcontainerd。sock 这里所有的节点都需要设置后重启docker〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕vimusrlibsystemdsystemdocker。service〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕systemctldaemonreload;systemctlrestartdocker〔1〕23273〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕sshroot192。168。26。82Lastlogin:SunJan1606:09:072022from192。168。26。1〔rootvms82。liruilongs。github。io〕〔〕vimusrlibsystemdsystemdocker。service〔rootvms82。liruilongs。github。io〕〔〕systemctldaemonreload;systemctlrestartdocker〔1〕26843〔rootvms82。liruilongs。github。io〕〔〕exit登出Connectionto192。168。26。82closed。6。jenkins配置CICD流程 访问jenkins,接下来才是重点,我们要的jenkins上配置整个CICD流程,从而实现自动化 访问jenkins,接下来才是重点,我们要的jenkins上配置整个CICD流程,从而实现自动化 这里的Token我们设置为:4bf636c8214b7ff0a0fb,同时需要记住访问方式:JENKINSURLjobliruilongcicdbuild?tokenTOKENNAME 构建触发器选择shell构建:克隆代码 选择镜像构建 构建镜像并push私仓 这里切记需要添加私仓的认证信息,即上面设置的用户名和密码 选择shell构建,更新镜像 相关的文本信息cdrmrfbloggitclonehttp:192。168。26。55rootblog。gitvarjenkinshomeblog192。168。26。56libraryblog:{BUILDNUMBER}exportKUBECONFIGkc1;kubectlsetimagedeploymentnginxdep192。168。26。56libraryblog:{BUILDNUMBER}nkubesystem7。配置gitlab和jenkins的联动 访问gitlab配置联动 点击增加web钩子 viewalljobliruilongcicdbuild?token 到这里,联动已经配置完成8。编写Dockerfile文件,更新代码测试 下面我们编译一下hexo,生成public的一个文件夹,然后上传gitlabPSF:bloggerhexog。。。。。PSF:bloggergitadd。publicPSF:bloggergitcommitm编译代码PSF:bloggergitpush 同时需要编写Dockerfile文件来创建镜像FROMdocker。iolibrarynginx:latestMAINTAINERliruilongADD。publicusrsharenginxhtmlEXPOSE80CMD〔nginx,g,daemonoff;〕PSF:bloggergitadd。PSF:bloggergitcommitmDockcerfile文件编写〔master217e0ed〕Dockcerfile文件编写1filechanged,1deletion()PSF:bloggergitpushEnumeratingobjects:5,done。Countingobjects:100(55),done。Deltacompressionusingupto8threadsCompressingobjects:100(33),done。Writingobjects:100(33),307bytes307。00KiBs,done。Total3(delta2),reused0(delta0)Tohttp:192。168。26。55rootblog。git6690612。。217e0edmastermasterPSF:blogger jenkins输出 Startedbyremotehost192。168。26。1RunningasSYSTEMBuildinginworkspacevarjenkinshomeworkspaceliruilongcicd〔liruilongcicd〕binshxetmpjenkins6108687102523328796。shcdvarjenkinshomermrfbloggitclonehttp:192。168。26。55rootblog。gitCloningintoblog。。。DockerBuildDockerBuild:buildingimageatpathvarjenkinshomeblogStep15:FROMdocker。iolibrarynginx:latestf8f4ffc8092cStep25:MAINTAINERliruilongRunningine341b5562b64Removingintermediatecontainere341b5562b644e9f5aa47ab5Step35:ADD。publicusrsharenginxhtml3956cff32507Step45:EXPOSE80Runninginb4c27124989dRemovingintermediatecontainerb4c27124989dba9d1764d764Step55:CMD〔nginx,g,daemonoff;〕Runningin61dca01a4883Removingintermediatecontainer61dca01a48832aadc5732a60Successfullybuilt2aadc5732a60Taggingbuiltimagewith192。168。26。56libraryblog:41DockerBuildResponse:2aadc5732a60Pushing〔192。168。26。56libraryblog:41〕Thepushreferstorepository〔192。168。26。56libraryblog〕89570901cdea:Preparing65e1ea1dc98c:Preparing88891187bdd7:Preparing6e109f6c2f99:Preparing0772cb25d5ca:Preparing525950111558:Preparing476baebdfbf7:Preparing525950111558:Waiting476baebdfbf7:Waiting88891187bdd7:Layeralreadyexists6e109f6c2f99:Layeralreadyexists65e1ea1dc98c:Layeralreadyexists0772cb25d5ca:Layeralreadyexists89570901cdea:Pushing〔〕301。6kB28。75MB89570901cdea:Pushing〔〕1。193MB28。75MB476baebdfbf7:Layeralreadyexists525950111558:Layeralreadyexists89570901cdea:Pushing〔〕3。917MB28。75MB89570901cdea:Pushing〔〕5。996MB28。75MB89570901cdea:Pushing〔〕8。097MB28。75MB89570901cdea:Pushing〔〕10。76MB28。75MB89570901cdea:Pushing〔〕12。57MB28。75MB89570901cdea:Pushing〔〕13。8MB28。75MB89570901cdea:Pushing〔〕14。71MB28。75MB89570901cdea:Pushing〔〕15。59MB28。75MB89570901cdea:Pushing〔〕16。79MB28。75MB89570901cdea:Pushing〔〕18。27MB28。75MB89570901cdea:Pushing〔〕19。45MB28。75MB89570901cdea:Pushing〔〕20。34MB28。75MB89570901cdea:Pushing〔〕21。55MB28。75MB89570901cdea:Pushing〔〕22。44MB28。75MB89570901cdea:Pushing〔〕23。64MB28。75MB89570901cdea:Pushing〔〕24。52MB28。75MB89570901cdea:Pushing〔〕25。42MB28。75MB89570901cdea:Pushing〔〕26。61MB28。75MB89570901cdea:Pushing〔〕27。19MB28。75MB89570901cdea:Pushing〔〕28。69MB28。75MB89570901cdea:Pushing〔〕29。32MB89570901cdea:Pushed41:digest:sha256:c90b64945a8d063f7bcdcc39f00f91b6d83acafcd6b2ec6aba5b070474bafc37size:1782Cleaninglocalimages〔2aadc5732a60〕DockerBuildDone〔liruilongcicd〕binshxetmpjenkins246013519648603221。shexportKUBECONFIGkc1KUBECONFIGkc1kubectlsetimagedeploymentnginxdep192。168。26。56libraryblog:41nkubesystemdeployment。appsnginxdepimageupdatedFinished:SUCCESS9。访问hexo博客系统〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕kubectlgetdeployments。appsgrepnginxdepnginxdep222230h〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕kubectlgetpodsowidegrepnginxdepnginxdepbddfd9b5f94d8811Running0110s10。244。171。142vms82。liruilongs。github。iononenonenginxdepbddfd9b5fz57qc11Running035m10。244。171。177vms82。liruilongs。github。iononenone〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕kubectlgetsvcowidegrepnginxdepnginxdepNodePort10。106。217。50none8888:31964TCP30happnginx〔rootvms81。liruilongs。github。io〕〔ansiblek8sdeploycreate〕kubectldescribepodsnginxdepbddfd9b5f94d88Name:nginxdepbddfd9b5f94d88Namespace:kubesystemPriority:0Node:vms82。liruilongs。github。io192。168。26。82StartTime:Fri,04Feb202203:11:140800Labels:appnginxpodtemplatehashbddfd9b5fAnnotations:cni。projectcalico。orgpodIP:10。244。171。14232cni。projectcalico。orgpodIPs:10。244。171。14232Status:RunningIP:10。244。171。142IPs:IP:10。244。171。142ControlledBy:ReplicaSetnginxdepbddfd9b5fContainers:web:ContainerID:docker:669f48cb626d5067f40bb1aaa378268a7ee9879488b0b298a86271957c162316Image:192。168。26。56libraryblog:41ImageID:dockerpullable:192。168。26。56libraryblogsha256:c90b64945a8d063f7bcdcc39f00f91b6d83acafcd6b2ec6aba5b070474bafc37Port:noneHostPort:noneState:RunningStarted:Fri,04Feb202203:11:150800Ready:TrueRestartCount:0Requests:cpu:100mEnvironment:noneMounts:varrunsecretskubernetes。ioserviceaccountfromkubeapiaccesstrn5n(ro)Conditions:TypeStatusInitializedTrueReadyTrueContainersReadyTruePodScheduledTrueVolumes:kubeapiaccesstrn5n:Type:Projected(avolumethatcontainsinjecteddatafrommultiplesources)TokenExpirationSeconds:3607ConfigMapName:kuberootca。crtConfigMapOptional:nilDownwardAPI:trueQoSClass:BurstableNodeSelectors:noneTolerations:node。kubernetes。ionotready:NoExecuteopExistsfor300snode。kubernetes。iounreachable:NoExecuteopExistsfor300sEvents:TypeReasonAgeFromMessageNormalScheduled4m10sdefaultschedulerSuccessfullyassignedkubesystemnginxdepbddfd9b5f94d88tovms82。liruilongs。github。ioNormalPulling4m9skubeletPullingimage192。168。26。56libraryblog:41NormalPulled4m9skubeletSuccessfullypulledimage192。168。26。56libraryblog:41in67。814838msNormalCreated4m9skubeletCreatedcontainerwebNormalStarted4m9skubeletStartedcontainerweb 访问hexo博客系统