Skip to content

Commit e3e7fb3

Browse files
rbaturovTal-or
authored andcommitted
scheduler network policies
This commit introduces two network policies for the scheduler: 1. A default deny-all policy that blocks all ingress and egress traffic by default. This serves as a security baseline, ensuring that no unintended connections are allowed from or to the scheduler pod. 2. A policy allowing egress traffic from the scheduler pod to the API server. Signed-off-by: Ronny Baturov <[email protected]>
1 parent 7c047a7 commit e3e7fb3

File tree

6 files changed

+125
-25
lines changed

6 files changed

+125
-25
lines changed

pkg/numaresourcesscheduler/manifests/manifests.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
appsv1 "k8s.io/api/apps/v1"
2525
corev1 "k8s.io/api/core/v1"
26+
networkingv1 "k8s.io/api/networking/v1"
2627
rbacv1 "k8s.io/api/rbac/v1"
2728
"k8s.io/apimachinery/pkg/runtime"
2829
"k8s.io/client-go/kubernetes/scheme"
@@ -117,6 +118,30 @@ func Deployment(namespace string) (*appsv1.Deployment, error) {
117118
return dp, nil
118119
}
119120

121+
func NetworkPolicy(policyType, namespace string) (*networkingv1.NetworkPolicy, error) {
122+
var fileName string
123+
124+
if policyType == "" || policyType == "default" {
125+
fileName = "networkpolicy.yaml"
126+
} else {
127+
fileName = fmt.Sprintf("networkpolicy.%s.yaml", policyType)
128+
}
129+
130+
obj, err := loadObject(filepath.Join("yaml", fileName))
131+
if err != nil {
132+
return nil, err
133+
}
134+
135+
np, ok := obj.(*networkingv1.NetworkPolicy)
136+
if !ok {
137+
return nil, fmt.Errorf("unexpected type, got %t", obj)
138+
}
139+
if namespace != "" {
140+
np.Namespace = namespace
141+
}
142+
return np, nil
143+
}
144+
120145
func deserializeObjectFromData(data []byte) (runtime.Object, error) {
121146
decode := scheme.Codecs.UniversalDeserializer().Decode
122147
obj, _, err := decode(data, nil, nil)

pkg/numaresourcesscheduler/manifests/manifests_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,10 @@ func TestLoad(t *testing.T) {
3939
if obj, err := Deployment(""); obj == nil || err != nil {
4040
t.Errorf("Deployment() failed: err=%v", err)
4141
}
42+
if obj, err := NetworkPolicy("default", ""); obj == nil || err != nil {
43+
t.Errorf("NetworkPolicy() failed: err=%v", err)
44+
}
45+
if obj, err := NetworkPolicy("apiserver", ""); obj == nil || err != nil {
46+
t.Errorf("NetworkPolicy() failed: err=%v", err)
47+
}
4248
}

pkg/numaresourcesscheduler/manifests/sched/sched.go

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package sched
1919
import (
2020
appsv1 "k8s.io/api/apps/v1"
2121
corev1 "k8s.io/api/core/v1"
22+
networkingv1 "k8s.io/api/networking/v1"
2223
rbacv1 "k8s.io/api/rbac/v1"
2324

2425
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -29,14 +30,16 @@ import (
2930
)
3031

3132
type Manifests struct {
32-
ServiceAccount *corev1.ServiceAccount
33-
ConfigMap *corev1.ConfigMap
34-
ClusterRole *rbacv1.ClusterRole
35-
ClusterRoleBindingK8S *rbacv1.ClusterRoleBinding
36-
ClusterRoleBindingNRT *rbacv1.ClusterRoleBinding
37-
Role *rbacv1.Role
38-
RoleBinding *rbacv1.RoleBinding
39-
Deployment *appsv1.Deployment
33+
ServiceAccount *corev1.ServiceAccount
34+
ConfigMap *corev1.ConfigMap
35+
ClusterRole *rbacv1.ClusterRole
36+
ClusterRoleBindingK8S *rbacv1.ClusterRoleBinding
37+
ClusterRoleBindingNRT *rbacv1.ClusterRoleBinding
38+
Role *rbacv1.Role
39+
RoleBinding *rbacv1.RoleBinding
40+
Deployment *appsv1.Deployment
41+
DefaultNetworkPolicy *networkingv1.NetworkPolicy
42+
APIserverNetworkPolicy *networkingv1.NetworkPolicy
4043
}
4144

4245
func (mf Manifests) ToObjects() []client.Object {
@@ -49,19 +52,23 @@ func (mf Manifests) ToObjects() []client.Object {
4952
mf.Role,
5053
mf.RoleBinding,
5154
mf.Deployment,
55+
mf.DefaultNetworkPolicy,
56+
mf.APIserverNetworkPolicy,
5257
}
5358
}
5459

5560
func (mf Manifests) Clone() Manifests {
5661
return Manifests{
57-
ServiceAccount: mf.ServiceAccount.DeepCopy(),
58-
ConfigMap: mf.ConfigMap.DeepCopy(),
59-
ClusterRole: mf.ClusterRole.DeepCopy(),
60-
ClusterRoleBindingK8S: mf.ClusterRoleBindingK8S.DeepCopy(),
61-
ClusterRoleBindingNRT: mf.ClusterRoleBindingNRT.DeepCopy(),
62-
Role: mf.Role.DeepCopy(),
63-
RoleBinding: mf.RoleBinding.DeepCopy(),
64-
Deployment: mf.Deployment.DeepCopy(),
62+
ServiceAccount: mf.ServiceAccount.DeepCopy(),
63+
ConfigMap: mf.ConfigMap.DeepCopy(),
64+
ClusterRole: mf.ClusterRole.DeepCopy(),
65+
ClusterRoleBindingK8S: mf.ClusterRoleBindingK8S.DeepCopy(),
66+
ClusterRoleBindingNRT: mf.ClusterRoleBindingNRT.DeepCopy(),
67+
Role: mf.Role.DeepCopy(),
68+
RoleBinding: mf.RoleBinding.DeepCopy(),
69+
Deployment: mf.Deployment.DeepCopy(),
70+
DefaultNetworkPolicy: mf.DefaultNetworkPolicy.DeepCopy(),
71+
APIserverNetworkPolicy: mf.APIserverNetworkPolicy.DeepCopy(),
6572
}
6673
}
6774

@@ -108,5 +115,15 @@ func GetManifests(namespace string) (Manifests, error) {
108115
return mf, err
109116
}
110117

118+
mf.DefaultNetworkPolicy, err = manifests.NetworkPolicy("default", namespace)
119+
if err != nil {
120+
return mf, err
121+
}
122+
123+
mf.APIserverNetworkPolicy, err = manifests.NetworkPolicy("apiserver", namespace)
124+
if err != nil {
125+
return mf, err
126+
}
127+
111128
return mf, nil
112129
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: networking.k8s.io/v1
2+
kind: NetworkPolicy
3+
metadata:
4+
name: scheduler-egress-to-api-server
5+
spec:
6+
podSelector:
7+
matchLabels:
8+
app: secondary-scheduler
9+
egress:
10+
- ports:
11+
- protocol: TCP
12+
port: 6443
13+
policyTypes:
14+
- Egress
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apiVersion: networking.k8s.io/v1
2+
kind: NetworkPolicy
3+
metadata:
4+
name: scheduler-default-deny-all
5+
spec:
6+
podSelector:
7+
matchLabels:
8+
app: secondary-scheduler
9+
policyTypes:
10+
- Ingress
11+
- Egress

pkg/numaresourcesscheduler/objectstate/sched/sched.go

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121

2222
appsv1 "k8s.io/api/apps/v1"
2323
corev1 "k8s.io/api/core/v1"
24+
networkingv1 "k8s.io/api/networking/v1"
2425
rbacv1 "k8s.io/api/rbac/v1"
2526
"k8s.io/klog/v2"
2627

@@ -43,15 +44,17 @@ const (
4344
)
4445

4546
type ExistingManifests struct {
46-
Existing schedmanifests.Manifests
47-
serviceAccountError error
48-
configMapError error
49-
clusterRoleError error
50-
clusterRoleBindingK8SError error
51-
clusterRoleBindingNRTError error
52-
roleError error
53-
roleBindingError error
54-
deploymentError error
47+
Existing schedmanifests.Manifests
48+
serviceAccountError error
49+
configMapError error
50+
clusterRoleError error
51+
clusterRoleBindingK8SError error
52+
clusterRoleBindingNRTError error
53+
roleError error
54+
roleBindingError error
55+
deploymentError error
56+
DefaultNetworkPolicyError error
57+
APIserverNetworkPolicyError error
5558
}
5659

5760
func (em ExistingManifests) State(mf schedmanifests.Manifests) []objectstate.ObjectState {
@@ -112,6 +115,20 @@ func (em ExistingManifests) State(mf schedmanifests.Manifests) []objectstate.Obj
112115
Compare: compare.Object,
113116
Merge: merge.ObjectForUpdate,
114117
},
118+
{
119+
Existing: em.Existing.DefaultNetworkPolicy,
120+
Error: em.DefaultNetworkPolicyError,
121+
Desired: mf.DefaultNetworkPolicy.DeepCopy(),
122+
Compare: compare.Object,
123+
Merge: merge.MetadataForUpdate,
124+
},
125+
{
126+
Existing: em.Existing.APIserverNetworkPolicy,
127+
Error: em.APIserverNetworkPolicyError,
128+
Desired: mf.APIserverNetworkPolicy.DeepCopy(),
129+
Compare: compare.Object,
130+
Merge: merge.MetadataForUpdate,
131+
},
115132
}
116133
}
117134

@@ -158,6 +175,16 @@ func FromClient(ctx context.Context, cli client.Client, mf schedmanifests.Manife
158175
if ret.deploymentError = cli.Get(ctx, client.ObjectKeyFromObject(mf.Deployment), dp); ret.deploymentError == nil {
159176
ret.Existing.Deployment = dp
160177
}
178+
179+
np := &networkingv1.NetworkPolicy{}
180+
if ret.DefaultNetworkPolicyError = cli.Get(ctx, client.ObjectKeyFromObject(mf.DefaultNetworkPolicy), np); ret.DefaultNetworkPolicyError == nil {
181+
ret.Existing.DefaultNetworkPolicy = np
182+
}
183+
184+
npAPI := &networkingv1.NetworkPolicy{}
185+
if ret.APIserverNetworkPolicyError = cli.Get(ctx, client.ObjectKeyFromObject(mf.APIserverNetworkPolicy), npAPI); ret.APIserverNetworkPolicyError == nil {
186+
ret.Existing.APIserverNetworkPolicy = npAPI
187+
}
161188
return ret
162189
}
163190

0 commit comments

Comments
 (0)