Skip to content

Commit c64f443

Browse files
committed
Use permissive Egress rule for DNS/API server
1 parent 42f447d commit c64f443

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
@@ -400,7 +400,7 @@ func (r *ReconcileWebSphereLiberty) Reconcile(ctx context.Context, request ctrl.
400400

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

414414
var dnsRule networkingv1.NetworkPolicyEgressRule
415-
// Add OpenShift DNS NetworkPolicy (if applicable)
415+
var usingPermissiveRule bool
416+
// If allowed, add an Egress rule to access the OpenShift DNS or K8s CoreDNS. Otherwise, use a permissive cluster-wide Egress rule.
416417
if r.IsOpenShift() {
417-
dnsRule = r.getDNSEgressRule(reqLogger, "dns-default", "openshift-dns")
418-
} else { // Otherwise, support CoreDNS NetworkPolicy by default
419-
dnsRule = r.getDNSEgressRule(reqLogger, "kube-dns", "kube-system")
418+
usingPermissiveRule, dnsRule = r.getDNSEgressRule(reqLogger, "dns-default", "openshift-dns")
419+
} else {
420+
usingPermissiveRule, dnsRule = r.getDNSEgressRule(reqLogger, "kube-dns", "kube-system")
420421
}
421422
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, dnsRule)
422423

423-
rule := networkingv1.NetworkPolicyEgressRule{}
424+
// If allowed, add an Egress rule to access the API server.
425+
// Otherwise, if the OpenShift DNS or K8s CoreDNS Egress rule does not provide permissive cluster-wide access
426+
// and the K8s API server could not be found, use a permissive cluster-wide Egress rule.
424427
if apiServerEndpoints, err := r.getEndpoints("kubernetes", "default"); err == nil {
428+
rule := networkingv1.NetworkPolicyEgressRule{}
425429
// Define the port
426430
port := networkingv1.NetworkPolicyPort{}
427431
port.Protocol = &apiServerEndpoints.Subsets[0].Ports[0].Protocol
@@ -440,19 +444,13 @@ func (r *ReconcileWebSphereLiberty) Reconcile(ctx context.Context, request ctrl.
440444
rule.To = append(rule.To, peer)
441445
}
442446
}
447+
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, rule)
448+
reqLogger.Info("Found endpoints for kubernetes service in the default namespace")
449+
} else if !usingPermissiveRule {
450+
rule := networkingv1.NetworkPolicyEgressRule{}
451+
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, rule)
443452
reqLogger.Info("Found endpoints for kubernetes service in the default namespace")
444-
} else {
445-
peer := networkingv1.NetworkPolicyPeer{}
446-
peer.NamespaceSelector = &metav1.LabelSelector{
447-
MatchLabels: map[string]string{},
448-
}
449-
peer.PodSelector = &metav1.LabelSelector{
450-
MatchLabels: map[string]string{},
451-
}
452-
rule.To = append(rule.To, peer)
453-
reqLogger.Info("Failed to retrieve endpoints for kubernetes service in the default namespace. Using more permissive rule.")
454453
}
455-
apiServerNetworkPolicy.Spec.Egress = append(apiServerNetworkPolicy.Spec.Egress, rule)
456454
apiServerNetworkPolicy.Labels = ba.GetLabels()
457455
apiServerNetworkPolicy.Annotations = oputils.MergeMaps(apiServerNetworkPolicy.Annotations, ba.GetAnnotations())
458456
apiServerNetworkPolicy.Spec.PolicyTypes = []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}
@@ -963,7 +961,7 @@ func (r *ReconcileWebSphereLiberty) getEndpoints(serviceName string, namespace s
963961
}
964962
}
965963

966-
func (r *ReconcileWebSphereLiberty) getDNSEgressRule(reqLogger logr.Logger, endpointsName string, endpointsNamespace string) networkingv1.NetworkPolicyEgressRule {
964+
func (r *ReconcileWebSphereLiberty) getDNSEgressRule(reqLogger logr.Logger, endpointsName string, endpointsNamespace string) (bool, networkingv1.NetworkPolicyEgressRule) {
967965
dnsRule := networkingv1.NetworkPolicyEgressRule{}
968966
if dnsEndpoints, err := r.getEndpoints(endpointsName, endpointsNamespace); err == nil {
969967
if endpointPort := lutils.GetEndpointPortByName(&dnsEndpoints.Subsets[0].Ports, "dns"); endpointPort != nil {
@@ -980,16 +978,11 @@ func (r *ReconcileWebSphereLiberty) getDNSEgressRule(reqLogger logr.Logger, endp
980978
}
981979
dnsRule.To = append(dnsRule.To, peer)
982980
reqLogger.Info("Found endpoints for " + endpointsName + " service in the " + endpointsNamespace + " namespace")
983-
} else {
984-
peer := networkingv1.NetworkPolicyPeer{}
985-
peer.NamespaceSelector = &metav1.LabelSelector{
986-
MatchLabels: map[string]string{},
987-
}
988-
peer.PodSelector = &metav1.LabelSelector{
989-
MatchLabels: map[string]string{},
990-
}
991-
dnsRule.To = append(dnsRule.To, peer)
992-
reqLogger.Info("Failed to retrieve endpoints for " + endpointsName + " service in the " + endpointsNamespace + " namespace. Using more permissive rule.")
981+
return false, dnsRule
993982
}
994-
return dnsRule
983+
// use permissive rule
984+
// egress:
985+
// - {}
986+
reqLogger.Info("Failed to retrieve endpoints for " + endpointsName + " service in the " + endpointsNamespace + " namespace. Using more permissive rule.")
987+
return true, dnsRule
995988
}

0 commit comments

Comments
 (0)