{"id":49337,"date":"2025-05-16T15:47:57","date_gmt":"2025-05-16T15:47:57","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49337"},"modified":"2025-07-12T05:54:56","modified_gmt":"2025-07-12T05:54:56","slug":"openshift-practical-guide-to-networkpolicy","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/openshift-practical-guide-to-networkpolicy\/","title":{"rendered":"OpenShift &#8211; Practical Guide to NetworkPolicy"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>URL &#8211; https:\/\/www.devopsschool.com\/blog\/kubernetes-cks-network-policy-example-code\/<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udd10 OpenShift NetworkPolicies Tutorial (with <code>httpd<\/code> in <code>test2<\/code> namespace)<\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfaf Goal<\/h2>\n\n\n\n<p>You will:<\/p>\n\n\n\n<p>\u2705 Deploy an <code>httpd<\/code> server<br>\u2705 Launch test clients to access it<br>\u2705 Apply <code>NetworkPolicy<\/code> to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u274c Block all traffic<\/li>\n\n\n\n<li>\u2705 Allow traffic only from specific labeled pods<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd27 Prerequisites<\/h2>\n\n\n\n<p>You already have:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>httpd<\/code> deployed using ImageStream (<code>oc new-app httpd -n test2<\/code>)<\/li>\n\n\n\n<li><code>oc expose svc\/httpd -n test2<\/code> run (optional, for browser access)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Step-by-Step Guide<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 Step 1: Check Internal Access to <code>httpd<\/code><\/h3>\n\n\n\n<p>Create a <strong>PSA-compliant test pod<\/strong> and try connecting to the <code>httpd<\/code> service:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc run test-client \\\n  --rm -it \\\n  --restart=Never \\\n  --image=busybox:<span class=\"hljs-number\">1.35<\/span> \\\n  -n test2 \\\n  --overrides=<span class=\"hljs-string\">'\n{\n  \"apiVersion\": \"v1\",\n  \"spec\": {\n    \"securityContext\": {\n      \"runAsNonRoot\": true,\n      \"seccompProfile\": { \"type\": \"RuntimeDefault\" }\n    },\n    \"containers\": &#91;{\n      \"name\": \"test-client\",\n      \"image\": \"busybox:1.35\",\n      \"command\": &#91;\"sh\"],\n      \"stdin\": true,\n      \"tty\": true,\n      \"securityContext\": {\n        \"allowPrivilegeEscalation\": false,\n        \"capabilities\": {\n          \"drop\": &#91;\"ALL\"]\n        },\n        \"runAsNonRoot\": true\n      }\n    }]\n  }\n}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Inside the pod:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">wget -qO- httpd\n<\/code><\/span><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u2705 This should return a response \u2014 all traffic is allowed by default.<\/p>\n<\/blockquote>\n\n\n\n<p>Exit:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">exit<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udeab Step 2: Block All Ingress Traffic to <code>httpd<\/code><\/h3>\n\n\n\n<p>Create a deny-all <code>NetworkPolicy<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">cat &lt;&lt;EOF | oc apply -n test2 -f -\napiVersion: networking.k8s.io\/v1\nkind: NetworkPolicy\nmetadata:\n  name: deny-all-to-httpd\nspec:\n  podSelector:\n    matchLabels:\n      deployment: httpd\n  policyTypes:\n    - Ingress\nEOF\n<\/code><\/span><\/pre>\n\n\n<p>This <strong>blocks all ingress<\/strong> to <code>httpd<\/code> pods.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd01 Step 3: Retest (Should Fail Now)<\/h3>\n\n\n\n<p>Run the same <code>test-client<\/code> pod again and try:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">wget -qO- httpd\n<\/code><\/span><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u274c It should now <strong>fail<\/strong> \u2014 because ingress to <code>httpd<\/code> is blocked.<\/p>\n<\/blockquote>\n\n\n\n<p>Exit:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">exit<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 Step 4: Allow Labeled Pods to Access <code>httpd<\/code><\/h3>\n\n\n\n<p>Deploy a new client pod with <code>access=allowed<\/code> label:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc run allowed-client \\\n  --rm -it \\\n  --restart=Never \\\n  --image=busybox:<span class=\"hljs-number\">1.35<\/span> \\\n  --labels=<span class=\"hljs-string\">\"access=allowed\"<\/span> \\\n  -n test2 \\\n  --overrides=<span class=\"hljs-string\">'\n{\n  \"apiVersion\": \"v1\",\n  \"spec\": {\n    \"securityContext\": {\n      \"runAsNonRoot\": true,\n      \"seccompProfile\": { \"type\": \"RuntimeDefault\" }\n    },\n    \"containers\": &#91;{\n      \"name\": \"allowed-client\",\n      \"image\": \"busybox:1.35\",\n      \"command\": &#91;\"sh\"],\n      \"stdin\": true,\n      \"tty\": true,\n      \"securityContext\": {\n        \"allowPrivilegeEscalation\": false,\n        \"capabilities\": {\n          \"drop\": &#91;\"ALL\"]\n        },\n        \"runAsNonRoot\": true\n      }\n    }]\n  }\n}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Now create a policy to allow only that pod label:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &lt;&lt;EOF | oc apply -n test2 -f -\napiVersion: networking.k8s.io\/v1\n<span class=\"hljs-attr\">kind<\/span>: NetworkPolicy\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: allow-<span class=\"hljs-keyword\">from<\/span>-allowed\n<span class=\"hljs-attr\">spec<\/span>:\n  podSelector:\n    matchLabels:\n      deployment: httpd\n  <span class=\"hljs-attr\">ingress<\/span>:\n    - <span class=\"hljs-keyword\">from<\/span>:\n        - podSelector:\n            matchLabels:\n              access: allowed\n  <span class=\"hljs-attr\">policyTypes<\/span>:\n    - Ingress\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Inside the pod:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">wget -qO- httpd\n<\/code><\/span><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u2705 This should now <strong>succeed<\/strong> \u2014 because the pod is allowed.<\/p>\n<\/blockquote>\n\n\n\n<p>Exit:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">exit<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u274c Step 5: Verify Denial from Unlabeled Pods<\/h3>\n\n\n\n<p>Run another test pod <strong>without<\/strong> label:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc run denied-client \\\n  --rm -it \\\n  --restart=Never \\\n  --image=busybox:<span class=\"hljs-number\">1.35<\/span> \\\n  -n test2 \\\n  --overrides=<span class=\"hljs-string\">'\n{\n  \"apiVersion\": \"v1\",\n  \"spec\": {\n    \"securityContext\": {\n      \"runAsNonRoot\": true,\n      \"seccompProfile\": { \"type\": \"RuntimeDefault\" }\n    },\n    \"containers\": &#91;{\n      \"name\": \"denied-client\",\n      \"image\": \"busybox:1.35\",\n      \"command\": &#91;\"sh\"],\n      \"stdin\": true,\n      \"tty\": true,\n      \"securityContext\": {\n        \"allowPrivilegeEscalation\": false,\n        \"capabilities\": {\n          \"drop\": &#91;\"ALL\"]\n        },\n        \"runAsNonRoot\": true\n      }\n    }]\n  }\n}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Then:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">wget -qO- httpd\n<\/code><\/span><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u274c This should fail \u2014 the pod is not allowed by the NetworkPolicy.<\/p>\n<\/blockquote>\n\n\n\n<p>Exit:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">exit<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Summary Table<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Step<\/th><th>Result<\/th><\/tr><\/thead><tbody><tr><td>No policy<\/td><td>All pods can access <code>httpd<\/code><\/td><\/tr><tr><td>Deny-all policy<\/td><td>No pod can access <code>httpd<\/code><\/td><\/tr><tr><td>Allow from <code>access=allowed<\/code><\/td><td>Only labeled pods can access<\/td><\/tr><tr><td>Unlabeled pods<\/td><td>Access denied<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>URL &#8211; https:\/\/www.devopsschool.com\/blog\/kubernetes-cks-network-policy-example-code\/ \ud83d\udd10 OpenShift NetworkPolicies Tutorial (with httpd in test2 namespace) \ud83c\udfaf Goal You will: \u2705 Deploy an httpd server\u2705 Launch test clients to access it\u2705 Apply NetworkPolicy to:&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5153],"tags":[],"class_list":["post-49337","post","type-post","status-publish","format-standard","hentry","category-openshift"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49337","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49337"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49337\/revisions"}],"predecessor-version":[{"id":49765,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49337\/revisions\/49765"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49337"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49337"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}