0

我有一个工作的 Nexus 3 pod,可在端口 30080(使用 NodePort)上访问:http://nexus.mydomain:30080/在所有主机(来自集群或外部)上都能完美运行。

现在我试图让它在端口 80 上访问(出于显而易见的原因)。

按照文档,我已经实现了它(微不足道):

[...]
---

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nexus-ingress
  namespace: nexus-ns
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: nexus.mydomain
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              serviceName: nexus-service
              servicePort: 80

应用它没有错误。但是当我尝试访问http://nexus.mydomain时,我得到:

暂停服务

不显示日志(未命中 webapp)。

我错过了什么 ?

4

2 回答 2

2

K3s 轻量级 Kubernetes

K3s 被设计成一个小于 40MB 的单一二进制文件,它完全实现了 Kubernetes API。为了实现这一点,他们删除了许多不需要成为核心一部分的额外驱动程序,并且很容易被附加组件替换。

正如我在评论中提到的,K3s 默认使用Traefik Ingress Controller

Traefik 是一个开源的边缘路由器,它可以让你的服务发布成为一种有趣而轻松的体验。它代表您的系统接收请求,并找出哪些组件负责处理它们。

这些信息可以在K3s Rancher 文档中找到。

Traefik 在启动服务器时默认部署...为防止k3s使用或覆盖修改后的版本,请将修改后的副本部署k3s--no-deploy traefik存储在k3s/server/manifests目录中。有关更多信息,请参阅官方 Traefik for Helm 配置参数。

--disable traefik要禁用它,请使用该选项启动每个服务器。

如果你想部署Nginx 入口控制器,你可以查看指南如何在 K3s 中使用 NGINX 入口控制器

正如您使用特定的Nginx Ingress一样nginx.ingress.kubernetes.io/rewrite-target: /$1,您必须使用Nginx Ingress.

如果您要使用超过 2 个Ingress controllers,则需要强制使用nginx ingressby annotation

  annotations:
    kubernetes.io/ingress.class: "nginx"

如果提及信息无济于事,请提供更多详细信息,例如您的Deployment, Service

于 2020-10-26T13:55:10.890 回答
1

我认为您不能通过 NodePort 服务在端口 80 或 443 上公开它,或者至少不建议这样做。

在此配置中,NGINX 容器与主机网络保持隔离。因此,它可以安全地绑定到任何端口,包括标准的 HTTP 端口 80 和 443。但是,由于容器命名空间隔离,位于集群网络之外的客户端(例如在公共互联网上)无法访问 Ingress主机直接在端口 80 和 443 上。相反,外部客户端必须将分配给服务的 NodePort 附加ingress-nginx到 HTTP 请求。

--裸机注意事项 - NGINX 入口控制器

*我添加的重点。

--service-node-port-range虽然使用API 服务器标志重新配置 NodePort 范围以包括非特权端口并能够公开端口 80 和 443听起来很诱人,但这样做可能会导致意外问题,包括(但不限于)使用原本保留给系统守护进程以及授予 kube-proxy它可能不需要的特权的必要性。

因此不鼓励这种做法。请参阅本页中提出的其他方法以获取替代方案。

--裸机注意事项 - NGINX 入口控制器

几个月前我做了类似的设置。我安装了一个MetalLB负载均衡器,然后公开了该服务。根据您的提供商(例如,GKE),负载均衡器甚至可以自动启动。所以可能你甚至不必处理 MetalLB,尽管 MetalLB 不难设置并且效果很好。

于 2020-10-24T10:19:46.020 回答