Создание и проверка пода

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

Введение

Под (Pod) — это минимальный объект рабочей нагрузки, который вы обычно создаете в Kubernetes. Он объединяет один или несколько контейнеров, предоставляет им общую сетевую среду и позволяет Kubernetes планировать их размещение на узле.

В этой лабораторной работе вы создадите один под с небольшим предустановленным образом контейнера, дождетесь, пока Kubernetes переведет его в состояние готовности, и изучите объект с разных сторон. Вы будете использовать команды kubectl get, kubectl describe и kubectl get -o yaml, чтобы в будущих лабораторных работах по написанию манифестов вы опирались на реальное состояние объектов, а не на заучивание YAML-файлов наизусть.

Подготовка рабочего пространства для пода

На этом этапе вы подготовите отдельное пространство имен (namespace) для своего первого пода и сделаете его целевым по умолчанию для ваших команд.

Начните работу в /home/labex/project — это общее рабочее пространство, используемое на протяжении всего курса подготовки к CKAD.

mkdir -p /home/labex/project
cd /home/labex/project

После запуска виртуальной машины серверу API Kubernetes может потребоваться немного времени, чтобы стать доступным. Сначала выполните эту команду. Если появится сообщение о том, что сервер еще не готов, подождите несколько секунд и повторите попытку, пока узел не перейдет в состояние Ready.

kubectl get nodes --request-timeout=5s

Ожидаемый вывод включает один готовый узел control-plane:

NAME         STATUS   ROLES           AGE   VERSION
labex-v135   Ready    control-plane   ...   v1.35...

Создайте пространство имен с именем ckad-prep-pod. Пространство имен обеспечивает изоляцию объектов в рамках этой лабораторной работы, поэтому созданный вами под не будет смешиваться с объектами из других заданий.

kubectl create namespace ckad-prep-pod

Команда должна подтвердить создание пространства имен:

namespace/ckad-prep-pod created

Установите текущее пространство имен контекста на ckad-prep-pod. После этого команды, работающие с пространствами имен, такие как kubectl get pods, будут по умолчанию использовать именно его.

kubectl config set-context --current --namespace=ckad-prep-pod

Вывод должен подтвердить изменение текущего контекста:

Context "labex-v135" modified.

Проверьте, что текущее пространство имен изменилось:

kubectl config view --minify --output 'jsonpath={..namespace}'; echo

Ожидаемый вывод:

ckad-prep-pod

Создание пода

На этом этапе вы создадите один под с помощью kubectl run и дождетесь его готовности.

Команда kubectl run позволяет создавать базовый под непосредственно из командной строки. Опция --image выбирает образ контейнера, а --restart=Never сохраняет его как автономный под, а не как объект более высокого уровня (например, Deployment).

В этой лабораторной работе используется registry.k8s.io/pause:3.10.1 — крошечный образ, который уже присутствует в подготовленной среде Kubernetes. Он работает без необходимости настройки приложения, что позволяет сосредоточиться на жизненном цикле пода, а не на загрузке образов или поведении приложения.

kubectl run sample-pod --image=registry.k8s.io/pause:3.10.1 --restart=Never

Команда должна подтвердить, что Kubernetes принял объект пода:

pod/sample-pod created

Создание — это еще не готовность. Kubernetes должен запланировать под, запустить контейнер и пометить под как готовый. Используйте kubectl wait, чтобы дождаться условия Ready для пода.

kubectl wait --for=condition=Ready pod/sample-pod --timeout=60s

Ожидаемый вывод:

pod/sample-pod condition met

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

kubectl get pods

Вы должны увидеть sample-pod с 1/1 готовыми контейнерами и статусом Running:

NAME      READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          ...

Проверка размещения пода и событий

На этом этапе вы изучите, где запущен под, и прочитаете журнал событий, который Kubernetes записал во время его запуска.

Обычный вывод kubectl get pods довольно компактен. Добавьте -o wide, чтобы увидеть детали планирования, такие как имя узла и IP-адрес пода.

kubectl get pod sample-pod -o wide

Ожидаемый вывод включает узел и внутренний IP-адрес пода:

NAME      READY   STATUS    RESTARTS   AGE   IP           NODE
sample-pod   1/1     Running   0          ...   ...        labex-v135

Команда kubectl describe предоставляет удобный для чтения обзор объекта. Она включает метаданные, детали контейнера, условия и недавние события. Для начинающих раздел Events особенно полезен, так как он показывает, что именно сделал Kubernetes после создания пода.

kubectl describe pod sample-pod

Ищите в выводе строки, подобные этим:

Name:             sample-pod
Namespace:        ckad-prep-pod
Status:           Running
Containers:
  sample-pod:
    Image:        registry.k8s.io/pause:3.10.1
Conditions:
  Type                        Status
  Ready                       True
Events:
  Type    Reason     Age   From               Message
  Normal  Scheduled  ...   default-scheduler  Successfully assigned ...
  Normal  Pulled     ...   kubelet            Container image "registry.k8s.io/pause:3.10.1" already present ...
  Normal  Created    ...   kubelet            Created container ...
  Normal  Started    ...   kubelet            Started container ...

Точное время событий и сообщения могут варьироваться, но суть остается неизменной: Kubernetes планирует под, подготавливает образ, создает контейнер и запускает его.

Чтение полей объекта Pod

На этом этапе вы изучите выбранные поля пода в формате YAML и свяжете их с концепциями объектов, которые вы видели в предыдущей лабораторной работе.

Команда kubectl get может вывести объект в формате YAML с помощью ключа -o yaml. Это фактическое представление объекта, возвращаемое сервером API, включая поля, которые Kubernetes добавил после создания. В приведенной ниже команде используется sed -n '1,80p', чтобы отобразить только первые 80 строк для удобства чтения.

kubectl get pod sample-pod -o yaml | sed -n '1,80p'

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

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  namespace: ckad-prep-pod
spec:
  containers:
  - image: registry.k8s.io/pause:3.10.1
    name: sample-pod
...
status:
...

Вам не нужно запоминать все сгенерированные поля. Пока сосредоточьтесь на базовой структуре: apiVersion, kind, metadata, spec и status. В следующей лабораторной работе вы будете писать важные части самостоятельно.

Используйте целевой запрос JSONPath, чтобы вывести только поле образа. Выражения JSONPath полезны, когда вам нужно получить одно конкретное значение из большого объекта.

kubectl get pod sample-pod -o jsonpath='{.spec.containers[0].image}'; echo

Ожидаемый вывод:

registry.k8s.io/pause:3.10.1

Резюме

Вы создали автономный под, дождались, пока Kubernetes пометит его как готовый, изучили детали планирования и событий, а также прочитали ключевые поля объекта из вывода YAML и JSONPath. Теперь у вас есть конкретный под, который послужит основой для следующей лабораторной работы, где вы будете писать манифест пода вместо того, чтобы создавать объект напрямую с помощью kubectl run.