Skip to content

Commit feb7f61

Browse files
kabicinKirby Chin
authored andcommitted
Use permissive Egress rule for DNS/API server
1 parent 5410585 commit feb7f61

File tree

1 file changed

+22
-29
lines changed

1 file changed

+22
-29
lines changed

controllers/webspherelibertyapplication_controller.go

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ func (r *ReconcileWebSphereLiberty) Reconcile(ctx context.Context, request ctrl.
404404

405405
// Kube API Server NetworkPolicy (based upon impl. by Martin Smithson)
406406
apiServerNetworkPolicy := &networkingv1.NetworkPolicy{ObjectMeta: metav1.ObjectMeta{
407-
Name: instance.Name + "-egress-apiserver-access",
407+
Name: instance.Name + "-egress-dns-and-apiserver-access",
408408
Namespace: instance.Namespace,
409409
}}
410410
err = r.CreateOrUpdate(apiServerNetworkPolicy, instance, func() error {
@@ -416,16 +416,20 @@ func (r *ReconcileWebSphereLiberty) Reconcile(ctx context.Context, request ctrl.
416416
apiServerNetworkPolicy.Spec.Egress = make([]networkingv1.NetworkPolicyEgressRule, 0)
417417

418418
var dnsRule networkingv1.NetworkPolicyEgressRule
419-
// Add OpenShift DNS NetworkPolicy (if applicable)
419+
var usingPermissiveRule bool
420+
// If allowed, add an Egress rule to access the OpenShift DNS or K8s CoreDNS. Otherwise, use a permissive cluster-wide Egress rule.
420421
if r.IsOpenShift() {
421-
dnsRule = r.getDNSEgressRule(reqLogger, "dns-default", "openshift-dns")
422-
} else { // Otherwise, support CoreDNS NetworkPolicy by default
423-
dnsRule = r.getDNSEgressRule(reqLogger, "kube-dns", "kube-system")
422+
usingPermissiveRule, dnsRule = r.getDNSEgressRule(reqLogger, "dns-default", "openshift-dns")
423+
} else {
424+
usingPermissiveRule, dnsRule = r.getDNSEgressRule(reqLogger, "kube-dns", "kube-system")
424425
}
425426
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, dnsRule)
426427

427-
rule := networkingv1.NetworkPolicyEgressRule{}
428+
// If allowed, add an Egress rule to access the API server.
429+
// Otherwise, if the OpenShift DNS or K8s CoreDNS Egress rule does not provide permissive cluster-wide access
430+
// and the K8s API server could not be found, use a permissive cluster-wide Egress rule.
428431
if apiServerEndpoints, err := r.getEndpoints("kubernetes", "default"); err == nil {
432+
rule := networkingv1.NetworkPolicyEgressRule{}
429433
// Define the port
430434
port := networkingv1.NetworkPolicyPort{}
431435
port.Protocol = &apiServerEndpoints.Subsets[0].Ports[0].Protocol
@@ -444,19 +448,13 @@ func (r *ReconcileWebSphereLiberty) Reconcile(ctx context.Context, request ctrl.
444448
rule.To = append(rule.To, peer)
445449
}
446450
}
451+
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, rule)
452+
reqLogger.Info("Found endpoints for kubernetes service in the default namespace")
453+
} else if !usingPermissiveRule {
454+
rule := networkingv1.NetworkPolicyEgressRule{}
455+
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, rule)
447456
reqLogger.Info("Found endpoints for kubernetes service in the default namespace")
448-
} else {
449-
peer := networkingv1.NetworkPolicyPeer{}
450-
peer.NamespaceSelector = &metav1.LabelSelector{
451-
MatchLabels: map[string]string{},
452-
}
453-
peer.PodSelector = &metav1.LabelSelector{
454-
MatchLabels: map[string]string{},
455-
}
456-
rule.To = append(rule.To, peer)
457-
reqLogger.Info("Failed to retrieve endpoints for kubernetes service in the default namespace. Using more permissive rule.")
458457
}
459-
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, rule)
460458
apiServerNetworkPolicy.Labels = ba.GetLabels()
461459
apiServerNetworkPolicy.Annotations = oputils.MergeMaps(apiServerNetworkPolicy.Annotations, ba.GetAnnotations())
462460
apiServerNetworkPolicy.Spec.PolicyTypes = []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}
@@ -968,7 +966,7 @@ func (r *ReconcileWebSphereLiberty) getEndpoints(serviceName string, namespace s
968966
}
969967
}
970968

971-
func (r *ReconcileWebSphereLiberty) getDNSEgressRule(reqLogger logr.Logger, endpointsName string, endpointsNamespace string) networkingv1.NetworkPolicyEgressRule {
969+
func (r *ReconcileWebSphereLiberty) getDNSEgressRule(reqLogger logr.Logger, endpointsName string, endpointsNamespace string) (bool, networkingv1.NetworkPolicyEgressRule) {
972970
dnsRule := networkingv1.NetworkPolicyEgressRule{}
973971
if dnsEndpoints, err := r.getEndpoints(endpointsName, endpointsNamespace); err == nil {
974972
if endpointPort := lutils.GetEndpointPortByName(&dnsEndpoints.Subsets[0].Ports, "dns"); endpointPort != nil {
@@ -985,16 +983,11 @@ func (r *ReconcileWebSphereLiberty) getDNSEgressRule(reqLogger logr.Logger, endp
985983
}
986984
dnsRule.To = append(dnsRule.To, peer)
987985
reqLogger.Info("Found endpoints for " + endpointsName + " service in the " + endpointsNamespace + " namespace")
988-
} else {
989-
peer := networkingv1.NetworkPolicyPeer{}
990-
peer.NamespaceSelector = &metav1.LabelSelector{
991-
MatchLabels: map[string]string{},
992-
}
993-
peer.PodSelector = &metav1.LabelSelector{
994-
MatchLabels: map[string]string{},
995-
}
996-
dnsRule.To = append(dnsRule.To, peer)
997-
reqLogger.Info("Failed to retrieve endpoints for " + endpointsName + " service in the " + endpointsNamespace + " namespace. Using more permissive rule.")
986+
return false, dnsRule
998987
}
999-
return dnsRule
988+
// use permissive rule
989+
// egress:
990+
// - {}
991+
reqLogger.Info("Failed to retrieve endpoints for " + endpointsName + " service in the " + endpointsNamespace + " namespace. Using more permissive rule.")
992+
return true, dnsRule
1000993
}

0 commit comments

Comments
 (0)