В этом руководстве я охватывающую создание образца проекта в местном, одноустремлевом кластере Kubernetes, таких как Microk8s Для местного, повседневного развития без На необходимость создания нового изображения каждый временной код изменения.
Предварительные условия
- Рабочая местная кластер Kubernetes с использованием Microk8s
- Microk8s Docker Registry включен с использованием
Microk8S.Enable Registry
- Docker (в комплекте с Microk8s или Установить из здесь )
- ( Дополнительно ) Python 3 и
Пип
установлен на месте
Это руководство предполагает, что у вас уже есть кластер Kubernetes Up и работает на вашем Местный Рабочая станция и имеет базовое понимание CLI и контейнеров. Если у вас нет локальной кластеры Kubernetes, пожалуйста, обратитесь к инструкциям по установке, связанным выше.
Примечание : Ни один из кодов или конфигов в этом руководстве не является «готовым».
Если у вас не было Докер
или kubectl
Ранее псевдоним командам, чтобы избежать префикса их с помощью Microk8s.
с участием:
sudo snap alias microk8s.docker docker sudo snap alias microk8s.kubectl kubectl
Kubernetes — это современная платформа для автоматизации развертывания, конфигурации и масштабирования контейнеров и контейнерных приложений. Он построен на верхней части платформы Docker по умолчанию и предоставляет разработчикам и Sysadmins с гибкими и мощными инструментами для управления своими услугами в любой масштабе. Включая масштаб рабочей станции. 🙂
Все конфигурации и код можно найти в этом проекте GitHub:
Гидноа/Кубнет
Простой проект для настройки среды развития Kubernetes
Простой проект для настройки среды развития Kubernetes
Хорошо, готов начать? Нам нужно иметь приложение для запуска в контейнере, поэтому давайте определим простое приложение, используя Flask Framework в Python:
# test_server.py from flask import Flask app = Flask(__name__) @app.route("/") def kube(): return "Hello Kubernetes!"
Это определяет приложение для колба с одним маршрутом, /
Отказ Здесь ничего не страшно! 👾.
Если вы хотите проверить приложение, установите зависимость колбу:
pip install flask
… и беги с:
FLASK_APP=test_server.py flask run
Затем открыть http://127.0.0.1:5000/ Ваш браузер, чтобы увидеть результаты.
Далее нам нужно определить Dockerfile
для нашего нового веб-сервиса. Я предполагаю, что какой-то уровень знакомства с DockerFiles, поэтому я не буду сломаться этим.
FROM python:3.6.7-alpine3.7 RUN mkdir /app WORKDIR /app COPY ./requirements.txt /requirements.txt RUN pip install -r /requirements.txt COPY ./test_server.py /app/test_server.py ENV FLASK_APP=test_server.py ENV FLASK_ENV=development ENTRYPOINT [ "flask", "run", "--host=0.0.0.0" ]
Теперь нам нужно создать и пометить изображение с нашим кодом в нем и толкать его в реестр. Сделать этот бег:
docker build -t localhost:32000/kubetest:v1.0.0 . docker push localhost:32000/kubetest:v1.0.0
Примечание : В зависимости от того, какие kubernetes distro вы используете, имя изображения может отличаться, заменить localhost: 32000
С любым именем хоста для вашего местного реестра.
Вам нужно только построить это изображение один раз (если вы не добавляете новые зависимости), так как мы будем вводить модифицированный код в изображение позже.
Итак, теперь у нас есть документ докера с последней версией нашего кода в нем, готов к запуску в нашем блестящем новом кластере. Обычно сейчас вы бы выстрелили Docker Run
И назовите это в день, но мы собираемся сделать что-то лучше, чем это.
Нам нужно определить два типа ресурсов для получения нашего нового изображения, работающего в кластере, A Развертывание
и а Сервис
Отказ Они кажутся вид знакомы, если вы использовали Docker-Compose
до того, как они концептуально очень похожи.
Развертывание
похоже:
# kubetest.yaml apiVersion: apps/v1 kind: Deployment metadata: name: kubetest spec: selector: matchLabels: app: kubetest template: metadata: labels: app: kubetest spec: containers: - name: kubetest image: localhost:32000/kubetest:v1.0.0 ports: - containerPort: 5000 imagePullPolicy: Always ...
Это определяет базовый сервис, используя изображение Docker, мы просто подталкиваем именем Kubetest
Отказ Важные биты в Спец
Структура, где мы определяем единую контейнерную запись с именем Kubetest
что использует изображение localhost: 32000/Kubetest: v1.0.0
и разоблачает порт 5000
Отказ Видеть! Как и Сервис
в Docker-Compose. 😄 Вы можете попробовать создать POD сейчас с Kubectl Create -f Kubetest.yaml
Несмотря на то, что вы не сможете получить доступ к струнию через HTTP, так что увлечься на это еще.
Чтобы сделать ваш POD, доступный из-за пределов сети Kubernetes, нам нужно определить Сервис
Отказ Это похоже на -П
вариант в Docker Run
или Порты
раздел в Docker-Compose.yml.yml.yml
.
# kubetest.yaml ... --- kind: Service apiVersion: v1 metadata: name: kubetest labels: app: kubetest spec: selector: app: kubetest ports: - name: http port: 5000 protocol: TCP type: NodePort
Примечание : У меня есть Развертывание
и Сервис
Определения в одном файле для простоты.
Хорошо, давайте пойдем вперед и настроим это в нашем кластере на самом деле сейчас!
noah@kamijou:/opt/kubetest$ kubectl apply -f kubetest.yaml deployment.apps/kubetest created service/kubetest created
Мы можем посмотреть в результате стручок
с использованием:
noah@kamijou:/opt/kubetest$ kubectl get pods NAME READY STATUS RESTARTS AGE kubetest-574958d5fd-zpvn5 1/1 Running 0 15s
… и служба с использованием:
noah@kamijou:/opt/kubetest$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.152.183.1443/TCP 8d kubetest NodePort 10.152.183.154 5000:31065/TCP 20s noah@kamijou:/opt/kubetest$
Обратите особое внимание на 5000: 31065/TCP
Раздел в списке услуг, что 31065
Является ли порт, который мы будем использовать для подключения к нашему веб-сервису. Давайте сделаем это сейчас:
noah@kamijou:/opt/kubetest$ curl -i localhost:31065 HTTP/1.0 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 18 Server: Werkzeug/0.14.1 Python/3.6.7 Date: Wed, 12 Dec 2018 05:53:10 GMT Hello Kubernetes!
Потрясающий! 🎊 🎉🎈.
… но подожди, я обещал Печенье Возможность редактирования моего кода в пределах Стручок! 😣 Как я должен сделать это!?
Успокойся, мы доберемся до этого! 😅
Давайте вернемся к нашему Kubetest.yaml
Файл и добавьте несколько строк.
apiVersion: apps/v1 kind: Deployment metadata: name: kubetest spec: selector: matchLabels: app: kubetest template: metadata: labels: app: kubetest spec: containers: - name: kubetest image: localhost:32000/kubetest:v1.0.0 ports: - containerPort: 5000 imagePullPolicy: Always + volumeMounts: + - mountPath: /app + name: kubetest-volume + readOnly: true + volumes: + - name: kubetest-volume + hostPath: + path: /home/noah/kubetest + type: Directory
Здесь немного, чтобы распаковать здесь, но основной сигнал, который мы создаем папку на основе каталога, аналогичную -В/хост/путь:/контейнер/путь
синтаксис в Docker Run
Отказ Kubernetes обрабатывает это немного по-другому, чем Docker Vanilla, поэтому, если вы хотите прочитать больше, проверьте Официальная документация на постоянных томах .
Примечание : Измените значение для путь
раздел, чтобы указать на все, что ваш test_server.py
файл живет. Это супер важно для этого работать правильно.
Идти вперед и беги Kubectl Apply Apply -F Kubetest.yaml
Опять же, чтобы обновить наш контейнер с помощью тома.
noah@kamijou:~/kubetest$ kubectl apply -f kubetest.yaml deployment.apps/kubetest configured service/kubetest unchanged
Убедитесь, что POD работает и снова работает с
noah@kamijou:~/kubetest$ kubectl get pods NAME READY STATUS RESTARTS AGE kubetest-58f7b7d957-cvdch 1/1 Running 0 63s
Давайте посмотрим на журналы, они промываются из Stdout
и Стдерр
всех стручков. Мы заботимся только о Kubetest
Сервис, так что давайте проверим это:
noah@kamijou:~/kubetest$ kubectl logs svc/kubetest * Serving Flask app "test_server.py" (lazy loading) * Environment: development * Debug mode: on * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 124-402-077
Cool, приложения все еще бегают.
Наконец, давайте добавим новую конечную точку для test_server.py.
from flask import Flask app = Flask(__name__) @app.route("/") def kube(): return "Hello Kubernetes!\n" +@app.route("/healthz") +def health(): + return "ok\n", 200
… Проверьте журналы снова.
noah@kamijou:~/kubetest$ kubectl logs svc/kubetest * Serving Flask app "test_server.py" (lazy loading) * Environment: development * Debug mode: on * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 124-402-077 * Detected change in '/app/test_server.py', reloading * Restarting with stat * Debugger is active! * Debugger PIN: 124-402-077
Флэбка подобрала, что произошло изменение в файле test_server.py и перезагрузиться автоматически!
Давайте постараемся ударить нашу новую конечную точку, не забудьте убедиться, что порт не изменился на вас Kubectl Получить SVC.
noah@kamijou:~/kubetest$ curl -i localhost:30788/healthz HTTP/1.0 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 3 Server: Werkzeug/0.14.1 Python/3.6.7 Date: Wed, 12 Dec 2018 06:25:33 GMT ok
Ву, мы закончили!
Спасибо за чтение!
Я надеюсь, что вы нашли свой пост полезным! Если у вас есть какие-либо вопросы, пожалуйста, оставьте в комментариях, я рад помочь.
Это мой первый пост, поэтому любые отзывы являются супер добро пожаловать. 🙋♂. ️
Оригинал: «https://dev.to/chiefnoah/-kubernetes-for-the-modern-developer—5am8»