更新时间:2023-12-26 gmt 08:00

ingress-凯发k8国际娱乐官网入口

为什么需要ingress

service是基于四层tcp和udp协议转发的,而ingress可以基于七层的http和https协议转发,可以通过域名和路径做到更细粒度的划分,如下图所示。

图1 ingress-service

ingress工作机制

要想使用ingress功能,必须在kubernetes集群上安装ingress controller。ingress controller有很多种实现,最常见的就是kubernetes官方维护的;不同厂商通常有自己的实现,例如cce使用弹性负载均衡服务elb实现ingress的七层负载均衡。

外部请求首先到达ingress controller,ingress controller根据ingress的路由规则,查找到对应的service,进而通过endpoint查询到pod的ip地址,然后将请求转发给pod。

图2 ingress工作机制

创建ingress

下面例子中,使用http协议,关联的后端service为“nginx:8080”,使用elb作为ingress控制器(metadata.annotations字段都是指定使用哪个elb实例),当访问“http://192.168.10.155:8080/”时,流量转发“nginx:8080”对应的service,从而将流量转发到对应pod。

示例如下(适用于v1.23及以上版本的集群):
apiversion: networking.k8s.io/v1
kind: ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/elb.class: union
    kubernetes.io/elb.port: '8080'
    kubernetes.io/elb.id: aa7cf5ec-7218-4c43-98d4-c36c0744667a
spec:
  rules:
    - host: ''
      http:
        paths:
          - path: /
            backend:
              service:
                name: nginx
                port:
                  number: 8080
            property:
              ingress.beta.kubernetes.io/url-match-mode: starts_with
            pathtype: implementationspecific
  ingressclassname: cce

ingress中还可以设置外部域名,这样您就可以通过域名来访问到elb,进而访问到后端服务。

域名访问依赖于域名解析,需要您将域名解析指向elb实例的ip地址,例如您可以使用来实现域名解析。

...
spec:
  rules:
    - host: www.example.com       # 域名
      http:
        paths:
          - path: /
            backend:
              service:
                name: nginx
                port:
                  number: 8080
...

路由到多个服务

ingress可以同时路由到多个服务,配置如下所示。

  • 当访问“http://foo.bar.com/foo”时,访问的是“s1:80”后端。
  • 当访问“http://foo.bar.com/bar”时,访问的是“s2:80”后端。

ingress转发策略中的path路径要求后端应用内存在相同的路径,否则转发无法生效。

例如,nginx应用默认的web访问路径为“/usr/share/nginx/html”,在为ingress转发策略添加“/test”路径时,需要应用的web访问路径下也包含相同路径,即“/usr/share/nginx/html/test”,否则将返回404。

...
spec:
  rules:
    - host: foo.bar.com          # host地址
      http:
        paths:
          - path: "/foo"
            backend:
              service:
                name: s1
                port:
                  number: 80
          - path: "/bar"
            backend:
              service:
                name: s2
                port:
                  number: 80
...
分享:
网站地图