我正在使用
Kubernetes v1.23.16 cluster (One master and three workers)
裸机。
我在单独的命名空间中创建了几个服务。下同。
$ kubectl get services --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
app1 app1-service ClusterIP 10.103.151.235 <none> 80/TCP 19h
app2 app2-service ClusterIP 10.105.88.151 <none> 80/TCP 11d
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 11d
现在我可以通过以下
nginx resource yml
访问外部服务。例如,我想要如下所示的访问权限。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: app-ingress
spec:
ingressClassName: nginx
rules:
- host: web.example.com
http:
paths:
- path: /app1
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
- path: /app2
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 80
当我应用
nginx resource yml
文件时,它显示 service not found
错误。
$ kubectl describe ingress app-ingress
Name: app-ingress
Labels: <none>
Namespace: default
Address:
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
Host Path Backends
---- ---- --------
web.example.com
/app1 app1-service:80 (<error: endpoints "app1-service" not found>)
/app2 app2-service:80 (<error: endpoints "app2-service" not found>)
Annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2
因为我的应用程序服务分别在不同的命名空间中运行,并且我的
nginx resource yml
在 default
命名空间中运行。那么现在我如何配置 nginx 资源文件来访问我的两个服务?
Ingress 资源只能引用与 Ingress 位于同一命名空间中的服务。要管理同一主机名上通向不同命名空间中的后端的两条路径,您将需要两个单独的 Ingress 资源。
在
app1
命名空间中:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
namespace: app1
spec:
ingressClassName: nginx
rules:
- host: web.example.com
http:
paths:
- path: /app1
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
在
app2
命名空间中:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
namespace: app2
spec:
ingressClassName: nginx
rules:
- host: web.example.com
http:
paths:
- path: /app2
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 80
这些资源到位后,对 http://web.example.com/app1 的请求将转到 app1-service,对 http://web.example.com/app2 的请求将转到 app2-服务。
注意:我删除了您的
nginx.ingress.kubernetes.io/rewrite-target
注释,因为您在此示例中没有进行任何基于正则表达式的路径重写。
我在网上放置了一个可部署的示例这里。
只需在单个入口中删除您的rewritepath即可实现它。
如果您要创建多个,请确保按照 Larsks 的建议更改名称,否则它将覆盖现有名称。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
spec:
ingressClassName: nginx
rules:
- host: web.example.com
http:
paths:
- path: /app1
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
- path: /app2
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 80