Рубрики
Uncategorized

🐳 Kubernetes для современного разработчика 🐳

Узнайте, как настроить локальную среду разработки с использованием одного узла Kubernetes Cluster и код горячего перезагрузки. Помечено с Куберовщиками, начинающими, учебниками, DevOps.

В этом руководстве я охватывающую создание образца проекта в местном, одноустремлевом кластере 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.1             443/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»