Как настроить TCP трафик в Kubernetes

«Как настроить TCP трафик в Kubernetes» — вопрос из категории Kubernetes, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для маршрутизации TCP-трафика в Kubernetes я настраиваю Service с соответствующим типом. Вот как я это делаю на практике:

1. Базовый Service типа ClusterIP (для внутреннего трафика):

apiVersion: v1
kind: Service
metadata:
  name: tcp-database
spec:
  selector:
    app: postgres
  ports:
  - name: postgres
    protocol: TCP
    port: 5432      # Порт, на котором сервис доступен внутри кластера
    targetPort: 5432 # Порт контейнера

2. Service типа NodePort для доступа снаружи:

apiVersion: v1
kind: Service
metadata:
  name: tcp-service-external
spec:
  type: NodePort
  selector:
    app: custom-tcp-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
    nodePort: 30080  # Опционально: фиксированный порт на нодах (30000-32767)

3. LoadBalancer для облачных провайдеров:

apiVersion: v1
kind: Service
metadata:
  name: tcp-loadbalancer
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
spec:
  type: LoadBalancer
  selector:
    app: production-app
  ports:
  - name: https
    protocol: TCP
    port: 443
    targetPort: 8443

4. Для не-HTTP TCP сервисов через Ingress (Nginx Ingress Controller):

# ConfigMap для ingress-контроллера
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  "5432": "default/postgres-service:5432"
  "6379": "redis/redis-service:6379"

Проверка работы:

# Проверяю endpoints
kubectl get endpoints tcp-database

# Тестирую подключение изнутри кластера
kubectl run test-pod --image=alpine --rm -it -- sh
nc -zv tcp-database.default.svc.cluster.local 5432

# Для NodePort проверяю с ноды
curl http://<NODE_IP>:30080

Важные моменты из моего опыта:

  • Для stateful TCP-приложений (БД, Redis) часто использую sessionAffinity: ClientIP
  • Настраиваю readinessProbe с TCP-проверкой для подов
  • Для высоконагруженных TCP-сервисов увеличиваю externalTrafficPolicy: Local для сохранения source IP
  • В production всегда настраиваю Network Policies для ограничения доступа