Comment choisir l'adresse IP externe d'un équilibreur de charge Kubernetes dans Google Kubernetes Engine

16

Je déploie une application Web à l'aide de Google Kubernetes Engine et je souhaite la rendre accessible via un équilibreur de charge sur une adresse IP statique existante que je contrôle dans le cadre du même projet dans Google Cloud Platform, car le nom de domaine que je souhaite utiliser pointe déjà vers cette adresse IP.

Le fichier yaml que j'ai utilisé pour le pod est:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
spec:
  containers:
  - name: my-container
    image: gcr.io/my-project/my-app:latest

Je peux configurer un équilibreur de charge en utilisant:

apiVersion: v1
kind: Service
metadata:
  name: my-load-balancer
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: my-app
  type: LoadBalancer

Cela fournit une adresse IP externe sur laquelle l'application est accessible, mais je ne trouve aucun moyen de la configurer pour utiliser l'adresse IP que je souhaite. La documentation des services mentionne un paramètre spec.clusterIP, mais cela ne semble pas se rapporter à l'IP externe. De même, une fois l'équilibreur de charge configuré, le champ status.loadBalancer.ingress.ip du service est défini sur son adresse IP externe, mais cela ne semble pas être un paramètre configurable.

Comme alternative, j'ai essayé de créer manuellement une règle de transfert dans la console Google Compute Engine pour diriger le trafic de mon adresse IP statique vers le pool cible configuré par Kubernetes, mais lorsque j'essaie de me connecter, la connexion est refusée.

Existe-t-il un moyen de faire ce que je veux - d'exposer un pod Kubernetes (ou un contrôleur de réplication) sur le moteur Google Kubernetes sur une adresse IP statique choisie?

Ben
la source

Réponses:

9

TL; DR Google Container Engine exécutant Kubernetes v1.1 ne prend en charge loadBalancerIPque le premier IP attribué automatiquement comme statique .

Kubernetes v1.1 prend en charge les IP externes :

apiVersion: v1
kind: Service
spec:
  type: LoadBalancer
  loadBalancerIP: 10.10.10.10
  ...

Jusqu'à présent, il n'y a pas vraiment de bonne documentation cohérente sur la façon de l'utiliser sur GCE. Ce qui est sûr, c'est que cette IP doit d'abord être l'une de vos IP statiques pré-allouées .

La documentation d' équilibrage de charge entre régions concerne principalement Compute Engine et non Kubernetes / Container Engine, mais elle est toujours utile, en particulier la partie "Configurer le service d'équilibrage de charge".

Si vous créez simplement un Kubernetes LoadBalancer sur GCE, il créera un réseau Compute Engine> Réseau> Équilibrage de la charge réseau> Règle de transfert pointant vers un pool cible composé de vos machines sur votre cluster (normalement uniquement celles qui exécutent les pods correspondant au sélecteur de service) . Il semble que la suppression d'un espace de noms ne nettoie pas bien les règles créées.


Mise à jour

Il est actuellement pris en charge (même s'il est sous-documenté):

  1. Vérifiez que vous exécutez Kubernetes 1.1 ou une version ultérieure (sous GKE, modifiez votre cluster et vérifiez «Version du nœud»)
  2. Sous Réseau> Adresses IP externes, vous devriez déjà avoir un Ephémère marqué comme pointant vers l'instance de VM de votre cluster (sinon ou incertain, déployez une fois sans loadBalancerIP, attendez que vous ayez une IP externe allouée lorsque vous exécutez kubectl get svcet recherchez cette IP dans le liste sur cette page). Mark l' un d'eux comme statique , Répétons le Adresse externe est 10.10.10.10.
  3. Modifiez votre LoadBalancer pour avoir loadBalancerIP=10.10.10.10comme ci-dessus (adaptez-vous à l'adresse IP qui vous a été donnée par Google).

Maintenant, si vous supprimez votre LoadBalancer ou même votre espace de noms, il doit conserver cette adresse IP lors du re-reploy sur ce cluster. Si vous devez modifier le cluster, certains manipulations manuelles devraient être possibles:

  1. Dans la section «Équilibrage de la charge réseau», onglet «Pools cibles» , cliquez sur le bouton «Créer un pool cible»:
    • Nom: cluster-pool(ou tout autre nom)
    • Région: sélectionnez la région de l'un de vos clusters
    • Bilan de santé: facultatif, si vous le souhaitez
    • Sélectionnez les groupes d'instances existants: votre cluster Kubernetes
  2. Dans la section «Équilibrage de la charge réseau», onglet «Règles de transfert» , cliquez sur le bouton «Créer une règle de transfert»:
    • Nom: http-cross-region-gfr(ou tout autre nom)
    • Région: sélectionnez la région de l'un de vos clusters
    • IP externe: Sélectionnez loadbalancer-ip-crossregionvous venez de réserver
    • Pool cible: sélectionnez cluster-poolvous venez de créer
Wernight
la source
Sont-ils toujours pertinents?
Ben
8

Bonnes nouvelles. Cela sera corrigé dans Kubernetes v1.1. Vous pouvez définir le service.spec.loadBalancerIPchamp sur une adresse IP que vous connaissez.


Précédent:

C'est une caractéristique qui est tombée à travers les mailles du filet. Il était censé fonctionner (et peut-être même avoir fonctionné à un moment donné), mais n'a pas été bien testé et s'est cassé en cours de route, puis a été conçu accidentellement (temporairement).

C'est sur ma liste restreinte pour les choses à corriger après 1.0.

https://github.com/GoogleCloudPlatform/kubernetes/issues/10323

Tim Hockin
la source
Cela devrait probablement être un commentaire, pas une réponse.
Ward - Rétablir Monica
5
@Ward: "Ce n'est pas possible" du développeur est une réponse, à mon humble avis , et il a été accepté comme tel.
Sven