Ответ
Для маршрутизации 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 для ограничения доступа