feat: disable network policies generation by default (#1629)

* feat: disable network policies default generation

Signed-off-by: AhmedGrati <ahmedgrati1999@gmail.com>

* docs: add the generate-network-policies flag to user guide

Signed-off-by: AhmedGrati <ahmedgrati1999@gmail.com>

* test: add unit tests of the network policies generation

Signed-off-by: AhmedGrati <ahmedgrati1999@gmail.com>

---------

Signed-off-by: AhmedGrati <ahmedgrati1999@gmail.com>
This commit is contained in:
AhmedGrati 2023-07-05 11:26:37 +01:00 committed by GitHub
parent 485cd2f163
commit f7bee839ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 112 additions and 423 deletions

View File

@ -50,6 +50,7 @@ var (
ConvertPushImageRegistry string
ConvertOpt kobject.ConvertOptions
ConvertYAMLIndent int
GenerateNetworkPolicies bool
UpBuild string
@ -116,6 +117,7 @@ var convertCmd = &cobra.Command{
ServiceGroupMode: ServiceGroupMode,
ServiceGroupName: ServiceGroupName,
SecretsAsFiles: SecretsAsFiles,
GenerateNetworkPolicies: GenerateNetworkPolicies,
}
if ServiceGroupMode == "" && MultipleContainerMode {
@ -178,6 +180,7 @@ func init() {
convertCmd.Flags().IntVar(&ConvertReplicas, "replicas", 1, "Specify the number of replicas in the generated resource spec")
convertCmd.Flags().StringVar(&ConvertVolumes, "volumes", "persistentVolumeClaim", `Volumes to be generated ("persistentVolumeClaim"|"emptyDir"|"hostPath" | "configMap")`)
convertCmd.Flags().StringVar(&ConvertPVCRequestSize, "pvc-request-size", "", `Specify the size of pvc storage requests in the generated resource spec`)
convertCmd.Flags().BoolVar(&GenerateNetworkPolicies, "generate-network-policies", false, "Specify whether to generate network policies or not.")
convertCmd.Flags().BoolVar(&WithKomposeAnnotation, "with-kompose-annotation", true, "Add kompose annotations to generated resource")

View File

@ -495,6 +495,10 @@ If the Docker Compose file has service name with `_` or `.` in it (eg.`web_servi
Please note that changing service name might break some `docker-compose` files.
## Network policies generation
[Network policies](https://kubernetes.io/docs/concepts/services-networking/network-policies) are not generated by default, because it's not mandatory to deploy your application. However, it's one of the best practices when it comes to deploy secure applications on top of Kubernetes.
To generate network policies, all you need is to use the `--generate-network-policies` flag.
## Build and push image
If the Docker Compose file has `build` or `build:context, build:dockerfile` keys, build will run when `--build` specified.
@ -503,6 +507,7 @@ And Image will push to _docker.io_ (default) when `--push-image=true` specified.
It is possible to push to custom registry by specify `--push-image-registry`, which will override the registry from image name.
### Authentication on registry
Kompose uses the docker authentication from file `$DOCKER_CONFIG/config.json`, `$HOME/.docker/config.json`, and `$HOME/.dockercfg` after `docker login`.

View File

@ -83,6 +83,7 @@ type ConvertOptions struct {
ServiceGroupMode string
ServiceGroupName string
SecretsAsFiles bool
GenerateNetworkPolicies bool
}
// IsPodController indicate if the user want to use a controller

View File

@ -1519,10 +1519,12 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
return nil, errors.Wrap(err, "Error transforming Kubernetes objects")
}
if opt.GenerateNetworkPolicies {
if err = k.configNetworkPolicyForService(service, service.Name, &objects); err != nil {
return nil, err
}
}
}
allobjects = append(allobjects, objects...)
}
@ -1560,9 +1562,11 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
if err != nil {
return nil, errors.Wrap(err, "Error transforming Kubernetes objects")
}
if opt.GenerateNetworkPolicies {
if err := k.configNetworkPolicyForService(service, name, &objects); err != nil {
return nil, err
}
}
allobjects = append(allobjects, objects...)
}

View File

@ -32,6 +32,7 @@ import (
"github.com/pkg/errors"
appsv1 "k8s.io/api/apps/v1"
api "k8s.io/api/core/v1"
networkingv1 "k8s.io/api/networking/v1"
networkingv1beta1 "k8s.io/api/networking/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@ -327,15 +328,15 @@ func TestKomposeConvert(t *testing.T) {
expectedNumObjs int
}{
// objects generated are deployment, service nework policies (2) and pvc
"Convert to Deployments (D)": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, Replicas: replicas, IsReplicaSetFlag: true}, 6},
"Convert to Deployments (D) with v3 replicas": {newKomposeObject(), kobject.ConvertOptions{CreateD: true}, 6},
"Convert to DaemonSets (DS)": {newKomposeObject(), kobject.ConvertOptions{CreateDS: true}, 6},
"Convert to Deployments (D)": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, Replicas: replicas, IsReplicaSetFlag: true}, 4},
"Convert to Deployments (D) with v3 replicas": {newKomposeObject(), kobject.ConvertOptions{CreateD: true}, 4},
"Convert to DaemonSets (DS)": {newKomposeObject(), kobject.ConvertOptions{CreateDS: true}, 4},
// objects generated are deployment, daemonset, ReplicationController, service and pvc
"Convert to D, DS, and RC": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, CreateDS: true, CreateRC: true, Replicas: replicas, IsReplicaSetFlag: true}, 7},
"Convert to D, DS, and RC with v3 replicas": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, CreateDS: true, CreateRC: true}, 7},
"Convert to D, DS, and RC": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, CreateDS: true, CreateRC: true, Replicas: replicas, IsReplicaSetFlag: true}, 5},
"Convert to D, DS, and RC with v3 replicas": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, CreateDS: true, CreateRC: true}, 5},
// objects generated are statefulset
"Convert to SS with replicas ": {newKomposeObject(), kobject.ConvertOptions{Controller: StatefulStateController, Replicas: replicas, IsReplicaSetFlag: true}, 5},
"Convert to SS without replicas": {newKomposeObject(), kobject.ConvertOptions{Controller: StatefulStateController}, 5},
"Convert to SS with replicas ": {newKomposeObject(), kobject.ConvertOptions{Controller: StatefulStateController, Replicas: replicas, IsReplicaSetFlag: true}, 3},
"Convert to SS without replicas": {newKomposeObject(), kobject.ConvertOptions{Controller: StatefulStateController}, 3},
}
for name, test := range testCases {
@ -1051,3 +1052,23 @@ func TestVolumeMountSubPath(t *testing.T) {
}
}
}
func TestNetworkPoliciesGeneration(t *testing.T) {
groupName := "pod_group"
komposeObject := kobject.KomposeObject{
ServiceConfigs: map[string]kobject.ServiceConfig{"app": newServiceConfig()},
}
k := Kubernetes{}
objs, err := k.Transform(komposeObject, kobject.ConvertOptions{ServiceGroupMode: groupName, GenerateNetworkPolicies: true})
if err != nil {
t.Error(errors.Wrap(err, "k.Transform failed"))
}
for _, obj := range objs {
if np, ok := obj.(*networkingv1.NetworkPolicy); ok {
matchLabelsLength := len(np.Spec.PodSelector.MatchLabels)
if matchLabelsLength == 0 {
t.Errorf("Expected length of Network Policy PodSelector to be greater than 0, got %v", matchLabelsLength)
}
}
}
}

View File

@ -267,3 +267,8 @@ os_cmd="kompose --provider=openshift -f $KOMPOSE_ROOT/script/test/fixtures/vols-
os_output="$KOMPOSE_ROOT/script/test/fixtures/vols-subpath/output-os.yaml"
convert::expect_success_and_warning "$k8s_cmd" "$k8s_output"
convert::expect_success "$os_cmd" "$os_output"
# Test support for network policies generation
k8s_cmd="kompose -f $KOMPOSE_ROOT/script/test/fixtures/network-policies/docker-compose.yaml convert --generate-network-policies --stdout --with-kompose-annotation=false"
k8s_output="$KOMPOSE_ROOT/script/test/fixtures/network-policies/output-k8s.yaml"
convert::expect_success "$os_cmd" "$os_output"

View File

@ -27,6 +27,7 @@ $KOMPOSE_ROOT/kompose -f $KOMPOSE_ROOT/script/test/fixtures/single-file-output/d
$KOMPOSE_ROOT/kompose -f $KOMPOSE_ROOT/script/test/fixtures/host-port-protocol/docker-compose.yaml convert --stdout --with-kompose-annotation=false > $KOMPOSE_ROOT/script/test/fixtures/host-port-protocol/output-k8s.yaml
$KOMPOSE_ROOT/kompose -f $KOMPOSE_ROOT/script/test/fixtures/external-traffic-policy/docker-compose-v1.yaml convert --stdout --with-kompose-annotation=false > $KOMPOSE_ROOT/script/test/fixtures/external-traffic-policy/output-k8s-v1.yaml
$KOMPOSE_ROOT/kompose -f $KOMPOSE_ROOT/script/test/fixtures/external-traffic-policy/docker-compose-v2.yaml convert --stdout --with-kompose-annotation=false > $KOMPOSE_ROOT/script/test/fixtures/external-traffic-policy/output-k8s-v2.yaml
$KOMPOSE_ROOT/kompose -f $KOMPOSE_ROOT/script/test/fixtures/compose-file-support/compose.yaml convert --stdout --with-kompose-annotation=false > $KOMPOSE_ROOT/script/test/fixtures/compose-file-support/output-k8s.yaml
fi
if $UPDATE_OS ; then

View File

@ -69,22 +69,6 @@ spec:
restartPolicy: Always
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: change-in-volume-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/change-in-volume-default: "true"
podSelector:
matchLabels:
io.kompose.network/change-in-volume-default: "true"
---
apiVersion: apps/v1
kind: Deployment

View File

@ -69,22 +69,6 @@ spec:
restartPolicy: Always
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: change-in-volume-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/change-in-volume-default: "true"
podSelector:
matchLabels:
io.kompose.network/change-in-volume-default: "true"
---
apiVersion: apps/v1
kind: Deployment
@ -115,6 +99,8 @@ spec:
name: web
ports:
- containerPort: 5000
hostPort: 5000
protocol: TCP
resources: {}
volumeMounts:
- mountPath: /code

View File

@ -2,9 +2,6 @@
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: ./kompose convert --stdout
kompose.version: 1.28.0 (4d1ce961)
creationTimestamp: null
labels:
io.kompose.service: web
@ -23,9 +20,6 @@ status:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: ./kompose convert --stdout
kompose.version: 1.28.0 (4d1ce961)
creationTimestamp: null
labels:
io.kompose.service: web
@ -38,12 +32,9 @@ spec:
strategy: {}
template:
metadata:
annotations:
kompose.cmd: ./kompose convert --stdout
kompose.version: 1.28.0 (4d1ce961)
creationTimestamp: null
labels:
io.kompose.network/kompose-default: "true"
io.kompose.network/compose-file-support-default: "true"
io.kompose.service: web
spec:
containers:
@ -57,19 +48,3 @@ spec:
restartPolicy: Always
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: kompose-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/kompose-default: "true"
podSelector:
matchLabels:
io.kompose.network/kompose-default: "true"

View File

@ -55,22 +55,6 @@ metadata:
io.kompose.service: db
name: db-cm0
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: configmap-volume-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/configmap-volume-default: "true"
podSelector:
matchLabels:
io.kompose.network/configmap-volume-default: "true"
---
apiVersion: apps/v1
kind: Deployment

View File

@ -51,22 +51,6 @@ metadata:
io.kompose.service: db
name: db-cm0
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: configmap-volume-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/configmap-volume-default: "true"
podSelector:
matchLabels:
io.kompose.network/configmap-volume-default: "true"
---
apiVersion: apps/v1
kind: Deployment

View File

@ -77,19 +77,3 @@ spec:
whenUnsatisfiable: ScheduleAnyway
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: placement-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/placement-default: "true"
podSelector:
matchLabels:
io.kompose.network/placement-default: "true"

View File

@ -34,19 +34,3 @@ spec:
restartPolicy: Always
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: envvars-interpolation-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/envvars-interpolation-default: "true"
podSelector:
matchLabels:
io.kompose.network/envvars-interpolation-default: "true"

View File

@ -69,22 +69,6 @@ spec:
restartPolicy: Always
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: expose-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/expose-default: "true"
podSelector:
matchLabels:
io.kompose.network/expose-default: "true"
---
apiVersion: apps/v1
kind: Deployment

View File

@ -68,18 +68,3 @@ spec:
restartPolicy: Always
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: external-traffic-policy-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/external-traffic-policy-default: "true"
podSelector:
matchLabels:
io.kompose.network/external-traffic-policy-default: "true"

View File

@ -97,19 +97,3 @@ spec:
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: external-traffic-policy-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/external-traffic-policy-default: "true"
podSelector:
matchLabels:
io.kompose.network/external-traffic-policy-default: "true"

View File

@ -172,22 +172,6 @@ spec:
restartPolicy: Always
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: healthcheck-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/healthcheck-default: "true"
podSelector:
matchLabels:
io.kompose.network/healthcheck-default: "true"
---
apiVersion: apps/v1
kind: Deployment

View File

@ -48,19 +48,3 @@ spec:
restartPolicy: Always
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: host-port-protocol-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/host-port-protocol-default: "true"
podSelector:
matchLabels:
io.kompose.network/host-port-protocol-default: "true"

View File

@ -26,22 +26,6 @@ spec:
restartPolicy: Always
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: multiple-files-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/multiple-files-default: "true"
podSelector:
matchLabels:
io.kompose.network/multiple-files-default: "true"
---
apiVersion: apps/v1
kind: Deployment

View File

@ -54,22 +54,6 @@ spec:
storage: 100Mi
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: multiple-type-volumes-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/multiple-type-volumes-default: "true"
podSelector:
matchLabels:
io.kompose.network/multiple-type-volumes-default: "true"
---
apiVersion: apps/v1
kind: Deployment

View File

@ -0,0 +1,10 @@
version: '3.8'
networks:
web:
services:
nginx:
image: nginx
networks:
- web

View File

@ -0,0 +1,44 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
io.kompose.service: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
io.kompose.network/network-policies-web: "true"
io.kompose.service: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}
restartPolicy: Always
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: network-policies-web
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/network-policies-web: "true"
podSelector:
matchLabels:
io.kompose.network/network-policies-web: "true"

View File

@ -85,19 +85,3 @@ spec:
storage: 100Mi
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: service-group-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/service-group-default: "true"
podSelector:
matchLabels:
io.kompose.network/service-group-default: "true"

View File

@ -87,19 +87,3 @@ spec:
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: single-file-output-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/single-file-output-default: "true"
podSelector:
matchLabels:
io.kompose.network/single-file-output-default: "true"

View File

@ -97,22 +97,6 @@ spec:
status:
replicas: 0
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: statefulset-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/statefulset-default: "true"
podSelector:
matchLabels:
io.kompose.network/statefulset-default: "true"
---
apiVersion: apps/v1
kind: StatefulSet

View File

@ -53,102 +53,6 @@ spec:
restartPolicy: Always
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: normalized-network
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/normalized-network: "true"
podSelector:
matchLabels:
io.kompose.network/normalized-network: "true"
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: v30-normalized-network
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/v30-normalized-network: "true"
podSelector:
matchLabels:
io.kompose.network/v30-normalized-network: "true"
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: app-network
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/normalized-network: "true"
podSelector:
matchLabels:
io.kompose.network/normalized-network: "true"
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: app-network
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/app-network: "true"
podSelector:
matchLabels:
io.kompose.network/app-network: "true"
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: web-network
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/web-network: "true"
podSelector:
matchLabels:
io.kompose.network/web-network: "true"
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: normalized-network
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/normalized-network: "true"
podSelector:
matchLabels:
io.kompose.network/normalized-network: "true"
---
apiVersion: apps/v1
kind: Deployment
@ -188,18 +92,3 @@ spec:
restartPolicy: Always
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: v30-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/v30-default: "true"
podSelector:
matchLabels:
io.kompose.network/v30-default: "true"

View File

@ -71,19 +71,3 @@ spec:
storage: 100Mi
status: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
name: windows-default
spec:
ingress:
- from:
- podSelector:
matchLabels:
io.kompose.network/windows-default: "true"
podSelector:
matchLabels:
io.kompose.network/windows-default: "true"