Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kubernetes Ingresses (1)

Kubernetes Ingresses (1)

作者头像
dhyuan
发布于 2023-08-28 07:56:10
发布于 2023-08-28 07:56:10
24900
代码可运行
举报
文章被收录于专栏:响应式编程响应式编程
运行总次数:0
代码可运行

在连接上一个 k8s cluster 后执行下面的命令可以看到系统中的ingressclasses。这篇文字用来帮助自己理解下面几行简单的输出。

╰─$ kubectl get ingressclass NAME CONTROLLER PARAMETERS AGEawslb ingress.k8s.aws/alb IngressClassParams.elbv2.k8s.aws/alb 20dnginx nginx.org/ingress-controller <none> 30dos-nginx k8s.io/ingress-nginx <none> 30d

Mental Model

在Kubernets里经常会提到Pod,Service,Ingress,Ingress Controller, Ingress Class,那他们之间有什么逻辑关系呢?

Pod

Pod用于把几个相关的containers封装在一起对外提供业务服务,containers之间可以直接通过localhost通讯。而如果想访问POD服务只能凭借POD的IP,这个IP也是K8S集群内部可见,而POD的IP在每次重建后都会变化,这显然是不可接受的。

Service Service就是为了解决这个问题而生,通过service.yaml可以定义 1)这个service的name/namespace;2)由selector定义这个service对应的PODs;3)再通过定义service port和pod port的映射关系,就可以通过Service的名称访问PODs提供的服务了。Service借助自己对Pod自动发现的能力、服务名到POD IP的解析能力、简单的负载均衡能力,成为在Kubernets集群内部暴露Pod的不二之选。

Ingress / Ingress Controller / Ingerss Class Service解决了我们在k8s集群内部访问‘服务’的问题。如果想从集群外部访问‘服务’呢?这正是“Ingress机制”七层路由存在的意义。这里的Ingress机制由Ingress Controller、Ingress这两个概念组成。

作为码农,接触较多的一般是Ingress。这是因为Ingress Controller一旦部署到Kubernetes Cluster就很少会再去改动,而需要经常改动的应用路由规则都是在Ingress这个Kubernets API对象(或者说是在ingress.yaml文件)完成的。实际上,Ingress Controller实例才是真正执行将用户请求路由到Service进而到Pod的部件。Ingress只是我们定义请求到Service的路由规则的对象。

既然“ingress“的核心功能就是7层路由/反向代理,那么借助早已存在的Nginx、HAProxy等产品实现IngressController就是很自然的想法了。另一个ingress controller的实现类别可以划分到service mesh阵营,比如Istio Ingerss、Gloo等。

k8s官网列出的一些Ingerss Controller实现 https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

而这篇文章 https://blog.palark.com/comparing-ingress-controllers-for-kubernetes/ 详细讲解了各种Ingress Controller的特性以方便我们根据自己项目的需求做出选择。直接贴上文章的干货图片:

在一个Kubernets集群里可以定义多个不同Ingress Controller实现/类型,那么Ingress对象如何知道自己的数据是提供给哪个Ingress Controller的呢?

在Kubernetes 1.18之前,是通过在Ingress的一个annotation`kubernets.io/ingress.class` 来声明。

在Kubernetes 1.18正式引入了一个新的[k8s资源对象 IngressClass](https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class) 来帮助Ingress定义它绑定到哪个IngressController

下面是一个官网的IngressClass对象定义示例,`spec.controll`定义了IngressController的实现, `spec.parameters` 相当于定义了你可以在Ingerss对象里可以向这个IngressController对象能够传递的参数,当然这些参数也是这种IngressControll必须支持的。不同的Ingress Controller实现其需要的parameter肯定是不同的,而k8s 1.18之前通过annoation给IngerssController传递参数的方式就显得比较随意无章可循了,这应该也是IngressClass出现的一个原因。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: external-lb
    spec:
      controller: example.com/ingress-controller
      parameters:
        apiGroup: k8s.example.com
        kind: IngressParameters
        name: external-lb

有了IngressClass,那么在Ingress中只要设置 `spec.ingressClassName` 为某个IngerssClass的名字,那么就意味着这个Ingress的配置就会被这个IngerssClass所对应的IngressController所获取并被这个IngressControll生成为对应的路由rules,从而完成把一个集群外请求路由到Service的功能。

以上就是关于Kubernetes里Ingerss的几个基本概念。

有关Nginx的IngressController

基于Nginx实现的IngressController分为`Kubernets社区版`和`Nginx版`。

Kubernets社区版由Kubernetes社区和F5 Nginx工程师基于开源的Nginx实现,其官网 [code](https://github.com/kubernetes/ingress-nginx) [doc](https://kubernetes.github.io/ingress-nginx/)。

Nginx版自己又分为免费的基于开源Nginx的IngressController实现和商业版。Nginx开源版[code](https://github.com/nginxinc/kubernetes-ingress) [doc](https://docs.nginx.com/nginx-ingress-controller/)。

所以就开源的版本来说,一个是Kubernets社区版,一个是Nginx开源版,两个都是基于开源的Nginx实现的,只是owner不通。表现在IngressClass的定义中,就是字段 `spec.controller` 的值一个是Kubernets社区版的 `k8s.io/ingress-nginx`, 一个是nginx开源版的 `nginx.org/ingress-controller`

下面这个表格 https://gist.github.com/grigorkh/f8e4fd73e99f0fde06a51e2ed7c2156c 列出了Nginx Ingress Controller的 Kubernets社区版和Nginx开源版的区别。可以看到,两者差别不大,k8s社区版功能略好于Nginx开源版。而Nginx开源版因为没有使用Lua性能又好于k8s社区版。

Aspect or Feature

kubernetes/ingress-nginx

nginxinc/kubernetes-ingress with NGINX

nginxinc/kubernetes-ingress with NGINX Plus

Fundamental

Authors

Kubernetes community

NGINX Inc and community

NGINX Inc and community

NGINX version

Custom NGINX build that includes several third-party modules

NGINX official mainline build

NGINX Plus

Commercial support

N/A

N/A

Included

Implemented in

Go/Lua (while Nginx is written in C)

Go/Python

Go/Python

Load balancing configuration via the Ingress resource

Merging Ingress rules with the same host

Supported

Supported via Mergeable Ingresses

Supported via Mergeable Ingresses

HTTP load balancing extensions - Annotations

See the supported annotations

See the supported annotations

See the supported annotations

HTTP load balancing extensions -- ConfigMap

See the supported ConfigMap keys

See the supported ConfigMap keys

See the supported ConfigMap keys

TCP/UDP

Supported via a ConfigMap

Supported via custom resources

Supported via custom resources

Websocket

Supported

Supported via an annotation

Supported via an annotation

TCP SSL Passthrough

Supported via a ConfigMap

Supported via custom resources

Supported via custom resources

JWT validation

Not supported

Not supported

Supported

Session persistence

Supported via a third-party module

Not supported

Supported

Canary testing (by header, cookie, weight)

Supported via annotations

Supported via custom resources

Supported via custom resources

Configuration templates

See the template

See the templates

See the templates

Load balancing configuration via Custom Resources

HTTP load balancing

Not supported

See VirtualServer and VirtualServerRoute resources

See VirtualServer and VirtualServerRoute resources

TCP/UDP load balancing

Not supported

See TransportServer resource

See TransportServer resource

TCP SSL Passthrough load balancing

Not supported

See TransportServer resource

See TransportServer resource

Deployment

Command-line arguments

See the arguments

See the arguments

See the arguments

TLS certificate and key for the default server

Required as a command-line argument/ auto-generated

Required as a command-line argument

Required as a command-line argument

Helm chart

Supported

Supported

Supported

Operator

Not supported

Supported

Supported

Operational

Reporting the IP address(es) of the Ingress controller into Ingress resources

Supported

Supported

Supported

Extended Status

Supported via a third-party module

Not supported

Supported

Prometheus Integration

Supported

Supported

Supported

Dynamic reconfiguration of endpoints (no configuration reloading)

Supported with a third-party Lua module

Not supported

Supported

现在再回到文章开头的命令输出,是不是看到的东西更多了?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   ╰─$ kubectl get ingressclass        
    NAME       CONTROLLER                     PARAMETERS                             AGE
    awslb      ingress.k8s.aws/alb            IngressClassParams.elbv2.k8s.aws/alb   20d
    nginx      nginx.org/ingress-controller   <none>                                 30d
    os-nginx   k8s.io/ingress-nginx           <none>                                 30d

References:

[1]: [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/)

[2]: [IngressController](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)

[3]: [IngressClass](https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class)

[4]: [Comparing Ingress Controllers for Kubernetes](https://blog.palark.com/comparing-ingress-controllers-for-kubernetes/)

[5]: [基于Nginx的Ingress Controller在社区和商业版之间的比较](https://www.nginx.com/blogguide-to-choosing-ingress-controller-part-4-nginx-ingress-controller-options/)

[6]: [Kubernetes社区版](https://kubernetes.github.io/ingress-nginx/)

[7]: [Nginx开源版](https://kubernetes.github.io/ingress-nginx/)

[8]: [Nginx Ingress Controll社区版和Nginx开源版的比较](https://grigorkh.medium.com/there-are-two-nginx-ingress-controllers-for-k8s-what-44c7b548e678)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 响应式编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
kubernetes之ingress的基本使用
由于最近服务迁移,进行了各种调整,调整的过程中也顺便修改了 ingress 的相关配置,发现这块之前没有写过,于是今天就来看看 ingress 的基本使用。
LinkinStar
2022/09/01
7760
kubernetes之ingress的基本使用
k8s loadbalancer与ingress实践
k8s可以通过三种方式将集群内服务暴露到外网,分别是NodePort、LoadBalancer、Ingress,其中NodePort作为基础通信形式我们在《k8s网络模型与集群通信》中进行了介绍,这里我们主要关注LoadBalancer和Ingress
你大哥
2022/01/10
1.8K0
k8s loadbalancer与ingress实践
ingress的用法与原理[通俗易懂]
我们知道真正提供服务的是后端的pod,但是为了负载均衡,为了使用域名,为了….,service诞生了,再后来ingress诞生了,那么为什么需要有Ingress呢?先看看官网怎么说的:
全栈程序员站长
2022/09/06
2.1K0
ASP.NET Core on K8S深入学习(12)Ingress
本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。
Edison Zhou
2020/05/11
1K0
ASP.NET Core on K8S深入学习(12)Ingress
Kubernetes 部署 Nebula 图数据库集群
Kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
NebulaGraph
2020/02/26
1.1K0
Kubernetes 部署 Nebula 图数据库集群
kubernetes(十) kubernetes service,ingress&cm,secret
yum -y install ipvsadm modprobe br_netfilter cat &gt; /etc/sysconfig/modules/ipvs.modules &lt;&lt;EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
alexhuiwang
2020/09/23
6150
kubernetes(十) kubernetes service,ingress&cm,secret
Ingress-Nginx进阶学习扩展实践
描述: 此节,作为上一章的扩展补充,主要因为ingress-nginx迭代较快,加入了很多新得特性导致原来某些配置被弃用,当前时间节点【2022年3月8日 17:24:28】针对现有Ingress-nginx版本(v1.1.1)进行快速安装配置,与上一章中的安装是存在一定的不同,安装时都可以作为参考。
全栈工程师修炼指南
2022/09/29
3.1K0
Ingress-Nginx进阶学习扩展实践
【云原生 | Kubernetes篇】深入了解Ingress(十二)
这是nginx官方做的,适配k8s的,分为开源版和nginx plus版(收费)。
Lansonli
2022/06/15
6270
【云原生 | Kubernetes篇】深入了解Ingress(十二)
08 . Kubernetes之 ingress及Ingress Controller
Ingress规则是很灵活的,可以根据不同域名,不同path转发请求到不同的service,并且支持https/http.
iginkgo18
2020/09/27
3.1K0
08 . Kubernetes之 ingress及Ingress Controller
在k8s(kubernetes) 上安装 ingress V1.1.0
Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。流量路由由 Ingress 资源上定义的规则控制。
小陈运维
2021/12/16
1.5K0
外包技能--Ingresn进阶之ingress-nginx
controller类似装的k8s组件,时常的要去api去交互,时常去获取api的相关的信息,刷新自己的规则,类似与其他控制器 ingress,k8s设计了一个比较全局性的负载均衡器,准确的来说Ingress它是k8s中的一个规则,实现这个规则就是使用的这个控制器,一般称为ingress控制器
Godev
2023/08/02
6790
Kubernetes核心实战
此时的应用还不能外部访问: 指非集群结点,不能访问该应用,同一个 pod 共享网络与存储空间、因此 pod 内部访问其他的容器,ip 地址是 127.0.0.1
OY
2023/02/23
6560
Kubernetes核心实战
kubernetes系列教程(十六)基于nginx ingress实现服务暴露
本章介绍kubernetes系列教程的ingress概念,在kubernetes中对外暴露服务的方式有两种:service(NodePort或者外部LoadBalancer)和ingress,其中service是提供四层的负载均衡,通过iptables DNAT或lvs nat模式实现后端Pod的代理请求。如需实现http,域名,URI,证书等请求方式,service是无法实现的,需要借助于ingress来来实现,本文将来介绍ingress相关的内容。
HappyLau谈云计算
2020/01/01
41.3K0
kubernetes系列教程(十六)基于nginx ingress实现服务暴露
Ingress企业实战:部署多个Ingress控制器
在大规模集群场景中,部分服务需要通过公网Ingress对外提供服务访问,但是有部分服务只对内提供服务,不允许使用公网访问,仅支持内部服务间调用,此时可以通过部署两套独立的Ingress来实现,一套支持公网访问,一套仅支持内网访问。接下来,我们通过最佳实践进行实现喽!
用户1107783
2023/09/11
1.4K0
Ingress企业实战:部署多个Ingress控制器
从无到有基于腾讯云TKE部署Kubernetes全流程-Ingress(五)
由于大规模使用Kuberntes后,容器中的Service变得较多,怎样让这么多Service被集群外部的服务所访问也是一个急需解决的问题,NodePort这样一种方案显然不太适合。
蒋经纬
2020/06/29
1.1K0
七层调度:ingress 资源及 Ingress Controller 控制器
使用 Service NodePort 可以实现 IP:端口 对外访问,通过任意 Node 节点可访问对应的资源,这意味着每个端口只能使用一次,一个端口对应一个应用。
懒人的小脑
2020/11/30
1.9K0
七层调度:ingress 资源及 Ingress Controller 控制器
更新NGINX-Ingress以使用稳定的Ingress API
对于所有 Kubernetes API,都有一个创建、维护和最终弃用它们的过程。networking.k8s.io API 组没有不同。即将发布的 Kubernetes 1.22 版本将删除几个与网络相关的弃用 API:
CNCF
2021/07/30
1.4K0
Kubernetes 中数据包的生命周期 -- 第 4 部分
本文是 Kubernetes 中数据包的生命周期系列文章的第 4 部分,我们将会介绍 Kubernetes 中的 Ingress 资源对象和 Ingress Controller。Ingress Controller 是一个控制器,它监视 Kubernetes API Server 对 Ingress 资源的变更并相应地更新负载均衡器的配置。
Se7en258
2022/06/24
8720
Kubernetes 中数据包的生命周期 -- 第 4 部分
【云原生 | Kubernetes篇】Ingress案例实战(十三)
ingress规则会生效到所有按照了IngressController的机器的nginx配置。
Lansonli
2022/06/16
1.1K0
【云原生 | Kubernetes篇】Ingress案例实战(十三)
二进制安装Kubernetes(k8s) v1.23.6 ---(下)
1.23.3 和 1.23.4 和 1.23.5 和 1.23.6 文档以及安装包已生成。
小陈运维
2022/04/21
1.7K0
推荐阅读
相关推荐
kubernetes之ingress的基本使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验