Белое пространство имен "kube-system" с использованием NetworkPolicy - PullRequest
0 голосов
/ 12 июня 2018

У меня есть мультитенантный кластер, где мультитенантность достигается через пространства имен.Каждый арендатор имеет свое собственное пространство имен.Стручки от арендатора не могут общаться с другими арендаторами.Тем не менее, некоторые модули в каждом арендаторе должны предоставлять услугу Интернету, используя Ingress.

Это то, как далеко я ушел (я использую Calico):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: tenant1-isolate-namespace
  namespace: tenant1
spec:
  policyTypes:
  - Ingress
  podSelector: {} # Select all pods in this namespace
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: tenant1 # white list current namespace

Развернуто длякаждое пространство имен (tenant1, tenant2, ...), это ограничивает связь между модулями в их пространстве имен.Однако это препятствует тому, чтобы модули из пространства имен kube-system могли общаться с модулями в этом пространстве имен.

Однако пространство имен kube-system по умолчанию не имеет меток, поэтому я не могу специально занести белый список в это пространство имен.

Я нашел (грязный) обходной путь для этой проблемы, вручную присвоив ему метку:

kubectl label namespace/kube-system permission=talk-to-all

И добавив правило белого списка в сетевую политику:

...
  - from:
    - namespaceSelector:
        matchLabels:
          permission: talk-to-all # allow namespaces that have the "talk-to-all privilege"

Isесть лучшее решение, без указания вручную kube-system метки?

Редактировать: Я попытался дополнительно добавить правило «ИЛИ», чтобы специально разрешить связь с модулями с приложением «метка»= nginx-ingress ", но без везения:

  - from
    ...
    - podSelector:
        matchLabels:
          app: nginx-ingress # Allow pods that have the app=nginx-ingress label

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Действительно, пакетам tenant1 потребуется доступ к kube-dns в пространстве имен kube-system.

Одним из подходов, не требующим маркировки пространства имен kube-system, является следующая политика.Хотя kube-dns может быть в любом пространстве имен с таким подходом, поэтому он может не подойти вам.

---                                                                                                                                                                                                           
# Default deny all ingress & egress policy, except allow kube-dns                                                                                                                                             
# All traffic except this must be explicity allowed.                                                                                                                                                          
kind: NetworkPolicy                                                                                                                                                                                           
apiVersion: networking.k8s.io/v1                                                                                                                                                                              
metadata:                                                                                                                                                                                                     
  name: default-deny-all-except-kube-dns                                                                                                                                                                      
  namespace: tenant1                                                                                                                                                                                        
spec:                                                                                                                                                                                                         
  podSelector: {}                                                                                                                                                                                             
  egress:                                                                                                                                                                                                     
 - to:                                                                                                                                                                                                       
    - podSelector:                                                                                                                                                                                            
        matchLabels:                                                                                                                                                                                          
          k8s-app: kube-dns                                                                                                                                                                                   
 - ports:                                                                                                                                                                                                    
    - protocol: UDP                                                                                                                                                                                           
      port: 53                                                                                                                                                                                                
  policyTypes:                                                                                                                                                                                                
 - Ingress                                                                                                                                                                                                   
 - Egress   

Затем вам также понадобится «разрешить все в политике пространства имен» следующим образом:

---                                                                                                                                                                                                           
# Allow intra namespace traffic for development purposes only.                                                                                                                                                
kind: NetworkPolicy                                                                                                                                                                                           
apiVersion: networking.k8s.io/v1                                                                                                                                                                              
metadata:                                                                                                                                                                                                     
  name: allow-intra-namespace                                                                                                                                                                                 
  namespace: tenant1                                                                                                                                                                                        
spec:                                                                                                                                                                                                         
  podSelector:                                                                                                                                                                                                
    matchLabels:                                                                                                                                                                                              
  ingress:                                                                                                                                                                                                    
  - from:                                                                                                                                                                                                     
    - podSelector: {}                                                                                                                                                                                         
  egress:                                                                                                                                                                                                     
  - to:                                                                                                                                                                                                       
    - podSelector: {}                                                                                                                                                                                         
  policyTypes:                                                                                                                                                                                                
  - Ingress                                                                                                                                                                                                   
  - Egress

Наконец, вы захотите добавить определенные политики, такие как правило входа.,Было бы лучше заменить политику allow-intra-namespace конкретными правилами, чтобы они соответствовали отдельным пакетам, что может сделать ваш tenant1.

Они были адаптированы с этого сайта: https://github.com/ahmetb/kubernetes-network-policy-recipes

0 голосов
/ 12 июня 2018

apiVersion: network.k8s.io/v1

namespaceSelector предназначен для сопоставления пространств имен только по меткам.Невозможно выбрать пространство имен по имени.

podSelector может выбирать модули только в одном пространстве имен с объектом NetworkPolicy.Для объектов, расположенных в разных пространствах имен, возможен только выбор всего пространства имен.

Вот пример реализации Политики сети Kubernetes:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

Следуйте по этой ссылке чтобы прочитать хорошее объяснение всей концепции политики сети, или эту ссылку , чтобы посмотреть лекцию.

apiVersion: projectcalico.org/v3

Calico API дает вам больше возможностей для написания правил NetworkPolicy, так что в какой-то момент вы можете достичь своей цели с меньшими усилиями и умопомрачительным умом.

Например, используя реализацию сетевой политики Calico, вы можете:

  • установить действие для правила (Allow, Deny, Log, Pass),
  • использовать отрицательныйсопоставление (протокол, notProtocol, селектор, notSelector),
  • применить более сложные селекторы меток (имеет (k), k отсутствует в {'v1', 'v2'}),
  • селекторы объединенияс оператором &&,
  • использовать диапазон портов (порты: [8080, "1234: 5678", "named-port"]),
  • соответствуют модулям в других пространствах имен.

Но, тем не менее, вы можете сопоставлять пространства имен только по меткам.

Рассмотрите подробности в документации по Calico .

Вот пример реализации сетевой политики Calico:

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: allow-tcp-6379
  namespace: production
spec:
  selector: role == 'database'
  types:
  - Ingress
  - Egress
  ingress:
  - action: Allow
    protocol: TCP
    source:
      selector: role == 'frontend'
    destination:
      ports:
      - 6379
  egress:
  - action: Allow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...