更新时间:2024-03-18 GMT+08:00
分享

Ingress

上一节中讲了创建LoadBalancer类型的Service,使用ELB实例从外部访问Pod。

但是Service是基于四层TCP和UDP协议转发的,Ingress可以基于七层的HTTP和HTTPS协议转发,可以通过域名和路径做到更细粒度的划分,如下图所示。

图1 Ingress-Service

在云容器实例中,使用Ingress绑定ELB的IP和端口,实现外部访问,如图2所示。

图2 Ingress

ELB实例

Ingress支持绑定增强型ELB实例,您可以调用创建负载均衡器(增强型)创建ELB实例,更方便的方法是通过ELB控制台创建增强型ELB实例。

ELB实例根据IP地址不同可以分为私网ELB实例和公网ELB实例,区别在于公网ELB实例绑定了一个公网IP,您可以根据需要选择。

创建Ingress

  • 使用http协议创建Ingress
    下面例子中,关联的backend为“nginx:8080”,当访问“http://10.10.10.10:6071/”时,流量转发“nginx:8080”对应的Service,从而将流量转发到对应负载中的Pod。
    apiVersion: extensions/v1beta1                                   # Ingress的版本
    kind: Ingress
    metadata:
      name: nginx
      labels:
        app: nginx
        isExternal: "true"   # 系统预留字段,必选参数,取值必须为 "true"
        zone: data         # 系统预留字段,数据平面模式,必选参数,取值必须为data
      annotations:
        kubernetes.io/elb.id: 2d48d034-6046-48db-8bb2-53c67e8148b5   # ELB实例的ID,必选参数
        kubernetes.io/elb.ip: 192.168.137.182                        # ELB实例的IP,可选参数
        kubernetes.io/elb.port: '6071'                               # ELB实例的端口,必选参数
    spec:
      rules:                                                         # 路由规则
      - http:                                                        # 使用http协议                      
          paths:
          - path: /                                                  # 路由 
            backend:
              serviceName: nginx                                     # 转发到的Service名称
              servicePort: 8080                                      # 转发到的Service端口

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

    域名访问依赖于域名解析,需要您将域名解析指向ELB实例的IP地址,例如您可以使用云解析服务 DNS来实现域名解析。

    spec:
      rules:
      - host: www.example.com       # 域名
        http:
          paths:
          - path: /
            backend:
              serviceName: nginx
              servicePort: 80
  • 使用https协议创建Ingress
    下面例子中,关联的backend为“nginx:8080”,当访问“https://10.10.10.10:6071/”时,流量转发“nginx:8080”对应的Service,从而将流量转发到对应负载中的Pod。
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/elb.id: 2d48d034-6046-48db-8bb2-53c67e8148b5
        kubernetes.io/elb.ip: 192.168.137.182
        kubernetes.io/elb.port: '6071'
      labels:
        app: nginx
        isExternal: 'true'
        zone: data
      name: nginx
    spec:
      rules:
      - http:
          paths:
          - backend:
              serviceName: nginx
              servicePort: 8080
            path: /
      tls:
     - secretName: cci-sslcertificate-20214221                                 # 上传的SSL证书的名称

路由到多个服务

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

  • 当访问“http://foo.bar.com/foo”时,访问的是“s1:80”后端。
  • 当访问“http://foo.bar.com/bar”时,访问的是“s2:80”后端。
spec:
  rules:
  - host: foo.bar.com          # host地址
    http:
      paths:
      - path: "/foo"
        backend:
          serviceName: s1
          servicePort: 80
      - path: "/bar"
        backend:
          serviceName: s2
          servicePort: 80

配置URL重定向的路由服务

以如下模板为例,Ingress对接了名为service-test的后端服务,访问这个Ingress的 "/service-test" 路径会被重定向到后端服务service-test的"/"路径下面。
cat <<-EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-redirect-test
  namespace: default
 spec:
  rules:
  - host: ingress-test.com
    http:
      paths:
      - path: /
        backend:
          serviceName: service-test
          servicePort: 80
EOF

相关文档