В Kubernetes для запуска и управления приложениями используются различные абстракции. Три ключевых из них - Deployment, Service и Ingress - обеспечивают масштабирование, доступность и внешний доступ к вашим приложениям.
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
labels:
app: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: nginx:latest
ports:
- containerPort: 80
apiVersion
: Версия API Kubernetes для Deployment.kind
: Тип объекта (Deployment).metadata.name
: Имя Deployment.metadata.labels
: Метки, идентифицирующие Deployment.spec.replicas
: Желаемое количество реплик Pod'ов.spec.selector.matchLabels
: Селектор, определяющий, какие Pod'ы управляются этим Deployment. Должен соответствовать меткам в template.metadata.labels
.spec.template.metadata.labels
: Метки, которые будут присвоены создаваемым Pod'ам.spec.template.spec.containers
: Описание контейнеров в Pod'е (имя, образ, порты и т.д.).kubectl apply -f my-deployment.yaml
kubectl get deployments
kubectl describe deployment my-app-deployment
kubectl scale deployment my-app-deployment --replicas=5
kubectl set image deployment/my-app-deployment my-app-container=nginx:1.21
kubectl rollout undo deployment/my-app-deployment
kubectl rollout history deployment/my-app-deployment
yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-service
labels:
app: my-app
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
apiVersion
: Версия API Kubernetes для Service.kind
: Тип объекта (Service).metadata.name
: Имя Service.metadata.labels
: Метки, идентифицирующие Service.spec.selector
: Селектор, определяющий, к каким Pod'ам направлять трафик. Должен соответствовать меткам spec.template.metadata.labels
в Deployment.spec.ports
: Список портов, которые предоставляет Service.protocol
: Протокол (TCP, UDP, SCTP).port
: Порт Service, на котором он принимает входящие соединения.targetPort
: Порт контейнера, на который перенаправляется трафик.yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-nodeport-service
labels:
app: my-app
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
type: NodePort
: Указывает тип Service.spec.ports.nodePort
: Порт, открытый на каждом узле (обычно в диапазоне 30000-32767).yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-loadbalancer-service
labels:
app: my-app
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
: Указывает тип Service. Kubernetes будет пытаться создать внешний балансировщик нагрузки.kubectl apply -f my-service.yaml
kubectl get services
kubectl describe service my-app-service
kubectl get endpoints my-app-service
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80
- host: api.example.com
http:
paths:
- path: /v1
pathType: Prefix
backend:
service:
name: my-api-service
port:
number: 8080
apiVersion
: Версия API Kubernetes для Ingress.kind
: Тип объекта (Ingress).metadata.name
: Имя Ingress.metadata.annotations
: Дополнительные настройки, специфичные для Ingress Controller (например, nginx.ingress.kubernetes.io/rewrite-target
).spec.rules
: Список правил маршрутизации.host
: Доменное имя, для которого применяется правило.http.paths
: Список путей и соответствующих бэкендов.path
: Путь в URL-запросе.pathType
: Тип сопоставления пути (Prefix
, Exact
, ImplementationSpecific
).backend.service.name
: Имя Service, на который направляется трафик.backend.service.port.number
: Порт Service, на который направляется трафик.kubectl apply -f my-ingress.yaml
kubectl get ingress
kubectl describe ingress my-app-ingress
Deployment, Service и Ingress являются фундаментальными строительными блоками для развертывания и управления приложениями в Kubernetes. Понимание их назначения и взаимодействия позволяет создавать масштабируемые, отказоустойчивые и доступные приложения. Для обеспечения внешнего доступа к вашим приложениям в большинстве случаев потребуется связка Deployment (для управления приложением), Service (для внутренней балансировки) и Ingress (для внешней маршрутизации).