Ingress
上一节中讲了创建LoadBalancer类型的Service,使用ELB实例从外部访问Pod。
但是Service是基于四层TCP和UDP协议转发的,Ingress可以基于七层的HTTP和HTTPS协议转发,可以通过域名和路径做到更细粒度的划分,如下图所示。
在云容器实例中,使用Ingress绑定ELB的IP和端口,实现外部访问,如图2所示。
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重定向的路由服务
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