Введение
Под (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.


