Kubernetes YAML 详解之网络服务二( Ingress、IngressClasses)

一、Ingress YAML

对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP

可以提供负载均衡、SSL 终结(SSL Termination 是指把客户端发来的加密 HTTPS 流量,在 Ingress Controller(或负载均衡器)处解密为 HTTP 明文流量。)和基于名称的虚拟托管。
Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由
Ingress 可为 Service 提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及基于名称的虚拟托管。
Ingress controller 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置>边缘路由器或其他前端来帮助处理流量。

以上官方解释

说白了就是 ingress 在管理 HTTP、HTTPS 这些需要流量转发的规则。

Ingress controller 是在和 kubernetes API 进行沟通实时获取后端 servicepod 等资源状态。

最终 ingressIngress controller 绑定,动态的将规则或配置写入到服务中。

查看 Ingress 相关 yaml 字段说明, pod.metadata 相同
复制代码
kubectl explain Ingress
Ingress 的 ingress.meatdata 字段, pod.metadata 相同
复制代码
kubectl explain Ingress.meatdata
Ingress 的 Ingress.spec 字段
复制代码
kubectl explain Ingress.spec
字段 值类型 说明
defaultBackend Object 默认后端。没有设置 rules 的 Ingress 将所有流量发送到同一个默认后端
ingressClassName string 绑定到指定的 ingressClassingressClass.metadata.name 的值
rules []Object 定义规则: host:定义请求的域名 http: 指向后端的 http 选择器列表; 看 \color{red}{看} 看: k u b e c t l e x p l a i n I n g r e s s . s p e c . r u l e s . h t t p . p a t h \color{blue}{kubectl explain Ingress.spec.rules.http.path} kubectlexplainIngress.spec.rules.http.path
tls []Object 加密规则(HTTPS 是在 HTTP 协议基础上实施 TLS 加密) host:定义请求的域名 secretNamesecret 资源名
  • kubectl explain Ingress.spec.rules.http.path
字段 值类型 说明
backend Object 定义后端 看 \color{red}{看} 看: k u b e c t l e x p l a i n I n g r e s s . s p e c . r u l e s . h t t p . p a t h . b a c k e n d \color{blue}{kubectl explain Ingress.spec.rules.http.path.backend} kubectlexplainIngress.spec.rules.http.path.backend
path string 要被代理的路径
* pathType string path 的匹配方式 Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 Exact:精确匹配 URL 路径,且区分大小写
  • kubectl explain Ingress.spec.rules.http.paths.backend 定义后端
字段 值类型 说明
resource Object 指向同一命名空间中的另一个 Kubernetes 资源,将其作为 Ingress 对象
service Object 指定要使用的四层代理 * name: Service 的名字 port: 设置端口号。这里是 Service 的端口号 number:端口号 name: 名字

示例:

意思就是说:用户访问 http://xx.xxx.com/ → 转发给 xxxxxx:8080

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-nginx
  namespace: default
spec:
  ingressClassName: nginx       # 指定 ingressClass 的名字
  rules:
  - host: xx.xxx.com            # 将要被访问的域名
    http:
      paths:                    # 定义路径类型
      - backend:                # 定义后端
          service:              # 定义 service 服务
            name: xxxxxx        # Service 服务的名字
            prot:               # 设置端口号。这里是 Service 的端口号
              number: 8080      # 端口号
        path: /                 # 指定代理的路径
        pathTpye: Prefix        # path 匹配方式
  

创建成功后,会把 Service 这个后端的信息,写入到 ingress-controller 里面

二、IngressClasses YAML

IngressClass 用来区分不同类型的控制器(你可以同时部署 nginx、traefik、istio 各种控制器)

每个 Ingress 应当指定一个类,也就是一个对 IngressClass 资源的引用。
IngressClass 资源包含额外的配置,其中包括应当实现该类的控制器(Ingress Controller)名称。

  • IngressClass.spec
字段 值类型 说明
controller string Ingress Controller 的名字
parameters 指向控制器中包含额外配置的自定义资源的链接 Object apiGroup: 被引用资源的组 * kind: 被引用资源的类型 * name: 被引用资源的名称 namespace: 被引用资源的命名空间 scope: 否引用集群或者命名空间范围的资源

示例:

创建一个 nginx 的 IngressClass 分类

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
  namespace: ingress-nginx
spec:
  controller: k8s.io/ingress-nginx  # 定义 ingress controller 名字

然后 Ingress 中引用

yaml 复制代码
metadata:
  name: my-ingress
spec:
  ingressClassName: nginx

这样就明确告诉 Kubernetes:这个 Ingress 规则是交给 nginx 类型的控制器来处理的

三、创建 Ingress Nginx Controller

Ingress 控制器是 Kubernetes 中管理外部访问集群内部服务的核心组件,它通过解析 Ingress 资源定义的规则,将外部 HTTP/HTTPS 流量路由到集群内对应的 Service
官方文档

四、Ingress、IngressClass、Ingress Controller 之间关系

概念 作用 示例
Ingress 定义路由规则 /login → login-service
IngressClass 是规则的分类。标记规则属于哪种控制器 nginx / traefik
Ingress Controller 实际执行业务,接收请求转发给 Service ingress-nginx 控制器

请求的流程

复制代码
Client 请求
   ↓
Ingress Controller(监听规则)
   ↓
根据 IngressClass 找到匹配的 Ingress 资源
   ↓
根据 Ingress 中的规则,转发请求到 Service
   ↓
再到 Pod
相关推荐
blackorbird3 小时前
一个来自法国的基于K8s的规模化扫描集群
云原生·容器·kubernetes
掘根3 小时前
【微服务即时通讯】消息存储子服务2
微服务·云原生·架构
风向决定发型丶3 小时前
浅谈K8S的Label和Annotation
云原生·容器·kubernetes
lbb 小魔仙3 小时前
Docker容器化实战:从入门到精通,附完整实战案例
运维·docker·容器
溜达的大象3 小时前
极空间 NAS 玩童年游戏:Docker 部署马里奥
游戏·docker·容器
2401_840192273 小时前
监控的作用
分布式·kubernetes
培小新3 小时前
【Docker安全优化】
云原生·eureka
easy_coder3 小时前
从 ManifestRender 到 Certificate:一次 Kubernetes 应用发布故障的深度排障实录
云原生·云计算
adamlevine73 小时前
【docker笔记-001】如何设置docker使得容器能在多个numa之间均匀使用内存
笔记·docker·容器·k8s·numa·numactl·k3s