2-Ingress

ingressclass用于在集群内有多个ingress controller时候,区分ingress由谁处理

ingress概述

通常情况下, Service和Pod仅可在集群内部网络中通过IP地址访问,Ingress是建立在Service之上的7层访问入口,它支持通过URL的方式将Service暴露到k8s集群外

Ingress应用场景

作为集群的单一入口点,实现负载均衡和路由
假设有一个 Kubernetes 集群运行着多个微服务,包括前端 Web 应用、API 服务和后端数据库。通过创建一个 Ingress 资源,可以统一管理这些服务的外部访问,将所有流量路由到适当的后端服务。

对于基于HTTP的服务来说,不同的URL地址经常对应到不同的后端服务或者虚拟服务器(Virtual Host),这些应用层的转发机制仅通过Kubernetes的Service机制是无法实现的。从Kubernetes 1.1版本开始新增Ingress资源对象,用于将不同URL的请求转发到后端不同的Service,以实现HTTP层的业务路由机制。

在实际生产中,一个网站的服务往往是由不同的Service提供服务的。而每个Service通常又采用LoadBalance的方式提供服务,这就需要为每个Service提供自己的负载均衡器,以及独有的公网IP。使用Ingress只需要一个公网IP就能为许多服务提供访问,当客户端向Ingress发送请求时,Ingress会根据请求的主机名和路径决定请求转发到的Service

实现ingress

使用Ingress实现一个完整的七层负载均衡器,需要两步:
    (1)安装Ingress Controller。
    (2)定义一个Ingress资源对象,用来关联需要暴露出去的Pod的Service。

  • 必须有一个Ingress Controller才能满足Ingress的要求。仅创建Ingress资源本身没有任何效果。
  • ingress controller:使用ingress resources提供的规则将客户端请求转发。默认是nginx
  • ingress resources:Ingress资源对象,用来关联需要暴露出去的Pod的Service

Ingress规则

kubectl explain ingress.spec.rules(每个rules都包含以下信息)

    * host:
        * 未指定host:适用于通过指定IP地址的所有HTTP的请求。
        * 指定host:
            * 如果Host是精确的,则http的Host头等于Host,则匹配该规则。
            * 如果Host是一个通配符,那么如果http主机报头等于通配符规则的后缀(删除第一个标签),则请求匹配该规则。
    * http:
        * paths:
            * backend:定义将请求转发到哪个Service。
            * path:与请求的路径相匹配。路径必须以“/”开头。当未指定时,将匹配来自传入请求的所有路径。
            * pathType:决定对Path匹配的解释。可选值有Exact和Prefix。
                * Exact:精确匹配URL路径。
                * Prefix:匹配基于URL路径前缀分割'/'。如果Prefix的值是请求路径的前缀子串,就匹配。
    * 与host和path匹配的对Ingress的HTTP(和HTTPS)请求将会被发送到backend。

Ingress默认后端

kubectl explain ingress.spec.defaultBackend

    * resource:是Ingress对象名称空间中另一个Kubernetes资源对象。与“Service”互斥。
        * apiGroup:是被引用资源的组。如果不指定APIGroup,则指定的Kind必须在核心API组中。对于任何其他第三方类型,都需要指定APIGroup。
        * kind:是被引用的资源的类型。
        * name:是被引用的资源的名称。
    * service:引用一个Service作为后端。与“Resource”互斥。
        * name:被引用的Service。该Service必须与Ingress对象在同一个名称空间中。
        * port:被引用Service的端口。IngressServiceBackend需要一个端口名称或端口号。
* 一个没有设置rules的Ingress会将所有的请求发送到defaultbackend定义的默认后端。
    * defaultBackend通常是Ingress控制器的一个配置选项,不会在Ingress资源中指定。
    * 如果没有指定.spec.rules,则必须指定.spec.defaultbackend。如果defaultBackend没有设置,不匹配任何规则的请求的处理将由入口控制器。
* 如果所有主机或路径都不匹配Ingress对象中的HTTP请求,流量将被路由到默认后端。

安装ingress controller

  • 在定义Ingress策略之前,需要先部署Ingress Controller,以实现为所有后端Service都提供一个统一的入口。
       1. Ingress Controller需要实现基于不同HTTP URL向后转发请求,并可以灵活设置7层负载分发策略。
       2. 如果公有云服务商能够提供该类型的HTTP路由LoadBalancer,则也可设置其为Ingress Controller。

  • 在Kubernetes中,Ingress Controller将以Pod的形式运行,监控API Server的/ingress接口后端的backend services,如果Service发生变化,则Ingress Controller应自动更新其转发规则。

  • ingress controller就是一个或一组拥有七层代理能力或调度能力的应用程序的pod。

要安装的Ingress Controller是ingress-nginx-controller。

1、下载ingress-nginx-controller
官网:https://github.com/kubernetes/ingress-nginx
下载并解压 ingress-nginx-controller-v1.0.4.zip ,获取yaml文件
ingress-nginx-controller-v1.0.4\deploy\static\provider\baremetal\deploy.yaml
修改相应配置,省略

2、安装ingress-nginx-controller
kubectl apply -f ingress-nginx-controller-v1.0.4.yaml
kubectl get pods -o wide -A
kubectl get svc -o wide -A

3、访问ingress-nginx-controller
# 四个请求的返回值是一样的,都是404,因为还没有后端服务。
# 通过serviceIP访问
curl http://10.20.234.166:80
curl -k https://10.20.234.166:443
# 通过nodeIP访问
curl http://10.1.1.11:32080
curl -k https://10.1.1.11:32443

Ingress 工作原理

ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,然后读取它,按照ingress中自定义的规则,规则写明了哪个域名对应哪个service,生成一段nginx配置,再写到nginx-ingress-controller的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,然后reload一下使配置生效。以此达到域名分配置和动态更新的问题。

创建Ingress

创建一个单一规则的Ingress

vim my-ingress.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: ingress.example.com     # 将该域名映射到目标service
    http:
      paths:
      - path: /
        backend:                       # 将所有请求发送到该service上
          serviceName: my-service      # 与上边映射的svc名称一致
          servicePort: 80

通过http://ingress.example.com访问服务,需要确保域名解析为Ingress控制器的IP
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    # 启用日志记录
    nginx.ingress.kubernetes.io/enable-access-log: "true"
    nginx.ingress.kubernetes.io/access-log-path: /var/log/nginx/access.log
    # 配置CORS允许的来源
    nginx.ingress.kubernetes.io/cors-allow-origin: "http://example.com"
    # 配置自定义错误页面
    nginx.ingress.kubernetes.io/custom-http-errors: "404,503"
    nginx.ingress.kubernetes.io/custom-http-errors-404: /errors/404.html
    nginx.ingress.kubernetes.io/custom-http-errors-503: /errors/503.html
spec:
  # 定义Ingress规则
  rules:
    # 单一入口点
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80
    # 路径和域名路由
  - host: example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80
    # 负载均衡
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: backend-service
            port:
              number: 80
  # 配置TLS/SSL终结
  tls:
  - hosts:
    - example.com
    secretName: tls-secret
  # 配置自定义错误页面
  - http:
      paths:
      - path: /oldpath
        pathType: Prefix
        backend:
          service:
            name: redirect-service
            port:
              number: 80
  # 基于主机名的虚拟主机
  - host: subdomain.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: subdomain-service
            port:
              number: 80
  # 认证和授权
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: auth-service
            port:
              number: 80
posted @   立勋  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示