Ich richte einen Namespace in meinem Kubernetes-Cluster ein, um ausgehende Netzwerkanrufe wie http://company.com abzulehnen um die Kommunikation zwischen Pods in meinem Namespace wie http: // my-nginx zu ermöglichen, wobei my-nginx ein Kubernetes-Dienst ist, auf den verwiesen wird meine Nginx-Kapsel.

So erreichen Sie dies mithilfe von Netzwerkrichtlinien. Die folgenden Netzwerkrichtlinien helfen beim Blockieren aller ausgehenden Netzwerkanrufe

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-all-egress
  namespace: sample
spec:
  policyTypes:
  - Egress
  podSelector: {}

Wie kann ich nur die Inter-Pod-Anrufe auf die weiße Liste setzen?

2
Pradeep 18 Jän. 2019 im 16:36

3 Antworten

Beste Antwort

Ich bin nicht sicher, ob Sie dies mit Kubernetes NetworkPolicy tun können, aber Sie können dies mit Istio-fähigen Pods erreichen.

Hinweis: Stellen Sie zunächst sicher, dass Istio auf Ihrem Cluster installiert ist. Zur Installation siehe.

Siehe Zitat aus Istios Dokumentation über Egress Traffic.

Standardmäßig können Istio-fähige Dienste nicht auf URLs außerhalb des Clusters zugreifen, da der Pod mithilfe von iptables den gesamten ausgehenden Datenverkehr transparent an den Sidecar-Proxy umleitet, der nur Ziele innerhalb des Clusters verarbeitet.

Sie können Domänen auch außerhalb des Clusters auf die Whitelist setzen, indem Sie Ihrem Cluster ServiceEntry und VirtualService hinzufügen. Beispiel: Konfigurieren der externen Dienste in der Istio-Dokumentation.

Ich hoffe, es kann für Sie nützlich sein.

0
Black_Bacardi 25 Jän. 2019 im 18:36

Mithilfe von Netzwerkrichtlinien können Sie alle Pods in einem Namespace auf die Whitelist setzen:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-egress-to-sample
  namespace: sample
spec:
  policyTypes:
  - Egress
  podSelector: {}
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          name: sample

Wie Sie wahrscheinlich bereits wissen, können Pods mit mindestens einer auf sie angewendeten Netzwerkrichtlinie nur mit Zielen kommunizieren, die von einer auf sie angewendeten Netzwerkrichtlinie zugelassen werden.

Namen spielen eigentlich keine Rolle. Selektoren (in diesem Fall NamespaceSelector und podSelector) kümmern sich nur um Beschriftungen. Beschriftungen sind Schlüssel-Wert-Paare, die Ressourcen zugeordnet sind. Im obigen Beispiel wird davon ausgegangen, dass der Namespace sample die Bezeichnung name=sample hat.

Wenn Sie den Namespace http://my-nginx auf die Whitelist setzen möchten, müssen Sie zuerst Ihrem Namespace eine Bezeichnung hinzufügen (falls noch keine vorhanden ist). name ist eine gute Schlüssel-IMO, und der Wert kann der Name des Dienstes sein, in diesem speziellen Fall http://my-nginx (nicht sicher, ob : und / ein Teil sein können eines Etiketts). Wenn Sie dies dann einfach in Ihren Netzwerkrichtlinien verwenden, können Sie den Namespace als Ziel festlegen (entweder für den Ein- oder den Ausgang).

    - namespaceSelector:
        matchLabels:
          name: http://my-nginx

Wenn Sie die Kommunikation mit einem Dienst namens my-nginx zulassen möchten, spielt der Name des Dienstes keine Rolle. Sie müssen die Ziel-Pods mit podSelector auswählen. Dies sollte mit derselben Bezeichnung erfolgen, mit der der Dienst weiß, welche Pods dazu gehören. Überprüfen Sie Ihren Dienst, um das Etikett zu erhalten, und verwenden Sie key: value in der Netzwerkrichtlinie. Zum Beispiel sollten Sie für ein Schlüssel = Wert-Paar von Rolle = Nginx verwenden

    - podSelector:
        matchLabels:
          role: nginx
0
Blueriver 1 Juli 2019 im 22:01

Dies kann mithilfe der folgenden Kombination von Netzwerkrichtlinien erfolgen:

# The same as yours
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-all-egress
  namespace: sample
spec:
  policyTypes:
  - Egress
  podSelector: {}
---
# allows connections to all pods in your namespace from all pods in your namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-namespace-egress
  namespace: sample
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - podSelector:
        matchLabels: {}
---
# allows connections from all pods in your namespace to all pods in your namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-namespace-internal
  namespace: sample
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels: {}

Angenommen, Ihre Netzwerkrichtlinienimplementierung implementiert die vollständige Spezifikation.

0
dippynark 2 Juli 2019 im 21:31