ingress是什么
ingress是对集群服务的外部访问进行管理的API对象,可以提供负载均衡、SSL终结和基于名称的虚拟托管,公开了集群外部到集群内services的HTTP和HTTPS路由,流量路由有ingress资源上定义的规则进行控制,
ingress控制器通常负责通过负载均衡器来实现ingress,也可以配置边缘路由器和其他的前端来处理流量。
如何使用
准备
需要安装 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=