Sobes.tech
Middle

Πώς μπορούμε να αποκτήσουμε πρόσβαση στο κοντέινερ Kubernetes στο οποίο τρέχει η εφαρμογή από το εξωτερικό δίκτυο;

sobes.tech AI

Απάντηση από AI

Υπάρχουν μερικοί βασικοί τρόποι πρόσβασης σε ένα κοντέινερ Kubernetes από το εξωτερικό δίκτυο:

  1. Υπηρεσία τύπου LoadBalancer:

    • Οι πάροχοι cloud (AWS, GCP, Azure) δημιουργούν έναν εξωτερικό φορτωτή, ο οποίος κατευθύνει την κυκλοφορία στα pods της εφαρμογής σας.
    • Ανατίθεται μια εξωτερική διεύθυνση IP.
    • Ο πιο απλός τρόπος σε cloud περιβάλλον.
  2. Υπηρεσία τύπου NodePort:

    • Ανοίγει μια θύρα σε κάθε κόμβο του cluster.
    • Αυτή η θύρα κατευθύνει την κυκλοφορία στην υπηρεσία της εφαρμογής σας.
    • Πρόσβαση μέσω IP οποιουδήποτε κόμβου και αριθμού NodePort.
    • Λιγότερο κλιμακώσιμο και ασφαλές από το LoadBalancer.
  3. Υπηρεσία τύπου ClusterIP μαζί με Ingress:

    • Το ClusterIP είναι μια υπηρεσία διαθέσιμη μόνο εντός του cluster.
    • Το Ingress είναι ένα αντικείμενο API που διαχειρίζεται την εξωτερική πρόσβαση στις υπηρεσίες του cluster.
    • Ο διαχειριστής Ingress (π.χ., Nginx Ingress Controller, Traefik) ακούει την εξωτερική κυκλοφορία και την δρομολογεί στην κατάλληλη υπηρεσία ClusterIP.
    • Επιτρέπει την κεντρική διαχείριση δρομολόγησης, SSL τερματισμού, φορτισής ισορροπίας.
    • Ευέλικτη και κλιμακούμενη προσέγγιση.
  4. Υπηρεσία τύπου ExternalName:

    • Δημιουργεί ένα ψευδώνυμο για έναν εξωτερικό τομέα. Δεν παρέχει άμεση πρόσβαση στο κοντέινερ μέσω αυτής της υπηρεσίας, αλλά επιτρέπει τη χρήση DNS ονόματος εντός του cluster για πρόσβαση σε εξωτερικό πόρο. Δεν είναι κατάλληλο για άμεση πρόσβαση στο κοντέινερ από έξω.
  5. Άμεση πρόσβαση σε NodePort/HostPort στο Pod:

    • Μπορείτε να ορίσετε το hostPort στην προδιαγραφή του pod, για να ανοίξετε μια θύρα στον κόμβο όπου τρέχει το pod. Δεν συνιστάται σε παραγωγικό περιβάλλον λόγω χαμηλής διαχειρισιμότητας και πιθανών συγκρούσεων θυρών.
    • Ομοίως, μπορείτε να ορίσετε το nodePort σε μια υπηρεσία τύπου NodePort.

Παραδείγματα διαμόρφωσης:

  • Υπηρεσία LoadBalancer:

    // service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: my-app-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: LoadBalancer
    
  • Υπηρεσία NodePort:

    // service-nodeport.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: my-app-service-np
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
          nodePort: 30000 # προαιρετικά, το Kubernetes θα το αναθέσει αν δεν οριστεί
      type: NodePort
    
  • Ingress (υπηρεσία ClusterIP):

    // service-clusterip.yaml (υπάρχει ήδη)
    apiVersion: v1
    kind: Service
    metadata:
      name: my-app-service-ci
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: ClusterIP
    
    // ingress.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-app-ingress
    spec:
      rules:
        - host: myapp.example.com
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: my-app-service-ci
                    port:
                      number: 80
    

Η επιλογή εξαρτάται από τις απαιτήσεις κλιμάκωσης, ασφάλειας, περιβάλλοντος ανάπτυξης (cloud ή on-premise) και ανάγκης κεντρικής διαχείρισης πρόσβασης. Το Ingress είναι η προτιμώμενη λύση για παραγωγικά συστήματα.