61 lines
2.7 KiB
Go
61 lines
2.7 KiB
Go
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)
|
|
}
|
|
}
|