一、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进行沟通实时获取后端service,pod等资源状态。最终
ingress和Ingress 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 |
绑定到指定的 ingressClass。ingressClass.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:定义请求的域名 secretName:secret 资源名 |
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