小白也能玩转 Kubernetes 你与大神只差这几步(一)

阅读数:48 2019 年 10 月 29 日 18:00

小白也能玩转Kubernetes 你与大神只差这几步(一)

随着 Kubernetes 技术热度的不断提升,大容器时代的序幕已经开启。容器技术日新月异,在企业应用实践中得到了不断的发展,高效的运维、管理和部署都成为云服务的重头戏。而与此同时,Kubernetes 虽然降低了容器的使用门槛,但其本身的技术门槛却并不低,这种矛盾引起了开发者的关注,也成功在 2018 年将 Kubernetes 推到了顶峰。

因文章略长,故分为三篇展开呈现,本篇为第一篇。

6 月 30 日,腾讯云联合 InfoQ 举办的云 + 社区技术沙龙,以 Kubernetes 上云一键部署、云上大规模计算平台构建、CIS 底层技术实现、Tencent Hub 技术架构与 DevOps 落地实践等五大主题内容,分享容器与 k8s 技术的部署优化与应用实践。本文整理了讲师演讲精彩内容!

Kubernetes 上云一键部署实践

在 2016 年底,腾讯云开始提供全托管 Kubernetes 服务,主要提供了四个方面的功能,第一,一键部署完全隔离的 Kubernetes 服务,用户独享所有结算节点和控制节点,并提供集群的全生命周期管理;第二,为方便 Kubernetes 使用,在控制台进行了界面包装,通过可视化的方式创建负载,避免手工编写代码;第三,提供周边监控能力,与腾讯云监控产品打通,直接在产品界面上使用;第四,在 Kubernetes 集群外还提供了 Docker 镜像仓库、Tencent Hub、CI/CD 等功能,提供一站式应用上云解决方案。

腾讯云容器服务 Kubernetes 组件一览

Kubernetes 的运行需要进行 Master 组件和 Node 组件的初始化。

Master 组件最简单的部署要包括 Kube-apiserver、Kube-contioller-mannager 和 kube-scheduler。Kube-apiserver 是整个集群的集中存储器,其功能包括了所有组件与 Kubernetes 的交互、部分工作负载的存储、部分用户对存储的需求。Kube-controller-manager 主要负工作负载在集群里的运行;Kube-scheduler 主要负责 pod 的调度,如所在的运行机器、调度到集群含 GPU 的节点等调度工作。

集群的 Master 组件部署好后就需要部署一些 Node,主要包括两个组件, 第一个是负责在 Node 上创建 Pod 的 kubelet;第二个则是负责程序在集群配置规则使其能够被自动发现和访问的 kube-proxy。

此外,腾讯云还提供了一些自研组件。第一个组件是 hpa-metrics-server,为了让用户能够使用 Kubernetes 提供的 Pod 横向扩展控制器而研发,其优点在于,除了基于 CPU 和内存扩展之外,还能扩展 pod 出入带宽的指标,方便用户适应更多扩缩容场景。第二个组件是则是 cbs-provisioner,提供了 pod 使用腾讯云 cbs 块存储服务的能力;第三是 ccs-log-collector,主要是负责收集容器里 pod 运行日志。

容器网络

当 Kubernetes 把控制组件搭建起来后,它要求网络提供三点,在 pod 不使用 NAT 的情况下,第一,集群内所有容器之间可以进行通讯;第二,所有的节点和容器之间可以进行通信;第三,为了应对服务发现的需求,降低网络复杂度,要求不能使用 NAT,并实现 Node 和 pod 之间的扁平化网络。

小白也能玩转Kubernetes 你与大神只差这几步(一)

腾讯云 Kubernetes 使用的方案如上,这一方案方案直接使用了 VPC 提供的路由能力 global route。使用 docker bridge 网络模式;pod ip 由 cni 插件分配;pod 可以跨主机访问使用 vpc global route;采用了扁平化网络,主机、容器间实现对等互访。Kubernetes 结点加入到一个集群中触发网络的过程如上图所示,这套过程中 Docker 采用了 bridge 的网络模式,pod IP 直接由 cni 插件分配。

容器存储

这套 Kubernetes 集群中主要集成了腾讯云的块存储服务的 CBS 和 CFS 两个能力。

小白也能玩转Kubernetes 你与大神只差这几步(一)

Kubernetes 将 volume 挂载到 pod 里面时包含的过程如下:首先,Kube-controller-manager 会为 CBS 提供 volume 进行准备。即会先创建一个云盘,然后将创云盘插到对应的主机上,主机上的 Kubelet 会做一个 mount 动作,将设备 mount 到一个 Kubernetes 指定的文件夹,Kubelet 在创建这个 pod 时,会通过 mount 的形式把 mount 到的目录实际挂载到容器的 namespace 里。当 pod 销毁后, volume 不再被需要,就会反向执行,先从主机上把对应的块设备先 umount 掉,再把 detach 掉,然后由 Kube-controller-manager 根据对应的 plugin 设置销毁或保留。

Kubernetes volume 的插件机制主要包括了三种,第一种是早期使用的 In tree volume plugin,需要将代码写在的代码仓库中,会影响正常存储功能的使用和集群稳定性;第二种是 Flex Volume 在扩展性和稳定性上有所增加,能够通过特定接口的二进制文件,实现 mount 和 umount 动作。这种方式的缺陷在于自动性不足且对环境有要求;第三种基于社区 CSI 接口实现的插件,也就是将 Flex volume 的二进制文件工作全部放到了容器里面,让 Kubelet 与对应功能的插件通信,最终实现 mount 和 umount 的动作。

容器日志与监控

在 Kubernetes 里面并没有提供默认的日志方案,资源消耗较大且步骤复杂。腾讯云容器服务的日志收集控制器主要基于 Fluentd + kubernetes CRD(custom resource definition) 实现,能够提供可视化配置。

小白也能玩转Kubernetes 你与大神只差这几步(一)

该控制器支持收集容器的标准输出,也支持收集 pod 所在的 Node 上主机文件路径的内容。另外可以通过 LogCollector 监听 Kubernetes-apiserver 资源,生成对应的 Fluentd 的配置文件,触 Fluentd 重载收集日志文件。直接配置 Fluentd 收集 pod 对应的路径规则,根据需求做日志路径,将不同的日志发往不同后端,这样就实现了日志收集。

小白也能玩转Kubernetes 你与大神只差这几步(一)

在监控方面,Kubernetes 里的 pod 性能信息和云监控进行对接,在用户的 Kubernetes 节点上运行 agent,在 kubelet 里内置的 cadvisor 收集 pod 运行性能信息,再去 apiserver 获取 pod 对应的元数据并进行打标签,然后上传到腾讯云监控服务。

另外基于腾讯云存储的监控指标实现 hpa-metrics-server, 再利用 Kubernetes 提供的 HPA 能力会定期获取 pod 当前的入带宽、出带宽等指标熟练,并且根据定义进行扩容和缩容。

CVM 上部署 Kubernetes

在早期,为了实现产品快速上线,同时满足完全隔离的全托管 Kubernetes 服务,Master 组件部署在一台 CVM 并放到用户 VPC 里,用户的 Node 节点直接在 CVM 的机器上,在此基础上做 Kubelte 等参数初始化工作、集群证书配置、默认拉取镜像凭证初始化等工作。

小白也能玩转Kubernetes 你与大神只差这几步(一)

该方案节点均处于用户 VPC 中,通过 Agent 初始化部署整个集群,缺点就算管理困难。通过 SSH 直接登录到客户的 Master 节点进行运维操作,无法编程化,而且容器运维与 Kubernetes 关系离散。

Kubernetes in kubernetes

在此前,每个集群都在 ETCD 里面各自目录,相当于软隔离的措施。但 ETCD 并不是为海量数据存储服务的,因此在线上运行了数万个集群后, ETCD 问题越发密集。因此最终决定了把 Kubernetes 部署在 Kubernetes 里面,通过 Kubernetes API 去管理 Master 组件,包括的 apiserver、kube-controller-manager 和自研组件。这样做就不需要通过 SSH 方式,到每台机器上进行操作,而是直接通过 deployment 提供的滚动升级能力来完成。

这样做的话可以充分利用 Kubernetes 的健康检查和就绪检查等机制实现故障自愈。基于 hpa-metrics-server,可以实现 apiserver 的动态扩容,满足 Kubernetes 集群节点对于 apiserver 性能的需求。

小白也能玩转Kubernetes 你与大神只差这几步(一)

但是基于 CVM 的部署方案,所有的组件都部署在用户的 VPC 里面,如果我们把所有组件部署在 Kubernetes Master 里面,而且不能给每个用户部署一个 Kubernetes 集群。所以腾讯云提供了一个专门的 Kubernetes 集群,运行所有集群的 Master。VPC 提供的弹性网卡能力,直接绑定到运行 apiserver 的 pod 里,去实现和用户 Node 相关的互通。

通过在 Kubernetes 集群里面部署 Kubernetes Master 组件,成功降低了运维成本和 Master 组件的资源消耗。

CIS 底层技术实现

Kubernetes 上云部署实现了运维简化的基础, 各种优质工具的开发则进一步丢下了开发者的包袱。对于开发者而言,Docker 应该是非常常见的一种技术。通过 Dockerfile 或者 Docker build 命令打包镜像,通过 Docker pull、Docker push 命令和容器仓库进行对接,最终实现跨平台的运行,Docker Wrong 命令直接把 Docker 镜像运行了起来。

但 Docker 的问题在于管理复杂,需要 Kubernetes 简化编排。可是 Kubernetes 本身却比较复杂,一是安装复杂,组件颇多,需要 master 节点、Node 节点等,还需要诸多软件,如 apiserver、controller-manager、scheduler、Kubelet 等;另外资源也复杂,入门需要一定时间。

腾讯云原来有 TKE 集群,能够帮助用户快速建立 Kubernetes 集群,master 节点和 node 节点都是由腾讯工程师维护,给用户使用带来诸多便利。但是问题在于,当集群节点突发性不够用时,资源受节点限制,扩展需要手动添加节点,至少要几十秒延迟才能完成创建。

小白也能玩转Kubernetes 你与大神只差这几步(一)

其他方法还有,如用 Kubernetes 开源的 CA 与腾讯云弹性伸缩组进行对接,当节点不够用时,可以通过 CA 来扩容一个节点。或者采用 HPA,可以进行 pod 横向伸缩容,但这样做虽然可以解决部分灵活问题,但依然不够。

在这些原因的驱使下,腾讯云 CIS(Container Instance Service)服务就有了需求动力,其本质就是 Serverless Kubemetes 服务,将 Kubernetes 集群交给云厂商管理,而用户只需要关注 Docker 本身即可。

评论

发布