2024-02-26 面试

k8s 有哪些组件? #

1、etcd保存了集群的状态 #
2、apiserver提供了资源操作的唯一入口,还提供认证,授权,访问控制,api注册和服务发现等 #
3、controller manager负责维护集群的状态,比如自动扩展,滚动更新,故障检测等 #
4、scheduler 负责集群资源的调度,安照预期的调度策略将pod调度到相应的node上 #
5、kubelet负责管理容器的生命周期,还负责共享存储卷和网络的管理 #
6、Container runtime 容器运行时,负责管理镜像的管理,pod和容器的真正运行 #
7、kube-proxy负责管理集群的服务发现和负载均衡 #

Kubernetes(K8s)是一个功能强大的容器编排平台,它由多个组件构成,这些组件共同协作来实现集群的管理、调度、监控等功能。下面是 Kubernetes 主要组件的简要介绍:

1. Kubernetes 核心组件 #

1.1 API Server (kube-apiserver) #

  • 职责:API Server 是 Kubernetes 控制平面的核心组件,它暴露了 Kubernetes 集群的 REST API,所有的命令和操作(如创建、删除、更新 Pod 等)都通过 API Server 来进行。

  • 功能

    • 接收来自用户、控制器、调度器等的请求。
    • 负责验证和处理请求。
    • 提供 REST API 接口,供客户端和其他组件使用。
    • 存储集群状态数据(通过与 etcd 交互)。

1.2 Controller Manager (kube-controller-manager) #

  • 职责:Controller Manager 负责运行集群的控制循环(controller loops),确保集群的实际状态与期望状态相一致。

  • 功能

    • 启动各种控制器,如 Deployment Controller、ReplicaSet Controller、Node Controller 等。
    • 处理集群资源的自我修复任务,如创建新的 Pod 来替代已死 Pod,扩缩容等。

1.3 Scheduler (kube-scheduler) #

  • 职责:调度器负责将 Pod 分配到集群中的合适节点上。

  • 功能

    • 根据集群资源情况和 Pod 的要求,选择最佳的节点来运行 Pod。
    • 支持不同的调度策略,如资源请求、节点亲和性(Node Affinity)等。

1.4 etcd #

  • 职责:etcd 是 Kubernetes 的分布式键值存储系统,用于存储集群的所有状态数据,包括 Pod、节点、Service 等所有资源对象的配置和元数据。

  • 功能

    • 持久化存储集群的所有状态信息。
    • 提供强一致性保障,确保所有集群组件共享最新的状态数据。

1.5 Cloud Controller Manager (kube-cloud-controller-manager) #

  • 职责:Cloud Controller Manager 是为了支持云环境的 Kubernetes 扩展,它使得 Kubernetes 集群能够与云提供商的 API 集成。

  • 功能

    • 负责与云提供商的控制平面交互,管理负载均衡器、存储卷等云资源。
    • 让 Kubernetes 集群能够在多云环境中管理资源。

2. Kubernetes 节点组件 #

2.1 Kubelet #

  • 职责:Kubelet 是集群中每个节点上的代理,负责管理节点上的容器(Pod)。

  • 功能

    • 监控和管理节点上的容器,确保 Pod 中的容器处于正常状态。
    • 从 API Server 获取 Pod 的规格,并执行容器的启动、停止等操作。
    • 收集和报告节点的资源使用情况(如 CPU、内存)到 API Server。

2.2 Kube Proxy #

  • 职责:Kube Proxy 是一个网络代理,它负责维护集群中的网络规则,以确保网络流量能够正确地转发到 Pod。

  • 功能

    • 管理每个节点的网络流量,基于 iptables 或 IPVS 实现负载均衡。
    • 确保 Service 的 DNS 名称能够被解析,并且流量能够正确地路由到后端的 Pod。

2.3 Container Runtime #

  • 职责:容器运行时(如 Docker、containerd)负责运行容器并管理容器生命周期。

  • 功能

    • 启动、停止容器。
    • 拉取容器镜像并管理容器资源。

3. 高层组件和工具 #

3.1 Kubernetes Dashboard #

  • 职责:Kubernetes Dashboard 是一个基于 Web 的 UI 工具,用于管理和监控 Kubernetes 集群。

  • 功能

    • 提供图形化的界面,方便用户查看集群状态、Pod、Deployment、Service 等资源。
    • 支持用户创建、更新、删除集群资源。

3.2 Helm #

  • 职责:Helm 是 Kubernetes 的包管理工具,类似于 Linux 的 aptyum

  • 功能

    • 通过 Helm Charts 来管理应用程序的部署。
    • Helm Charts 是预配置的 Kubernetes 资源文件集合,允许用户方便地部署和管理应用。

3.3 Ingress Controller #

  • 职责:Ingress Controller 是一种专门处理 HTTP/HTTPS 请求的 Kubernetes 组件,它根据 Ingress 资源来路由流量。

  • 功能

    • 控制外部流量进入集群。
    • 配置负载均衡、SSL/TLS 终端和 URL 路由等。
    • 常见的 Ingress Controller 有 Nginx Ingress Controller、Traefik 等。

4. Kubernetes 核心资源 #

除了上述组件,Kubernetes 还包括一些重要的资源对象,用于管理集群和应用程序:

4.1 Pod #

  • 职责:Pod 是 Kubernetes 中最小的可调度单元,包含一个或多个容器,所有容器共享同一网络和存储。

4.2 Service #

  • 职责:Service 提供了一种稳定的访问方式,用于暴露一组 Pod。它抽象了 Pod 的 IP 地址,并可以提供负载均衡。

4.3 ReplicaSet #

  • 职责:ReplicaSet 用于保证在任何时候都维持指定数量的 Pod 副本。它常常与 Deployment 一起使用。

4.4 Deployment #

  • 职责:Deployment 是一种高级控制器,负责管理 Pod 的副本、更新和滚动更新等操作。

4.5 StatefulSet #

  • 职责:StatefulSet 是 Kubernetes 中用于管理有状态应用的控制器,支持持久化存储和 Pod 的稳定标识符。

4.6 ConfigMap 和 Secret #

  • 职责

    • ConfigMap:用于存储非敏感的配置数据。
    • Secret:用于存储敏感数据,如密码、OAuth token 等。

4.7 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) #

  • 职责:PV 和 PVC 用于管理 Kubernetes 中的持久存储。PV 是集群中的存储资源,PVC 是 Pod 请求存储资源的方式。

总结 #

Kubernetes 是由多个组件组成的复杂系统,每个组件都在集群的不同部分起着关键作用。控制平面 主要负责管理集群的整体状态,如 API Server、调度器、控制器等;而 节点组件 则在每个工作节点上执行容器的管理和调度任务,确保容器能够按照预期正常运行。通过这些组件的协作,Kubernetes 提供了强大的容器管理能力,支持大规模的容器化应用部署和运维。

创建 Pod的主要流程? #

1.客户端提交pod的配置信息(可以是yaml)到kube-apiserver #
2.apiserver收到信息后kube-controller-manager创建资源对象 #
3.kubecontroller将yaml信息存到etcd #
4.kubescheduler调度pod到某个节点 #
5.kubelet根据kube-scheduler发来的配置信息来运行pod,运行成功将pod信息返回给schedule,scheduler将信息返回并存储到到etcd #

在 Kubernetes 中,Pod 是最小的部署单元,通常用于部署一个或多个容器。创建 Pod 的主要流程包括从用户发起请求到容器在节点上运行的各个步骤。以下是创建 Pod 的主要流程:


1. 用户请求创建 Pod #

创建 Pod 的第一步是用户通过 kubectl 或其他 Kubernetes API 客户端发起创建请求。

  • 通过 kubectl 命令: 用户可以通过 kubectl runkubectl apply -f pod.yaml 命令创建 Pod。

    kubectl apply -f pod.yaml
    

    或者通过 kubectl run 创建 Pod(通常用于临时 Pod):

    kubectl run mypod --image=nginx
    
  • 通过 Kubernetes API: 用户也可以通过 Kubernetes API 发起创建请求(通常由控制器自动发起,如 Deployment 或 StatefulSet)。这时,Pod 描述会通过 API 发送到 API Server。


2. API Server 接收并验证请求 #

Kubernetes 中的所有操作都会通过 API Server 来进行。无论是通过 kubectl 还是 API 发起的请求,都会到达 API Server。

  • 验证请求:API Server 对 Pod 请求进行验证,确保所请求的 Pod 描述符合 Kubernetes 的规范。例如,确保资源请求正确,标签、容忍等参数合法。
  • 存储请求:验证通过后,API Server 会将 Pod 的描述(通常是 YAML 或 JSON 格式)存储到 Kubernetes 的 etcd 数据存储中,作为集群的当前状态。

3. 调度器选择节点(调度) #

当 API Server 成功接收到 Pod 创建请求并将其存储在 etcd 中后,接下来的任务是将 Pod 调度到一个合适的节点上。这是由 调度器(kube-scheduler) 完成的。

调度过程#

  1. 过滤阶段
    • 调度器会根据 Pod 的要求(如资源请求、亲和性/反亲和性等),对所有节点进行过滤,排除不符合条件的节点。
    • 例如,某些节点的资源可能不足,或者节点与 Pod 的亲和性要求不匹配。
  2. 优选阶段
    • 对剩下的符合条件的节点,调度器会根据节点的负载、拓扑结构等因素打分,选择一个最合适的节点。
    • 例如,调度器会考虑节点的 CPU 和内存使用情况,选择资源最空闲的节点。
  3. 绑定
    • 一旦选定了节点,调度器会将 Pod 与节点绑定,向 API Server 通知这个 Pod 已经成功调度到指定节点。

4. 节点上的 Kubelet 处理 Pod #

调度器将 Pod 绑定到特定节点后,Kubelet 会在该节点上进行具体的操作。

  • 拉取容器镜像:Kubelet 会根据 Pod 配置中的容器镜像信息,拉取相应的容器镜像到本地。如果镜像已经存在,则会跳过这一步。
  • 创建容器:Kubelet 使用容器运行时(如 Docker、containerd)在节点上启动容器。Pod 可以包含一个或多个容器,Kubelet 会逐个启动它们。
  • 设置网络和存储
    • Kubelet 为 Pod 配置网络,使得容器之间可以相互通信,并且可以访问外部网络。
    • 如果 Pod 定义了持久存储(如卷),Kubelet 会挂载相关的存储资源。

5. Pod 运行与健康检查 #

当容器启动后,Kubelet 会持续监控 Pod 和容器的状态。Kubelet 会定期执行以下任务:

  • 健康检查(Liveness / Readiness)
    • Liveness Probe:检查容器是否仍然存活。如果 Pod 容器挂掉,Kubelet 会重启容器。
    • Readiness Probe:检查容器是否已准备好接受流量。如果容器不准备好,Kubelet 会将其从服务的负载均衡池中移除,直到它准备好。
  • 资源监控: Kubelet 会报告节点和容器的资源使用情况(如 CPU、内存等)到 API Server。
  • 日志与事件: Kubelet 会将容器的日志和事件收集起来,供用户查看。

6. 控制器的反馈(如 Deployment、StatefulSet) #

如果 Pod 是由某个控制器(如 DeploymentStatefulSetDaemonSet)管理的,那么这些控制器会继续监视 Pod 的状态,确保集群的实际状态符合所期望的状态。如果有 Pod 创建失败,控制器会重新调度 Pod。

  • 例如,Deployment 会确保它管理的 Pod 数量始终保持一致。如果某个 Pod 不健康或不可用,Deployment 会创建一个新的 Pod 来替代它。

7. 更新集群状态 #

最终,Kubernetes 集群的状态(包括 Pod、节点、容器等信息)会更新到 etcd 中,以确保集群的最终状态一致。

总结:创建 Pod 的主要流程 #

  1. 用户请求:用户通过 kubectl 或 API 创建 Pod。
  2. API Server 验证和存储:API Server 验证请求并将 Pod 存储到 etcd 中。
  3. 调度器调度:调度器选择合适的节点,并将 Pod 绑定到该节点。
  4. Kubelet 启动容器:Kubelet 在节点上拉取容器镜像并启动容器。
  5. 健康检查与资源监控:Kubelet 执行容器的健康检查,并持续报告资源使用情况。
  6. 控制器管理:控制器监控 Pod 的状态,确保集群的期望状态与实际状态一致。
  7. 集群状态更新:Pod 创建成功后,集群状态存储在 etcd 中。

通过这些步骤,Kubernetes 确保 Pod 在集群中得到高效、可靠的管理和调度。

k8s的调度机制 #

1.节点预选 #
2.节点打分排序 #
3.节点选优 #

Kubernetes (K8s) 的调度机制是其核心功能之一,用于决定容器应该在集群中的哪个节点上运行。K8s 调度器(Scheduler)负责根据节点的资源可用性、负载、拓扑、约束条件等因素,智能地将 Pod 分配到集群中的不同节点。调度是一个多阶段的过程,并且涉及到多个重要的调度策略和插件。

Kubernetes 调度流程概述 #

  1. Pod 创建
    • 用户通过 kubectl 或其他 API 创建一个 Pod 请求,或者在某个 Deployment、StatefulSet 等控制器中声明了新的 Pod。
    • Kubernetes 控制平面通过 API Server 接收这个请求,并将 Pod 交给调度器来决定放置在哪个节点上。
  2. 调度器决定节点
    • 调度器会检查集群中所有节点的资源使用情况,并根据一系列规则来选择最合适的节点。
  3. Pod 绑定到节点
    • 调度器选择合适的节点后,将 Pod 绑定到节点上,并将信息更新到 API Server。然后,节点上的 kubelet 负责拉取容器镜像、启动容器。

Kubernetes 调度的关键机制 #

  1. 调度阶段 Kubernetes 调度器通常按以下顺序工作:
    • 过滤阶段 (Filter)
      • 调度器通过节点的 节点选择器(NodeSelector)、资源限制、硬件/网络要求等,过滤出不符合条件的节点。
      • 过滤阶段的目标是排除掉那些不适合运行该 Pod 的节点,通常根据一些基本的约束条件,如 CPU、内存等资源。
    • 优选阶段 (Score)
      • 对于剩下的候选节点,调度器通过 调度策略 进行排序(比如节点的负载、拓扑结构等),选择一个最优的节点。
      • 在优选阶段,调度器会基于 Affinity(亲和性)和 Anti-Affinity(反亲和性)规则、Pod 的资源请求与限制、Pod 的拓扑要求等因素对节点进行评分。
    • 绑定阶段 (Bind)
      • 调度器最终选择一个节点并将 Pod 绑定到该节点上。这时,节点上的 kubelet 会负责启动容器。

Kubernetes 调度策略 #

  1. 资源请求和限制

    • 每个 Pod 可以定义 资源请求(request)和 资源限制(limit)。资源请求是调度器决定在哪里调度 Pod 的基础,而资源限制则是容器运行时能使用的最大资源量。
    • 调度器会根据节点的可用资源(CPU、内存等)和 Pod 的资源请求来选择节点。
  2. Node Affinity(节点亲和性)

    • 通过 nodeAffinity 规则,可以控制 Pod 只调度到符合特定标签的节点上。
    • 硬亲和性(必需条件)和 软亲和性(优先条件)都可以通过 affinity 配置来指定。

    示例:让 Pod 只调度到具有特定标签的节点上:

    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
              - key: "disktype"
                operator: In
                values:
                - ssd
    
  3. Pod Affinity 和 Anti-Affinity(Pod亲和性和反亲和性)

    • Pod Affinity:控制 Pod 应该尽可能地调度到与其他 Pod 相同或相邻的节点上。
    • Pod Anti-Affinity:控制 Pod 不应调度到与特定 Pod 相同或相邻的节点上。

    示例:让 Pod 调度到与另一个特定 Pod 在同一个节点上:

    affinity:
      podAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          labelSelector:
            matchLabels:
              app: frontend
          topologyKey: "kubernetes.io/hostname"
    
  4. Taints 和 Tolerations(污点和容忍)

    • Taints:允许节点标记为“污点”,即节点会拒绝调度任何没有适当容忍的 Pod。
    • Tolerations:Pod 可以设置容忍,允许其调度到有污点的节点上。

    示例:一个节点加上污点,只有具有特定容忍的 Pod 才能调度到该节点。

    kubectl taint nodes node1 key=value:NoSchedule
    

    在 Pod 配置中添加容忍:

    tolerations:
    - key: "key"
      operator: "Equal"
      value: "value"
      effect: "NoSchedule"
    
  5. 资源负载均衡

    • 在选择节点时,调度器也会考虑节点的负载,确保集群资源的合理利用。调度器会避免某些节点资源过载,而其他节点资源闲置。
    • 调度器会根据节点的 CPU、内存等资源的剩余情况来选择最合适的节点。

Kubernetes 默认调度器和自定义调度器 #

  1. 默认调度器:Kubernetes 使用 kube-scheduler 作为默认调度器,处理所有 Pod 的调度请求。
  2. 自定义调度器:如果有特殊的调度需求,可以使用自定义调度器。可以在集群中运行多个调度器,指定特定的调度策略和工作负载。

Kubernetes 调度器插件 #

Kubernetes 调度器支持插件架构,允许在调度过程中使用不同的策略和插件来定制行为。常见的插件包括:

  • 预调度插件(如 NodeAffinityTaintToleration 等)
  • 调度策略插件(如 PodAffinityResourceLimits 等)
  • 后调度插件(如调度后监听 Pod 状态的变化)

这些插件使得 Kubernetes 调度器能够灵活地满足各种业务场景的需求。


总结 #

Kubernetes 调度器负责根据节点的资源、拓扑、亲和性和反亲和性、污点和容忍等规则,智能地将 Pod 分配到最合适的节点上。调度过程包括 过滤优选绑定 阶段。通过使用 Node AffinityPod AffinityTaints 和 Tolerations 等策略,可以精细控制 Pod 的调度行为,确保集群资源的高效利用和满足业务需求。