AKS上部署多个相同Web应用实例并分配独立专属URL的方案咨询
单个原生Deployment确实无法直接实现你的需求,因为Deployment管理的所有副本使用完全相同的标签,上游Service会统一做负载转发,无法单独路由到指定副本。以下是两种可落地的优雅实现方案:
方案1:StatefulSet + Headless Service + 单Ingress配置(最简洁,仅需3份基础YAML即可支持任意数量实例)
该方案利用StatefulSet Pod的固定网络标识特性,无需为每个实例单独创建Deployment/Service,适配通过路径区分URL的需求:
- 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
- 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
- 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:
- 将你现有的Deployment、Service、Ingress YAML文件放在
base目录下 - 项目根目录新建
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
- 执行
kubectl apply -k .即可一键部署所有实例,后续调整实例数量只需修改kustomization.yaml即可。
内容的提问来源于stack exchange,提问作者user1275154
相关产品推荐
相关产品推荐

