写点什么

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

  • 2019-10-29
  • 本文字数:3643 字

    阅读完需:约 12 分钟

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

容器存储

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



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)实现,能够提供可视化配置。



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



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


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

CVM 上部署 Kubernetes

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



该方案节点均处于用户 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 性能的需求。



但是基于 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 开源的 CA 与腾讯云弹性伸缩组进行对接,当节点不够用时,可以通过 CA 来扩容一个节点。或者采用 HPA,可以进行 pod 横向伸缩容,但这样做虽然可以解决部分灵活问题,但依然不够。


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


2019-10-29 18:001031

评论

发布
暂无评论
发现更多内容

「 Java基础-对象 」一篇文章讲清楚Java开发中如何更优雅的创建对象

小刘学编程

Java Builder 序列化 对象创建 new

StudioOne6免费试用版下载及版本功能介绍

茶色酒

StudioOne6 StudioOne

6 理解业务概念和业务组件

涛哥 数字产品和业务架构

企业架构 业务架构

Guitar Pro8吉他软件最新版安装下载教程

茶色酒

Guitar Pro8

CleanMyMac2023测试版功能介绍

茶色酒

CleanMyMac X CleanMyMac X2023

HashMap每次扩容时,为什么都必须是2的N次方?

2023-02-17:sdl是跨平台的多媒体开发库,请问用go语言如何调用?

福大大架构师每日一题

golang 音视频 SDL 流媒体 福大大

chatGPT:探讨如何实现自动化测试场景

夏兮。

自动化测试 selenium ChatGPT

户外交通信息led显示屏有以下特点才正规

Dylan

安装 LED显示屏 户外LED显示屏

阿里内部消息中间件合集:MQ+Kafka+体系图+笔记

Java kafka MQ 消息队列 消息中间件

架构训练营第10期模块7作业

Geek_4db2d5

CorelDRAW Graphics Suite2023最新版本号

茶色酒

CorelDRAW 2022 CorelDraw2023

SpringBoot 容器刷新前回调ApplicationContextInitializer

Java spring Spring Boot

盘点和总结秒杀服务的功能设计及注意事项技术体系

Java 秒杀系统

华为游戏中心花瓣游戏开发者服务持续升级,赋能高效研运

最新动态

追光进行时:沿着全光运力的新航道,加速驶向算力时代

脑极体

算力

模块七作业

Ryan

架构

LeetCode题解:1237. 找出给定方程的正整数解,双指针,详细注释

Lee Chen

LeetCode 算法、

冰河指南AI技术社区基于ChatGPT正式启动运营

冰河

人工智能 程序员 AI 架构师 ChatGPT

嵌入式ARM设计编程(五) 实现信号的FIR滤波操作

timerring

arm

别再找借口了!找不到工作就好好学一下这份16W字Java面试合集

Java java面试 Java八股文 Java面试题 Java面试八股文

2023年中国直播电商发展洞察

易观分析

零售 直播 电商

CleanMyMac2023电脑版免费下载教程

茶色酒

CleanMyMac X2023

Java高手速成 | Java web 实训之投票系统

TiAmo

Java Java web

云原生的基建:我理解的可观测性和OpenTelemetry

agnostic

可观测性 OpenTelemetry

聊聊如何利用redis实现多级缓存同步

Java redis 缓存 多级缓存

LeetCode题解:1237. 找出给定方程的正整数解,二分查找,详细注释

Lee Chen

JavaScript 算法 LeetCode 二分查找

面试官:浅谈一下Redis分布式锁存在的问题

Java

Pandoc API 上手指南

面向工资Coding

架构实战营模块9作业

张建闯

架构实战营

LeetCode题解:1237. 找出给定方程的正整数解,枚举,详细注释

Lee Chen

算法 LeetCode

小白也能玩转Kubernetes 你与大神只差这几步(一)_语言 & 开发_云加社区_InfoQ精选文章