ingress:http七层路由

1,343 阅读3分钟

ingress是什么

ingress是对集群服务的外部访问进行管理的API对象,可以提供负载均衡、SSL终结和基于名称的虚拟托管,公开了集群外部到集群内services的HTTP和HTTPS路由,流量路由有ingress资源上定义的规则进行控制,

ingress控制器通常负责通过负载均衡器来实现ingress,也可以配置边缘路由器和其他的前端来处理流量。

image

如何使用

准备

需要安装 ingress 控制器才能满足 Ingress 的要求,控制器实现基于不同的http url向后转发的负载分发规则,可以灵活设置七层的负载分达策略。

ingress的策略配置

为了实现各种不同的负载分发规则,ingress可以按照多种方式进行配置。

转发到单个后端服务

客户端到ingress controller的访问请求都将被准发到后端唯一的service上,无需额外的规则

apiVersion: v1
kind: Ingress
metadata:
    name: test-ingress
spec:
    backend:
        serviceName: myland
        servicePort: 8080

同一域名,不同URL路径被转发到不同的服务商

一个域名通过不同的路径提供不同的服务场景。例如:web提供页面服务,api提供接口调用等。通过ingress的设置就能基于URL路径的转发规则定义出来。

apiVersion: v1
kind: Ingress
metadata:
    name: test-ingress
spec:
	rules:
	- host: onlyone.com
	  http:
	  	paths:
	  	  - path: /web
            backend:
                serviceName: web-service
                servicePort: 8080
	  	  - path: /api
            backend:
                serviceName: api-service
                servicePort: 8081
注意:Ingress 中的多条路径会匹配同一个请求。这种情况下最长的匹配路径优先。如果仍然有两条同等的匹配路径,则精确路径类型优先于前缀路径类型

不同的域名,被转发到不同的服务上

一个网站通过不同的域名转发到不同的后端服务上,如下设置:

apiVersion: v1
kind: Ingress
metadata:
    name: test-ingress
spec:
	rules:
	- host: onlyone.com
	  http:
	  	paths:
          - backend:
                serviceName: myweb-service
                servicePort: 8080
	- host: myland.com
	  http:
	  	paths:
          - backend:
                serviceName: myland-service
                servicePort: 8080

不使用域名的转发规则

不使用域名,直接使用IP的方式请求服务。例如:https://200.200.200.202/web

apiVersion: v1
kind: Ingress
metadata:
    name: test-ingress
spec:
	rules:
	  - http:
	  	paths:
	  	  - path: /web
            backend:
                serviceName: myweb-service
                servicePort: 8080
                
===============
关闭https
===============
apiVersion: v1
kind: Ingress
metadata:
    name: test-ingress
    annotations:
    	ingress.kubernetes.io/ssl-redirect: "false"
spec:
	rules:
	  - http:
	  	paths:
	  	  - path: /web
            backend:
                serviceName: myweb-service
                servicePort: 8080
注:使用无域名的ingress转发规则时,禁止使用http,强制启用https,也可以在ingress的定制中设置一个“annotation 'ingress,kubernetes.io/ssl-redirect=false'”来关闭强制启用的https。

TLS安全

为了让ingress提供安全的https的安全访问,需要我欸ingress中的域名进行TLS安全证书的设置,具体的操作步骤如下:

  • (1)创建自签名的密钥和SSL证书文件
  • (2)将证书保存到k8s中的一个Secret资源对象上
  • (3)将该Secret对象设置到ingress中

myland-ingress-sercet.yaml

apiVersion: v1
kind: Secret
metadata:
    name: myland-ingress-secret
type: kubernetes.io/tls
data:
    tls.crt: MKDHk....DHSU==
    tls.key: MKDDJ....DNJSD=