如何使用nginx ingress基于端口路由流量
How to use nginx ingress to route traffic based on port
我目前正致力于在 kubernetes 集群上部署 ELK 堆栈,我已经成功地在 minikube 上使用 ClusterIP 服务和 nginx-ingress 将入站 http 流量路由到 kibana(5601 端口),需要我如何做的输入根据入站端口而不是路径路由流量?
使用下面的 Ingress 对象声明,我能够成功连接到我的 kibana 部署,但是我如何访问在不同端口(9200、5044、9600)上公开的其他工具堆栈?
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: ingress-service
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: kibana-service
servicePort: 5601
CUrl'ing minikube ip
默认 80 端口 returns 有效响应
# curl http://<minikube-ip>/api/status
{"name":"kibana",....}
注意:我不想使用 NodePort,但想知道 nodeport 是否是我们实现上述目标的唯一方法?
因为您已经启用了 minikube 和 minikube ingress addon
:
$ minikube addons list | grep ingress
| ingress | minikube | enabled ✅ |
| ingress-dns | minikube | enabled ✅ |
提醒一下:
targetPort
:是容器接受流量的端口(应用程序在 pod 内运行的端口)。
port
: 是抽象的 Service port
,它可以是其他 pods 用来访问 Service
.
的任何端口
请记住,如果您的容器不是 targetPort
中指定的侦听端口,您将无法连接到 pod。
还要记住防火墙配置以允许流量。
例如我使用了这个 yamls:
apiVersion: v1
kind: Service
metadata:
name: service-one
spec:
selector:
key: application-1
ports:
- port: 81
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-1
spec:
replicas: 1
selector:
matchLabels:
key: application-1
template:
metadata:
labels:
key: application-1
spec:
containers:
- name: hello1
image: gcr.io/google-samples/hello-app:1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: service-two
spec:
selector:
key: application-2
ports:
- port: 82
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-2
spec:
replicas: 1
selector:
matchLabels:
key: application-2
template:
metadata:
labels:
key: application-2
spec:
containers:
- name: hello2
image: gcr.io/google-samples/hello-app:2.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- http:
paths:
- path: /hello
backend:
serviceName: service-one
servicePort: 81
- path: /hello2
backend:
serviceName: service-two
servicePort: 82
service/service-one created
deployment.apps/deployment-1 created
service/service-two created
deployment.apps/deployment-2 created
Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.networking.k8s.io/ingress created
Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
请记住,Minikube 很快就会根据上面的警告更改 apiVersion
。
低于此配置的输出:
$ curl http://172.17.0.3/hello
Hello, world!
Version: 1.0.0
Hostname: deployment-1-77ddb77d56-2l4cp
minikube-ubuntu18:~$ curl http://172.17.0.3/hello2
Hello, world!
Version: 2.0.0
Hostname: deployment-2-fb984955c-5dvbx
您可以使用:
paths:
- path: /elasticsearch
backend:
serviceName: elasticsearch-service
servicePort: 100
- path: /anotherservice
backend:
serviceName: another-service
servicePort: 101
服务的样子:
name: elasticsearch-service
...
ports:
- port: 100
targetPort: 9200
---
name: another-service
...
ports:
- port: 101
targetPort: 5044
但是,如果您需要更高级的 path
配置,您也可以使用 rewrite。您也可以使用 default backend
重定向到特定服务。
您可以在 Minikube documentation.
中找到有关访问 Minikube 的更多信息
是您要找的还是其他的?
我目前正致力于在 kubernetes 集群上部署 ELK 堆栈,我已经成功地在 minikube 上使用 ClusterIP 服务和 nginx-ingress 将入站 http 流量路由到 kibana(5601 端口),需要我如何做的输入根据入站端口而不是路径路由流量?
使用下面的 Ingress 对象声明,我能够成功连接到我的 kibana 部署,但是我如何访问在不同端口(9200、5044、9600)上公开的其他工具堆栈?
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: ingress-service
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: kibana-service
servicePort: 5601
CUrl'ing minikube ip
默认 80 端口 returns 有效响应
# curl http://<minikube-ip>/api/status
{"name":"kibana",....}
注意:我不想使用 NodePort,但想知道 nodeport 是否是我们实现上述目标的唯一方法?
因为您已经启用了 minikube 和 minikube ingress addon
:
$ minikube addons list | grep ingress
| ingress | minikube | enabled ✅ |
| ingress-dns | minikube | enabled ✅ |
提醒一下:
targetPort
:是容器接受流量的端口(应用程序在 pod 内运行的端口)。
port
: 是抽象的 Service port
,它可以是其他 pods 用来访问 Service
.
请记住,如果您的容器不是 targetPort
中指定的侦听端口,您将无法连接到 pod。
还要记住防火墙配置以允许流量。
例如我使用了这个 yamls:
apiVersion: v1
kind: Service
metadata:
name: service-one
spec:
selector:
key: application-1
ports:
- port: 81
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-1
spec:
replicas: 1
selector:
matchLabels:
key: application-1
template:
metadata:
labels:
key: application-1
spec:
containers:
- name: hello1
image: gcr.io/google-samples/hello-app:1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: service-two
spec:
selector:
key: application-2
ports:
- port: 82
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-2
spec:
replicas: 1
selector:
matchLabels:
key: application-2
template:
metadata:
labels:
key: application-2
spec:
containers:
- name: hello2
image: gcr.io/google-samples/hello-app:2.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- http:
paths:
- path: /hello
backend:
serviceName: service-one
servicePort: 81
- path: /hello2
backend:
serviceName: service-two
servicePort: 82
service/service-one created
deployment.apps/deployment-1 created
service/service-two created
deployment.apps/deployment-2 created
Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.networking.k8s.io/ingress created
Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
请记住,Minikube 很快就会根据上面的警告更改 apiVersion
。
低于此配置的输出:
$ curl http://172.17.0.3/hello
Hello, world!
Version: 1.0.0
Hostname: deployment-1-77ddb77d56-2l4cp
minikube-ubuntu18:~$ curl http://172.17.0.3/hello2
Hello, world!
Version: 2.0.0
Hostname: deployment-2-fb984955c-5dvbx
您可以使用:
paths:
- path: /elasticsearch
backend:
serviceName: elasticsearch-service
servicePort: 100
- path: /anotherservice
backend:
serviceName: another-service
servicePort: 101
服务的样子:
name: elasticsearch-service
...
ports:
- port: 100
targetPort: 9200
---
name: another-service
...
ports:
- port: 101
targetPort: 5044
但是,如果您需要更高级的 path
配置,您也可以使用 rewrite。您也可以使用 default backend
重定向到特定服务。
您可以在 Minikube documentation.
中找到有关访问 Minikube 的更多信息是您要找的还是其他的?