一、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 绑定,动态的将规则或配置写入到服务中。

kubectl explain Ingress
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

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 分类

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

然后 Ingress 中引用

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
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐