1"use strict";(self.webpackChunk_marcnuri_blog_marcnuri_com=self.webpackChunk_marcnuri_blog_marcnuri_com||[]).push([[723],{23853:function(e,n,a){a.r(n),a.d(n,{default:function(){return i}});var t=a(28453),r=a(96540);function s(e){const n=Object.assign({h2:"h2",p:"p",a:"a",img:"img",code:"code",pre:"pre"},(0,t.RP)(),e.components);return r.createElement(r.Fragment,null,r.createElement(n.h2,{id:"introduccion"},"Introducción"),"\n",r.createElement(n.p,null,r.createElement(n.a,{href:"https://kubernetes.io/"},"Kubernetes")," v1.19.0 acaba de ser ",r.createElement(n.a,{href:"https://github.com/kubernetes/kubernetes/releases/tag/v1.19.0"},"lanzado"),". Entre las nuevas\nfuncionalidades y mejoras destaca la ",r.createElement(n.a,{href:"https://github.com/kubernetes/enhancements/blob/3c8c9d4f9184b2ff23abe1fbab80fea6f8a5adab/keps/sig-network/20190125-ingress-api-group.md"},"graduación")," del\nIngress API a V1 (",r.createElement(n.a,{href:"https://github.com/kubernetes/enhancements/issues/1453"},"#1453"),")."),"\n",r.createElement(n.p,null,"Pese a que los re
1cursos de tipo Ingress se usan por la mayorÃa de usuarios de Kubernetes, y que esta\nfuncionalidad se introdujo en 2015, no ha sido hasta la reciente version 1.19 en la que se ha hecho globalmente\ndisponible."),"\n",r.createElement(n.p,null,"Un ",r.createElement(n.a,{href:"https://kubernetes.io/docs/concepts/services-networking/ingress/"},"Ingress"),' es\n"Un objeto API que gestiona acceso externo a los servicios de un cluster, normalmente HTTP". En otras palabras,\nlos Ingress permiten exponer públicamente los servicios gestionados por Kubernetes.'),"\n",r.createElement(n.p,null,"En este artÃculo os mostraré como utilizar YAKC para crear un Ingress empleando la v1 del API presentado en\nKubernetes v.19.0."),"\n",r.createElement(n.img,{src:"../../images/yakc/YAKC-Ingress.png",alt:"Imagen de un diagrama de YAKC interactuando con la API de Ingress en Kubernetes"}),"\n",r.createElement(n.h2,{id:"ingress-desde-java"},"Ingress desde Java"),"\n",r.createElement(n.p,null,"Podéis emplear los Ingress para dotar de URLs externas y accesibles, además de balanceo de tráfico a los\nrecursos de tipo Service. Asimismo, los recursos Ingress son útiles para proveer alojamiento virtual basado en\nnombres y terminación SSL."),"\n",r.createElement(n.p,null,"El recurso Ingress requiere un IngressController para poder ser utilizado. En la actualidad, Kubernetes soporta\ny mantiene oficialmente ",r.createElement(n.a,{href:"https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/"},"controladores")," ",r.createElement(n.a,{href:"https://github.com/kubernetes/ingress-gce"},"GCE")," y ",r.createElement(n.a,{href:"https://github.com/kubernetes/ingress-nginx"},"NGINX"),"."),"\n",r.createElement(n.p,null,"Destacar que Ingress ",r.createElement(n.code,null,"v1")," introduce ",r.createElement(n.a,{href:"https://github.com/kubernetes/kubernetes/pull/89778"},"varios cambios")," respecto a la\nversión ",r.createElement(n.code,null,"v1beta1")," Uno de los más importantes es que el campo ",r.createElement(n.code,null,"pathType")," ahora es\nobligatorio y ya no tiene un valor por defecto."),"\n",r.createElement(n.p,null,"El siguiente YAML describe un ",r.createElement(n.code,null,"Ingress")," empleando un ",r.createElement(n.code,null,"IngressController")," ",r.createElement(n.a,{href:"https://kubernetes.github.io/ingress-nginx/"},"NGINX"),":"),"\n",r.createElement(n.pre,null,r.createElement(n.code,{className:"language-yaml"},'apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: ingress-example\n namespace: default\nspec:\n ingressClassName: nginx\n rules:\n - host: "*.foo.com"\n http:\n paths:\n - path: /\n pathType: Exact\n backend:\n serviceName: path-exact\n servicePort: 80\n')),"\n",r.createElement(n.p,null,"De forma similar, se puede definir el mismo Ingress y obtener el mismo resultado\nempleando ",r.createElement(n.a,{href:"post#kubernetes-client-java-presentando-yakc"},"YAKC")," desde Java:"),"\n",r.createElement(n.pre,null,r.createElement(n.code,{className:"language-java"},'new KubernetesClient().create(NetworkingV1Api.class).createNamespacedIngress("default", Ingress.builder()\n .metadata(ObjectMeta.builder()\n .name("ingress-example")\n .build())\n .spec(IngressSpec.builder()\n .addToRules(IngressRule.builder()\n .host("*.foo.com")\n .http(HTTPIngressRuleValue.builder()\n .addToPaths(HTTPIngressPath.builder()\n .path("/")\n .pathType("Exact")\n .backend(IngressBackend.builder()\n .service(IngressServiceBackend.builder()\n .name("path-exact")\n .port(ServiceBackendPort.builder()\n .number(80)\n .build())\n .build())\n .build())\n .build())\n .build())\n .build())\n .build())\n .build()\n).get();\n')),"\n",r.createElement(n.p,null,"La principal ventaja de utilizar Java (Kubernetes Client YAKC) es que puedes realizar estas tareas de forma\ndinámica. Por ejemplo, puedes implementar un operador basado en Java que cree automáticamente un nuevo Ingress\ncada vez que se de de alta un nuevo Service en el cluster."),"\n",r.createElement(n.h2,{id:"conclusion"},"Conclusión"),"\n",r.createElement(n.p,null,"Kubernetes 1.19 marca la disponibilidad general de Ingress ",r.createElement(n.code,null,"networking.k8s.io/v1"),". En esta\npublicación os he mostrado como utilizar YAKC para crear un Ingress desde Java."),"\n",r.createElement(n.p,null,"Puedes encontrar más información en la ",r.createElement(n.a,{href:"https://github.com/manusa/yakc"},"página del proyecto de YAKC en GitHub"),". También puedes analizar el código de prueba ",r.createElement(n.a,{href:"https://github.com/manusa/yakc/blob/5b70e1c70acd83434d92a66053ab6c9b5800384c/tests/src/test/java/com/marcnuri/yakc/Net
1workingV1IngressIT.java#L151"},"aquÃ"),"."))}var l=function(e){void 0===e&&(e={});const{wrapper:n}=Object.assign({},(0,t.RP)(),e.components);return n?r.createElement(n,e,r.createElement(s,e)):s(e)},c=a(37698);const o=e=>r.createElement(c.TP,{pageContext:e.pageContext},r.createElement(c.n$,Object.assign({comments:e.pageContext.comments,frontmatter:e.pageContext.frontmatter},e)));function i(e){return r.createElement(o,e,r.createElement(l,e))}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.