Начать работать с Kubernetes не всегда бывает просто. Не у всех есть необходимая для разворачивания полноценного кластера Kubernetes инфраструктура. Для локальной работы Kubernetes предлагет утилиту Minikube. Minikube — достаточно простое и удобное средство, и есть несколько обучающих курсов по работете с Minikube. Но, все же, о Minikube нельзя сказать, что с помощью этой утилиты можно за несколько минут развернуть среду Kubernetes.
Сегодня я хочу рассказать о пакете MicroK8s, который без преувеличения позволяет развернуть Kubernetes локально за несколько минут, и начать разработку. Не требуется даже предустановленных Docker и Kubernetes, т.к. все включено. В предлагаемом Вам уроке будет рассмотрен деплой приложения Django в локальной среде Kubernetes.
В качестве источника я шел вслед за серией статей Mark Gituma, в которых описана аналогичная работа, но только с Minikube, а не с MicroK8s.
Все же есть одно требование, которое необходимо удовлетворить до начала работы. У Вас должен быть установлен Snap, что в свою очередь означает, что у Вас должен быть установлен Linux.
Установка MicroK8s описана в руководстве на сайте. Впрочем, это всего одна строчка:
sudo snap install microk8s --classic
sudo microk8s.start
microk8s.enable --help
: dashboard, dns, gpu, ingress, istio, metrics-server, registry, storage. Сразу можно активизировать все, кроме gpu и istio, т.к. первое из них требует предустаноленного драйвера, а второе существенно апгрейдит среду и (лично у меня на слабом десктопе) сильно грузит систему.microk8s.enable dashboard dns ingress metrics-server registry storage
FROM python:3-slim
LABEL maintainer="mark.gituma@gmail.com"
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
RUN django-admin startproject mysite /app
EXPOSE 8000
STOPSIGNAL SIGINT
ENTRYPOINT ["python", "manage.py"]
CMD ["runserver", "0.0.0.0:8000"]
celery==4.1.0
Django==2.0
kombu==4.1.0
microk8s.docker build django -t apapacy/tut-django:1.0.0
microk8s.docker tag apapacy/tut-django:1.0.0 localhost:32000/apapacy/tut-django:1.0.0
microk8s.docker push localhost:32000/apapacy/tut-django:1.0.0
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: django
labels:
app: django
spec:
replicas: 2
selector:
matchLabels:
pod: django-container
template:
metadata:
labels:
pod: django-container
spec:
containers:
- name: django-web
image: localhost:32000/apapacy/tut-django:1.0.0
ports:
- containerPort: 8000
microk8s.kubectl apply -f config/deployment.yml
watch microk8s.kubectl get all
kind: Service
apiVersion: v1
metadata:
name: django-service
spec:
selector:
pod: django-container
ports:
- protocol: TCP
port: 8000
# targetPort: 8001
type: ClusterIP
# type: NodePort
pod: django-container
определяет, какой именно Деплоймент будет обслуживаться Сервисом (имя селектора «pod» не является предопределенным — это всего лишь метка котороая должна совпасть). Загружается сервис аналогично Деплойменту:microk8s.kubectl apply -f config/service.yml
microk8s.kubectl get all
, то можно увидеть этот адрес:service/django-service ClusterIP 10.152.183.156 none 8000/TCP 3h33m
curl 10.152.183.156:8000
microk8s.enable ingress
microk8s.kubectl get all
. В списке приложений и сервисов должно появиться несколько записей с именем default-http-backend
. В частности, должен появиться сервис, работающий на порту 80:service/default-http-backend ClusterIP 10.152.183.42 none 80/TCP 179m
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tut-django
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
backend:
serviceName: default-http-backend
servicePort: 80
rules:
- host: localhost
http:
paths:
- path: /django
backend:
serviceName: django-service
servicePort: 8000
microk8s.kubectl apply -f config/ingress.yml
К сожалению, не доступен сервер mySQL