Kubernetes Services

In deze post wordt beschreven hoe een service in Kubernetes applicaties kan exposen op basis van een verzameling pods, waarbij de service fungeert als een interne load-balancer. Verder wordt toegelicht hoe DNS-namen het mogelijk maken om services eenvoudig te benaderen binnen het cluster, en hoe Ingress objecten externe toegang beheren met extra functionaliteiten zoals SSL, load balancing en name-based virtual hosting.

Een service biedt de mogelijk om een applicatie te exposed op basis van een set aan pods. Een service is eigenlijk een soort interne load-balancer.

Een service zal altijd routen richting een endpoint, elke pod beschikt automatisch over een endpoint die richt op de service.

Service Types

Er zijn verschillende soorten services.

  • ClusterIP - Exposed een applicatie binnen het cluster.
  • NodePort - exposed een applicatie naar buiten het cluster.
  • LoadBalancer - Exposed een applicatie naar buiten het cluster, op basis van een cloud load balancer, de cloud provider zal dus wel load-balancing moeten ondersteunen.
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx

DNS

net zoals pods beschikt een service ook over een DNS naam, deze wordt als volgt geformateerd:

service-name.namespace.svc.cluster.local

de DNS kan vanuit elke namespace bereikt worden, ongeacht waar deze staat. Binnen een namespace kan een pod een service bereiken op basis van alleen de service naam.

Ingress

Een ingress is een kubernetes object dat externe toegang tot services beheert. Een ingress bevat meer functionaliteiten dan een NodePort, zoals SSL, LoadBalancing en name-based virtual hosting.

Een Ingress doet van zichzelf niets, om ze functionaliteit te geven moeten ze een ingress controller hebben.

apiVersion: networking.k8s.io/v1 
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
 - http:
   paths:
   - path: /somepath
     pathType: Prefix
     backend:
       service:
       name: my-service
       port:
         name: web