leafleafleafDocy banner shape 01Docy banner shape 02Man illustrationFlower illustration

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

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

Основные сущности 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
				
			

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

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

Manifest

NodePort

				
					---
apiVersion: v1                          # API-версия для Service
kind: Service                           # Тип объекта — Service
metadata:
  name: flask-webapi-prod-service       # Имя сервиса (уникально в пределах namespace)
  labels:
    env: prod                           # Метка окружения (опционально)
spec:
  selector:
    project: api                        # Селектор для выбора Pod'ов по метке (должно совпадать с Deployment)
  type: NodePort                        # Тип сервиса — NodePort (доступ извне через ноды)
  ports:
    - name: api                         # Имя порта (произвольное, полезно для читаемости)
      protocol: TCP                     # Протокол порта (чаще всего TCP)
      port: 5000                        # Порт сервиса внутри кластера (ClusterIP)
				
			

По умолчанию при типе NodePort Kubernetes откроет случайный порт из диапазона 30000–32767 на всех нодах кластера.

Чтобы задать фиксированный внешний порт, нужно явно указать параметр nodePort:

				
					  ports:
    - name: api
      protocol: TCP
      port: 5000
      nodePort: 31060
				
			

LoadBalancer

				
					---
apiVersion: v1                          # API-версия для объекта Service
kind: Service                           # Тип объекта — Service
metadata:
  name: flask-webapi-prod-service       # Имя сервиса (должно быть уникальным в namespace)
  labels:
    env: prod                           # Метка окружения (опционально, для фильтрации и поиска)
spec:
  selector:
    project: api                        # Селектор для выбора Pod'ов по метке (должен совпадать с Deployment)
  type: LoadBalancer                    # Тип сервиса — LoadBalancer (доступ извне через облачный балансировщик)
  ports:
    - name: api                         # Имя порта (произвольное, удобно для читаемости)
      protocol: TCP                     # Протокол (чаще всего TCP)
      port: 80                          # Внешний порт сервиса (на балансировщике)
      targetPort: 5000                  # Порт внутри контейнера в Pod'е, на который будет проксироваться трафик
				
			

Leave a Comment

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

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

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

СОДЕРЖИМОЕ