k8s入门教程一:kubernetes简介

简介

Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语,它的中文翻译是“舵手”或者“飞行员”。在一些常见的资料中也会看到“ks”这个词,也就是“k8s”,它是通过将8个字母“ubernete”替换为“8”而导致的一个缩写。

应用部署方式三个阶段:

部署演进

传统部署时代: 早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且组织维护许多物理服务器的成本很高。

虚拟化部署时代: 作为解决方案,引入了虚拟化功能,它允许您在单个物理服务器的 CPU 上运行多个虚拟机(VM)。虚拟化功能允许应用程序在 VM 之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。

因为虚拟化可以轻松地添加或更新应用程序、降低硬件成本等等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性。

每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。

容器部署时代: 容器类似于 VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和 OS 分发进行移植。

容器因具有许多优势而变得流行起来。下面列出了容器的一些好处:

  • 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
  • 持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性),提供可靠且频繁的容器镜像构建和部署。
  • 关注开发与运维的分离:在构建/发布时而不是在部署时创建应用程序容器镜像,从而将应用程序与基础架构分离。
  • 可观察性不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
  • 跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
  • 云和操作系统分发的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、Google Kubernetes Engine 和其他任何地方运行。
  • 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
  • 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
  • 资源隔离:可预测的应用程序性能。
  • 资源利用:高效率和高密度。

功能

Kubernetes提供了一个可弹性运行分布式系统的框架。Kubernetes 会满足您的扩展要求、故障转移、部署模式等。具体如下:

  • Service discovery and load balancing,服务发现和负载均衡,通过DNS实现内部解析,service实现负载均衡
  • Storage orchestration,存储编排,通过plungin的形式支持多种存储,如本地,nfs,ceph,公有云快存储等
  • Automated rollouts and rollbacks,自动发布与回滚,通过匹配当前状态与目标状态一致,更新失败时可回滚
  • Automatic bin packing,自动资源调度,可以设置pod调度的所需(requests)资源和限制资源(limits)
  • Self-healing,内置的健康检查策略,自动发现和处理集群内的异常,更换,需重启的pod节点
  • Secret and configuration management,密钥和配置管理,对于敏感信息如密码,账号的那个通过secret存储,应用的配置文件通过configmap存储,避免将配置文件固定在镜像中,增加容器编排的灵活性
  • Batch execution,批处理执行,通过job和cronjob提供单次批处理任务和循环计划任务功能的实现
  • Horizontal scaling,横向扩展功能,包含有HPA和AS,即应用的基于CPU利用率的弹性伸缩和基于平台级的弹性伸缩,如自动增加node和删除nodes节点。

架构

kubernetes包含两种角色:master节点和node节点。

  • master节点是集群的控制管理节点,作为整个k8s集群的大脑。

    • 负责集群所有接入请求kube-apiserver,在整个集群的入口;
    • 集群资源调度kube-scheduler,通过watch监视pod的创建,负责将pod调度到合适的node节点;
    • 集群编排管理kube-controller-manager,通过多种控制器确保集群的一致性,包含有Node Controller,Replication Controller,Endpoints Controller等;
    • 元数据信息存储etcd,数据持久存储化,存储集群中包括node,pod,rc,service等数据;
  • node节点是实际的工作节点,负责集群负载的实际运行,即pod运行的载体,其通常包含三个组件:Container Runtime,kubelet和kube-proxy

    • Container Runtime是容器运行时,负责实现container生命周期管理,如docker,containerd,rktlet;
    • kubelet负责镜像和pod的管理,主要负责同容器运行时(比如Docker项目)打交道。而这个交互所依赖的,是一个称作CRI(Container Runtime Interface)的远程调用接口。
    • kube-proxy是service服务实现的抽象,负责维护和转发pod的路由,实现集群内部和外部网络的访问。

如下图所示的全局架构:

几种接口解释:

  • CRI:Container Runtime Interface。容器运行时接口。Kubernetes项目并不关心你部署的是什么容器运行时、使用的什么技术实现,只要你的这个容器运行时能够运行标准的容器镜像,它就可以通过实现CRI接入到Kubernetes项目当中。Kubernetes是通过kubelet跟CRI进行通信。
  • OCI:具体的容器运行时,比如Docker项目,则一般通过OCI这个容器运行时规范同底层的Linux操作系统进行交互,即:把CRI请求翻译成对Linux操作系统的调用(操作Linux Namespace和Cgroups等)。
  • CNI(Container Networking Interface):调用网络插件做网络通信。
  • CSI(Container Storage Interface):调用存储插件配置持久化存储。
  • kubelet还通过gRPC协议同一个叫作Device Plugin的插件进行交互。

以上几种接口都是kubelet所要支持的功能,所以计算节点上最核心的组件就是kubelet。

其他组件还包括:

  • cloud-controller-manager,用于公有云的接入实现,提供节点管理(node),路由管理,服务管理(LoadBalancer和Ingress),存储管理(Volume,如云盘,NAS接入),需要由公有云厂商实现具体的细节,kubernetes提供实现接口的接入,如腾讯云目前提供CVM的node管理,节点的弹性伸缩(AS),负载均衡的接入(CLB),存储的管理(CBS和CFS)等产品的集成;
  • DNS组件由kube-dns或coredns实现集群内的名称解析;
  • kubernetes-dashboard用于图形界面管理;
  • kubectl命令行工具进行API交互;
  • 服务外部接入,通过ingress实现七层接入,由多种controller控制器组成
    • traefik
    • nginx ingress controller
    • haproxy ingress controller
    • 公有云厂商ingress controller
  • 监控系统用于采集node和pod的监控数据
    • metric-server 核心指标监控
    • prometheus 自定义指标监控,提供丰富功能
    • heapster+influxdb+grafana 旧核心指标监控方案,现已废弃
  • 日志采集系统,用于收集容器的业务数据,实现日志的采集,存储和展示,由EFK实现
    • Fluentd 日志采集
    • ElasticSearch 日志存储+检索
    • Kiabana 数据展示

下面我们以一个例子再去看一下 Kubernetes 架构中的这些组件,是如何互相进行 interaction 的。

用户可以通过 UI 或者 CLI 提交一个 Pod 给 Kubernetes 进行部署,这个 Pod 请求首先会通过 CLI 或者 UI 提交给 Kubernetes API Server,下一步 API Server 会把这个信息写入到它的存储系统 etcd,之后 Scheduler 会通过 API Server 的 watch 或者叫做 notification 机制得到这个信息:有一个 Pod 需要被调度。

这个时候 Scheduler 会根据它的内存状态进行一次调度决策,在完成这次调度之后,它会向 API Server report 说:“OK!这个 Pod 需要被调度到某一个节点上。”

这个时候 API Server 接收到这次操作之后,会把这次的结果再次写到 etcd 中,然后 API Server 会通知相应的节点进行这次 Pod 真正的执行启动。相应节点的 kubelet 会得到这个通知,kubelet 就会去调 Container runtime 来真正去启动配置这个容器和这个容器的运行环境,去调度 Storage Plugin 来去配置存储,network Plugin 去配置网络。

这个例子我们可以看到:这些组件之间是如何相互沟通相互通信,协调来完成一次Pod的调度执行操作的。

最后,以华为公开课的PPT上一张图来结尾:

参考资料

kubernetes系列教程(一)俯瞰kubernetes全貌

kubernetes功能介绍

深入剖析Kubernetes

0%