Как развернуть приложение 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.