我已经在 Azure Kubernetes 服务中部署了一些 API,并且我一直在尝试使用Kong 以能够使用它的一些功能,例如速率限制和 IP 限制,但它并不总是按预期工作。这是我使用的插件对象:
apiVersion: configuration.konghq.com/v1
kind: KongClusterPlugin
metadata:
name: kong-rate-limiting-plugin
annotations:
kubernetes.io/ingress.class: kong
labels:
global: 'true'
config:
minute: 10
policy: local
limit_by: ip
hide_client_headers: true
plugin: rate-limiting
---
apiVersion: configuration.konghq.com/v1
kind: KongClusterPlugin
metadata:
name: kong-ip-restriction-plugin
annotations:
kubernetes.io/ingress.class: kong
labels:
global: 'true'
config:
deny:
- {some IP}
plugin: ip-restriction
第一个问题是,当我尝试通过将全局标签设置为“true”来跨集群应用这些插件时,如此处所述,使用 kubectl 应用它时出现此错误:
metadata.labels: Invalid value: "\\\"true\\\"": a valid label must be an empty string or consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyValue', or 'my_value', or '12345', regex used for validation is '(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?')
第二个问题是,即使我使用了 KongClusterPlugin 并将 global 设置为“true”,我仍然必须将插件显式添加到 ingress 对象中才能正常工作。这是我的入口:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ing
annotations:
konghq.com/plugins: kong-rate-limiting-plugin,kong-ip-restriction-plugin
konghq.com/protocols: https
konghq.com/https-redirect-status-code: "301"
namespace: default
spec:
ingressClassName: kong
...
这是我的服务:
apiVersion: v1
kind: Service
metadata:
name: my-svc
namespace: default
spec:
externalTrafficPolicy: Local
type: LoadBalancer
...
第三个问题是将limit_by设置为ip,我希望它对每个IP进行速率限制,但我注意到当客户端集体达到阈值时它会阻止所有客户端。我试图通过保留客户端 IP 并在服务对象中将 externalTrafficPolicy 设置为 Local 来缓解这种情况,因为我认为 Kubernetes 对象可能没有接收到实际客户端的 IP。现在速率限制行为似乎更合理,但有时它好像回到了旧状态并随机返回 HTTP 429。我在这里看到的另一个问题是,只有当服务类型设置为 LoadBalancer 或 NodePort 时,我才能将 externalTrafficPolicy 设置为 Local。我将我的服务设置为 LoadBalancer 类型,它公开地公开它并且似乎是一个问题。具有讽刺意味的是,使用入口控制器 s 应该屏蔽服务而不是公开它。我在这里遗漏了什么还是没有意义?
第四个问题是 IP 限制插件似乎不起作用。我能够成功地从具有我放入“config.deny”中的 IP 的机器调用 API。
第五个问题是每分钟我必须访问 API 以获取 HTTP 429 的次数与我在“config.minute”中放置的值不匹配。