MST

星途 面试题库

面试题:分布式系统里Kubernetes应对高并发请求的策略

假设在高并发的后端服务场景中,基于Kubernetes的分布式容器管理系统,你会采取哪些策略来确保服务的稳定性和高性能,例如如何进行资源分配与调度、负载均衡等,并说明这些策略在Kubernetes架构中的具体实现方式。
21.7万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

资源分配与调度策略及实现

  1. 资源请求与限制
    • 策略:为每个容器定义CPU和内存的请求(request)和限制(limit)。请求表示容器正常运行所需的资源量,限制则是容器所能使用的最大资源量。这样可以避免容器过度占用资源影响其他服务,同时保证每个服务有足够资源运行。
    • 实现:在Kubernetes的Pod配置文件(如YAML)中,通过resources字段设置,例如:
apiVersion: v1
kind: Pod
metadata:
  name: my - pod
spec:
  containers:
  - name: my - container
    image: my - image
    resources:
      requests:
        cpu: "250m" # 250 millicpu
        memory: "64Mi"
      limits:
        cpu: "500m"
        memory: "128Mi"
  1. 节点选择与亲和性
    • 策略:根据节点的标签(如硬件类型、地域等),将Pod调度到合适的节点上。亲和性规则可以进一步细化调度逻辑,例如软亲和性(preferredDuringSchedulingIgnoredDuringExecution)和硬亲和性(requiredDuringSchedulingIgnoredDuringExecution)。这样能确保对特定资源有需求的服务部署到满足条件的节点,提高资源利用效率和服务稳定性。
    • 实现:通过在Pod配置文件的spec中设置nodeSelectoraffinity字段。例如,使用nodeSelector将Pod调度到具有特定标签的节点:
apiVersion: v1
kind: Pod
metadata:
  name: my - pod
spec:
  nodeSelector:
    disktype: ssd
使用`affinity`设置亲和性规则:
apiVersion: v1
kind: Pod
metadata:
  name: my - pod
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/os
            operator: In
            values:
            - linux
  1. 资源配额与限制范围
    • 策略:在Kubernetes集群中,可以设置资源配额(ResourceQuota)来限制命名空间(Namespace)内的资源使用总量,如总的CPU、内存请求和限制等。限制范围(LimitRange)则可以为命名空间内的容器设置默认的资源请求和限制,确保所有容器都遵循一定的资源使用规范。
    • 实现:创建ResourceQuotaLimitRange资源对象。例如,创建一个ResourceQuota
apiVersion: v1
kind: ResourceQuota
metadata:
  name: my - quota
  namespace: my - namespace
spec:
  hard:
    requests.cpu: "1"
    requests.memory: "1Gi"
    limits.cpu: "2"
    limits.memory: "2Gi"

创建一个LimitRange

apiVersion: v1
kind: LimitRange
metadata:
  name: my - limit - range
  namespace: my - namespace
spec:
  limits:
  - default:
      cpu: "500m"
      memory: "128Mi"
    defaultRequest:
      cpu: "250m"
      memory: "64Mi"
    type: Container

负载均衡策略及实现

  1. 服务类型选择
    • 策略:根据服务的需求选择合适的Kubernetes服务类型。ClusterIP类型用于集群内部通信,提供一个集群内部可访问的IP地址;NodePort类型在每个节点上开放一个指定端口,通过<NodeIP>:<NodePort>方式访问,适用于测试和临时服务暴露;LoadBalancer类型借助云提供商的负载均衡器,将外部流量引入集群,适合对外提供服务的场景。
    • 实现:在创建Kubernetes服务(Service)时指定type字段。例如,创建一个ClusterIP服务:
apiVersion: v1
kind: Service
metadata:
  name: my - service
spec:
  selector:
    app: my - app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: ClusterIP

创建一个NodePort服务:

apiVersion: v1
kind: Service
metadata:
  name: my - service
spec:
  selector:
    app: my - app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
    nodePort: 30080
  type: NodePort

创建一个LoadBalancer服务(假设在支持的云环境中):

apiVersion: v1
kind: Service
metadata:
  name: my - service
spec:
  selector:
    app: my - app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: LoadBalancer
  1. Ingress资源
    • 策略:对于HTTP/HTTPS流量的负载均衡,使用Ingress资源。Ingress可以基于域名、URL路径等规则将外部流量路由到不同的后端服务,同时支持TLS终止、会话亲和性等功能,有效管理和优化对外服务的流量。
    • 实现:首先需要部署一个Ingress控制器(如Nginx Ingress Controller、Traefik等)。然后创建Ingress资源对象,例如:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my - ingress
spec:
  rules:
  - host: mydomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my - service
            port:
              number: 80
  1. 健康检查
    • 策略:Kubernetes通过健康检查机制确保只有健康的Pod才能接收流量。存活探针(livenessProbe)用于检测容器是否正在运行,如果容器不健康,Kubernetes会自动重启容器;就绪探针(readinessProbe)用于检测容器是否准备好接收流量,只有当容器通过就绪探针,才会被添加到服务的负载均衡池中。
    • 实现:在Pod配置文件的容器部分设置探针。例如,设置一个HTTP存活探针:
apiVersion: v1
kind: Pod
metadata:
  name: my - pod
spec:
  containers:
  - name: my - container
    image: my - image
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20

设置一个HTTP就绪探针:

apiVersion: v1
kind: Pod
metadata:
  name: my - pod
spec:
  containers:
  - name: my - container
    image: my - image
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10