Как развернуть приложение Python в Kubernetes с помощью Okteto

0 Акции
0
0
0
0

Введение

Okteto — это платформа разработки, упрощающая процесс создания приложений Kubernetes. Она позволяет разработчикам создавать и тестировать свои приложения непосредственно в кластерах Kubernetes без необходимости настройки сложных локальных сред разработки. Okteto обеспечивает обновление приложений, работающих в кластерах Kubernetes, в режиме реального времени, позволяя разработчикам видеть изменения в своем коде без необходимости пересобирать или повторно развертывать приложения.

В этом руководстве вы создадите приложение на Python и развернете его в Kubernetes с помощью Okteto.

Предпосылки
  • Кластер Kubernetes 1.28
  • kubectl установлен и настроен для взаимодействия с вашим кластером.
  • Учетная запись Docker Hub
  • Docker запущен на вашем локальном компьютере.
  • Для использования Okteto требуется лицензия. Чтобы получить лицензионный ключ, зарегистрируйтесь для получения 30-дневной бесплатной пробной версии Okteto.
  • Менеджер пакетов Helm установлен на вашем локальном компьютере.
  • Полностью зарегистрированное доменное имя, указывающее на балансировщик нагрузки, используемый Nginx Ingress. Необходимо создать запись A с именем * и IP-адресом балансировщика нагрузки.

Шаг 1 – Создайте программу на Python.

Во-первых, вам нужно убедиться, что Python установлен в вашей системе Ubuntu. Проверить это можно, открыв терминал и набрав:

python3 --version

Если Python установлен, эта команда отобразит его версию. В противном случае вы можете установить его с помощью следующей команды:

sudo apt install python3 python3-venv python3-pip -y

Затем создайте каталог для хранения кода приложения и других настроек.

mkdir my-app

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

cd my-app
python3 -m venv python-env

Затем активируйте виртуальную среду, используя следующую команду.

source python-env/bin/activate

Далее создайте новый файл Python для вашего приложения. Например, создайте простой файл app.py:

nano app.py

Добавьте следующий код:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, This is a simple Python App!"
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')

Затем установите веб-фреймворк Flask.

pip install flask

Теперь запустите свою программу на Python, используя следующую команду.

python3 app.py

Вы увидите следующий вывод.

Output * Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://172.20.10.2:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 311-959-468

Теперь, когда приложение Flask запущено локально, вы можете проверить его работу с помощью curl:

curl -X GET -H "Content-Type: application/json" http://localhost:5000

В ответ от приложения Flask вы должны получить следующее сообщение.

OutputHello, This is a simple Python App!

После завершения работы над проектом вы можете деактивировать виртуальную среду, выполнив следующую команду:

deactivate

К этому моменту вы создали программу на Python и протестировали её локально.

Шаг 2 – Создайте Docker-контейнер для приложения Python.

Создание Docker-образа для Python-приложения подразумевает создание образа Docker, содержащего среду Python и зависимости, необходимые для запуска приложения.

Сначала создайте файл с именем Dockerfile в корневом каталоге вашего Python-приложения.

nano Dockerfile

Добавьте следующий контент:

# Use an official Python runtime as a parent image
FROM python:3.8-slim
# Set the working directory in the container
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed dependencies specified in requirements.txt
RUN pip install flask
# Make port 5000 available to the world outside this container
EXPOSE 5000
# Define environment variable
ENV NAME DockerizedPythonApp
# Run app.py when the container launches
CMD ["python3", "./app.py"]
В этом Dockerfile:
  • FROM python:3.8-slim: Указывает базовый образ для использования. Вы используете официальный образ Python с установленным Python 3.8.
  • WORKDIR /app: Устанавливает рабочий каталог внутри контейнера в /app.
  • Добавить ./app: Копирует содержимое текущего каталога в папку /app контейнера.
  • Команда `RUN pip install flask` устанавливает фреймворк Flask.
  • EXPOSE 5000: Открывает порт 5000 для приема входящих соединений.
  • CMD [“python3″, “app.py”]: Указывает команду, которая будет выполнена при запуске контейнера. В данном случае запускается приложение app.py.

Теперь выполните следующую команду, чтобы собрать образ в соответствии с инструкциями в вашем Dockerfile.

docker build -t my-app .

После сборки образа Docker вы можете запустить свое приложение в контейнере, используя собранный образ:

docker run -dit -p 5000:5000 my-app:latest

Эта команда запускает контейнер из образа my-app и сопоставляет порт контейнера с портом хоста 5000.

Проверить работоспособность контейнера приложения можно с помощью команды `docker ps`.

docker ps

Результат будет следующим:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
761c54c77411 my-app:latest "python3 ./app.py" 3 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp pedantic_wescoff

Откройте веб-браузер или используйте curl для доступа к приложению по URL-адресу http://your-server-ip:5000. Вы должны увидеть сообщение «Hello, This is a simple Python App!», указывающее на то, что ваше приложение Python работает внутри контейнера Docker.

Вы успешно контейнеризировали ваше приложение на Python с помощью Docker.

Шаг 3 – Загрузите образ Docker для Python в реестр DockerHub.

Во-первых, вам потребуется учетная запись DockerHub. Если у вас ее нет, вы можете создать ее на веб-сайте DockerHub.

Для входа в Docker Hub используйте команду `docker login`. Вам будет предложено ввести ваше имя пользователя и пароль от Docker Hub.

docker login

Вывод этой команды будет следующим:

OutputLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: [email protected]
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

Перед загрузкой образа в Docker Hub необходимо также пометить его тегом, указав ваше имя пользователя в Docker Hub и имя нужного репозитория.

docker tag my-app yourusername/my-app:latest

Теперь вы можете загрузить свой образ Docker в Docker Hub, используя команду `docker push`.

docker push yourusername/my-app:latest

После загрузки образа вы можете убедиться в его доступности на Docker Hub, выполнив поиск с помощью CLI Docker Hub.

docker search yourusername/my-app

Теперь образ Docker для вашего Python-приложения доступен на Docker Hub, и другие пользователи могут его загрузить или развернуть в различных средах.

Шаг 4 – Создайте манифесты Kubernetes для развертывания приложения Python.

Теперь вам нужно создать файл манифеста Kubernetes с помощью Okteto, чтобы определить ресурсы развертывания, сервиса и входные ресурсы для приложения под названием my-app.

nano k8s.yaml

Добавьте в файл следующие настройки.

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- image: yourusername/my-app
name: my-app
---
apiVersion: v1
kind: Service
metadata:
name: my-app
spec:
type: ClusterIP
ports:
- name: "my-app"
port: 5000
selector:
app: my-app
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
dev.okteto.com/generate-host: my-app
spec:
rules:
- http:
paths:
- backend:
service:
name: my-app
port:
number: 5000
path: /
pathType: ImplementationSpecific

Приведенный выше файл реализует приложение под названием my-app с использованием Okteto, предоставляет к нему внутренний доступ через службу ClusterIP на порту 5000 и настраивает ресурс Ingress для направления HTTP-трафика к приложению. Для включения некоторых функций Okteto, таких как автоматическая генерация имени хоста, используются аннотации, специфичные для Okteto.

Шаг 5 – Установка Okteto с помощью Helm

Для начала необходимо добавить репозиторий Okteto Helm в ваш Helm-клиент.

helm repo add okteto https://charts.okteto.com

После добавления репозитория Helm Okteto необходимо обновить ваши репозитории Helm, чтобы убедиться, что у вас есть самая актуальная информация о доступных диаграммах:

helm repo update

Затем создайте файл config.yaml для Okteto.

nano config.yaml

Добавьте лицензионный ключ Okteto, поддомен и другие настройки, как показано ниже:

license: FT7YCAYBAEDUY2LDMVXHGZIB76BAAAIDAECEIYLUMEAQUAABAFJAD74EAAAQCUYB76CAAAAABL7YGBIBAL7YMAAAAD77N74CAH7YU6ZCOZSXE43JN5XCEORSFQRGK3LBNFWCEORCNBUXIZLTNBVGK5DIOZQUA3DJNZ2XQYTVPIXGG33NEIWCEY3PNVYGC3TZEI5CE3DJNZ2XQYTVPIRCYITTMVQXI4ZCHIZTALBCORUWK4RCHIRHGY3BNRSSELBCORZGSYLMEI5HI4TVMUWCEZLOMQRDUIRSGAZDILJQGQWTCMCUGA2TUMJUHI2DQWRCPUATCAWDZA5DGNLGYAT25X6NRCJVJNWBQMG2LD7DWY36ZYXOZ7X5B37HZOBHXYV7OSCZ5HKH4G4EOIHJ7XOACMICRENEMSP5CHENLAE2XHXY44AMKKMHR5LB6IEWXNF56KJE6RGDVSGM2JW63F7DNP5ZS6REKK55RYIBMAA=
subdomain: okteto.example.com
buildkit:
persistence:
enabled: true
registry:
storage:
filesystem:
persistence:
enabled: true

Теперь установите последнюю версию Okteto, используя конфигурационный файл config.yaml.

helm install okteto okteto/okteto -f config.yaml --namespace okteto --create-namespace

После установки Okteto вы получите следующий результат.

OutputNAME: okteto
LAST DEPLOYED: Tue Mar 12 20:27:21 2024
NAMESPACE: okteto
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Congratulations! Okteto is successfully installed!
Follow these steps to complete your domain configuration:
1. Create a wildcard A record "*.okteto.example.com", pointing it to the Okteto NGINX ingress controller External-IP:
$ kubectl get service -l=app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/component=controller --namespace=okteto
2. Access your Okteto instance at `https://okteto.okteto.example.com/login#token=88f8cc11`

Подождите немного, а затем назначьте IP-адрес, который DigitalOcean динамически выделил для NGINX Ingress, который вы только что установили и настроили в рамках Okteto:

kubectl get service -l=app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/component=controller --namespace=okteto

Вы увидите следующий вывод.

OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
okteto-ingress-nginx-controller LoadBalancer 10.101.31.239 45.76.14.191 80:31150/TCP,443:31793/TCP 3m21s

Вам необходимо взять внешний IP-адрес и добавить его в DNS для выбранного вами домена. Это делается путем создания записи A с именем *.

Теперь откройте веб-браузер и получите доступ к своему экземпляру Okteto по адресу https://okteto.okteto.example.com/login#token=88f8cc11.


Шаг 6 – Установка и настройка Okteto CLI

Okteto CLI — это инструмент командной строки с открытым исходным кодом, позволяющий разрабатывать приложения непосредственно в Kubernetes.

Установить Okteto CLI на Linux и macOS можно с помощью curl. Откройте терминал и выполните следующую команду:

sudo curl https://get.okteto.com -sSfL | sh

После завершения установки вы можете убедиться в правильности установки Okteto CLI, выполнив следующую команду:

okteto version

Эта команда отображает версию Okteto CLI, установленную в вашей системе.

Outputokteto version 2.25.2

Далее вам необходимо использовать свои персональные коды доступа для аутентификации в интерфейсе командной строки Okteto.

/* okteto context use https://okteto.okteto.example.com --token 88f8cc11 --insecure-skip-tls-verifycode... */

Результатом будет:

Output ✓ Using okteto-admin @ okteto.okteto.example.com

Затем выполните следующую команду, чтобы убедиться, что ваш Okteto CLI настроен.

okteto context list

В результате получается следующий вывод:

OutputName Namespace Builder Registry
https://okteto.okteto.example.com * okteto-admin tcp://buildkit.okteto.example.com:443 registry.okteto.example.com
vke-4b7aaaa6-78fa-4a19-9fb3-cf7b8c1ec678 default docker -

Шаг 7 – Создайте манифест Okteto.

Для начала разработки приложения на Python необходимо создать файл манифеста Okteto и определить конфигурацию вашей среды разработки.

Давайте создадим файл okteto.yaml для простого приложения на Python.

nano okteto.yaml

Добавьте следующую конфигурацию.

deploy:
- kubectl apply -f k8s.yaml
dev:
my-app:
command: bash
environment:
- FLASK_ENV=development
sync:
- .:/app
reverse:
- 9000:9000
volumes:
- /root/.cache/pip
В указанном выше файле:
  • deploy: В этом разделе определяется конфигурация развертывания. При запуске команд okteto up или okteto deploy, Okteto выполняет команду kubectl application -f k8s.yaml для развертывания ресурсов Kubernetes, определенных в файле k8s.yaml. Это позволяет указать конфигурацию развертывания отдельно от конфигурации среды разработки.
  • команда: bash: Указывает команду, которая будет выполнена при запуске среды разработки.
  • Окружение: Задает переменные среды, которые необходимо установить в среде разработки. В данном случае устанавливается значение FLASK_ENV равным development.
  • SYNC: Указывает папки для синхронизации между локальным компьютером и средой разработки. Синхронизирует текущий каталог (.) с /app внутри среды разработки.
  • Обратный режим: Задает правила переадресации портов для обеспечения доступа к портам из среды разработки на вашем локальном компьютере. В данном случае он перенаправляет порт 9000 из среды разработки на порт 9000 на вашем локальном компьютере.
  • volumes: Указывает дополнительные тома для установки в среде разработки. В данном случае устанавливается каталог /root/.cache/pip, который может использоваться для кэширования пакетов pip, в среде разработки.

Теперь разверните ваше приложение на Python в кластере Kubernetes, используя следующую команду.

okteto deploy

После успешного развертывания вы увидите следующий результат.

Outputdeployment.apps/my-app created
service/my-app created
ingress.networking.k8s.io/my-app created
i There are no available endpoints for 'Okteto'.
Follow this link to know more about how to create public endpoints for your application:
https://www.okteto.com/docs/cloud/ssl/
✓ Development environment 'Okteto' successfully deployed
i Run 'okteto up' to activate your development container

Затем вернитесь в веб-браузер и обновите панель управления Okteto. Вы увидите развернутое приложение:


Вы также можете получить доступ к своему приложению Python, используя URL-адрес https://my-app-okteto-admin.okteto.example.com.


Шаг 8 – Разработка Python-приложения непосредственно в Kubernetes

В этом разделе вы будете использовать команду `okteto up` для развертывания приложения Python непосредственно в Kubernetes. Эта команда синхронизирует ваш локальный код со средой разработки. Вы можете изменять код, используя вашу любимую IDE или текстовый редактор на локальном компьютере, и изменения автоматически синхронизируются со средой разработки в Kubernetes.

Давайте запустим среду разработки с помощью Okteto:

okteto up

Эта команда создает среду разработки на основе настроек, указанных в файле okteto.yaml.

Output i Using okteto-admin @ okteto.okteto.example.com as context
i 'Okteto' was already deployed. To redeploy run 'okteto deploy' or 'okteto up --deploy'
i Build section is not defined in your okteto manifest
✓ Persistent volume successfully attached
✓ Images successfully pulled
✓ Files synchronized
Context: okteto.okteto.example.com
Namespace: okteto-admin
Name: my-app
Reverse: 9000 <- 9000
root@my-app-okteto-7767588c8d-ndzj7:/app#

Далее запустите свою программу на Python:

python3 app.py

Вы увидите следующий вывод.

Output * Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://10.244.97.92:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 126-620-675

Теперь отредактируйте файл приложения app.py:

nano app.py

Измените следующую строку:

return "Hello, This is a simple Python App Deployed on Kubernetes"

Сохраните и закройте файл. Okteto автоматически обнаружит изменения в коде и немедленно применит их к Kubernetes.

Вернитесь в свой веб-браузер и обновите страницу вашей программы на Python. Вы увидите свою измененную программу на странице ниже.


Результат

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может понравиться