Ingress

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
posted @ 2021-06-18 18:01  扬羽流风  阅读(1792)  评论(0编辑  收藏  举报