K8S八股自筛选总结

Kubernetes网络策略(NetworkPolicy)如何实现Pod间通信控制?

NetworkPolicy通过label选择Pod,基于Ingress/Egress规则定义允许或拒绝Pod间网络访问,配合网络插件(如Fannel、Calico)实现网络隔离策略。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

如何排查Pod无法启动的问题?

# 节点标签
kubectl get nodes --show-labels
# Pod选择器
kubectl get pod <pod-name> -o yaml | grep nodeSelector

检查污点与容忍:

# 节点污点
kubectl describe node <node-name> | grep Taints
# Pod容忍
kubectl get pod <pod-name> -o yaml | grep tolerations

为什么要设置PodDisruptionBudget?

用于保护应用高可用,避免维护或升级时服务中断。

Kubernetes容器探针(Probe)的三种探测方式是什么?

说一下Deployment、StatefulSet、DaemonSet的区别,以及和pod之间的关系

什么是Ingress

Ingress为K8s集群中的服务提供了一个统一的入口,可以提供负载均衡、SSL终止和基于名称(域名)的虚拟主机、应用的灰度发布等功能,在生产环境中常用的Ingress控制器有Treafik、Nginx、HAProxy、Istio等。

相对于Service,Ingress工作在七层(部分Ingress控制支持2和6层),所以可以支持HTTP协议的代理,也就是基于域名的匹配规则。

Ingress 常见报错排查

404 表示访问的路由不存在,通常问题如下:

413(Request Entity Too Large)报错
有时候需要上传一些大文件给程序,但是 nginx 默认允许的最大文件大小只有 8M,不足以满足生产最大上传需求,此时可以通过 nginx.ingress.kubernetes.io/proxy-body-size 参数进行更改(也可以在 ConfigMap 中全局添加):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  namespace: study-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 32m
 spec:
....

503 一般是代理的服务不可用导致的,通常问题如下:

504 一般是代理的服务处理请求的时间过长,导致 Nginx 等待超时,此时需要确认服务的处
理时长,或者查看服务是否有问题

CORS 跨域报错:CORS错误。说明被跨域给拦截了,可以添加跨域配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: longtime
  namespace: study-ingress
  annotations:
    # 允许跨域的请求方法
    nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST,OPTIONS, DELETE"
    # 允许携带的请求头
    nginx.ingress.kubernetes.io/cors-allow-headers: "X-Forwarded-For, Xapp123-XPTO"
    # 允许跨域的域名
    nginx.ingress.kubernetes.io/cors-allow-origin: "*"
 spec:
....

核心组件协作流程

以部署一个应用为例:

PVC和Pod处于Pending的原因

Pod如何实现亲和性与反亲和性?

亲和性与反亲和性通过节点亲和性(NodeAffinity)Pod亲和性(PodAffinity/PodAntiAffinity)实现。

在复杂的分布式系统中,如何利用亲和力与拓扑域协同工作以确保服务的高可用性和性能优化?

使用拓扑域划分不同的可用域,然后使用亲和力尽量把服务分散开,同时根据需求优先调度某些节点。

如果部署一个5个副本的服务,需要把他们优先分散到具有subnet标签的节点上,能否实现?

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-service
spec:
  replicas: 5
  template:
    metadata:
      labels:
        app: my-service # 关键:反亲和性需要这个 label 来识别“同类”
    spec:
      affinity:
        # --- 步骤1:硬性过滤 ---
        # 告诉调度器:我 *只* 允许去有 "subnet" 标签的节点
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: subnet # 假设你的标签键是 'subnet'
                operator: Exists # 只要存在这个 key 就行
                # 或者如果你有具体的值:
                # operator: In
                # values:
                # - subnet-a
                # - subnet-b

        # --- 步骤2:软性打分 ---
        # 告诉调度器:在那些你选出来的 "subnet" 节点里,
        # *尽量* 不要把我的同类 Pod 放在同一个节点(hostname)上
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          # 'weight' 只是一个优先级,1-100 随便写
          - weight: 100 
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - my-service
              # "域":我们这里定义的“分散”范围是 "hostname",即节点
              topologyKey: kubernetes.io/hostname
      
      containers:
      - name: web-server
        image: nginx

在K8s集群中如何划分不同的租户?

首先根据节点划分标签组,之后根据标签配置污点,最后给不同租户添加不同的节点选择器和容忍。

污点的影响效果

如何实现节点隔离(Pod不调度到某节点)?

说一下ResourceQuota、LimitRange、QoS是什么?使用场景是什么?

名称 定义 使用场景
ResourceQuota 限制命名空间级别的资源总量,包括计算资源(CPU/内存)和对象数量(Pod/Service等) 用于多租户环境下,避免某个租户过度使用资源
LimitRange 为命名空间内资源对象(Pod/Container)设置默认和最大/最小资源限制 规范配置:避免容器内存超限崩溃;自动填充未声明的资源请求值
QoS 根据Pod的资源配置确定其在资源紧张的优先级,确保关键任务的Pod能够获得资源 保障核心业务

Kubernetes中QoS的三种类型有哪些?

Kubernetes中,Pod资源限制超出时会发生什么?

Kubernetes的调度算法主要考虑哪些因素?

什么是KEDA?

KEDA是一个基于K8s的事件驱动自动伸缩器。使用KEDA,可以根据需要处理的事件数量、消息队列来驱动K8s中任何服务的伸缩。
KEDA的核心思想是:只要有任务需要处理时,才扩展应用程序,并且在没有工作时缩减资源,甚至可以将副本缩容到零。这不仅提高了资源利用率,还降低了成本。

为什么需要KEDA?

KEDA使用场景

KEDA架构

KEDA核心资源

全链路追踪核心概念