如何在智能告警平台CA触发测试告警
1104
2022-10-31
Kubernetes中使用traefik2.X之Middleware② (九)
接上一篇Kubernetes中使用traefik2.X之Middleware①
3.4、IPWhiteList(ip白名单)
IPWhitelist可以设置接受/拒绝基于客户端IP的请求。
配置示例:
apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: test-ipwhitelistspec: ipWhiteList: sourceRange: - 127.0.0.1/32 - 192.168.1.7
配置选项:
sourceRange
该sourceRange选项设置允许的IP(或使用CIDR表示法的允许IP范围)。
ipStrategy
该ipStrategy选项定义了两个参数,用于设置Traefik如何确定客户端IP:depth和excludedIPs。
ipStrategy.depth
该depth选项告诉Traefik使用X-Forwarded-For标头并获取位于该depth位置的IP (从右开始)。
# Whitelisting Based on `X-Forwarded-For` with `depth=2`apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: testIPwhitelistspec: ipWhiteList: sourceRange: - 127.0.0.1/32 - 192.168.1.7 ipStrategy: depth: 2
如果depth等于2,并且请求X-Forwarded-For标头为"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"“真实”客户端IP "10.0.0.1",则深度为4,但用于白名单的IP为"12.0.0.1"(depth=2)。
如果depth大于中的IP总数X-Forwarded-For,则客户端IP将为空。depth 如果其值小于或等于0,则将被忽略。
ipStrategy.excludedIPs
该选项告诉Traefik使用X-Forwarded-For标头时先排除excludedIPs定义的ip,然后再去获取第一个ip(从右开始),如果depth指定,excludedIPs则被忽略。
# Exclude from `X-Forwarded-For`apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: test-ipwhitelistspec: ipWhiteList: ipStrategy: excludedIPs: - 127.0.0.1/32 - 192.168.1.7
测试:
我们创建一个ipwhitelist中间件,只允许47.101.178.120这个IP访问
apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: test-ipwhitelistspec: ipWhiteList: sourceRange: - 47.101.178.120
我们给grafana配置使用这个ipwhitelist中间件
apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata: name: grafana namespace: monitoringspec: entryPoints: - web routes: - match: Host(`grafana.baixue.fun`) kind: Rule services: - name: grafana port: 3000 middlewares: # 使用上面新建的中间件 - name: redirect-https namespace: default---apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata: name: grafana-tls namespace: monitoringspec: entryPoints: - websecure routes: - match: Host(`grafana.baixue.fun`) kind: Rule services: - name: grafana port: 3000 middlewares: # 使用上面新建的中间件 - name: test-ipwhitelist namespace: default tls: certResolver: myresolver
我们在47.101.178.120访问如下,可以正常访问
我们在本机浏览器访问(本机ip非47.101.178.120),可以看到此时已经被拒绝,状态码403
3.5、Add Prefix (路径添加前缀)
AddPrefix中间件在转发请求之前会先更新请求的URL路径。
配置示例:
# Prefixing with fooapiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: add-foospec: addPrefix: prefix: /foo
配置参数:
prefix
prefix是要添加到请求的URL中当前路径之前的字符串。它应包含前导斜杠(/)。
示例
我们想请求http://test.baixue.fun/index.html时在自动在前面加上/foo 即访问的是http://test.baixue.fun/foo/index.html
新建一个nginx的deployment
apiVersion: v1kind: Servicemetadata: name: v1spec: ports: - protocol: TCP name: web port: 80 selector: app: v1---kind: DeploymentapiVersion: apps/v1metadata: name: v1 labels: app: v1spec: selector: matchLabels: app: v1 template: metadata: labels: app: v1 spec: containers: - name: v1 image: nginx ports: - name: web containerPort: 80
新建一个appprefix的中间件
# Prefixing with fooapiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: addprefix-foospec: addPrefix: prefix: /foo
新建一个ingresroute
apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata: name: simple-mirror-ingressroute namespace: defaultspec: entryPoints: - web routes: - match: Host(`test.baixue.fun`) kind: Rule services: - name: v1 port: 80
此时没有使用中间件我们访问http://test.baixue.fun/index.html 如下
我们进入nginx容器,在/usr/share/nginx/html下新建目录foo,并创建一个index.html文件
[root@master01 mirror]# kubectl exec -it v1-74c95bcddb-x5j5m -- bashroot@v1-74c95bcddb-x5j5m:/# cd usr/share/nginx/html/root@v1-74c95bcddb-x5j5m:/usr/share/nginx/html# cat foo/index.htmlthis foo/index.html
修改ingressroute 文件,使用之前定义的addprefix中间件
apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata: name: simple-mirror-ingressroute namespace: defaultspec: entryPoints: - web routes: - match: Host(`test.baixue.fun`) kind: Rule services: - name: v1 port: 80 middlewares: # 使用上面新建的中间件 - name: addprefix-foo namespace: default
此时再访问http://test.baixue.fun/index.html ,此时虽然我们访问的是http://test.baixue.fun/index.html,但是经过了addprefix中间件后,像后端的nginx请求的url就变为了http://test.baixue.fun/foo/index.html
nginx 日志如下
3.6、ErrorPage(自定义错误页面)
根据配置的HTTP状态代码范围,ErrorPage中间件返回一个自定义页面来代替默认页面。要注意返回的错误页面错误页面本身不是由Traefik提供的的,而是由别的服务提供
配置示例:
apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: test-errorpagespec: errors: status: - 500-599 query: /{status}.html service: name: whoami port: 80
在此示例中,错误页面URL基于状态码(query=/{status}.html)。
配置选项:
status
定义错误状态码。
状态码范围都包括两端(500-599包括500和599以及500-599之间的状态码)。
您可以使用定义类似的状态码,也可以使用定义类似500的语法500-599。
query
错误页面的网址(由托管service提供)。可以使用{status},它将被收到的状态代码替换。
service
将为新的请求的错误页面提供服务的服务。即去哪个服务上请求query定义的地址
示例:
定义一个errorpage中间件
apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: test-errorpagespec: errors: status: - 400-599 query: /{status}.html service: name: v1 port: 80
v1这个service 是指向我们之前的nginx。
ingressroute
apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata: name: openldap namespace: devopsspec: entryPoints: - web routes: - match: Host(`test.baixue.fun`) kind: Rule services: - name: openldap port: 80 middlewares: - name: test-errorpage namespace: default
未使用中间件我们访问一个不存在的页面
使用中间件时访问一个不存在的页面,此时页面也就被中间件给转向nginx的错误页面了
3.7、DigestAuth (basic-auth增强版)
HTTP Digest Auth 是对 HTTP Basic Auth 的增强。由于 HTTP Basic Auth 几乎是以明文传输用户名和密码,容易泄露。而 HTTP Digest Auth 能够传递认证信息,但是传递的是使用摘要算法(如:MD5)产生的密文,服务端也不用存储明文用户信息,降低了泄密的可能性。
DigestAuth中间件是一种将访问权限限制到已知用户的快速方法。
[root@master01 middlewares]# htdigest -c digest-auth traefik lishuaiAdding password for lishuai in realm traefik.New password:Re-type new password:[root@master01 middlewares]# cat digest-authlishuai:traefik:afd2706aacaf4411e2eb6ac00d48683d
配置示例:
# Declaring the user listapiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: test-authspec: digestAuth: secret: userssecret # Kubernetes 中使用 secret 来进行认证,可以用下面得命令来生成:[root@master01 middlewares]# htdigest -c digest-auth traefik lishuaiAdding password for lishuai in realm traefik.New password:Re-type new password:[root@master01 middlewares]# cat digest-authlishuai:traefik:afd2706aacaf4411e2eb6ac00d48683d
配置选项
users
出于安全原因,usersKubernetes IngressRoute不存在该字段,因此应该使用该secret字段。
realm
realm选项来自定义身份验证领域。默认值为traefik。
apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: test-authspec: digestAuth: realm: MyRealm
headerfield
headerField选项来自定义身份验证用户的标题字段。
apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: my-authspec: digestAuth: # ... headerField: X-WebAuth-User
removeHeader
将 removeHeader 选项设置为 true 以在将请求转发到您的服务之前删除授权标头。(默认值为 false )
apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: test-authspec: digestAuth: removeHeader: true
示例:
定义一个digestauth中间件
[root@master01 middlewares]# htdigest -c digest-auth traefik lishuaiAdding password for lishuai in realm traefik.New password:Re-type new password:[root@master01 middlewares]# cat digest-authlishuai:traefik:c605fe61449bc1a0532a03b55f854718[root@master01 middlewares]# cat digest-auth|base64 bGlzaHVhaTp0cmFlZmlrOmM2MDVmZTYxNDQ5YmMxYTA1MzJhMDNiNTVmODU0NzE4Cg==# Declaring the user listapiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: digest-authspec: digestAuth: secret: digest-auth realm:traefik ##realm要和htdigest生成密码用的realm一致---apiVersion: v1kind: Secretmetadata: name: digest-authdata: users: |- bGlzaHVhaTp0cmFlZmlrOmM2MDVmZTYxNDQ5YmMxYTA1MzJhMDNiNTVmODU0NzE4Cg==
ingreroute中使用中间件
apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata: name: simpleingressroute namespace: defaultspec: entryPoints: - web routes: - match: Host(`test.baixue.fun`) kind: Rule services: - name: whoami-v1 port: 80 middlewares: - name: digest-auth namespace: default
访问如下:
3.8、compress (页面压缩)
Compress中间件启用gzip压缩。
配置示例:
# Enable gzip compressionapiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: test-compressspec: compress: {}
响应在以下情况下会被压缩:
响应体大于 1400 字节。Accept-Encoding 请求头包含 gzip。响应尚未压缩,即尚未设置 Content-Encoding 响应头。
配置参数
excludedContentTypes
excludedContentTypes 指定一系列内容类型,以便在压缩之前将传入请求的 Content-Type 请求头与之对比。
请求中 excludedContentTypes 定义的内容类型不会被压缩。
内容类型压缩时忽略大小写和空格。
apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: test-compressspec: compress: excludedContentTypes: - text/event-stream
上面这个中间件则定义了text/event-stream这个类型的内容不会被压缩
3.9、Chain (组合使用中间件)
链中间件可以把现有的中间件给组合起来使用,比如很多时候都需要使用https bascic-auth和ipwuhitelist这几个中间件,一个一个写太麻烦,我们可以把这个三组成一个新的中间件,使用时只写新的即可
配置示例:
apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata: name: test namespace: defaultspec: entryPoints: - web routes: - match: Host(`mydomain`) kind: Rule services: - name: whoami port: 80 middlewares: - name: secured---apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: securedspec: chain: middlewares: - name: https-only - name: known-ips - name: auth-users---apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: auth-usersspec: basicAuth: users: - test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/---apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: https-onlyspec: redirectScheme: scheme: https---apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: known-ipsspec: ipWhiteList: sourceRange: - 192.168.1.7 - 127.0.0.1/32
示例:
我们使用之前定义的digest-auth和ipwhitelist和test-errorpage,要注意有些中间件不能一起使用,比如redirect-https和别的中间件好像不能一起使用
apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: securedspec: chain: middlewares: - name: test-ipwhitelist - name: digest-auth - name: test-errorpage
ingressroute
apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata: name: openldap-tls namespace: devopsspec: entryPoints: - websecure routes: - match: Host(`test.baixue.fun`) kind: Rule services: - name: openldap port: 80 middlewares: - name: secured namespace: default tls: certResolver: myresolver
访问:
如下图,我们第一次访问需要登陆这个用到了digest-auth中间件,错误页面也被test-errorpage中间件给请求到了别处。
发表评论
暂时没有评论,来抢沙发吧~