34-ingress应用
2022-02-13 本文已影响0人
紫荆秋雪_文
场景
- 在微服务项目中,使用gateway网关来路由到不同请求
- 在多项目中可以通过Nginx来路由不同项目
- 在k8s中是使用Ingress来实现路由到不同Service服务
一、Ingress是什么
Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。流量路由由 Ingress 资源上定义的规则控制
- 下面是一个将所有流量都发送到同一Service的简单 Ingress 示例: image.png
二、为什么需要Ingress
- Service 可以使用NodePort暴露集群外访问端口,但是性能低下不安全
- 缺少 Layer7 的统一访问入口,可以负载均衡、限流等
- 可以使用 Ingress 作为整个集群统一的入口,配置 Ingress 规则转到对应的Service image.png
三、Ingress实战
- Ingress本质上就是Nginx,现在不需要直接修改Nginx配置文件,只需创建Ingress资源就可以修改Nginx配置文件了
- Prefix:基于以
/
分隔的URL路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。路径元素指的是由/分隔符分隔的路径中的标签列表。如果每个p都是请求路径p的元素前缀,则请求与路径p匹配 - Exact:精确匹配 URL 路径,且区分大小写
- ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。具体实现可以将其作为单独的 pathType 处理或者与 Prefix 或 Exact 类型作相同处理
1、基本配置
- ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-01
namespace: raven
spec:
rules:
- host: itwrw.com # 识别域名
http:
paths:
- path: / # 识别路径
pathType: Prefix # 匹配类型
backend:
service:
name: svc-02 # 路由到 Service
port:
number: 80
情况一.png
情况二.png
情况三.png
修改path
- ingress-02.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-02
namespace: raven
spec:
rules:
- host: itwrw.com # 识别域名
http:
paths:
- path: /test # 识别路径
pathType: Prefix # 匹配类型
backend:
service:
name: svc-02 # 路由到 Service
port:
number: 80
修改path.png
image.png
默认配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-default
namespace: raven
spec:
defaultBackend:
service:
name: tomcat-svc
port:
number: 80
rules:
- host: itwrw.com
http:
paths:
- path: /test
pathType: Prefix
backend:
service:
name: svc-02
port:
number: 80
- 默认兜底页面 image.png
四、修改全局配置-ConfigMap
- 编辑全局配置文件
kubectl edit cm ingress-nginx-controller -n ingress-nginx
- 在全局配置文件添加,设置具体配置项参考文档
data:
配置项: 配置值
五、Annotations
1、路径重写
- yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-default
namespace: raven
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
defaultBackend:
service:
name: tomcat-svc
port:
number: 80
rules:
- host: itwrw.com
http:
paths:
- path: /api(/|$)(.*)
pathType: Prefix
backend:
service:
name: svc-02
port:
number: 80
- 上面的入口定义将导致以下重写:
- itwrw.com/api 重写为 itwrw.com/
- itwrw.com/api/ 重写为 itwrw.com/
- itwrw.com/api/new 重写为 itwrw.com/new
2、SSL
通过命令创建免费证书
- 创建证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.cert
-subj "/CN=itwrw.com/O=itwrw.com"
- 创建secret资源
kubectl create secret tls itwrw-tls --key tls.key --cert tls.cert
image.png
- 配置 secret 的yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-default
namespace: raven
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
tls:
- hosts:
- itwrw.com
secretName: itwrw-tls
defaultBackend:
service:
name: tomcat-svc
port:
number: 80
rules:
- host: itwrw.com
http:
paths:
- path: /api(/|$)(.*)
pathType: Prefix
backend:
service:
name: svc-02
port:
number: 80
image.png
证书无效.png
申请阿里云免费证书
- 在阿里云中搜索SSL
- 创建免费证书 image.png
- 申请证书 image.png
- 下载证书 image.png
- 通过证书生成 secret 资源
kubectl create secret tls raven.wang-tls --key raven.wang.key --cert raven.wang.cert
image.png
- tls.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-raven-tls
namespace: raven
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
tls:
- hosts:
- raven.wang
secretName: raven.wang-tls
defaultBackend:
service:
name: tomcat-svc
port:
number: 80
rules:
- host: raven.wang
http:
paths:
- path: /api(/|$)(.*)
pathType: Prefix
backend:
service:
name: svc-02
port:
number: 80
image.png
3、速率限制
- 配置nginx.ingress.kubernetes.io/limit-rps: "1"来限速
- yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-raven-tls
namespace: raven
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/limit-rps: "1"
spec:
tls:
- hosts:
- raven.wang
secretName: raven-tls
defaultBackend:
service:
name: tomcat-svc
port:
number: 80
rules:
- host: raven.wang
http:
paths:
- path: /api(/|$)(.*)
pathType: Prefix
backend:
service:
name: svc-02
port:
number: 80
image.png
4、灰度发布-Canary
Canary-Ingress.png1、普通ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: canary-01
namespace: raven
spec:
rules:
- host: raven.wang
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-02
port:
number: 80
image.png
2、带有canary-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: canary-02
namespace: raven
annotations:
nginx.ingress.kubernetes.io/canary: "true" # 设置为 灰度发布
nginx.ingress.kubernetes.io/canary-by-header: "canary-header" # 请求头字段
nginx.ingress.kubernetes.io/canary-by-cookie: "canary-cookie" # cookie字段
nginx.ingress.kubernetes.io/canary-weight: "50" # 设置权重
spec:
rules:
- host: raven.wang
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tomcat-svc
port:
number: 80
image.png
image.png
-
上面的是按照权重策略来执行
-
请求时添加canary-header
image.png
image.png -
cookie 用法
image.png
image.png - header与cookie混用 image.png
小结
- Canary 规则按优先顺序进行评估。优先顺序如下:canary-by-header -> canary-by-cookie -> canary-weight