Kubernetes网络揭秘:看完你就懂了

一、Master集群网络

master集群的网络比较简单,和通常的负载均衡集群一样。多个节点的apiserver的ip与端口(6443)使用负载均衡的ip与端口。在master/node节点join时均使用此负载均衡的ip与端口,这样就是master节点的集群网络。

  • master 节点之间的网络:如果有多个 master 节点,它们之间需要通过 etcd 这个分布式键值存储来保持数据的一致性。etcd 通常使用 Raft 协议来实现高可用和容错性,它需要每个节点之间都能够互相通信,因此需要配置一个可靠的网络连接。
  • master 节点和 node 节点之间的网络:master 节点和 node 节点之间需要通过 kube-apiserver 这个组件来进行通信。kube-apiserver 是 master 节点上运行的组件,它提供了 RESTful 的 API 接口,供外部客户端和内部组件访问 k8s 集群的资源和状态。node 节点上运行着 kubelet 和 kube-proxy 这两个组件,它们需要定期向 kube-apiserver 汇报节点和 Pod 的信息,或者接收 kube-apiserver 的指令。因此,需要配置一个安全和稳定的网络连接。
  • master 节点和外部客户端之间的网络:外部客户端可以通过 kubectl 命令行工具或者其他方式来访问 master 节点上的 kube-apiserver,从而对 k8s 集群进行管理和操作。为了保证安全性和可访问性,需要配置一个合适的网络地址和端口,并且使用 TLS/SSL 加密通信。

二、Node集群网络

K8s集群对外暴露服务的方式主要有以下几种:

  • NodePort:将服务暴露到集群中每个节点的固定端口,客户端可以通过节点的 IP 地址和端口访问服务。
  • LoadBalancer:使用云平台的负载均衡器将服务暴露到公网,客户端可以通过公网 IP 地址和端口访问服务。
  • Ingress:使用 Ingress 控制器将服务暴露到公网,并提供统一的域名访问。

1、NodePort

NodePort 是 Kubernetes 提供的一种最简单的服务暴露方式。当 Service 的类型为 NodePort 时,Kubernetes 会为该 Service 分配一个固定的端口,该端口会映射到集群中每个节点的相同端口。客户端可以通过集群中任何节点的 IP 地址和端口访问服务。

NodePort 的配置非常简单,只需要在 Service 的 spec 中设置 type 为 NodePort,并指定端口号即可。例如,以下 YAML 定义了一个 NodePort 服务:

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30000

该服务将暴露到集群中每个节点的 30000 端口。客户端可以通过集群中任何节点的 IP 地址和 30000 端口访问该服务。

NodePort 的优点是简单易用,可以快速将服务暴露到集群外部。但是,NodePort 也有一定的缺点。

Kubernetes NodePort 类型的服务将在每个节点上暴露一个端口,并分配一个 cluster IP 地址。外部客户端可以通过 : 来访问该服务。NodePort 类型的服务适用于需要在集群外部访问的服务,例如 Web 服务。

NodePort 类型的服务有以下优点:

  • 配置简单,只需要指定 type: NodePort 即可。
  • 部署快速,不需要额外的组件。
  • 可用于任何类型的服务,包括 HTTP、TCP 和 UDP。

NodePort 类型的服务也有以下缺点:

  • 端口范围有限,只能使用 30000-32767 之间的端口。
  • 每个端口只能提供一种服务,无法同时提供多个服务。
  • 需要手动打开防火墙来允许外部流量进入集群。

2、LoadBalancer

LoadBalancer 是 Kubernetes 提供的一种更高级的服务暴露方式。当 Service 的类型为 LoadBalancer 时,Kubernetes 会在云平台上创建一个负载均衡器(一般付费购买相应的负载均衡产品),并将该负载均衡器绑定到 Service 上。客户端可以通过负载均衡器的公网 IP 地址和端口访问服务。

LoadBalancer 类型的服务有以下优点:

  • 具有高可用性,可以保证服务始终可用。
  • 可以为多个服务提供负载均衡,提高服务的性能。
  • 可以使用任意端口来暴露服务。
  • 可以为服务提供 SSL/TLS 保护。

LoadBalancer 类型的服务也有以下缺点:

  • 配置复杂,需要指定负载均衡器的类型和配置。
  • 部署需要额外的时间和资源。
  • 可能需要额外付费,具体取决于负载均衡器的类型。

3、Ingress

Ingress 是 Kubernetes 提供的一种更灵活的服务暴露方式。Ingress 控制器可以将多个 Service 统一到一个域名下,并提供路由规则,使得客户端可以通过统一的域名访问不同的Service。

具体选择哪种方式需要根据实际需求来决定。如果需要快速部署服务,NodePort 是一个不错的选择。如果需要将服务暴露到公网,LoadBalancer 或 Ingress 是更好的选择。

它具有以下优点:

  • 灵活性和强大功能:Ingress 可以根据请求的路径、主机名、HTTP 方法等来路由流量到不同的 Service。Ingress 还可以提供负载均衡、SSL/TLS 保护、缓存等功能。
  • 易用性:ngress 的配置简单,可以使用 YAML 文件来定义 Ingress 规则。
  • 可扩展性:Ingress 可以使用多个 Ingress Controller 来实现负载均衡和高可用性。

Ingress 的缺点:

  • 性能开销:Ingress Controller 需要在集群中运行,会消耗一定的资源。
  • 复杂性:Ingress 的配置可能比较复杂,需要一定的学习成本。

三、相关问题

1、已经有了Service为什么还需要ingress?

Kubernetes Service 和 Ingress 都是用来将 Kubernetes 服务暴露给外部世界的资源对象。它们之间主要的区别如下:

  • Service是Kubernetes 的核心概念,用于将 Pod 集合抽象成一个逻辑单元,并提供一个统一的访问入口。Service 有四种类型:ClusterIP、NodePort、LoadBalancer 和 ExternalName。其中,ClusterIP 类型的 Service 只在集群内部可用,NodePort 类型的 Service 在集群内部和集群外部都可用,LoadBalancer 类型的 Service 在集群外部可用,ExternalName 类型的 Service 指向一个外部主机或域名。
  • Ingress 是 Kubernetes 的扩展资源对象,用于为 Service 提供更灵活和强大的路由功能。Ingress 可以根据请求的路径、主机名、HTTP 方法等来路由流量到不同的 Service。Ingress 还可以提供负载均衡、SSL/TLS 保护、缓存等功能。

因此,Service 和 Ingress 可以结合起来使用,以实现更灵活和强大的服务路由功能。例如,可以使用 Service 将 Pod 集合抽象成一个逻辑单元,然后使用 Ingress 为该 Service 提供路由和负载均衡功能。

2、是否可以使用nginx代替ingress?

Ingress 和外部 Nginx 之间的主要区别如下:

  • 部署位置: Ingress 是 Kubernetes 中的资源对象,需要在 Kubernetes 集群中部署。外部 Nginx 可以部署在 Kubernetes 集群外部,也可以部署在 Kubernetes 集群内部。
  • 管理方式: Ingress 由 Kubernetes 控制器管理,可以使用 Kubernetes API 来管理 Ingress。外部 Nginx 需要通过外部工具或命令来管理。
  • 功能: Ingress 提供了更丰富的功能,例如负载均衡、SSL/TLS 保护、缓存等。外部 Nginx 可以通过插件来扩展功能,但可能不如 Ingress 的功能丰富。

Ingress 是 Kubernetes 中更完整的解决方案,它提供了更丰富的功能和更灵活的配置方式。如果您需要使用 Kubernetes 集群中的所有功能,那么使用 Ingress 是更好的选择。

以下是一些使用外部 Nginx 代替 Ingress 的场景:

  • 您已经有现有的 Nginx 服务器,并且不想部署 Ingress。
  • 您需要使用外部 Nginx 的特定功能,例如特定的插件或配置。
  • 您需要将 Kubernetes 服务暴露到外部网络,但不需要使用 Ingress 的所有功能。

3、NodePort vs Ingress

  • NodePort是一种简单易用的外部访问方式,它在所有节点上开放一个端口,转发流量到服务。它的优点是不需要额外的IP地址或负载均衡器,但它的缺点是端口范围有限(30000-32767),不安全(容易被攻击),不支持七层协议(无法根据域名或路径路由),并且性能受限于节点数 。
  • Ingress是一种强大灵活的外部访问方式,它在多个服务前端,根据路径或域名路由流量到服务。它的优点是可以暴露多个服务,支持HTTP/HTTPS协议,提供高性能和高可用性,并且可以集成各种插件和功能(如SSL/TLS终止、认证、重写、限流等)。但它的缺点是复杂难懂,需要额外的控制器和插件,以及云环境或物理设备提供的负载均衡器 。

四、部署应用的步骤

在 k8s node 集群节点部署的 java 应用,要想向外提供访问服务,需要使用 k8s 的 Service 和 Ingress 这两个资源对象。Service 是一种抽象,它定义了一组 Pod 的逻辑访问方式,可以实现 Pod 之间和 Pod 与外部网络之间的负载均衡和服务发现。Ingress 是一种规则集合,它定义了如何将外部请求路由到集群内部的 Service 上,可以实现域名、路径、SSL/TLS 等高级功能 。具体可以通过以下几个步骤来实现:

  • 首先,需要在 node 节点上创建一个 Deployment对象,来定义 java 应用的 Pod 的数量、规格、镜像等信息,并且为每个 Pod 分配一个 IP 地址。
  • 然后,需要在 node 节点上创建一个 Service 对象,来定义 java 应用的访问方式,如端口、协议、选择器等信息,并且为 Service 分配一个虚拟 IP 地址。
  • 接着,需要在 node 节点上创建一个 Ingress 对象,来定义 java 应用的外部访问规则,如域名、路径、证书等信息,并且为 Ingress 分配一个公网 IP 地址或者域名。
  • 最后,需要在 node 节点上安装一个 Ingress Controller 组件,如 nginx-ingress、traefik 等,来根据 Ingress 对象的规则,将外部请求转发到对应的 Service 上。

如果文章对你有帮助,欢迎关注+点赞,必回关!!!

相关推荐
新知图书35 分钟前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
条纹布鲁斯1 小时前
dockerdsktop修改安装路径/k8s部署wordpress和ubuntu
docker·kubernetes
盛夏绽放1 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
Ares-Wang1 小时前
Asp.net Core Hosted Service(托管服务) Timer (定时任务)
后端·asp.net
Rverdoser2 小时前
RabbitMQ的基本概念和入门
开发语言·后端·ruby
Tech Synapse3 小时前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
.生产的驴3 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
微信-since811923 小时前
[ruby on rails] 安装docker
后端·docker·ruby on rails
登云时刻4 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(一)
redis·kubernetes·bootstrap
吴半杯5 小时前
gateway漏洞(CVE-2022-22947)
docker·kubernetes·gateway