В 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.yamlkubectl get deploymentskubectl describe deployment my-app-deploymentkubectl scale deployment my-app-deployment --replicas=5kubectl set image deployment/my-app-deployment my-app-container=nginx:1.21kubectl rollout undo deployment/my-app-deploymentkubectl rollout history deployment/my-app-deploymentyaml
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.yamlkubectl get serviceskubectl describe service my-app-servicekubectl get endpoints my-app-serviceyaml
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.yamlkubectl get ingresskubectl describe ingress my-app-ingressDeployment, Service и Ingress являются фундаментальными строительными блоками для развертывания и управления приложениями в Kubernetes. Понимание их назначения и взаимодействия позволяет создавать масштабируемые, отказоустойчивые и доступные приложения. Для обеспечения внешнего доступа к вашим приложениям в большинстве случаев потребуется связка Deployment (для управления приложением), Service (для внутренней балансировки) и Ingress (для внешней маршрутизации).