微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为不同命名空间上的服务提供不同的公共 IP/URL

如何解决为不同命名空间上的服务提供不同的公共 IP/URL

我目前正在 production 命名空间内运行一组 Pod 和服务。服务通过 kubernetes nginx-ingress 控制器公开。

这工作正常,可以毫无问题地访问所有资源。

我现在想要实现的是拥有另一个包含其他类型资源和服务的命名空间 staging,并且还能够使用公共 IP/url 访问它们。此 IP 应与 production 公共 IP 不同,因为我们不想更改 Nginx 入口上的 URL 架构。

有没有办法使用 Nginx 控制器来实现这一点?我们在 AKS 上运行并使用以下 helm 命令安装了 Nginx 入口:

# Create a namespace for your ingress resources
kubectl create namespace ingress-basic

# Add the ingress-Nginx repository
helm repo add ingress-Nginx https://kubernetes.github.io/ingress-Nginx

# Use Helm to deploy an Nginx ingress controller
helm install nginx-ingress ingress-Nginx/ingress-Nginx \
    --namespace ingress-basic \
    --set controller.replicaCount=2 \
    --set controller.nodeselector."beta\.kubernetes\.io/os"=linux \
    --set defaultBackend.nodeselector."beta\.kubernetes\.io/os"=linux \
    --set controller.admissionWebhooks.patch.nodeselector."beta\.kubernetes\.io/os"=linux

如下所述:https://docs.microsoft.com/en-us/azure/aks/ingress-basic

这是我们在舵图上使用的入口:

apiVersion: extensions/v1beta1
kind: Ingress
Metadata:
  name: my-ingress
  namespace: {{ .Release.Namespace }}
  annotations:
    kubernetes.io/ingress.class: "Nginx"
    Nginx.ingress.kubernetes.io/use-regex: "true"
    Nginx.ingress.kubernetes.io/enable-cors: "true"
    cert-manager.io/issuer: "letsencrypt-prod"
    watch-namespace: {{ .Release.Namespace }}
#    Nginx.ingress.kubernetes.io/ssl-redirect: "false"
#    Nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    # Limit uploads to 8TB
    Nginx.ingress.kubernetes.io/proxy-body-size: 800000m
spec:
  tls:
    - secretName: my-cert-tls
      hosts:
        - {{ .Values.myDomain }}
  rules:
  - host: {{ .Values.myDomain }}
    http:
      paths:
      # NOTE: this one should come after all other routes. To avoid hijacking requests.
      - path: /api/svc1(/|$)(.*)
        backend:
          serviceName: svc1
          servicePort: 8080
      - path: /api(/|$)(.*)
        backend:
          serviceName: svc2
          servicePort: 8080
      - path: /(.*)
        backend:
          serviceName: svc3
          servicePort: 8080
  - http:
      paths:
      # NOTE: this one should come after all other routes. To avoid hijacking requests.
      - path: /api/svc2(/|$)(.*)
        backend:
          serviceName: svc2
          servicePort: 8080
      - path: /api(/|$)(.*)
        backend:
          serviceName: svc1
          servicePort: 8080
      - path: /(.*)
        backend:
          serviceName: svc3
          servicePort: 8080

基本上我想看看:

  • IP 1 => namespace1 资源
  • IP 2 => namespace2 资源

IP1 永远无法访问 namespace2,反之亦然。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。