Print this page

Создание и управление Pods, Deployments, Services

18 August 2024
Rate this item
(0 votes)

Главные объекты K8s

В Kubernetes основные сущности (или ресурсы), с которыми приходится работать, следующие:

  1. Pod — наименьшая и самая базовая единица развертывания в Kubernetes. Это группа контейнеров, которые делят общую сеть и хранилище. Контейнеры в Pod могут обмениваться данными между собой через shared volumes.

  2. Node — физический или виртуальный сервер, на котором работают Pods. Каждый Node содержит Kubelet (агент, который управляет контейнерами) и контейнерный движок (например, Docker).

  3. ReplicaSet — обеспечивает заданное количество реплик Pod'ов, поддерживая их стабильное состояние. Если один из Pod'ов выходит из строя, ReplicaSet создает новый Pod для замены.

  4. Deployment — управляет созданием и обновлением ReplicaSet'ов, что позволяет контролировать версионирование и стратегию развертывания приложений (например, rolling update).

  5. Service — абстракция для обеспечения стабильного доступа к Pods. С помощью Service можно связать набор Pod'ов, чтобы обращаться к ним по одному имени и порту, даже если сами Pods изменяются или перезапускаются.

  6. Namespace — изолирует ресурсы в кластере Kubernetes, позволяя разделять среду (например, для разных команд или приложений). Это помогает управлять доступом и лимитами ресурсов.

  7. ConfigMap — позволяет хранить неструктурированные конфигурационные данные, которые можно использовать в Pods. Например, можно хранить конфигурационные файлы, переменные окружения.

  8. Secret — похож на ConfigMap, но предназначен для хранения чувствительных данных, таких как пароли или ключи. Данные в Secret'ах шифруются.

  9. StatefulSet — похож на Deployment, но используется для приложений, которые требуют уникальных идентификаторов, стабильных имен хостов и стабильных хранилищ (например, базы данных).

  10. DaemonSet — гарантирует, что экземпляры Pods будут запущены на каждом Node'е в кластере. Это полезно для задач, таких как логирование, мониторинг или другие процессы, которые должны быть запущены на каждом узле.

  11. Job — позволяет выполнять одноразовую задачу или набор задач, которые должны завершиться. Например, это может быть задача по миграции базы данных.

  12. CronJob — аналогично Job, но задачи запускаются по расписанию, как в cron на Unix-системах.

  13. Ingress — объект, который управляет доступом к сервисам в кластере Kubernetes, чаще всего через HTTP. Он позволяет настроить маршрутизацию и SSL-терминацию для внешнего трафика.

  14. Volume — абстракция для хранения данных, которую можно использовать в Pods. Есть различные типы Volumes, включая временные (emptyDir) и постоянные (PersistentVolume, PersistentVolumeClaim).

  15. PersistentVolume (PV) и PersistentVolumeClaim (PVC) — PersistentVolume — это ресурс в кластере, представляющий собой постоянное хранилище данных, а PersistentVolumeClaim — запрос на доступ к этому хранилищу. PVC можно использовать для динамического выделения хранилища.

Эти сущности и их взаимодействие позволяют Kubernetes обеспечивать эффективное и гибкое управление контейнерами и ресурсами в кластере.

Главные объекты K8s

  1. POD - cамый маленький объект который можно создать в K8S. Состоит из контейнера или нескольких контейнеров, то есть контейнер вы не запускаете на K8S, а запускаете POD. Best practice - 1POD = 1Container. Когда весь проект разделен на микросервисы, которые эскалируются по мере необходимости. Для этого нужен Deployment.
  2. Deployment - набор из replicas PODs и нужен для деплоя по Nodes, обновлений Container Image и распределения ресурсов.
  3. Service - предоставляет доступ к этим PODам, которые запущены в deployment через ClusterIP, NodePort, LoadBalancer, ExternalName.
  4. Nodes - сервера, где все вышеперечисленное запущено.
  5. 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, приложение будет доступно по:

  1. ClusterIP - IP только внутри K8s Cluster(default).
  2. NodePort - Определенный Порт на ВСЕХ K8s Worker Nodes.
  3. ExternalName - DNS CNAME Record.
  4. 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