← Назад к вопросам

Что реализует сервис в кубере

1.0 Junior🔥 171 комментариев
#Kubernetes

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Service в Kubernetes

Service - это один из фундаментальных концепций в Kubernetes. Это абстракция которая обеспечивает сетевой доступ к pods.

Проблема которую решает Service

Pods в Kubernetes:
- Создаются и удаляются динамически
- Получают новые IP адреса каждый раз
- Не стабильны по своей природе

Проблема: как обращаться к pods если их IP меняется?

Решение: Service - стабильный IP и DNS имя

Что реализует Service

1. Stable network endpoint

Service имеет:
- Стабильный cluster IP (не меняется)
- Стабильный DNS имя (service-name.namespace.svc.cluster.local)
- Стабильный порт

При создании pods - Service автоматически маршрутизирует трафик

2. Load Balancing

Когда несколько pods в deployment:
- Service распределяет трафик между ними
- Round-robin по умолчанию
- Реализует балансировку на layer 4 (TCP/UDP)

3. Service Discovery

Внутри кластера pods могут обращаться к другим сервисам
Вместо: http://10.0.5.23:8080  (IP pod'а)
Использовать: http://my-service:8080  (DNS Service'а)

DNS автоматически решает имя в cluster IP

Типы Service'ов

1. ClusterIP (default)

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp  # Маршрутизирует трафик к pods с меткой
  ports:
  - protocol: TCP
    port: 80       # Port на который слушает Service
    targetPort: 8080  # Port на котором слушает приложение
  type: ClusterIP  # Видит только внутри кластера
Особенности:
- Видит только внутри Kubernetes кластера
- Обращение: http://my-service:80
- IP не меняется
- Идеален для internal communication

2. NodePort

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
    nodePort: 30000  # Port на каждом node'е (30000-32767)
Особенности:
- Доступна из вне кластера
- На КАЖДОМ node'е открывается порт (30000-32767)
- Обращение: http://<node-ip>:30000
- Обычно для development/testing

3. LoadBalancer

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
Особенности:
- Создаёт external load balancer (AWS ELB, GCP LB, Azure LB)
- Выделяет external IP
- Обращение: http://<external-ip>:80
- Для production external access
- Платно (в облаках)

4. ExternalName

apiVersion: v1
kind: Service
metadata:
  name: my-external-service
spec:
  type: ExternalName
  externalName: example.com  # Внешний сервис
Особенности:
- Проксирует трафик к external сервису
- Дает stable DNS имя для external сервиса
- Полезна для migration

Как Service работает (архитектура)

┌─────────────────────────────────────┐
│      Kubernetes Cluster             │
│                                     │
│  ┌────────────────────────────────┐ │
│  │  Service (my-service)          │ │
│  │  cluster IP: 10.0.0.1          │ │
│  │  Port: 80                      │ │
│  │  Selector: app=MyApp           │ │
│  └────────────┬───────────────────┘ │
│               │                     │
│        Load Balance                 │
│               │                     │
│     ┌─────────┼─────────┐           │
│     ▼         ▼         ▼           │
│  ┌─────┐  ┌─────┐  ┌─────┐         │
│  │Pod1 │  │Pod2 │  │Pod3 │         │
│  │:8080│  │:8080│  │:8080│         │
│  └─────┘  └─────┘  └─────┘         │
│                                     │
│  kube-proxy (на каждом node)        │
│  - Слушает service changes          │
│  - Обновляет iptables rules         │
│  - Реализует load balancing         │
│                                     │
└─────────────────────────────────────┘

Практический пример

1. Deployment с несколькими replicas

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web  # Важно: эта метка используется Service'ом
    spec:
      containers:
      - name: app
        image: myapp:1.0
        ports:
        - containerPort: 8080  # Port внутри контейнера

2. Service который маршрутизирует трафик

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web  # Соответствует labels в Deployment
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80        # Internal port Service'а
    targetPort: 8080  # Port на pods'е

3. Использование

# Создать
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

# Проверить Service
kubectl get services
NAME          TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)
web-service   LoadBalancer   10.0.0.1       203.0.113.1      80:30000/TCP

# Обращение из вне
curl http://203.0.113.1:80

# Обращение из другого pod'а
curl http://web-service:80
curl http://web-service.default.svc.cluster.local:80

# Проверить endpoints (к каким pods маршрутизирует)
kubectl get endpoints web-service
NAME          ENDPOINTS
web-service   10.1.0.1:8080,10.1.0.2:8080,10.1.0.3:8080

Ingress (более высокий уровень)

Service работает на Layer 4 (TCP/UDP). Для Layer 7 (HTTP/HTTPS) используется Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 8000
      - path: /web
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

Session Affinity (sticky sessions)

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  sessionAffinity: ClientIP  # Одинаковый pod для одного клиента
  sessionAffinityConfig:
    clientIPConfig:
      timeoutSeconds: 10800  # 3 часа

Service Mesh (продвинутый)

Для сложных сценариев используется Service Mesh (Istio, Linkerd):

  • Canary deployments
  • Traffic splitting
  • Circuit breaking
  • Rate limiting

Практическое резюме

Service реализует:

Stable network identity

  • Constant cluster IP
  • Consistent DNS name
  • Port stability

Load balancing

  • Распределение трафика
  • Health checking
  • Endpoint management

Service discovery

  • DNS resolution
  • Internal communication
  • Service registry

Traffic routing

  • Layer 4 балансировка
  • Port mapping
  • Protocol support

Выводы

Service - это network abstraction layer в Kubernetes который:

  1. Обеспечивает стабильный доступ к pods
  2. Реализует load balancing
  3. Позволяет service discovery
  4. Выполняет трафик маршрутизацию
  5. Критичен для production Kubernetes

Без Service'а было бы невозможно строить надёжные приложения в K8s.

Что реализует сервис в кубере | PrepBro