Как работать с сетями в Kubernetes?

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

Ответ

В продакшен-кластерах Kubernetes я настраиваю сетевой стек для обеспечения безопасной и производительной коммуникации между подами, сервисами и внешним миром.

1. Выбор и настройка CNI-плагина:

  • Использую Cilium (на eBPF) для продвинутой сетевой политики, observability и производительности:
    # Установка Cilium через Helm
    helm install cilium cilium/cilium --namespace kube-system 
    --set hubble.relay.enabled=true 
    --set hubble.ui.enabled=true
  • Или Calico для более традиционных setup с поддержкой Network Policies.

2. Конфигурация сервисов и ingress-контроллеров:

  • Для внутреннего трафика использую ClusterIP сервисы.
  • Для внешнего доступа разворачиваю Ingress-контроллер (чаще всего nginx-ingress или traefik) с TLS-терминацией:
    # Ingress с TLS и path-based routing
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: app-ingress
    annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    spec:
    tls:
    - hosts:
    - app.example.com
    secretName: app-tls-secret
    rules:
    - host: app.example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 8080

3. Сетевая политика (NetworkPolicy):

  • Реализую принцип наименьших привилегий, ограничивая трафик между неймспейсами и подами:
    # Запрещаем весь входящий трафик, кроме разрешенного
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: default-deny-ingress
    spec:
    podSelector: {}
    policyTypes:
    - Ingress
    ---
    # Разрешаем трафик только от фронтенда к бэкенду
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: allow-frontend-to-backend
    spec:
    podSelector:
    matchLabels:
      app: backend
    ingress:
    - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

4. Service Mesh для сложных сценариев:

  • Внедряю Istio или Linkerd для:
    • Canary-развертываний
    • Трафик-шейпинга
    • Сквозного mTLS-шифрования
    • Детальной телеметрии

5. Мониторинг сетевого трафика:

  • Использую Cilium Hubble или kube-proxy метрики для отслеживания сетевых проблем.
  • Настраиваю алерты на необычные паттерны трафика или недоступность сервисов.