2017-07-17 6 views
2

J'ai créé un cluster en utilisant la plateforme de Google Cloud (moteur conteneur) et déployé une nacelle en utilisant le fichier YAML suivant:Comment exposer le port multiple en utilisant un service d'équilibrage de charge dans Kubernetes

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: deployment-name 
spec: 
    replicas: 1 
    template: 
    metadata: 
     name: pod-name 
     labels: 
     app: app-label 
    spec: 
     containers: 
     - name: container-name 
     image: gcr.io/project-id/image-name 
     resources: 
     requests: 
      cpu: 1 
     ports: 
     - name: port80 
     containerPort: 80 
     - name: port443 
     containerPort: 443 
     - name: port6001 
     containerPort: 6001 

Ensuite, je veux créer un service permettant au pod d'écouter sur tous ces ports. Je sais que oici fichier YAML fonctionne pour créer un service qui écoute sur un port:

apiVersion: v1 
kind: Service 
metadata: 
    name: service-name 
spec:  
    ports: 
    - port: 80 
    targetPort: 80 
    selector: 
    app: app-label 
    type: LoadBalancer 

Cependant quand je veux le pod à écouter sur plusieurs ports comme celui-ci, il ne fonctionne pas:

apiVersion: v1 
kind: Service 
metadata: 
    name: service-name 
spec:  
    ports: 
    - port: 80 
    targetPort: 80 
    - port: 443 
    targetPort: 443 
    - port: 6001 
    targetPort: 6001 
    selector: 
    app: app-label 
    type: LoadBalancer 

Comment puis-je faire écouter mon pod à plusieurs ports?

+0

Avez-vous essayé avec plusieurs services? – danielepolencic

+0

@danielepolencic merci d'avoir répondu. J'ai essayé avec plusieurs services et cela fonctionne, le problème avec cela est que vous obtenez une adresse IP externe par service. N'existe-t-il aucun moyen d'activer les pods pour écouter plusieurs ports sans avoir plusieurs services ou pour avoir un service qui écoute sur plusieurs ports? – Sebastien

Répondre

3

Vous avez deux options:

  1. Vous pouvez avoir plusieurs services, un pour chaque port. Comme vous l'avez souligné, chaque service se retrouvera avec une adresse IP différente
  2. Vous pourriez avoir un seul service avec plusieurs ports. Dans ce cas particulier, vous devez donner un nom à tous les ports.

Dans votre cas, le service devient:

apiVersion: v1 
kind: Service 
metadata: 
    name: service-name 
spec: 
    ports: 
    - name: http 
    port: 80 
    targetPort: 80 
    - name: https 
    port: 443 
    targetPort: 443 
    - name: something 
    port: 6001 
    targetPort: 6001 
    selector: 
    app: app-label 
    type: LoadBalancer 

Cela est nécessaire pour que les paramètres peuvent être désambiguïsé.

+0

Merci pour la réponse, savez-vous également comment exposer une gamme de ports (par exemple de 6001-6300)? @danielepolencic – Sebastien

+0

D'après ce que j'ai pu comprendre, k8s ne supporte pas les plages de ports à partir de maintenant: https://github.com/kubernetes/kubernetes/issues/23864 – danielepolencic

+0

Salut, j'ai essayé de cette façon et je ne suis pas en mesure d'accéder à la IP et port d'internet. Si j'expose un port, cela fonctionne bien. Mais quand j'expose 80 et 443 comme ci-dessus. Il échoue. La page n'est pas ouverte. Est-ce que ça marche pour toi? –