docker - 为什么 K8s 入口在 Minikube 上工作,但在远程集群上返回 HTTP 404?
问题描述
我有一个服务(作为另一个应用程序的 Helm 子图安装)可以在 Minikube 环境中正确访问,但在部署在远程 Kubernetes 集群上时无法访问。
服务应该可以通过入口访问。
入口:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: helper-service
labels:
helm.sh/chart: "helper-service-0.2.3"
app.kubernetes.io/name: "helper-service"
app.kubernetes.io/version: "2.1"
app.kubernetes.io/managed-by: "Helm"
annotations:
# These annotations don't seem to make any difference
# traefik.ingress.kubernetes.io/ingress.class: traefik
# traefik.ingress.kubernetes.io/ssl-proxy-headers: X-Forwarded-Proto:https
# traefik.ingress.kubernetes.io/ssl-redirect: "true"
spec:
rules:
- host: "helper-service.example.com"
http:
paths:
- path: /
backend:
serviceName: helper-service
servicePort: service-port
服务
apiVersion: v1
kind: Service
metadata:
name: helper-service
labels:
helm.sh/chart: "helper-service-1.0.0"
app.kubernetes.io/name: "helper-service"
app.kubernetes.io/version: "2.13.1"
app.kubernetes.io/managed-by: "Helm"
spec:
selector:
app.kubernetes.io/name: "helper-service"
type: ClusterIP
ports:
- port: 8080
name: service-port
targetPort: 8080
protocol: TCP
部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: helper-service
labels:
helm.sh/chart: "helper-service-1.0.0"
app.kubernetes.io/name: "helper-service"
app.kubernetes.io/version: "2.1"
app.kubernetes.io/managed-by: "Helm"
spec:
replicas: 1
revisionHistoryLimit: 3
strategy:
rollingUpdate:
maxSurge: 2
maxUnavailable: 0
type: RollingUpdate
selector:
matchLabels:
app.kubernetes.io/name: "helper-service"
template:
metadata:
annotations: {}
labels:
app.kubernetes.io/name: "helper-service"
spec:
containers:
- name: helper-service
image: "myregistry/myimage:myversion"
env:
- name: HELPER-SERVICE_BIND
value: ":8080"
ports:
- containerPort: 8080
发送请求helper-service.example.com
总是从Nginx404 not found
返回错误。鉴于响应,似乎 Nginx 是可访问的,但无法提供对 Ingress 中指定的服务的访问。
但是,在同一集群/命名空间上的父图表 Helm 应用程序可以通过 NodePort 服务上的 Ingress 访问,并且在访问时没有问题。
两项服务均正常运行:
$ k get all
NAME READY STATUS RESTARTS AGE
pod/myapp-645cd66d9-g84vm 2/2 Running 0 51m
pod/myapp-helper-service-fbc6bb4d8-zklf2 1/1 Running 0 4d19h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/myapp NodePort 10.10.10.11 <none> 8080:31033/TCP 110d
service/myapp-helper-service ClusterIP 10.10.10.61 <none> 8080/TCP 110d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myapp 1/1 1 1 110d
deployment.apps/myapp-helper-service 1/1 1 1 110d
并且入口看起来正确:
$ k get ingresses
NAME HOSTS ADDRESS PORTS AGE
myapp myapp.example.com 37.44.1.172 80, 443 116d
myapp-helper-service myapp-helper-service.example.com 80 116d
入口详细信息为:
$ k describe ingress/myapp-helper-service
Name: myapp-helper-service
Namespace: my-namespace
Address:
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" is forbidden: User cannot get resource "endpoints" in API group "" in the namespace "kube-system">)
Rules:
Host Path Backends
---- ---- --------
myapp-helper-service.example.com
/ myapp-helper-service:service-port (172.25.0.207:8080)
Events: <none>
部署的服务是:
$ k describe service/myapp-helper-service
Name: myapp-helper-service
Namespace: mynamespace
Labels: app.kubernetes.io/instance=myapp
app.kubernetes.io/managed-by=Helm
app.kubernetes.io/name=helper-service
app.kubernetes.io/version=2.1
helm.sh/chart=helper-service-0.2.3
Annotations: meta.helm.sh/release-name: myapp
meta.helm.sh/release-namespace: mynamespace
Selector: app.kubernetes.io/instance=myapp,app.kubernetes.io/name=helper-service
Type: ClusterIP
IP: 10.10.10.61
Port: service-port 8080/TCP
TargetPort: 8080/TCP
Endpoints: 172.25.0.207:8080
Port: metrics-port 8081/TCP
TargetPort: 8081/TCP
Endpoints: 172.25.0.207:8081
Session Affinity: None
Events: <none>
我尝试启用/禁用添加 Traefikannotations
以查看是否有任何更改,但结果是相同的(仍然是 Nginx 的 404 ♂️)。
- 为什么相同的配置在 Minikube 上可以正常工作?
- 404 http 状态在这里暗示了什么?(入口可达但未找到服务?)
- 如何从集群内部调试可达性?
- 如何从集群/入口外部调试可达性?
- 如果此处设置正确,我还应该检查什么?
解决方案
我想出了解决方案。
即使创建了入口,但显然它实际上并没有工作(或者正在获得一些非更好指定的其他默认类)。
入口需要缺少显式注释,指定入口类:
annotations:
kubernetes.io/ingress.class: nginx-external
添加并重新部署后,入口开始正确捕获我的请求并将它们重定向到helper-service
!
笔记
如果您知道,请写下评论:
没有指定时,默认类是什么
如何确定已经在集群上运行的入口使用了什么类
推荐阅读
- elasticsearch - Elasticsearch,无法删除嵌套字段中的字段
- python - 如何在多个线程之间共享资源?
- php - Laravel Echo 不监听事件
- python - 在 MongoDB 中查询日期返回空 df
- python - 从 Flask Restful 中的一个 api 调用多次返回
- c# - 以静音作为输入继续对话
- c++ - 给定链表中的反向 K 节点
- mariadb - 神秘的 mariadb 10.4.1 内存使用情况
- curl - 通过 REST 端点从 Kismet 检索设备时出现问题
- selenium - 如何加快 AWS 设备场上的 selenium 测试?