[英]Kubernetes ingress returning 404
我讓Kubernetes在Docker for Windows中運行。
我正在使用NGINX入口控制器,我已經應用了mandatory.yaml
和cloud-generic.yaml
。
> kubectl get services -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx LoadBalancer 10.110.198.161 localhost 80:30037/TCP,443:31218/TCP 5h
我在我的本地注冊表test-app/mock-service:1.0.0
中有一個映像,它暴露運行具有單個端點GET /mocks
的服務器的端口8080。 使用docker run -d -p 8080:8080 test-app/mock-service:1.0.0
在Docker中docker run -d -p 8080:8080 test-app/mock-service:1.0.0
有效,我可以看到預期的結果。
我的意圖是使用Kubernetes進行部署。
我創建了一個部署和服務資源:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test-app-mock-service-deployment
namespace: test-app
spec:
selector:
matchLabels:
app: test-app-mock-service
replicas: 1
template:
metadata:
labels:
app: test-app-mock-service
spec:
containers:
- name: test-app-mock-service-container
image: "test-app/mock-service:1.0.0"
---
apiVersion: v1
kind: Service
metadata:
name: test-app-mock-service
namespace: test-app
spec:
type: ClusterIP
selector:
app: test-app-mock-service
ports:
- port: 8080
targetPort: 8080
protocol: TCP
和入口資源:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-app-ingress
namespace: test-app
annotations:
ingress.kubernetes.io/ssl-redirect: "true"
spec:
rules:
- http:
paths:
- path: /mocks
backend:
serviceName: test-app-mock-service
servicePort: 8080
我可以看到服務:
> kubectl get services -n test-app
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
test-app-mock-service ClusterIP 10.108.10.246 <none> 8080/TCP 1h
和pod:
> kubectl get pods -n test-app
NAME READY STATUS RESTARTS AGE
test-app-mock-service-deployment-6b9b58fcb9-mdskn 1/1 Running 0 59m
我可以看到入口:
> kubectl describe ingress test-app-ingress -n test-app
Name: test-app-ingress
Namespace: test-app
Address: localhost
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
*
/mocks test-app-mock-service:8080 (<none>)
Annotations:
ingress.kubernetes.io/ssl-redirect: true
kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"ingress.kubernetes.io/ssl-redirect":"true"},"name":"test-app-ingress","namespace":"test-app"},"spec":{"rules":[{"http":{"paths":[{"backend":{"serviceName":"test-app-mock-service","servicePort":8080},"path":"/mocks"}]}}]}}
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 1h nginx-ingress-controller Ingress test-app/test-app-ingress
Normal UPDATE 53m (x2 over 1h) nginx-ingress-controller Ingress test-app/test-app-ingress
但是,當我瀏覽到http://localhost/mocks
我得到308到https://localhost/mocks
,我得到404。
我不確定入口是否配置錯誤或是否是另一個問題。
可能發生的是SSL部分正在使用SNI,並且由於沒有主機或默認后端設置,因此nginx不知道將請求發送到何處。 你可以做兩件事來解決這個問題。
您可以添加注釋以為沒有主機或路由的請求設置默認后端。 有關此文檔,請訪問https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#default-backend 。 在您的示例中,它將是:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-app-ingress
namespace: test-app
annotations:
ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/default-backend: test-app-mock-service
spec:
rules:
- http:
paths:
- path: /mocks
backend:
serviceName: test-app-mock-service
servicePort: 8080
您的規范不包含TLS主機名。 添加一個應該允許SNI知道需要為指定的路由規則使用什么名稱:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-app-ingress
namespace: test-app
annotations:
ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/default-backend: test-app-mock-service
spec:
tls:
- hosts:
- localhost
secretName: tls-secret
rules:
- http:
paths:
- path: /mocks
backend:
serviceName: test-app-mock-service
servicePort: 8080
但是,如果您使用的是自簽名證書,則可能需要找到它的名稱。 您可能需要生成自己的。 有關詳細信息,請參閱https://kubernetes.github.io/ingress-nginx/user-guide/tls/ 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.