Я использую 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, а запросы на http://web.example.com/app2 — в app2. -услуга.
NB: я удалил вашу аннотацию nginx.ingress.kubernetes.io/rewrite-target
, потому что в этом примере вы не выполняете переписывание пути на основе регулярных выражений.
Я разместил развертываемый пример онлайн здесь.
Просто удалите свой путь перезаписи в одном входе, вы можете этого добиться.
Если вы создаете множественное число, обязательно измените имя, как предложил Ларск, иначе оно перезапишет существующее.
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