leafleafleafDocy banner shape 01Docy banner shape 02Man illustrationFlower illustration

Шпаргалка по Kubernetes

Время чтения: 3 мин. 53 просмотров

Основные сущности Kubernetes

kubernetes
  1. Pod – самая базовая единица в Kubernetes. Состоит из одного или нескольких контейнеров, которые разделяют сеть и дисковое пространство;
  2. Deployment – контроллер, который управляет созданием и обновлением набора Pod’ов. Обеспечивает масштабирование, обновления без простоя и восстановление Pod’ов в случае их сбоя;
  3. Service — объект, который организует стабильный сетевой доступ к группе Pod’ов (обычно из одного Deployment). Скрывает динамические IP Pod’ов и предоставляет постоянную точку доступа;
  4. Node — физический или виртуальный сервер в кластере, на котором запускаются Pod’ы. На каждом Node работает kubelet, контейнерный runtime и kube-proxy;
  5. Cluster — объединение множества Node’ов, управляемых центральным сервером control plane (включающим API Server, Scheduler, Controller Manager и т.д.). Обеспечивает выполнение, управление и масштабирование приложений;
  6. Namespace — логическая изоляция ресурсов внутри кластера. Позволяет разделять окружения (например, dev, test, prod) в рамках одного кластера.

Namespaces

Основные команды:

kubectl get namespaces – вывести список пространств имён;

Manifest

Manifest — это YAML-файл, описывающий ресурс, который нужно создать в кластере: Pod, Service, Deployment и т.д.

Основные секции манифеста:

Поле Описание
apiVersion
Версия API, которая будет использоваться для создания объекта
kind
Тип объекта (Pod, Deployment, Service, ConfigMap и т.д.)
metadata
Метаданные объекта: имя, метки, аннотации и пространство имён
spec
Спецификация объекта: контейнеры, порты, тома, политики и т.д.

Применение manifest с именем файла deploy_app.yaml:

				
					kubectl apply -f deploy_app.yaml
				
			

Удаление manifest:

				
					kubectl delete -f deploy_app.yaml
				
			

Pod

Pod – самая базовая единица в Kubernetes. Состоит из одного или нескольких контейнеров, которые разделяют сеть и дисковое пространство.

Вывести список Pod’ов:

				
					kubectl get pods
				
			

Создать Pod с именем hello, образом nginx:latest и открыть 80 порт:

				
					kubectl run hello --image=nginx:latest --port=80
				
			

Удалить Pod с именем hello:

				
					kubectl delete pod hello
				
			

Вывести подробную информацию о Pod hello:

				
					kubectl describe pod hello
				
			

Выполнить команду внутри Pod’a, например, вывести дату:

				
					kubectl exec hello -- date
				
			

Подключиться к интерактивной сессии внутри Pod:

				
					kubectl exec -it hello -- /bin/bash
				
			

Вывести логи Pod’a  hello:

				
					kubectl logs hello
				
			

Перенаправить локальный порт 7788 на порт 80 внутри Pod:

				
					kubectl port-forward --address 0.0.0.0 hello 7788:80
				
			

Manifest

				
					---
apiVersion: v1              # Версия API Kubernetes для объекта (Pod — всегда v1)
kind: Pod                   # Тип ресурса — Pod
metadata:
  name: web                 # Имя Pod'а
  labels:                   # Метки для группировки и поиска объектов
    env: prod               # Метка окружения (например, prod, dev, test)
    app: main               # Метка приложения

spec:
  containers:               # Список контейнеров внутри Pod'а
    - name: container-nginx # Имя контейнера (может быть любым)
      image: httpd:latest    # Docker-образ для контейнера (здесь Apache httpd)
      ports:
        - containerPort: 80 # Порт, открытый внутри контейнера
				
			

Deployment

Deployment – контроллер, который управляет созданием и обновлением набора Pod’ов. Обеспечивает масштабирование, обновления и восстановление Pod’ов в случае их сбоя.

Вывести список Deployment’ов:

				
					kubectl get deployment
				
			

Создать Deployment с именем flask и образом winhexs/flask:latest:

				
					kubectl create deployment flask --image=winhexs/flask:latest
				
			

Вывести подробную информацию о Deploymentflask:

				
					kubectl describe deployment flask
				
			

Ручное масштабирование реплик в Deployment flask до 4:

				
					kubectl scale deployment flask --replicas 4
				
			

Вывести список ReplicaSet:

				
					kubectl get replicaset
				
			
Автоматическое масштабирование количества реплик в Deployment flask:
				
					kubectl autoscale deployment flask --min=2 --max=6 --cpu-percent=80
				
			

Минимум 2 реплики, максимум 6, при загрузке CPU выше 80%

Вывести список AutoScaler’ов:

				
					kubectl get hpa
				
			

Вывести историю обновлений Deployment flask:

				
					kubectl rollout history deployment/flask
				
			

Обновить образ контейнера внутри Deployment flask:

				
					 kubectl set image deployment/flask flask=winhexs/flask:2.0.0
				
			

* где flask — имя контейнера внутри Deployment, посмотреть можно командой kubectl describe deployment

Вывести статус текущего обновления Deployment flask:

				
					kubectl rollout status deployment/flask
				
			

Откатиться на предыдущий Deployment flask:

				
					kubectl rollout undo deployment/flask
				
			

Откатиться на конкретную версию Deployment flask:

				
					kubectl rollout undo deployment/flask --to-revision=2
				
			

Принудительно перезапустить Deployment flask:

				
					kubectl rollout restart deployment/flask
				
			

Manifest

				
					---
apiVersion: apps/v1                  # Версия API для ресурса Deployment (актуальная — apps/v1)
kind: Deployment                     # Тип объекта — Deployment

metadata:
  name: flask-webapi-prod            # Имя Deployment (уникальное в пространстве имён)
  labels:
    app: flask-k8s-app               # Метка для группировки, фильтрации и поиска объекта
    env: prod                        # Метка окружения (prod, dev, stage и т.д.)

spec:
  replicas: 2                        # Количество одновременно работающих реплик (Pod'ов)

  selector:                          # Селектор для выбора управляемых Pod'ов
    matchLabels:
      project: api                   # Подбирать только Pod'ы с этой меткой

  template:                          # Шаблон создаваемого Pod'а
    metadata:
      labels:
        project: api                 # Метка Pod'а (обязательно совпадает с selector.matchLabels)
    spec:
      containers:                    # Список контейнеров в Pod'е
        - name: webapi               # Имя контейнера (произвольное, уникальное внутри Pod'а)
          image: winhexs/flask:2.0.0 # Docker-образ для контейнера (с указанием версии)
          ports:
            - containerPort: 5000    # Порт, открываемый внутри контейнера для приложений
				
			

Чтобы включить автоматическое масштабирование Deployment по загрузке ресурсов (CPU, память), в манифест файл нужно добавить секцию HorizontalPodAutoscaler со следующими параметрами:

				
					---
apiVersion: autoscaling/v2                # Актуальная версия API для HorizontalPodAutoscaler (HPA)
kind: HorizontalPodAutoscaler             # Тип объекта — HPA

metadata:
  name: flask-webapi-prod-autoscaling     # Имя HPA (должно быть уникальным в пространстве имён)

spec:
  scaleTargetRef:                         # Указывает, какой объект будет масштабироваться
    apiVersion: apps/v1                   # API-версия объекта, который масштабируем (Deployment)
    kind: Deployment                      # Тип объекта, который масштабируем
    name: flask-webapi-prod               # Имя Deployment, для которого включаем автоскейлинг

  minReplicas: 2                          # Минимальное количество реплик (Pod'ов)
  maxReplicas: 3                          # Максимальное количество реплик (Pod'ов)

  metrics:                                # Метрики, по которым будет работать автоскейлинг
    - type: Resource                      # Тип метрики — ресурс Pod'а (CPU, память и т.д.)
      resource:
        name: cpu                         # Метрика — загрузка процессора
        target:
          type: Utilization               # Тип целевого значения — процент загрузки
          averageUtilization: 75          # Целевое среднее значение загрузки CPU (в %)

    - type: Resource                      # Вторая метрика — использование памяти
      resource:
        name: memory                      # Метрика — загрузка памяти
        target:
          type: Utilization               # Тип целевого значения — процент загрузки
          averageUtilization: 80          # Целевое среднее значение загрузки памяти (в %)
				
			

Service

Виды Service:

  • ClusterIP – создаёт виртуальный IP-адрес, доступный только внутри кластера (используется по-умолчанию);
  • NodePort – открывает определённый порт на всех Worker-nodes;
  •  ExternalName – создаёт DNS-алиас (CNAME) на внешний домен или сервис;
  • LoadBalancer – создаёт внешний IP-адрес через облачный балансировщик нагрузки (доступно только в облачных кластерах).

Вывести список Service’ов:

				
					kubectl get service
				
			

Создать Service для Deployment flask с типом ClusterIP и пробросом на порт 5000:

				
					kubectl expose deployment flask --type=ClusterIP --port=5000
				
			

Удалить Service с именем flask:

				
					kubectl delete service flask
				
			

Создать Service для Deployment flask с типом NodePort и пробросом на порт 5000:

				
					kubectl expose deployment flask --type=NodePort --port=5000
				
			

Leave a Comment

Поделиться этой страницей

Шпаргалка по Kubernetes

Или скопируйте ссылку

СОДЕРЖИМОЕ