My notes to "Bug 1768608 - NetworkPolicy not applied to router"
Baremetal OpenShift 4.2.0
$ oc version
Client Version: openshift-clients-4.3.0-201909231341
Server Version: 4.2.0
Kubernetes Version: v1.14.6+2e5ed54
Network policy documentation: https://docs.openshift.com/container-platform/4.2/networking/configuring-networkpolicy.html#nw-networkpolicy-multitenant-isolation_configuring-networkpolicy-plugin
oc new-project np-test
oc new-app nginx-example
oc logs -f bc/nginx-example
$ oc get pods -n np-test -o wide -n np-test
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-example-1-ls67j 1/1 Running 0 5d1h 10.131.0.14 compute-0 <none> <none>
$ oc get pods -o wide -n openshift-ingress
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
router-default-c89f748f7-qldrg 1/1 Running 0 5d5h 192.168.51.15 compute-2 <none> <none>
router-default-c89f748f7-qxf7q 1/1 Running 0 5d5h 192.168.51.13 compute-0 <none> <none>
$ oc rsh router-default-c89f748f7-qxf7q curl -I http://10.131.0.14:8080/
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Sat, 16 Nov 2019 17:48:42 GMT
Content-Type: text/html
Content-Length: 37451
Last-Modified: Mon, 11 Nov 2019 16:14:50 GMT
Connection: keep-alive
ETag: "5dc988fa-924b"
Accept-Ranges: bytes
$ oc rsh router-default-c89f748f7-qldrg curl -I http://10.131.0.14:8080/
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Sat, 16 Nov 2019 17:49:03 GMT
Content-Type: text/html
Content-Length: 37451
Last-Modified: Mon, 11 Nov 2019 16:14:50 GMT
Connection: keep-alive
ETag: "5dc988fa-924b"
Accept-Ranges: bytes
Source | Target | Expected result | Result |
---|---|---|---|
router pod on compute-0 | app pod on compute-0 | PASS | PASS |
router pod on compute-2 | app pod on compute-0 | PASS | PASS |
oc create -n np-test -f - <<EOF
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-by-default
spec:
podSelector:
ingress: []
EOF
$ oc get networkpolicies -n np-test
NAME POD-SELECTOR AGE
allow-from-openshift-ingress <none> 7m28s
deny-by-default <none> 4m20s
$ oc get pods -n np-test -o wide -n np-test
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-example-1-ls67j 1/1 Running 0 5d1h 10.131.0.14 compute-0 <none> <none>
$ oc get pods -o wide -n openshift-ingress
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
router-default-c89f748f7-qldrg 1/1 Running 0 5d5h 192.168.51.15 compute-2 <none> <none>
router-default-c89f748f7-qxf7q 1/1 Running 0 5d5h 192.168.51.13 compute-0 <none> <none>
$ oc rsh router-default-c89f748f7-qxf7q curl -I http://10.131.0.14:8080/
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Sat, 16 Nov 2019 17:54:59 GMT
Content-Type: text/html
Content-Length: 37451
Last-Modified: Mon, 11 Nov 2019 16:14:50 GMT
Connection: keep-alive
ETag: "5dc988fa-924b"
Accept-Ranges: bytes
$ oc rsh router-default-c89f748f7-qldrg curl -I http://10.131.0.14:8080/
$
Source | Target | Expected result | Result |
---|---|---|---|
router pod on compute-0 | app pod on compute-0 | FAIL | PASS |
router pod on compute-2 | app pod on compute-0 | FAIL | FAIL |
oc create -n np-test -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-openshift-ingress
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
network.openshift.io/policy-group: ingress
podSelector: {}
policyTypes:
- Ingress
EOF
$ oc get pods -n np-test -o wide -n np-test
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-example-1-ls67j 1/1 Running 0 5d1h 10.131.0.14 compute-0 <none> <none>
$ oc get pods -o wide -n openshift-ingress
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
router-default-c89f748f7-qldrg 1/1 Running 0 5d5h 192.168.51.15 compute-2 <none> <none>
router-default-c89f748f7-qxf7q 1/1 Running 0 5d5h 192.168.51.13 compute-0 <none> <none>
$ oc rsh router-default-c89f748f7-qxf7q curl -I http://10.131.0.14:8080/
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Sat, 16 Nov 2019 17:57:40 GMT
Content-Type: text/html
Content-Length: 37451
Last-Modified: Mon, 11 Nov 2019 16:14:50 GMT
Connection: keep-alive
ETag: "5dc988fa-924b"
Accept-Ranges: bytes
$ oc rsh router-default-c89f748f7-qldrg curl -I http://10.131.0.14:8080/
$
Source | Target | Expected result | Result |
---|---|---|---|
router pod on compute-0 | app pod on compute-0 | PASS | PASS |
router pod on compute-2 | app pod on compute-0 | PASS | FAIL |
oc new-project hostnetwork
oc create sa hostnetwork
oc adm policy add-scc-to-user hostnetwork -z hostnetwork
oc apply -n hostnetwork -f - <<EOF
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: hostnetwork
spec:
selector:
matchLabels:
name: hostnetwork
template:
metadata:
labels:
name: hostnetwork
spec:
nodeSelector:
node-role.kubernetes.io/worker:
hostNetwork: true
containers:
- name: demo-http
image: quay.io/rbo/demo-http:master
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
EOF
oc apply -n hostnetwork -f - <<EOF
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: sdn
spec:
selector:
matchLabels:
name: sdn
template:
metadata:
labels:
name: sdn
spec:
nodeSelector:
node-role.kubernetes.io/worker:
containers:
- name: demo-http
image: quay.io/rbo/demo-http:master
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
EOF
oc label namespace/hostnetwork name=hostnetwork
oc create -n np-test -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-hostnetwork
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
name: hostnetwork
podSelector: {}
policyTypes:
- Ingress
EOF
oc get pods -n np-test -l app=nginx-example -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-example-1-ls67j 1/1 Running 0 6d4h 10.131.0.14 compute-0 <none> <none>
nginx-example-1-ssqnf 1/1 Running 0 3h11m 10.128.0.33 compute-1 <none> <none>
# pick on pod ip, nodename and fill in below
oc project hostnetwork
oc get pods -o name | while read line ; do echo 'echo -n "$HOSTNAME: Connect from $MY_NODE_NAME to TARGET_POD_NODE_NAME" ; curl -s --connect-timeout 1 -I http://TARGET_POD_IP:8080/ >/dev/null && echo "OK" || echo "FAIL"; '| oc rsh $line; done
Output:
compute-2: Connect from compute-2 to compute-1 FAIL
master-2: Connect from master-2 to compute-1 FAIL
master-0: Connect from master-0 to compute-1 FAIL
compute-0: Connect from compute-0 to compute-1 FAIL
compute-1: Connect from compute-1 to compute-1 OK
master-1: Connect from master-1 to compute-1 FAIL
sdn-4tfww: Connect from compute-1 to compute-1 OK
sdn-p88xb: Connect from master-2 to compute-1 OK
sdn-pv2rz: Connect from compute-0 to compute-1 OK
sdn-tfzj2: Connect from compute-2 to compute-1 OK
sdn-tngpc: Connect from master-1 to compute-1 OK
sdn-z276l: Connect from master-0 to compute-1 OK