Skip to content

Manifest (kubernetes part)

Створення маніфесту для Python-додатка

На першому кроці створення маніфесту потрібно відкрити Visual Studio Code і створити новий файл, наприклад,app-pod.yml. Далі необхідно вказати apiVersion і kind цього маніфесту і додати секцію metadata з полями name (назва пода) та namespace (для логічного і деколи фізичного розділення подів та інших ресурсів).

Одним із прикладів використання неймспейсів є підхід «одна команда розробки – один неймспейс». Таким чином, якщо різні команди розробки можуть створювати ресурси лише у визначених неймспейсах, це дозволяє чітко розрізняти, які ресурси за що відповідають. Також назва namespace може говорити про його призначення. Наприклад, у kube-system знаходяться поди, які потрібні самому кластеру. Ресурси в межах неймспейсу мають мати унікальні імена, проте вони можуть дублюватись, якщо належать до різних неймспейсів.

На неймспейси можна накладати ліміти на використання CPU, Disk Memory та інших ресурсів. Такі ліміти вбережуть від використання усіх ресурсів кластера однією командою до прикладу.

Гаразд, тепер повернемось назад до маніфесту! До нього також можна додати поле labels — колекцію ключів-значень, яка допомагає організовувати поди. Інші ресурси можуть посилатись на поди за допомогою цього поля.

Також потрібно описати специфікацію контейнера, для цього необхідно додати нову секцію spec і в ній секцію containers. Containers — це секція, у якій описується один або більше контейнерів, які належать даному поду. Перший контейнер включатиме такий опис:

  • name — назва контейнера;
  • image — повний шлях до імеджа разом з назвою репозиторію. За замовчуванням Kubernetes буде використовувати Docker Hub для пошуку вказаних імеджів.

Отже, наш файл буде виглядати ось так:

apiVersion: v1
kind: Pod
metadata:
  name: kube2py
  namespace: mateapp
  labels:
    app: kube2py
spec:
  containers:
    - name: kube2py
      image: semorgana/kube2py-repo:1.0.0
      ports:
        - containerPort: 8080

Тепер час розгорнути додаток. Для цього з термінала виконується команда kubectl apply -f app-pod.yml`:

Як бачиш, щось пішло не так. Спробуємо розібратись! Статус ErrImagePull свідчить про те, що Kubernetes не зміг завантажити image. Дізнатись деталі можна за допомогою командиkubectl describe pod kube2py -n mateapp:

Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Normal   Scheduled  2m16s                default-scheduler  Successfully assigned mateapp/kube2py to docker-desktop
  Normal   Pulling    42s (x4 over 2m15s)  kubelet            Pulling image "kulyk404/kub2py"
  Warning  Failed     39s (x4 over 2m13s)  kubelet            Failed to pull image "kulyk404/kub2py": Error response from daemon: pull access denied for kulyk404/kub2py, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
  Warning  Failed     39s (x4 over 2m13s)  kubelet            Error: ErrImagePull
  Warning  Failed     28s (x6 over 2m13s)  kubelet            Error: ImagePullBackOff
  Normal   BackOff    17s (x7 over 2m13s)  kubelet            Back-off pulling image "kulyk404/kub2py"

Events вказує, що scheduler успішно обрав робочу ноду для поду, потім kubelet почав завантажувати імедж, але сталась помилка: репозиторій не існує або потрібно залогінитись. Причина у цьому випадку у пропущеній літері i у назві репозиторію ikulyk404/kub2py, і це можна виправити, відредагувавши маніфест, який вже відправлено на API-сервер.

Для цього треба виконати команду kubectl edit pod kube2py -n mateapp, після чого відкриється редактор Vim. Щоб почати редагування, потрібно натиснути англійську i, знайти рядок, який треба відредагувати, і дописати букву і до назви репозиторію у секції опису імеджа контенйнера. Далі, натиснути *ESC* , ввести wq і натиснути *Enter* . wq означає write and quit:

kubectl edit pod kube2py -n mateapp         1 ✘  docker-desktop ⎈  21:01:36  
pod/kube2py edited

Давай знову подивимось на всі поди у неймспейсі. Помилка, яка виникла цього разу: ikulyk404/kub2py:latest not found. Це означає, що kubelet не зміг знайти імедж з тегом latest. Тобто потрібно вказати точну версію імеджа, яку ти збираєшся використовувати. Необхідно виконати команду kubectl edit pod kube2py -n mateapp, дописати версію і зберегти зміни.

При повторній перевірці подів у неймспейсі статус Running підтвердить, що усе в порядку:

kubectl get pods -n mateapp             ✔  23s   docker-desktop ⎈  21:11:40  
NAME      READY   STATUS    RESTARTS          AGE
busybox   1/1     Running   172 (5m57s ago)   7d6h
kube2py   1/1     Running   0                 18m
nginx     1/1     Running   0                 7d6h

Тестування можна здійснити через додатковий под busybox, який вже є у неймспейсі. Щоб бачити IP, потрібно виконати команду kubectl get pods -o wide -n mateapp, а після цього зайти у busybox:

kubectl -n mateapp exec -it busybox -- sh і виконати команду curl:

 root@busybox:/ ]$ curl 10.1.0.9:8080

    Docker is Awesome!
<pre>                   ##        .</pre>
<pre>             ## ## ##       ==</pre>
<pre>          ## ## ## ##      ===</pre>
<pre>      /""""""""""""""""\___/ ===</pre>
<pre> ~~~ (~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===-- ~~~</pre>
<pre>      \______ o          __/</pre>
<pre>        \    \        __/</pre>
<pre>         \____\______/</pre>

Ще одна важлива команда — це kubectl port-forward, яка дозволяє перенаправляти трафік з одного чи декількох локальних портів на под. Ця команда може бути корисною під час пошуку проблем або тестування та виглядає наступним чином: kubectl port-forward pod/kube2py 8081:8080 -n mateapp, де pod/kube2py вказує, що робимо** port-forwardна под, після чого вказується конкретний под. Далі вказується, з якого локального порту і на який порт в поді буде перенаправлятися трафік.

kubectl port-forward pod/kube2py 8081:8080 -n mateapp  ✔  30sdocker-desktop ⎈  21:24:05  
Forwarding from 127.0.0.1:8081 -> 8080
Forwarding from [::1]:8081 -> 8080

Сторінка localhost:8081 у браузері буде виглядати наступним чином: