Sobes.tech
Middle

Hoe kunnen we vanaf de externe netwerka toegang krijgen tot de Kubernetes-container waarin de applicatie draait?

sobes.tech AI

Antwoord van AI

Er zijn verschillende hoofdmethoden om toegang te krijgen tot een Kubernetes-container vanuit een extern netwerk:

  1. Service van het type LoadBalancer:

    • Cloudproviders (AWS, GCP, Azure) maken een externe load balancer aan die het verkeer naar de pods van je applicatie leidt.
    • Een extern IP-adres wordt toegewezen.
    • De eenvoudigste manier in een cloudomgeving.
  2. Service van het type NodePort:

    • Opent een poort op elke knooppunt in de cluster.
    • Deze poort leidt het verkeer door naar de service van je applicatie.
    • Toegang via het IP-adres van elk knooppunt en het NodePort-nummer.
    • Minder schaalbaar en veiliger dan LoadBalancer.
  3. Service van het type ClusterIP samen met Ingress:

    • ClusterIP - service alleen toegankelijk binnen de cluster.
    • Ingress - API-object dat externe toegang tot services in de cluster beheert.
    • De Ingress-controller (bijvoorbeeld Nginx Ingress Controller, Traefik) luistert naar extern verkeer en leidt het naar de juiste ClusterIP-service.
    • Maakt gecentraliseerd beheer van routing, SSL-terminatie, load balancing mogelijk.
    • Flexibele en schaalbare aanpak.
  4. Service van het type ExternalName:

    • Maakt een alias voor een extern domein. Biedt geen directe toegang tot de container via deze service, maar maakt het mogelijk om een DNS-naam binnen de cluster te gebruiken om toegang te krijgen tot een externe bron. Niet geschikt voor directe toegang tot de container van buitenaf.
  5. Directe toegang tot NodePort/HostPort op Pod:

    • Je kunt hostPort specificeren in de pod-specificatie om een poort te openen op de knooppunt waar de pod draait. Zeer af te raden voor productieomgevingen vanwege slechte beheersbaarheid en mogelijke conflicten met poorten.
    • Evenzo kan nodePort worden gespecificeerd in een NodePort-type service.

Configuratievoorbeelden:

  • LoadBalancer Service:

    // 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:

    // 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 # optioneel, Kubernetes wijst toe als niet gespecificeerd
      type: NodePort
    
  • Ingress (voor ClusterIP service):

    // service-clusterip.yaml (ervan uitgaande dat deze al bestaat)
    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
    

De keuze van de methode hangt af van de schaalbaarheidsvereisten, beveiliging, implementatieomgeving (cloud of on-premise) en de behoefte aan gecentraliseerd toegangsbeheer. Ingress is de voorkeursoplossing voor productieomgevingen.