什么是 Kubernetes ?
Kubernetes 是一个基于容器技术的分布式开源平台,主要功能是生产环境中的容器编排。
在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。并且具有完备的集群管理能力,多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。
Kubernetes 的常见场景如下:
- 快速部署应用
- 快速扩展应用
- 无缝对接新的应用功能
- 节省资源,优化硬件资源的使用
Kubernetes 有那些特点 ?
Kubernetes 特点如下:
- 可移植:支持公有云,私有云,混合云,多重云(multi-cloud)。
- 可扩展:模块化,插件化,可挂载,可组合。
- 自动化:自动部署,自动重启,自动复制,自动伸缩/扩展。
简述Kubernetes的优势 ?
Kubernetes 作为一个完备的分布式系统支撑平台,其主要优势:
- 容器编排
- 轻量级
- 开源
- 弹性伸缩
- 负载均衡
简述 Kubernetes 的缺点或当前的不足之处?
Kubernetes当前存在的缺点(不足)如下:
- 安装过程和配置相对困难复杂。
- 管理服务相对繁琐。
- 运行和编译需要很多时间。
- 它比其他替代品更昂贵。
对于简单的应用程序来说,可能不需要涉及Kubernetes即可满足。
Kubernetes 服务的负载均衡是如何实现的?
Pod 中的容器很可能因为各种原因发生故障而死掉。Deployment 等 Controller 会通过动态创建和销毁 Pod 来保证应用整体的健壮性。
换句话说,Pod 是脆弱的,但应用是健壮的。每个 Pod 都有自己的 IP 地址。当 Controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址。
这样就产生了一个问题:如果一组 Pod 对外提供服务(比如: HTTP),它们的 IP 很有可能发生变化,那么客户端如何找到并访问这个服务呢?
Kubernetes 给出的解决方案是 Service。Kubernetes Service 从逻辑上代表了一组 Pod,具体是哪些 Pod, 则是由 Label 来挑选。 Service 有自己 IP,而且这个 IP 是不变的。客户端只需要访问 Service 的 IP,Kubernetes 则负责建立和维护 Service 与 Pod 的映射关系。
无论后端 Pod 如何变化,对客户端不会有任何影响,因为 Service 没有变。
容器和主机部署应用的区别是什么?
容器的中心思想就是秒级启动,一次封装、到处运行;
这是主机部署应用无法达到的效果,但同时也更应该注重容器的数据持久化问题。
另外,容器部署可以将各个服务进行隔离,互不影响,这也是容器的另一个核心概念。
简述 Kubernetes 和 Docker 的关系?
Docker 提供容器的生命周期管理和 Docker 镜像构建运行时容器。它的主要优点是将软件/应用程序运行所需的设置和依赖项打包到一个容器中,从而实现了可移植性等优点。
Kubernetes 用于关联和编排在多个主机上运行的容器。
什么是 Kubectl 和 Kubelet ?
Kubectl 是一个命令行工具,可以使用该工具控制 Kubernetes 集群管理器,如检查群集资源,创建、删除和更新组件,查看应用程序。
Kubelet 是一个代理服务,它在每个节点上运行,并使从服务器与主服务器之间进行通信。
简述Kubernetes kubelet的作用?
在Kubernetes集群中,在每个 Node(又称 Worker)上都会启动一个 kubelet 服务进程。
该进程用于处理 Master 下发到本节点的任务,管理 Pod 及 Pod 中的容器。
每个 kubelet 进程都会在 API Server 上注册节点自身的信息,定期向Master 汇报节点资源的使用情况,并通过 cAdvisor 监控容器和节点资源。
简述Kubernetes如何实现集群管理?
在集群管理方面,Kubernetes 将集群中的机器划分为一个 Master 节点和一群工作(Node)节点。
其中,在 Master 节点运行着集群管理相关的一组进程 kube-apiserver
、kube-controller-manager
和 kube-scheduler
,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理能力,并且都是全自动完成的。
简述 Kubernetes 相关基础概念?
- Master:Kubernetes 集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有Etcd存储服务(可选),运行Api Server进程,Controller Manager服务进程及Scheduler服务进程。
- Node(Worker):Node(Worker)是Kubernetes集群架构中运行Pod的服务节点,是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。运行
Docker Engine
服务,守护进程kunelet
及负载均衡器kube-proxy
。 - Pod:运行于 Node 节点上,一个Pod可以包含一个容器或者多个相关容器。Pod 是 Kurbernetes 进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。 Pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间、IP地址和端口,能够通过
localhost
进行通信。 - Label:Kubernetes中的Label实质是一系列的Key/Value键值对,其中key与value可自定义。Label可以附加到各种资源对象上,如Node、Pod、Service、RC等。一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。Kubernetes通过Label Selector(标签选择器)查询和筛选资源对象。
- Replication Controller:Replication Controller用来管理Pod的副本,保证集群中存在指定数量的Pod副本。集群中副本的数量大于指定数量,则会停止指定数量之外的多余容器数量。反之,则会启动少于指定数量个数的容器,保证数量不变。Replication Controller是实现弹性伸缩、动态扩容和滚动升级的核心。
- Deployment:Deployment 在内部使用了 RS 来实现目的,Deployment相当于 RC 的一次升级,其最大的特色为可以随时获知当前 Pod 的部署进度。
- HPA(Horizontal Pod Autoscaler):Pod 的横向自动扩容,也是Kubernetes 的一种资源,通过追踪分析 RC 控制的所有 Pod 目标的负载变化情况,来确定是否需要针对性的调整 Pod 副本数量。
- Service:Service 定义了 Pod 的逻辑集合和访问该集合的策略,是真实服务的抽象。Service 提供了一个统一的服务访问入口以及服务代理和发现机制,关联多个相同 Label 的 Pod,用户不需要了解后台Pod是如何运行。
- Volume:Volume 是 Pod 中能够被多个容器访问的共享目录,Kubernetes 中的 Volume 是定义在 Pod 上,可以被 Pod 中一个或多个的容器挂载到某个目录下。
- Namespace:Namespace 用于实现多租户的资源隔离,可将集群内部的资源对象分配到不同的Namespace中,形成逻辑上的不同项目、小组或用户组,便于不同的Namespace在共享使用整个集群的资源的同时还能被分别管理。
Kubernetes 中镜像的下载策略是什么?
答:可通过命令kubectl explain pod.spec.containers
来查看imagePullPolicy
这行的解释。
K8s的镜像下载策略有三种:Always、Never、IfNotPresent;
Always
:总是从指定的仓库中获取镜像;Never
:禁止从仓库中下载镜像,也就是说只能使用本地镜像;IfNotPresent
:仅当本地没有对应镜像时,才从目标仓库中下载。
默认的镜像下载策略是:
- 当镜像标签是latest时,默认策略是Always;
- 当镜像标签是自定义时(也就是标签不是latest),那么默认策略是IfNotPresent。
Kubernetes 是怎么进行服务注册的?
Pod启动后,会加载当前环境所有Service信息,以便不同Pod根据Service名进行通信。
简述 Kubernetes 各模块如何与API Server通信?
Kubernetes API Server作为集群的核心,负责集群各功能模块之间的通信。
集群内的各个功能模块通过API Server将信息存入etcd,当需要获取和操作这些数据时,则通过API Server提供的REST接口(用GET、LIST或WATCH方法)来实现,从而实现各模块之间的信息交互。
- kubelet进程与API Server的交互:每个 Node 上的 Kubelet 每隔一个时间周期,就会调用一次API Server的REST接口报告自身状态,API Server在接收到这些信息后,会将节点状态信息更新到etcd中。
- kube-controller-manager进程与API Server的交互:kube-controller-manager中的 Node Controller模块通过API Server提供的Watch接口实时监控Node的信息,并做相应处理。
- kube-scheduler进程与API Server的交互:Scheduler通过API Server的Watch接口监听到新建 Pod 副本的信息后,会检索所有符合该 Pod 要求的Node列表,开始执行 Pod 调度逻辑,在调度成功后将 Pod 绑定到目标节点上。
简述 Kubernetes Scheduler 作用及实现原理?
Kubernetes Scheduler是负责 Pod 调度的重要功能模块。
Kubernetes Scheduler在整个系统中承担了“承上启下”的重要功能:
- “承上”是指它负责接收 Controller Manager 创建的新 Pod,为其调度至目标 Node;
- “启下”是指调度完成后,目标 Node 上的 kubelet 服务进程接管后继工作,负责 Pod 接下来生命周期。
Kubernetes Scheduler的作用是将待调度的Pod(API新创建的Pod、Controller Manager为补足副本而创建的Pod等)按照特定的调度算法和调度策略绑定(Binding)到集群中某个合适的 Node 上,并将绑定信息写入 etcd 中。
在整个调度过程中涉及三个对象,分别是待调度 Pod 列表、可用 Node 列表,以及调度算法和策略。
Kubernetes Scheduler 通过调度算法为待调度 Pod 列表中的每个 Pod从 Node 列表中选择一个最适合的Node来实现Pod的调度。随后,目标节点上的kubelet通过API Server监听到Kubernetes Scheduler产生的Pod绑定事件,然后获取对应的 Pod 清单,下载Image镜像并启动容器。
简述 Kubernetes Scheduler 使用哪两种算法将 Pod 绑定到 worker 节点?
Kubernetes Scheduler根据如下两种调度算法将 Pod 绑定到最合适的工作节点:
- 预选(Predicates) :输入是所有节点,输出是满足预选条件的节点。kube-scheduler根据预选策略过滤掉不满足策略的Nodes。如果某节点的资源不足或者不满足预选策略的条件则无法通过预选。如:Node的label必须与Pod的Selector一致。
- 优选(Priorities): 输入是预选阶段筛选出的节点,优选会根据优先策略为通过预选的 Nodes 进行打分排名,选择得分最高的Node。例如,资源越富裕、负载越小的Node可能具有越高的排名。
简述Kubernetes kubelet监控Worker节点资源是使用什么组件来实现的?
kubelet使用 cAdvisor 对 worker 节点资源进行监控。
在 Kubernetes 系统中,cAdvisor 已被默认集成到 kubelet 组件内,当 kubelet 服务启动时,它会自动启动 cAdvisor 服务;然后, cAdvisor 会实时采集所在节点的性能指标及在节点上运行的容器的性能指标。
简述Kubernetes Worker 节点加入集群的过程?
通常需要对Worker节点进行扩容,从而将应用系统进行水平扩展。
主要过程如下:
- 在该 Node 上安装Docker、kubelet和kube-proxy服务;
- 然后配置kubelet和kube-proxy的启动参数,将Master URL指定为当前Kubernetes集群Master的地址;最后,启动这些服务;
- 通过kubelet默认的自动注册机制,新的Worker将会自动加入现有的Kubernetes集群中;
- Kubernetes Master在接受了新Worker的注册之后,会自动将其纳入当前集群的调度范围。
简述 Kubernetes 如何进行优雅的节点关机维护?
由于Kubernetes节点运行大量Pod,因此在进行关机维护之前,建议先使用kubectl drain
将该节点的Pod进行驱逐,然后进行关机维护。
简述 Kubernetes 集群联邦?
Kubernetes集群联邦可以将多个Kubernetes集群作为一个集群进行管理。因此,可以在一个数据中心/云中创建多个Kubernetes集群,并使用集群联邦在一个地方控制/管理所有集群。
简述 Helm?
Helm 是 Kubernetes 的软件包管理工具。类似 Ubuntu 中使用的apt、Centos中使用的yum或者Python中的 pip 一样。
Helm能够将一组K8S资源打包统一管理,方便查找、共享和使用,是为Kubernetes构建软件的最佳方式。
在Helm中,通常每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz
格式的单一文件,方便传输和存储)。
简述 Helm 的优势
在 Kubernetes中部署一个可以使用的应用,需要涉及到很多的 Kubernetes 资源的共同协作。
使用helm则具有如下优势:
- 统一管理、配置和更新这些分散的 k8s 的应用资源文件;
- 分发和复用一套应用模板;
- 将应用的一系列资源当做一个软件包管理。
对于应用发布者而言,可以通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。
对于使用者而言,使用 Helm 后不用需要编写复杂的应用部署文件,可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序。