{"id":12698,"date":"2023-01-17T12:05:32","date_gmt":"2023-01-17T06:35:32","guid":{"rendered":"https:\/\/opstree.com\/blog\/\/?p=12698"},"modified":"2023-01-17T12:05:32","modified_gmt":"2023-01-17T06:35:32","slug":"on-premise-setup-of-kubernetes-cluster-components-offline-mode-part-2","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2023\/01\/17\/on-premise-setup-of-kubernetes-cluster-components-offline-mode-part-2\/","title":{"rendered":"On-Premise Setup of Kubernetes Cluster Components (Offline Mode) &#8211; PART 2"},"content":{"rendered":"\n<p>In the previous blog, we discussed setting up Offline Kubernetes Cluster over on-premises servers. After setting up the Kubernetes cluster we need to have some basic components to manage the orchestration and monitoring of the Kubernetes Cluster which will help Horizontal Pod Autoscaler and Vertical Pod Autoscaler to get information about CPU\/Memory. Also, we have to limit access to all the components and Microservice we have set up for the SSO tool.<\/p>\n\n\n\n<p>To begin with, we need a service mesh tool to manage the traffic flow between multiple microservices and We have many tools for this like Istio, Linkerd, Cilium Service Mesh, Consul connect, etc. Here I am considering Istio.<\/p>\n\n\n\n<pre class=\"wp-block-verse has-white-color has-dark-gray-background-color has-text-color has-background has-medium-font-size\"><strong><em> Firstly, We will be talking Istio Setup over Kubernetes Cluster.<\/em><\/strong><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Istio is an open source service mesh that helps organizations<br>run distributed, microservices-based apps anywhere.<br>Istio enables organizations to secure, connect, and monitor<br>microservices, so they can modernize their enterprise apps more<br>swiftly and securely.<br>Istio allows organizations to deliver distributed applications at scale. It simplifies service-to-service network operations like traffic management, authorization, and encryption, as well as auditing and observability.<\/p>\n<\/blockquote>\n\n\n\n<!--more-->\n\n\n\n<p><strong>Istio URL <\/strong>: <a href=\"https:\/\/istio.io\/latest\/docs\/setup\/getting-started\/\" target=\"_blank\" rel=\"noopener\">https:\/\/istio.io\/latest\/docs\/setup\/getting-started\/ <\/a><\/p>\n\n\n\n<p><strong>1)<\/strong> From the upper link I have downloaded the Istio Binary to my local and pushed it to our Kubernetes Master node as a Zip file. <\/p>\n\n\n\n<p><strong>2)<\/strong> I have pulled all the 3 required images for Istio Setup and exported them as Zip to our Kubernetes Worker Nodes and load them to Worker Nodes using nerdctl command: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sudo \/usr\/local\/bin\/nerdctl --namespace k8s.io &lt; image.tar <\/strong><\/code><\/pre>\n\n\n\n<p><strong>3)<\/strong> Then I unzip the file over master and move the Istioctl Binary to \/usr\/local\/bin\/.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong> sudo mv istioctl \/usr\/local\/bin\/ <\/strong><\/code><\/pre>\n\n\n\n<p><strong>4)<\/strong> After all the settings I have run istioctl Install command <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sudo \/usr\/local\/bin\/istioctl install --set profile=demo -y Output: <\/strong><\/code><\/pre>\n\n\n\n<p><strong>5)<\/strong> Now we can check the pods under istio-system namespace.     <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sudo \/usr\/local\/bin\/kubectl get pods -n istio-syste<\/strong><\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-verse has-white-color has-dark-gray-background-color has-text-color has-background has-medium-font-size\"><strong><em>Secondly, We will be setting up Metrics Server<\/em><\/strong><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>The Kubernetes Metrics Server is a cluster-wide aggregator of resource usage data. The Kubernetes Metrics Server collects resource metrics from the kubelet running on each worker node and exposes<br>them in the Kubernetes API server through the Kubernetes Metrics API.<\/p>\n<\/blockquote>\n\n\n\n<p><br><strong>1)<\/strong> First of all we have to download the Manifest file of the Metrics server from the internet at our local machine.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><a href=\"https:\/\/github.com\/kubernetes-sigs\/metrics-server\/releases\/latest\/download\/components.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/kubernetes-sigs\/metrics-server\/releases\/latest\/download\/components.yaml<\/a><\/pre>\n\n\n\n<p><strong>2)<\/strong> Secondly we will be deploying the manifest file to our Kubernetes Cluster Master Node.<\/p>\n\n\n\n<p><strong>3)<\/strong> We can load Metrics server Image locally or We can push it to the connected ACR.<\/p>\n\n\n\n<p><strong>4)<\/strong> After all the settings we have to run only the command to deploy the Metrics server.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sudo \/usr\/local\/bin\/kubectl apply -f components.yaml -n kube-system<\/strong><\/code><\/pre>\n\n\n\n<p><strong>5)<\/strong> To check Pods are up and running:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sudo \/usr\/local\/bin\/kubectl get pods -n metrics-server<\/strong><\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-white-color has-dark-gray-background-color has-text-color has-background\" style=\"font-size:17px\"><strong>Third, We will be setting up Keycloak<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Keycloak is an open source Identity and Access Management solution. Keycloak offers features such as Single-Sign-On (SSO), Identity Brokering and Social Login, User Federation, Client Adapters, an Admin Console, and an Account Management Console.<br><strong>Single Sign-On<\/strong> : Your applications don\u2019t have to deal with user stores, storing credentials of users, authenticating users, login forms, session management. With the Single Sign-On feature once a user logged-in to Keycloak, users don\u2019t have to login again to access a different application. The same applied to logout as well.<br>User Federation : Keycloak has built-in support to connect to existing LDAP or Active Directory servers.<br>Authorization Services : Keycloak provides fine-grained authorization to manage permissions for all the services, users, and groups. Roles can be defined with the provided Keycloak admin console as well as through APIs, SDK.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"has-white-background-color has-background has-medium-font-size\">                                               <strong><em>Keycloak Installation using helm chart<\/em><\/strong>                                           <\/p>\n\n\n\n<p><strong>1)<\/strong> Download the helm chart from the link given below<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>https:\/\/github.com\/codecentric\/helm-charts\/releases\/download\/keycloak 18.3.0\/keycloak-18.3.0.tgz<\/strong><\/code><\/pre>\n\n\n\n<p><strong>2) <\/strong>Extract the file using command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>tar xvf keycloak-18.3.0.tgz<\/strong><\/code><\/pre>\n\n\n\n<p><strong>3)<\/strong> Edit the values.yaml file at path &#8220;keycloak\/charts\/postgresql\/values.yaml&#8221; and add the following data:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>persistence:<br>enabled: true<br>existingClaim: &#8220;keycloak-pvc&#8221;<br>mountPath: \/path<br>size: 10Gi<\/p>\n<\/blockquote>\n\n\n\n<p><strong>4) <\/strong>Add the new values-keycloak.yml file at path keycloak\/values-keycloak.yml<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>vi values-keycloak.yml<\/strong><\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>name: KEYCLOAK_LOGLEVEL<br>value: DEBUG<br>name: KEYCLOAK_USER<br>value: keycloak<br>name: KEYCLOAK_PASSWORD<br>value: keycloak<br>name: PROXY_ADDRESS_FORWARDING<br>value: &#8220;true&#8221;<br>postgresql:<br>enabled: true<\/p>\n<\/blockquote>\n\n\n\n<p><strong>Install the keycloak helm chart:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>helm install mykeycloak keycloak\/ --values keycloak\/values-keycloak.yml -n keycloak<\/strong><\/code><\/pre>\n\n\n\n<p><strong>To check the created objects:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>kubectl get all -n keycoak<\/strong><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2023\/01\/image.png?w=967\" alt=\"\" class=\"wp-image-12715\" width=\"800\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>This is how we can set up <strong>Components<\/strong> for <strong>Kubernetes Cluster<\/strong>. Here in this blog, we learnt about setting up monitoring, SSO, and the other associated operations for troubleshooting. Now as we have reached the end of the blog &#8211; what do you think I could have done something differently? Do comment. Also If you face any sort of issue in setting up the Kubernetes cluster components drop a comment.<\/p>\n\n\n\n<p><strong>Blog Pundits: <a rel=\"noreferrer noopener\" href=\"https:\/\/www.linkedin.com\/in\/mehul-sharma-devops\/\" target=\"_blank\">Mehul Sharma<\/a> and <a rel=\"noreferrer noopener\" href=\"https:\/\/opstree.com\/blog\/\/author\/sandeep7c51ad81ba\/\" target=\"_blank\">Sandeep Rawat<\/a><\/strong><\/p>\n\n\n\n<p><strong><a href=\"https:\/\/opstree.com\/contact-us\/?utm_source=WordPress&amp;utm_medium=Blog&amp;utm_campaign=On-Premise+Setup+of+Kubernetes+Cluster+Components+%28Offline+Mode%29+-+PART+2\" target=\"_blank\" rel=\"noreferrer noopener\">Opstree<\/a><\/strong>&nbsp;is an End to End DevOps solution provider.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/opstree.com\/contact-us\/?utm_source=WordPress&amp;utm_medium=Blog&amp;utm_campaign=On-Premise+Setup+of+Kubernetes+Cluster+Components+%28Offline+Mode%29+-+PART+2\" target=\"_blank\" rel=\"noreferrer noopener\">CONTACT US<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"has-text-align-center\"><strong>Connect with Us<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-social-links aligncenter is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-1 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-linkedin  wp-block-social-link\"><a href=\"https:\/\/www.linkedin.com\/company\/opstree-solutions\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">LinkedIn<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-youtube  wp-block-social-link\"><a href=\"https:\/\/www.youtube.com\/channel\/UCeLma6SpNYH7jjYKSBNSexw\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">YouTube<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/OpsTree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-facebook  wp-block-social-link\"><a href=\"https:\/\/www.facebook.com\/opstree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-medium  wp-block-social-link\"><a href=\"https:\/\/medium.com\/buildpiper\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Medium<\/span><\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In the previous blog, we discussed setting up Offline Kubernetes Cluster over on-premises servers. After setting up the Kubernetes cluster we need to have some basic components to manage the orchestration and monitoring of the Kubernetes Cluster which will help Horizontal Pod Autoscaler and Vertical Pod Autoscaler to get information about CPU\/Memory. Also, we have &hellip; <a href=\"https:\/\/opstree.com\/blog\/2023\/01\/17\/on-premise-setup-of-kubernetes-cluster-components-offline-mode-part-2\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;On-Premise Setup of Kubernetes Cluster Components (Offline Mode) &#8211; PART 2&#8221;<\/span><\/a><\/p>\n","protected":false},"author":215838922,"featured_media":29900,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[28070474],"tags":[44070,768739308,676319247,768739309,4996032],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2025\/11\/DevSecOps-1.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-3iO","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/12698"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/215838922"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=12698"}],"version-history":[{"count":25,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/12698\/revisions"}],"predecessor-version":[{"id":12766,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/12698\/revisions\/12766"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/29900"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=12698"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=12698"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=12698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}