Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 который:
- Обеспечивает стабильный доступ к pods
- Реализует load balancing
- Позволяет service discovery
- Выполняет трафик маршрутизацию
- Критичен для production Kubernetes
Без Service'а было бы невозможно строить надёжные приложения в K8s.