Главные объекты K8s
В Kubernetes основные сущности (или ресурсы), с которыми приходится работать, следующие:
-
Pod — наименьшая и самая базовая единица развертывания в Kubernetes. Это группа контейнеров, которые делят общую сеть и хранилище. Контейнеры в Pod могут обмениваться данными между собой через shared volumes.
-
Node — физический или виртуальный сервер, на котором работают Pods. Каждый Node содержит Kubelet (агент, который управляет контейнерами) и контейнерный движок (например, Docker).
-
ReplicaSet — обеспечивает заданное количество реплик Pod'ов, поддерживая их стабильное состояние. Если один из Pod'ов выходит из строя, ReplicaSet создает новый Pod для замены.
-
Deployment — управляет созданием и обновлением ReplicaSet'ов, что позволяет контролировать версионирование и стратегию развертывания приложений (например, rolling update).
-
Service — абстракция для обеспечения стабильного доступа к Pods. С помощью Service можно связать набор Pod'ов, чтобы обращаться к ним по одному имени и порту, даже если сами Pods изменяются или перезапускаются.
-
Namespace — изолирует ресурсы в кластере Kubernetes, позволяя разделять среду (например, для разных команд или приложений). Это помогает управлять доступом и лимитами ресурсов.
-
ConfigMap — позволяет хранить неструктурированные конфигурационные данные, которые можно использовать в Pods. Например, можно хранить конфигурационные файлы, переменные окружения.
-
Secret — похож на ConfigMap, но предназначен для хранения чувствительных данных, таких как пароли или ключи. Данные в Secret'ах шифруются.
-
StatefulSet — похож на Deployment, но используется для приложений, которые требуют уникальных идентификаторов, стабильных имен хостов и стабильных хранилищ (например, базы данных).
-
DaemonSet — гарантирует, что экземпляры Pods будут запущены на каждом Node'е в кластере. Это полезно для задач, таких как логирование, мониторинг или другие процессы, которые должны быть запущены на каждом узле.
-
Job — позволяет выполнять одноразовую задачу или набор задач, которые должны завершиться. Например, это может быть задача по миграции базы данных.
-
CronJob — аналогично Job, но задачи запускаются по расписанию, как в cron на Unix-системах.
-
Ingress — объект, который управляет доступом к сервисам в кластере Kubernetes, чаще всего через HTTP. Он позволяет настроить маршрутизацию и SSL-терминацию для внешнего трафика.
-
Volume — абстракция для хранения данных, которую можно использовать в Pods. Есть различные типы Volumes, включая временные (emptyDir) и постоянные (PersistentVolume, PersistentVolumeClaim).
-
PersistentVolume (PV) и PersistentVolumeClaim (PVC) — PersistentVolume — это ресурс в кластере, представляющий собой постоянное хранилище данных, а PersistentVolumeClaim — запрос на доступ к этому хранилищу. PVC можно использовать для динамического выделения хранилища.
Эти сущности и их взаимодействие позволяют Kubernetes обеспечивать эффективное и гибкое управление контейнерами и ресурсами в кластере.
Главные объекты K8s
- POD - cамый маленький объект который можно создать в K8S. Состоит из контейнера или нескольких контейнеров, то есть контейнер вы не запускаете на K8S, а запускаете POD. Best practice - 1POD = 1Container. Когда весь проект разделен на микросервисы, которые эскалируются по мере необходимости. Для этого нужен Deployment.
- Deployment - набор из replicas PODs и нужен для деплоя по Nodes, обновлений Container Image и распределения ресурсов.
- Service - предоставляет доступ к этим PODам, которые запущены в deployment через ClusterIP, NodePort, LoadBalancer, ExternalName.
- Nodes - сервера, где все вышеперечисленное запущено.
- Cluster - объединение Nodes.
Pods
Поды создаются и управляются манифест-файлами и командами.
#----------------my-web.yaml----------------------------------
# Simpliest Manifest File to create Pod with one Container
#-------------------------------------------------------------
apiVersion : v1 #Какой API используется
kind: Pod #ЧТО создается
metadata:
name: hello #Просто имя
labels: #Просто мета-информация
env : prod
app : main
tier : frontend
owner: kowalski
spec: #Спицификация
containers: #Контейнер
- name : container-hello #Просто имя
image: nginx:latest ##Можно менять без delete pods
ports: ##изменить и apply -f еще раз
- containerPort: 80 #Порт контейнера
- name : container-api
image: tomcat:8.5.38
ports:
- containerPort: 8080
Команда | Что делает |
kubectl get pods | Показать все Pods |
kubectl run hello --image=nginx:latest --port=80 | Создать Pod из DockerImage nginx:latest и открыть порт 80 |
kubectl port-forward hello 7777:80 | Порт 7777 нашего компа теперь Порт 80 нашего Pod |
kubectl describe pods hello | Показать все данные Pod hello |
kubectl delete pods hello | Стереть Pod hello |
kubectl logs hello | Показать лог из Pod hello |
kubectl exec my-web -- date | Запустить команду date на Pod my-web |
kubectl exec -it my-web -- bash | Запустить команду bash интерактивно на Pod my-web |
kubectl apply -f myfile.yaml | Создать объекты в K8s из Манифест Файла myfile.yaml |
kubectl delete -f myfile.yaml | Удалить объекты из K8s из Манифест Файла myfile.yaml |
Deployments
Deployments создаются и управляются манифест-файлами и командами.
#---------------------------------------------------------------
# Manifest File to create Deployment with Labels and AutoScaling
#---------------------------------------------------------------
apiVersion : apps/v1
kind: Deployment
metadata:
name: my-web-deployment-autoscaling
labels:
app : my-k8s-application
env : prod
owner: DenisAstahov
spec:
replicas: 2 #Не нужно, если используется HorizontalPodAutoscaler
selector: #Будет работать с подами
matchLabels: #которые совпадают с этими Labels
project: mossad #Можно использовать RegExp
template: #Шаблон
metadata:
labels: #Какие Labels будут присваиваться подам
project: mossad
spec:
containers:
- name : mossad-web
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: my-autoscaling
spec:
scaleTargetRef:
apiVersion: apps/v2beta1v1 #Эскалация
kind: Deployment #ЧТО эскалировать
name: my-web-deployment-autoscaling #с КАКИМ именем
minReplicas: 2
maxReplicas: 6
metrics: #основываясь НА
- type: Resource
resource:
name: cpu
targetAverageUtilization: 70 #70% vCPU perContainer
- type: Resource
resource:
name: memory
targetAverageUtilization: 80
Команда | Что делает |
kubectl get deployments | Показать все Depoyments |
kubectl get rs | Показать все ReplicaSets |
kubectl create deployment kowalski-deployment --image httpd:latest | Создать Deployment из DockerImage httpd:latest |
kubectl describe deployments kowalski-deployment | Показать все данные о Deployments kowalski-deployment |
kubectl scale deployment kowalski-deployment --replicas 4 | Создать ReplicaSets |
kubectl autoscale deployment kowalski --min=10 --max=15 --cpu-percent=80 | Создать AutoScaling для Deployment kowalski |
kubectl get hpa | Показать все HPA - HorizontalAutoScalers |
kubectl set image deployment/kowalski-deployment old=hub/new:version2 --record | Заменить Deployment kowalski-deployment Image на новый |
kubectl rollout status deployment/kowalski-deployment | Показать статус Обновления |
kubectl rollout history deployment/kowalski-deployment | Показать историю Обновлении |
kubectl rollout undo deployment/kowalski-deployment | Вернуться на предидущую версию |
kubectl rollout undo deployment/kowalski-deployment --to-revision=2 | Вернуться на указанную версию |
kubectl rollout restart deployment/kowalski-deployment | Передеплоить текущую версию |
kubectl delete deployments kowalski-deployment | Стереть Deployment kowalski-deployment |
Services
Существует 4 вида сервисов. При создании Service, приложение будет доступно по:
- ClusterIP - IP только внутри K8s Cluster(default).
- NodePort - Определенный Порт на ВСЕХ K8s Worker Nodes.
- ExternalName - DNS CNAME Record.
- LoadBalancer - только для Cloud Cluster (AWS, GCP, Azure).
#-------------------------------------------------------------------------------------
# Manifest File to create Single Container Pod with AutoScaling Deployment and Service
#-------------------------------------------------------------------------------------
apiVersion : apps/v1
kind: Deployment
metadata:
name: my-web-deployment-autoscaling
labels:
app : my-k8s-deployment
spec:
selector:
matchLabels:
project: xyz
template:
metadata:
labels:
project: xyz #Service will look for those PODS Labels!!!
spec:
containers:
- name : xyz-web
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: my-autoscaling
spec:
scaleTargetRef:
apiVersion: apps/v2beta1v1
kind: Deployment
name: my-web-deployment-autoscaling
minReplicas: 2
maxReplicas: 6
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 70
- type: Resource
resource:
name: memory
targetAverageUtilization: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-autoscaling-pod-service
labels:
env : prod
owner: kowalski
spec:
selector:
project: xyz #Selecting PODs with those Labels
ports:
- name : app-listener
protocol : TCP
port : 80 #Port on Load Balancer
targetPort: 80 #Port on Pod
type: LoadBalancer
Команда | Что делает |
kubectl create deployment kowalski-deployment --image adv4000/k8sphp:latest | Создать Deployment из Docker Image adv4000/k8sphp:latest |
kubectl get deployment | Показать все Depoyments |
kubectl scale deployment kowalski-deployment --replicas 4 | Создать ReplicaSets |
kubectl expose deployment kowalski-deployment --type=ClusterIP --port 80 | Создать Service типа ClusterIP для Deployment |
kubectl expose deployment kowalski-deployment --type=NodePort --port 80 | Создать Service типа NodePort для Deployment |
kubectl expose deployment kowalski-deployment --type=LoadBalancer --port 80 | Создать Service типа LoadBalancer для Deployment |
kubectl get services | Показать все Services |
kubectl get svc | Показать все Services |
kubectl describe nodes | grep ExternalIP | Показать External IP со всех Worker Nodes |
kubectl delete services my-webserver | Удалить Service my-webserver |