【问题标题】:kubernetes ingress configurationKubernetes入口配置
【发布时间】:2020-10-24 08:57:34
【问题描述】:

我有一个正常工作的 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 时,我得到:

服务不可用

不显示日志(未点击 web 应用)。

我错过了什么?

【问题讨论】:

  • 它的本地环境还是云环境?你是如何部署 K3s 的? K3s 的默认入口控制器是Traefik。您是否使用--no-deploy-traefik 部署了 K3s?你是如何部署 Nginx 入口控制器的?由于您使用的是特定于 nginx 入口的注释并且入口控制器多于一个,因此您应该在 Ingress 中指定应该使用哪个入口控制器。
  • “nexus-service”应用在哪个命名空间中?你可以通过 nginx pod 访问nexus-service.<namespace>.svc.cluster.local 吗?或部署在该命名空间中的其他 pod?
  • @PjoterS 感谢您的评论。我不知道 Traefik 是 K3s 上的默认 LB(顺便说一句,是的,它已被部署,因为我没有指定 --no-deploy-traefik)。考虑到这一点,我会努力自己进步。

标签: kubernetes kubernetes-ingress k3s


【解决方案1】:

K3s Lightweight Kubernetes

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

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

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

此信息可以在K3s Rancher Documentation找到。

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

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

如果要部署Nginx Ingress controller,可以查看指南How to use NGINX ingress controller in K3s

当您使用特定的Nginx Ingress(如nginx.ingress.kubernetes.io/rewrite-target: /$1)时,您必须使用Nginx Ingress

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

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

如果提及信息没有帮助,请提供更多详细信息,例如您的DeploymentService

【讨论】:

  • 经过一些试验/错误,我能够让它工作。但是仍然无法使用端口 80 和 443。至少现在服务负载平衡,对于第一个/个人集群来说已经足够了。谢谢你的帮助:)
【解决方案2】:

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

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

-- Bare-metal considerations - NGINX Ingress Controller

* 我添加的重点。

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

因此不鼓励这种做法。查看其他方法 在此页面中提出了替代方案。

-- Bare-metal considerations - NGINX Ingress Controller

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

【讨论】:

    猜你喜欢
    • 2017-11-19
    • 2021-08-08
    • 1970-01-01
    • 2019-11-20
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2021-11-02
    相关资源
    最近更新 更多