本文正在参与「金石计划」

前语

在 Kubernetes 中,Ingress 是一个十分重要的概念。它能够将外部流量路由到 Kubernetes 集群内的不同服务。

Ingress 能够让你愈加方便地管理 HTTP 和 HTTPS 流量,而且能够配置负载均衡、SSL 证书等功用。本文将会介绍 Ingress 的界说、类型、更新、以及相关的操控器和类别。

什么是 Ingress

k8s Ingress 实现流量路由规则控制

通常情况下,service 和 pod 的 IP 仅可在集群内部拜访。集群外部的恳求需求经过负载均衡转发到 service 在 Node 上露出的 NodePort 上,然后再由 kube-proxy 经过边际路由器 (edge router) 将其转发给相关的 Pod 或许丢弃。

Ingress 是 Kubernetes 的一个 API 目标,它界说了如何将外部流量路由到 Kubernetes 集群内的不同服务。它能够经过 HTTP 和 HTTPS 协议进行流量路由,而且支撑域名和途径的匹配。

Ingress 是一个十分强大的功用,能够让你愈加方便地管理流量,而且能够轻松实现负载均衡、SSL 证书等功用。

Ingress 的界说格局

Ingress 的界说格局如下:

apiVersion:networking.k8s.io/v1beta1
kind:Ingress
metadata:
name:ingress-name
annotations:
key:value
spec:
rules:
-host:example.com
http:
paths:
-path:/path
backend:
serviceName:service-name
servicePort:service-port

其间,apiVersion字段表明 Ingress 目标的 API 版别,kind字段表明目标的类型,metadata字段包含了 Ingress 目标的元数据,例如目标称号和标签等,spec字段则包含了 Ingress 目标的配置信息,例如规矩和后端服务等。

Ingress 的类型有哪几种?

Kubernetes 支撑多种不同类型的 Ingress,每种类型都有自己的特点和用处。下面是一些常见的 Ingress 类型:

1. Simple fanout

简略的 Fanout Ingress 会将流量路由到指定的多个服务上。它能够经过域名和途径进行匹配,而且支撑负载均衡功用。

apiVersion:networking.k8s.io/v1beta1
kind:Ingress
metadata:
name:simple-fanout-ingress
spec:
rules:
-host:example.com
http:
paths:
-path:/service1
backend:
serviceName:service1
servicePort:80
-path:/service2
backend:
serviceName:service2
servicePort:80

2. Name-based virtual hosting

k8s Ingress 实现流量路由规则控制

根据称号的虚拟主机 Ingress 会将流量路由到指定的服务上,详细的服务由恳求的 Host 头部决议。它能够经过域名进行匹配,而且支撑负载均衡和 SSL 证书等功用。

foo.example.com--||->foo.example.coms1:80
|168.92.133.131|
bar.example.com--||->bar.example.coms2:80

下面是一个根据 Host header 路由恳求的 Ingress:

apiVersion:networking.k8s.io/v1beta1
kind:Ingress
metadata:
name:name-based-virtual-hosting-ingress
spec:
rules:
-host:foo.example.com
http:
paths:
-backend:
serviceName:service1
servicePort:80
-host:bar.example.com
http:
paths:
-backend:
serviceName:service2
servicePort:80

3. Path-based routing

根据途径的路由 Ingress 会将流量路由到指定的服务上,详细的服务由恳求的 URL 途径决议。它能够经过途径进行匹配,而且支撑负载均衡和 SSL 证书等功用。

apiVersion:networking.k8s.io/v1beta1
kind:Ingress
metadata:
name:path-based-routing-ingress
spec:
rules:
-host:example.com
http:
paths:
-path:/service1
backend:
serviceName:service1
servicePort:80
-path:/service2
backend:
serviceName:service2
servicePort:80

该如何实现更新 Ingress

更新 Ingress 十分简略,只需求修正 Ingress 目标的界说文件,然后履行kubectl apply指令即可。例如,假定我们想要将simple-fanout-ingress的途径/service1修正为/service3,则能够修改 Ingress 目标的界说文件,然后履行以下指令:

$kubectlapply-fingress.yaml

其间,ingress.yaml是 Ingress 目标的界说文件。

更新后:

$kubectlgeting
NAMERULEBACKENDADDRESS
test-168.92.133.131
foo.example.com
/foos1:80
bar.example.com
/bars2:80

Ingress Controller

Ingress Controller 是一个运行在 Kubernetes 集群内的服务,它能够监听 Kubernetes API 服务器上的 Ingress 目标,并将外部流量路由到 Kubernetes 集群内的不同服务。

每种类型的 Ingress 都需求特定的 Ingress Controller 来处理。例如,简略的 Fanout Ingress 需求运用 Nginx Ingress Controller,而根据称号的虚拟主机 Ingress 则需求运用 Traefik Ingress Controller。

Ingress Class

Ingress Class 是一个可选的字段,它能够让你愈加精细地操控 Ingress 目标的路由方法。

每个 Ingress 目标都能够指定一个 Ingress Class,这个 Ingress Class 能够对应不同的 Ingress Controller,而且能够让你愈加方便地操控路由方法。

总结

Ingress 是 Kubernetes 中十分重要的一个资源目标,它能够将外部流量路由到 Kubernetes 集群内的不同服务,而且支撑多种不同类型的路由方法。

换言之,Ingress 便是为进入集群的恳求提供路由规矩的调集,能够给 service 提供集群外部拜访的 URL、负载均衡、SSL 停止、HTTP 路由等功用。

本文正在参与「金石计划」