Traefik en tant que contrôleur d'entrée pour K8S

Ce n'est un secret pour personne que K8S a une excellente communauté et une bonne documentation en général. Vous y trouverez facilement la réponse à de nombreuses questions. Mais comme toute autre documentation, elle ne peut pas couvrir absolument tout. Dans cet article, je vais essayer de fournir des instructions détaillées sur le déploiement et la configuration de Traefik pour une utilisation en tant que contrôleur Ingress.


image


Qu'est-ce que Ingress?


Ingress est un objet API qui contrôle l'accès externe aux services dans un cluster, principalement via HTTP / HTTPS. Pour que la ressource Ingress fonctionne, vous avez besoin d'un contrôleur Ingress. Si vous utilisez GCE, le contrôleur Ingress est déjà déployé dans l'assistant. Cependant, si vous avez vous-même téléchargé le cluster, par exemple de kops vers AWS, vous devez déployer le contrôleur Ingress vous-même. Sur minikube, cela est résolu en incluant le complément Ingress.


Contrôleurs d'entrée


Le rôle du contrôleur Ingress peut être effectué par NGINX Ingress Controller, Kong, Octavia Ingress Controller, etc. Dans cet article, nous examinerons un outil comme Traefik et verrons comment vous pouvez l'utiliser comme contrôleur Ingress pour les services d'un cluster.


Pourquoi?


Pourquoi utiliser un contrôleur Ingress si vous pouvez donner accès à chaque service via NodePort ou LoadBalancer ? En bref, cela permet à un point central de proxy tout le trafic. Autrement dit, en utilisant le contrôleur Ingress, vous n'avez besoin que d'un LoadBalancer pour Traefik et rien de plus. Ce bundle résoudra tout le trafic.


Composants Traefik


Traefik a annoncé la prise en charge de Kubernetes Ingress dans la version 1.4. Cependant, le Traefik 1.7 récemment publié dispose de l'option publishedService, qui peut mettre à jour le champ d' status dans Ingress, qui n'était pas dans les versions précédentes. Voici une liste des composants qui seront nécessaires pour fonctionner.


Créer:


  • espace de noms
  • compte de service
  • Secret TLS
  • rôle de cluster
  • liaison de rôle de cluster
  • configmap
  • déploiement
  • service pour http et https
  • service pour tableau de bord Traefik
  • Ingress

Espace de noms


Créez un espace de noms:


 kubectl create namespace traefik 

TLS Secret


(environ. - dans l'exemple ci-dessous, pour une raison quelconque, l'auteur duplique la même configuration, voir la configuration actuelle dans le fichier README fourni par le lien ci-dessous)


Créez d'abord un certificat:


 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com" 

Créez un certificat TLS:


 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com" 

Créer un secret:


 kubectl create secret tls traefik-ui-tls-cert --key ./tls.key --cert ./tls.crt 

Pour plus de commodité, j'ai créé un fichier README avec ces commandes et l' ai téléchargé sur mon GitHub .


ConfigMap


 --- apiVersion: v1 kind: ConfigMap metadata: name: traefik-configmap namespace: traefik data: traefik.toml: | defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] CertFile = "/ssl/tls.crt" KeyFile = "/ssl/tls.key" [entryPoints.traefik] address = ":8080" [entryPoints.traefik.auth.basic] users = ["admin:$apr1$zjjGWKW4$W2JIcu4m26WzOzzESDF0W/"] [kubernetes] [kubernetes.ingressEndpoint] publishedService = "traefik/traefik" [ping] entryPoint = "http" [api] entryPoint = "traefik" 

Par défaut, les EntryPoints sont les ports 80 et 443 .


EntryPoint http écoute :80 et n'a pas de règles supplémentaires


EntryPoint https écoute :443 et contient une règle de connexion des certificats TLS.


EntryPoint traefik écoute :8080 et utilise l'authentification de base. Le nom d'utilisateur est admin , le mot de passe est admin .


La définition du point de terminaison correspondant Ingress dans Kubernetes se fait en spécifiant publishService et doit comprendre la valeur de l' namespace et le nom du service pour Traefik. Dans ce cas, il s'agit de traefik / traefik .


ping ou bilan de santé utilisera entryPoint http .


api ou dashboard / ui utilisera entryPoint traefik .


Notez que vous pouvez définir des points d'entrée supplémentaires avec un port. Ce port peut proxy le trafic vers n'importe quel port, au lieu des ports dynamiques et NodePort .


Clusterrole


Le compte de service de Traefik doit être autorisé à mettre à jour le champ d' Ingress status . Il s'agit d'un paramètre important, et il n'est pas encore présenté dans la documentation officielle de Traefik :


 --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses/status verbs: - update 

Les 6 dernières lignes sont très importantes pour un fonctionnement correct.


Déploiement


Le déploiement est assez simple. Passons brièvement en revue les principaux blocs:


 volumes: - name: traefik-ui-tls-cert secret: secretName: traefik-ui-tls-cert - name: traefik-configmap configMap: name: traefik-configmap 

Définissez les volumes pour ConfigMap et Secret, qui peuvent ensuite être utilisés dans volumeMounts .


 volumeMounts: - mountPath: "/ssl" name: "traefik-ui-tls-cert" - mountPath: "/config" name: "traefik-configmap" 

Les contrôles d'intégrité sont effectués sur le port 80, comme défini dans ConfigMap.


Ouvrez les ports pour tous les points d'entrée spécifiés dans le fichier de configuration:


 ports: - name: http containerPort: 80 - name: https containerPort: 443 - name: dashboard containerPort: 8080 

Je vous rappelle que certains exemples et documentation sur Internet sont obsolètes, alors ne manquez pas la section args nécessaire au fonctionnement de Traefik:


 args: - --logLevel=INFO - --configfile=/config/traefik.toml 

Ne transmettez pas d'indicateurs et d'arguments supplémentaires, tels que -api, -ping ou -kubernetes, car cela remplacerait les paramètres spécifiés dans le fichier de configuration.


Le service


Le premier des services définit un Loadbalancer pour les points d'entrée http et https . Si vous regardez le groupe de sécurité (Ingress) pour le LoadBalancer, vous y verrez les ports 80 et 443. K8 créera un LoadBalancer et le connectera aux nœuds sur lesquels Traefik s'exécute. Si vous souhaitez créer un ELB interne, comme moi, vous devez définir des annotations:


 --- kind: Service apiVersion: v1 metadata: name: traefik namespace: traefik annotations: {} # service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0 spec: selector: k8s-app: traefik-ingress ports: - protocol: TCP port: 80 name: http - protocol: TCP port: 443 name: https type: LoadBalancer 

Service (pour Dashboard)


Maintenant, la partie amusante! Étant donné que Dashboard utilise l'authentification de base, j'avais besoin de https . Pour utiliser SSL, nous devons rediriger le trafic vers le port :8080 , sur lequel Dashboard fonctionne. Comme vous pouvez le voir, c'est très simple. Toute la magie se produit dans Ingress.


 --- kind: Service apiVersion: v1 metadata: name: traefik-dashboard namespace: traefik spec: selector: k8s-app: traefik-ingress ports: - port: 8080 name: dashboard 

Entrée (pour Dashboard)


La magie est que la procuration du trafic sécurisé vers Dashboard se fait via Traefik lui-même. La gestion de Traefik dans Ingress se fait à l'aide d' annotations Traefik :


 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-dashboard-ingress namespace: traefik annotations: kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/frontend-entry-points: http,https traefik.ingress.kubernetes.io/redirect-entry-point: https traefik.ingress.kubernetes.io/redirect-permanent: "true" spec: rules: - host: traefik-ui.example.com http: paths: - path: / backend: serviceName: traefik-dashboard servicePort: 8080 

Il n'a fallu que 4 annotations simples et claires.


Bien sûr, pour assurer une fonctionnalité complète, vous devez créer un enregistrement DNS traefik-ui.example.com , qui pointera vers votre ELB.


Serait-ce bien si cela se faisait automatiquement? Pas de problème, j'écrirai sur la création automatique d'enregistrements DNS dans le prochain article.


Les références


Le fichier deployment.yaml terminé peut être téléchargé à partir de mon référentiel Github . Si vous rencontrez des difficultés lors du processus de configuration, n'hésitez pas à demander.


Séparer les mots du traducteur


Lisez d'autres articles sur notre blog:


Sauvegardes avec état dans Kubernetes


Sauvegarde d'un grand nombre de projets Web hétérogènes


Bot télégramme pour Redmine. Comment simplifier la vie pour vous et les gens

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


All Articles