【K8S系列】第十三讲:Ingress详解

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 【K8S系列】第十三讲:Ingress详解

1.Ingress基本介绍

1.1 暴露服务问题

k8s 集群对外暴露服务的方式有三种:

  • NotePort
  • LoadBalance
  • Ingress
  1. NodePort方式:最大的缺点是会占用很多集群机器的端口,而且需要在外部搭建额外的负载均衡;
  2. LB方式:最大的缺点则是每个service一个LB,有点浪费,并且需要k8s之外的支持,【eg:cloud provider】;
  3. ingress: Ingress就是为了解决1,2两种方式的限制,只需要一个NodePort或者一个LB就可以满足所有service对外服务的需求。

1.2 什么是Ingress

官网地址:GitHub - kubernetes/ingress-nginx: Ingress-NGINX Controller for Kubernetes

Ingress 是 k8s 官方提供的用于对外暴露服务的方式,也是在生产环境用的比较多的方式,一般情况是 LB + Ingress Ctroller 方式对外提供服务,这样就可以在一个 LB 的情况下根据域名路由到对应后端的 Service

类似于 Nginx 反向代理,只不过在 k8s 集群中,这个反向代理是集群外部流量的统一入口

Ingress 公开了从集群外部到集群内 services 的访问路由

流量路由,由 Ingress 资源上定义的规则控制。

特点

  1. Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP和HTTPS。
  2. Ingress 提供负载均衡、SSL 和基于名称的虚拟托管
  3. 必须具有 ingress 控制器【例如 ingress-nginx】才能满足 Ingress 的要求。仅创建 Ingress 资源无效。

可以理解为:

Ingress 是一个规则的集合,它允许集群外的流量通过一定的规则到达集群内的 Service


1.2 Ingress的核心组件

Ingress由三个组件组成:

  • ingress
  • ingress-controller
  • 反向代理负载均衡器


1.2.1 ingress

可以理解为:是一个类型为Ingress的k8s api对象

一般用yaml配置,作用是定义请求如何转发到service的规则,可以理解为配置模板。

  • 是规则集合
  • 定义了域名与Kubernetes的service的对应关系
  • 规则与 Ingress Controller 结合, Ingress Controller 将其动态写入到负载均衡器配置中,从而实现整体的服务发现和负载均衡

1.2.2 ingress-controller

kubernetes API 进行交互,实时的感知后端 service、pod 等变化

Ingress Controller 再结合下文的 Ingress 生成配置,然后更新反向代理负载均衡器,并刷新其配置,实现动态服务发现与更新

其核心是一个deployment,实现方式有很多如:

  • nginx
  • Contour
  • Haproxy
  • trafik
  • Istio

需要编写的yaml有:Deployment, Service, ConfigMap, ServiceAccount(Auth)

其中service的类型可以是NodePort或者LoadBalancer。

实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发

总结一下:

Ingress-controller才是负责转发的组件,通过各种方式将他暴露在集群入口,外部对集群的请求流量会先到Ingress-controller,

Ingress对象是用来告诉Ingress-controller该如何转发请求,比如那些域名那些path要转发到那些服务


1.2.3 反向代理负载均衡器

即常见的负载均衡软件,如 nginx、Haproxy 等

2.安装

2.1 下载/修改配置文件

下载整合配置文件,获取配置文件地址:

ingress-nginx/deploy/static at nginx-0.30.0 · kubernetes/ingress-nginx · GitHub

主要是这两个文件:

mandatory.yaml

service-nodeport.yaml

service-nodeport.yaml为ingress通过nodeport对外提供服务,注意默认nodeport暴露端口为随机,可以编辑该文件自定义端口。

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

具体位置截图

2.2 安装资源

应用yml文件创建ingress资源:,执行下面两个命令:

kubectl apply -f  mandatory.yaml
kubectl apply -f service-nodeport.yaml 


2.3 结果

执行以下命令,查看结果:

kubectl get all -n ingress-nginx -o wide

可以看到,结果如下:


总结一下

Ingress Contronler 通过与 Kubernetes API 交互动态感知集群中 Ingress 规则变化,然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段 Nginx 配置,再写到 Nginx-ingress-control的 Pod 里,

这个 Ingress Contronler 的pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,然后 reload 一下 使用配置生效。进而达到域名分配置及动态更新的问题。


2.4 项目示例

2.4.1 创建service及deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: test-nginx
  name: test-nginx
spec:
  replicas: 3 #3个副本
  minReadySeconds: 5          #等待5秒后升级
  selector:
    matchLabels:
      app: test-nginx
  template:
    metadata:
      labels:
        app: test-nginx
    spec:
      containers:
      - image: nginx
        name: test-nginx
---
apiVersion: v1
kind: Service
metadata:
  name: test-nginx
  labels:
    app: test-nginx
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: test-nginx

2.4.2创建Ingress规则

# ingress规则中,要指定需要绑定暴露的svc名称
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-test-nginx
  annotations: 
    kubernetes.io/ingress.class: "nginx"    # 指定 Ingress Controller 的类型
    nginx.ingress.kubernetes.io/use-regex: "true"    # 指定我们的 rules 的 path 可以使用正则表达式
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"    # 连接超时时间,默认为 5s
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"      # 后端服务器回转数据超时时间,默认为 60s
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"      # 后端服务器响应超时时间,默认为 60s
    nginx.ingress.kubernetes.io/proxy-body-size: "10m"         # 客户端上传文件,最大大小,默认为 20m
spec:
  rules:         #定义路由规则
  - host: www.testnginx.com      # 主机名,只能是域名,修改为项目域名
    http:
      paths:
      - path: /
        backend:
          serviceName: test-nginx          # 后台部署的 Service Name
          servicePort: 80                  # 后台部署的 Service Port

2.4.3 完整文件

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: test-nginx
  name: test-nginx
  namespace: test 
spec:
  replicas: 3 #3个副本
  minReadySeconds: 5          #等待5秒后升级
  selector:
    matchLabels:
      app: test-nginx
  template:
    metadata:
      labels:
        app: test-nginx
    spec:
      containers:
      - image: nginx
        name: test-nginx
---
apiVersion: v1
kind: Service
metadata:
  name: test-nginx
  namespace: test 
  labels:
    app: test-nginx
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: test-nginx
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-test-nginx
  namespace: test 
  annotations: 
    kubernetes.io/ingress.class: "nginx"    # 指定 Ingress Controller 的类型
    nginx.ingress.kubernetes.io/use-regex: "true"    # 指定我们的 rules 的 path 可以使用正则表达式
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"    # 连接超时时间,默认为 5s
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"      # 后端服务器回转数据超时时间,默认为 60s
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"      # 后端服务器响应超时时间,默认为 60s
    nginx.ingress.kubernetes.io/proxy-body-size: "10m"         # 客户端上传文件,最大大小,默认为 20m
spec:
  rules:         #定义路由规则
  - host: www.testnginx.com      # 主机名,只能是域名,修改为项目域名
    http:
      paths:
      - path: /
        backend:
          serviceName: test-nginx          # 后台部署的 Service Name
          servicePort: 80                  # 后台部署的 Service Port

应用yaml文件:

kubectl apply -f test-nginx-ingress.yaml

执行命令,查看结果,会看到已经生成了对应的ingress-test-nginx 已经生成:

kubectl get ingress -n test

3.投票

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
804 116
|
Kubernetes 负载均衡 应用服务中间件
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
2175 1
|
10月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
324 2
|
缓存 Kubernetes 负载均衡
在K8S中,ingress 有何作用?
在K8S中,ingress 有何作用?
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
1862 0
|
Kubernetes 应用服务中间件 API
【Ingress 秘籍】集群进出流量的总管:揭秘 Kubernetes 中 Ingress 的终极奥秘!
【8月更文挑战第25天】Ingress是Kubernetes中用于管理HTTP与HTTPS流量进入集群的核心功能。作为集群内外通信的桥梁,Ingress通过定义规则将外部请求导向内部服务。本文详细介绍了Ingress的基本概念、配置方法及其实现方式。通过使用不同的Ingress控制器(如Nginx、Traefik等),用户可以根据需要选择最适合的方案。文中还提供了示例代码展示如何创建服务、部署应用及配置Ingress规则。
396 6
|
Kubernetes 负载均衡 应用服务中间件
在k8S中,ingress是什么?
在k8S中,ingress是什么?
|
API UED 开发者
超实用技巧大放送:彻底革新你的WinForms应用,从流畅动画到丝滑交互设计,全面解析如何在保证性能的同时大幅提升用户体验,让软件操作变得赏心悦目不再是梦!
【8月更文挑战第31天】在Windows平台上,使用WinForms框架开发应用程序时,如何在保持性能的同时提升用户界面的吸引力和响应性是一个常见挑战。本文探讨了在不牺牲性能的前提下实现流畅动画与交互设计的最佳实践,包括使用BackgroundWorker处理耗时任务、利用Timer控件创建简单动画,以及使用Graphics类绘制自定义图形。通过具体示例代码展示了这些技术的应用,帮助开发者显著改善用户体验,使应用程序更加吸引人和易于使用。
210 0
|
Kubernetes API 网络安全
在K8S中,ingress该如何使用?
在K8S中,ingress该如何使用?
|
Kubernetes 负载均衡 应用服务中间件
Kubernetes的Ingress
Kubernetes的Ingress
292 0
Kubernetes的Ingress

热门文章

最新文章

推荐镜像

更多