Kubernetes Ingress à travers les yeux d'un débutant

Qu'est-ce que l'entrée?


L'entrée est le type de ressource de base à Coubertene. Si vous déclarez simplement un objet de type Ingress dans kubernetis, rien ne se passera.


Pour que cette ressource puisse commencer à fonctionner dans le cluster Kubernetis, le contrôleur d'entrée doit être installé, ce qui configurera le proxy inverse conformément à l'objet d'entrée.


Ingress Controller se compose de 2 composants - un proxy inverse et un contrôleur qui communique avec le serveur API Kubernetes. Le proxy inverse écoute le trafic entrant sur les ports spécifiés dans les paramètres (généralement, seul le port 80 est spécifié dans les paramètres par défaut). Le contrôleur peut être soit un démon distinct (comme dans nginx), soit intégré dans le proxy (comme dans traefik).


Tous les fournisseurs de cloud kubernetes ne préinstallent pas Ingress Controller par défaut.


Les contrôleurs peuvent s'exécuter en tant que DaemonSet ou en tant que déploiement. Il est idéal d'utiliser DaemonSet comme seul contrôleur d'entrée, afin que le proxy inverse écoute toutes les adresses IP des travailleurs. Le déploiement est parfait s'il y a un équilibreur devant le contrôleur Ingress - du fournisseur kubernetis (GKE, AKS), MetalLB s'il s'agit d'un haproxy / nginx premium ou régulier installé sur le serveur (une configuration manuelle est requise). Avec cette installation, il est possible d'installer plusieurs Ingress Controller.


Comment le trafic entrant parvient au contrôleur d'entrée


Dans tous les cas, le proxy inverse dans le contrôleur d'entrée écoute les ports où il attend les connexions http / https.


Le trafic à ces ports est accessible de trois manières:


  • NodePort (sur des ports aléatoires dans la plage de 30000 à 32767)
  • HostPort (peut être suspendu sur les ports 80, 443)
  • Réseau hôte - Pod définira ses ports sur l'interface de réseau public (c'est-à-dire que tous les ports de conteneurs seront ouverts)

NodePort


L'installation du contrôleur d'entrée sur un NodePort sans LoadBalancer n'a pas de sens, car l'URL inclura le port spécifié dans NodePort http://domain.example.org:32200/ .


Pour cette option, il est préférable d'utiliser les déploiements. Cela facilitera la mise à l'échelle du nombre de pods responsables du trafic entrant, leur enregistrera nodeAffinity et exécutera plusieurs contrôleurs d'entrée (par exemple, pour la production et le transfert).


Hostport


Lorsque vous utilisez HostPort, le port est transféré depuis l'hôte sur lequel il s'exécute sous ce même pod. Un LoadBalancer n'est pas nécessaire pour l'entrée, mais pour que le site fonctionne dans DNS, vous devez indiquer que l'adresse de domaine se trouve sur tous les nœuds.


Exemple de configuration DNS pour 3 travailleurs:


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 

Pour cette installation, il est préférable d'utiliser DaemonSet car il vous permet d'exécuter pas plus d'un pod sur un hôte. Le déploiement est possible, mais cela n'a guère de sens puisque L'affinité doit être enregistrée afin que 2 pods ne soient pas affectés à un hôte, sinon il y aura un conflit sur les ports.


Exemple de configuration pour 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 

Réseau hôte


Lorsque vous exécutez Ingress Controller sur un réseau partagé avec l'hôte, aucune redirection de port n'est requise, mais dans ce cas, tous les ports ouverts dans Pod seront accessibles depuis Internet. Mieux vaut utiliser DaemonSet pour fonctionner. Les raisons sont les mêmes qu'avec HostPort - pour éviter les conflits de port.


Que choisir


S'il y a un LoadBalancer dans l'entrée - NodePort, sinon - HostPort + DNS Round Robin. Pour les expériences, vous pouvez essayer le réseau hôte, mais ce n'est pas sûr.

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


All Articles