Skip to content

Commit 8b9775f

Browse files
committed
Use permissive Egress rule for DNS/API server
1 parent 31d9963 commit 8b9775f

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}
@@ -938,7 +936,7 @@ func (r *ReconcileWebSphereLiberty) getEndpoints(serviceName string, namespace s
938936
}
939937
}
940938

941-
func (r *ReconcileWebSphereLiberty) getDNSEgressRule(reqLogger logr.Logger, endpointsName string, endpointsNamespace string) networkingv1.NetworkPolicyEgressRule {
939+
func (r *ReconcileWebSphereLiberty) getDNSEgressRule(reqLogger logr.Logger, endpointsName string, endpointsNamespace string) (bool, networkingv1.NetworkPolicyEgressRule) {
942940
dnsRule := networkingv1.NetworkPolicyEgressRule{}
943941
if dnsEndpoints, err := r.getEndpoints(endpointsName, endpointsNamespace); err == nil {
944942
if endpointPort := lutils.GetEndpointPortByName(&dnsEndpoints.Subsets[0].Ports, "dns"); endpointPort != nil {
@@ -955,16 +953,11 @@ func (r *ReconcileWebSphereLiberty) getDNSEgressRule(reqLogger logr.Logger, endp
955953
}
956954
dnsRule.To = append(dnsRule.To, peer)
957955
reqLogger.Info("Found endpoints for " + endpointsName + " service in the " + endpointsNamespace + " namespace")
958-
} else {
959-
peer := networkingv1.NetworkPolicyPeer{}
960-
peer.NamespaceSelector = &metav1.LabelSelector{
961-
MatchLabels: map[string]string{},
962-
}
963-
peer.PodSelector = &metav1.LabelSelector{
964-
MatchLabels: map[string]string{},
965-
}
966-
dnsRule.To = append(dnsRule.To, peer)
967-
reqLogger.Info("Failed to retrieve endpoints for " + endpointsName + " service in the " + endpointsNamespace + " namespace. Using more permissive rule.")
956+
return false, dnsRule
968957
}
969-
return dnsRule
958+
// use permissive rule
959+
// egress:
960+
// - {}
961+
reqLogger.Info("Failed to retrieve endpoints for " + endpointsName + " service in the " + endpointsNamespace + " namespace. Using more permissive rule.")
962+
return true, dnsRule
970963
}

0 commit comments

Comments
 (0)