web-dev-qa-db-fra.com

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

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 IP externe sur laquelle l'application est accessible, mais je ne trouve aucun moyen de la configurer pour utiliser l'IP que je veux. Le 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?

17
Ben

TL; DR Google Container Engine exécutant Kubernetes v1.1 prend en charge loadBalancerIP marquez simplement l'IP attribuée automatiquement comme statique en premier.

Kubernetes v1.1 prend en charge externalIPs :

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éétablies .

La documentation é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 venez de créer 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 cochez la case "Node version")
  2. Sous Réseau> Adresses IP externes vous devriez déjà avoir certains éphémères marqués comme pointant vers l'instance VM VM (si non ou incertaine) , déployez une fois sans loadBalancerIP, attendez qu'une IP externe soit allouée lorsque vous exécutez kubectl get svc, et recherchez cette adresse IP dans la liste de cette page). Marquez l'un d'eux comme statique , disons-le Adresse externe est 10.10.10.10.
  3. Modifiez votre LoadBalancer pour avoir loadBalancerIP=10.10.10.10 comme 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-rechargement sur ce cluster. Si vous devez modifier le cluster, certains manipulations manuelles devraient être possibles:

  1. Sous 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. Sous 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-crossregion vous venez de réserver
    • Pool cible: sélectionnez cluster-pool vous venez de créer
9
Wernight

Bonnes nouvelles. Cela sera corrigé dans Kubernetes v1.1. Vous pouvez définir le service.spec.loadBalancerIP champ vers 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 pourrait 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/1032

8
Tim Hockin