K8S 常见的面试题涵盖基础概念、工作原理、应用实践等方面,以下是一些常见的面试题:

基础概念

  1. 什么是 Kubernetes?它的主要功能有哪些?
    • Kubernetes 是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。其主要功能包括资源调度、自动部署和回滚、服务发现与负载均衡、存储管理、密钥与配置管理等。
  2. Kubernetes 的主要组件有哪些?作用又是如何?
    • master 节点上有:
      • API Server,提供 RESTful 接口,通过该接口进行交互;
      • etcd,K8S 数据存储;
      • Controller Manager:运行控制循环来调节集群的状态,如节点控制器、端点控制器、命名空间控制器等
      • Scheduler:负责 pod 的调度。
    • Node 节点上:
      • Kubelet:负责生命周期管理,可以监听 API Server 指令并执行和报告相应的 Pod 状态。
      • Kube-proxy:提供网络代理和负载均衡功能,维护网络规则,允许服务与 Pod 之间的通信。
      • Container Runtime:运行容器的软件,如 Docker、containerd 等。
    • 高层组件:Pod、service、deployment、job、configmap、secret。
  3. Kubernetes 和 Docker 关系
    • K8S 可以管理多个 Docker 容器,实现容器的高可用性、负载均衡、故障转移等功能。可以说 Docker 提供了容器化的基础,而 K8S 则是在 Docker 容器的基础上进行更高级的管理和编排。
  4. 解释一下 Pod、Deployment、Service 的概念以及它们之间的关系。
    • Pod 是 Kubernetes 中最小的可部署和可管理的计算单元,它可以包含一个或多个紧密相关的容器。
    • Deployment 是用于管理 Pod 的部署和升级的对象,它定义了 Pod 的副本数量、升级策略等。
    • Service 是用于暴露 Pod 的网络服务,它可以将一组 Pod 的网络流量进行负载均衡和转发,使得其他服务可以通过固定的 IP 和端口访问到 Pod。
    • 关系:Deployment 管理着 Pod 的生命周期,通过标签选择器来关联 Pod。Service 通过标签选择器找到对应的 Pod,为其提供网络访问入口。
  5. Kubernetes 中的 Namespace 有什么作用?
    • Namespace 用于在一个 Kubernetes 集群中划分不同的逻辑空间,实现资源的隔离和多租户管理。不同 Namespace 中的资源名称可以相同,通过 Namespace 可以将不同团队、不同环境的资源进行隔离,便于资源的管理和访问控制。
  6. Kubernetes 中的 Service 和 Ingress 的区别
    • 功能上:Service 主要用于在 Kubernetes 集群内部实现 Pod 之间的通信和负载均衡。它为一组具有相同标签的 Pod 提供了一个固定的 IP 地址和 DNS 名称,使得其他 Pod 可以通过该 Service 来访问这组 Pod,而无需关心具体 Pod 的 IP 地址和端口。Ingress 主要用于将集群外部的 HTTP/HTTPS 流量路由到集群内部的 Service。它可以根据不同的域名、路径等规则,将外部请求转发到相应的 Service,从而实现对集群内多个服务的统一入口管理。
    • 使用场景上:Service 通常用于集群内部微服务之间的相互调用。例如,一个后端服务需要与数据库服务进行通信,就可以通过 Service 来连接到数据库 Pod 所在的服务,而不用担心数据库 Pod 的动态变化。Ingress 主要用于将集群内的服务暴露给外部用户访问。比如,将 Web 应用程序暴露给互联网用户,通过配置 Ingress 可以根据不同的域名或路径来访问不同的 Web 应用服务。
  7. Kubernetes 中的 Service 有哪几种类型
    • ClusterIP:这是 Kubernetes 中的默认 Service 类型。ClusterIP 会为 Service 分配一个集群内部的 IP 地址。这个 IP 地址只能在集群内进行访问,适用于集群内部通信的场景。
    • NodePort:这类 Service 在每个节点上打开一个特定的端口(范围通常是 30000-32767),然后将这个端口的请求转发到后端的 pod 上。NodePort 使服务可以通过任意节点的 IP 和特定端口来访问。
    • LoadBalancer:这种类型的 Service 会在外部 Load Balancer(如云服务提供商的负载均衡)和集群之间创建一个关联。它能够将外部流量分发到后端的 pod 上,非常适合在云环境中使用,比如 AWS ELB 或 GCP GLB。
    • ExternalName:这种 Service 类型并不需要 selector。它通过返回 CNAME 记录将服务重定向到外部的 DNS 名称。这种方式比较简单,通常用来把集群外部的服务引入到集群中。
    • ClusterIP 只能集群内部访问,NodePort 不仅可以集群内部访问,也可以集群外部通过 节点IP:nodePort 进行访问。
    spec:
       type: NodePort
       ports:
    	- port: 80 			# Service 暴露在集群内部的端口号
    	   targetPort: 80 	# Pod 上要接收流量的端口
    	   nodePort: 31080  # NodePort 端口
    	   protocol: TCP    # TCP 或者 UDP 选择
    	   name: http       # 给当前的端口配置设置一个名称,方便标识和区分用
  8. ReplicaSet、ReplicationController、Service 和 Deployment 的关系和区别
    • Deployment 管理 ReplicaSetDeployment 通过创建和管理 ReplicaSet 来间接管理 Pod 的副本数量。创建 Deployment 时,自动创建一个 ReplicaSet
    • ReplicaSetReplicationController 的主要功能是确保指定数量的 Pod 副本在集群中运行。监控当 Pod 状态异常时,创建新 Pod 来维持副本数目。ReplicaSet 支持更灵活的标签选择器,更推荐使用。
    • Service 为一组具有相同标签的 Pod 提供了一个稳定的网络访问入口。它可以与 ReplicaSetReplicationControllerDeployment 创建的 Pod 进行关联,将外部或内部的流量路由到这些 Pod 上,实现负载均衡和服务发现。

工作原理

  1. Kubernetes 的资源调度流程是怎样的?
    • 首先,用户通过 Kubernetes API 提交创建 Pod 的请求。然后,Scheduler(调度器)会根据一系列的调度算法和策略,如资源需求、节点状态、亲和性和反亲和性等,从集群中选择一个合适的节点来运行 Pod。最后,Kubelet 在被选中的节点上启动 Pod 中的容器。
  2. 描述一下 Kubernetes 中 Pod 的生命周期。
    • Pod 的生命周期包括 Pending(等待)、Running(运行)、Succeeded(成功)、Failed(失败)和 Unknown(未知)等阶段。当 Pod 被创建后,首先处于 Pending 状态,等待被调度到节点上并启动容器。容器启动成功后,Pod 进入 Running 状态。如果 Pod 中的所有容器都成功执行并退出,Pod 将进入 Succeeded 状态;如果有容器因错误而退出,Pod 则进入 Failed 状态。如果 Kubernetes 无法获取 Pod 的状态信息,Pod 会处于 Unknown 状态。
  3. Kubernetes 中的 Service 是如何实现负载均衡的?
    • Kubernetes 中的 Service 通过 iptables 或 IPVS 等技术来实现负载均衡。当 Service 被创建时,会在集群中的节点上配置相应的规则,将发往 Service 虚拟 IP 的流量根据负载均衡算法转发到后端的 Pod 上。常见的负载均衡算法有轮询、加权轮询、随机等。
  4. Kubernetes 中如何限制 Pod 的网络访问策略?
    • NetworkPolicy 是 Kubernetes 中用于定义 Pod 之间以及 Pod 与外部网络通信规则的资源对象。可以通过限制特定标签的 Pod 只能访问同一命名空间内的服务,禁止访问外部网络。具体实现问 GPT。
  5. Kubernetes 的故障转移机制?
    • 如果是节点挂了,节点心跳检测发现失联,标记不可用。Controller Manager 检测到节点不可用后,根据 RS 或者 Deployment 的定义对 Pod 进行驱逐。Scheduler 根据其他节点的资源和调度规则等进行重新调度 Pod。Kubelet 在新的节点上接收到创建 Pod 的请求,进行创建。
    • 如果是 Pod 挂了,Controller Manager 也会根据 RS 或者 Deployment 的定义请求重新创建 Pod。

应用实践

  1. 如何在 Kubernetes 中部署一个应用?
    • 首先,需要创建一个 Deployment 来定义应用的 Pod 规格,包括容器镜像、资源限制、环境变量等。然后,通过 Kubernetes API 或命令行工具将 Deployment 部署到集群中。Kubernetes 会根据 Deployment 的定义创建相应的 Pod,并确保 Pod 的副本数量符合要求。如果应用需要对外提供服务,还需要创建一个 Service 来暴露 Pod,以便外部可以访问应用。
    • 方案一,kubectl apply -f xx.yaml 部署。方案二,Helm chart 进行部署。
  2. 如何进行 Kubernetes 集群的监控和日志管理?
    • 监控方面,可以使用 Prometheus 等监控工具来收集 Kubernetes 集群的各种指标,如节点资源使用情况、Pod 性能指标、容器运行状态等。Grafana 可以用于可视化这些指标数据,方便用户查看和分析。日志管理方面,可以使用 Elasticsearch、Fluentd 和 Kibana(EFK)组合或其他日志管理系统,将容器的日志收集、存储和分析,以便快速定位问题。
  3. 在 Kubernetes 中如何实现滚动升级和回滚?
    • 主要是通过 Deployment 控制器来实现的,通过更新 Deployment 的镜像来触发滚动更新。回滚则是通过 kubectl rollout undo 命令来实现回滚操作。
    • Deployment 策略:在使用 Deployment 时,可以指定更新的策略,例如 Recreate(重新创建)和 RollingUpdate(滚动更新)。默认情况下是使用 RollingUpdate 策略,Kubernetes 会逐步替换旧的 Pod,为了保证最大的可用性。
    • 更新的细节控制:可以通过修改 Deployment 的 spec.strategy.rollingUpdate 字段来更精细地控制滚动更新的行为,如最大不可用 Pod 数量(maxUnavailable)和最大部分更新的 Pod 数量(maxSurge)。
  4. 如何处理大批量 pod 的查询(数十万计)
    • 使用标签和选择器、kubectl 命令的分页参数、外部缓存存储、并行查询。
  5. K8S 配置优先级 PriorityClass
  6. 排查 Pod 网络问题
    • 首先确保 Pod 是正常运行的,通过 kubectl get pods -o wide 来确保 Pod 是存在 IP、端口号的。进而,kubectl exec -it <pod-name> 进入 Pod 内部进行发送请求尝试。检查 Pod 对应的 Service 是否配置正确。检查是否有网络策略 NetworkPolicy 配置。
    • Leaderboard 在 copilot 榜单上就存在这个问题。多数据集同时运行的时候,有的数据集运行失败,没有收到数据。发现是 service 的 label-selector 没有配置正确。参考 打榜平台测试流程卡住问题的排查

补充内容

  1. Pod、Deployment、Service、Job 中需要了解的字段有哪些?

    • image, command, env, volumeMounts, resources, ports
    • 亲和性、反亲和性、污点、容忍度
    • livenessProbe, restartPolicy, nodeSelector, volumes
    • 还有配置 Pod 生命周期的钩子等,没用到,没怎么了解
    • volumes vs volumeMounts: 前者提供了存储的信息,后者告知容器如何使用存储,如某存储挂载到了哪个路径等。
  2. 资源管理:Node、Namespace、Label、Label Selector。

  3. Pod 控制器:Deployment、RS、RC、Job、CronJob 等。

  4. 服务发现与路由:Service、Ingress。

  5. 数据存储:NFS、ConfigMap、Secret。