Kubernetes Ingress 对象 return 在 Windows 10 Minikube 上没有响应
Kubernetes Ingress objects return no response on Windows 10 Minikube
我尝试在 Minikube 上测试 Kubernetes Ingress。我的 OS 是 Windows 10. Minikube 和 Nginx ingress controller 安装成功。
> minikube addons enable ingress
下面是我的 Kubernetes 清单文件:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: 'nginx'
nginx.ingress.kubernetes.io/default-backend: app-nginx-svc
spec:
rules:
- host: boot.aaa.com
http:
paths:
- path: /path
pathType: Prefix
backend:
service:
name: app-nginx-svc
port:
number: 80
---
apiVersion: v1
kind: Service
metadata:
name: app-nginx-svc
namespace: ingress-nginx
spec:
type: NodePort
selector:
app: test-nginx
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30000
---
apiVersion: v1
kind: Pod
metadata:
name: app-nginx
namespace: ingress-nginx
labels:
app: test-nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Kubernetes Pod 和Service 在Minikube 上生成没有错误。当我使用以下命令测试服务时,pod 显示正确的值。
> minikube service -n ingress-nginx app-nginx-svc --url
* app-nginx-svc 서비스의 터널을 시작하는 중
|--------------------|---------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|--------------------|---------------|-------------|------------------------|
| ingress-nginx | app-nginx-svc | | http://127.0.0.1:63623 |
|-------------------|---------------|-------------|------------------------|
http://127.0.0.1:63623
但是问题出在Ingress对象上。 Minikube 入口生成端点和主机域。
我在 Windows 10 主机文件中输入域映射主机名
192.168.49.2 boot.aaa.com
但是我无法收到来自 Nginx 容器的任何响应:
以上URL根本行不通
当您尝试访问 http://boot.aaa.com/path 时 - 您提供它侦听的端口吗?从我从输出中看到的:
minikube service -n ingress-nginx app-nginx-svc --url
* app-nginx-svc 서비스의 터널을 시작하는 중
|--------------------|---------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|--------------------|---------------|-------------|------------------------|
| ingress-nginx | app-nginx-svc | | http://127.0.0.1:63623 |
|--------------------|---------------|-------------|------------------------|
==> http://127.0.0.1:63623 <==
我认为您需要提出请求:http://boot.aaa.com:63623/path
如果您不想在 Ingress 中使用主机名,只需将其从清单中删除即可。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: 'nginx'
nginx.ingress.kubernetes.io/default-backend: app-nginx-svc
spec:
rules:
- http:
paths:
- path: /path
pathType: Prefix
backend:
service:
name: app-nginx-svc
port:
number: 80
然后您应该只能通过 http://{IP}:{PORT}/path
访问您的 pod
我的补充问题:
- 您是否尝试从安装了 minikube 的同一个 OS 发出请求?
- 主机文件是否在您发出请求的 OS 上编辑过?
- 如果是,是否打开了Windows防火墙?
此外,我看到您 Service 在 port 30000[=39] 上将 NodePort 直接暴露给您的应用程序=](它不会通过 Ingress 控制器)。
通常,如果我们要为 Pod 设置 Ingress 端点,我们这样做是为了避免直接通过 NodePort 暴露它。使用 ClusterIP 服务类型即可。
apiVersion: v1
kind: Service
metadata:
name: app-nginx-svc
namespace: ingress-nginx
spec:
type: ClusterIP
selector:
app: test-nginx
ports:
- name: http
port: 80
targetPort: 80
我尝试在 Minikube 上测试 Kubernetes Ingress。我的 OS 是 Windows 10. Minikube 和 Nginx ingress controller 安装成功。
> minikube addons enable ingress
下面是我的 Kubernetes 清单文件:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: 'nginx'
nginx.ingress.kubernetes.io/default-backend: app-nginx-svc
spec:
rules:
- host: boot.aaa.com
http:
paths:
- path: /path
pathType: Prefix
backend:
service:
name: app-nginx-svc
port:
number: 80
---
apiVersion: v1
kind: Service
metadata:
name: app-nginx-svc
namespace: ingress-nginx
spec:
type: NodePort
selector:
app: test-nginx
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30000
---
apiVersion: v1
kind: Pod
metadata:
name: app-nginx
namespace: ingress-nginx
labels:
app: test-nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Kubernetes Pod 和Service 在Minikube 上生成没有错误。当我使用以下命令测试服务时,pod 显示正确的值。
> minikube service -n ingress-nginx app-nginx-svc --url
* app-nginx-svc 서비스의 터널을 시작하는 중
|--------------------|---------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|--------------------|---------------|-------------|------------------------|
| ingress-nginx | app-nginx-svc | | http://127.0.0.1:63623 |
|-------------------|---------------|-------------|------------------------|
http://127.0.0.1:63623
但是问题出在Ingress对象上。 Minikube 入口生成端点和主机域。
我在 Windows 10 主机文件中输入域映射主机名
192.168.49.2 boot.aaa.com
但是我无法收到来自 Nginx 容器的任何响应:
以上URL根本行不通
当您尝试访问 http://boot.aaa.com/path 时 - 您提供它侦听的端口吗?从我从输出中看到的:
minikube service -n ingress-nginx app-nginx-svc --url
* app-nginx-svc 서비스의 터널을 시작하는 중
|--------------------|---------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|--------------------|---------------|-------------|------------------------|
| ingress-nginx | app-nginx-svc | | http://127.0.0.1:63623 |
|--------------------|---------------|-------------|------------------------|
==> http://127.0.0.1:63623 <==
我认为您需要提出请求:http://boot.aaa.com:63623/path
如果您不想在 Ingress 中使用主机名,只需将其从清单中删除即可。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: 'nginx'
nginx.ingress.kubernetes.io/default-backend: app-nginx-svc
spec:
rules:
- http:
paths:
- path: /path
pathType: Prefix
backend:
service:
name: app-nginx-svc
port:
number: 80
然后您应该只能通过 http://{IP}:{PORT}/path
访问您的 pod我的补充问题:
- 您是否尝试从安装了 minikube 的同一个 OS 发出请求?
- 主机文件是否在您发出请求的 OS 上编辑过?
- 如果是,是否打开了Windows防火墙?
此外,我看到您 Service 在 port 30000[=39] 上将 NodePort 直接暴露给您的应用程序=](它不会通过 Ingress 控制器)。
通常,如果我们要为 Pod 设置 Ingress 端点,我们这样做是为了避免直接通过 NodePort 暴露它。使用 ClusterIP 服务类型即可。
apiVersion: v1
kind: Service
metadata:
name: app-nginx-svc
namespace: ingress-nginx
spec:
type: ClusterIP
selector:
app: test-nginx
ports:
- name: http
port: 80
targetPort: 80