{"id":260785,"date":"2021-05-27T21:00:31","date_gmt":"2021-05-27T18:00:31","guid":{"rendered":"https:\/\/en.buradabiliyorum.com\/clusterip-nodeport-or-ingress-when-to-use-each-cloudsavvy-it\/"},"modified":"2021-05-27T21:00:31","modified_gmt":"2021-05-27T18:00:31","slug":"clusterip-nodeport-or-ingress-when-to-use-each-cloudsavvy-it","status":"publish","type":"post","link":"https:\/\/buradabiliyorum.com\/en\/clusterip-nodeport-or-ingress-when-to-use-each-cloudsavvy-it\/","title":{"rendered":"#ClusterIP, NodePort, or Ingress? When to Use Each \u2013 CloudSavvy IT"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_89 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6af76bd8e2d25\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #dd3333;color:#dd3333\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #dd3333;color:#dd3333\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6af76bd8e2d25\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/buradabiliyorum.com\/en\/clusterip-nodeport-or-ingress-when-to-use-each-cloudsavvy-it\/#The_Basics\" >The Basics<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/buradabiliyorum.com\/en\/clusterip-nodeport-or-ingress-when-to-use-each-cloudsavvy-it\/#ClusterIP\" >ClusterIP<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/buradabiliyorum.com\/en\/clusterip-nodeport-or-ingress-when-to-use-each-cloudsavvy-it\/#NodePort\" >NodePort<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/buradabiliyorum.com\/en\/clusterip-nodeport-or-ingress-when-to-use-each-cloudsavvy-it\/#Ingress\" >Ingress<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/buradabiliyorum.com\/en\/clusterip-nodeport-or-ingress-when-to-use-each-cloudsavvy-it\/#Load_Balancers\" >Load Balancers<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/buradabiliyorum.com\/en\/clusterip-nodeport-or-ingress-when-to-use-each-cloudsavvy-it\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<p><strong>&#8220;#ClusterIP, NodePort, or Ingress? When to Use Each \u2013 CloudSavvy IT&#8221;<\/strong><\/p>\n<div id=\"article-content-area\">\n<img loading=\"lazy\" decoding=\"async\" class=\"type:primaryImage aligncenter size-full wp-image-9632\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/02\/748108a6.jpg?width=1198&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"Graphic showing the Kubernetes logo\" width=\"1602\" height=\"902\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>Kubernetes supports several ways of getting external traffic into your cluster. ClusterIPs, NodePorts, and Ingresses are three widely used resources that all have a role in routing traffic. Each one lets you expose services with a unique set of features and trade-offs.<\/p>\n<h2 id=\"the-basics\"><span class=\"ez-toc-section\" id=\"The_Basics\"><\/span>The Basics<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Kubernetes workloads aren\u2019t network-visible by default. You make containers available to the outside world by creating a <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/service\"><em>service<\/em><\/a>. Service resources route traffic into the containers within pods.<\/p>\n<p>A service is an abstract mechanism for exposing pods on a network. Each service is assigned a type\u2014either ClusterIP, NodePort, or LoadBalancer. These define how external traffic reaches the service.<\/p>\n<h2 id=\"clusterip\"><span class=\"ez-toc-section\" id=\"ClusterIP\"><\/span>ClusterIP<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>ClusterIP is the default Kubernetes service. Your service will be exposed on a ClusterIP unless you manually define another type.<\/p>\n<p>A ClusterIP provides network connectivity <em>within<\/em> your cluster. It can\u2019t normally be accessed from outside. You use these services for internal networking between your workloads.<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co3\">apiVersion<\/span><span class=\"sy2\">: <\/span>v1<span class=\"co3\">\nkind<\/span><span class=\"sy2\">: <\/span>Service<span class=\"co4\">\nspec<\/span>:<span class=\"co4\">\n  selector<\/span>:<span class=\"co3\">\n    <a href=\"https:\/\/buradabiliyorum.com\/en\/category\/download-scripts-themes-apps\/\" data-internallinksmanager029f6b8e52c=\"9\" title=\"Download Scripts &amp; Themes &amp; Apps\" target=\"_blank\" rel=\"noopener\">app<\/a><\/span><span class=\"sy2\">: <\/span>my-app<span class=\"co3\">\n  type<\/span><span class=\"sy2\">: <\/span>ClusterIP<span class=\"co4\">\n  ports<\/span>:<span class=\"co3\">\n    - name<\/span><span class=\"sy2\">: <\/span>http<span class=\"co3\">\n      port<\/span><span class=\"sy2\">: <\/span>80<span class=\"co3\">\n      targetPort<\/span><span class=\"sy2\">: <\/span>80<span class=\"co3\">\n      protocol<\/span><span class=\"sy2\">: <\/span>TCP<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>This example manifest defines a ClusterIP service. Traffic to port 80 on the ClusterIP will be forwarded to port 80 at your pods (<code>targetPort<\/code>). Pods with the <code>app: my-app<\/code> metadata field will be added to the service.<\/p>\n<p>You can see the IP address that\u2019s been assigned by running <code>kubectl get services<\/code>. Other workloads in your cluster can use this IP address to interact with your service.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11264\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/05\/364be886.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"538\" height=\"61\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>You can manually set a ClusterIP to a specific IP address using the <code>spec.clusterIp<\/code> field:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co4\">spec<\/span>:<span class=\"co3\">\n  type<\/span><span class=\"sy2\">: <\/span>ClusterIP<span class=\"co3\">\n  clusterIp<\/span><span class=\"sy2\">: <\/span>123.123.123.123<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>The <code>clusterIp<\/code> value must be a valid IP address within the range configured for your cluster. This is <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/service\/#choosing-your-own-ip-address\">defined by the<\/a> <code>service-cluster-ip-range<\/code> setting in the Kubernetes API server.<\/p>\n<h2 id=\"nodeport\"><span class=\"ez-toc-section\" id=\"NodePort\"><\/span>NodePort<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A NodePort publicly exposes a service on a fixed port number. It lets you access the service from outside your cluster. You\u2019ll need to use the cluster\u2019s IP address and the <code>NodePort<\/code> number\u2014e.g. <code>123.123.123.123:30000<\/code>.<\/p>\n<p>Creating a NodePort will open that port on every node in your cluster. Kubernetes will automatically route port traffic to the service it\u2019s linked to.<\/p>\n<p>Here\u2019s an example NodePort service manifest:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co3\">apiVersion<\/span><span class=\"sy2\">: <\/span>v1<span class=\"co3\">\nkind<\/span><span class=\"sy2\">: <\/span>Service<span class=\"co4\">\nspec<\/span>:<span class=\"co4\">\n  selector<\/span>:<span class=\"co3\">\n    app<\/span><span class=\"sy2\">: <\/span>my-app<span class=\"co3\">\n  type<\/span><span class=\"sy2\">: <\/span>NodePort<span class=\"co4\">\n  ports<\/span>:<span class=\"co3\">\n    - name<\/span><span class=\"sy2\">: <\/span>http<span class=\"co3\">\n      port<\/span><span class=\"sy2\">: <\/span>80<span class=\"co3\">\n      targetPort<\/span><span class=\"sy2\">: <\/span>80<span class=\"co3\">\n      protocol<\/span><span class=\"sy2\">: <\/span>TCP<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>NodePort definitions have the same mandatory properties as ClusterIP services. The only difference is the change to <code>type: NodePort<\/code>. The <code>targetPort<\/code> field is still required, as NodePorts are backed by a ClusterIP service.<\/p>\n<p>Applying the above manifest will assign your NodePort a random port number from the range available to Kubernetes. This <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/service\/#nodeport\">usually defaults<\/a> to ports 30000-32767. You can manually specify a port by setting the <code>ports.nodePort<\/code> field:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co4\">spec<\/span>:<span class=\"co4\">\n  ports<\/span>:<span class=\"co3\">\n    - name<\/span><span class=\"sy2\">: <\/span>http<span class=\"co3\">\n      port<\/span><span class=\"sy2\">: <\/span>80<span class=\"co3\">\n      targetPort<\/span><span class=\"sy2\">: <\/span>80<span class=\"co3\">\n      nodePort<\/span><span class=\"sy2\">: <\/span>32000<span class=\"co3\">\n      protocol<\/span><span class=\"sy2\">: <\/span>TCP<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>This will route traffic on port 32000 to port 80 in your Pods.<\/p>\n<p>NodePorts aren\u2019t often ideal for public services. They use non-standard ports, which are unsuitable for most HTTP traffic. You can use a NodePort to quickly set up a service for development use or to expose a TCP or UDP service on its own port. When serving a production environment to users, you\u2019ll want to use an alternative instead.<\/p>\n<h2 id=\"ingress\"><span class=\"ez-toc-section\" id=\"Ingress\"><\/span>Ingress<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>An Ingress is actually a completely different resource to a Service. You normally use Ingresses in front of your Services to provide HTTP routing configuration. They let you set up external URLs, domain-based virtual hosts, SSL, and load balancing.<\/p>\n<p>Setting up Ingresses requires an Ingress Controller to exist in your cluster. There\u2019s a <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/ingress-controllers\">wide selection<\/a> of controllers available. Most major cloud providers have their own Ingress Controller that integrates with their load-balancing infrastructure. <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/kubernetes\/ingress-nginx\/blob\/master\/README.md\"><code>nginx-ingress<\/code><\/a> is a popular standalone option that uses the NGINX web server as a reverse proxy to get traffic to your services.<\/p>\n<p>You create Ingresses using the <code>Ingress<\/code> resource type. The <code>kubernetes.io\/ingress.class<\/code> annotation lets you indicate which kind of Ingress you\u2019re creating. This is useful if you\u2019re running multiple cluster controllers.<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co3\">apiVersion<\/span><span class=\"sy2\">: <\/span>networking.k8s.io\/v1beta1<span class=\"co3\">\nkind<\/span><span class=\"sy2\">: <\/span>Ingress<span class=\"co4\">\nmetadata<\/span>:<span class=\"co3\">\n  name<\/span><span class=\"sy2\">: <\/span>my-ingress<span class=\"co4\">\n  annotations<\/span>:<span class=\"co3\">\n    kubernetes.io\/ingress.class<\/span><span class=\"sy2\">: <\/span>nginx<span class=\"co4\">\nspec<\/span>:<span class=\"co4\">\n  rules<\/span>:<span class=\"co3\">\n    - host<\/span><span class=\"sy2\">: <\/span>example.com<span class=\"co4\">\n      http<\/span>:<span class=\"co4\">\n        paths<\/span>:<span class=\"co3\">\n          - path<\/span><span class=\"sy2\">: <\/span>\/<span class=\"co4\">\n            backend<\/span>:<span class=\"co3\">\n              serviceName<\/span><span class=\"sy2\">: <\/span>my-service<span class=\"co3\">\n              servicePort<\/span><span class=\"sy2\">: <\/span>80<span class=\"co3\">\n    - host<\/span><span class=\"sy2\">: <\/span>another-example.com<span class=\"co4\">\n      http<\/span>:<span class=\"co4\">\n        paths<\/span>:<span class=\"co3\">\n          - path<\/span><span class=\"sy2\">: <\/span>\/<span class=\"co4\">\n            backend<\/span>:<span class=\"co3\">\n              serviceName<\/span><span class=\"sy2\">: <\/span>second-service<span class=\"co3\">\n              servicePort<\/span><span class=\"sy2\">: <\/span>80<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>This manifest defines two Ingress endpoints. The first <code>host<\/code> rule routes <code>example.com<\/code> traffic to port 80 on the <code>my-service<\/code> service. The second rule configures <code>another-example.com<\/code> to map to pods that are part of <code>second-service<\/code>.<\/p>\n<p>You can configure SSL by setting the <code>tls<\/code> field in your Ingress\u2019 <code>spec<\/code>:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co4\">spec<\/span>:<span class=\"co4\">\n  tls<\/span>:<span class=\"co4\">\n    - hosts<\/span><span class=\"sy2\">:\n<\/span>      - example.com\n      - another-example.com<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>You\u2019ll need an <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/cert-manager.io\/docs\/concepts\/issuer\">Issuer<\/a>\u00a0like\u00a0<a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/cert-manager.io\/docs\">Cert Manager<\/a> in your cluster for this to work. The Issuer will acquire SSL certificates for your domains when your Ingress is created.<\/p>\n<p>Ingresses should be used when you want to handle traffic from multiple domains and URL paths. You configure your endpoints using declarative statements. The Ingress controller will provision your routes and map them to services.<\/p>\n<h2 id=\"load-balancers\"><span class=\"ez-toc-section\" id=\"Load_Balancers\"><\/span>Load Balancers<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A final service type is LoadBalancer. These services automatically integrate with the load balancers provided by public cloud environments. You\u2019ll need to set up<a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/_print\/#loadbalancer\">\u00a0your own<\/a> load balancer if you\u2019re self-hosting your cluster.<\/p>\n<p>Load balancers are used to map external IP addresses to services in your cluster. Unlike Ingresses, there\u2019s no automatic filtering or routing. Traffic to the external IP and port will be sent straight to your service. This means that they\u2019re suitable for all traffic types.<\/p>\n<p>The implementation of each load balancer is provider-dependent. Some cloud platforms offer more features than others. Be aware that creating a load balancer will often apply additional charges to your bill.<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co3\">apiVersion<\/span><span class=\"sy2\">: <\/span>v1<span class=\"co3\">\nkind<\/span><span class=\"sy2\">: <\/span>Service<span class=\"co4\">\nspec<\/span>:<span class=\"co4\">\n  selector<\/span>:<span class=\"co3\">\n    app<\/span><span class=\"sy2\">: <\/span>my-app<span class=\"co3\">\n  type<\/span><span class=\"sy2\">: <\/span>LoadBalancer<span class=\"co3\">\n  loadBalancerIP<\/span><span class=\"sy2\">: <\/span>123.123.123.123<span class=\"co4\">\n  ports<\/span>:<span class=\"co3\">\n    - name<\/span><span class=\"sy2\">: <\/span>http<span class=\"co3\">\n      port<\/span><span class=\"sy2\">: <\/span>80<span class=\"co3\">\n      targetPort<\/span><span class=\"sy2\">: <\/span>80<span class=\"co3\">\n      protocol<\/span><span class=\"sy2\">: <\/span>TCP<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Load balancer manifests look similar to the other service types. Traffic to the load balancer <code>port<\/code>\u00a0that you define will be received by the <code>targetPort<\/code> in your pods.<\/p>\n<p>Your cloud environment will create a new load balancer to handle your traffic. Some providers allow you to request a specific external IP address using the <code>spec.loadBalancerIP<\/code> field. You\u2019ll receive a random IP when this isn\u2019t supported.<\/p>\n<h2 id=\"conclusion\"><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>ClusterIPs, NodePorts, Ingresses, and Load Balancers route external traffic to the services in your cluster. Each one is designed for a different use case. Some of your services will make the most sense with a NodePort, while others will need an Ingress, usually when you want to provide a URL.<\/p>\n<p>All four options work in tandem with the broader <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/service\">\u201cservice\u201d<\/a> concept. They\u2019re the gatekeepers that enable network access to your services. Those services then handle the last leap into your pods. The two layers of abstraction keep routing fully decoupled from your workloads: Your pods simply expose ports, which the services make publicly accessible.\n<\/div>\n<blockquote><p><strong><span style=\"color: #ff6600;\">If you liked the article, do not forget to share it with your friends. Follow us on\u00a0<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/news.google.com\/publications\/CAAqBwgKMLG0nwswvr63Aw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Google News<\/a><\/span>\u00a0too, click on the star and choose us from your favorites.<\/span><\/strong><\/p><\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\">For forums sites go to <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/forum.buradabiliyorum.com\/\" target=\"_blank\" rel=\"noopener\">Forum.BuradaBiliyorum.Com<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\"><strong>If you want to read more like this article, you can visit our <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/en.buradabiliyorum.com\/technology\/\" target=\"_blank\" rel=\"noopener\">Technology category.<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<p><span style=\"color: black;\"><a style=\"color: #ff9900;\" href=\"https:\/\/www.cloudsavvyit.com\/11261\/kubernetes-clusterip-nodeport-or-ingress-when-to-use-each\/\" target=\"_blank\" rel=\"noopener\">Source<\/a><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;#ClusterIP, NodePort, or Ingress? When to Use Each \u2013 CloudSavvy IT&#8221; Kubernetes supports several ways of getting external traffic into your cluster. ClusterIPs, NodePorts, and Ingresses are three widely used resources that all have a role in routing traffic. Each one lets you expose services with a unique set of features and trade-offs. The Basics&#8230;<\/p>\n","protected":false},"author":1,"featured_media":260786,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/02\/748108a6.jpg","fifu_image_alt":"","footnotes":""},"categories":[18],"tags":[],"class_list":["post-260785","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/260785","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/comments?post=260785"}],"version-history":[{"count":0,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/260785\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media\/260786"}],"wp:attachment":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media?parent=260785"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/categories?post=260785"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/tags?post=260785"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}