Kubernetes Services and Ingress: Managing Network Access
/ 3 min read
kubernetes , k8s , services , ingress , devops , cloud-native , containers , networking , series:kubernetes:10
Understanding Services and Ingress
Services provide a stable endpoint for accessing pods, while Ingress manages external access to services in a cluster.
Services
Service Types
- ClusterIP (default)
- NodePort
- LoadBalancer
- ExternalName
Basic Service Configuration
apiVersion: v1kind: Servicemetadata: name: my-servicespec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376Service Types Examples
1. ClusterIP Service
apiVersion: v1kind: Servicemetadata: name: backendspec: type: ClusterIP selector: app: backend ports: - protocol: TCP port: 80 targetPort: 80802. NodePort Service
apiVersion: v1kind: Servicemetadata: name: web-servicespec: type: NodePort selector: app: web ports: - port: 80 targetPort: 8080 nodePort: 300803. LoadBalancer Service
apiVersion: v1kind: Servicemetadata: name: my-loadbalancerspec: type: LoadBalancer selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80804. ExternalName Service
apiVersion: v1kind: Servicemetadata: name: my-external-servicespec: type: ExternalName externalName: api.example.comIngress
Basic Ingress Configuration
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: minimal-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /spec: ingressClassName: nginx rules: - http: paths: - path: /testpath pathType: Prefix backend: service: name: test port: number: 80TLS Configuration
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: tls-example-ingressspec: tls: - hosts: - https-example.foo.com secretName: testsecret-tls rules: - host: https-example.foo.com http: paths: - path: / pathType: Prefix backend: service: name: service1 port: number: 80Advanced Configurations
1. Multi-Service Ingress
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: multi-service-ingressspec: rules: - host: foo.bar.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80 - path: /web pathType: Prefix backend: service: name: web-service port: number: 802. Session Affinity
apiVersion: v1kind: Servicemetadata: name: webapp-servicespec: selector: app: webapp sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 ports: - protocol: TCP port: 80 targetPort: 80803. External Traffic Policy
apiVersion: v1kind: Servicemetadata: name: external-servicespec: type: LoadBalancer externalTrafficPolicy: Local ports: - port: 80 targetPort: 8080Real-World Examples
1. Microservices Architecture
apiVersion: v1kind: Servicemetadata: name: frontend-servicespec: selector: app: frontend ports: - port: 80 targetPort: 3000---apiVersion: v1kind: Servicemetadata: name: backend-servicespec: selector: app: backend ports: - port: 80 targetPort: 8080---apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: microservices-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1spec: rules: - host: example.com http: paths: - path: /api/(.*) pathType: Prefix backend: service: name: backend-service port: number: 80 - path: /(.*) pathType: Prefix backend: service: name: frontend-service port: number: 802. Load Balancing Configuration
apiVersion: v1kind: Servicemetadata: name: web-lb annotations: service.beta.kubernetes.io/aws-load-balancer-type: nlb service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"spec: type: LoadBalancer selector: app: web ports: - port: 80 targetPort: 8080Ingress Controllers
1. NGINX Ingress Controller
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: nginx-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2spec: ingressClassName: nginx rules: - host: example.com http: paths: - path: /api(/|$)(.*) pathType: Prefix backend: service: name: api-service port: number: 802. Traefik Ingress Controller
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: traefik-ingress annotations: traefik.ingress.kubernetes.io/router.middlewares: default-strip-prefix@kubernetescrdspec: rules: - host: example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80Best Practices
1. Service Design
- Use meaningful names
- Implement proper selectors
- Configure appropriate ports
- Consider session affinity
2. Ingress Configuration
- Use proper annotations
- Implement TLS
- Configure path types
- Use meaningful hosts
3. Security
- Implement TLS
- Use network policies
- Configure authentication
- Restrict access
Series Navigation
Troubleshooting
Common issues and solutions:
-
Service Discovery Issues
- Check selectors
- Verify port configurations
- Review endpoints
- Check DNS resolution
-
Ingress Problems
- Verify controller setup
- Check annotations
- Review TLS configuration
- Check backend services
Monitoring and Maintenance
1. Service Monitoring
apiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata: name: example-servicespec: selector: matchLabels: app: example endpoints: - port: web2. Health Checks
apiVersion: v1kind: Servicemetadata: name: web-servicespec: ports: - port: 80 targetPort: 8080 selector: app: web---apiVersion: v1kind: Podmetadata: name: web-pod labels: app: webspec: containers: - name: web image: nginx ports: - containerPort: 8080 livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 3 periodSeconds: 3Conclusion
Services and Ingress are fundamental to networking in Kubernetes. Understanding their configuration and best practices is essential for building robust and accessible applications.