[时速云线上分享] 第十二期: k8s 如何管理 Pod - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
如果想在 V2EX 获得更好的推广效果,欢迎了解 PRO 会员机制:
pro/about
Tenxcloud10

[时速云线上分享] 第十二期: k8s 如何管理 Pod

  •  
  •   Tenxcloud10 2016 年 7 月 18 日 2696 次点击
    这是一个创建于 3565 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以下整理自 7 月 14 日第十二期技术分享内容,由 时速云 研发工程师 孟远 分享。

    在本次分享开始前,让我们先回想下 Pod 。 Pod 直译是豆荚,可以把容器想像成豆荚里的豆子,把一个或多个关系紧密的豆子包在一起就是豆荚(一个 Pod )。在 k8s 中我们不会直接操作容器,而是把容器包装成 Pod 再进行管理(关于 Pod ,大家可以参考第二期的分享“谈谈 Pod 在微服务中的运用”)。 Pod 是运行服务的基础,那我们如何来管理 Pod 呢,下面我们就来聊一聊。分为这三个部分:

    1. 使用 Replication Controller 来部署、升级 Pod

    2. Replica Set 下一代 Replication Controller

    3. Deployment 更加方便的管理 Pod 和 Replica Set

    先举个例子

    假设我们有一个 Pod 在提供线上服务,现在有如下几个场景,大家想想如何应对:

    1. 节日活动,网站访问量突增

    2. 遭到攻击,网站访问量突增

    3. 运行 Pod 的节点发生故障

    第 1 种情况, 活动前预先多启动几个 Pod ,活动结束后再结束掉多余的,虽然要启动和结束的 Pod 有点多,但也能有条不紊按计划进行

    第 2 种情况, 正在睡觉突然手机响了说网站反应特慢卡得要死,赶紧爬起来边扩容边查找攻击模式、封 IP 等等……

    第 3 种情况, 正在休假突然手机又响了说网站上不去,赶紧打开电脑查看原因,启动 新的 Pod

    Pod 需要手动管理,好累……

    能否在 Pod 发生问题时自动恢复呢,我们先来看下 Replication Controller (以下简称 RC )

    先说RC 是什么。 RC 保证在同一时间能够运行指定数量的 Pod 副本,保证 Pod 总是可用。如果实际 Pod 数量比指定的多就结束掉多余的,如果实际数量比指定的少就启动缺少的。当 Pod 失败、被删除或被终结时 RC 会自动创建新的 Pod 来保证副本数量。

    所以即使只有一个 Pod 也应该使用 RC 来进行管理。

    接下来我们看下如何创建 RC ,看这个定义文件 rc.yaml

    alt 文本

    这个文件定义了 RC 的属性,我们先关注如下字段:

    spec.replicas :副本数量 3

    spec.selector : RC 通过 spec.selector 来筛选要控制的 Pod

    spec.template :这里写 Pod 的定义(但不需要 apiVersion 和 kind )

    spec.template.metadata.labels : Pod 的 label ,可以看到这个 label 与 spec.selector 相同

    这个文件的意思是定义了一个 RC 对象,它的名字是 hello-rc ( metadata.name:hello-rc ),保证有 3 个 Pod 运行( spec.replicas:3 ), Pod 的镜像是 index.tenxcloud.com/tailnode/hello:v1.0 ( spec.template.spec.containers.image: index.tenxcloud.com/tailnode/hello:v1.0

    关键在于 spec.selector 与 spec.template.metadata.labels ,这两个字段必须相同,否则下一步创建 RC 会失败。(也可以不写 spec.selector ,这样默认与 spec.template.metadata.labels 相同)

    现在通过 kubectl 来创建 RC :

    alt 文本

    查看结果可以看到当前 RC 的状态:指定了需要 3 个 Pod 、当前实际有 3 个 Pod 、 3 个 Pod 都在运行中(图片较大只截取部分):

    alt 文本

    如果使用的镜像较大查看状态可能是 Waiting ,这是因为正在下载镜像,等待一段时间就好。

    alt 文本

    上面说过 RC 会自动管理 Pod 保证指定数量副本运行,我们来实验一下,看下图:

    alt 文本

    1.查看当前 Pod ,(注意 NAME 和 AGE 列)

    2.删除 hello-rc-5crgq

    3.再次查看 Pod ,发现新的 Pod 启动了(注意 NAME 和 AGE 列)

    到这里我们对 RC 有了基本的认识,并进行了简单的使用。

    现在回到最开始的问题,如何通过 RC 修改 Pod 副本数量。其实非常简单,只需要修改 yaml 文件 spec.replicas 字段成想要的值,然后执行 kubectl replace 命令(或者使用 kubect edit replicationcontroller hello-rc 直接修改).

    执行结果看下图:

    alt 文本

    当我们有新功能发布或修复 BUG 时使用滚动升级是不错的选择,可以使用工具 kubectl rolling-update 完成这个任务。对照下图我们来看下是如何进行的

    使用命令 kubectl rolling-update hello-rc image=index.tenxcloud.com/tailnode/hello:v2.0

    alt 文本

    在另一个窗口查看 RC

    alt 文本

    对照两张截图,我们能够看出升级步骤如下:

    1.创建一个使用新版本 Pod 的 RC , hello-rc-4f7ed44b6db1e20aa1bc681c81d63caf

    2.依次增加新 RC 的副本数量、减少旧 RC 的副本数量

    3.当升级成功后,删除旧 RC

    4.重命名新 RC 为 hello-rc

    当 Pod 中只有一个容器时通过 image 参数指定新的 Tag ,如果有多个容器或其他字段的修改时,需要使用 kubectl rolling-update NAME -f FILE 指定文件

    如果在升级过程中出现问题(比如长时间无响应),可以 CTRL+C 结束再使用 kubectl rolling-update hello-rc rollback 进行回滚,但如果升级完成后出现问题(比如新版本程序出 core ),此命令无能为力,需要使用同样方法“升级”为旧版本

    在时速云平台我们能够非常方便的使用弹性伸缩功能来调整 Pod 副本数量,还是举例说明:

    启动一个能够输出 Pod 主机名和版本号的服务,看下图当前只有一个 Pod 副本运行

    alt 文本

    点击弹性伸缩,修改数量为 3 ,同时使用下面的命令测试,从输出结果可以看出提供服务的 Pod 数量变成了 3 个:

    alt 文本

    下面再来测试下灰度升级功能,修改目标版本为 v2.0 (之前是 v1.0 ,为了便于查看效果新建有 2 个 Pod 的服务),然后查看 Pod 变化

    第一个新 Pod hello-v2.0-ywcc2 已经启动

    alt 文本

    第二个新 Pod hello-v2.0-whtvh 正在启动

    alt 文本

    最后一个旧 Pod hello-41ee8 正在停止

    alt 文本

    升级完成,只有两个新 Pod 提供服务

    alt 文本

    同时使用命令查看服务的响应如下:

    alt 文本

    k8s 是一个高速发展的项目,在新的版本中官方推荐使用 Replica Set 和 Deployment 来代替 RC 。

    那么它们优势在哪里,我们来看一看:

    1. RC 只支持基于等式的 selector ( env=dev 或 environment!=qa )但 Replica Set 还支持新的基于集合的 selector ( version in (v1.0, v2.0)或 env notin (dev, qa)),这对复杂的运维管理带来很大方便

    2. 使用 Deployment 升级 Pod 只需要定义 Pod 的最终状态, k8s 会为你执行必要的操作,虽然能够使用命令 kubectl rolling-update 完成升级,但它是在客户端与服务端多次交互控制 RC 完成的,所以 REST API 中并没有 rolling-update 的接口,这为定制自己的管理系统带来了一些麻烦。

    3. Deployment 拥有更加灵活强大的升级、回滚功能

    Replica Set 目前与 RC 的区别只是支持的 selector 不同,后续肯定会加入更多功能。 Deployment 使用了 Replica Set ,是更高一层的概念。除非需要自定义升级功能或根本不需要升级 Pod ,所以推荐使用 Deployment 而不直接使用 Replica Set 。

    下面我们继续来看 Deployment 的定义文件,与 RC 的定义文件基本相同(注意 apiVersion 还是 beta 版),所以不再详细解释各字段意思

    alt 文本

    与创建 RC 相同,使用命令 kubectl create -f deployment.yaml record 创建 Deployment ,注意 record 参数,使用此参数将记录后续对创建的对象的操作,方便管理与问题追溯

    使用 kubectl edit deployment hello-deployment 修改 spec.replicas/spec.template.spec.container.image 字段来完成扩容缩容与滚动升级(比 kubectl rolling-update 速度快很多)

    修改 image 字段为新版本镜像后查看 Pod ,在 STATUS 列看到正在执行升级的 Pod :

    alt 文本

    使用 kubectl rollout history 命令查看 Deployment 的历史信息

    alt 文本

    上面提到过 kubectl rolling-update 升级成功后不能直接回滚,不是很方便,那使用 Deployment 可以吗,答案是肯定的。

    首先在上面的命令加上 revision 参数,查看改动详细信息如下:

    alt 文本

    然后使用 kubctl rollout undo deployment hello-deployment 回滚至前一版本(使用 to-revision 参数指定版本)即可。

    命令 kubectl describe deployment hello-deployment 查看详细信息,在 Message 一列看到回滚如下,详细的信息记录对于问题发生后的原因查找有很大帮助:

    alt 文本

    通过对比 RC 、 Replica Set 与 Deployment ,可以看出新的 Replica Set 与 Deployment 比 RC 要强大易用很多,但因为现在还是 beta 版本所以不建议在生产环境使用,不过相信不久的将来我们就能使用上。

    Q&A

    1. 问:灰度发布, 可以指定新旧版共存么, 怎么整? 答:可以像上面说的那样,使用命令行工具创建新旧两个 RC ,然后分别指定需要的 Pod 数量。但目前时速云平台还不支持这种。

    2. 问:时速云是怎么保持 k8s master 的高可用的? 答:高可用目前是官方推荐的多 master standby 方式,以及我们自己的 agent 监管方式。

    3. 问: Pod 之间通信是不是也是用的 flannel ? 答: pod 和 pod 之间,可以采用官方推荐的各种网络解决方案,目前我们主要关注 flannel(vxlan )和 Calico

    4. 问: flannel 以及 calico ,你们选其一还是两个方案都在用?有测试报告吗? 答:两个方案都在用,测试报告以前分享过几种方案的网络性能比较,这里有一个 Calico 的,可以参考: https://www.projectcalico.org/ ... ance/

    5. 问: Replica Set 这个有 demo 的例子么? 答:因为一般 Replica Set 不会直接使用,而是通过 Deployment 来控制它,所以本次没有写出 Replica Set 的 demo

    6. 问: Deployment 现在是没有 rest api 修改 Pod 数量么? 答:有的, PUT /apis/extensions/v1beta1/namespaces/{namespace}/deployments/{name}

    7. 问:由于 k8s 严重依赖 etcd 中的数据,一旦 etcd 的数据紊乱,可能造成业务故障。这个问题在大量业务接入的时候可能有几率出现,时速云有解决方案吗? 答:这个问题,目前还没有碰到,不过我们会将服务信息同时存放到另外的存储中,也会对 etcd 进行备份,这样在出现故障时也可以很容易恢复或者迁移整个集群。

    8. 问:时速云用的是原生 k8s 吗,都做了哪些优化? 答:优化是有一些的,包括部署方式、网络、存储、以及一些用户体验上的优化为主,以便充分发挥 k8s 的一些优势。

    9. 问: Docker 1.12 版本开始集成了 Swarm 到 Docker Engine 中, Swarm 功能也变得越来越强大,那么时速云怎么看这个问题?以后考不考虑用高版本 Docker ,用 k8s 管理集成 Swarm 的 Docker ,会不会性能浪费? 答:我们目前主要关注 swarm , swarmkit 这些 docker 原生的工具,会去了解他们的主要特性,可以看到 swarmkit 正在向 k8s 方向迈进。

    10. 问:再问个问题,有状态服务的 pod ,挂载个数据卷(比如 rbd )。用 rc 或者 deployment 管理的 pod 重启或者升级以后,数据卷重新挂载到新的 pod 上会有什么问题么? 答:没有遇到过问题,理论上也不应该会有问题的。

    11. 问:能不能介绍一下怎么做用户隔离的,公有云的话,安全对大家很重要 答:可以参考 Calico 的网络隔离和 k8s 的服务、 api 访问控制,以及一些用户角色上的设计, k8s 在安全上还是考虑了不少东西的。

    12. 问:容器飘移和虚拟机飘移一样吗? 答:还是不太一样的,虚拟机可以支持热迁移,目前容器还不行。

    报名方式:

    有兴趣参与周四晚 8:30-9:30 时速云产品、容器技术相关分享的朋友可以添加微信号:时速云小助手(tenxcloud6),我们即可拉您进群~下次分享将于 7 月 28 日进行,敬请关注。

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1002 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 22:14 PVG 06:14 LAX 15:14 JFK 18:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86