Ingresss是k8s集群中的一个API资源对象,扮演边缘路由器(edge router)的角色,也可以理解为集群防火墙、集群网关,可以自定义路由规则来转发、管理、暴露一组Pod。
kubernetes处理这种场景时,涉及到三个组件:
1、反向代理web服务器
负责拦截外部请求,一般是以Deployment或DeamonSet的方式部署到kubernetes集群中的Nginx、Apache等
通常以NodePort或HostNetwork方式对k8s之外暴露
由于所在主机IP不确定,因此一般需要添加约束让其运行在固定的一批主机上,并在上层添加负载均衡
2、Ingress controller
实时感知Ingress路由规则集合的变化,再与apiserver交互,获取Service、Pod在集群中的IP等信息,然后发送给反向代理web服务器,刷新其路由配置信息
常用ingress controller包括:
①Kubernetes社区发布的ingress-nginx和Nginx公司发布的kubernetes-ingress
使用nginx作为代理,但貌似nginx和Ingress controller在一个Pod里
使用traffic proxy进行代理
还提供了友好的控制面板和监控界面,不仅可以方便地查看Traefik根据Ingress生成的路由配置信息,还可以查看统计的一些性能指标数据,如:总响应时间、平均响应时间、不同的响应码返回的总次数等。
Traefik还支持丰富的annotations配置,可配置众多出色的特性,例如:自动熔断、负载均衡策略、黑名单、白名单
3、Ingress
定义路由规则集合。
示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-virtual-host-ingress-no-third-host
spec:
IngressClassName: xx
rules:
- host: first.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service1
port:
number: 80
- host: second.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service2
port:
number: 80
- http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service3
port:
number: 80
(1)IngressClassName用于指定一个IngressClass:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb
spec:
controller: example.com/ingress-controller
parameters:
apiGroup: k8s.example.com
kind: IngressParameters
name: external-lb
namespace: external-configuration
scope: Namespace/Cluster
将IngressClass的annotation添加ingressclass.kubernetes.io/is-default-class:true,可以将其设置为集群默认IngressClass,没有指定IngressClass的Ingress都会使用它
(2)每条rule=host(可选)+IngressRuleValue
host必须为域名,即必须通过{域名}:{反向代理服务器对外暴露的端口}访问反向代理服务器
如果没有DNS,则需要在访问方的hosts文件中添加反向代理服务器所在主机IP-域名的映射关系,
host一旦配置为某个域名(或使用如*.foo.com这样的通配符匹配一批域名),则这条rule仅适用于访问该域名的请求
IngressRuleValue目前只有HTTPIngressRuleValue一种,由若干HTTPIngressPath组成,每个HTTPIngressPath包括:
-
path
-
pathType
path的匹配规则,有以下三种:
ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。
Exact:精确匹配 URL 路径,且区分大小写。
Prefix:基于以 / 分隔的 URL 路径前缀匹配,此时path可以形如“/, /aaa, /aaa/bbb”
-
backend
除了可以是svc,还可以是:
backend:
resource:
apiGroup: k8s.example.com
kind: StorageBucket
name: icon-assets
综上,该Ingress意味着:所有访问first.bar.com的流量转向Service1,所有访问second.bar.com的流量转向Service2,请求头里没有域名的流量转向Service3
进行https卸载
首先创建Secret:
apiVersion: v1
kind: Secret
metadata:
name: testsecret-tls
namespace: default
data:
tls.crt: base64 编码的 cert
tls.key: base64 编码的 key
type: kubernetes.io/tls
在Ingress中配置tls:
spec:
tls:
- hosts:
- https-example.foo.com
secretName: testsecret-tls
这样,ingress与service之间的连接就从https变为了http