关于京东:是时候来薅京东的羊毛了自动化签到脚本

作者 | 弗拉德起源 | 弗拉德(公众号:fulade_me) 双十一刚刚过,置信很多小伙伴也都剁手了。往年电商平台同样给出了很多优惠。有些优惠,比方红包,是靠运气来取得的,然而还有一些优惠是靠长期保持能力取得。比方:签到、东东萌宠。每天都能保持签到诚然很棒,然而如果有脚本能够主动签到,那岂不是更美?主动签到脚本此脚本涵盖了目前京90%以上的签到工作,咱们只须要简略配置,每天定时触发,就能够签到,领奖品了。而且都是收费的。 运行环境node.jsServer酱(可选)获取京东Cookie这里以Chrome浏览器为例,Edge、360浏览器、QQ浏览器同样反对。 关上Chrome浏览的隐衷模式,输出https://m.jd.com/。按下键盘上的F12进入调试模式,抉择手机模式。如果没有登录就应用手机验证码形式登录(已登录,可疏忽),应用验证码登录获取的cookie无效时长30天左右,存活工夫更长。 登录胜利后,点击Network 而后点击箭头所指的这个按钮清理一下,因为网络申请太多了,不不便查看。清理完了之后,点击一下我的。 这个时候咱们找到一个log.gif?结尾的申请,点击它,就能够看到cookie字段了。 这样复制进去的cookie比拟长,咱们只须要pt_pin=xxxx;和 pt_key=xxxx;局部的内容即可(注:英文引号;是必要的)。能够用上面的脚本,间接在console外面输出上面脚本按enter回车键。 var CV = '单引号外面放下面拿到的cookie';var CookieValue = CV.match(/pt_pin=.+?;/) + CV.match(/pt_key=.+?;/);copy(CookieValue);这样子整顿出要害的的cookie曾经在你的剪贴板上,可间接粘贴。咱们先把它保留好,上面的步骤要用到。 配置 Server酱Server酱是一个收费的,能够推送音讯到咱们微信的服务。推送服务能够帮忙咱们每天察看签到的状况,如果出错了,能够及时调整。如果有的小伙伴不须要,可疏忽这个步骤,间接进入下一步。 关上主页 http://sc.ftqq.com/3.version,点击右上角登入 应用Github 受权,登录。输出账号密码即可。 登录胜利后点击微信推送并扫描二维码绑定微信应用手机关上微信,扫描屏幕上的二维码,如果未关注,先关注,而后再绑定即可。 绑定胜利后,点击右上方的发送音讯链接,就能够看到你本人的 key值,保留下来,前面会用到。当然你也能够在上面的在线发送工具测试推送是否失效。 配置本地代码应用git clone命令将https://github.com/Johnson8888/jd_sign_bot代码下载下来。下载实现后,咱们须要装置我的项目所须要的依赖。应用命令行工具(Mac下应用Termainal,Windows下应用PowerShell)进入到jd_sign_bot文件内。在命令行内输出 npm install --dependencies,期待运行实现。此时,我的项目文件夹内会多出一个 node_modules文件夹。 配置Cookies关上文件内的JD_DailyBonus.js文件,批改Key参数为刚刚获取到的cookies 配置Server酱关上文件内的app.js文件,批改serverJ参数为刚刚获取到的Server酱的key 执行签到进入到jd_sign_hot文件夹下,执行 node app.js即可签到!此时咱们的脚本在本地就曾经部署好了,如果你想更编辑,能够把代码部署到云服务器上,这样就不须要每天点击触发了。或者你也能够部署在本人的服务器上,每天定时执行。 你也能够 将脚本部署在腾讯云 · 云函数 上去到腾讯云函数地址,如果没有开明此服务的棘手开一下就能够了。 单击左侧导航栏函数服务,进入函数服务页面。 在页面上方抉择一个地区,最好抉择离你罕用地区近点的,不至于导致账号异样。单击新建。如下图所示: 在新建函数页面填写函数根底信息,单击下一步。如下图所示: 函数名称:能够自定义,比方为jd_sign。 运行环境:抉择 Nodejs 12.16。 创立形式:抉择 空白函数。确保环境为Nodejs 12.16,执行办法改为:index.main_handler,提交形式倡议选本地文件夹。 而后将方才下载并配置好的文件夹jd_sign_bot上传上来。(记得node_modules文件夹一并上传),完了后点击上面的高级设置。 内存用不了太大,64MB就够了(64M内存,收费时长6,400,000秒,内存与收费时长大抵关系能够参看云函数官网阐明),超时工夫改为最大的900秒,而后点击最上面的实现。 点击刚创立的函数 点击创立触发器 比方我填写的是 0 45 8 * * * *,每天上午8点45触发一次。腾讯云提供了相干配置Cron的文档,也有第三方测试工具。 ...

December 24, 2020 · 1 min · jiezi

用数据说话刘强东制造负熵增

“我们的盈利绝对不是减少投资,或把亏损业务砍掉所得到的。”——刘强东 作者 | 郭晓康来源 | 盒饭财经在经历了明尼苏达之殇后的刘强东又能松一口气了。 8月13日,京东集团发布了2019年第二季度业绩报告,四大核心指标全面飘红,多项数据创历史新高,就连常年亏损的京东物流也迎来了盈亏平衡点。 刘强东罕见地出席了财报发布后的电话会议,还特地强调,“我们的盈利绝对不是减少投资,或把亏损业务砍掉所得到的。” 京东通过Q2财报向外界秀肌肉,资本市场做出回应,Q2财报发布后,京东股价大涨12.89%,重新站上30美元。其实年初至今,京东的股价已经累计上涨超过50%。上周五(8月16日)京东股价大涨 3.75%,收盘于每股 31.29 美元,主要是受旗下合资企业“京东到家”正在筹备赴美 IPO 消息的刺激。 不过,这份漂亮财报背后,主要依靠盘活存量还是吸引增量,关系到其增长能否持续。 挤一挤总会有的京东Q2财报显示,Q2单季度营收1503亿元,超出分析师预期,为历史单季最高。在非美国通用会计准则下,京东已实现连续14个季度盈利,2019年Q2净利润为36亿元,同比增速644%,为历史新高。 ▲京东Q2财报数据(净收入同比增长表) 从2019年京东第一季度财报营收1211亿元,净利润33亿元,创下历史最高盈利记录,到Q2财报营收持续增长,净利润也同比暴涨之时。京东正在努力表达一个信号,京东是一家很能赚钱的公司。 刘强东经历了明尼苏达之殇后不再秀恩爱也不再出现在公众视野中,京东也四面楚歌了四五个月,但这两个季度的财报数据又让刘强东昂起头来。 可事实真的如此吗? 首先,第二季度京东实现了净收入1503亿元人民币,同比增长22.9%,虽然营收为历史单季最高,但从增速上来看,呈一路下滑的趋势,22.9的同比增速相对比Q1的20.9%已经有所回升,也不算很耀眼。 再者,Q2净利润36亿元同比增速为644%,看数字很吓人,但对比Q1净利润的33亿元,环比增速为9.1%,这其中还有京东“618”的加持。 不过,同比净利润增速644%远高于同比净收入增速22.9%,这个数据落差是如何来的呢? 从财报来看,第二季度电商业务为京东贡献1335亿元收入,占89%,包括物流在内的服务业收入占比不过11%。 从增速来看,京东物流业务Q2取得了98%的同比增速,电商业务仅仅实现了20.8%的同比增速,可喜的是,曾经的亏损钉子户京东物流迎来了盈亏平衡点。 在此背景下,电商业务不过是正常发挥,而Q2净利润环比暴增真正的功臣是,不再亏钱的物流业务。 从财报可以看到,与去年同期相比,本季度京东履约成本增速为6.1%,一般及行政费用同比增长了5.02%,也均远低于营收22.9%的增长速度。所谓“履约费用”,指从用户下单到商品配送再到售后服务全流程费用,即为完成整个销售动作所需要的全部费用,其中物流费用占大部分。 ▲京东履约成本同比增速表 而这是基于京东物流规模化效应的连锁反应,此指标的下降,意味着京东物流成本下降与效率提升,既让我们明白了京东物流实现盈亏平衡的原因,也一定程度上解释了京东集团利润为何超出了之前市场预期。 以京东集团的体量,履约费用即使下降1%,就意味着其可以节约数亿元的成本。 费用减少,勒紧裤腰带,是京东净利润增速远高于营收增速的主要原因,36亿的利润,有相当一部分来自降本增效。 杯酒释高管,挥泪斩兄弟除了业务上节流降成本,人事变革,薪酬调整在京东也掀起了血雨腥风。 在刘强东发生了明尼苏达事件之后,京东从历史最高值700多亿美元的市值直接跌落到谷底,整个集团都笼罩在阴沉的氛围中。 负面事件持续发酵,资本市场持续看瘪,京东面临上市以来最危急的时刻。 在2月中旬的京东集团开年大会上,京东宣布,“2019年将末位淘汰掉10%的副总裁级别以上的高管”,一时间舆论哗然。作为一家拥有18万员工的企业,京东此轮调整高管可能达到几十甚至上百人规模。 自此开始,人事大动荡。3月15日,京东宣布张晨卸任京东首席技术官;3月19日,京东宣布首席法务官隆雨,因为个人职业发展和家庭原因,提出辞职;4月4日,京东首席公共事务官蓝烨,碰巧也因为个人和家庭原因提出离职。 4月9日,京东两位高级副总裁——7FRESH事业部总裁王笑松和3C事业部总裁胡胜利也被调离原岗位,京东给出的理由是“核心高管轮岗计划”。 年会推杯换盏中宣布末尾淘汰制,后续马上有动作,铁腕强化了执行力。那段时间,京东股价因为人事地震不降反升,资本市场的反馈证明京东此举的正面效果。 在4月12日的公开信中,刘强东再次强调,“混日子的人不是我的兄弟,真正的兄弟一定是一起拼杀于江湖,一起承担责任和压力,一起享受成功成果的人。”在信中,刘强东还表示,京东已经四、五年没有实施末位淘汰制,人员急剧膨胀,混日子的人越来越多,这必须改变。 随着规模增长,一直毛巾拧水的京东,内部成本控制也遇到挑战。有京东高层透露,去年一年,京东光采购服务器的开支就高达80亿人民币。 如今不仅是高管流动,底层员工薪酬结构变化也是京东砍成本,提效率,增利润的手段。 曾有报道称,京东将取消旗下快递员的底薪,增加快递员收件任务,揽件数量将计入绩效考核,直接影响工资收入,还将快递员公积金系数从12%下调至7%,而以上举措极大可能会降低快递员的收入。 而北京不同片区的几位京东快递员均表示取消底薪和下调公积金的情况属实,并且与公司签订了相关文件。 4月15日凌晨,网传刘强东发内部邮件《致全体配送兄弟的一封信》。在信中刘强东表示,京东物流2018年全年亏损超过23个亿,这已经是第十二个年头亏损了。如果这么亏下去,京东物流融来的钱只够亏两年的!公司所做的这一切,只想让京东物流可以生存下去,只想让大家的日子过得更好、更加长久! 刘强东在内部信中表示,公司绝对不会取消配送员的五险一金,会对大家的未来负责;取消配送员底薪提高揽件提成,是为了让京东物流生存下去。 从财报中看,优化这一部分成本,多劳多得的方法是奏效的。 Q2财报中,物流及其他服务收入同比大幅增长98%,并首次实现盈亏平衡。 辞高管,大裁员,取消底薪降公积金比例,京东一系列降人力成本的手腕对第二季度36亿的利润功不可没。 投入技术与沉向低线如果说挤利润是为了现在财报好看,稳住资本市场,把形象危机中的京东拉回正轨,那加大技术投入和下沉市场布局,是为了长远发展。 在2017年的开年大会上,刘强东喊出,“未来12年京东只有三样东西:技术!技术!技术!” 在京东Q2财报上,技术研发投入同比增速为32.1%,高于营收增速。 ▲京东技术投入环比增长表 刘强东在京东二季度业绩电话会议上表示,我们会继续加大技术投资,比如会对人工智能、大数据、云计算继续持续性投资。 不难猜测,未来京东会继续追加技术研发投资。 而作为中国电商前三巨头的京东,自然不会放弃下沉市场,这从Q2财报上也有体现。 根据京东方面公布的数据显示,今年的京东618全球年中购物节期间,低线级市场下单金额同比增幅达全站2倍。 与此同时,京东也在下沉市场逐渐提升用户增长的效率。截至2019年6月30日,京东过去12个月活跃用户数增长至3.213亿,较上一季度环比增长了1080万。相比较,去年同期京东过去12个月活跃用户数为3.138亿。 在京东的财报分析会上,刘强东、京东零售集团轮值CEO徐雷均着重强调了低线市场。 刘强东在解释履约成本率下降的原因时表示,四年前让京东物流大举进入3-6线城市,刚刚开始,订单密度较小,因此物流成本较高,随着低线城市拓展结束,特别是大量外部订单进入,导致物流成本大幅度下降。 而据徐雷透露,京东目前来自于三至六线城市的用户增速高于一二线城市,尤其是在新用户当中,有将近七成是来自于低线城市的。徐雷称,按照收货地址去看,整体用户中超过一半是来自于低线城市。 今年从4月开始,京东相继入股五星电器;收购迪信通9%的股份;投资生活无忧;领投新潮传媒10亿元融资,这都是在面向低线市场布局。 根据京东方面的表述,在今年十一前后,京东会升级与腾讯合作的微信一级入口的资源,打造一个针对微信的生态,尤其是女性和低线市场的一个新的模式,这也有利于是获得低成本流量的动作。 ...

August 20, 2019 · 1 min · jiezi

干货-京东云弹性伸缩功能实践

弹性伸缩AS(Auto Scaling)是一项 Web服务,可以根据您的业务需求和策略,自动调整云主机计算资源,可帮助确保您拥有适量的云主机实例来处理您的应用程序负载。使用 AS 进行容量调整,您只需事先设置好扩容条件及缩容条件,AS 会在达到条件时自动增加/减少使用的服务器数量以维护性能: 在业务需求增长时无缝地增加主机实例。在业务需求下降时自动减少主机实例以节约成本 产品简介弹性伸缩是一项按需自动调整云主机规模的服务,能够及时有效地应对客户业务出现剧烈波动的情形。根据客户不同业务特点,采用不同的伸缩模式,在降低客户业务成本的同时提高业务能力,充分体现了云计算平台弹性灵活的特点。 名词术语伸缩组:伸缩组是遵循相同规则、面向同一场景的云主机实例的集合。伸缩组定义了组内云主机实例数的最大值、最小值及其相关联的负载均衡实例等属性。 启动配置:启动配置是自动创建云服务器的模版,其中包括镜像、云服务器实例规格、系统盘及数据盘类型和容量、密钥等。创建伸缩组时必须指定启动配置,启动配置一经创建后其属性将不能编辑。 伸缩策略:即执行伸缩动作的条件。触发条件可以是云监控的报警或时间,动作可以是移出或加入云主机。 伸缩策略有以下两种: 定时伸缩策略 到达某个固定时间点,自动增加或减少云主机实例,支持周期性重复。告警伸缩 基于云监控指标(如CPU、内存、网络流量等),自动增加或减少云主机实例。伸缩活动:伸缩策略成功触发后,就会产生一条伸缩活动。伸缩活动主要用来描述伸缩组内云主机实例的变化情况。 冷却时间:冷却时间是指在同一个伸缩组内,一个伸缩活动执行完成后的一段锁定时间。冷却时间可指定范围为 0-86400(秒)。 使用场景Web应用服务:web服务业务逻辑层扩缩容。比如电商网站、视频网站、在线教育等,客户端的请求通过负载均衡到达应用服务器,当业务访问量大幅快速波动时,弹性伸缩服务可以根据请求量及负载弹性扩缩应用服务器的数量。 高性能计算:服务的计算节点扩缩容。分布式大数据的计算节点、数据处理等后端计算集群,根据计算量大小实时调整集群服务器数量,或者根据集群预定好的脚本执行时间来设定周期性定时任务,在脚本执行之前自动创建一批主机,保证高效的运算业务。 数据收集检索:时效性业务扩缩容。用于发送请求、数据收集、检索等业务服务器集群的部署,可通过弹性伸缩服务快速完成扩缩任务供业务使用。 操作实践1、操作流程: 测试AZ:华北-北京-可用区C 模拟场景:2台Apache服务器组成Web服务集群,前端通过LB做流量的分发;配置弹性伸缩策略,实现某台服务器CPU使用率>70%时自动扩容1台服务器,平均CPU使用率<40%时自动减少1台服务器。 2、测试步骤: 第一步:登录控制台使用已注册的京东云账号登录控制台 第二步:创建启动配置在控制台左侧功能导航栏选择“弹性计算”->“弹性伸缩”->“启动配置”->“创建” 设置配置名称,在“镜像”中选择“私有镜像”(“私有镜像”是通过创建好的云主机并部署完应用及完成配置制作的云主机镜像);配置的规格可以根据实际情况调整(CPU,内存,存储,带宽);创建完成后点击保存。 第三步:创建配置伸缩组初始实例数设定后系统会自动根据设定的数量从启动配置自动创建相应数量的云主机可支持跨可用区创建,达到容灾的效果;负载均衡设置绑定已创建的LB实例并选择对应的虚拟服务器做及配置好监听端口。 第四步:绑定云主机 按需添加云主机,数量必须在伸缩组设定的最小和最大实例数之间 第五步:添加告警策略创建“弹性伸”策略和“弹性缩”策略 支持定时任务和重复任务,增加和减少的设置需要配对使用。 第六步:添加告警联系人 “账号管理”->“联系人管理”中的联系人和联系组信息会自动被识别,添加相关组和联系人后,伸缩组发生启动,终止,无法启动,无法终止时会有邮件和短信及时进行通知 3、验证试验结果: 用原生centos自带工具,方法是通过压缩随机数据并将结果发送到 /dev/null在第一台Apache服务器运行如下命令: cat /dev/urandom | gzip -9 > /dev/nullCPU使用率到达99%。 成功弹出一台云主机;使用Ctrl+C结束加压命令后,CPU使用率降低;观察伸缩活动的日志,发现已自动移出新增的云主机,成功移除。 点击→"京东云"了解更多详情

June 25, 2019 · 1 min · jiezi

编程语言王国的唯一王者

在撰写本文前,我搜索了“我应该学习哪种编程语言”这个词条,发现会产生5.17亿个结果。而每个页面都在滔滔不绝地介绍某种语言相对于其他语言的优势,其中90%会推荐Python或JavaScript。 恕我直言,我并不认同这5.17亿个搜索结果,并建议你最应该学习的第一种编程语言——逻辑。 知道如何编写代码已经不再是一种优势了。市场上充斥着各种培训机构、学习班培训出来的人员,“初级软件开发人员”的职位已经不复存在。要想在今天的市场上取得成功,你不但需要知道如何编码,并且还需要学会运用逻辑思维模式。 1.我的第一节计算机科学课我第一次接触“计算机科学”是在我十年级的选修课。上课第一天,我欣喜地看到我面前有各种各样的冰淇淋和各种圣代配料。在我们都坐下之后,我的老师宣布: “今天,我们要制作圣代。有一个条件:你必须写一份关于如何准备圣代的具体说明,然后我就会照着做。” 当然没问题,我想,这简直是一件轻而易举的事儿。然后在不到一分钟的时间里,我就草草记下了一套“完美”的圣代制作指南: 然后,我的“老师”(嗯,我愿意用这个可爱的比喻称呼我电脑)做出了我所见过的最准确的讽刺表演——她开始恶狠狠地戳冰淇淋盒盖,但无法穿透它坚硬的外表。 “好吧,首先取下盖子,”我说,仿佛急切地想要享受一顿美食。 “你没有向我提供那些指示,所以,很不幸,没能给你做一个圣代,下一个!” 2.快进到#2号尝试 这次我确信我有打开盒盖这个条件了。我甚至在添加每个项目到我的杰作前,就已经确保它们都被打开了。 她打开盖子,舀了三勺黑莓冰淇淋,把它们放进碗里。从这一步看,起码我的新生圣代开始诞生了。 紧接着,她打开热巧克力,把两个汤匙放入我的碗里。不是两汤匙的热巧克力,请注意——是两个现实中的汤匙,没有热巧克力。 看起来我又一次没做到给予足够具体的指令! 当全部都完成之后,我得到了一碗冰淇淋,上面放着两个金属勺子、一坨鲜奶油和大约300片糖屑。 到这个时候,我终于明白了:计算机是一个纯粹的逻辑实体。它没有上下文,也没有假设。它对一组非常具体的指令做出响应,并最终在Terminal中运行。 我最终制定的冗长却必要的圣代制作指南: 最后一个步骤非常重要,因为如果没有这个步骤她将会开始吃掉我的圣代。 这就是计算机编程的现实情景。请为计算机提供密集的详细指令集。本质上来说,这就是所有编程语言分解成的指令。 3.软件开发职业道路软件开发现在已经到了不能作为一个单独的行业来讨论的地步,就像“软件开发人员”这个职位名称太宽泛一样。两名开发人员在拥有不连贯的技能集的情况下可以看作是具有相同市场竞争力,这意味着在开发中,职业生涯不仅仅是取决于编码的能力。熟练的开发人员拥有一种与编程无关的通用属性——逻辑。 最好的开发者是批判性思维的专家。这是至关重要的,因为大多数软件项目都是没有文档记录的、支离破碎的灾难。它们需要一个批判性的思考者来拼凑信息,并在需要的时候填补空白。落后的开发者是那些不能将这些点连接起来的开发人员。 所有这一切都归结于另一个大胆的声明: 计算机科学的基本原理对于编码能力是至关重要的,而且将永远是至关重要的。 流行语言随潮流而变化。框架变得过时,企业通过混合技术来应对不断变化的需求。唯一不变的是什么?基本原理——这就是他们的定义! 4.如何提高逻辑思维对于那些无法深入思考的人来说,请考虑使用这些工具来提高您的编程批判性思维: 了解您的运行时间复杂度 程序的运行时间复杂度也称为Big-O ,可以表示为在任何实例上执行的与输入大小(n)相关的步骤的数量。首先,请始终监视您的程序的运行时间。 了解您的数据结构 数据结构是每个复杂程序的核心。知道在什么场景中使用哪种结构本身就是一门艺术。数据结构与运行时间复杂度直接相关,因为选择错误的结构会使程序陷入停顿。数组查找是 O(n) ,这意味着随着输入的大小增加,使用数组的开销也会增加。散列查找O(1),因此无论所述散列中的键数是多少,散列键的查找时间都将是恒定的。 我曾经有一些候选人认为数组的搜索时间比散列更快。这就是一个警告我不要雇佣他们的直接信号——因此,请了解你的数据结构。 读/看/听 像Udemy,Pluralsight和CodeAcademy等网站是学习一门新的编程语言的绝佳资源。要了解基础知识,请参阅有关通用工程概念、最佳实践和编码风格的书籍。工程师们最强烈推荐的书籍是《Design Patterns》,《Refactoring, Code Complete, Clean Code》, 和 《The Pragmatic Programmer》等。最后,每个工程师都应该在他们的办公桌上保留一份《Introduction to Algorithms》,并妥善保存。 实践! 不曾疯狂练习拉小提琴,就不可能成为一名小提琴大师。像HackerRank,CodeWars,CoderByte,TopCoder和LeetCode这样的网站上有成千上万个挑战问题,旨在测试您对数据结构和算法的了解。我发现使用这些网站的最佳方法是自己尝试解决问题,并将解决方案放在Github上,然后查看该问题的顶级解决方案,看看其他人是如何解决的。这就引出了我的最后一点建议: 查看其他人的代码 在软件开发过程中,您可能犯的最大错误就是单独行动。软件开发在很大程度上是一项众包工作。我们一起建立标准,一起犯错误,并随着时间的推移(通过多次失败)来学习什么是有效的。花时间阅读熟练的开发人员的代码总是有回报的。只要确保它是好的代码。 我能给你留下的最好建议就是永远不要为你所知道的事情感到羞耻。正如我所提到的,这个行业规模庞大,有着庞大到可怕的语言,内容密集。需要花费大量的时间和精力来进行理解和学习。获得熟练则需要更多的努力,并且需要花费更多的精力来达到精通。 当我到达那里时,我会告诉你的。 扫码关注京东云开发者社区,每天都有精彩行业信息哦!

June 25, 2019 · 1 min · jiezi

干货-京东云应用负载均衡ALB多功能实操

应用负载均衡(Application LoadBalancer,简称ALB)是京东云自主研发的一款七层负载均衡产品,主要面向HTTP和HTTPS流量的WEB应用程序,提供灵活的功能配置。应用负载均衡在请求级别运行,可以为应用层业务提供更加出色的服务。一、实操说明自动伸缩功能将搭配京东云弹性伸缩产品与云主机进行实操,然后通过京东云应用型负载均衡(ALB)进行请求的分发; 会话保持/3种调度策略/健康检查功能将会利用京东云应用型负载均衡支持原生容器的特性进行实操; 二、环境搭建1. 新建应用负载均衡(ALB) 打开京东云控制台:https://console.jdcloud.com/ 在左侧导航中找到网络-负载均衡,如图在华北-北京新建应用型负载均衡实例 如图,选择应用负载均衡后,点击确定 配置如下: 计费类型:按配置地域和可用区:华北-北京、可用区选择全部网络:选择自己创建的私有网络,安全组开放全部端口(主要用于测试,生产环境请按照实际情况开放特定端口)带宽:1Mbps名称:alb_test 在负载均衡产品控制台点击上述我们创建的应用型负载均衡实例alb_test 点击虚拟服务器组-新建虚拟服务器组 分组名称server_group(暂不添加后端服务器实例) 2.制作自定义镜像 为方便后续操作,本步骤我们需要有一个安装有Nginx服务的Centos 7.4的自定义镜像首先创建云主机(制作完就可以删除了); 制作自定义镜像环境建议配置如下: 计费类型:按配置地域:华北-北京,可用区随意镜像:官方-Centos 7.4 64位规格:通用 标准型 1核4GB存储:默认网络:选择自己创建的私有网络,为方便测试,安全组选择默认安全组开放全部端口带宽:1Mbps名称:buildimg(自定义) 创建完云主机后,SSH远程连接,执行如下脚本 安装Nginx+PHP服务脚本: 1 \wget -O - https://pocenv-hcc.s3.cn-north-1.jdcloud-oss.com/JDCloud_LNP_test_Marin.Han.sh | bash 脚本执行完成后,我们开始制作镜像,在云主机实例控制台找到我们创建的云主机将其停止 停止成功后,我们点击右侧更多选项,点击制作镜像 信息如下: 名称:LNP_Centos7描述:包含Nginx+PHP的Centos7.4 64位镜像 定义镜像创建完成后,我们上面创建的云主机就可以删除了 云主机删除成功后,其绑定的公网IP不会被自动删除,我们需要手动删除,在左侧导航网络-私有网络-弹性公网IP,找到对应的公网IP删除 3. 新建弹性伸缩 在京东云控制台找到弹性伸缩产品页面,找到启动配置选项,在华北-北京地域创建启动配置,配置信息如下: 配置名称:JAS_test地域:华北-北京镜像类型:私有私有镜像:选择我们上面创建的私有镜像LNP_Centos7规格类型:1核4GB存储:默认带宽:点击暂不购买 完成启动配置的创建后,左侧点击伸缩组,同样在华北-北京区域创建伸缩组,配置信息如下: 名称:JAS_group初始实例数:1,在1-2个实例之间进行扩展启动配置:选择上面创建好的启动配置选择网络:选择你创建的VPC网络(选择你上面创建负载均衡所在的VPC)安全组:为方便测试,选择默认安全组开放全部端口支持可用区:选择全部可用区移出策略:为效果明显,我们选择移出最早创建的云主机(默认移出策略:移出指定数量云主机并让组内剩余云主机在物理位置上尽可能均衡分布。)负载均衡:从负载均衡接收流量,选择你上面创建的负载均衡alb_test和虚拟服务器组server_group,端口80 由于我们设置的弹性伸缩初始实例数为1,所以在保存伸缩配置后会根据启动配置自动生成1台云主机(为方便观察效果,这里记录下内网IP:10.0.0.59) 在伸缩组-伸缩活动中也可以查看到伸缩记录 ...

June 25, 2019 · 1 min · jiezi

干货-IP高防使用配置

一、知识简介DoS(Denial of Service),即拒绝服务攻击。该攻击是利用目标系统网络服务功能缺陷或者直接消耗其系统资源,目的是使该目标客户的系统不可用,无法提供正常的服务。 DDoS(Distributed Denial of Service attack),即分布式拒绝服务攻击。是指借助于黑客技术,将多个计算机联合起来变为“僵尸主机”,联合起来对一个或多个目标发动DDoS攻击,以成倍地拒绝服务攻击威力,使受害者无法提供网络服务。 CNAME:别名记录。即实现将一个域名解析到另外的一个域名,CNAME可将多个主机名指向一个别名,从而实现快速地变更IP地址。 黑洞:黑洞是指服务器所受攻击流量超过用户购买高防的套餐防护上限时,京东云IP高防将屏蔽服务器的外网访问。 IP高防原理及示意图: 用户开通IP高防服务,配置将用户访问的IP地址引流到高防服务提供的IP地址上,经过IP高防服务对所有异常流量的实时检测和清洗,确保仅正常流量可回源到用户服务器,从而保证了源站的稳定可靠。 IP高防实例 IP高防实例是京东云提供给客户的一种安全防护服务,客户可以在IP高防实例上配置各种防护的配置,规则,例如购买高防的防护能力,从10G到400G以抵御不同攻击的规模;转发的规则,例如回源的规则;黑白名单 弹性防护 京东云IP高防的计费项有三个:保底防护带宽、业务带宽、弹性防护带宽保底防护带宽:指购买的单位时间内,提供的固定攻击防护峰值,单位为Gbps。业务带宽:指非 DDoS 攻击状态下的正常业务消耗带宽,单位为Mbps。默认赠送100Mbps,可根据需要购买更大的业务带宽。(高防到客户源站的带宽)弹性防护带宽:超过保底防护,按照所在的最大弹性计费区间,生成的费用,单位为Gbps。 例如:保底防护带宽 10G + 业务带宽 100M + 弹性防护带宽 弹性防护带宽 如果是 0G,代表没有没有弹性,如果被攻击的流量超过10G,将触发黑洞,服务器的所有访问将被屏蔽。IP高防默认的黑洞策略是封禁2小时,如果2小时内该服务器不再遭受攻击,将自动解封。如果攻击流量过大,触发了运营商的封禁,解封时长将由运营商的策略决定,时长不确定 弹性防护带宽 如果是 10G,代表被攻击的流量可以达到 20G(弹性防护是按天后付费) 二、IP高防使用配置流程配置网站(备案) 注意:正式的网站上线需要先做备案的。 京东云IP高防只针对做过备案的域名提供服务,所以需要首先对域名进行备案 2.1.1登录京东云,选择“备案” 2.1.2“开始备案” 2.1.3填写备案信息,然后“验证” 2.1.4输入主体信息,然后“下一步” 2.1.5填写网站信息,然后“下一步” 2.1.6上传个人资料,然后“下一步” 2.1.7提交信息 2.1.8 提示后,“继续提交” 2.1.9 完成备案信息的提交(京东云将在1个工作日内完成备案初审审核) 在控制台可以看到备案网站的信息 2.1.10 需要上传蓝底的照片 2.1.11 以上步骤都执行完成以后,备案会提交到工信部审核,大概需要等20个工作日 2.1.12 工信部审核通过以后,相应的人即备案的时候提交了谁的信息,谁就会收到工信部确认通过的短信,和邮件。 创建IP高防实例 ...

June 18, 2019 · 1 min · jiezi

干货-TiDB-Operator实践

K8s和TiDB都是目前开源社区中活跃的开源产品,TiDBOperator项目是一个在K8s上编排管理TiDB集群的项目。本文详细记录了部署K8s及install TiDBOperator的详细实施过程,希望能对刚"入坑"的同学有所帮助。一、环境Ubuntu 16.04K8s 1.14.1 二、Kubespray安装K8s配置免密登录1 yum -y install expectvi /tmp/autocopy.exp 1 #!/usr/bin/expect 2 3 set timeout 4 set user_hostname [lindex $argv ] 5 set password [lindex $argv ] 6 spawn ssh-copy-id $user_hostname 7 expect { 8 "(yes/no)?" 9 {10 send "yes\n"11 expect "*assword:" { send "$password\n"}12 }13 "*assword:"14 {15 send "$password\n"16 }17 }18 expect eof 1 ssh-keyscan addedip >> ~/.ssh/known_hosts 2 3 ssh-keygen -t rsa -P '' 4 5 for i in 10.0.0.{31,32,33,40,10,20,50}; do ssh-keyscan $i >> ~/.ssh/known_hosts ; done 6 7 /tmp/autocopy.exp root@addeip 8 ssh-copy-id addedip 910 /tmp/autocopy.exp root@10.0.0.3111 /tmp/autocopy.exp root@10.0.0.3212 /tmp/autocopy.exp root@10.0.0.3313 /tmp/autocopy.exp root@10.0.0.4014 /tmp/autocopy.exp root@10.0.0.1015 /tmp/autocopy.exp root@10.0.0.2016 /tmp/autocopy.exp root@10.0.0.50配置Kubespray1 pip install -r requirements.txt2 cp -rfp inventory/sample inventory/myclusterinventory/mycluster/inventory.iniinventory/mycluster/inventory.ini 1 # ## Configure 'ip' variable to bind kubernetes services on a 2 # ## different ip than the default iface 3 # ## We should set etcd_member_name for etcd cluster. The node that is not a etcd member do not need to set the value, or can set the empty string value. 4 [all] 5 # node1 ansible_host=95.54.0.12 # ip=10.3.0.1 etcd_member_name=etcd1 6 # node2 ansible_host=95.54.0.13 # ip=10.3.0.2 etcd_member_name=etcd2 7 # node3 ansible_host=95.54.0.14 # ip=10.3.0.3 etcd_member_name=etcd3 8 # node4 ansible_host=95.54.0.15 # ip=10.3.0.4 etcd_member_name=etcd4 9 # node5 ansible_host=95.54.0.16 # ip=10.3.0.5 etcd_member_name=etcd510 # node6 ansible_host=95.54.0.17 # ip=10.3.0.6 etcd_member_name=etcd611 etcd1 ansible_host=10.0.0.31 etcd_member_name=etcd112 etcd2 ansible_host=10.0.0.32 etcd_member_name=etcd213 etcd3 ansible_host=10.0.0.33 etcd_member_name=etcd314 master1 ansible_host=10.0.0.4015 node1 ansible_host=10.0.0.1016 node2 ansible_host=10.0.0.2017 node3 ansible_host=10.0.0.501819 # ## configure a bastion host if your nodes are not directly reachable20 # bastion ansible_host=x.x.x.x ansible_user=some_user2122 [kube-master]23 # node124 # node225 master126 [etcd]27 # node128 # node229 # node330 etcd131 etcd232 etcd33334 [kube-node]35 # node236 # node337 # node438 # node539 # node640 node141 node242 node34344 [k8s-cluster:children]45 kube-master46 kube-node节点所需镜像的文件由于某些镜像国内无法访问需要现将镜像通过代理下载到本地然后上传到本地镜像仓库或DockerHub,同时修改配置文件,个别组件存放位置https://storage.googleapis.com,需要新建Nginx服务器分发文件。 ...

June 11, 2019 · 5 min · jiezi

京东云618年中大促开始啦

618,全球年中购物节 618,粉丝狂欢节 618,玩购趴 ???? 一年一度的618大促开始啦!???? 京东云618,疯狂大促,云产品全场低至1折,云主机限量秒杀,首购云产品1折起;还有超级送京豆福利, 20倍京豆送不停;更有消费赢锦鲤,AI产品免费送。 扶好眼镜仔细看 AI从梦想照进现实,京东云开启高性能异构计算新时代   如果错过了昨天,一定要抓住今天 8折?NO! 5折?NO! 京东云618只要1折 ????  云主机限量1折秒杀,每日10:00开抢 ???? 别眨眼,还有还有 上云一时爽,一直上云一直爽 首购福利! 首购福利! 首购福利! ????  云产品首购1折起  ????  100京豆可抵1元使用,赤裸裸的money啊 ????  消费返20倍京豆,疯狂派送10,000,000京豆  ???? 如果消费满1500元,就送30000京豆,可以抵300元使用,能买多少包辣条啊!!!  ????  AI实物产品免费送</u> ???? 只要买的多,奖品是你的 累计消费top1-3名,送价值799元叮咚2代人工智能音响一台 累计消费top4-10名,送价值399元叮咚TOP语音智能助手一台 域名 .cn域名特价9元抢注,更多域名直降26元! Plus短信 短信限时2折!仅需0.006元/条 IP查询 智能防爬虫,保护网站安全!0.01元1000次,限前10名 人脸识别 AI智能来刷脸!0.01元5次,限前2000名 点击进入京东云618大促会场

May 28, 2019 · 1 min · jiezi

京东网络开放之路自研交换机探索与实践

相比传统商业交换机,白盒交换机具有更好的开放性和灵活性,解决了运维管理方面的诸多痛点,随着SONiC的不断完善和白盒交换机市场的成熟,京东基于SONiC研发了自己的白盒交换机,更加适合京东数据中心的应用场景,为整体基础设施提供更好的服务和支持。白盒交换机的出现自从软件定义网络(SDN)出现以后,市场对白盒交换机的需求越来越大,特别是超大规模云服务提供商的出现,其自建云数据中心将需要大量的白盒交换机。白盒交换是SDN的副产品,它是将物理网络交换机硬件和网络操作系统(NOS)进行解耦的结果。 白盒交换机主要可分为支持OpenFlow协议的OpenFlow白盒交换机和裸白盒交换机。其中,OpenFlow白盒交换硬件开放程度并不高,其网络操作系统往往也被厂商绑定,相对比较封闭,该类交换机通过支持主流的OpenFlow协议如OpenFlow1.3版本,连接控制器实现SDN网络的转发与控制分离。OpenFlow交换机只负责根据OpenFlow流表进行匹配转发,本身没有控制功能,所以也可以被称为白盒。 目前,白盒交换机产业打造出了一个相对完整的生态圈。通过通用的硬件设备,消除对特定厂商的依赖,降低成本。通过开放的软件,增强网络的灵活性与敏捷性。 自研交换机探索与实践——JDNOSSONiC(Software for Open Networking in the Cloud),是由微软主导的一款开源交换机操作系统。该系统由多个容器化组件组成,这样一种创新方案使得增加新的组件和功能变得非常方便。 SONiC引入了Redis数据库,存储配置数据及运行状态,提高了数据的可视化,大大降低了定位解决问题的难度。进程故障的时候,交换芯片继续保持转发,进程恢复后从数据库重新获取状态继续运行,不但可以保障系统的稳定运行,还可以实现单进程升级功能。 SONiC定义了SAI(Switch Abstraction Interface),这是一套独立于硬件平台的交换机芯片控制抽象接口。SAI的存在使得SONiC可以支持多个厂商的芯片,只需关注上层网络应用,不需要考虑各芯片SDK的差异性。 京东云基于SONiC架构,开发了适用于京东数据中心场景的交换机操作系统JDNOS。 配置平台优化在网络中运行的交换机,通常是设备商提供的,专有且闭源。由于不同商业交换机的命令行和配置方式都不相同,监控接口标准不统一等因素,给网络运维带来了很大的复杂性,而且不便于管理。 针对以上问题,JDNOS自研统一配置平台定义了统一的配置模型,实现了配置管理的统一化和标准化,大大提升了运维效率。 ARP协议针对TOR的应用场景,尤其是去堆叠方案,JDNOS改进了原SONiC的ARP实现,增加了ARP探测,可以做到秒级的ARP探活。SONiC中上层软件ARP表项是从kernel中获取,JDNOS的方案中,上层ARP表项状态是单独维护的,并反过来控制kernel中的ARP状态。对链路异常,MAC老化等事件,可以做到ARP快速探测,转发快速收敛。 上线策略JDNOS的上线采用了异构去堆叠方案(具体方案可参考《异构去堆叠 | 一种完美提升网络高可用SLA的方案》) 交换机完全独立,支持异构,完全解耦降低上线风险,增强可靠性推动自研交换机快速上线硬件组件接口标准化JDNOS需要适配多家ODM/OEM硬件厂商的白盒交换机。针对每家厂商硬件各组件驱动实现方式的差异性,JDNOS定义了统一的sysfs接口,监控并控制各硬件组件。针对数据中心对光模块的高规格监控需求,JDNOS定义了详细的光模块信息接口,如电源、电压、温度、功率以及各项阈值等,以及风扇、电源、各传感器温度等相关接口,实时监控其状态,出现异常的情况下能及时告警,并上报监控系统。 自主研发监控内容JDNOS支持Telemetry,由于Telemetry可以实现主动推送任何需要监控的系统运行状态到监控服务器,因此代替了原有的SNMP、日志等的方式,实现监控的统一化,同时也带来了更高的效率。JDNOS将更多的监控内容写入数据库,供telemetry实时采集并推送,给监控提供更精细的诊断探测。 结语未来我们即将上线自动化部署服务,更好提升效率;支持warm reboot,软件升级不中断业务;继续丰富完善监控内容,支持网络可视化;对LEAF交换机的研发部署;对特定场景的功能支持,例如RDMA,EVPN,SR等;对于京东,自研交换机属于起步阶段,我们也在不断尝试和探索,积累储备,为技术的标准化和降低运维成本做出自己的贡献,努力做出更好的产品, 通过技术驱动和创新,为业务带来更大的价值。

May 22, 2019 · 1 min · jiezi

如何在京东云上简单实践CI流程

在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要。目前已经形成一套标准的流程,最重要的组成部分就是持续集成及持续交付、部署。在此,我们在京东云上以一个案例简单实践下 CI 流程。在初探前,我们有几个概念和工具需要了解下:1)、CI/CD:持续集成(Continuous Integration,CI),它属于开发人员的自动化流程。成功的 CI 意味着应用代码的新更改会定期构建、测试并合并到共享存储库中。该解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题。持续交付(Continuous Delivery,CD),通常是指开发人员对应用的更改会自动进行错误测试并上传到存储库(如 GitHub 或容器注册表),然后由运维团队将其部署到实时生产环境中。这旨在解决开发和运维团队之间可见性及沟通较差的问题。因此,持续交付的目的就是确保尽可能减少部署新代码时所需的工作量。持续部署(Continuous Deployment,CD),这是另一种“CD”,指的是自动将开发人员的更改从存储库发布到生产环境,以供客户使用。它主要为了解决因手动流程降低应用交付速度,从而使运维团队超负荷的问题。2)、Jenkins:Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。3)、Docker:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。4)、Git:Git(读音为/gt/),是一个开源的分布式版本控制系统,提供代码仓库,可以有效、高速地处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。CI流程设计图:工作流程:开发人员提交代码到Git版本仓库;Jenkins人工/定时触发项目构建;Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;Jenkins在Docker主机创建容器并发布主机环境规划:docker-jenkins:构建;拉取代码、代码编码、打包镜像、推送镜像到镜像仓库 116.196.85.174(公) 10.0.0.20 (内)docker-git:代码仓库 116.196.86.207(公) 10.0.0.22 (内)docker-harbor:私有镜像仓库 116.196.88.91(公) 10.0.0.21 (内)buildimage:build docker镜像 116.196.89.139(公) 10.0.0.4 (内)一、主机创建在京东云控制台创建4台云主机,地址:https://console.jdcloud.com/配置如下,购买时数量直接选择4,购买完成后再修改名称,分别为:docker-jenkins、docker-git、docker-harbor、buildimage创建修改名称后如下:二、环境配置1、云主机docker-git1.1. 修改主机名为:docker-git[root@112 ~]# hostnamectl set-hostname docker-git[root@112 ~]# hostname docker-git[root@112 ~]# logout[root@docker-git ~]#Ctrl+D退出后重新登陆生效1.2. 部署Git代码版本仓库安装:[root@docker-git ~]# yum install git -y配置git用户:[root@docker-git ~]# useradd git[root@docker-git ~]# passwd git创建库:[root@docker-git ~]# su git[git@docker-git root]$ cd[git@docker-git ~]$ mkdir tomcat-java-demo.git[git@docker-git ~]$ cd tomcat-java-demo.git/[git@docker-git tomcat-java-demo.git]$ git –bare initInitialized empty Git repository in /home/git/tomcat-java-demo.git/[git@docker-git tomcat-java-demo.git]$ lsbranches config description HEAD hooks info objects refs[git@docker-git tomcat-java-demo.git]$ 2、云主机docker-jenkins2.1. 修改主机名为:docker-jenkins[root@113 ~]# hostnamectl set-hostname docker-jenkins[root@113 ~]# hostname docker-jenkins[root@113 ~]# logout[root@docker-jenkins ~]#Ctrl+D退出后重新登陆生效2.2. jenkins环境部署部署jdk环境及maven[root@docker-jenkins tomcat-java-demo]# cd[root@docker-jenkins ]# mkdir tools[root@docker-jenkins ]# cd tools[root@docker-jenkins tools]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/jdk-8u191-linux-x64.tar.gz;tar zxf jdk-8u191-linux-x64.tar.gz;mv jdk1.8.0_191/ /usr/local/;ln -s /usr/local/jdk1.8.0_191/ /usr/local/jdk;[root@docker-jenkins tools]# vim /etc/profile######## JDK #######JAVA_HOME=/usr/local/jdk1.8.0_191JAVA_BIN=/usr/local/jdk1.8.0_191/binPATH=$PATH:$JAVA_BINCLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport JAVA_HOME JAVA_BIN PATH CLASSPATH[root@docker-jenkins tools]# source /etc/profile[root@docker-jenkins tools]# java -versionjava version “1.8.0_191"Java(TM) SE Runtime Environment (build 1.8.0_191-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode) [root@docker-jenkins tools]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/apache-maven-3.5.0-bin.tar.gz;tar zxf apache-maven-3.5.0-bin.tar.gz;mv apache-maven-3.5.0 /usr/local/maven[root@docker-jenkins tools]# 安装Jenkins,下载Tomcat二进制包将war包到webapps下即可:[root@docker-jenkins tools]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/jenkins.war[root@docker-jenkins tools]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/apache-tomcat-8.5.38.tar.gz[root@docker-jenkins tools]# tar zxf apache-tomcat-8.5.38.tar.gz[root@docker-jenkins tools]# lsapache-maven-3.5.0-bin.tar.gz apache-tomcat-8.5.38 apache-tomcat-8.5.38.tar.gz jdk-8u191-linux-x64.tar.gz jenkins.war[root@docker-jenkins tools]# mv apache-tomcat-8.5.38 /usr/local/tomcat-jenkins[root@docker-jenkins tools]# ls /usr/local/tomcat-jenkins/webapps/docs examples host-manager manager ROOT[root@docker-jenkins tools]# rm -rf /usr/local/tomcat-jenkins/webapps/*[root@docker-jenkins tools]# mv jenkins.war /usr/local/tomcat-jenkins/webapps/ROOT.war[root@docker-jenkins tools]# ll /usr/local/tomcat-jenkins/webapps/total 75520-rw-r–r–. 1 root root 77330344 Mar 15 00:55 ROOT.war[root@docker-jenkins tools]# cd /usr/local/tomcat-jenkins/bin/[root@docker-jenkins bin]# ./startup.shUsing CATALINA_BASE: /usr/local/tomcat-jenkinsUsing CATALINA_HOME: /usr/local/tomcat-jenkinsUsing CATALINA_TMPDIR: /usr/local/tomcat-jenkins/tempUsing JRE_HOME: /usr/local/jdk1.8Using CLASSPATH: /usr/local/tomcat-jenkins/bin/bootstrap.jar:/usr/local/tomcat-jenkins/bin/tomcat-juli.jarTomcat started.[root@docker-jenkins bin]#启动后,浏览器访问(docker-jenkins):http://Jenkins主机公网IP:8080/,按提示输入密码,登录即可。在/root/.jenkins/secrets/initialAdminPassword文件里,查看密码后填入即可按照你自己的需求安装插件设置管理员开始使用Jenkins2.3. 安装DOCKER CE安装所需包yum install -y yum-utils device-mapper-persistent-data lvm2 -y设置稳定存储库yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo -y安装DOCKER CE(这一步比较慢,耐心等会儿)yum install docker-ce docker-ce-cli containerd.io -y启动Dockersystemctl start docker3、云主机docker-harbor3.1. 修改主机名为:docker-harbor[root@c-dfjgjesgqe ~]# hostnamectl set-hostname docker-harbor[root@c-dfjgjesgqe ~]# hostname docker-harborCtrl+D退出后重新登陆生效3.2. 企业级harbor镜像仓库部署Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的 企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访 问控制,AD/LDAP集成以及审计日志等,足以满足基本企业需求。harbor各组件介绍:| 组件 | 功能 | | :——– | :——–| | harbor-adminserver | 配置管理中心 | | harbor-db | MySQL数据库 | | harbor-jobservice | 负责镜像复制 | | harbor-log | 记录操作日志 | | harbor-ui | Web管理页面和API | | nginx | 前端代理,负责前端页面和镜像上传/下载转发 | | redis | 会话 | | registry | 镜像存储 | Harbor安装有3种方式1)在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小2)离线安装:安装包包含部署的相关镜像,因此安装包比较大3)OVA安装程序:当用户具有vCenter环境时,使用此安装程序,在部署OVA后启动Harb在此我们使用第二种离线安装方式来搭建基于 https 访问的 harbor 镜像仓库。3.2.1. 下载并解压离线安装包harbor离线包下载地址:https://github.com/goharbor/h…为方便下载,我在京东云对象存储上也存了一份,可直接wget:https://pocenv-hcc.oss.cn-nor…[root@docker-harbor ~]# yum install vim wget openssl -y[root@docker-harbor ~]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/harbor-offline-installer-v1.7.4.tgz[root@docker-harbor ]# tar zxf harbor-offline-installer-v1.7.4.tgz[root@docker-harbor ]# cd harbor[root@docker-harbor harbor]# lltotal 570744drwxr-xr-x 3 root root 23 Apr 1 15:05 common-rw-r–r– 1 root root 939 Mar 4 15:33 docker-compose.chartmuseum.yml-rw-r–r– 1 root root 975 Mar 4 15:33 docker-compose.clair.yml-rw-r–r– 1 root root 1434 Mar 4 15:33 docker-compose.notary.yml-rw-r–r– 1 root root 5608 Mar 4 15:33 docker-compose.yml-rw-r–r– 1 root root 8033 Mar 4 15:33 harbor.cfg-rw-r–r– 1 root root 583086399 Mar 4 15:33 harbor.v1.7.4.tar.gz-rwxr-xr-x 1 root root 5739 Mar 4 15:33 install.sh-rw-r–r– 1 root root 11347 Mar 4 15:33 LICENSE-rw-r–r– 1 root root 1263409 Mar 4 15:33 open_source_license-rwxr-xr-x 1 root root 36337 Mar 4 15:33 prepare3.2.2. 自签http证书1)获取权威认证证书[root@docker-harbor harbor]# mkdir ssl[root@docker-harbor harbor]# cd ssl[root@docker-harbor ssl]# openssl genrsa -out ca.key 4096Generating RSA private key, 4096 bit long modulus……………………………..++…………………………………………………………………………………………………………………….++e is 65537 (0x10001)[root@docker-harbor ssl]# openssl req -x509 -new -nodes -sha512 -days 3650 -subj “/C=ZH/ST=ShangHai/L=ShangHai/O=example/OU=Personal/CN=reg.marin.com” -key ca.key -out ca.crt[root@docker-harbor ssl]# lltotal 8-rw-r–r– 1 root root 2037 Apr 4 18:41 ca.crt-rw-r–r– 1 root root 3243 Apr 4 18:41 ca.key2)获取服务端证书1.Create your own Private Key:[root@docker-harbor ssl]# openssl genrsa -out reg.marin.com.key 4096Generating RSA private key, 4096 bit long modulus………………………………………++………………………………………………………………………………………………………………………………………………………………………………………………….++e is 65537 (0x10001)[root@docker-harbor ssl]# openssl req -sha512 -new -subj “/C=ZH/ST=ShangHai/L=ShangHai/O=example/OU=Personal/CN=reg.marin.com” -key reg.marin.com.key -out reg.marin.com.csr[root@docker-harbor ssl]# lltotal 16-rw-r–r– 1 root root 2037 Apr 4 18:41 ca.crt-rw-r–r– 1 root root 3243 Apr 4 18:41 ca.key-rw-r–r– 1 root root 1708 Apr 4 18:42 reg.marin.com.csr-rw-r–r– 1 root root 3243 Apr 4 18:42 reg.marin.com.key[root@docker-harbor ssl]# cat > v3.ext <<-EOF> authorityKeyIdentifier=keyid,issuer> basicConstraints=CA:FALSE> keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment> extendedKeyUsage = serverAuth> subjectAltName = @alt_names> > [alt_names]> DNS.1=reg.marin.com> DNS.2=reg.marin> DNS.3=marin> EOF[root@docker-harbor ssl]# openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in reg.marin.com.csr -out reg.marin.com.crtSignature oksubject=/C=ZH/ST=ShangHai/L=ShangHai/O=example/OU=Personal/CN=reg.marin.comGetting CA Private Key[root@docker-harbor ssl]# lltotal 28-rw-r–r– 1 root root 2037 Apr 4 18:41 ca.crt-rw-r–r– 1 root root 3243 Apr 4 18:41 ca.key-rw-r–r– 1 root root 17 Apr 4 18:44 ca.srl-rw-r–r– 1 root root 2098 Apr 4 18:44 reg.marin.com.crt-rw-r–r– 1 root root 1708 Apr 4 18:42 reg.marin.com.csr-rw-r–r– 1 root root 3243 Apr 4 18:42 reg.marin.com.key-rw-r–r– 1 root root 260 Apr 4 18:43 v3.ext3)修改harbor配置,以及为Docker配置服务端证书,key和CA。[root@docker-harbor ssl]# cd ..[root@docker-harbor harbor]# vim harbor.cfg……hostname = reg.marin.comui_url_protocol = httpsssl_cert = ./ssl/reg.marin.com.crtssl_cert_key = ./ssl/reg.marin.com.keyharbor_admin_password = 123456……密码也可以不修改,默认登录用户admin,密码Harbor12345Docker守护进程会将.crt文件解释为CA证书,将.cert文件解释为客户机证书,先将.crt文件转换一份.cert文件。[root@docker-harbor harbor]# cd ssl/[root@docker-harbor ssl]# mkdir -p /etc/docker/certs.d/reg.marin.com[root@docker-harbor ssl]# openssl x509 -inform PEM -in reg.marin.com.crt -out reg.marin.com.cert[root@docker-harbor ssl]# cp reg.marin.com.cert reg.marin.com.key ca.crt /etc/docker/certs.d/reg.marin.com/到此自签成功!3.2.3. 安装DOCKER CE安装所需包yum install -y yum-utils device-mapper-persistent-data lvm2 -y设置稳定存储库yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo -y安装DOCKER CE(这一步比较慢,耐心等会儿)yum install docker-ce docker-ce-cli containerd.io -y启动Dockersystemctl start docker通过运行hello-world 映像验证是否正确安装了Docker CE 。docker run hello-world3.2.4. 初始化及安装验证初始化安装:[root@docker-harbor ssl]# [root@docker-harbor ssl]# cd ..[root@docker-harbor harbor]# ./prepareGenerated and saved secret to file: /data/secretkeyGenerated configuration file: ./common/config/nginx/nginx.confGenerated configuration file: ./common/config/adminserver/envGenerated configuration file: ./common/config/core/envGenerated configuration file: ./common/config/registry/config.ymlGenerated configuration file: ./common/config/db/envGenerated configuration file: ./common/config/jobservice/envGenerated configuration file: ./common/config/jobservice/config.ymlGenerated configuration file: ./common/config/log/logrotate.confGenerated configuration file: ./common/config/registryctl/envGenerated configuration file: ./common/config/core/app.confGenerated certificate, key file: ./common/config/core/private_key.pem, cert file: ./common/config/registry/root.crtThe configuration files are ready, please use docker-compose to start the service.执行install.sh脚本,安装harbor仓库注意:在执行install.sh脚本之前,先检查两个问题:1)docker-compose是否安装,否则在运行install.sh时会失败,报错“✖ Need to install docker-compose(1.7.1+) by yourself first and run this script again.”2)docker服务是否正常运行,否则在运行install.sh会失败,报错“Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?”安装Compose运行此命令以下载Docker Compose的当前稳定版本:curl -L “https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose对二进制文件应用可执行权限:chmod +x /usr/local/bin/docker-compose执行install.sh脚本,安装harbor仓库[root@docker-harbor harbor]# ./install.sh[Step 0]: checking installation environment …Note: docker version: 18.09.4Note: docker-compose version: 1.24.0[Step 1]: loading Harbor images …bffe2a0fec66: Loading layer [==================================================>] 33.22MB/33.22MB38e174bed467: Loading layer [==================================================>] 8.964MB/8.964MB427e4936ae66: Loading layer [==================================================>] 35.77MB/35.77MB3bfd5214250a: Loading layer [==================================================>] 2.048kB/2.048kBf30df776629d: Loading layer [==================================================>] 3.072kB/3.072kBf87afad43f43: Loading layer [==================================================>] 22.8MB/22.8MB……953717aa0afc: Loading layer [==================================================>] 22.8MB/22.8MBLoaded image: goharbor/registry-photon:v2.6.2-v1.7.4[Step 2]: preparing environment …Clearing the configuration file: ./common/config/adminserver/envClearing the configuration file: ./common/config/core/envClearing the configuration file: ./common/config/core/app.confClearing the configuration file: ./common/config/core/private_key.pemClearing the configuration file: ./common/config/db/env……Generated certificate, key file: ./common/config/core/private_key.pem, cert file: ./common/config/registry/root.crtThe configuration files are ready, please use docker-compose to start the service.[Step 3]: checking existing instance of Harbor …[Step 4]: starting Harbor …Creating network “harbor_harbor” with the default driverCreating harbor-log … doneCreating redis … doneCreating registryctl … doneCreating harbor-db … doneCreating harbor-adminserver … doneCreating registry … doneCreating harbor-core … doneCreating harbor-jobservice … doneCreating harbor-portal … doneCreating nginx … done✔ —-Harbor has been installed and started successfully.—-Now you should be able to visit the admin portal at https://reg.marin.com. For more details, please visit https://github.com/goharbor/harbor .浏览器访问验证:浏览器访问要做域名解析,在本地hosts(C:WindowsSystem32driversetchosts)文件中加入:116.196.88.91 reg.marin.com访问:https://reg.marin.com,并登陆。登录后界面基本操作:新建项目test新建用户marin将用户marin设置为test项目管理员三、环境测试1、远程clone代码测试clone 云主机docker-git上的仓库tomcat-java-demo.git:[root@docker-jenkins ~]# yum install git vim wget -y[root@docker-jenkins ~]# git config –global user.email “hcc@c.com”[root@docker-jenkins ~]# git config –global user.name “hcc”[root@docker-jenkins ~]# git clone git@10.0.0.22:/home/git/tomcat-java-demo.gitCloning into ‘solo’…The authenticity of host ‘10.0.0.22 (10.0.0.22)’ can’t be established.ECDSA key fingerprint is SHA256:XNWQhGsAsqd84k/6OYV3xl1+mPGjtASsxeV1YVLZVas.ECDSA key fingerprint is MD5:b4:bd:16:2b🇩🇪e7:7c:fd:c5:dd:91:75:20:ff:3e:0a.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added ‘10.0.0.22’ (ECDSA) to the list of known hosts.git@10.0.0.22’s password⚠️ You appear to have cloned an empty repository.[root@docker-jenkins ~]# lstomcat-java-demo[root@docker-jenkins ~]# ls tomcat-java-demo/doc Dockerfile LICENSE pom.xml README.md src[root@docker-jenkins ~]# 2、拉取Github demo代码模拟生产项目,拉取github上的一个demo,并上传至本地git库[root@docker-jenkins ~]# mv tomcat-java-demo tomcat-java-demo.bak[root@docker-jenkins ~]# git clone https://github.com/dingkai163/tomcat-java-demo.gitCloning into ’tomcat-java-demo’…remote: Enumerating objects: 185, done.remote: Counting objects: 100% (185/185), done.remote: Compressing objects: 100% (165/165), done.remote: Total 185 (delta 5), reused 178 (delta 4), pack-reused 0Receiving objects: 100% (185/185), 4.50 MiB | 870.00 KiB/s, done.Resolving deltas: 100% (5/5), done.[root@docker-jenkins ~]# cd tomcat-java-demo[root@docker-jenkins tomcat-java-demo]# vim .git/config[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true[remote “origin”] url = git@10.0.0.22:/home/git/tomcat-java-demo.git # 修改为本地的git库地址 fetch = +refs/heads/:refs/remotes/origin/[branch “master”] remote = origin merge = refs/heads/master[root@docker-jenkins tomcat-java-demo]# git add .[root@docker-jenkins tomcat-java-demo]# git status# On branch masternothing to commit, working directory clean[root@docker-jenkins tomcat-java-demo]# git commit -m “all”# On branch masternothing to commit, working directory clean[root@docker-jenkins tomcat-java-demo]# git push origin mastergit@10.0.0.22’s password:Counting objects: 229, done.Compressing objects: 100% (185/185), done.Writing objects: 100% (229/229), 4.52 MiB | 0 bytes/s, done.Total 229 (delta 25), reused 229 (delta 25)To git@10.0.0.22:/home/git/tomcat-java-demo.git * [new branch] master -> master[root@docker-jenkins tomcat-java-demo]#3、自建镜像仓库上传下载用云主机buildimage上传及下载镜像修改主机名为:buildimage[root@c-dfjgjesgqe ]# hostnamectl set-hostname buildimage[root@c-dfjgjesgqe ]# hostname buildimageCtrl+D退出后重新登陆生效安装DOCKER CE安装所需包yum install -y yum-utils device-mapper-persistent-data lvm2 -y设置稳定存储库yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo -y安装DOCKER CE(这一步比较慢,耐心等会儿)yum install docker-ce docker-ce-cli containerd.io -y启动Dockersystemctl start docker首先在云主机buildimage上做本地hosts解析[root@buildimage ~]# echo “10.0.0.21 reg.marin.com” >> /etc/hosts其次编辑/etc/docker/daemon.json文件,保存退出[root@buildimage ~]# vim /etc/docker/daemon.json{“insecure-registries”:[“reg.marin.com”] }最后重启下docker,让配置生效[root@buildimage ~]# systemctl restart docker如果没有此步docker login将会报错:[root@buildimage ~]# docker login reg.marin.comUsername (admin): adminPassword: Error response from daemon: Get https://reg.marin.com/v1/users/: x509: certificate signed by unknown authority此时可以通过docker login reg.marin.com 登录harbor,输入用户名及密码:[root@buildimage ~]# docker login reg.marin.comUsername (admin): adminPassword: Login Succeeded在buildimage云主机上构建Tomcat基础镜像,并推送到harbor镜像库:[root@buildimage ~]# mkdir tomcat[root@buildimage ~]# cd tomcat[root@buildimage tomcat]# vim Dockerfile-tomcatFROM centos:7MAINTAINER hanchaochao www.jdcloud.com ENV VERSION=8.5.39 RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \ yum clean all && \ rm -rf /var/cache/yum/RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \ tar zxf apache-tomcat-${VERSION}.tar.gz && \ mv apache-tomcat-${VERSION} /usr/local/tomcat && \ rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/ && \ mkdir /usr/local/tomcat/webapps/test && \ echo “ok” > /usr/local/tomcat/webapps/test/status.html && \ sed -i ‘1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom”’ /usr/local/tomcat/bin/catalina.sh && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/tomcat/bin EXPOSE 8080CMD [“catalina.sh”, “run”][root@harbor tomcat]# docker build -t tomcat:v1 -f Dockerfile-tomcat .[root@harbor tomcat]# docker tag tomcat:v1 reg.marin.com/test/tomcat:v1[root@docker-git-harbor tomcat]# docker login reg.marin.com[root@docker-git-harbor tomcat]# docker push reg.marin.com/test/tomcat:v1打开harbor的test仓库,查看镜像已经push成功四、CI流程测试1、Jenkins安装必要插件由于jenkins是离线安装,所有在此需要配置一下插件下载地址:系统管理–>插件管理–>Advanced(高级)修改下方地址,将https修改为http 再点提交若出现问题无法获取插件,请尝试更换地址,如:https://mirrors.tuna.tsinghua…提交后点击可选插件,此时我们可以看到很多可获得插件首先搜索并安装Pipeline插件(如果搜索不到,在已安装中查看是否已经安装完毕)pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。再安装SCM to job 插件,同上步骤(搜索,安装)。2、Jenkins项目创建创建jobs选择流水线类型到这里我们就开始配置Pipeline script,点击流水线语法,来自动生成我们需要的配置。如下图,我们Git方式,配置Git仓库地址,再添加认证相关。在示例步骤中下拉选择如图选项,在Repository URL中填写docker-git上的git仓库地址,因为没有添加jenkins到docker-git容器的免密码登陆,所以截图中我们可以看到连接被拒绝的一大串红色提示,我们点击添加按钮这里我们使用的是秘钥认证方式,需要在容器docker-jenkins上生成密钥,然后将jenkins上生成的公钥发送到(docker-git)git服务器上,然后将jenkins上的生成的私钥内容粘贴到下图Key中,这样jenkins就可以免交互的拉取git仓库中的代码了。[root@docker-jenkins ~]# ssh-keygenGenerating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa.Your public key has been saved in /root/.ssh/id_rsa.pub.The key fingerprint is:SHA256:RQZ78bcVhLRQi8fWFPYmyvcnOqlxy980QwLsYFT/iz8 root@docker-jenkinsThe key’s randomart image is:+—[RSA 2048]—-+| .o=oooo*.|| .+.o=.* o|| .oo+.Bo.+|| .oo.+o.= || S .o.oo || .+..|| . .o.++|| +oo.E+|| ..+o..o|+—-[SHA256]—–+[root@docker-jenkins ~]# cd[root@docker-jenkins ~]# ls .ssh/id_rsa id_rsa.pub known_hosts[root@docker-jenkins ~]# ssh-copy-id git@10.0.0.22/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: “/root/.ssh/id_rsa.pub”/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed – if you are prompted now it is to install the new keysgit@10.0.0.22’s password: Number of key(s) added: 1Now try logging into the machine, with: “ssh ‘git@10.0.0.22’“and check to make sure that only the key(s) you wanted were added.[root@docker-jenkins ~]# cat .ssh/id_rsa—–BEGIN RSA PRIVATE KEY—–MIIEogIBAAKCAQEAvrI8lBov+W8v+zSGdu2EP4BPP7Ml+T5KUwc2MKX1RNMMNQxctPUf7PjhbJJvuTpPPbS1+9PAlrPhikDrug3K4+sF/Fiy+/YgoVMlEFrXiSJK1xHiErDLA39WGq+E4ssth3JfrQHV+AINGAh1/NR+Uk+YmPDAuQgA1l7jSH1PN6qTdrYt95HbklAA+Q3omAJJ4Uc80lk7ZdMcdCc0OAtHjCfbRv287qrH4U2OKSlOLljiBHBN……—–END RSA PRIVATE KEY—–[root@docker-jenkins ~]# 配置完成后,我们就可以生成Pipeline脚本了。点击下方生成流水线脚本,然后复制方框内的内容。将生成的流水线脚本复制出来,我生成的流水线脚本如下:checkout([$class: ‘GitSCM’, branches: [[name: ‘/master’]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: ‘9baf7156-9ac6-435d-b0db-86cae51c8fe6’, url: ‘git@10.0.0.22:/home/git/tomcat-java-demo.git’]]])将生成的流水线脚本记录完成后,我们点击左上角返回继续点击配置,完成流水线项目tomcat-java-demo的配置点击流水线,我们所需要的Pipeline脚本如下,将其粘贴到script的拉取代码模块中,并修改分支/master为${branch},其他模块内容自行编写,具体需要修改的地方和脚本如下:node { // 拉取代码 stage(‘Git Checkout’) { checkout([$class: ‘GitSCM’, branches: [[name: ‘${branch}’]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: ‘9baf7156-9ac6-435d-b0db-86cae51c8fe6’, url: ‘git@10.0.0.22:/home/git/tomcat-java-demo.git’]]]) } // 代码编译 stage(‘Maven Build’) { sh ’’’ export JAVA_HOME=/usr/local/jdk /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true ’’’ } // 项目打包到镜像并推送到镜像仓库 stage(‘Build and Push Image’) {sh ‘‘‘REPOSITORY=reg.marin.com/test/tomcat-java-demo:${branch}cat > Dockerfile << EOFFROM reg.marin.com/test/tomcat:v1 MAINTAINER marinRUN rm -rf /usr/local/tomcat/webapps/ADD target/.war /usr/local/tomcat/webapps/ROOT.warEOFdocker build -t $REPOSITORY .docker login reg.marin.com -u admin -p 123456docker push $REPOSITORY’’’ } // 部署到Docker主机 stage(‘Deploy to Docker’) { sh ’’’ REPOSITORY=reg.marin.com/test/tomcat-java-demo:${branch} docker rm -f tomcat-java-demo |true docker pull $REPOSITORY docker container run -d –name tomcat-java-demo -p 88:8080 $REPOSITORY ’’’ }}在Pipeline脚本里面我们指定了一个branch参数,所以我们需要传递一个参数变量,这里我们选择参数化构建,默认值为master分支。然后保存配置。3、Jenkins构建任务构建前我们还需要做两个操作:添加reg.marin.com的hosts解析[root@docker-jenkins ~]# echo “10.0.0.21 reg.marin.com” >> /etc/hosts编辑/etc/docker/daemon.json文件,输入如下信息,保存退出[root@docker-jenkins ~]# vim /etc/docker/daemon.json{“insecure-registries”:[“reg.marin.com”] }最后重启下docker,让配置生效[root@docker-jenkins ~]# systemctl restart docker返回到工作台,我们开始构建任务构建开始构建完成可以通过Console Output输出查看jenkins构建流程成功构建会提示: SUCCESS通过浏览器来访问tomcat-java-demo项目:http://Jenkins主机公网IP:88/![图片上传中…]可以看到正常访问,至此在京东云上基ker+Git 的简单CI流程实践已经成功部署了。原参考地址:https://www.toutiao.com/a6中…] ...

April 16, 2019 · 8 min · jiezi

异构去堆叠 | 一种完美提升网络高可用SLA的方案

行业内接入网络去堆叠已经逐步成为主流方向,在大型互联网公司也已经批量部署。但由于京东集团不同的业务需求及历史原因,没有条件完全复制目前主流的ARP转主机路由方式的去堆叠方案,这促使我们设计一种尽可能满足各类业务需求的方案。近几年来云市场迅速发展,越来越多的用户把关键应用甚至全部应用部署到公有云上。云服务商在产品收入快速增长同时,也深刻体会到产品的高可用性对用户发展和用户留存的重要性。面向用户的产品SLA的实现效果取决于其依赖的各个环节,而基础网络是所有产品需要依赖的一个重要环节,因此,提升网络高可用SLA对整体提升产品整体SLA有着重要促进作用。今天我们要谈的异构去堆叠就是京东云在提高网络高可用SLA方面的新技术研究。用户自有网络其实也面临同样的问题,有提高网络可靠性需求的用户可以考虑在自有网络中使用类似方案。网络高可用通用解决方案首先,让我们先来看一下为了实现网络高可用,当下的四种服务器连接主流方案:由上图可以看出,双网卡/交换机堆叠和双网卡/去交换机堆叠提供了更好的高可用保证。通用堆叠方式 V.S 通用去堆叠方式01 堆叠方案优势服务器双网卡捆绑,无需特别改造交换机控制面统一,支持服务器BGP路由方式接入劣势多设备统一控制面,可靠性低升级困难横向连接浪费端口02 去堆叠方案常见的去堆叠方案有以下两种:去堆叠方案-路由方式优势交换机完全独立支持异构路由方式接入的服务器无需特别改造劣势2层方式接入的服务器需要进行改造服务器除网卡IP外需配置单独业务IP服务器多IP增加业务方运维复杂度静态路由方式不适合VM或Docker漂移动态路由方式要求全部服务器运行路由协议2.去堆叠方案-ARP转主机路由方式优势交换机完全独立服务器网卡捆绑方式不变,便于运维服务器网卡捆绑方式不变,便于运维劣势一组交换机要求同厂商,不支持异构需要修改服务器Linux内核ARP处理部分不支持服务器BGP路由方式接入通过以上对比,可以发现堆叠与去堆叠方式其实都可以实现网络的高可用,但各有利弊。针对这样的情况,京东云提出了一种理想的去堆叠方式,可以满足下图中的所有需求。异构去堆叠方案01 实现方法交换机侧IP配置/24掩码,两台交换机可配置相同IP或者不同IP;启用ARP代理及转主机路由功能;配置ARP超时时间为5s以便在服务器不响应ARP时快速撤回主机路由。服务器侧服务器双网卡配置相同IP地址(掩码/32);采用onlink方式配置目的为交换机IP的静态路由指向对应网卡;采用onlink方式配置缺省路由同时指向两块网卡;需要运行Ifplugd进程监控物理连接,物理连接发生UP/DOWN时执行相应ARP Ping和路由修改操作。02 冗余测试从上图中的测试拓扑和结果中可以看出,不论是软件操作上的禁用还是硬件拔出,在设定的收敛时间内,服务器的网络一直保持高可用。03 异构去堆叠方案小结异构去堆叠方案优势交换机完全独立异构避免单一厂商风险异构推动自研交换机快速上线服务器侧支持2层方式或BGP路由方式不修改Linux内核注意事项需要内核版本支持L4 HASH方式ECMP(Centos 7.4以上)需要运行Ifplugd进程监控物理连接总结综上所述,异构去堆叠有助于实现苛刻的网络SLA和极致的用户体验。京东云在设计去堆叠方案时首先考虑了异构,一方面因为单一厂商对网络高可用SLA还是一个重要风险点,另一方面异构方式可以促进京东正在进行的自研交换机实现快速部署。众所周知,自研交换机在各大互联网公司都是重点项目,但软件和硬件的稳定性一直是批量部署的重大障碍。而异构去堆叠利用自研和商用交换机1+1的方式可以大大降低自研交换机稳定性的影响。·END·

April 11, 2019 · 1 min · jiezi