You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AKS上部署多个相同Web应用实例并分配独立专属URL的方案咨询

单个原生Deployment确实无法直接实现你的需求,因为Deployment管理的所有副本使用完全相同的标签,上游Service会统一做负载转发,无法单独路由到指定副本。以下是两种可落地的优雅实现方案:

方案1:StatefulSet + Headless Service + 单Ingress配置(最简洁,仅需3份基础YAML即可支持任意数量实例)

该方案利用StatefulSet Pod的固定网络标识特性,无需为每个实例单独创建Deployment/Service,适配通过路径区分URL的需求:

  1. StatefulSet配置(替换X为你需要的实例数)
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: app-sts
  namespace: namespace-name
spec:
  serviceName: "app-headless"
  replicas: X
  selector:
    matchLabels:
      app: app-name
      tier: frontend
  template:
    metadata:
      labels:
        app: app-name
        tier: frontend
    spec:
      containers:
      - name: app-name
        image: image_xyz
        imagePullPolicy: Always
        ports:
        - containerPort: 80
  1. Headless Service配置
apiVersion: v1
kind: Service
metadata:
  name: app-headless
  namespace: namespace-name
spec:
  clusterIP: None
  selector:
    app: app-name
    tier: frontend
  ports:
  - port: 80
  1. Ingress配置(以Nginx Ingress为例)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  namespace: namespace-name
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
  - host: app.host.com
    http:
      paths:
      # 路径示例:/app/0 对应第1个实例,/app/1对应第2个实例,以此类推
      - path: /app/(\d+)(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: app-sts-${1}.app-headless
            port:
              number: 80

如果所用Ingress控制器不支持路径变量占位,只需为每个实例单独写一条Ingress路径规则,指向对应序号的Pod即可,无需额外修改工作负载配置。若Ingress不支持直接将Pod域名作为Service backend,可为每个Pod创建一个对应ExternalName类型的Service,指向对应Pod的固定域名即可。

方案2:Kustomize批量生成独立工作负载(适合需要完全隔离每个实例配置的场景)

如果你需要每个实例的配置可以独立调整(比如不同的环境变量、资源配额),可以用Kustomize做批量渲染,无需重复编写YAML:

  1. 将你现有的Deployment、Service、Ingress YAML文件放在base目录下
  2. 项目根目录新建kustomization.yaml,示例如下(以3个实例为例):
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- base/

patches:
# 第1个实例配置
- target:
    kind: Deployment
    name: app-name
  patch: |-
    - op: replace
      path: /metadata/name
      value: app-name-0
    - op: replace
      path: /spec/selector/matchLabels/app
      value: app-name-0
    - op: replace
      path: /spec/template/metadata/labels/app
      value: app-name-0
- target:
    kind: Service
    name: app-name-service
  patch: |-
    - op: replace
      path: /metadata/name
      value: app-name-service-0
    - op: replace
      path: /spec/selector/app
      value: app-name-0
- target:
    kind: Ingress
    name: app-name-ingress
  patch: |-
    - op: add
      path: /spec/rules/0/http/paths/-
      value:
        path: /app/0
        pathType: Prefix
        backend:
          service:
            name: app-name-service-0
            port:
              number: 80
# 复制以上patch块修改序号即可新增更多实例,无需修改base目录下的基础YAML
  1. 执行kubectl apply -k .即可一键部署所有实例,后续调整实例数量只需修改kustomization.yaml即可。

内容的提问来源于stack exchange,提问作者user1275154

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:54:07