Поиск по сайту:

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


Введение

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

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

Предварительные условия

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

  • Кластер Kubernetes 1.28. В этом руководстве при установке будет использоваться кластер DigitalOcean Kubernetes как минимум с 3 узлами (4 ЦП и 16 ГБ каждый).
  • kubectl установлен и настроен для связи с вашим кластером.
  • Учетная запись Docker Hub.
  • Docker работает на вашем локальном компьютере.
  • Для использования Okteto необходима лицензия. Подпишитесь на бесплатную 30-дневную пробную версию Okteto, чтобы получить лицензионный ключ.
  • Менеджер пакетов Helm установлен на вашем локальном компьютере. Для этого выполните шаг 1 руководства «Как установить программное обеспечение в кластеры Kubernetes с помощью диспетчера пакетов Helm 3».
  • Полностью зарегистрированное доменное имя, указывающее на балансировщик нагрузки, используемый Nginx Ingress. Вам потребуется создать запись A с именем * и IP-адресом балансировщика нагрузки.

Шаг 1. Создайте приложение Python

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

python3 --version

Если Python установлен, эта команда отобразит версию 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 

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

 * 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.

Hello, This is a simple Python App!

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

deactivate

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

Шаг 2. Докеризация приложения Python

Докеризация приложения 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

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

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. Вы должны увидеть сообщение Здравствуйте, это простое приложение Python!, указывающее, что ваше приложение Python работает внутри контейнера Docker.

На данный момент вы успешно закрепили свое приложение Python.

Шаг 3. Отправьте образ Docker Python в реестр DockerHub

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

Используйте команду docker login, чтобы войти в Docker Hub. Вам будет предложено ввести имя пользователя и пароль Docker Hub.

docker login 

Вывод этой команды будет:

Login 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: username@gmail.com
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, выполнив поиск с помощью интерфейса командной строки 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

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

helm repo update

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

nano config.yaml

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

license: INSERTYOURKEYHERE
subdomain: okteto.example.com

buildkit:
  persistence:
    enabled: true

registry:
  storage:
    filesystem:
      persistence:
        enabled: true

Примечание: Замените лицензионный ключ действительным лицензионным ключом Okteto, а okteto.example.com — своим доменным именем.

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

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

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

NAME: 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`

Примечание: Помните токены личного доступа 88f8cc11 из приведенного выше вывода. Он понадобится вам для аутентификации Okteto.

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

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

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

NAME                              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

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

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

Шаг 6. Установите и настройте интерфейс командной строки Okteto

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

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

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

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

okteto version

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

okteto version 2.25.2 

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

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

Его вывод будет:

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

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

okteto context list

Это дает следующий результат:

Name                                      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 apply -f k8s.yaml для развертывания ресурсов Kubernetes, определенных в Файл k8s.yaml. Это позволяет вам указать конфигурацию развертывания отдельно от конфигурации среды разработки.
  • command: bash: указывает команду, запускаемую при запуске среды разработки.
  • environment: указывает переменные среды, которые необходимо установить в среде разработки. В этом случае он устанавливает FLASK_ENV для разработки.
  • sync: указывает папки для синхронизации между вашим локальным компьютером и средой разработки. Он синхронизирует текущий каталог (.) с /app внутри среды разработки.
  • reverse: определяет правила переадресации портов, чтобы предоставить порты из среды разработки на ваш локальный компьютер. В этом случае он перенаправляет порт 9000 из среды разработки на порт 9000 на вашем локальном компьютере.
  • volumes: указывает дополнительные тома для монтирования в среду разработки. В этом случае он монтирует каталог /root/.cache/pip, который может использоваться для кэширования пакетов pip, в среду разработки.

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

okteto deploy

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

deployment.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.

 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 

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

 * 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.

Автор выбрал FreeBSD Foundation для получения пожертвования в рамках программы Write for DOnations.