0

我已经在 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”中放置的值不匹配。

4

0 回答 0