【问题标题】:What is the difference between flannel (network layer) and ingress in kubernetes ?flannel(网络层)和 kubernetes 中的 ingress 有什么区别?
【发布时间】:2018-10-17 05:43:00
【问题描述】:

我在 GCP 上设置了 2 个 VPC,我在每个 VPC 上设置了 kubeadm,我们称它们为 kubemaster 和 kubenode1。所以我在 kubemaster 和 kubenode1 上运行了 kubeadm:

  • kubeadm init 在 kubemaster 上
  • kubeadm join 在 kubenode1 上

当我尝试kubectl apply -f (a deployment which contains a pod with simple webapps inside)kubectl apply -f (a NodePort type of Service which target the deployment port)

之后我只是从我的浏览器(在我的本地机器上而不是在 GCP 上)访问 webapps,它就像我在 minikube 上尝试的那样不起作用(我也使用与上面相同的 kubectl apply 设置 minikube)。我挖了一些搜索,有很多人说关于 Ingress 和网络层(kubernetes 网站示例中的 flannel)

我的问题是这些 Ingress 和 flannel 是什么?如果我只想让我的 webapp 运行,哪一个是必要的,或者两者都不需要?彼此如何对抗他人?因为据我了解,分层如下:

Traffic -> Services -> Deployments/Pods

这些入口和法兰绒西装在哪里?如果两者都不是,为什么我的应用程序无法按预期工作(我在 GCP 设置中打开所有端口,所以我想这不是安全问题),我尝试设置 Kubernetes Dashboard-UI,运行kubectl proxy,但我的浏览器仍然无法访问这两个服务(我在部署中的 webapp 以及 Dashboard API),我可能有点迷失在这里。

【问题讨论】:

    标签: docker kubernetes google-cloud-platform docker-compose kubernetes-ingress


    【解决方案1】:

    法兰绒和 Ingress 是完全不同的东西。

    flannel 是一个 CNI 或容器网络接口插件,其任务是容器之间的网络。正如 coreOS 所说:

    每个容器都分配有一个 IP 地址,可用于 与同一主机上的其他容器通信。用于交流 通过网络,容器被绑定到主机的 IP 地址 机器,并且必须依靠端口映射才能到达所需的容器。 这使得在容器内运行的应用程序难以 宣传他们的外部 IP 和端口,因为该信息不是 可供他们使用。

    flannel 通过给每个容器一个 IP 来解决这个问题 用于容器到容器的通信。它使用数据包 封装以创建一个跨越整个网络的虚拟覆盖网络 簇。更具体地说,flannel 给每个主机一个 IP 子网(/24 默认情况下),Docker 守护进程可以从中分配 IP 各个容器。

    Kubernetes 支持其他一些 CNI 插件:Calico、weave 等。它们因功能而异(例如,支持 NetworkPolicy 等限制资源的功能)

    Ingress 是一个 Kubernetes 对象,通常运行在网络栈(HTTP)的应用层,允许你对外暴露你的服务,它还提供了 HTTP 请求路由、基于 cookie 的会话亲和性等功能, HTTPS 流量终止等。 (就像网络服务器 Nginx 或 Apache)

    【讨论】:

    • 我需要法兰绒吗?因为我认为容器容器在其中使用 ClusterIP 服务进行对话? flannel 实际上只是将节点连接到节点。我需要两者兼得吗?还是两者都是可选的?我还是不明白
    • 您的节点通过网络接口(eth0、eth1 等)相互连接。 flannel 不是关于将节点相互连接,而是关于容器网络通信。 ClusterIP- 不是关于 pod,而是关于 k8s Service 对象。你需要更多的理论才能说清楚。
    【解决方案2】:

    我想在现有答案的同时再补充几点。

    之后,我只需从浏览器(在本地 机器不在 GCP 上),它只是不像我在 minikube 上尝试过的那样工作

    您是否打开了NodePort 的安全规则/防火墙规则?您是在哪个实例上打开的,您要点击哪个实例来访问您的应用?

    我的问题是这些 Ingress 和 flannel 是什么?

    我建议您阅读官方文档。但无论如何,既然你问了这个问题,我想说几句。

    • Flannel 是容器的中继网络,容器的子网可以跨越多个节点(与本机 docker network-host n/w、NAT 等相反)。每个容器每次生成时都会获得自己的 IP。 flannel 更像是 K8s 内部容器网络的控制平面
    • Ingress 是负载均衡器的智能路由器(或者现在很简单,我们可以说它将应用程序暴露在 K8s 之外)。它在应用程序级别工作。一旦你点击“入口”端点,它将转发到服务(这取决于入口规则),然后转发到应用程序 pod。

    我看到你在谈论ClusterIP。一般来说,ClusterIP 是 K8s 服务的 IP,这不过是“IP 表规则”的魔法。一旦您定义了“服务”,Kube-Proxy 负责在每个节点中编写 ip 表规则。这些 ip 表规则或ClusterIP 指向实际的 pod IP(flannel daemon 分配的 IP)。我希望您能理解,flannel 和“Ingress”如何融入图片或协同工作或负责应用程序流量。(如果我错了,请更正..!!

    • 能否粘贴入口控制器 yaml 内容?你定义的规则是什么?
    • 既然您使用的是 GCP,为什么不试试 GKE?我的意思是它很容易部署,除了你可以使用LoadBalancer而不是依赖Ingress来访问你的应用程序(无论如何,这不关我的事:-))

    【讨论】:

    • github.com/archkiddo/kubetest ,这是我的整个设置,非常简单,我只想通过浏览器从外部网络访问它
    • 好的,所以您在创建 Ingress/service/app 时没有收到任何错误?我相信,您正在访问像<NODE_IP>:3000??这样的应用程序
    • 没有错误,不,我正在访问<NodeExternalIP>/,因为您看到了到根路径的入口路由,无论哪种方式都不起作用
    • @thegexploit 对!。当您在浏览器中点击请求时,您能否使用tcpdump 工具检查数据包是否到达。还要检查“Ingress-Controller”pod 日志
    【解决方案3】:

    一般来说,flannel 或 pod 到 pod 网络层是使 pod 在 Kubernetes 中能够相互通信的原因。另一方面,Ingress Controller 负责接收 Ingress 对象并将它们转换为规则,以便通过 pod 到 pod 网络接收和转发(主要是)HTTP(S) 流量到后端服务。

    如您所见,从技术上讲,您只需要第一个(pod 到 pod 网络),因为您可以使用 NodePort 或 LoadBalancer 服务直接在某处公开您的服务,但如果您公开多个服务,则使用 Ingress 非常方便服务(与经典 Web 服务器安装上的虚拟主机非常相似。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 2019-04-06
      • 2018-06-03
      • 1970-01-01
      • 2019-03-05
      • 2012-10-31
      相关资源
      最近更新 更多