Kubernetes Ingress a través de los ojos de un principiante

¿Qué es el ingreso?


El ingreso es el tipo básico de recurso en Coubertene. Si simplemente declaras un objeto de tipo Ingress en kubernetis, no pasará nada.


Para que este recurso comience a funcionar en el clúster de Kubernetis, se debe instalar un Controlador Ingress, que configurará un proxy inverso de acuerdo con el objeto Ingress.


Ingress Controller consta de 2 componentes: un proxy inverso y un controlador que se comunica con el servidor API de Kubernetes. El proxy inverso escucha el tráfico entrante en los puertos especificados en la configuración (por lo general, solo el puerto 80 se especifica en la configuración predeterminada). El controlador puede ser un demonio separado (como en nginx) o incorporado en el proxy (como en traefik).


No todos los proveedores de Cloud Kubernetes preinstalan Ingress Controller de forma predeterminada.


Los controladores pueden ejecutarse como DaemonSet o como Implementación. Es ideal usar DaemonSet como el único controlador de ingreso, para que el proxy inverso escuche todas las direcciones IP de los trabajadores. La implementación es perfecta si hay un equilibrador frente al controlador Ingress, del proveedor de kubernetis (GKE, AKS), MetalLB si es un haproxy / nginx premium o regular instalado en el servidor (se requiere configuración manual). Con esta instalación, es posible instalar varios Ingress Controller.


Cómo llega el tráfico entrante al controlador de ingreso


En todos los casos, el proxy inverso en el controlador de ingreso escucha los puertos donde espera conexiones http / https.


Se puede acceder al tráfico en estos puertos de tres maneras:


  • NodePort (en puertos aleatorios en el rango de 30000-32767)
  • HostPort (se puede colgar en los puertos 80, 443)
  • Red de host: Pod configurará sus puertos en la interfaz de red pública (es decir, todos los puertos de contenedor estarán abiertos)

NodePort


Instalar el Controlador Ingress en un NodePort sin un LoadBalancer tiene poco sentido, ya que la URL incluirá el puerto especificado en NodePort http://domain.example.org:32200/ .


Para esta opción, es mejor usar implementaciones. Esto hará que sea más fácil escalar el número de pods responsables del tráfico entrante, registrar nodeAffinity para ellos y ejecutar varios controladores de ingreso (por ejemplo, para producción y puesta en escena).


Puerto de acogida


Cuando se utiliza HostPort, el puerto se reenvía desde el host donde se ejecuta en este mismo Pod. No se necesita un LoadBalancer para ingresar, pero para que el sitio funcione en DNS, debe indicar que la dirección de dominio está en todos los nodos.


Ejemplo de configuración de DNS para 3 trabajadores:


ingress.example.org A 10.0.0.1 ingress.example.org A 10.0.0.2 ingress.example.org A 10.0.0.3 www.example.org CNAME ingress.example.org 

Para esta instalación, es mejor usar DaemonSet ya que le permite ejecutar no más de un Pod en un host. La implementación es posible, pero tiene poco sentido ya que La afinidad debe registrarse para que no se asignen 2 pods a un host, de lo contrario habrá un conflicto en los puertos.


Ejemplo de configuración para traefik
 kind: DaemonSet apiVersion: extensions/v1beta1 metadata: name: traefik-ingress-controller namespace: traefik labels: k8s-app: traefik-ingress-lb spec: template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb namespace: traefik spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 containers: - image: traefik:1.7.6 name: traefik-ingress-lb ports: - name: http containerPort: 80 hostPort: 80 - name: https containerPort: 443 hostPort: 443 - name: admin containerPort: 8080 hostPort: 8080 securityContext: capabilities: drop: - ALL add: - NET_BIND_SERVICE args: - --api - --kubernetes - --logLevel=DEBUG - --entrypoints=Name:https Address::443 TLS - --entrypoints=Name:http Address::80 - --defaultentrypoints=http 

Red de host


Al ejecutar Ingress Controller en una red compartida con el host, no se requiere reenvío de puertos, pero en este caso todos los puertos que están abiertos en Pod serán accesibles desde Internet. Es mejor usar DaemonSet para ejecutar. Los motivos son los mismos que con HostPort: para evitar conflictos de puertos.


Que elegir


Si hay un LoadBalancer en la entrada - NodePort, si no - HostPort + DNS Round Robin. Para los experimentos, puede probar la red Host, pero no es segura.

Source: https://habr.com/ru/post/es434524/


All Articles