package cloud import ( "log" "os" "golang.org/x/net/context" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/dynamic" ) var netpolGVR = schema.GroupVersionResource{Group: "networking.k8s.io", Version: "v1", Resource: "networkpolicies"} // ApplyNetworkPolicy создаёт NetworkPolicy в namespace ns для межтенантной изоляции. // // Политика «deny-cross-tenant» запрещает входящий трафик из других пользовательских // namespace-ов, разрешая только: // - Трафик внутри самого namespace (pod-to-pod внутри тенанта) // - Трафик из Fission system namespace (router → function pod) // - Трафик из kube-system (kubelet health checks, CoreDNS) // // Это обеспечивает сетевую изоляцию между тенантами без отключения внутренних // вызовов Fission. Env var FISSION_SYSTEM_NAMESPACE задаёт имя Fission namespace // (default: "fission"). func ApplyNetworkPolicy(ctx context.Context, dyn dynamic.Interface, ns string) { fissionSysNS := os.Getenv("FISSION_SYSTEM_NAMESPACE") if fissionSysNS == "" { fissionSysNS = "fission" } netpolObj := &unstructured.Unstructured{Object: map[string]any{ "apiVersion": "networking.k8s.io/v1", "kind": "NetworkPolicy", "metadata": map[string]any{"name": "deny-cross-tenant", "namespace": ns}, "spec": map[string]any{ "podSelector": map[string]any{}, // применяется ко всем подам namespace "policyTypes": []any{"Ingress"}, "ingress": []any{ // Разрешаем трафик внутри namespace (pod-to-pod) map[string]any{"from": []any{map[string]any{"podSelector": map[string]any{}}}}, // Разрешаем трафик из Fission core namespace (router → function pod) map[string]any{"from": []any{map[string]any{"namespaceSelector": map[string]any{ "matchLabels": map[string]any{"kubernetes.io/metadata.name": fissionSysNS}, }}}}, // Разрешаем трафик из kube-system (kubelet health checks, DNS) map[string]any{"from": []any{map[string]any{"namespaceSelector": map[string]any{ "matchLabels": map[string]any{"kubernetes.io/metadata.name": "kube-system"}, }}}}, }, }, }} _, err := dyn.Resource(netpolGVR).Namespace(ns).Create(ctx, netpolObj, metav1.CreateOptions{}) if err != nil && !apierrors.IsAlreadyExists(err) { log.Printf("cloud.ApplyNetworkPolicy: %s: %v", ns, err) } }