Исследование и отладка приложений Kubernetes

KubernetesKubernetesBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии (lab) вы будете исследовать и отлаживать приложения Kubernetes. Вы запустите локальный кластер Kubernetes с помощью Minikube, развернете пример приложения и изучите различные методы отладки, такие как проверка конфигурации приложения, просмотр журналов, выполнение команд внутри подов (pods) и анализ событий кластера. Эти навыки являются обязательными для разработки и устранения неполадок в приложениях на основе Kubernetes.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/exec("Exec") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/logs("Logs") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") subgraph Lab Skills kubernetes/get -.-> lab-434645{{"Исследование и отладка приложений Kubernetes"}} kubernetes/create -.-> lab-434645{{"Исследование и отладка приложений Kubernetes"}} kubernetes/apply -.-> lab-434645{{"Исследование и отладка приложений Kubernetes"}} kubernetes/describe -.-> lab-434645{{"Исследование и отладка приложений Kubernetes"}} kubernetes/exec -.-> lab-434645{{"Исследование и отладка приложений Kubernetes"}} kubernetes/logs -.-> lab-434645{{"Исследование и отладка приложений Kubernetes"}} kubernetes/config -.-> lab-434645{{"Исследование и отладка приложений Kubernetes"}} end

Запуск кластера Kubernetes

На этом шаге вы узнаете, как запустить и проверить локальный кластер Kubernetes с использованием Minikube. Это важный первый шаг для разработки и тестирования приложений Kubernetes на вашем локальном компьютере.

Сначала запустите кластер Minikube:

minikube start

Пример вывода:

😄  minikube v1.29.0 on Ubuntu 22.04
✨  Automatically selected the docker driver
📌  Using Docker driver with root permissions
🔥  Creating kubernetes in kubernetes cluster
🔄  Restarting existing kubernetes cluster
🐳  Preparing Kubernetes v1.26.1 on Docker 20.10.23...
🚀  Launching Kubernetes...
🌟  Enabling addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace

Теперь проверьте статус кластера с помощью нескольких команд:

minikube status
kubectl get nodes

Пример вывода:

minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

NAME       STATUS   ROLES           AGE   VERSION
minikube   Ready    control-plane   1m    v1.26.1

Эти команды подтверждают, что:

  1. Minikube успешно запущен.
  2. Локальный кластер Kubernetes был создан.
  3. Кластер готов к использованию.
  4. У вас есть однодоменный (single-node) кластер с возможностями управляющего узла (control plane).

Давайте проверим контекст (context) кластера, чтобы убедиться, что вы подключены к правильному кластеру:

kubectl config current-context

Пример вывода:

minikube

Это подтверждает, что kubectl настроен на использование кластера Minikube.

Развертывание примерного приложения

На этом шаге вы узнаете, как создавать и развертывать простое приложение Kubernetes с использованием манифестов YAML. Мы создадим как под (Pod), так и развертывание (Deployment), чтобы продемонстрировать различные способы развертывания приложений.

Сначала создайте каталог для ваших манифестов Kubernetes:

mkdir -p ~/project/k8s-manifests
cd ~/project/k8s-manifests

Создайте простой манифест пода (Pod) для NGINX:

nano nginx-pod.yaml

Добавьте следующее содержимое:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - containerPort: 80

Нажмите Ctrl+X, затем Y и Enter, чтобы сохранить и выйти.

Теперь создайте манифест развертывания (Deployment):

nano nginx-deployment.yaml

Добавьте следующее содержимое:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

Примените манифесты для создания ресурсов:

kubectl apply -f nginx-pod.yaml
kubectl apply -f nginx-deployment.yaml

Пример вывода:

pod/nginx-pod created
deployment.apps/nginx-deployment created

Проверьте созданные ресурсы:

kubectl get pods
kubectl get deployments

Пример вывода:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-pod                           1/1     Running   0          1m
nginx-deployment-xxx-yyy            1/1     Running   0          1m
nginx-deployment-xxx-zzz            1/1     Running   0          1m
nginx-deployment-xxx-www            1/1     Running   0          1m

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           1m

Подождите, пока развертывание создаст реплики. В столбце READY должно отображаться 3/3, когда все реплики будут готовы.

Основные различия между подом (Pod) и развертыванием (Deployment):

  • Под (Pod): Одиночный экземпляр приложения.
  • Развертывание (Deployment): Управляет несколькими репликами и обеспечивает самоподдержку.

Проверка конфигурации приложения

На этом шаге вы узнаете, как проверять и получать детали конфигурации развертываний (Deployments) и подов (Pods) Kubernetes с помощью различных команд kubectl. Понимание того, как проверять конфигурации ресурсов, является важным для устранения неполадок и понимания настройки вашего приложения.

Сначала давайте получим конфигурацию пода (Pod), который мы создали на предыдущем шаге, в формате YAML:

kubectl get pod nginx-pod -o yaml

Пример вывода (частичный):

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
  labels:
    app: nginx
spec:
  containers:
    - image: nginx:latest
      imagePullPolicy: Always
      name: nginx
      ports:
        - containerPort: 80
      resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always

Теперь давайте проверим конфигурацию развертывания (Deployment):

kubectl get deployment nginx-deployment -o yaml

Пример вывода (частичный):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

Используйте команду kubectl describe, чтобы получить более подробную информацию о ресурсах:

kubectl describe pod nginx-pod
kubectl describe deployment nginx-deployment

Пример вывода для команды describe pod (частичный):

Name:         nginx-pod
Namespace:    default
Priority:     0
Node:         minikube/172.17.0.2
Start Time:   [timestamp]
Labels:       app=nginx
Annotations:  <none>
Status:       Running
IP:           172.17.0.5
Containers:
  nginx:
    Container ID:   docker://[container-id]
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@[image-digest]
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
    Ready:          True
    Restart Count:  0
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True

Вы также можете использовать вывод в формате JSON для более удобного машинного чтения:

kubectl get pod nginx-pod -o json

Основные аспекты, на которые стоит обратить внимание при проверке конфигураций:

  • Метаданные ресурса (имя, метки, пространство имен)
  • Контейнерный образ и порты
  • Количество реплик (для развертываний)
  • Статус и условия ресурса

Просмотр журналов приложения

На этом шаге вы узнаете, как просматривать и проверять журналы для подов (Pods) Kubernetes с помощью команды kubectl logs. Просмотр журналов является важным для понимания поведения приложения, отладки проблем и мониторинга производительности приложения.

Сначала выведите список доступных подов, чтобы убедиться, что вы работаете с правильными ресурсами:

kubectl get pods

Пример вывода:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-pod                           1/1     Running   0          20m
nginx-deployment-xxx-yyy            1/1     Running   0          20m
nginx-deployment-xxx-zzz            1/1     Running   0          20m
nginx-deployment-xxx-www            1/1     Running   0          20m

Просмотрите журналы для конкретного пода:

## Просмотр журналов для пода nginx-pod
kubectl logs nginx-pod

Пример вывода:

/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
...
2023/xx/xx [notice] xxxx#x: signal process started

Просмотрите журналы для подов развертывания (Deployment):

## Просмотр журналов для конкретного пода в развертывании
POD_NAME=$(kubectl get pods -l app=nginx | grep nginx-deployment | head -n 1 | awk '{print $1}')
kubectl logs $POD_NAME

Исследуйте дополнительные параметры просмотра журналов:

## Просмотр последних 50 строк журналов
kubectl logs nginx-pod --tail=50

## Следить за журналами в режиме реального времени
kubectl logs -f nginx-pod

Пример просмотра журналов в режиме реального времени:

[будет отображаться вывод журналов в режиме реального времени]

Выйдите из режима просмотра журналов в реальном времени, нажав Ctrl + C.

Для подов с несколькими контейнерами укажите имя контейнера:

## Если в поде есть несколько контейнеров
kubectl logs nginx-pod -c nginx

Основные методы просмотра журналов:

  • Просмотр всей истории журналов
  • Ограничение количества строк журналов
  • Следить за журналами в режиме реального времени
  • Указание контейнера в поде с несколькими контейнерами

Отладка с использованием kubectl exec

На этом шаге вы узнаете, как использовать команду kubectl exec для выполнения команд внутри пода (Pod) Kubernetes, что является важным для отладки и исследования контейнерных сред.

Сначала проверьте доступные поды:

kubectl get pods

Пример вывода:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-pod                           1/1     Running   0          30m
nginx-deployment-xxx-yyy            1/1     Running   0          30m
nginx-deployment-xxx-zzz            1/1     Running   0          30m
nginx-deployment-xxx-www            1/1     Running   0          30m

Запустите интерактивную оболочку в поде nginx-pod:

kubectl exec -it nginx-pod -- /bin/bash

Пример взаимодействия внутри пода:

## Проверьте конфигурацию nginx
cat /etc/nginx/nginx.conf

## Проверьте установленные пакеты
apt update && apt list --installed

## Выйдите из оболочки пода
exit

Убедитесь, что вы вышли из интерактивной оболочки, чтобы вернуться к приглашению оболочки.

Выполните конкретные команды без входа в интерактивную оболочку:

## Проверьте версию nginx
kubectl exec nginx-pod -- nginx -v

## Выведите список файлов в корневой директории веб-сервера
kubectl exec nginx-pod -- ls /usr/share/nginx/html

Для подов развертывания (Deployment) выберите конкретный под:

## Получите имя пода из развертывания
POD_NAME=$(kubectl get pods -l app=nginx | grep nginx-deployment | head -n 1 | awk '{print $1}')

## Выполните команды в поде развертывания
kubectl exec -it $POD_NAME -- /bin/bash

Основные методы использования kubectl exec:

  • Запуск интерактивных оболочек
  • Выполнение конкретных команд
  • Исследование внутреннего состояния подов
  • Отладка конфигураций контейнеров

Использование kubectl describe для устранения неполадок

На этом шаге вы узнаете, как использовать команду kubectl describe для диагностики и устранения неполадок с ресурсами Kubernetes, которая предоставляет подробную информацию о статусах подов (Pods), развертываний (Deployments) и компонентов кластера.

Сначала создадим проблемное развертывание для демонстрации отладки:

cd ~/project/k8s-manifests
nano problematic-deployment.yaml

Добавьте следующее содержимое:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: debug-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: debug
  template:
    metadata:
      labels:
        app: debug
    spec:
      containers:
        - name: debug-container
          image: non-existent-image:latest
          ports:
            - containerPort: 80

Примените развертывание:

kubectl apply -f problematic-deployment.yaml

Теперь используйте команду kubectl describe для исследования развертывания:

kubectl describe deployment debug-deployment

Пример вывода:

Name:                   debug-deployment
Namespace:              default
CreationTimestamp:      [timestamp]
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=debug
Replicas:               2 desired | 0 available | 2 total | 2 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Conditions:
  Type           Status   Reason
  ----           ------   ------
  Available      False    MinimumReplicasUnavailable
  Progressing    False    ProgressDeadlineExceeded
OldReplicaSets:  <none>
NewReplicaSet:   debug-deployment-xxx (2/2 replicas created)
Events:
  Type     Reason                    Age   From                   Message
  ----     ------                    ----  ----                   -------
  Warning  FailedCreate              1m    deployment-controller  Failed to create pod
  Normal   ScalingReplicaSet         1m    deployment-controller  Scaled up replica set

Опишите поды, чтобы получить более подробную информацию:

kubectl describe pods -l app=debug

Пример вывода:

Name:           debug-deployment-xxx-yyy
Namespace:      default
Priority:       0
Node:           minikube/172.17.0.2
Start Time:     [timestamp]
Labels:         app=debug
Annotations:    <none>
Status:         Pending
Conditions:
  Type           Status
  Initialized    True
  Ready          False
  PodScheduled   True
Events:
  Type     Reason                  Age   From               Message
  ----     ------                  ----  ----               -------
  Warning  FailedCreatePodSandBox  1m    kubelet            Failed to create pod sandbox
  Warning  Failed                  1m    kubelet            Failed to pull image

Опишите ресурсы узла:

kubectl describe nodes minikube

Основные методы устранения неполадок:

  • Определение статуса развертывания и подов
  • Просмотр подробных сообщений об ошибках
  • Понимание причин, по которым ресурсы не запускаются
  • Проверка состояния узла и кластера

Анализ событий кластера (kubectl get events) для поиска подсказок и временных рамок

На этом шаге вы узнаете, как использовать команду kubectl get events для исследования событий на уровне всего кластера, понимания системных активностей и диагностики проблем в вашей среде Kubernetes.

Сначала просмотрите все события кластера:

kubectl get events

Пример вывода:

LAST SEEN   TYPE      REASON                 OBJECT                           MESSAGE
10m         Warning   FailedCreate           deployment/debug-deployment     Failed to create pod
5m          Normal    Scheduled              pod/nginx-pod                   Successfully assigned default/nginx-pod to minikube
3m          Normal    Pulled                 pod/nginx-deployment-xxx-yyy    Container image "nginx:latest" already present on machine

Отфильтруйте события по пространству имен:

kubectl get events -n default

Используйте более детальные параметры просмотра событий:

## Следить за событиями в режиме реального времени
kubectl get events -w

## Получить события, отсортированные по времени создания
kubectl get events --sort-by='.metadata.creationTimestamp'

Создайте сценарий, генерирующий пользовательские события:

cd ~/project/k8s-manifests
nano event-test-deployment.yaml

Добавьте следующее содержимое:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: event-test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: event-test
  template:
    metadata:
      labels:
        app: event-test
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          resources:
            limits:
              cpu: "100m"
              memory: "50Mi"

Примените развертывание и изучите события:

kubectl apply -f event-test-deployment.yaml
kubectl get events

Расширенное фильтрование событий:

## Фильтрация по типу события
kubectl get events --field-selector type=Warning

## Фильтрация по конкретному ресурсу
kubectl get events --field-selector involvedObject.kind=Deployment

Основные методы анализа событий:

  • Просмотр событий на уровне всего кластера
  • Фильтрация событий по пространству имен
  • Следить за событиями в режиме реального времени
  • Определение предупреждающих и ошибочных событий

Итог

В этом лабораторном занятии вы узнали, как запустить и проверить локальный кластер Kubernetes с использованием Minikube, что является важным первым шагом для разработки и тестирования приложений Kubernetes на вашем локальном компьютере. Вы также научились создавать и развертывать простое приложение Kubernetes с использованием манифестов YAML, включая как под (Pod), так и развертывание (Deployment). Кроме того, вы изучили различные команды для проверки конфигурации, просмотра журналов, отладки и устранения неполадок в приложении, что дало вам более глубокое понимание того, как управлять и мониторить приложения Kubernetes.