MST

星途 面试题库

面试题:容器化 - 复杂应用在云原生下的编排策略

假设你需要在云原生环境中对一个包含多个微服务(如用户服务、订单服务、支付服务等)且具有复杂依赖关系的应用进行容器编排。请详细说明你会如何设计Kubernetes的Deployment、Service和Ingress资源对象,以确保应用的高可用性、可扩展性以及服务间的正确通信?
11.3万 热度难度
后端开发容器化

知识考点

AI 面试

面试题答案

一键面试

Deployment设计

  1. 微服务独立部署
    • 为每个微服务创建独立的Deployment。例如,对于用户服务,创建user - service - deployment,订单服务创建order - service - deployment,支付服务创建payment - service - deployment
    • 在Deployment的spec.template.spec.containers中指定微服务对应的容器镜像,如image: user - service - image:v1,同时配置资源限制和请求,如resources: {requests: {cpu: "100m", memory: "256Mi"}, limits: {cpu: "200m", memory: "512Mi"}},以确保合理的资源分配。
  2. 副本管理
    • 根据微服务的负载情况和高可用性要求设置副本数。对于关键的用户服务,如果预计有较高的流量,可以初始设置replicas: 3。通过Horizontal Pod Autoscaler(HPA)动态调整副本数,例如根据CPU使用率,当CPU使用率超过80%时,自动增加副本数,低于50%时,减少副本数。
    • 在Deployment的spec.strategy中设置更新策略,采用滚动更新strategy: {type: RollingUpdate, rollingUpdate: {maxSurge: 1, maxUnavailable: 0}},确保在更新过程中服务不中断,以维持高可用性。

Service设计

  1. 内部服务通信
    • 为每个微服务创建ClusterIP类型的Service。例如,为用户服务创建user - service - cluster - ip - service,订单服务创建order - service - cluster - ip - service。ClusterIP类型的Service为微服务提供一个集群内部可访问的IP地址,使得其他微服务可以通过这个IP地址和端口进行通信。
    • 在Service的spec.selector中指定对应的微服务的标签,如selector: {app: user - service},这样Service就能将流量正确转发到匹配标签的Pod上。ports字段配置微服务的端口,如ports: [{name: http, port: 8080, targetPort: 8080}]port是Service暴露的端口,targetPort是Pod中容器实际监听的端口。
  2. 外部服务暴露
    • 对于需要暴露给外部的微服务(如网关服务等),可以创建NodePort类型或LoadBalancer类型的Service。如果使用NodePort类型,在Service的spec.ports中指定一个在节点上暴露的端口范围(默认30000 - 32767),例如ports: [{name: http, port: 80, targetPort: 8080, nodePort: 30080}],这样外部可以通过<节点IP>:30080访问该微服务。
    • 如果在支持LoadBalancer的云环境中,使用LoadBalancer类型的Service,Kubernetes会向云提供商申请一个外部负载均衡器,将流量转发到对应的微服务,如spec.type: LoadBalancer

Ingress设计

  1. 入口管理
    • 部署一个Ingress Controller,如Nginx Ingress Controller。它负责监听Ingress资源的变化,并根据规则将外部流量转发到相应的Service。
    • 创建Ingress资源对象,例如app - ingress。在Ingress的spec.rules中定义路由规则,例如:
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /user
        pathType: Prefix
        backend:
          service:
            name: user - service - cluster - ip - service
            port:
              number: 8080
      - path: /order
        pathType: Prefix
        backend:
          service:
            name: order - service - cluster - ip - service
            port:
              number: 8080
  • 这样,当外部请求app.example.com/user时,Ingress会将请求转发到user - service - cluster - ip - service对应的微服务,app.example.com/order请求则转发到order - service - cluster - ip - service对应的微服务,实现外部流量的正确路由和服务间的正确通信,同时通过多个副本和合理的负载均衡策略保证应用的高可用性和可扩展性。