一小时精通Kubernetes的服务暴露和七层代理Ingress

一小时精通Kubernetes的服务暴露和七层代理Ingress

随着容器和Kubernetes技术的兴起,集群入口流量管理方式逐渐通用化、标准化。Kubernetes通过定义Ingress资源用来管理外部访问集群内部服务的HTTP/HTTPS流量。目前,Ingress的实现者Provider的发展呈百花齐放的状态,用户可以根据自身业务场景进行产品选型 https://yqh.aliyun.com/live/detail/28477

Kubernetes Ingress 最佳实践


Ingress-Nginx Controller-Overview

Kubernetes 文档-概念-服务、负载均衡和联网–Ingress

Ingress 控制器

K8S里有三个网段


K8S里有几个网段?分别是什么?有什么作用(感觉也不对)


在Kubernetes(K8S)中,通常使用以下几个网络段:

  1. Pod 网段:这是用于分配给每个Pod的IP地址范围。每个Pod都有自己的唯一IP地址,并且可以通过该地址在集群内进行通信。默认情况下,Kubernetes使用CIDR块 10.244.0.0/16 来分配Pod IP地址。

  2. Service 网段:Service 网段用于分配给Kubernetes Service的虚拟IP地址。Service是一种用于公开一组Pod的稳定网络终结点的抽象。通过Service,其他Pod或外部用户可以通过该虚拟IP与相关Pod进行通信。默认情况下,Kubernetes使用CIDR块 10.96.0.0/12 作为Service IP地址范围。

  3. Cluster 网段:Cluster 网段是用于分配给Kubernetes集群中的各种网络组件的IP地址。这包括Kubernetes节点、Kubelet、kube-proxy等。默认情况下,Kubernetes使用CIDR块 10.0.0.0/8 作为Cluster IP地址范围。

这些网络段在Kubernetes中的作用如下:

  • Pod 网段:Pod 网段为每个Pod分配唯一的IP地址,使得Pod之间可以直接通过IP地址进行通信,而无需进行端口映射等复杂操作。这为Pod提供了更好的网络隔离和直接通信的能力。

  • Service 网段:Service 网段提供了一种抽象机制,使得Kubernetes Service能够通过虚拟IP地址对外部用户或其他Pod提供稳定的访问终结点。Service可以将请求负载均衡到后端的多个Pod,实现高可用性和水平扩展。

  • Cluster 网段:Cluster 网段用于分配给Kubernetes集群的各个组件,包括节点、Kubelet等。这些组件之间需要相互通信以实现集群管理、服务发现和内部通信等功能。Cluster 网段确保了各个组件之间的网络互通性。

需要注意的是,这些网络段的具体数值和范围可以根据Kubernetes集群的配置进行自定义。上述提到的默认数值仅作为参考。


Kubernetes的网络模型(K8S集群中的三个网络)

k8s-集群里的三种IP(NodeIP、PodIP、ClusterIP)



Pod之间通信都是通过什么方式连接的? (感觉有问题)


在Kubernetes中,Pod之间的通信是通过网络连接实现的。具体来说,Kubernetes使用以下方式来建立和管理Pod之间的连接:

  1. Pod IP地址:每个Pod都被分配了一个唯一的IP地址,这个IP地址用于标识Pod在集群内的位置。其他Pod或外部服务可以使用该IP地址与Pod进行通信。

  2. Service:Service是一种抽象机制,用于公开一组Pod的稳定网络终结点。当创建一个Service时,Kubernetes会为它分配一个虚拟IP地址,称为ClusterIP。其他Pod或外部服务可以通过该虚拟IP地址与Service关联的Pod进行通信。Kubernetes内部会自动处理请求的负载均衡,将请求分发给后端的Pod。

  3. DNS解析:Kubernetes内置了一个DNS解析服务,称为Cluster DNS。每个Pod都可以通过该服务来解析其他Pod或Service的域名。Pod可以使用其他Pod或Service的名称来进行通信,而无需直接使用IP地址。

  4. 网络插件:Kubernetes使用网络插件来实现Pod之间的通信。网络插件负责在底层网络中创建虚拟网络和网络隧道,以便Pod可以通过这些虚拟网络进行通信。常见的网络插件包括Flannel、Calico、Weave等。

通过这些方式,Kubernetes提供了灵活而强大的网络连接机制,使得Pod之间的通信变得简单和可靠。无论Pod处于同一节点还是不同节点,它们都可以通过这些连接方式进行通信,构建起一个高度可互操作的容器编排环境。


如何从外部去访问内部?

Kubernetes的service有几种类型?分别是什么?

https://www.bilibili.com/video/BV1GJ411D72K

https://www.bilibili.com/video/BV13V4y1z76a

Kubernetes中的Service有以下几种类型:

  1. ClusterIP(默认类型):ClusterIP类型的Service将为Service分配一个在集群内部可访问的虚拟IP地址。这个IP地址只能从集群内部访问,对外部是不可见的。它提供了一种内部服务发现的机制,其他Pod可以通过该虚拟IP地址与Service进行通信。这是最常用的Service类型。

  2. NodePort:NodePort类型的Service会为Service分配一个静态的端口号(NodePort),在每个节点上监听该端口。此外,Kubernetes还会分配一个ClusterIP作为虚拟IP地址,用于内部服务发现。通过节点的IP地址和NodePort,可以从集群外部访问Service。该类型通常用于将服务公开到集群外部,但不适合处理大量流量。

  3. LoadBalancer:LoadBalancer类型的Service会创建一个外部负载均衡器,并将请求通过负载均衡器转发给后端的Service。在云环境中,Kubernetes可以通过云服务提供商的负载均衡器实现该类型的Service。它可以将服务公开到互联网,并具备负载均衡的功能。该类型适合处理较大规模的流量。

  4. ExternalName:ExternalName类型的Service允许将Service映射到集群外部的任意域名。它通过CNAME记录将Service的名称解析为指定的外部域名。这种类型的Service通常用于将集群内的服务与集群外的服务进行无缝集成。

这些Service类型允许在Kubernetes集群中灵活地定义和公开不同类型的服务。根据具体的应用需求,可以选择适合的Service类型来提供内部或外部的服务访问。


pod一般是通过service实现服务发现和服务暴露的。service有4种方式(其中loadbalance适合于公有云环境)

Ingress有两个组件,Ingress Api和Ingress Controller。前者k8s自己带,负责路由规则啥的;后者需要自己安装,负责实际去做,去落地&实现(这个具体的软件可以是nginx,haproxy,甚至是envoy等)

k8s官方的ingress,用的是nginx


用apply,不要用create

ingress相当于汽车,ingress-nginx相当于奔驰,是汽车中的一种