Изготовление сайтов в Донецке, ДНР. Конвейеры машинного обучения: настройка локального Kubernetes

 
 

В этой серии из нескольких частей я расскажу вам, как я настроил локальный конвейер машинного обучения с помощью инструментов и сред с открытым исходным кодом.

Пролог: обучение модели — это всего лишь крошечная часть

Когда большинство людей думают о машинном обучении, они представляют себе инженеров и специалистов по данным, которые настраивают сетевые архитектуры, функции потерь и настраивают гиперпараметры в сочетании с постоянным переобучением, пока результаты не будут удовлетворительными.

Действительно, обучение моделей машинного обучения требует много тяжелой работы. Огромное количество времени и ресурсов тратится на исследования и эксперименты.

Однако наступает момент, когда вам нужно начать производство модели, которую вы с любовью обучили и настроили. И, кстати, ожидается, что модель также будет работать на пакете данных на следующей неделе.

Постепенно до вас доходит, что машинное обучение гораздо больше, чем модели, гиперпараметры и функции потерь. Это также то, что происходит до, во время и после тренировки. И это не заканчивается на этом, потому что вам также нужно будет подумать о переобучении, особенно когда вы получаете новые данные, поскольку нет гарантии, что модель также будет обобщаться.

Есть очень известная диаграмма, которая кратко иллюстрирует проблему:

Область применения машинного обучения

Короче говоря, вам нужно построить конвейер машинного обучения, который поможет вам перейти от необработанных данных к обученной модели в кратчайшие сроки. Но вот в чем загвоздка: поскольку вы являетесь частью обрывочного стартапа и не получаете денег от венчурного капитала, вам придется обходиться имеющимися у вас серверами, а не полагаться на платные облачные предложения Amazon, Microsoft или Google., по крайней мере, на данный момент.

Это потому, что вам нужна безопасная среда для обучения и экспериментов, которая не будет неожиданно шокировать вас неприятным счетом в конце месяца.

Кто ты

Вы можете быть инженером-программистом в компании, которая начинает думать о внедрении своих моделей машинного обучения в производство, или вы можете работать в одиночку и вам интересно, как выглядит машинное обучение в «реальном мире». В обоих случаях вам нужно знать о конвейерах машинного обучения.

Что тебе нужно знать

Вам должно быть комфортно с Linux. В примерах предполагается Ubuntu Linux 18.04, хотя слегка устаревшие или более поздние версии не должны вызывать серьезных проблем.

У вас должны быть некоторые практические знания Docker. Если вы знаете, как создавать образы в Docker и как запускать контейнеры, у вас все получится. Если вы этого не сделаете, вам не следует слишком беспокоиться: я предоставлю вам достаточно справочной информации, и будут объяснены примеры кода.

Хотя это статья о конвейерах машинного обучения, эта статья не о тонкостях, связанных с обучением модели.

Мы собираемся использовать Kubernetes. Вам не нужно быть экспертом в этом. Если вы совсем новичок в Kubernetes, ничего страшного. К концу серии у вас будет хоть какой-то практический опыт. С другой стороны, я не собираюсь слишком углубляться в специфику Kubernetes. Некоторые команды мне придется опустить для краткости. Кроме того, настоящая цель здесь — помочь вам максимально эффективно развернуть конвейеры машинного обучения.

Вот еще несколько предположений, которые я делаю о вас, проницательный читатель:

вы не совсем невежественны в машинном обучении

у вас есть доступ к некоторым относительно мощным серверам (в идеале более одного), которые содержат графические процессоры Nvidia.

у вас есть существующая база кода машинного обучения, написанная на Python

вы не работаете в стартапе-единороге или в Fortune 500 и, следовательно, не настолько богаты деньгами, чтобы с радостью запустить несколько V100.

Что мы будем делать?

Конвейеры машинного обучения только недавно получили больше любви и внимания, и люди только начинают во всем разбираться. Иными словами, существует несколько способов создания конвейеров машинного обучения, потому что у каждой организации свои уникальные требования, и у каждой команды есть свой любимый инструмент.

Эта серия статей призвана предложить один из возможных способов сделать это, и это особенно важно, когда вы только начинаете, потому что количество информации часто очень велико. Кроме того, установка Kubernetes — непростое дело, усеянное множеством препятствий. Я надеюсь, что эта статья поможет сгладить этот путь.

После того, как вы узнали, как построить конвейер машинного обучения, у вас будет достаточно навыков и знаний, чтобы создать его в соответствии с потребностями вашей организации.

Вот список некоторых инструментов, которые я расскажу в этой серии:

Докер

Кубернетес

владелец ранчо

Трубопроводы KubeFlow/KubeFlow

Минио

Тензорный поток

Локально

Как вы вскоре поймете, прочитав серию, многие из этих инструментов предполагают, что у вас есть хранилище на Amazon S3 или Google Cloud Storage, что, мягко говоря, не очень хорошее предположение. Таким образом, в этой серии статей показано, как обойти некоторые из этих ограничений без потери функциональности.

Конечно, в какой-то момент вы перерастете и вам понадобится что-то более мощное. Однако, особенно когда вы только начинаете (то есть, вы оказались первым инженером данных в команде), локальная среда кажется более экономичной и, в конечном счете, более образовательной.

Простой способ установки Kubernetes с помощью Rancher

Давайте начнем сразу с одного из самых сложных моментов — установки Kubernetes.

Главное, что вам нужно знать о Kubernetes, это то, что это система оркестровки контейнеров для автоматизации развертывания, масштабирования и управления приложениями.

Есть много способов установить Kubernetes, и это нетривиальный процесс. К счастью, такие инструменты, как Rancher, делают процесс установки более приятным и менее подверженным ошибкам. В частности, мы собираемся использовать Rancher Kubernetes Engine (RKE), чтобы помочь нам установить Kubernetes.

На момент написания этой статьи последней стабильной версией rkeявляется 1.0.0.

Шаг 0: Подготовьте машины

Следующие шаги предполагают, что у вас есть доступ к двум машинам Linux, которые подключены к одной и той же локальной сети.

Мы собираемся настроить минимальный кластер, состоящий из двух машин, одной с именем masterи другой worker. Конечно, вы можете назвать свои машины как хотите, если вы назначите одну машину главной, а остальные — рабочими.

Если у вас есть доступ только к одной машине, вы можете создать две виртуальные машины и обязательно включить мостовой адаптер. На самом деле, готовясь к этой статье, я тестирую все возможности VirtualBox от Oracle. Вот мои настройки:

Настройки Oracle VM VirtualBox Manager

Обратите внимание, что у меня есть две виртуальные машины: masterи node. Включите Bridged Adapterи также установите Promiscuous Modeзначение Allow All.

Недостатком этого является то, что вы не сможете получить доступ к графическим процессорам, и вы, скорее всего, заметите, что производительность не будет идеальной, потому что Kubernetes, как правило, довольно требователен к ресурсам. Опять же, это нормально, если вы пытаетесь это сделать дома или в данный момент имеете доступ только к одной машине.

Вот некоторые важные сведения о машинах (вы также должны иметь их под рукой для последующих шагов настройки):

Мастер Рабочий

IP 192.168.86.36 192.168.86.35

Пользователь убунту убунту

Имя хоста мастер рабочий

SSH-ключи ~/.ssh/id_rsa.pub ~/.ssh/id_rsa.pub

Роль Плоскость управления и т. д. Рабочий

DNS и балансировка нагрузки

В производственной среде вам потребуется имя хоста, указывающее на ваш кластер Kubernetes. Однако в этой статье я предполагаю, что у вас его нет в наличии, поэтому нам придется подделать его.

Еще одна вещь, которую я не буду освещать — для простоты — это балансировка нагрузки, когда дело доходит до установки Rancher.

Для наших целей я буду использовать rancher-demo.domain.testв качестве имени хоста.

На обеих машинах откройте /etc/hostsфайл:

sudo vim /etc/hosts

Введите следующее:

192.168.86.35 worker

192.168.86.35 rancher-demo.domain.test

192.168.86.36 master

127.0.0.1 localhost

Обратите внимание, что рабочий узел имеет дополнительное имя хоста rancher-demo.domain.test. В немного более реалистичной среде у вас было бы что-то вроде NGINX в качестве внешнего интерфейса для балансировки нагрузки между несколькими рабочими узлами.

*Примечание. Если вы используете виртуальную машину, то, скорее всего, вы будете использовать образ Ubuntu Server, который обычно не поставляется со средой рабочего стола. Поэтому у вас также должна быть запись на хост — компьютере, чтобы включить это:

192.168.86.35 rancher-demo.domain.test

Таким образом, вы сможете получить доступ к Rancher из браузера на главном компьютере. *

Шаг 1: Получите rkeдвоичный файл

Важно!: Этот шаг следует выполнять только на master.

Перейдите на страницу GitHub, чтобы загрузить rkeдвоичный файл. Затем переименуйте двоичный файл в rke, а затем сделайте его исполняемым. Наконец, переместите двоичный файл в место в каталоге PATH, /usr/local/binчто обычно является хорошим выбором.

Важно: убедитесь, что вы выбрали правильный двоичный файл для вашей ОС!

$ wget https://github.com/rancher/rke/releases/download/v1.0.0/rke_linux-amd64

$ mv rke_linux-amd64 rke

$ chmod +x rke

$ sudo mv rke /usr/local/bin

Теперь посмотрим, все ли работает:

$ rke

Это должно вернуть:

NAME:

rke — Rancher Kubernetes Engine, an extremely simple, lightning fast Kubernetes installer that works everywhere

USAGE:

rke [global options] command [command options] [arguments... ]

VERSION:

v1.0.0

AUTHOR (S):

Rancher Labs, Inc.

COMMANDS:

up Bring the cluster up

remove Teardown the cluster and clean cluster nodes

version Show cluster Kubernetes version

config Setup cluster configuration

etcd snapshot save/restore operations in k8s cluster

cert Certificates management for RKE cluster

encrypt Manage cluster encryption provider keys

help, h Shows a list of commands or help for one command

GLOBAL OPTIONS:

—debug, -d Debug logging

—quiet, -q Quiet mode, disables logging and only critical output will be printed

—help, -h show help

—version, -v print the version

Шаг 2. Подготовка хостов Linux

Важно: эти шаги необходимо выполнить на всех машинах.

а) Установить докер

Во-первых, убедитесь, что Docker 19.03 установлен на всех хостах Linux:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add —

$ sudo add-apt-repository «deb [arch=amd64] https://download.docker.com/linux/ubuntu $ (lsb_release -cs) stable edge»

$ sudo apt-get update

$ sudo apt-get install -y docker-ce

Чтобы убедиться, что служба Docker работает правильно, выполните следующее:

$ sudo systemctl status docker

Это должно вернуть:

● docker.service — Docker Application Container Engine

Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)

Active: active (running) since Sat 2019-12-28 03:01:03 UTC; 27s ago

Docs: https://docs.docker.com

Main PID: 4118 (dockerd)

Tasks: 8

CGroup: /system.slice/docker.service

└─4118 /usr/bin/dockerd -H fd: // —containerd=/run/containerd/containerd.sock

Dec 28 03:01:03 master dockerd[4118]: time="2019-12-28T03:01:03.179311453Z" level=warning msg="Your kernel does not support swap memory limit"

Dec 28 03:01:03 master dockerd[4118]: time="2019-12-28T03:01:03.179509363Z" level=warning msg="Your kernel does not support cgroup rt period"

Dec 28 03:01:03 master dockerd[4118]: time="2019-12-28T03:01:03.179608175Z" level=warning msg="Your kernel does not support cgroup rt runtime"

Теперь выполните следующую команду, чтобы вы могли использовать dockerкоманду без sudo:

$ sudo usermod -aG docker $USER

Давайте попробуем:

$ docker run hello-world

Упс!

docker: Got permission denied while trying to connect to the Docker daemon socket at unix: ///var/run/docker.sock: Post http: //%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.

See 'docker run —help’.

Причина, по которой вы получаете это, заключается в том, что вам нужно сначала выйти из системы:

$ exit

После входа повторите попытку:

$ docker run hello-world

Вы должны увидеть это:

Unable to find image 'hello-world: latest’ locally

latest: Pulling from library/hello-world

1b930d010525: Pull complete

Digest: sha256:4fe721ccc2e8dc7362278a29dc660d833570ec2682f4e4194f4ee23e415e1064

Status: Downloaded newer image for hello-world: latest

Hello from Docker!

This message shows that your installation appears to be working correctly.

б) Настроить ключи SSH

Если у вас не настроены ключи SSH, выполните следующий шаг master:

$ ssh-keygen

$ eval «$ (ssh-agent -s)»

$ ssh-add ~/.ssh/id_rsa

Затем скопируйте открытый ключ на все рабочие узлы. Поскольку у нас есть только один рабочий узел:

$ ssh-copy-id ubuntu@192.168.86.36

Вам нужно убедиться, что $USERSSH может подключаться к узлам. Например, убедитесь, что вы можете получить доступ workerиз master:

ubuntu@master: ~$ ssh ubuntu@192.168.86.36

На обоих узлах настройте сервер SSH, чтобы разрешить переадресацию портов:

% sudo vim /etc/ssh/sshd_config

Раскомментируйте следующее:

AllowTcpForwarding yes

в) отключить своп

Чтобы отключить своп:

$ sudo swapoff -a

Откройте /etc/fstabв своем любимом редакторе и закомментируйте запись файла подкачки:

$ sudo vim /etc/fstab

г) Применить sysctlнастройки

$ sudo sysctl net.bridge.bridge-nf-call-iptables=1

д) DNS в Ubuntu 18.04

В этой версии Ubuntu и выше способ настройки DNS изменился. Чтобы вернуться к предыдущему поведению:

$ sudo apt install resolvconf

Отредактируйте настройки сервера имен:

sudo vim /etc/resolvconf/resolv.conf.d/head

Добавьте следующие записи:

nameserver 8.8.4.4

nameserver 8.8.8.8

Перезапустите resolveconfслужбу:

% sudo service resolvconf restart

Шаг 3: Создание файла конфигурации кластера

Важно: следующий шаг следует выполнять только на master.

Пришло время, наконец, установить Kubernetes с помощью rke!

Прежде чем сделать это, убедитесь, что у вас есть список IP-адресов и имен хостов для узлов. Таблица из Step 0была бы очень полезна для этого шага.

Вам нужно запустить rke config, чтобы создать файл конфигурации кластера. Он представит вам кучу вопросов, которые используются для создания файла конфигурации:

$ rke config

Вот пример вопросов и ответов на основе таблицы. Не забудьте адаптировать его к своим пользователям, именам хостов, IP-адресам и расположению ключей SSH. Также обратите внимание, что masterузел должен иметь роль control planeи etcd, а workerузлы должны иметь роль worker. Если вы когда-нибудь допустите ошибку, вы всегда можете начать сначала с Ctrl+ Cи снова запустить команду:

[+] Cluster Level SSH Private Key Path [~/.ssh/id_rsa]:

[+] Number of Hosts [1]: 2

[+] SSH Address of host (1) [none]: 192.168.86.36

[+] SSH Port of host (1) [22]:

[+] SSH Private Key Path of host (192.168.86.36) [none]: ~/.ssh/id_rsa

[+] SSH User of host (192.168.86.36) [ubuntu]: ubuntu

[+] Is host (192.168.86.36) a Control Plane host (y/n)? [y]: y

[+] Is host (192.168.86.36) a Worker host (y/n)? [n]: n

[+] Is host (192.168.86.36) an etcd host (y/n)? [n]: y

[+] Override Hostname of host (192.168.86.36) [none]: master

[+] Internal IP of host (192.168.86.36) [none]:

[+] Docker socket path on host (192.168.86.36) [/var/run/docker.sock]:

[+] SSH Address of host (2) [none]: 192.168.86.35

[+] SSH Port of host (2) [22]:

[+] SSH Private Key Path of host (192.168.86.35) [none]: ~/.ssh/id_rsa

[+] SSH User of host (192.168.86.35) [ubuntu]: ubuntu

[+] Is host (192.168.86.35) a Control Plane host (y/n)? [y]: n

[+] Is host (192.168.86.35) a Worker host (y/n)? [n]: y

[+] Is host (192.168.86.35) an etcd host (y/n)? [n]: n

[+] Override Hostname of host (192.168.86.35) [none]: worker

[+] Internal IP of host (192.168.86.35) [none]:

[+] Docker socket path on host (192.168.86.35) [/var/run/docker.sock]:

[+] Network Plugin Type (flannel, calico, weave, canal) [canal]: flannel

[+] Authentication Strategy [x509]:

[+] Authorization Mode (rbac, none) [rbac]:

[+] Kubernetes Docker image [rancher/hyperkube: v1.16.3-rancher1]:

[+] Cluster domain [cluster.local]:

[+] Service Cluster IP Range [10.43.0.0/16]:

[+] Enable PodSecurityPolicy [n]:

[+] Cluster Network CIDR [10.42.0.0/16]:

[+] Cluster DNS Service IP [10.43.0.10]:

[+] Add addon manifest URLs or YAML files [no]:

Это создает cluster.ymlфайл конфигурации кластера RKE:

nodes:

— address: «192.168.86.36»

port: «22»

internal_address: «»

role:

— controlplane

— etcd

hostname_override: «»

user: ubuntu

docker_socket: /var/run/docker.sock

ssh_key: «»

ssh_key_path: ~/.ssh/id_rsa

ssh_cert: «»

ssh_cert_path: «»

labels: {}

taints: []

— address: «192.168.86.35»

port: «22»

internal_address: «»

role:

— worker

hostname_override: «»

user: ubuntu

docker_socket: /var/run/docker.sock

ssh_key: «»

ssh_key_path: ~/.ssh/id_rsa

ssh_cert: «»

ssh_cert_path: «»

labels: {}

taints: []

services:

etcd:

image: «»

extra_args: {}

extra_binds: []

extra_env: []

external_urls: []

ca_cert: «»

cert: «»

key: «»

path: «»

uid: 0

gid: 0

snapshot: null

retention: «»

creation: «»

backup_config: null

kube-api:

image: «»

extra_args: {}

extra_binds: []

extra_env: []

service_cluster_ip_range: 10.43.0.0/16

service_node_port_range: «»

pod_security_policy: false

always_pull_images: false

secrets_encryption_config: null

audit_log: null

admission_configuration: null

event_rate_limit: null

kube-controller:

image: «»

extra_args: {}

extra_binds: []

extra_env: []

cluster_cidr: 10.42.0.0/16

service_cluster_ip_range: 10.43.0.0/16

scheduler:

image: «»

extra_args: {}

extra_binds: []

extra_env: []

kubelet:

image: «»

extra_args: {}

extra_binds: []

extra_env: []

cluster_domain: cluster.local

infra_container_image: «»

cluster_dns_server: 10.43.0.10

fail_swap_on: false

generate_serving_certificate: false

kubeproxy:

image: «»

extra_args: {}

extra_binds: []

extra_env: []

network:

plugin: flannel

options: {}

node_selector: {}

authentication:

strategy: x509

sans: []

webhook: null

addons: «»

addons_include: []

system_images:

etcd: rancher/coreos-etcd: v3.3.15-rancher1

alpine: rancher/rke-tools: v0.1.51

nginx_proxy: rancher/rke-tools: v0.1.51

cert_downloader: rancher/rke-tools: v0.1.51

kubernetes_services_sidecar: rancher/rke-tools: v0.1.51

kubedns: rancher/k8s-dns-kube-dns:1.15.0

dnsmasq: rancher/k8s-dns-dnsmasq-nanny:1.15.0

kubedns_sidecar: rancher/k8s-dns-sidecar:1.15.0

kubedns_autoscaler: rancher/cluster-proportional-autoscaler:1.7.1

coredns: rancher/coredns-coredns:1.6.2

coredns_autoscaler: rancher/cluster-proportional-autoscaler:1.7.1

kubernetes: rancher/hyperkube: v1.16.3-rancher1

flannel: rancher/coreos-flannel: v0.11.0-rancher1

flannel_cni: rancher/flannel-cni: v0.3.0-rancher5

calico_node: rancher/calico-node: v3.8.1

calico_cni: rancher/calico-cni: v3.8.1

calico_controllers: rancher/calico-kube-controllers: v3.8.1

calico_ctl: «»

calico_flexvol: rancher/calico-pod2daemon-flexvol: v3.8.1

canal_node: rancher/calico-node: v3.8.1

canal_cni: rancher/calico-cni: v3.8.1

canal_flannel: rancher/coreos-flannel: v0.11.0

canal_flexvol: rancher/calico-pod2daemon-flexvol: v3.8.1

weave_node: weaveworks/weave-kube:2.5.2

weave_cni: weaveworks/weave-npc:2.5.2

pod_infra_container: rancher/pause:3.1

ingress: rancher/nginx-ingress-controller: nginx-0.25.1-rancher1

ingress_backend: rancher/nginx-ingress-controller-defaultbackend:1.5-rancher1

metrics_server: rancher/metrics-server: v0.3.4

windows_pod_infra_container: rancher/kubelet-pause: v0.1.3

ssh_key_path: ~/.ssh/id_rsa

ssh_cert_path: «»

ssh_agent_auth: false

authorization:

mode: rbac

options: {}

ignore_docker_version: false

kubernetes_version: «»

private_registries: []

ingress:

provider: «»

options: {}

node_selector: {}

extra_args: {}

dns_policy: «»

extra_envs: []

extra_volumes: []

extra_volume_mounts: []

cluster_name: «»

cloud_provider:

name: «»

prefix_path: «»

addon_job_timeout: 0

bastion_host:

address: «»

port: «»

user: «»

ssh_key: «»

ssh_key_path: «»

ssh_cert: «»

ssh_cert_path: «»

monitoring:

provider: «»

options: {}

node_selector: {}

restore:

restore: false

snapshot_name: «»

dns: null

Время поднимать кластер!

% rke up

Подождите, пока rkeнастроится кластер Kubernetes:

INFO[0000] Running RKE version: v1.0.0

INFO[0000] Initiating Kubernetes cluster

INFO[0000] [certificates] Generating admin certificates and kubeconfig

INFO[0000] Successfully Deployed state file at [. /cluster.rkestate]

INFO[0000] Building Kubernetes cluster

INFO[0000] [dialer] Setup tunnel for host [192.168.86.35]

INFO[0000] [dialer] Setup tunnel for host [192.168.86.36]

# Many more lines...

INFO[0044] Finished building Kubernetes cluster successfully

На этом этапе было бы создано еще несколько файлов:

$ ls

cluster.rkestate cluster.yml kube_config_cluster.yml

Вы должны хранить эти файлы в безопасном месте, если вам когда-нибудь понадобится воссоздать кластер. Вам нужно скопировать kube_config_cluster.ymlв место, где Kubernetes может его найти:

$ mkdir ~/.kube

$ cp kube_config_cluster.yml $HOME/.kube/config

Установить Кубектл

Примечание: этот шаг следует выполнять только на masterузле.

Затем вы должны установить инструмент командной строки Kubernetes kubectl:

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add —

echo «deb https://apt.kubernetes.io/ kubernetes-xenial main» | sudo tee -a /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update

sudo apt-get install -y kubectl

Как только этот шаг будет завершен, мы можем протестировать его, перечислив все rkeсозданные узлы:

% kubectl get nodes

NAME STATUS ROLES AGE VERSION

192.168.86.35 Ready worker 53m v1.16.3

192.168.86.36 Ready controlplane, etcd 53m v1.16.3

Успех! Давайте сделаем что-нибудь еще. Мы можем проверить, какие контейнеры были созданы:

% kubectl get pods —all-namespaces

NAMESPACE NAME READY STATUS RESTARTS AGE

ingress-nginxdefault-http-backend-67cf578fc4-dk9l4 1/1 Running 0 49m

ingress-nginx-ingress-controller-bnwlv 1/1 Running 0 49m

kube-systemcoredns-5c59fd465f−7gbff 1/1 Running 0 49m

kube-systemcoredns-5c59fd465f-mhzdb 1/1 Running 0 49m

kube-systemcoredns-autoscaler-d765c8497-p2zj4 1/1 Running 0 49m

kube-systemkube-flannel-vkxc6 2/2 Running 0 54m

kube-systemkube-flannel-xjtst 2/2 Running 0 54m

kube-systemmetrics-server-64f6dffb84-hs99g 1/1 Running 0 49m

kube-systemrke-coredns-addon-deploy-job-kdwxm 0/1 Completed 0 49m

kube-systemrke-ingress-controller-deploy-job-rpvrq 0/1 Completed 0 49m

kube-systemrke-metrics-addon-deploy-job-x2m2j 0/1 Completed 0 49m

kube-systemrke-network-plugin-deploy-job-h5ffz 0/1 Completed 0 55m

На данный момент не беспокойтесь о том, что такое стручки. Просто думайте о них как о контейнерах на данный момент.

Установить шлем 3

Примечание: этот шаг следует выполнять только на masterузле.

Helm — это менеджер пакетов Kubernetes, который очень удобен для развертывания приложений и сервисов в кластерах Kubernetes. Мы будем использовать Helm для установки Rancher и некоторых других вспомогательных сервисов.

$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

helmследует установить в PATH:

Downloading https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz

Preparing to install helm into /usr/local/bin

helm installed into /usr/local/bin/helm

Установите Rancher с помощью Helm

Примечание. Этот шаг следует выполнять только на masterузле.

$ helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

Создайте пространство имен для Rancher:

$ kubectl create namespace cattle-system

Установитьcert-manager

Примечание: этот шаг следует выполнять только на masterузле.

Cert Manager помогает автоматически предоставлять сертификаты TLS и управлять ими в Kubernetes. Например, есть варианты использования сертификатов от Let’s Encrypt, но пока мы не будем усложнять и будем использовать сертификаты по умолчанию, сгенерированные Rancher.

Примечание: здесь мы устанавливаем немного устаревшую версию, cert-managerпотому что последняя (0.12) имеет проблемы с установкой.

Выполните следующие действия для установки cert-managerв кластер Kubernetes:

$ kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.9/deploy/manifests/00-crds.yaml

$ kubectl create namespace cert-manager

$ kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true

$ helm repo add jetstack https://charts.jetstack.io

$ helm repo update

$ helm install —name cert-manager \

—namespace cert-manager \

—version v0.9.1 \

jetstack/cert-manager

Убедитесь, что все прошло хорошо:

kubectl get pods —namespace cert-manager

NAME READY STATUS RESTARTS AGE

cert-manager-5b9ff77b7-x6vgn 1/1 Running 0 44s

cert-manager-cainjector-59d69b9b-nrgkf 1/1 Running 0 44s

cert-manager-webhook-cfd6587ff-8tcgt 1/1 Running 0 44s

Обратите внимание, что вам, возможно, придется подождать некоторое время (обычно всего несколько минут), чтобы все преобразовались STATUSв файлы Running.

Установить Ранчер

Наконец, вы можете установить Rancher, который, помимо прочего, предоставляет удобный интерфейс для управления кластерами Kubernetes:

$ helm install rancher-stable/rancher \

—namespace cattle-system \

—set hostname=rancher.example.com

Убедитесь, что все прошло хорошо:

kubectl -n cattle-system rollout status deploy/rancher

Waiting for deployment «rancher» rollout to finish: 0 of 3 updated replicas are available...

Подождите, пока все реплики будут обновлены, прежде чем выполнять следующий шаг.

Теперь, поскольку у нас нет балансировщика нагрузки, нам нужно выполнить дополнительный шаг, чтобы получить доступ к пользовательскому интерфейсу Rancher. Создайте следующий файл, назовите его ingress.ymlи заполните следующим (адаптируйте к hostтому, что вы выбрали):

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: rancher-demo-ingress

spec:

rules:

— host: rancher-demo.domain.test

http:

paths:

— path: /

backend:

serviceName: rancher-demo

servicePort: 443

Затем запустите:

$ kubectl apply -f ingress.yml

После этого Rancher должен быть доступен по адресу:

https://rancher-demo.domain.test

Примите исключение безопасности, на которое может пожаловаться ваш браузер, и вы должны увидеть следующий экран с предложением создать пароль и установить доменное имя (уже предварительно заполненное). Идите и сделайте это:

Добро пожаловать на экран Ранчера

Дайте Ранчеру несколько минут, чтобы все уладить. После этого вы должны получить обзор своего кластера:

Узлы

Идите вперед и щелкайте вокруг и наслаждайтесь плодами своего труда!

Резюме

Если вы достигли этой стадии, вы должны поздравить себя с упорством. Установка кластера Kubernetes не для слабонервных, даже с такими инструментами, как Rancher, которые несколько облегчают процесс.

Давайте рассмотрим, что мы сделали.

Мы рассмотрели, почему обучающие модели машинного обучения — это лишь вершина пресловутого айсберга, и что для запуска этих моделей в производство необходимо собрать много другого вспомогательного программного обеспечения.

Что еще более важно, мы создали нетривиальный кластер Kubernetes с Rancher Kubernetes Engine и установили Rancher для управления кластером. Это немалый подвиг. Однако мы до сих пор не внедрили машинное обучение! Это будет следующая статья из серии, в которой мы устанавливаем Kubeflow, платформу машинного обучения с открытым исходным кодом.

3D-печать5GABC-анализAndroidAppleAppStoreAsusCall-центрChatGPTCRMDellDNSDrupalExcelFacebookFMCGGoogleHuaweiInstagramiPhoneLinkedInLinuxMagentoMicrosoftNvidiaOpenCartPlayStationPOS материалPPC-специалистRuTubeSamsungSEO-услугиSMMSnapchatSonyStarlinkTikTokTwitterUbuntuUp-saleViasatVPNWhatsAppWindowsWordPressXiaomiYouTubeZoomАвдеевкаАктивные продажиАкцияАлександровск ЛНРАлмазнаяАлчевскАмвросиевкаАнализ конкурентовАнализ продажАнтимерчандайзингАнтрацитАртемовскАртемовск ЛНРАссортиментная политикаБелгородБелицкоеБелозерскоеБердянскБизнес-идеи (стартапы)БрендБрянкаБукингВахрушевоВендорВидеоВикипедияВирусная рекламаВирусный маркетингВладивостокВнутренние продажиВнутренний маркетингВолгоградВолновахаВоронежГорловкаГорнякГорскоеДебальцевоДебиторкаДебиторская задолженностьДезинтермедитацияДзержинскДивизионная система управленияДизайнДимитровДирект-маркетингДисконтДистрибьюторДистрибьюцияДобропольеДокучаевскДоменДружковкаЕкатеринбургЕнакиевоЖдановкаЗапорожьеЗимогорьеЗолотоеЗоринскЗугрэсИжевскИловайскИрминоКазаньКалининградКировскКировскоеКомсомольскоеКонстантиновкаКонтент-маркетингКонтент-планКопирайтингКраматорскКрасноармейскКрасногоровкаКраснодарКраснодонКраснопартизанскКрасный ЛиманКрасный ЛучКременнаяКураховоКурскЛисичанскЛуганскЛутугиноМакеевкаМариупольМаркетингМаркетинговая информацияМаркетинговые исследованияМаркетинговый каналМаркетинг услугМаркетологМарьинкаМедиаМелекиноМелитопольМенеджментМерчандайзерМерчандайзингМиусинскМолодогвардейскМоскваМоспиноНижний НовгородНиколаевНиколаевкаНишевой маркетингНовоазовскНовогродовкаНоводружескНовосибирскНумерическая дистрибьюцияОдессаОмскОтдел маркетингаПартизанский маркетингПервомайскПеревальскПетровскоеПлата за кликПоисковая оптимизацияПопаснаяПравило ПаретоПривольеПрогнозирование продажПродвижение сайтов в ДонецкеПроизводство видеоПромоПромоушнПрямой маркетингРабота для маркетологаРабота для студентаРазработка приложенийРаспродажаРегиональные продажиРекламаРеклама на асфальтеРемаркетингРетро-бонусРибейтРитейлРовенькиРодинскоеРостов-на-ДонуРубежноеСамараСанкт-ПетербургСаратовСватовоСвердловскСветлодарскСвятогорскСевастопольСеверодонецкСеверскСедовоСейлз промоушнСелидовоСимферопольСинергияСколковоСлавянскСнежноеСоздание сайтов в ДонецкеСоледарСоциальные сетиСочиСтаробельскСтаробешевоСтахановСтимулирование сбытаСуходольскСчастьеТелемаркетингТельмановоТираспольТорговый представительТорезТрейд маркетингТрейд промоушнТюменьУглегорскУгледарУкраинскХабаровскХарцызскХерсонХостингЦелевая аудиторияЦифровой маркетингЧасов ЯрЧелябинскШахтерскЮжно-СахалинскЮнокоммунаровскЯндексЯсиноватая