2020年8月15日 By mikel 分类: JavaScript

return false

来源: jquery的$.each如何退出循环和退出本次循环 – 咖啡无眠 – 博客园

JQuery中each类似于JavaScript的for循环
但不同于for循环的是在each里面不能使用break结束循环,也不能使用continue来结束本次循环,想要实现类似的功能就只能用return,
break           用return false
continue      用return true

2020年8月15日 By mikel 分类: C#

来源: 当前上下文中不存在名称”__o” – XOYOZO

经常会看到这样似错非错的提示:

当前上下文中不存在名称”__o”

The name ‘__o’ does not exist in the current context

image.png

实际上,我没有定义任何名为 __o 的变量。

发生这种情况的原因可能是使用了类似如下的代码:

1
2
3
4
<% if(true) { %>
<%= 1 %>
<% } %>
<%= 2 %>

为了在设计界面的 <%= %> 代码块中提供智能感知,ASP.NET(VB 或 C#)会自动生成一个名为“__o”的临时变量,这在页面编译器看到第一个 <%= %> 块时就完成了。但是在这里,<%= %> 块在 if 中出现,所以当关闭 if 后再使用 <%= %> 时,变量超出了定义的范围。

1
2
3
4
5
6
if (true)
{
    object @__o;
    @__o = 1;
}
@__o = 2;

解决方法:在页面的早期添加一个虚表达式。例如:<%= “” %>。这将不会呈现任何内容,并且它将确保在任何潜在的 if(或其他范围界定)语句之前,在 Render 方法中将 __o 声明为顶级。

当然还有一种治标不治本的方法就是隐藏这些错误提示(这并不影响程序正常运行):

点击错误列表面板左上角的过滤器按钮,CS0103,其中包含错误代码:当前上下文中不存在名称”__o”,这些错误将不再显示,您仍然可以有其他 IntelliSense 错误和警告。

2020年8月15日 By mikel 分类: C#

有趣的依赖问题…… VS2015.3,.NET45将Microsoft.Owin从3.0.0更新到3.0.1(跟踪此更新是问题 – 想要安装https://www.nuget.org/packages/IdentityServer3.AccessTokenValidation/) 它在IIS Express上本地工作 但发布到Azure网站:(我直接从VS删除目标上的其他文件).重新启动并删除了a

来源: c# – 无法将文件或程序集Microsoft.Owin 3.0.0加载到3.0.1 – 程序园

有趣的依赖问题……VS2015.3,.NET45将Microsoft.Owin从3.0.0更新到3.0.1(跟踪此更新是问题 – 想要安装https://www.nuget.org/packages/IdentityServer3.AccessTokenValidation/)

enter image description here
它在IIS Express上本地工作

但发布到Azure网站:(我直接从VS删除目标上的其他文件).重新启动并删除了azure webserver中的所有文件.

enter image description here

web.config翻译看起来没问题

<dependentAssembly>
   <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
   <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />   
</dependentAssembly>

编辑
Bruce Chen的回答指出了我的方向Kuud(Azure – 开发工具,高级工具)

enter image description here

我下载了Owin dll,这是错误的版本,即3.0.0

为了解决这个问题,我清除了解决方案中的所有包工件

git clean -xfd(小心)

然后重建

Could not load file or assembly ‘Microsoft.Owin, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference.

通常,这意味着.NET程序集加载程序无法找到具有引用的特定版本的程序集.请确保您的Azure网站中可以找到版本3.0.1.0的程序集,并且该版本通过KUDU或FTP客户端与web.config中的定义匹配.

正如您所说,它在IIS Express上本地工作,请尝试通过KUDU或FTP客户端手动将您的网站内容部署到Azure,并找出它是否有效.

2020年8月15日 By mikel 分类: 互联网, 建站经验

来源: 老项目复盘:抖音老照片修复项目思路分享 – 卢松松博客

一张老照片代表了一段回忆

一段回忆牵出一个故事

一个故事代表一个岁月

一个岁月满载一缕情思

那些彼此脸上写下的沧桑

我们只能在回忆里找寻….

如诗如歌如梦的老照片,是多少人的回忆?我们父母那一辈年轻时候的照片,我们自己小时候的照片,由于年代已久,都会变得破旧模糊,而且那时候都是相片纸,没有电子档,再过几年就完全损坏了。

所以,这就是一个需求。大家去淘宝、抖音上面看看,这样的需求有多少?

淘宝前面单个宝贝都是月销几千件,其中一个做得比较好的8500+,按8500*50=42.5万,实际肯定超过50万的,因为人家有几个宝贝,如果有几个店铺那更可怕了。

老项目复盘:抖音老照片修复项目思路分享 创业 抖音 经验心得 第1张

老项目复盘:抖音老照片修复项目思路分享 创业 抖音 经验心得 第2张

抖音一搜就有几百个相关的账号,很多账号都是10W+的粉丝,想想多少潜在客户?可以说,每个家庭都有老照片,能不能让他们买单,就看你的本事了。

老项目复盘:抖音老照片修复项目思路分享 创业 抖音 经验心得 第3张

其实老照片修复是一个很老的项目,早期做的人都在闷声发大财。但是今年借助抖音的热度再次把这个项目带火了,需求更加旺盛了,当然竞争相比之前也更激烈。

本人在2015年也做了这个项目,可惜只在我的天猫店上架了一个宝贝,没有推广,平常日均10来单,今年2月份以来,蹭抖音的流量,翻了2倍,不过还是不到大佬的零头,汗颜!

项目怎么玩,建议大家淘宝、抖音和微信一起做。新手淘宝上架宝贝卡一点自然流量(有条件的推荐做企业店铺),重点是抖音引流,微信落地成交。

【老照片修复翻新项目流程】

1、准备抖音账号、高配手机和微信朋友圈包装

自己手里有老抖音账号的更好,没有的话可以去买,有条件的最好认证企业号,前期做5-7天的养号。手机配置好一点,涉及到高频使用视频和直播。微信朋友圈展示相关的不少于10条,而且是连续多天发布的。

2、制作修复展示视频

视频也不是随便做,先看看同行的热门视频怎么制作的。为保证完播率,时间最好控制在10秒以内,修复过程展示要自然有美感。背景音乐选择经典怀旧一些的。抖音有自带老照片效果的,但是为了专业,视频效果还是建议用用PR。

3、选择黄金时间发布视频

自己提前根据账号数量规划一下发布时间,最好选择晚上6-10点之间,一个账号一天一条即可,多账号分时间段发布。标题尽量选择一些情感故事增强用户代入感,或者有争议的话题刺激用户评论。

4、直播引流

提前准备好直播话术,当播放量达到500之后,可以开启直播,直播内容固定几句话,引导用户来加你即可。话术参考:

Q:怎么收费的?

A:看照片的损坏程度,一般是几十到几百不等。

Q:照片怎么修复的?

A:我们是PS结合手绘完成的,难度高的会用AI技术。

5、修复照片赚钱

客户加你之后,引导客户把需要修复的照片发来,根据情况报价,简单的起步报50元一张。一般来说,如果照片有意义,几百元客户肯定愿意花的。修复软件很多,首选PS。自己会操作自己做,不会的就对接一些专业团队,或者自己谈熟悉的设计师合作,自己赚个差价。

这个项目还可以招收代理赚钱,怎么玩,不用我教吧,任何项目都有这个玩法。

长线的玩法,因为客户大部分被引导在你的微信,微信营销流量转化赚钱的方法,这里可以直接复用。

【福利:photoshop老照片修复技术详解】

1、首先我们找一张老照片,可以用手机拍摄,也可以扫描成照片,当然扫描做出来的效果比较好;

2、在PS打开这张照片,先复制一个图层(ctrl+j),复制图层之后,我们在图层一操作;

3、然后对图层一调整去色;

4、再复制一个图层,这里的图层无非就是备份作用,万一操作失误了,我们这里还可以用备份来恢复,操作方法和第2步是一样的;

5、滤镜-正色-蒙层与划痕,这是修复老照片的重要环节之一;

6、一边拖动半径和阙值,一边观察老照片修复的效果,当得到你称心如意的效果即可点击“好”,当然每一张图片的半径和阙值都有不同,依据损坏的水平和照片来定义的,所以需求一边观察照片的效果一边调整参数;

7、设置完划痕当前我们末尾修补旁边的中央了,我们打开左侧工具栏的“修补工具”;

8、将需要修复的中央圈起来,这里不能断开,不要想一蹴而就,都是一个小细节一个小细节的来操作;

9、圈起来当前,我们拖动到洁净的中央,留意了,这里的洁净的中央指的是和圈起来颜色相反的洁净的中央,比方这里圈起来的是肩膀的衣服上,那么我们也需求拖动到肩膀衣服的洁净中央;

10、这一块修复好了,我们再找找其他哪些中央需要修复,我们逐一给他修复一下;

11、设置滤镜-模糊-高斯模糊;

12、这里的半径数字依据照片的修复来定义,一边调整一边查看照片的修复水平;

13、点击图层工具下的“添加图层蒙版”工具;

14、选择右边工具栏的画笔工具;

15、将前景颜色设置为黑色,刷出嘴巴和眼镜;

16、打开滤镜-锐化-USM锐化工具;

17、锐化水平异常依据你需求修复照片的水平来定义,来回设置,看到照片恢复差不多后,我们再设置“好”。然后向下兼并图层(ctrl+e);

18、点击到图层右键,然后点击“可选颜色”;

19、异常依据需求来设置颜色,这里由于不同的照片,所以设置的颜色数值也是不同,我们这里设置的是18中性色;

20、然后再次设置色阶调亮度(ctrl+l),异常依据需求来设置照片的数值;

21、保存上去,我们的老照片就修复成功了。

这个项目长期稳定,而且随着你微信好友的增多,后期有大量的客户转介绍生意,基本是躺赚。前提是需要一些基础视频技术和朋友圈推广运营,这2个不能甩给外面的人,要自己亲身上手,还是那句话任何项目都有人看好与看坏,行不行做了才知道!

作者:懂懂副业   微信:814816679

2020年8月15日 By mikel 分类: 网站运营, 互联网, 搜索优化, 网络营销

来源: 今日头条、腾讯等各大信息流渠道特性盘点 – 卢松松博客

随着社交媒体的发展,微博、腾讯、头条较早推出信息流广告产品,同时得益于其庞大的用户基数,成为信息流广告收入的主流梯队。

百度、爱奇艺、优酷、浏览器等也于去年上线信息流广告产品,增长迅速,预计近两年呈爆发式增长。

面对如此之多的信息流渠道,我们应该如何选择?又应该如何投放呢?

所以,今天就来聊一聊2017年主流信息流平台的特点和用户数据以及特征,各位广告主们收好了。

腾讯社交广告投腾讯社交广告点击这里

腾讯可以说,是社交行业龙头的老大,成立时间最早,并且凭借QQ和微信两大超级IP,拥有庞大的流量,可以说基本覆盖全网用户。

旗下的广告产品主要有:腾讯新闻、微信朋友圈、公众号、qq空间、浏览器等。

  • 优势:社交应用排名NO.1,覆盖面广,日活高,用户粘性大,适合品牌宣传。
  • 缺点:朋友圈广告素材审核较严,且价格太贵,还有很多品牌商跟你抢量。
  • 投放建议:建议投放轻工业或者说生活类产品

今日头条、腾讯等各大信息流渠道特性盘点 今日头条 广告 网络营销 互联网 好文分享 第1张

腾讯智汇推

智汇推主要基于腾讯新闻类的信息流广告。

旗下的广告产品主要有:腾讯网(日均PV达到9.3亿)、腾讯微博、腾讯视频、腾讯新闻等。

  • 用户特征:群体广泛,IOS用户非常高
  • 优势:资源丰富,目标客户定位精准,精打细算见利益。
  • 缺点:成本偏高,算法不成熟
  • 投放建议:硬广式曝光+软广式植入,广告成效更快实现!

今日头条、腾讯等各大信息流渠道特性盘点 今日头条 广告 网络营销 互联网 好文分享 第2张

微博粉丝通

微博“粉丝通”是基于用户属性和社交关系将企业广告精准地传递给粉丝和潜在粉丝的营销产品。

同时它拥有7大信息流广告展现形式。随着粉丝通商业化的成熟,成为目前大多数广告主必投的渠道。

  • 用户特征:群体活跃,偏年轻化
  • 优势:可以指定博文产生活互动的用户群体,同时移动端日活跃用户占比达91%,并具有博文、应用、账户、视频、图文、九宫格多种形式灵活使用,通过移动社交实现原生传播!
  • 缺点:成本偏高,流量不可控。
  • 投放建议:建议生活类产品(例食品、服装等)、地区类产品(例摄影等)、游戏、app等,广告要趋向特色化

今日头条、腾讯等各大信息流渠道特性盘点 今日头条 广告 网络营销 互联网 好文分享 第3张

新浪扶翼

新浪扶翼是以数据洞察为基础,程序化购买为主导的精准广告平台。通过数据洞察、定向精准等方式实现更好的广告效果。

旗下主要产品:新浪新闻app、wap流量同时还包含一些流量联盟app。

  • 用户特征:群体比较集中,男性,高等教育偏多
  • 优势:数百个资源位,覆盖100多个核心优质资源,每日总曝光量高达6亿,2.5亿日均PV,多终端多平台,开启效果广告新世界。
  • 缺点:不能选择APP或者频道投放
  • 投放建议:男性居多,可投放股票、游戏、汽车、男性养生等

今日头条、腾讯等各大信息流渠道特性盘点 今日头条 广告 网络营销 互联网 好文分享 第4张

百度信息流

三大巨头之一,其旗下的搜索引擎占据国内大多数用户。可在百度各大平台的资讯流中穿插展现的原生广告。

旗下主要产品:百度、百度贴吧、百度手机浏览器等。

  • 优点:有搜索基础,关键词定向,能定向贴吧
  • 缺点:广告主大多是搜索转化的,因此SEM思维固化严重
  • 投放建议:百度搜索引擎占据国内多数用户,无特殊行业投放界限;贴吧建议根据不同兴趣进行划分投放

今日头条、腾讯等各大信息流渠道特性盘点 今日头条 广告 网络营销 互联网 好文分享 第5张

今日头条

今日头条是一款基于数据挖掘的推荐引擎产品,同时也是国内互联网领域成长最快的产品服务之一,更是目前资讯类信息流平台最大的平台。

产品广告形式为:支持跳转H5页面、一键下载APP

  • 用户特征:群体广泛,所集中在二三线及以下城市
  • 优势:算法成熟,关键词定向,有移动建站很方便,支持CPA。用户每日使用时长超过76分钟,同时能5秒快速推广,锁定目标用户,10秒更新用户模型,广告投放更精确
  • 缺点:正常情况下内涵段子千万别投
  • 投放建议:理财、生活、游戏、app等,同时可根据导航栏的分类进行投放

今日头条、腾讯等各大信息流渠道特性盘点 今日头条 广告 网络营销 互联网 好文分享 第6张

一点资讯

一款将智能推荐技术与搜索引擎技术整合的产品,从凤凰网导入原创优质内容的资讯类应用。

用户特征:群体较窄,但背后是凤凰新闻,男性会多一些

  • 优点:渠道比较新,能定向频道
  • 缺点:各方面都不成熟
  • 投放建议:资讯内容主要倾向于体育、社会动态、财经,且用户多为男性,可投放财经(例股票类)、游戏、汽车等

今日头条、腾讯等各大信息流渠道特性盘点 今日头条 广告 网络营销 互联网 好文分享 第7张

UC头条

UC头条广告平台主打“基于大数据分析用户兴趣标签的信息流广告投放”, 一方面由UC提供海量流量资源,另一方面则由阿里妈妈提供专业的广告后台和服务支持。 全面帮助广告主将服务、产品信息更精准有效地推向全球UC浏览器用户。

  • 用户特征:毕竟背后是阿里爸爸的大数据,用户广泛,偏年轻化
  • 优点:广告标题长,接近原生
  • 缺点:“震惊”党、“标题”党
  • 投放建议:可根据导航分类进行有针对性地投放

今日头条、腾讯等各大信息流渠道特性盘点 今日头条 广告 网络营销 互联网 好文分享 第8张

视频类

视频以爱奇艺、腾讯、优酷为主。爱奇艺可以说为四大视频的巨头,用户范围广,与腾讯都比较偏年轻化。而优酷会比较偏生活化,像一些即时热点等。

  • 优势:资源丰富,人群范围较广
  • 投放建议:可进行品牌认知、强化,或促销信息告知

美柚

国内首款女生助手类软件。基于美柚强大的女性用户社区,可以精准定位用户所属身份、兴趣偏好等,更加契合女性用户需求,接受度及转化率更高。

  • 优势:具有超高的女性用户群体,可根据不同场景进行营销
  • 投放建议:可投放服装、理财、养生等

陌陌信息流

一款基于地理位置的移动社交产品(这个你们都熟)。

基于陌陌海量的用户数据,广告引擎智能匹配目标受众,商家可以与用户进行实时对话,开展新客源,维系老客户。

  • 主要广告形式为:附近动态、附近的人、开屏广告、朋友圈动态
  • 优势:具有3亿总注册用户量,人均打开次数10次/天,月活跃用户为7480万,是中国TOP1的LBS社交广告平台,广告点击率高于行业平均值10倍以上。并且拥有多维度广告展现形式(话题营销、滤镜广告、原创视频)
  • 投放建议:可投放APP、游戏、金融、电商、美容整形等

以上就是2017年主流的投放渠道,各位广告主们各取所需。

2020年8月15日 By mikel 分类: 互联网, 搜索优化, 网络营销

来源: 今日头条、腾讯广点通、百度等信息流广告如何投放和优化 – 卢松松博客

本文大纲如下:

1、信息流广告是什么?信息流优化师又是什么?

2、信息流广告推广平台有哪些?

3、今日头条(含抖音)信息流广告投放和优化

4、广点通(含朋友圈)广告投放和优化

5、百度信息流(含旗下产品)广告投放和优化

信息流广告是什么?信息流优化师又是什么?

信息流广告是什么?要理解它,先说下信息流。嗯,就是字面意思,就是一条一条信息滚动。比如你刷微博,或者抖音,翻页或上下滑动是不是像水流动一样。

今日头条、腾讯广点通、百度等信息流广告如何投放和优化 广告 好文分享 第1张

而广告就出现在你刷这个中间,让你不知不觉就点到这个广告。再白话说,所谓信息流广告,就是把广告做成像内容一样。区别于搜索竞价广告和视频贴片广告,更加自然。

信息流优化师是什么?把从事信息流广告投放专员我们就叫做信息流优化师。比如我们从事搜索引擎,比如百度网站排名优化的人员叫做SEO优化师。

信息流优化师工作主要内容是啥?如果是在分工明细的公司的话,信息流优化师主要工作就是投放和优化各渠道投放账户,你简单理解就是如何花最少钱,获得最多的订单,也就是把ROI做得更好。

信息流广告推广平台有哪些?

这个问题,我在进我前东家,一家专注二类电商平台代运营公司时第一天就要了解的。话说,我当时进去职位是高级SEO专家呢,哈哈哈。

如果你是小白想要进入信息流广告投放这个坑,那么,关于这个基础知识,你应该是要了解的,而且还要大致了解各个信息流广告平台大致特点。

信息流广告推广平台有哪些呢,大致如下,排名不分先后:

1、今日头条巨量引擎

今日头条公司叫字节跳动,就是最近说是被美国封禁TT(tiktok)那个母公司。准确说,这个推广平台应该叫鲁班,哦不是那个木工大神鲁班,也不是王者荣耀里小鲁班哈哈哈。

今日头条、腾讯广点通、百度等信息流广告如何投放和优化 广告 好文分享 第2张

当然这个鲁班商家入驻是要交保证金,下面具体会再讲下。另外,你在抖音刷几个视频(好像是不出5个)就弹出来一个广告,也是在这个后台提交投放的哈~

2、腾讯广告

准确说叫腾讯广点通,但是吧,微信朋友圈广告按规划又不属于广点通下面的渠道,它是分开的。哦,公众号文章那个广告(文中或文底)都属于广点通的广告位。

今日头条、腾讯广点通、百度等信息流广告如何投放和优化 广告 好文分享 第3张

稍微这里说下朋友圈广告位,大家以为能在朋友圈投广告,肯定是宝马奔驰才能投得起,其实,并不是哈哈哈。只要你开通了微信广告账户,首次充值5000元就可以了。

当然,按照目前广点通,核心城市:100~600 元/千次曝光,重点城市:60~400 元/千次曝光,其他城市:30~400 元/千次曝光,5000可能不要几个小时就没了,当然你设定精准,也可能投更久哈哈哈。

3、百度信息流

你没看错,就是百度!很多人以为,百度只有百度竞价广告,NO,百度信息流现在也是三大主流信息流平台之一了。作者2018年那会去投百度信息流二类电商时,那时百度刚入局二类不久,那后台体验谁用谁知道哈哈哈。

4、其它平台

微博粉丝通、新浪扶翼、趣头条、凤凰网凤羽、阿里汇川、360、知乎等以及其它各种APP的信息流广告入口。

这么多信息流推广平台,看得眼花缭乱,别说全部投,真不知道哪个好?作者在这里跟你说下一个原则,你要思考你的主要用户在哪里再来判断。

比如就拿头条、腾讯、百度三家来说,不要听别人说哪个好哪个好。头条玩信息流推荐,精准定位还可以,主要人群确实中老年居然,但如果投抖音又偏年轻化一点。

再说腾讯,社交属性,以及天然信任度高一点,所以很多二类电商都投腾讯广点通。百度信息流呢,最大优势是可以把主动竞价结合起来,所以各有优势。

今日头条(含抖音)信息流广告投放和优化

1、今日头条广告投放流程:

签约开户——充钱——账户结构规划——落地页制作——创建广告组——创建广告计划——创建广告创意——设置广告检测——开始投放——监测数据变化——广告优化调整(或加量、或暂停、或关闭)

啥,第一步签约开户都不知道找谁?你可以找松松商城给你代办信息流开户。也可以自己搜索头条广告代理商开户,实在找不到,直接打开巨量引擎官网打电话问去就好。

创建广告,创建计划,创建创意,都不会怎么办?你可以找代运营公司,你只管提供产品和处理售卖(发货、退换货等)。当然如果你自己要搞,那么招一个信息流优化师吧。

啥,你说你就想学习转型信息流优化师怎么办?也可以。作者其实也是从0学过来的。一是去头条官方课程中心学习,二是呢找一些投放过的过来人学习哈。

2、今日头条广告优化要点:

在说要点之前(当然这也仅是我理解的要点哈),说一个小插曲,当时才投头条时,一不小心,搞错了个类型,一分钟不到账户几大千没了,感谢前东家没让我赔,按理是需要的哦。

今日头条优化要点如下:

A、第一个是广告文案。(其实,广点通、百度也差不多)。因为好的文案,让设计出来的广告图能让用户会去点击。

如何写好文案?建议多看看一些好的营销文案书,或者广告,最快的方式,那就是去看同行投的好的广告怎么写的,你懂的哈哈哈。

B、第二个是素材形式多样化。什么意思?等你真正投你就知道了,比如图片素材后台各种尺寸都要,而且,视频也要有。视频的尺寸也要让设计出横屏和竖屏。同时,还要制作多组测试用哦。

C、投放时间要注意,比如头条晚高峰是晚上9-11点,那么,你要提前1小时左右布局。当然周末又不一样。

D、定向一定要选精准一点。除非你的投放本身太小,没啥流量,不然,建议不要选太多与自己不相关的流量词。

E、今日头条优化的核心是,你的广告素材测试都要有一个周期,比如最多三天或者五天,不起来可能就要换品。当然如果是你自己的品,那就要考虑换素材。

优化今日头条,先看有没有曝光,接下来看单量,再看单转化率。根据实际投放情况对这组广告进行判断处理,是维持,是大加大,是暂停,还是关闭。

广点通(含朋友圈)广告投放和优化

1、广点通广告投放流程:

A、联系腾讯官方或腾讯代理公司

B、提供企业相关资质去开腾讯广告推广账户审核

C、签订合同并对腾讯社交广告推广账户进行充值,一般是5000元

D、搭建腾讯广告账户

E、设计创意素材进行腾讯广告投放

额外说一下,很多人可能会问,找官方开或代理开有什么区别?其实不管腾讯还是百度,其实都授权给代理商了,而且还有一级二级代理商。

所谓代理商开户,大家都懂的约定俗成的,消耗多有返点。作者就不透露了,每个平台返点不一样,跟你消耗额也不一样。你可以理解团购和单买的区别。所以,代运营公司这也是一个收入点嘿嘿。

2、广点通广告优化要点:

上面头条里的 A 、B、C 3点差不多,你也要去了解比如广点通,朋友圈用户主要在的时间哈。

另外,说下第四点,腾讯广点通检测广告要比头条更细致,像我在前东家,我们要求30分钟就要看一次数据变化。以免让我们的广告产生不必要的消耗。

再因为技术搞了一个自动批量上传素材,所以其实也给信息流优化师减少很多重复工作。比如,我要测广点通同一素材同一时间投放不同位置效果,那么,这个小工具就棒棒哒了哈哈哈。

广点通信息流优化还有一个核心点,那就是量跑起来了,这个产品其实是可以跟投的哈哈哈。

总之记住一句话:胆子要大,心要细。只有胆子大,你才会当单量跑起来,不会怕控制不住。心要细,就是每一单投的都是钱哈哈哈。

当然,我这里没有说,订单真假退换货,如果投放,不管是自已还是代运营,都要考虑的,我们还专门有一个广告最高投放计算公司呢,这里就不透露了,内部秘密嘿嘿。

百度信息流(含旗下产品)广告投放和优化

1、百度信息流广告投放流程:

签约开户——充钱——账户搭建——创意制作——落地页制作——数据分析——投放优化

如果你投过SEM,然后来投百度信息流是容易多了。开户我就不说了。账户搭建说下,主要是计划、单元搭建与定向和出价设置。定向这里,里面你要提前准备关键词哦,那里是1000个。

在账户投放初期,选择跑关键词定向,建立的模型准确,进入第二阶段后几乎不会跑偏,且量不小。等发现素材量级减小,可逐渐增加兴趣/兴趣拓展定向。切记得缓慢增加,不能一次性全选兴趣。

另外,百度竞价里兴趣定向有个区别于其他平台的内容:兴趣拓展。单个兴趣拓展的量是比较大的,因此在兴趣方面,可尝试的有:兴趣组合、单个兴趣拓展、兴趣拓展组合哈。

关于出价,你可以根据大盘建议去出,这样再调整优化。

2、百度信息流广告优化要点:

A、观察CTR:一般曝光5000-10000时,CTR就具有参考价值了。若CTR过低,则可设置时间段 / 次日投放,看是否有变化。若还低,则关这条广告。

啥,CTR是啥?白话说就是点击通过率,即实际点击数除以展示数哈。

B、观察前端转化:一般一个广告会观察3-5天,若3-5天还未进入第二阶段,说明定向过窄 / 转化成本过高 / 落地页有问题等,需关。进入了第二阶段,但转化成本较高,则继续观察,再做判断。

C、观察后端转化:若前端转化可以,则观察后端转化。若后端转化成本高,可能是转化路径上的ocpc代码埋点有问题,找开发重新对接到更合理的位置,前端和后端的转化越靠近误差越小。

ocpc又是啥?简单理解是一种智能投放出价模式。嗯,相对CPC更智能化一点,再简单说,你可以按单量来设置它。其实头条等都有这个。百度这个OCPC,说了也是点击扣费哈哈哈。

再多说两句,不管是投二类电商的信息流,还是投公众号加粉,招商加盟,教育培训,家装,游戏,APP,小说,金融等等信息流,最最核心就是你要去了解那个信息流渠道的特点,即用户属性,是否适合你的产品。

我们做SEO是否可以转型信息流广告优化师呢?其实也是可以的。关于二者谁容易谁难,作者做为过来人说句实话,要做好,都不容易!

作者:白杨SEO  公众号:白杨SEO

2020年8月14日 By mikel 分类: 数据库

来源: SQL Server 取日期时间 – 一技赢 – 博客园

在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate()
用DateName()就可以获得相应的年、月、日,然后再把它们连接起来就可以了:

Select Datename(year,GetDate())+’-‘+Datename
(month,GetDate())+’-‘+Datename(day,GetDate())

另外,DateName()还可以获得到小时、时间、秒、星期几、第几周,分别如下:

Select Datename(hour,GetDate())
Select Datename(minute,GetDate())
Select Datename(second,GetDate())
Select Datename(weekDay,GetDate())
Select Datename(week,GetDate())

SQL中的日期类型DateTime的默认格式就是yyyy-mm-dd hh:mi:ss: mmm,可大多数的情况我们只想得到他的日期部分,而不许要后面的时间。上一篇中提到用Datename()函数来截取拼接出不包含时间部分的日期,现在再说一种方法,更加简单的获取到不包含时间的日期!

使用Convert()函数:

select convert(char(10),GetDate(),120) as Date

* 第3个参数就是用来设置日期类型数据的显示样式的,下面介绍几种样式的参数:

100   mm dd yyyy

101   mm/dd/yyyy

102   yyyy.mm.dd

103   dd/mm/yyyy

106   dd mm yyyy

108   hh:mi:ss(时间)

111   yyyy/mm/dd

112   yyyymmdd

120   yyyy-mm-dd

 

复制代码
 1 SELECT CONVERT(varchar(100), GETDATE(), 0) 05  9 2011  9:12AM
 2  SELECT CONVERT(varchar(100), GETDATE(), 1) 05/09/11
 3 SELECT CONVERT(varchar(100), GETDATE(), 2) 11.05.09
 4 SELECT CONVERT(varchar(100), GETDATE(), 3) 09/05/11
 5 SELECT CONVERT(varchar(100), GETDATE(), 4) 09.05.11
 6 SELECT CONVERT(varchar(100), GETDATE(), 5) 09-05-11
 7 SELECT CONVERT(varchar(100), GETDATE(), 6) 09 05 11
 8 SELECT CONVERT(varchar(100), GETDATE(), 7) 05 09, 11
 9 SELECT CONVERT(varchar(100), GETDATE(), 8) 09:13:14
10 SELECT CONVERT(varchar(100), GETDATE(), 9) 05  9 2011  9:13:14:670AM
11 SELECT CONVERT(varchar(100), GETDATE(), 10) 05-09-11
12 SELECT CONVERT(varchar(100), GETDATE(), 11) 11/05/09
13 SELECT CONVERT(varchar(100), GETDATE(), 12) 110509
14 SELECT CONVERT(varchar(100), GETDATE(), 13) 09 05 2011 09:13:14:670
15 SELECT CONVERT(varchar(100), GETDATE(), 14) 09:13:14:670
16 SELECT CONVERT(varchar(100), GETDATE(), 20) 2011-05-09 09:13:14
17 SELECT CONVERT(varchar(100), GETDATE(), 21) 2011-05-09 09:13:14.670
18 SELECT CONVERT(varchar(100), GETDATE(), 22) 05/09/11  9:15:33 AM
19 SELECT CONVERT(varchar(100), GETDATE(), 23) 2011-05-09
20 SELECT CONVERT(varchar(100), GETDATE(), 24) 09:15:33
21 SELECT CONVERT(varchar(100), GETDATE(), 25) 2011-05-09 09:15:33.140
22 SELECT CONVERT(varchar(100), GETDATE(), 100) 05  9 2011  9:15AM
23 SELECT CONVERT(varchar(100), GETDATE(), 101) 05/09/2011
24 SELECT CONVERT(varchar(100), GETDATE(), 102) 2011.05.09
25 SELECT CONVERT(varchar(100), GETDATE(), 103) 09/05/2011
26 SELECT CONVERT(varchar(100), GETDATE(), 104) 09.05.2011
27 SELECT CONVERT(varchar(100), GETDATE(), 105) 09-05-2011
28 SELECT CONVERT(varchar(100), GETDATE(), 106) 09 05 2011
29 SELECT CONVERT(varchar(100), GETDATE(), 107) 05 09, 2011
30 SELECT CONVERT(varchar(100), GETDATE(), 108) 09:16:38
31 SELECT CONVERT(varchar(100), GETDATE(), 109) 05  9 2011  9:16:38:543AM
32 SELECT CONVERT(varchar(100), GETDATE(), 110) 05-09-2011
33 SELECT CONVERT(varchar(100), GETDATE(), 111) 2011/05/09
34 SELECT CONVERT(varchar(100), GETDATE(), 112) 20110509
35 SELECT CONVERT(varchar(100), GETDATE(), 113) 09 05 2011 09:17:19:857
36 SELECT CONVERT(varchar(100), GETDATE(), 114) 09:17:19:857
37 SELECT CONVERT(varchar(100), GETDATE(), 120) 2011-05-09 09:17:19
38 SELECT CONVERT(varchar(100), GETDATE(), 121) 2011-05-09 09:17:19.857
39 SELECT CONVERT(varchar(100), GETDATE(), 126) 2011-05-09T09:17:19.857
40 SELECT CONVERT(varchar(100), GETDATE(), 130)  6 ????? ??????? 1432  9:17:19:857AM
41 SELECT CONVERT(varchar(100), GETDATE(), 131)  6/06/1432  9:17:19:857AM
复制代码

 

SQL Server 取日期时间 – 一技赢 – 博客园已关闭评论
2020年8月12日 By mikel 分类: 架构设计, Python

来源: 用Python爬取股票数据,绘制K线和均线并用机器学习预测股价(来自我出的书) – hsm_computer – 博客园

最近我出了一本书,《基于股票大数据分析的Python入门实战 视频教学版》,京东链接:https://item.jd.com/69241653952.html,在其中用股票范例讲述Python爬虫、数据分析和机器学习的技术,大家看了我的书,不仅能很快用比较热门的案例学好Python,更能了解些股票知识,不至于一入市就拍脑袋买卖。

在本文里,将给出若干精彩范例,包括用爬虫获取股市数据,用matplotlib可视化控件绘制K线和均线,以及用sklean库里的方法,通过机器学习预测股价的走势。

1 通过pandas_datareader库的方法爬取股市数据

pandas_datareader是一个能读取各种金融数据的库,在下面的getDataByPandasDatareader.py范例程序中演示了通过这个库获取股市数据的常规方法。

复制代码
1    # coding=utf-8
2    from pandas_datareader import data as pdr
3    import yfinance as yf
4    yf.pdr_override()
5    code='600895.ss'
6    stock = pdr.get_data_yahoo(code,'2019-01-02','2019-02-01')
7    print(stock)    # 输出内容
8    # 保存为excel和csv文件
9    stock.to_excel('D:\\stockData\\ch5\\'+code+'.xlsx')
10    stock.to_csv('D:\\stockData\ch5\\'+code+'.csv')
复制代码

从这个范例程序的代码上来看,不算复杂,从中没有见到爬取网站之类的代码。关键的是第6行,通过调用pdr.get_data_yahoo方法从雅虎网站获取数据,这个方法的参数分别是股票代码,开始日期和结束日期。第4行使用yf.pdr_override方法是为了防止雅虎网站修改获取历史数据的API接口而导致get_data_yahoo方法不可用。

在这个范例程序中获取了600895(张江高科)2019-01-02到2019-01-31的数据,可以看出,获取的数据并不包括结束日期参数当天的数据。

在第7行和第8行分别调用了to_excel和to_csv方法,把结果存入了指定目录下的文件中。这个范例程序运行后,我们首先能在控制台中看到输出,其次会在D:\stockData\ch5\目录中,看到600895.ss.xlsx和600895.ss.csv这两个保存股票数据的文件。打开600895.ss.xlsx文件,能看到如图5-4所示的数据内容,其实在控制台中和另一个csv文件中,可以看到一样的数据。

在上述范例程序中,在调用get_data_yahoo方法时,传入的股票代码带有.ss的后缀,这表示该代码是沪股的。此外,还能通过.sz的后缀来表示深股,通过.hk的后缀表示港股。如果要获取美股的数据,则直接用美股的股票代码即可。在下面的printDataByPandasDatareader.py范例程序中演示了获取美股,港股和深股相关数据的方式。

复制代码
1    # coding=utf-8
2    from pandas_datareader import data as pdr
3    import yfinance as yf
4    yf.pdr_override()
5    stockCodeList = []
6    stockCodeList.append('600007.ss')      # 沪股“中国国贸”
7    stockCodeList.append('000001.sz')     # 深股“平安银行”
8    stockCodeList.append('2318.hk')       # 港股“中国平安”
9    stockCodeList.append('IBM')         # 美股,IBM,直接输入股票代码不带后缀
10    for code in stockCodeList:
11        # 为了演示,只取一天(2019-01-02)的交易数据
12        stock = pandas_datareader.get_data_yahoo(code,'2019-01-02','2019-01-03')
13        print(stock)
复制代码

这个范例程序运行后,就能从控制台中看到输出的4个股票在指定日期内的交易情况,由于数据量比较多,本书就不罗列具体的数据了。

2 用matplotlib绘制k线和均线

K线是由开盘价、收盘价、最高价和最低价这四个要素构成。在得到上述四个值之后,首先用开盘价和收盘价绘制成一个长方形实体。随后根据最高价和最低价,把它们垂直地同长方形实体连成一条直线,这条直线就叫影线。如果再细分一下,长方形实体上方的就叫上影线,下方的就叫下影线。通过K线可以形象地记录价格变动的情况,常用的有日K线,周K线和月K线。

均线也叫移动平均线(Moving Average,简称MA),是指某段时间内的平均股价(或指数)连成的曲线,均线一般分为三类:短期、中期和长期。通常把5日和10日移动平均线称为短期均线,一般把20日、30日和60日移动平均线作为中期均线,一般120日和250日(甚至更长)移动平均线称为长期均线。

在如下的drawKAndMAMore.py范例程序中,将用到上文提到的爬取股票数据的代码,从网络接口里获取股票数据,并绘制k线和均线,请大家不仅注意k线和均线的含义,还要重视matplotlib库里绘制图形、图例和坐标轴的做法,在这本书里,对应的知识点都有详细的说明。

复制代码
1    # !/usr/bin/env python
2    # coding=utf-8
3    from pandas_datareader import data as pdr
4    import pandas as pd
5    import matplotlib.pyplot as plt
6    from mpl_finance import candlestick2_ochl
7    from matplotlib.ticker import MultipleLocator
8    import yfinance as yf
9    yf.pdr_override()
10    # 根据指定代码和时间范围获取股票数据
11    code='600895.ss'
12    stock.drop(stock.index[len(stock)-1],inplace=True)
13    # 保存在本地
14    stock.to_csv('D:\\stockData\ch7\\600895.csv')
15    df = pd.read_csv('D:/stockData/ch7/600895.csv',encoding='gbk',index_col=0)
16    # 设置窗口大小
17    fig, ax = plt.subplots(figsize=(10, 8))
18    xmajorLocator   = MultipleLocator(5)     # 将x轴主刻度设置为5的倍数
19    ax.xaxis.set_major_locator(xmajorLocator)
20    # 调用方法绘制K线图 
21    candlestick2_ochl(ax = ax, opens=df["Open"].values,closes=df["Close"].values, highs=df["High"].values, lows=df["Low"].values,width=0.75, colorup='red', colordown='green')
22    # 如下是绘制3种均线
23    df['Close'].rolling(window=3).mean().plot(color="red",label='3日均线')
24    df['Close'].rolling(window=5).mean().plot(color="blue",label='5日均线')
25    df['Close'].rolling(window=10).mean().plot(color="green",label='10日均线')
26    plt.legend(loc='best')     # 绘制图例
27    ax.grid(True)     # 带网格线
28    plt.title("600895张江高科的K线图")
29    plt.rcParams['font.sans-serif']=['SimHei']
30    plt.setp(plt.gca().get_xticklabels(), rotation=30) 
31    plt.show()
复制代码

第一,从第9行到第15行通过调用之前介绍过的get_data_yahoo方法,传入股票代码、开始时间和结束时间这三个参数,从雅虎网站中获得股票交易的数据。

第二,在第17行中调用figsize方法设置了窗口的大小。

第三,第18行和第19行的程序代码设置了主刻度是5的倍数。之所以设置成5的倍数,是因为一般一周的交易日是5天。但这里不能简单地把主刻度设置成每周一,因为某些周一有可能是股市休市的法定假日。

第四,由于无需在x轴上设置每天的日期,因此这里无需再调用plt.xticks方法,但是要调用如第30行所示的代码,设置x轴刻度的旋转角度,否则x轴显示的时间依然有可能会相互重叠。

至于绘制K线的candlestick2_ochl方法和绘制均线的rolling方法与之前drawKAndMA.py范例程序中的代码是完全一致的。

这个范例程序的运行结果如图7-5所示,从中可以看到改进后的效果。由于本次显示的股票时间段变长了(是3个月),因此与drawKAndMA.py范例程序相比,这个范例程序均线的效果更为明显,尤其是3日均线,几乎贯穿于整个时间段的各个交易日。

另外,由于在第26行通过调用plt.legend(loc=’best’)方法指定了图例将“显示在合适的位置”,因此这里的图例显示在效果更加合适的左上方,而不是drawKAndMA.py范例程序中的右上方。

3 用sklearn库的机器学习方法预测股票后市价格

在下面的predictStockByLR.py范例程序中,根据股票历史的开盘价、收盘价和成交量等特征值,从数学角度来预测股票未来的收盘价。

复制代码
1    # !/usr/bin/env python
2    # coding=utf-8
3    import pandas as pd
4    import numpy as np
5    import math
6    import matplotlib.pyplot as plt
7    from sklearn.linear_model import LinearRegression
8    from sklearn.model_selection import train_test_split
9    # 从文件中获取数据
10    origDf = pd.read_csv('D:/stockData/ch13/6035052018-09-012019-06-01.csv',encoding='gbk')
11    df = origDf[['Close', 'High', 'Low','Open' ,'Volume']]
12    featureData = df[['Open', 'High', 'Volume','Low']]
13    # 划分特征值和目标值
14    feature = featureData.values
15    target = np.array(df['Close'])
复制代码

第10行的程序语句从包含股票信息的csv文件中读取数据,在第14行设置了特征值是开盘价、最高价、最低价和成交量,同时在第15行设置了要预测的目标列是收盘价。在后续的代码中,需要将计算出开盘价、最高价、最低价和成交量这四个特征值和收盘价的线性关系,并在此基础上预测收盘价。

复制代码
16    # 划分训练集,测试集
17    feature_train, feature_test, target_train ,target_test = train_test_split(feature,target,test_size=0.05)
18    pridectedDays = int(math.ceil(0.05 * len(origDf)))     # 预测天数
19    lrTool = LinearRegression()
20    lrTool.fit(feature_train,target_train)     # 训练
21    # 用测试集预测结果
22    predictByTest = lrTool.predict(feature_test)
复制代码

第17行的程序语句通过调用train_test_split方法把包含在csv文件中的股票数据分成训练集和测试集,这个方法前两个参数分别是特征列和目标列,而第三个参数0.05则表示测试集的大小是总量的0.05。该方法返回的四个参数分别是特征值的训练集、特征值的测试集、要预测目标列的训练集和目标列的测试集。

第18行的程序语句计算了要预测的交易日数,在第19行中构建了一个线性回归预测的对象,在第20行是调用fit方法训练特征值和目标值的线性关系,请注意这里的训练是针对训练集的,在第22行中,则是用特征值的测试集来预测目标值(即收盘价)。也就是说,是用多个交易日的股价来训练lrTool对象,并在此基础上预测后续交易日的收盘价。至此,上面的程序代码完成了相关的计算工作。

复制代码
23    # 组装数据
24    index=0
25    # 在前95%的交易日中,设置预测结果和收盘价一致
26    while index < len(origDf) - pridectedDays:
27        df.ix[index,'predictedVal']=origDf.ix[index,'Close']
28        df.ix[index,'Date']=origDf.ix[index,'Date']
29        index = index+1
30    predictedCnt=0
31    # 在后5%的交易日中,用测试集推算预测股价
32    while predictedCnt<pridectedDays:
33        df.ix[index,'predictedVal']=predictByTest[predictedCnt]
34        df.ix[index,'Date']=origDf.ix[index,'Date']
35        predictedCnt=predictedCnt+1
36        index=index+1
复制代码

在第26行到第29行的while循环中,在第27行把训练集部分的预测股价设置成收盘价,并在第28行设置了训练集部分的日期。

在第32行到第36行的while循环中,遍历了测试集,在第33行的程序语句把df中表示测试结果的predictedVal列设置成相应的预测结果,同时也在第34行的程序语句逐行设置了每条记录中的日期。

复制代码
37    plt.figure()
38    df['predictedVal'].plot(color="red",label='predicted Data')
39    df['Close'].plot(color="blue",label='Real Data')
40    plt.legend(loc='best')     # 绘制图例
41    # 设置x坐标的标签
42    major_index=df.index[df.index%10==0]
43    major_xtics=df['Date'][df.index%10==0]
44    plt.xticks(major_index,major_xtics)
45    plt.setp(plt.gca().get_xticklabels(), rotation=30)
46    # 带网格线,且设置了网格样式
47    plt.grid(linestyle='-.')
48    plt.show()
复制代码

在完成数据计算和数据组装的工作后,从第37行到第48行程序代码的最后,实现了可视化。

第38行和第39行的程序代码分别绘制了预测股价和真实收盘价,在绘制的时候设置了不同的颜色,也设置了不同的label标签值,在第40行通过调用legend方法,根据收盘价和预测股价的标签值,绘制了相应的图例。

从第42行到第45行设置了x轴显示的标签文字是日期,为了不让标签文字显示过密,设置了“每10个日期里只显示1个”的显示方式,并且在第47行设置了网格线的效果,最后在第48行通过调用show方法绘制出整个图形。运行本范例程序,即可看到如图13-7所示的结果。

 

可以看出,蓝线表示真实的收盘价(图中完整的线),红线表示预测股价(图中靠右边的线。因为本书黑白印刷的原因,在书中读者看不到蓝色和红色,请读者在自己的计算机上运行这个范例程序即可看到红蓝两色的线)。虽然预测股价和真实价之间有差距,但涨跌的趋势大致相同。而且在预测时没有考虑到涨跌停的因素,所以预测结果的涨跌幅度比真实数据要大。

股票价格不仅由技术面决定,还受政策面、资金量以及消息面等诸多因素的影响,这也能解释预测结果和真实结果间有差异的原因。

4 对书的介绍和版权说明

本文给出的范例,仅是《基于股票大数据分析的Python入门实战 视频教学版》一书里的部分案例,该书京东链接:https://item.jd.com/69241653952.html

这本书包括如下的内容,是本入门python的工具书。

1 Python基本语法,集合,面向对象语法,异常处理,读写文件技能。

2 Python操作数据库的技能。

3 通过爬虫从网络接口爬取股票数据的技能。

4 基于Numpy+Pandas+Matplotlib进行数据分析的技能

5 基于TKinter的GUI编程技能+ 发送邮件的技能

6 Django框架的用法

7 线性回归+SVM的机器学习技能

这本书里,像本文那样花花绿绿能吸引人的图真不少,而且还是通过python绘制出来的,用这类比较能吸引人的案例来入门python,一定非常高效。

    本文可以转载,转载时请全文转载,别有删节,并用链接的形式给出原文链接。否则的话,可能会遇到出版社的维权。

文本相关链接:

用Python爬取股票数据,绘制K线和均线并用机器学习预测股价(来自我出的书) – hsm_computer – 博客园已关闭评论
2020年8月12日 By mikel 分类: ASP.NET, C#, 架构设计

来源: .Net微服务实战之Kubernetes的搭建与使用 – 陈珙 – 博客园

系列文章

前言

说到微服务就得扯到自动化运维,然后别人就不得不问你用没用上K8S。无论是概念上还是在实施搭建时,K8S的门槛比Docker Compose、Docker Swarm高了不少。我自己也经过了多次的实践,整理出一套顺利部署的流程。

我这次搭建花了一共整整4个工作实践与一个工作日写博客,中间有一个网络问题导致reset了集群重新搭了一次,完成后结合了Jenkins使用,还是成就感满满的。如果对大家有用,还请点个推荐于关注。

基本概念

Kubectl

kubectl用于运行Kubernetes集群命令的管理工具,Kubernetes kubectl 与 Docker 命令关系可以查看这里

http://docs.kubernetes.org.cn/70.html

Kubeadm

kubeadm 是 kubernetes 的集群安装工具,能够快速安装 kubernetes 集群,相关命令有以下:

kubeadm init

kubeadm join

Kubelet

kubelet是主要的节点代理,它会监视已分配给节点的pod,具体功能:

  • 安装Pod所需的volume。
  • 下载Pod的Secrets。
  • Pod中运行的 docker(或experimentally,rkt)容器。
  • 定期执行容器健康检查。

Pod

Pod是Kubernetes创建或部署的最小(最简单)的基本单位,一个Pod代表集群上正在运行的一个进程,它可能由单个容器或多个容器共享组成的资源。

一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。

Pods提供两种共享资源:网络和存储。

网络

每个Pod被分配一个独立的IP地址,Pod中的每个容器共享网络命名空间,包括IP地址和网络端口。Pod内的容器可以使用localhost相互通信。当Pod中的容器与Pod 外部通信时,他们必须协调如何使用共享网络资源(如端口)。

存储

Pod可以指定一组共享存储volumes。Pod中的所有容器都可以访问共享volumes,允许这些容器共享数据。volumes 还用于Pod中的数据持久化,以防其中一个容器需要重新启动而丢失数据。

Service

一个应用服务在Kubernetes中可能会有一个或多个Pod,每个Pod的IP地址由网络组件动态随机分配(Pod重启后IP地址会改变)。为屏蔽这些后端实例的动态变化和对多实例的负载均衡,引入了Service这个资源对象。

Kubernetes ServiceTypes 允许指定一个需要的类型的 Service,默认是 ClusterIP 类型。

Type 的取值以及行为如下:

  • ClusterIP:通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType。
  • NodePort:通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 <NodeIP>:<NodePort>,可以从集群的外部访问一个 NodePort 服务。
  • LoadBalancer:使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。
  • ExternalName:通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容(例如, foo.bar.example.com)。 没有任何类型代理被创建,这只有 Kubernetes 1.7 或更高版本的 kube-dns 才支持。

其他详细的概念请移步到 http://docs.kubernetes.org.cn/227.html

物理部署图

 

Docker-ce 1.19安装

在所有需要用到kubernetes服务器上安装docker-ce

卸载旧版本 docker

yum remove docker docker-common docker-selinux dockesr-engine -y
升级系统软件
yum upgrade -y
安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加docker-ce软件源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新并安装 docker-ce
yum makecache fast
yum install docker-ce-19.03.12 -y
添加docker国内镜像源
vim /etc/docker/daemon.json
 
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors" : [
    "http://ovfftd6p.mirror.aliyuncs.com",
    "http://registry.docker-cn.com",
    "http://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries" : [
    "registry.docker-cn.com",
    "docker.mirrors.ustc.edu.cn"
  ],
  "debug" : true,
  "experimental" : true
}

启动服务

systemctl start docker
systemctl enable docker

安装kubernetes-1.18.3

所有需要用到kubernetes的服务器都执行以下指令。

添加阿里kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装并启动
yum install kubeadm-1.18.3 kubectl-1.18.3 kubelet-1.18.3

启动kubelet

systemctl enable kubelet
systemctl start kubelet

在Master设置环境变量,在/etc/profile中配置
vim /etc/profile
在最后添加如下配置
export KUBECONFIG=/etc/kubernetes/admin.conf

执行命令使其起效

source /etc/profile

初始化k8s集群

在master节点(server-a)进行初始化集群

开放端口

firewall-cmd --permanent --zone=public --add-port=6443/tcp
firewall-cmd --permanent --zone=public --add-port=10250/tcp
firewall-cmd --reload
关闭swap
vim /etc/fstab
#注释swap那行
 
swapoff -a

设置iptables规则

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables

初始化

kubeadm init --kubernetes-version=1.18.3  --apiserver-advertise-address=192.168.88.138   --image-repository registry.aliyuncs.com/google_containers  --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16 --ignore-preflight-errors=Swap

pod-network-cidr参数的为pod网段:,apiserver-advertise-address参数为本机IP。

  如果中途执行有异常可以通过 kubeadm reset 后重新init。
初始化成功执行下面指令
 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看node和pod信息
kubectl get node
kubectl get pod --all-namespaces

安装flannel组件

在master节点(server-a)安装flannel组件

找个梯子下载kube-flannel.yml文件

https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

下载不了也没关系,我复制给到大家:

---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: psp.flannel.unprivileged
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
    seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
    apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
    apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
  privileged: false
  volumes:
    - configMap
    - secret
    - emptyDir
    - hostPath
  allowedHostPaths:
    - pathPrefix: "/etc/cni/net.d"
    - pathPrefix: "/etc/kube-flannel"
    - pathPrefix: "/run/flannel"
  readOnlyRootFilesystem: false
  # Users and groups
  runAsUser:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  # Privilege Escalation
  allowPrivilegeEscalation: false
  defaultAllowPrivilegeEscalation: false
  # Capabilities
  allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
  defaultAddCapabilities: []
  requiredDropCapabilities: []
  # Host namespaces
  hostPID: false
  hostIPC: false
  hostNetwork: true
  hostPorts:
  - min: 0
    max: 65535
  # SELinux
  seLinux:
    # SELinux is unused in CaaSP
    rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: flannel
rules:
  - apiGroups: ['extensions']
    resources: ['podsecuritypolicies']
    verbs: ['use']
    resourceNames: ['psp.flannel.unprivileged']
  - apiGroups:
      - ""
    resources:
      - pods
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - nodes
    verbs:
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - nodes/status
    verbs:
      - patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
  namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
  labels:
    tier: node
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds-amd64
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/os
                    operator: In
                    values:
                      - linux
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                      - amd64
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.12.0-amd64
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.12.0-amd64
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
        - name: run
          hostPath:
            path: /run/flannel
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: flannel-cfg
          configMap:
            name: kube-flannel-cfg
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds-arm64
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/os
                    operator: In
                    values:
                      - linux
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                      - arm64
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.12.0-arm64
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.12.0-arm64
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
             add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
        - name: run
          hostPath:
            path: /run/flannel
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: flannel-cfg
          configMap:
            name: kube-flannel-cfg
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds-arm
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/os
                    operator: In
                    values:
                      - linux
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                      - arm
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.12.0-arm
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.12.0-arm
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
             add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
        - name: run
          hostPath:
            path: /run/flannel
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: flannel-cfg
          configMap:
            name: kube-flannel-cfg
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds-ppc64le
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/os
                    operator: In
                    values:
                      - linux
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                      - ppc64le
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.12.0-ppc64le
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.12.0-ppc64le
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
             add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
        - name: run
          hostPath:
            path: /run/flannel
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: flannel-cfg
          configMap:
            name: kube-flannel-cfg
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds-s390x
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/os
                    operator: In
                    values:
                      - linux
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                      - s390x
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.12.0-s390x
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.12.0-s390x
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
             add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
        - name: run
          hostPath:
            path: /run/flannel
        - name: cni
          hostPath:
            path: /etc/cni/net.d
        - name: flannel-cfg
          configMap:
            name: kube-flannel-cfg

先拉取依赖镜像

 docker pull  quay.io/coreos/flannel:v0.12.0-amd64

把上面文件保存到服务器然后执行下面命令

kubectl apply -f kube-flannel.yml

安装dashboard

在master节点(server-a)安装dashboard组件

继续用梯子下载recommended.yml文件

https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

没梯子的可以复制下方原文件

# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: v1
kind: Namespace
metadata:
  name: kubernetes-dashboard

---

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard

---

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-certs
  namespace: kubernetes-dashboard
type: Opaque

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-csrf
  namespace: kubernetes-dashboard
type: Opaque
data:
  csrf: ""

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-key-holder
  namespace: kubernetes-dashboard
type: Opaque

---

kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-settings
  namespace: kubernetes-dashboard

---

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
rules:
  # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
  - apiGroups: [""]
    resources: ["secrets"]
    resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
    verbs: ["get", "update", "delete"]
    # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
  - apiGroups: [""]
    resources: ["configmaps"]
    resourceNames: ["kubernetes-dashboard-settings"]
    verbs: ["get", "update"]
    # Allow Dashboard to get metrics.
  - apiGroups: [""]
    resources: ["services"]
    resourceNames: ["heapster", "dashboard-metrics-scraper"]
    verbs: ["proxy"]
  - apiGroups: [""]
    resources: ["services/proxy"]
    resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
    verbs: ["get"]

---

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
rules:
  # Allow Metrics Scraper to get metrics from the Metrics server
  - apiGroups: ["metrics.k8s.io"]
    resources: ["pods", "nodes"]
    verbs: ["get", "list", "watch"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kubernetes-dashboard
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubernetes-dashboard
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard

---

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      containers:
        - name: kubernetes-dashboard
          image: kubernetesui/dashboard:v2.0.3
          imagePullPolicy: Always
          ports:
            - containerPort: 8443
              protocol: TCP
          args:
            - --auto-generate-certificates
            - --namespace=kubernetes-dashboard
            # Uncomment the following line to manually specify Kubernetes API server Host
            # If not specified, Dashboard will attempt to auto discover the API server and connect
            # to it. Uncomment only if the default does not work.
            # - --apiserver-host=http://my-address:port
          volumeMounts:
            - name: kubernetes-dashboard-certs
              mountPath: /certs
              # Create on-disk volume to store exec logs
            - mountPath: /tmp
              name: tmp-volume
          livenessProbe:
            httpGet:
              scheme: HTTPS
              path: /
              port: 8443
            initialDelaySeconds: 30
            timeoutSeconds: 30
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            runAsUser: 1001
            runAsGroup: 2001
      volumes:
        - name: kubernetes-dashboard-certs
          secret:
            secretName: kubernetes-dashboard-certs
        - name: tmp-volume
          emptyDir: {}
      serviceAccountName: kubernetes-dashboard
      nodeSelector:
        "kubernetes.io/os": linux
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
        - key: node-role.kubernetes.io/master
          effect: NoSchedule

---

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: dashboard-metrics-scraper
  name: dashboard-metrics-scraper
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 8000
      targetPort: 8000
  selector:
    k8s-app: dashboard-metrics-scraper

---

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: dashboard-metrics-scraper
  name: dashboard-metrics-scraper
  namespace: kubernetes-dashboard
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: dashboard-metrics-scraper
  template:
    metadata:
      labels:
        k8s-app: dashboard-metrics-scraper
      annotations:
        seccomp.security.alpha.kubernetes.io/pod: 'runtime/default'
    spec:
      containers:
        - name: dashboard-metrics-scraper
          image: kubernetesui/metrics-scraper:v1.0.4
          ports:
            - containerPort: 8000
              protocol: TCP
          livenessProbe:
            httpGet:
              scheme: HTTP
              path: /
              port: 8000
            initialDelaySeconds: 30
            timeoutSeconds: 30
          volumeMounts:
          - mountPath: /tmp
            name: tmp-volume
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            runAsUser: 1001
            runAsGroup: 2001
      serviceAccountName: kubernetes-dashboard
      nodeSelector:
        "kubernetes.io/os": linux
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
        - key: node-role.kubernetes.io/master
          effect: NoSchedule
      volumes:
        - name: tmp-volume
          emptyDir: {}
第39行修改,端口范围30000-32767
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30221
  selector:
    k8s-app: kubernetes-dashboard

第137行开始,修改账户权限,主要三个参数,kind: ClusterRoleBinding,roleRef-kind: ClusterRole,roleRef-name: cluster-admin

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard

---

保存到服务器后执行以下命令

kubectl apply -f recommended.yaml

等待一段时间启动成功后,https://ip+nodePort,查看UI

Token通过下面指令获取

kubectl -n kubernetes-dashboard get secret

kubectl describe secrets -n kubernetes-dashboard kubernetes-dashboard-token-kfcp2  | grep token | awk 'NR==3{print $2}'

加入Worker节点

在server-b与server-c执行下面操作

把上面init后的那句join拷贝过来,如果忘记了可以在master节点执行下面指令:

kubeadm token list

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

通过返回的数据拼装成下面指令

kubeadm join 192.168.88.138:6443 --token 2zebwy.1549suwrkkven7ow  --discovery-token-ca-cert-hash sha256:c61af74d6e4ba1871eceaef4e769d14a20a86c9276ac0899f8ec6b08b89f532b

查看节点信息

kubectl get node

部署Web应用

在master节点(sever-a)执行下面操作

部署应用前建议有需要的朋友到【.Net微服务实战之CI/CD】看看如何搭建docker私有仓库,后面需要用到,搭建后私有库后执行下面指令

kubectl create secret docker-registry docker-registry-secret --docker-server=192.168.88.141:6000 --docker-username=admin --docker-password=123456789

docker-server就是docker私有仓库的地址

下面是yaml模板,注意imagePullSecrets-name与上面的命名的一致,其余的可以查看yaml里的注释

apiVersion: apps/v1
kind: Deployment # Deployment为多个Pod副本
metadata:
  name: testdockerswarm-deployment
  labels:
    app: testdockerswarm-deployment
spec:
  replicas: 2 # 实例数量
  selector:
    matchLabels: # 定义该部署匹配哪些Pod
      app: testdockerswarm
  minReadySeconds: 3 # 可选,指定Pod可以变成可用状态的最小秒数,默认是0
  strategy:
    type: RollingUpdate # 部署策略类型,使用RollingUpdate可以保证部署期间服务不间断
    rollingUpdate:
      maxUnavailable: 1 # 部署时最大允许停止的Pod数量
      maxSurge: 1 # 部署时最大允许创建的Pod数量
  template: # 用来指定Pod的模板,与Pod的定义类似
    metadata:
      labels: # Pod标签,与上面matchLabels对应
        app: testdockerswarm
    spec:
      imagePullSecrets:
        - name: docker-registry-secret
      containers:
        - name: testdockerswarm
          image: 192.168.88.141:6000/testdockerswarm
          imagePullPolicy: Always # Always每次拉去新镜像
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: testdockerswarm-service
  labels:  
    name: testdockerswarm-service
spec:
  selector:
    app: testdockerswarm #与template-labels参数pod标签一致
  ports:
    - protocol: TCP
      port: 80 #clusterIP开放的端口
      targetPort: 80 #container开放的端口,与containerPort一致
      nodePort: 31221 # 所有的节点都会开放此端口,此端口供外部调用。
  type: NodePort

把yaml文件保存到服务器后执行下面命令

kubectl create -f testdockerswarm.yml

整个搭建部署的过程基本上到这里结束了。

访问

可以通过指令kubectl get service得到ClusterIP,分别在server-c和sever-b执行curl 10.10.184.184

也可以通过执行kubectl get pods -o wide得到pod ip,在server-c执行curl 10.122.2.5 和 server-b执行curl 10.122.1.7

也可以在外部访问 server-c和server-b的 ip + 31221

如果节点有异常可以通过下面指令排查

journalctl -f -u kubelet.service | grep -i error -C 500

如果Pod无法正常running可以通过下面指令查看

kubectl describe pod testdockerswarm-deployment-7bc647d87d-qwvzm

 

.Net微服务实战之Kubernetes的搭建与使用 – 陈珙 – 博客园已关闭评论
2020年8月9日 By mikel 分类: Python

来源: 爬虫进阶教程:抖音APP无水印视频批量下载

一、前言

本文为两类人准备:技术控和工具控。

  • 如果你是工具控,想简单方便地下载无水印的视频,那么可以使用第三方去水印平台:

抖音短视频解析下载平台

  • 如果你是技术控,想要使用自己写的代码下载视频,那么可以使用本文的方法,用python写爬虫下载视频,最新开源项目:

Python3批量下载抖音无水印视频

本文的代码已经不是最新的,但是抓取思路就是如此,可以参考,代码可以直接运行使用,持续维护中

更新日志

  • 2018.5.23:github代码已经修复无法下载问题。
  • 2018.7.17:github代码已经修复参数验证问题。
  • 2018.11.07:api更新

二、实战背景

抖音越来越火,感觉它有毒,越刷越上瘾,总感觉下一个视频一定会更精彩,根本停不下来。想将抖音里喜欢的小哥哥/小姐姐的视频全部存到电脑硬盘里该如何操作?不想有抖音的视频水印该如何处理?

当初写完代码的截屏:

爬虫进阶教程:抖音APP无水印视频批量下载

三、实战

首先,希望你已经具备手机APP抓包分析的能力,如果不会请去自行学习:点击跳转

1、带水印视频下载

先说说带水印的视频如何抓去吧。在定好爬取目标的时候,我们应该知道自己需要那些步骤完成这项任务。比如本文中提到的任务:抖音APP固定用户的视频批量下载

思考过程:

  • 想要批量下载视频首先要获得这些视频的链接;
  • 想要获得这些视频链接可以通过用户的主页进行查看,想进用户主页,我得知道用户主页链接;
  • 用户主页链接可以通过抖音APP的搜索功能获取,那么搜索功能接口如何获取?当然是抓包看看喽!

瞧,这样思考下来,问题是不是梳理的很清楚?

搜索接口:

那么接下来就是抓包分析了,抓包过程请自行尝试。步骤是这样的:

  • 配置好Fiddler,即确定Fiddler可以对手机APP进行抓包;
  • 在手机APP搜索框中输入用户信息,点击搜索
  • 在Fiddler找到搜索接口;
  • 分析这个接口传递参数规则;
  • 写代码生成相应查询接口。

通过分析你会发现,我们通过搜索接口返回的JSON数据可以找到用户主页信息,接下里用同样的方法抓取主页用户信息再分析一波,这时候就遇到问题了,你会发现用户主页链接使用了as和cp参数进行了加密,这该如何是好?比如链接如下:

上述链接省略号部分是一些手机信息,这部分不是必须参数,可以省略。user_id是用户id可以通过上个搜索接口获取,count是用户视频数量,同样可以通过上个搜索接口获取。那最后的as和cp参数怎么办?

我没有逆向抖音APP,就是小小测试了一下,看看能不能绕过这个加密接口?抖音APP自带视频分享功能,分享链接格式如下:

中间参数都不重要,在此省略。www.douyin.com域名下存放的是分享的视频,那么这个用户主页信息是否可以通过这个域名进行访问呢?小小测试一下你会发现,完全没有问题!

这就是没有加密的接口,惊不惊喜,意不意外?根据这个用户主页接口,我们就可以轻松获取用户主页所有的视频链接了。

2、无水印视频下载

方法一:

无水印视频下载很简单,有一个通用的方法,就是使用去水印平台即可。

我使用的去水印平台是:http://douyin.iiilab.com/

在输入框中输入视频链接点击视频解析,就可以获得无水印视频链接。

这个网站当初我写代码的时候是好使的,当初用这个网站下了一些无水印视频,不过写这篇文章的时候发现这个取水印平台无法正常解析了,等它修复好了再用这个功能吧。

这个平台不仅包括抖音视频去水印,还支持火山、快手、陌陌、美拍等无水印视频。所以做一个这个网站的接口还是很合适的。

简单测试了一下,这个网站的API是需要付费解析的,如果通过模拟请求的方式有些困难,因此决定上浏览器模拟器Splinter。

Splinter是个好东西,跟Selenium使用类似,它的配置可以参考我的早期Selenium文章:http://blog.csdn.net/c406495762/article/details/72331737

Splinter有个很详细的英文文档:http://splinter.readthedocs.io/en/latest/

这里使用方法就不累述,不过有一点可以说的是,我们可以配置headless参数,来将Splinter配置为无头浏览器,啥事无头浏览器呢?就是运行Splinter不调出浏览器界面,直接在后台模拟各种请求,很是方便。

这部分的代码很简单,无非就是填充元素,确定解析按钮位置,点击按钮,获取视频下载链接即可。这点小问题,就自行分析吧。

整体代码:

方法二:

这个方法是通过网友@羽葵的反馈得知的,对下载链接直接修改即可得到无水印下载链接。

方法简单粗暴,很好用。好处就是处理速度飞快,缺点是这种方法通用性不强,不同视频发布平台的打码方法可能有不同,需要自行分析。

四、总结

玩爬虫的日子还是很有意思的,好久没有那种舒爽感了。还有,找工作也是蛮心累的事。

更多实战源码,请关注我的Github:https://github.com/Jack-Cherish/python-spider

爬虫进阶教程:抖音APP无水印视频批量下载已关闭评论
备案信息冀ICP 0007948