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:
-
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.
-
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.
-
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.
-
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.
-
Directe toegang tot NodePort/HostPort op Pod:
- Je kunt
hostPortspecificeren 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
nodePortworden gespecificeerd in een NodePort-type service.
- Je kunt
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.