正在不断地完善中,预计1个月的时间完成,覆盖整个Kubernetes知识面总结!
一、概述
1、简述什么是 Kubernetes?
kubernetes(常简称k8s),是一个 为容器化应用提供自动化部署、扩展和管理的开源平台。它最初由Google开发,并与2014年发布为开源项目。
2、为什么需要 Kubernetes,它能做什么?
1、 服务发现和负载均衡: K8S可以使用DNS名称或IP地址来暴露容器,如果进入容器流量比较大,K8S可以负载均衡并分配网络流量,从而使部署稳定。
2、 弹性伸缩: K8S可以根据负载和资源需求自动调整应用程序的副本数。
3、 故障自我修复: 比如有5个容器运行,其中一个突然挂掉,K8S可以实现自动恢复一个容器或者自动创建一个容器。
4、 秘钥与配置管理: 在Kubernetes中,你可以使用秘钥对象(Secret)和配置映射对象(ConfigMap)来管理敏感信息和应用程序配置。。
5、 存储编排:自动挂载所选存储系统,包括本地存储、诸如 AWS 或 GCP 之类公有云提供商所提供的存储或者诸如 NFS、iSCSI、Ceph、Cinder 这类网络存储系统。。
6、 自动部署和回滚:如果Nginx更新了最新版,发现一些问题,一些相关配置消失,k8S能快速地将版本回滚。
7、 自动完成装箱计算:你可以告诉kubernetes每个容器需要多少CPU和内存。 Kubernetes可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
8、 批量执行:对于job类型任务,K8S可以做到批量的执行。
二、架构
1、简述 Kubernetes 集群相关组件?
1、控制平面组件(Control Plane Components)
1、kube-apiserver:kube-apiserver 是Kubernetes 控制平面中最重要的组件之一, 它是整个集群的控制中心,提供了 Kubernetes 集群的 RESTful API 服务。简单的说,任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行。
2、kube-controller-manager:controller-manager 作为集群内部的管理控制中心,负责集群内Node、Pod副本、服务端Endpoint、服务账号(ServiceAccount)、命名空间(Namespace)、资源定额(Resoucequota)等的管理,当某一个节点宕机时,controller manager会及时发现故障并执行自动化修复流程,确保集群始终处于预期的工作状态。
3、kube-scheduler:kube-scheduler 是控制平面的组件, 负责监视新创建的、未指定运行节点(node)的 Pods, 并选择节点来让 Pod 在上面运行。
4、cloud-controller-manager:cloud-controller-manager是 用于与底层云提供商交互的控制器。cloud-controller-manager 允许云供应商代码和 Kubernetes 核心彼此独立发展,在以前的版本中,Kubernetes 核心代码依赖于云提供商特定的功能代码。在未来的版本中,云供应商的特定代码应由云供应商自己维护,并与运行 Kubernetes 的云控制器管理器相关联.
5、etcd:一个分布式键值存储系统,用于保存集群的配置数据和状态信息。
2、Node 组件
1、kubelet:kubelet 会在集群中每个节点(node)上运行。 它 保证容器(containers)都运行在Pod中。
2、kube-proxy:kube-proxy是 集群中每个节点(node)上所运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。kube-proxy 维护节点上的一些网络规则, 这些网络规则会允许从集群内部或外部的网络会话与 Pod 进行网络通信。
3、容器运行时(Container Runtime):容器运行环境是 负责运行容器的软件。ubernetes 支持许多容器运行环境,例如 containerd、 CRI-O 以及 Kubernetes CRI (容器运行环境接口) 的其他任何实现。
3、插件(Addons)
1、DNS: 为Kubernetes服务提供DNS记录。
2、Web 界面(仪表盘):Dashboard 是 Kubernetes 集群的通用的、基于 Web 的用户界面。 它使用户可以管理集群中运行的应用程序以及集群本身, 并进行故障排除。
3、容器资源监控:容器资源监控将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中, 并提供浏览这些数据的界面。
4、集群层面日志:集群层面日志机制负责将容器的日志数据保存到一个集中的日志存储中, 这种集中日志存储提供搜索和浏览接口。
5、网络插件:网络插件是实现容器网络接口(CNI)规范的软件组件。它们 负责为Pod分配IP地址,并使这些Pod能在集群内部相互通信。
2、简述 Kubernetes 中各模块如何与API server通信?
3、简述 Kubernetes Scheduler 作用及实现原理?
4、简述 Kubernetes kubelet 的作用?
5、简述 Kubernetes kube-proxy的作用?
二、概念
三、容器
1、简述 Kubernetes 中 容器 的几种状态?
容器的状态有三种: Waiting(等待)、Running(运行中)和 Terminated(已终止)。
2、简述 Kubernetes 中镜像的下载策略?
1、 Always:总是从指定的仓库中获取镜像。
2、 Never:禁止从仓库中下载镜像,也就是说只能使用本地镜像。
3、 IfNotPresent:如果本地有目标镜像,就不从镜像仓库下载,如果本地没有目标镜像,则从镜像仓库下载。
四、工作负载
4.1、Pod
1、简述 Kubernetes 创建一个 Pod 的主要流程?
1、 用户通过控制台或yaml文件创建pod。
2、API Server将yaml文件中的信息写入etcd,写入完成后, API Server触发watch机制,将准备创建的pod信息转发给scheduer调度器,调度器使用调度算法将pod调度到合适的节点上,API Server再把绑定好的node重新写入etcd。
3、此时 kubelet介入,获取到pod信息后出发docker run创建一个容器,再向API Server上报Pod的一些状态信息,API server再把这些信息写入etcd总,完成了整个流程。
如下图所示:
2、简述 Kubernetes 中 Pod的生命周期包括以下几个阶段?
取值 | 描述 |
---|---|
Pending | 等待被调度或者正在通过网络下载镜像,这可能需要点时间 |
Running | pod已经被调度到其中一个节点上,pod中所有容器已经创建,至少有一个容器仍在运行,或者正处于启动或重启状态 |
Successed | Pod中所有容器都已成功终止,并且不会重启 |
Failed | Pod中所有容器已终止,并且至少有一个容器因为失败终止 |
Unknown | 因为某些原因无法取得pod的状态,这种情况通常是因为与pod所有所在主机通信失败 |
3、简述 Kubernetes 中 Pod 的重启策略?
Pod 的spec中包含一个restartPolicy字段,其可能取值包括 Always、OnFailure 和 Never。 默认值是 Always。Always:在任何情况下,只要容器不在运行状态,就自动重启容器;OnFailure: 只在容器异常时才自动重启容器;Never: 从来不重启容器。
4、简述 Kubernetes中可以使用几种方式对Pod进行健康检查?
1、 livenessProbe(存活探针): 用于检查pod中的容器是否依然存活。如果存活探测失败,则kubelet会杀死容器,并且会根据容器重启策略进行重启,如果容器不提供存活探针,则默认状态为Success
2、 readinessProbe(就绪探针): 用于检查容器是否准备好接收流量。如果就绪探针失败,则不会将流量路由到该pod
3、 startupProbe(启动探针): 用于检查容器中的应用是否已经启动。如果提供了启动探针,则其它探针都会被禁用,直到此探针成功为止。如果启动探针失败,kubelet会杀死容器,而容器会根据重启策略进行重启,如果容器没有启动探测,则默认状态为Success
5、简述 Kubernetes中使用探针来检查容器有哪些不同的方法?
1、 HTTP 探针:发送HTTP GET请求到容器的指定路径,若返回状态码在200-399之间则认为存活。
2、 TCP 探针:通过TCP连接到容器的指定端口,若连接成功则认为存活。
3、 Exec 探针:执行容器内部的命令,若命令执行成功则认为存活。
4.2、工作负载资源
在Kubernetes中,工作负载是指要 在集群中运行的应用程序或服务。为了减轻用户的使用负担,通常不需要用户直接管理每个pod,而是 使用负载资源来替用户管理一组pod,这些负载资源通过配置控制器来确保pod的数量和状态与用户期望的保持一致。
Kubernetes 提供若干种内置的工作负载资源
1、 ReplicaSet:ReplicaSet用于 定义一组Pod的期望副本数量。它确保指定的Pod副本数始终处于运行状态,如果有Pod在集群中意外终止,ReplicaSet将自动启动新的Pod以替代它。 ReplicaSet是在K8s早期版本中使用的资源类型。
2、 Deployment:Deployment 适合在集群上管理无状态应用工作负载,是ReplicaSet的一个高级抽象,在ReplicaSet的基础上提供了更强大和灵活的功能。Deployment允许定义更新策略,实现应用程序的滚动更新和回滚操作,它还提供了扩展和收缩应用程序副本数量的能力。
3、 StatefulSet:statefulSet是 用于运行有状态应用程序的资源对象。它为每个Pod分配唯一的标识符,并在Pod重启时确保它们保持稳定,有序和持久化。
4、 DaemonSet:DaemonSet用于 在集群中的每个节点上运行一个副本的Pod。它常用于部署一些与节点紧密关联的后台任务,如日志收集和监控代理。
5、 Job:job用于 在集群中运行一次性任务,例如批处理任务或定期清理任务。它确保任务成功完成后终止,并可根据需要并行运行多个任务。
6、 CronJob:CronJob是一个 基于时间调度的作业。它可以指定一个时间表来定期运行任务,例如定时备份或定时数据处理。
五、服务、负载均衡和联网
六、存储
七、配置
八、安全
1、简述 Kubernetes 如何保证集群的安全性?
九、策略
十、调度、抢占和驱逐
1、简述 Kubernetes 中 Pod 的常见调度方式?
1、 自动调度:运行在哪个节点上完全由kube-scheduler经过算法计算得出。
2、 定向调度:nodeName、nodeSelector。
3、 亲和性调度:NodeAffinity、PodAffintty、PodAntiAffinity。
4、 污点(容忍)调度:Taints、Toleration
2、简述 Kubernetes中污点、容忍度、排斥等级?
1、 污点(taints):污点(taints)是 一种在节点(node)上设置的标记,用于阻止pod调度到该节点上,除非该pod具有与该节点匹配的容忍度。
2、 容忍度(tolerations):容忍度(tolerations)是 一种在pod中设置的属性,用于声明pod对节点上的污点的容忍程度。
3、 排斥等级(effect):用于定义对pod对象的排斥等级,它主要包括三种类型:NoSchedule、PreferNoSchedule、NoExecute。
取值 | 描述 |
---|---|
NoSchedule | 不会将pod调度到具有污点的节点上 |
PreferNoSchedule | 尽量避免将pod调度到具有污点的节点上 |
NoExecute | 不会将pod调度到具有污点的节点上,同时驱逐Node节点上已经存在的pod |
十一、集群管理
十二、扩展Kubernetes
总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:《Linux运维篇:Linux系统运维指南》