Kubernetes中使用traefik2.X之Middleware② (九)

网友投稿 1104 2022-10-31

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

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中间件给请求到了别处。

上一篇:【专家视点】浅论软件维护应注意的有关问题
下一篇:【中培课堂】优秀的软件测试人员应具备的6个能力
相关文章

 发表评论

暂时没有评论,来抢沙发吧~