Глава 3. Локальная установка Kubernetes

В этой главе мы рассмотрим как получить поднятой и работающей локальную установку Kubernetes с помощью Minikube. Как только мы получим исполняемой свою установку, мы отработаем ряд необходимых базовых функций и обсудим имеющиеся ограничения при локальном исполнении Kubernetes. Мы отработаем установку в:

  • macOS 10.13 High Sierra

  • Windows 10 Professional

  • Ubuntu 17.04

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

Про Minikube

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

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

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

По мере взросления Kubernetes то же происходит и с процессом установки. Достаточно быстро был создан целый ряд вспомогательных сценариев в помощь запуску Kubernetes на различных платформах; и Minikube является одним из такх инструментариев.

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

  • DNS, NodePorts и Ingress

  • ConfigMaps и Secrets

  • Выбор контейнеров времени исполнения; вы можете применять либо Docker, либо rkt

  • Постоянные тома через hostPath

  • Инструментальные пенели

Функции Kubernetes, которые обычно требуются для общедоступного поставщика услуг, такого как AWS, Microsoft Azure или Google Cloud, либо для множества хостов, не поддерживаются. Некоторыми из таких свойств являются:

  • LoadBalancers

  • Политики расширенных расписаний

Это происходит по той причине, что Minikube запускает только единственный узел в виртуальной машине в вашем ПК. Это не должно ограничивать вас; помните, что вы желаете использовать Minikube только для разработки и вы никогда не будете создавать с его помощью промышленные решения. Существует великое множество инструментов, которые описываются в Главе 6, Установка Kubernetes в облаке, которые лучше приспособлены для запуска готовых к промышленному использованию кластеров в общедоступных облачных решениях или у прочих производителей.

Minikube составлен из двух основных компонентов:

  • libmachine: это библиотека из Docker применяется для предоставления виртуальных машин в вашей машине хоста. Она является центральным компонентом Машины Docker, а также Docker для macOS и Docker для Windows.

  • localkube: эта библиотека разработана и внесена в общий проект Minikube со стороны Redspread (который теперь является частью CoreOS), и она отвечает за развёртывание и сопровождение самого узла Kubernetes после того, как запущена необходимая виртуальная машина.

Вместо того чтобы обсуждать что ещё может делать Minikube, нам следует рассмотреть его установку, а затем обсудить как мы можем с ним взаимодействовать.

Установка Minikube

Мы рассмотрим установку Minikube в трёх различных операционных системах, упомянутых в нашем введении. После установки весь процесс взаимодействия с Minikube в основном совместим, что означает, что хотя я буду применять в своих примерах macOS, те же самые команды будут раьотать как в Windows, так и в linux. Учитывая сложности установки и процедуры настройки раннего Kubernetes, вы будете приятно удивлены насколько прост этот процесс теперь.

macOS 10.13 High Sierra

Чтобы установить Minikube в macOS, вам необходимо установить Homebrew и Cask.

[Замечание]Замечание

Homebrew является диспетчером пакетов на основе командной строки в macOS. Homebrew применяется как для установки инструментов командной строки, так и Cask, которые являются некими добавлениями для управления настольными приложениями. Это чрезвычайно полезно для управления программным обеспечением, которое не доступно через macOS App Store, а также спасает вас от необходимости вручную компилировать программное обеспечение на вашей машине.

Если у вас ещё пока нет установленного Homebrew, вы можете установить его выполнив следующую команду:


$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
		

После его установки вам понадобится установить Cask выполнив:


$ brew install cask
		

Теперь, когда у вас имеются установленными Homebrew и Cask, вам следует убедиться что всё современное и готово к исполнению выполнив команды:


$ brew update
$ brew doctor
		

Раз Homebrew и Cask готовы, вы можете установить Minikube выполнив следующую команду:


$ brew cask install minikube
		

Она прежде всего выгрузит все необходимые зависимости, а затем установит Minikube:

 

Рисунок 3-1



Этот процесс займёт менее минуты и, когда оно будет установлено, вы должны иметь возможность выполнить следующее:


$ minikube version
		

Эта команда отобразит установленную в настоящее время версию; в моём случае это было v0.22.2. Теперь у нас имеется установленный и работающий Minikube.

Windows 10 Professional

Аналогично тому как мы установили Minikube в macOS, мы будем устанавливать некий диспетчер пакетов, который в настоящее время называется Chocolatey.

[Замечание]Замечание

Chocolatey является диспетчером пакетов Windows, аналогично Homebrew в macOS. Он делает возможным установку программного обеспечения из имеющейся командной строки и поддерживается как PowerShell, так и cmd.exe. Мы будем применять PowerShell.

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

[Замечание]Замечание

Приводимая далее команда состоит из одной строки, а не из множества строк. Кроме того, так как мы исполняем команду установки с помощью Set-ExecutionPolicy Bypass, у вас будет запрошено уверены ли вы в этом. Так как мы исполняем этот сценарий непосредственно с сайта Chocolatey через HTTPS, вам следует доверять этому сценарию и ответить yes.


$ Set-ExecutionPolicy Bypass; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
		

После того как Chocolatey установлен, вы можете установить Minikube, исполнив:


$ choco install minikube
		

Эта команда выгрузит и установит необходимые зависимости и после этого установит Minikube. Когда вы получите запрос на то желаете ли вы подтвердить что вы хотите исполнить этот сценарий, ответьте yes:

 

Рисунок 3-2



Когда установка выполнена, вы можете исполнить такую команду:


$ minikube version
		

Эта команда отобразит установленную в настоящее время версию; в моём случае это было v0.22.2.

Ubuntu 17.04

В отличии от вариантов с macOS и Windows, мы не будем применять диспетчер пакетов для установки Minikube в Ubuntu 17.04. Вместо этого мы просто выгрузим исполняемые файлы непосредственно со страницы этого проекта. Для этого просто исполните следующую команду:


$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.22.2/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
		

Будет выгружен Minikube, затем будут установлены полномочия исполнения и всё это будет помещено в /usr/local/bin/, следовательно оно будет располагаться в пути системы.

Теперь, когда Minikube установлен, нам понадобится выгрузить kubectl. В процессе установки macOS и Windows об этом заботились диспетчеры пакетов; к счастью, весь процесс во многом схож с той же самой командой, которую мы только что исполняли при установке Minikube:


$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x ./kubectl && sudo mv ./kubectl /usr/local/bin/kubectl
		

Раз установка выполнена, вам следует опять получить возможность исполнить следующую команду, чтобы убедиться в том какая версия Minikube установлена:


$ minikube version
		

Когда я исполнил эту команду, она вернула v0.22.2, что можно увидеть на приводимом ниже снимке экрана:

 

Рисунок 3-3



Гипервизоры

Minikube поддерживает множество различных гипервизоров. Гипервизор является процессом, который применяется для запуска определённой виртуальной машины; он изолирует операционную систему определённой виртуальной машины для вас и в то же время позволяет совместно использовать такие ресурсы, как ЦПУ, ОЗУ и дисковое пространство.

Непосредственно установленный Minikube поддерживает следующие гипервизоры:

  • Hyper-V (Windows 10): это натуральный гипервизор, доступный в Windows 10 Professional and Windows Servers.

  • KVM (Ubuntu 17.04): это естественный гипервизор Linux, который работает внутри ядра Linux в большинстве дистрибутивов.

  • VirtualBox (macOS, Windows 10, and Ubuntu 17.04): выпускаемый Oracle, VirtualBox является x86 гипервизором с открытым исходным кодом, который может исполняться в большом числе операционных систем.

  • VMware Fusion (macOS): Fusion предоставляет оптимизированный под macOS гипервизор, чья основная сила состоит в его возможности исполнять и выставлять приложения Windows в macOS.

  • xhyve (macOS): это внутренний гипервизор в macOS; как и KVM в Linux, он встроен в само ядро.

Как вы можете увидеть из приведённого перечня, только VirtualBox поддерживается во всех трёх операционных системах, которые мы рассматриваем в данной главе. По этой причине именно он является определяемым по умолчанию гипервизором, поддерживаемым Minikube. Если у вас уже установлен VirtualBox, вы можете исполнить приводимые далее команды, которые совместимы для выбранной вами операционной системы.

В macOS мы можем воспользоваться Homebrew и Cask для установки VirtualBox и исполнить:


$ brew cask install virtualbox
		

Аналогично в Windows 10 вы можете воспользоваться Chocolatey для установки VirtualBox:

[Замечание]Замечание

Вы не можете применять VirtualBox в Windows 10 при включённом Hyper-V. Если вы желаете продолжить, отключите, пожалуйста, Hyper-V.


$ choco install virtualbox
		

Наконец, для Ubuntu 17.04, вам следует исполнить следующие команды для добавления необходимого репозитория и ключа:


$ brew cask install virtualbox$ wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -
$ sudo sh -c 'echo "deb http://download.virtualbox.org/virtualbox/debian $(lsb_release -sc) contrib" >> /etc/apt/sources.list'
		

И затем исполнить такие командыдля загрузки этого репозитория, который мы добавили ранее и установить необходимый пакет:


$ sudo apt-get update
$ sudo apt-get install virtualbox-5.1
		

Теперь у вас должна быть возможность видеть Virtualbox в полном перечне программ.

Запуск Minikube

Завершив свою установку, нам необходимо запустить Minikube. Для этого исполните следующую команду:


$ minikube start
		

В macOS вы должны увидеть что- то такое:

 

Рисунок 3-4



Как вы можете видеть, для создания выгруженной виртуальной машины применяется её ISO. После того как эта виртуальная машина стартует, вырабатываются сертификаты, которые мы будем применять для аутентификации в нашем одноузовом кластере и, в конце концов, настраивается kubectl настраивается со всеми деталями нашего локального кластера Kubernetes.

Исполнение той же самой команды в Windows 10 имеет результатами тот же самый набор шагов:

 

Рисунок 3-5



Как вы уже могли предугадать, исполнение в Ubuntu 17.04 приводит к тем же самым результатам. Выполните такую команду:


$ minikube status
		

Вы получите некое сообщение, подтверждающее что всё работает и что kubectl был успешно настроен для взаимодействия с вашим кластером Kubernetes:

 

Рисунок 3-6



Если вы открыли VirtualBox, вы должны увидеть исполняемой виртуальную машину Minikube; например, вот именно то, что я вижу при открытии VirtualBox в Windows 10:

 

Рисунок 3-7



Даром что мы запустили Minikube в трёх разных операционных системах, помимо самой начальной установки, с чем вы уже знакомы и что мы уже обсуждали в Главе 2, Введение в Kubernetes: нет никакого замыкания на поставщика и практики совместимости, а все различия имелись только до того, прежде чем мы начали применять свой только что установленный кластер Kubernetes.

Команды Minikube

До сих пор мы применяли команды minikube start и minikube status для запуска нашего кластера Kubernetes из одного узла и проверки того, что всё работает как ожидалось. Прежде чем мы рассмотрим взаимодействие с Kubernetes, имеются ещё несколько основных команд Minikube, которые я бы хотел охватить.

Останов и удаление

Так как мы исполняем свой кластер Kubernetes на одном узле в качестве виртуальной машины в вашем хосте, вы можете не хотеть видеть его исполняемым всё время, затрачивая ресурсы.

Для достижения этого имеются две опции, первой из которых является minikube stop. Эта команда остановит ваш узел и оставит вашу виртуальную машину нетронутой. Вам следует применять эту команду если вы планируете зацепить то место, где вы остановились, когда вы следующий раз стартуете свой узел исполняя minikube start.

Хотя команда minikube stop и прекратит использование ресурсов ЦПУ и ОЗУ вашей вирткуальной машиной, имеющийся образ жёсткого диска для размещения этой виртуальной машины всё ешё будет присутствовать в вашей машине. Хотя заново запущенный кластер не отнимает много места на жёстком диска машины хоста, в моей машине macOS установка составляет примерно 650МБ; как только вы начнёте применять свой кластер, вы можете обнаружить, что это пространство по крайней мере удвоится.

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

[Предостережение]Предостережение

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

Когда вы запустите команду minikube start вновь, ваш кластер стартует снова с нуля, как мы это впервые увидели в предыдущем разделе.

Окружение

Далее, у нас есть несколько команд, которые отображают информацию о самой виртуальной машине и также о той среде, которую Minikube настроил под ваше устройство.

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

Следующей командой, на которую мы хотим обратить внимание, является minikube docker-env. Исполнение этой команды должно вывести на ваш экран нечто вроде приводимого ниже:


$ minikube start$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.101:2376"
export DOCKER_CERT_PATH="/Users/russ/.minikube/certs"
export DOCKER_API_VERSION="1.23"
# Run this command to configure your shell:
# eval $(minikube docker-env)
		

Что делает для вас это вывод (если вы его установили), так это то, что он позволяет вам настраивать вашего локального клиента Docker для взаимодействия с имеющейся установкой Docker в вашей виртуальной машине Minikube. Помимо этого имеется также и обратная сторона такого действия. Версия Docker, которая в настоящее время распространяется как часть Minikube, слегка отстаёт от текущего выпуска. Вы можете заметить это выполнив eval $(minikube docker-env) с последующим docker version. Когда я исполнил эти две команды, я получил следующие результаты:


$ eval $(minikube docker-env)
$ docker version
Client:
 Version: 17.06.2-ce
 API version: 1.23
 Go version: go1.8.3
 Git commit: cec0b72
 Built: Tue Sep 5 20:12:06 2017
 OS/Arch: darwin/amd64

Server:
 Version: 1.12.6
 API version: 1.24 (minimum version )
 Go version: go1.6.4
 Git commit: 78d1802
 Built: Wed Jan 11 00:23:16 2017
 OS/Arch: linux/amd64
 Experimental: false
		

Как вы можете видеть из приведённого вывода, на время написания та версия Docker, которую применяет Minikube отстаёт на две версии от моей локальной установки Docker для macOS, которая исполняет самую последнюю стабильную версию. В контексте того, что мы обсуждаем в данной книге, исполнение более старой версии Docker не является проблемой, и об этом не стоит беспокоиться, так как мы не будем взаимодействовать с ним непосредственно.

Доступ виртуальной машины и журналы

У вас имеется возможность подключения через SSH к своей виртуальной машине Minikube. Будучи частью процесса установки, некий ключ SSH был создан и совместно используется в своей виртуальной машине при её запуске. Вы можете проверить местоположение данного ключа исполнив minikube ssh-key. Эта команда вернёт вам значение путей для частей общедоступного и частного ключей вашего ключа. Вы можете применять эту комбинацию с прочими командами для SSH подключения к своей виртуальной машине выполнив в macOS или Ubuntu следующее:


$ ssh docker@$(minikube ip) -i $(minikube ssh-key)
		

Эта команда создаст необходимый IP адрес вашей виртуальной машины и путь к требующемуся общедоступному ключу на- лету:

 

Рисунок 3-8



Однако, Minikube также имеет команду, которая выполнит всё это для вас и которая также поддерживается на всех платформах. Исполнение minikube ssh зарегистрирует вас непосредственно в вашей виртуальной машине в качестве пользователя Docker, как это отображается в следующем выводе Терминала:

 

Рисунок 3-9



Последняя команда, на которую мы хотим быстро обратить внимание это is minikube logs. Она отобразит все регистрации, выработанные вашим экземпляром localkube:

 

Рисунок 3-10



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

Hello world

Теперь, когда у нас имеется поднятым исполняемым с применением Minikube кластер Kubernetes из одного узла, мы можем взглянуть на запуск как службы. Прежде чем мы перейдём к своему клиенту командной строки, мы начнём с применения инструментальной панели.

Инструментальная панель

Всякая установка Minikube поступает с инструментальной панелью на основе веб интерфейса. К нему можно осуществить доступ исполнив minikube dashboard, что немедленно откроет соответствующую инструментальную панель в выбранном вами по умолчанию браузере:

 

Рисунок 3-11



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

В своей странице Deploy a Containerized App вы найдёте ряд опций. Оставив все перечисленные ниже подробности Specify app включёнными, наполните их следующим:

  • App name: dashboard-hello-world

  • Container image: nginx:latest

  • Number of pods: 1

  • Service: External

  • Port: 8080

  • Target port: 80

  • Protocol: TCP

Для наших целей не требуется заполнять их никакими опциями,которые можно отыскать в SHOW ADVANCED OPTIONS. Просто кликните по кнопке DEPLOY в данной форме. Через короткий промежуток времени ваша инструментальная панель должна отразить, что у вас имеется некие оснащение, под, ReplicaSet, а также служба, причём все они сопровождаются dashboard-hello-world в своём названии:

 

Рисунок 3-12



Вы можете просмотреть все службы, исполнив следующую команду:


$ minikube service dashboard-hello-world
		

Она возвратит следующее сообщение:


Opening kubernetes service default/dashboard-hello-world in default browser...
		

Открыв свой браузер вы должны обнаружить определённую по умолчанию страницу NGINX:

 

Рисунок 3-13



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

Командная строка

В своей прошлой главе мы вкратце коснулись того как применять файлы YAML или JSON для определения ваших подов, ReplicaSets и служб. Давайте воспользуемся kubectl для запуска некоторого приложения, которое соотносится с предыдущим.

Прежде всего нам требуется файл для запуска; вы можете обнаружить его копию с названием cli-hello-world.yml в папке Chapter03 нашего пакета кода и в репозитории GitHub, который соответствует этому имени:


apiVersion: v1
kind: Service
metadata:
  name: cli-hello-world
spec:
  selector:
    app: cli-hello-world
  type: NodePort
  ports:
  - protocol: TCP
    port: 8000
    targetPort: 80
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: cli-hello-world
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cli-hello-world
  template:
    metadata:
      labels:
        app: cli-hello-world
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
 	   

Как вы могли заметить, хотя это и один файл, в нём у нас имеются два различных раздела. Самый первый запускает необходимую внешнюю службу, выставляя её на порт 8000 чтобы не было столкновений с той внешней службой, которую мы запускали с применением своей инструментальной панели из нашего предыдущего раздела. Наш второй раздел определяет сам под и набор реплик; это достаточно похоже на то, что мы запускали при помощи инструментальной панели.

Чтобы запустить наше приложение нам просто надо выполнить следующую команду:


$ kubectl apply -f cli-hello-world.yml
		

Вы почти немедленно получите подтверждение того, что служба и оснащение были созданы:


service "cli-hello-world" created
deployment "cli-hello-world" created
		

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


$ minikube service cli-hello-world
		

И снова вы получите приветствие страницы NGINX по умолчанию.

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

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


$ kubectl get pods
$ kubectl get replicasets
$ kubectl get services
$ kubectl get secrets
		

Как вы можете увидеть из следующего вывода Терминала, всё перечисляется с их текущими состояниями:

 

Рисунок 3-14



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


$ kubectl get endpoints
$ kubectl get events
$ kubectl get storageclasses
		

Простое исполнение kubectl предоставит полный список всех различных параметров, которые вы можете применять. Теерь, когда у вас есть полное название нашего пода, которым в моём случае является cli-hello-world-3678853705-f41d2, мы можем обнаружить дополнительные подробности о нём выполнив команду kubectl describe. Например, я исполнил следующее:


$ kubectl describe pods/cli-hello-world-3678853705-f41d2
		
[Совет]Совет

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

Я получил следующую возвращаемую информацию:


Name: cli-hello-world-3678853705-f41d2
Namespace: default
Node: minikube/192.168.99.100
Start Time: Sun, 08 Oct 2017 10:41:06 +0100
Labels: app=cli-hello-world
                pod-template-hash=3678853705
Annotations: kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"default","name":"cli-hello-world-3678853705","uid":"ce7b2030-ac0c-11e7-9136-08002...
Status: Running
IP: 172.17.0.5
Created By: ReplicaSet/cli-hello-world-3678853705
Controlled By: ReplicaSet/cli-hello-world-3678853705
Containers:
  nginx:
    Container ID: docker://0eec13c8340b7c206bc900a6e783122cf6210561072b286bda10d225ffb3c658
    Image: nginx:latest
    Image ID: docker-pullable://nginx@sha256:af32e714a9cc3157157374e68c818b05ebe9e0737aac06b55a09da374209a8f9
    Port: 80/TCP
    State: Running
      Started: Sun, 08 Oct 2017 10:41:09 +0100
    Ready: True
    Restart Count: 0
    Environment: <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-v563p (ro)
Conditions:
  Type Status
  Initialized True
  Ready True
  PodScheduled True
Volumes:
  default-token-v563p:
    Type: Secret (a volume populated by a Secret)
    SecretName: default-token-v563p
    Optional: false
QoS Class: BestEffort
Node-Selectors: 
Tolerations: 
Events:
  Type Reason Age From Message
  ---- ------ ---- ---- -------
  Normal Scheduled 31m default-scheduler Successfully assigned cli-hello-world-3678853705-f41d2 to minikube
  Normal SuccessfulMountVolume 31m kubelet, minikube MountVolume.SetUp succeeded for volume "default-token-v563p"
  Normal Pulling 31m kubelet, minikube pulling image "nginx:latest"
  Normal Pulled 31m kubelet, minikube Successfully pulled image "nginx:latest"
  Normal Created 31m kubelet, minikube Created container
  Normal Started 31m kubelet, minikube Started container
		

Вы можете применить kubectl describe для поиска дополнительной информации о многом из того, что вы можете перечислить в kubectl get, к примеру:


$ kubectl describe services/cli-hello-world
$ kubectl describe replicasets/cli-hello-world-3678853705
$ kubectl describe storageclasses/standard
		

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

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

В папке Chapter03 вы найдёте папку с названием html. Она содержит единственный файл с именем index.html. Исполнение приводимой далее команды в папке Chapter03 смонтирует HTML внутри данной виртуальной машины:


$ minikube mount ./html:/data/html
		

Вы можете видеть это из сообщения, которое отобразится после того исполнилась данная команда:

 

Рисунок 3-15



[Замечание]Замечание

На момент написания был известен один баг применения команды minikube mount в хостах Windows 10, ознакомьтесь, пожалуйста, со следующими пояснениями GitHub для получения дополнительной информации: https://github.com/kubernetes/minikube/issues/1473 и https://github.com/kubernetes/minikube/issues/2072.

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

Исполните следующие команды:


$ minikube ssh
$ ls -lhat /data/html/
$ exit
		

Они зарегистрируют вас в соответствующей виртуальной машине Minikube, получит перечень каталога /data/html/, а затем осуществит exit из данную виртуальной машины.

 

Рисунок 3-16



Как вы можете видеть, наш файл index.html доступен в нашем узле кластера в /data/html/. Переместившись обратно в папку Chapter03, вы можете увидеть файл с названием cli-hello-worldstorage.yml. Он содержит информацию о службе и развёртывании, которая использует эту монтируемую папку.

Соответствующий раздел службы выглядит достаточно похоже тому, который применялся ранее в данном разделе; однако имеется добавление в его раздел развёртывания:


apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: cli-hello-world-storage
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cli-hello-world-storage
  template:
    metadata:
      labels:
        app: cli-hello-world-storage
    spec:
      volumes:
      - name: html
        hostPath:
          path: /data/html
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: html
 	   

Как вы можете видеть, в нашей части spec имеющегося развёртывания, у нас теперь определён некий volume с названием html, затем в части container мы берём этот том с названием html и применяем опцию mountPтоath, чтобы сообщить Kubernetes что мы желаем смонтировать этот том в /usr/share/nginx/html, что является установленным по умолчанию веб корнем для нашего образа контейнера NGINX, который мы применяем внутри своего контейнера.

Воспользуйтесь командой kubectl apply для запуска своего приложения, а затем командой minikube service чтобы открыть эту службу в вашем браузере:


$ kubectl apply -f cli-hello-world-storage.yml
$ minikube service cli-hello-world-storage
		

Вы должны увидеть следующую страницу:

 

Рисунок 3-17



Если вы измените index.html в папке html вашей локальной машины, эти изменения будут немедленно отображены, когда вы обновите окно браузера.

Прежде чем мы переместимся к следующей главе, нам следует удалить свою машину Minikube, которую мы применяли в этой главе с тем, чтобы мы начали с чистого листа. Прежде всего, у нас имеется процесс, который удерживает папку html смонтированной в нашей машине хоста. Чтобы прекратить этот процесс, вернитесь обратно в Терминал или окно PowerShell и нажмите Ctrl + C; это нажатие отправит сигнал прекращения данному процессу и вернёт вас в вашу командную строку. Затем мы можем исполнить:


$ minikube delete
		

Это удалит текущую виртуальную машину, что означает, что когда мы в следующий раз запустим Minikube, он начнётся с нуля.

Ссылки

Дополнительную информацию по инструментам, которые мы применяли в данной главе можно найти в их страницах проектов:

Выводы

В этой главе мы установили кластер Kubernetes из одного узла в нашей локальной машине при помощи Minikube, мы рассмотрели как осуществить это в macOS, Windows 10 и Ubuntu Linux. После его установки мы обнаружили, что мы можем взаимодействовать со своим одноузловым кластером Kubernetes в точности одним и тем же образом, вне зависимости от того в какой операционной системе работает наша локальная машина.

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

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