Skip to content

Czym jest NetworkPolicy w Kubernetes?

Jest to mechanizm ograniczania ruchu na konkretny Pod, dzieląc ruch wejściowy jako Ingress i wyjściowy jako Egress. Poprzez taki podział okreslany jest sposób komunikacji między Podami: - czy ruch na Ingress danego Poda może być dostępny z innego Poda - czy ruch na Egress (wyjście) może być dostępny do innego Poda.

NetworkPolicy doczepiane są do Podów z użyciem Selectorów, np.

W Podzie Labele:

labels:
    role: web

I w Network Policy:

podSelector:
    matchLabels:
        role: web

Definicja NetworkPolicy

Będzie to NetworkPolicy zezwalająca na ruch wchodzący na Pod z labelem role: db na port 3306/TCP. Dostęp ten będzie możliwy jedynie z Poda o labelu api.

network_policy

Ingress

Manifest NetworkPolicy:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
    name: db-net_policy
spec:
    podSelector:
        matchLabels:
            role: db
    policyTypes:
        - Ingress
    ingress:
        - from:
              - podSelector:
                    matchLabels:
                        role: api
          ports:
              - protocol: TCP
                port: 3306

Czyli, w sekcji spec.podSelector.matchLabels my wybieramy na którym Podzie będzie reguła zawierana (lub jakie Pody będzie obejmować).

...
spec:
    podSelector:
        matchLabels:
            role: db
...

Tutaj określany jest jaki typ ruchu jest możliwy: ruch wchodzący na Poda (ingress):

    policyTypes:
        - Ingress

Jeżeli jest to ruch Ingress, tworzymy klucz ingress: z obiektami które mają mieć dostęp na konkretnie 3306 port TCP:

    ingress:
        - from:
              - podSelector:
                    matchLabels:
                        role: api
          ports:
              - protocol: TCP
                port: 3306

Warning

ALE: Po takim rozwiązaniu każdy Pod o labelu role: api, z każdego namespace będzie miał dostęp do tego Poda!

Definicja NetworkPolicy dla konkretnego namespace

Definicja będzie dla namespace lab:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
    name: db-net_policy
spec:
    podSelector:
        matchLabels:
            role: db
    policyTypes:
        - Ingress
    ingress:
        - from:
              - podSelector:
                    matchLabels:
                        role: api
                namespaceSelector:
                    matchLabels:
                        kubernetes.io/metadata.name: lab # nazwa namespace
          ports:
              - protocol: TCP
                port: 3306

NetworkPolicy z dostępem do Poda z konkretnego IP

Adres IP 10.1.1.26/32 będzie miał umożliwiony dostęp do Poda db:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
    name: db-net_policy
spec:
    podSelector:
        matchLabels:
            role: db
    policyTypes:
        - Ingress
    ingress:
        - from:
              - ipBlock:
                    cidr: 10.1.1.26/32 # zezwalamy na dostęp do Poda z tego adresu
          ports:
              - protocol: TCP
                port: 3306

Dostęp będzie możliwy tylko dla adresu 10.1.1.26/32.

Egress

Definicja NetworkPolicy z Ingressem i Egressem:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
    name: db-net_policy
spec:
    podSelector:
        matchLabels:
            role: db
    policyTypes:
        - Ingress
        - Egress
    ingress:
        - from:
              - podSelector:
                    matchLabels:
                        role: api
                namespaceSelector:
                    matchLabels:
                        kubernetes.io/metadata.name: lab
              - ipBlock:
                    cidr: 10.1.1.24/32
          ports:
              - protocol: TCP
                port: 3306
    egress:
        - to:
              - ipBlock:
                    cidr: 10.2.2.24/32 # adres docelowy
        ports:
            - protocol: TCP
              port: 80 # docelowy port do Backup Servera (wyjście z db)