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













