kubernetes 中不同的命名空间可以使用相同的主机名吗?

Can the same hostname be used in different namespaces in kubernetes?

我想在第一个命名空间和示例中使用我的主机名 test.com。在另一个命名空间中使用 com/demo。但是我无法这样做,因为(在我看来)nginx-ingress 控制器总是指向第一个网站(example.com)。我的 nginx-ingress 控制器是默认命名空间

中的 运行
#namespace prod
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: ingress
  namespace: production
    annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 20m
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /static
            backend:
              serviceName: app-svc
              servicePort: 80
          - path: /
            backend:
              serviceName: app-svc
              servicePort: 8000
  tls:
  - hosts:
    - example.com
    secretName: cert
status:
  loadBalancer:
    ingress:
      - ip: xx.xxx.xx.xxx


#namespace dev
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: test-ingress
  namespace: dev-env
    annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 20m
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /static
            backend:
              serviceName: app-svc
              servicePort: 80
          - path: /demo
            backend:
              serviceName: app-svc
              servicePort: 8000
  tls:
  - hosts:
    - example.com
    secretName: cert
status:
  loadBalancer:
    ingress:
      - ip: xx.xxx.xx.xxx
 
 

您可以使用相同的 hostname/domain,但是为了访问不同的后端服务,您必须定义不同的路径,在您的情况下您可以这样做:

#namespace prod
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: test-ingress
  namespace: prod-env
    annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 20m
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /prod/static
            backend:
              serviceName: app-svc
              servicePort: 80
          - path: /prod/
            backend:
              serviceName: app-svc
              servicePort: 8000
  tls:
  - hosts:
    - example.com
    secretName: selfsigned-cert
status:
  loadBalancer:
    ingress:
      - ip: 80.180.31.153


#namespace dev
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: test-ingress
  namespace: dev-env
    annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 20m
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /dev/static
            backend:
              serviceName: app-svc
              servicePort: 80
          - path: /demo
            backend:
              serviceName: app-svc
              servicePort: 8000
  tls:
  - hosts:
    - example.com
    secretName: selfsigned-cert
status:
  loadBalancer:
    ingress:
      - ip: 80.180.31.153

像这样你有:

example.com/prod/static -> points to app-svc:80 on prod-env namespace  
example.com/prod/ -> points to app-svc:8000 on prod-env namespace  

example.com/dev/static -> points to app-svc:8000 on dev-env namespace  
example.com/demo -> points to app-svc:8000 on dev-env namespace 

如果您需要保留主机后的 url,您应该为每个命名空间添加一个子域:

dev.example.com/static -> points to app-svc:80 on prod-env namespace  
prod.example.com/static -> points to app-svc:8000 on dev-env namespace  

为了使其正常工作,您必须在您的域 DNS 管理中将其定义为 A 记录,指向与您的 loadBalancer 相同的 IP(在本例中为 80.180.31.153):

example.com A -> 80.180.31.153 (optional)   
dev.exmaple.com A -> 80.180.31.153  
prod.example.com A -> 80.180.31.153  

或最简单的一个:

*.example.com A -> 80.180.31.153