使用ConfigMap指定列入白名单的CIDR块列表

时间:2018-09-25 14:23:09

标签: kubernetes whitelist kubernetes-ingress kubernetes-networkpolicy

我想做什么

我想应用在ConfigMap中定义的IP白名单。我想将列表保持在外部,因为将其放在一个文件中比将内联的块放入列表更容易。白名单将由不同名称空间中的许多服务使用。

我所拥有的

已从以下规格文件中删除了很多内容,但希望可以保留足够的内容。

我在ConfigMap中将白名单定义为:

apiVersion: v1
kind: ConfigMap
data:
  whitelist:
    # example
    - 127.0.0.1/32
    # etc.
metadata:
  name: whitelist
在此示例中,

我的服务是:

apiVersion: v1
kind: Service
metadata:
  name: example
  labels:
    label: example

请注意,服务类型是默认类型,因为我依靠Ingress来公开它。这不能改变。

该服务位于Ingress定义的后面:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example
  rules:
  - host: example.com
#... ports, etc

我尝试过的东西

更改服务类型

将服务定义为type: LoadBalancer。这正是我想要的,因为使用ConfigMap很容易,然后我意识到由于业务原因我无法更改服务类型。

使用入口注释

apiVersion: extensions/v1beta1
kind: Ingress
# ...
metadata:
  name: whitelist
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: "blockA", "blockB"

这有点用,但是我不知道如何使用ConfigMap而不是逗号分隔的列表。我应该在这里注意,任何允许我使用外部定义的列表的解决方案都是可以接受的,并且不必因为某个原因而成为ConfigMap。

使用NetworkPolicy

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: example-network-policy
spec:
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
      cidr: # hmm... can I add the ConfigMap here?
    - namespaceSelector:
      # ...etc

到目前为止,这看起来是最有希望的,但是ipBlock选择器似乎只接受一个块...?

1 个答案:

答案 0 :(得分:2)

  

使用入口注释

注释不支持

ConfigMap。

  

使用NetworkPolicy

ingressegress是数组结构,因此您可以尝试一下,不确定是否对您有用:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: example-network-policy
spec:
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
      cidr: <cidr1>
    - namespaceSelector:
      # ...etc
  - from:
    - ipBlock:
      cidr: <cidr2>
    - namespaceSelector:
      # ...etc
  - from:
    - ipBlock:
      cidr: <cidr3>
    - namespaceSelector:
      # ...etc