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
我想在第一个命名空间和示例中使用我的主机名 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