我目前正在 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 端口上返回有效响应
# 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
,可以是其他 pod 用于访问 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
警告:networking.k8s.io/v1beta1 Ingress 在 v1.19+ 中已弃用,在 v1.22+ 中不可用;使用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 的更多信息,您可以在 Minikube 文档中找到。
这是您想要的还是不同的东西?