☸️ Как установить приложения на Kubernetes с помощью Helm

by itisgood

Сложность – вещь относительная.

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

Но даже управление приложениями Kubernetes выглядит сложно по сравнению, скажем, с «apt-get install mysql».

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

Helm – это установщик пакетов в Kubernetes .

Он управляет «чартами» Kubernetes, которые являются «предварительно сконфигурированными пакетами ресурсов Kubernetes».

Helm позволяет вам легко устанавливать пакеты, вносить изменения и даже откатывать сложные изменения.

Давайте кратко рассмотрим, как установить, настроить и использовать Helm.

Как установить Helm

Установка Helm на самом деле довольно проста.

Скачайте последнюю версию Helm со страницы https://github.com/kubernetes/helm/releases. (Обратите внимание, что если вы используете более старую версию Kubernetes (1.4 или ниже), возможно, вам придется понизить версию Helm из-за серьезных изменений.)

Распакуйте архив:

$ gunzip helm-v2.8.1-linux-amd64.tar.gz
$ tar -xvf helm-v2.8.1-linux-amd64.tar
x linux-amd64/
x linux-amd64/helm
x linux-amd64/LICENSE
x linux-amd64/README.md
Затем переместите исполняемый файл helm на свой PATH:
$ sudo mv l*/helm /usr/local/bin/.
Наконец, инициализируйте helm как для настройки локальной среды, так и для установки серверной части Tiller в вашем кластере.
(Helm будет использовать кластер Kubernetes умолчанию если вы не укажете иначе.)
$ helm init
Creating /home/nick/.helm 
Creating /home/nick/.helm/repository 
Creating /home/nick/.helm/repository/cache 
Creating /home/nick/.helm/repository/local 
Creating /home/nick/.helm/plugins 
Creating /home/nick/.helm/starters 
Creating /home/nick/.helm/cache/archive 
Creating /home/nick/.helm/repository/repositories.yaml 
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com 
Adding local repo with URL: http://127.0.0.1:8879/charts 
$HELM_HOME has been configured at /home/nick/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!

Обратите внимание, что вы также можете обновить компонент Tiller, используя:

helm init --upgrade
Наконец, вам нужно добавить соответствующие учетные данные Kubernetes:
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule \
   --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy \
   -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
Это все, что нужно для установки самого Helm;
Теперь давайте рассмотрим его использование для установки приложения.

Установите приложение с помощью Helm

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

$ helm search
NAME                              CHART VERSION    APP VERSION      DESCRIPTION                                       
stable/acs-engine-autoscaler      2.1.3            2.1.1            Scales worker nodes within agent pools            
stable/aerospike                  0.1.7            v3.14.1.2        A Helm chart for Aerospike in Kubernetes          
stable/anchore-engine             0.1.3            0.1.6            Anchore container analysis and policy evaluatio...
stable/artifactory                7.0.3            5.8.4            Universal Repository Manager supporting all maj...
...
В нашем случае мы собираемся установить MySQL из чарта stable/mysql.
Для этого:
Сначала обновите репозиторий, как вы бы сделали это с обновлением apt-get:
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
Writing to /Users/nchase/.helm/repository/cache/stable-index.yaml
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈

Далее мы выполним фактическую установку:

$ helm install stable/mysql
Эта команда выводит много информации.
Сначала мы получаем информацию о версии, которая была развернута:
NAME:   inky-manta
LAST DEPLOYED: Thu Mar  1 03:10:58 2018
NAMESPACE: default
STATUS: DEPLOYED

Как вы можете видеть, он называется Inky-Manta, и он был успешно Деплоен.

Ваш релиз, конечно же, будет иметь другое название.

Далее мы получаем ресурсы, которые фактически были развернуты с помощью чарта stable/mysql:

RESOURCES:
==> v1beta1/Deployment
NAME              DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
inky-manta-mysql  1        1        1           0          1s

==> v1/Pod(related)
NAME                               READY  STATUS   RESTARTS  AGE
inky-manta-mysql-588bf547d6-4vvqk  0/1    Pending  0         0s

==> v1/Secret
NAME              TYPE    DATA  AGE
inky-manta-mysql  Opaque  2     1s

==> v1/PersistentVolumeClaim
NAME              STATUS   VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
inky-manta-mysql  Pending  1s

==> v1/Service
NAME              TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)   AGE
inky-manta-mysql  ClusterIP  10.102.240.155  <none>       3306/TCP  1s

Это хороший пример, потому что мы видим, что эта чарт настраивает несколько типов ресурсов: secret (для паролей), persistent volume claim (для хранения фактических данных), service (для обслуживания запросов) и deployment (для управления всем этим).

Чарт также позволяет разработчику добавлять примечания:

NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
inky-manta-mysql.default.svc.cluster.local

To get your root password run:

    MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default inky-manta-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)

To connect to your database:

1. Run an Ubuntu pod that you can use as a client:

    kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il

2. Install the mysql client:

    $ apt-get update && apt-get install mysql-client -y

3. Connect using the mysql cli, then provide your password:
    $ mysql -h inky-manta-mysql -p

To connect to your database directly from outside the K8s cluster:
    MYSQL_HOST=127.0.0.1
    MYSQL_PORT=3306

    # Execute the following commands to route the connection:
    export POD_NAME=$(kubectl get pods --namespace default -l "app=inky-manta-mysql" -o jsonpath="{.items[0].metadata.name}")
    kubectl port-forward $POD_NAME 3306:3306

    mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
Эти заметки представляют собой основную документацию, необходимую пользователю для использования реального приложения.

Как подключиться к MySQL

Первые строки заметок делают обманчиво простым подключение к MySql:

MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
inky-manta-mysql.default.svc.cluster.local
Однако прежде чем вы сможете что-либо сделать с этой информацией, вам нужно сделать две вещи: получить пароль root для базы данных и получить работающего клиента с сетевым доступом к поду, в котором она размещена.

Получить пароль MySQL

В большинстве случаев вы сможете получить пароль root, просто выполнив код, оставленный разработчиком:

$ kubectl get secret --namespace default inky-manta-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
DBTzmbAikO
Некоторые системы, в частности MacOS, выдают ошибку:
$ kubectl get secret --namespace default inky-manta-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
Invalid character in input stream.
Это из-за ошибки в base64, которая добавляет посторонний символ.
В этом случае вам придется извлечь пароль вручную.

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

Начните с изучения секретов, которыми управляет Kubernetes:

$ kubectl get secrets
NAME                     TYPE                                  DATA      AGE
default-token-0q3gy      kubernetes.io/service-account-token   3         145d
inky-manta-mysql   Opaque                                2         20m

Вот он второй, inky-manta-mysql, который нас интересует.

Давайте посмотрим на информацию, которая в нем содержится:

$ kubectl get secret inky-manta-mysql -o yaml
apiVersion: v1
data:
  mysql-password: a1p1THdRcTVrNg==
  mysql-root-password: REJUem1iQWlrTw==
kind: Secret
metadata:
  creationTimestamp: 2017-03-16T20:13:50Z
  labels:
    app: inky-manta-mysql
    chart: mysql-0.2.5
    heritage: Tiller
    release: inky-manta
  name: inky-manta-mysql
  namespace: default
  resourceVersion: "43613"
  selfLink: /api/v1/namespaces/default/secrets/inky-manta-mysql
  uid: 11eb29ed-0a85-11e7-9bb2-5ec65a93c5f1
type: Opaque
Вы, наверное, уже выяснили, где искать, но инструкции разработчики сказали нам, что необработанные данные о пароле были здесь:
jsonpath="{.data.mysql-root-password}"

Итак, мы ищем это:

apiVersion: v1
data:
  mysql-password: a1p1THdRcTVrNg==
  mysql-root-password: REJUem1iQWlrTw==
kind: Secret
metadata:
...

Теперь нам нужно просто расшифровать его:

$ echo "REJUem1iQWlrTw==" | base64 --decode
DBTzmbAikO
Итак, давайте продолжим и подключимся к базе данных.

Создайте клиент MySQL

Теперь у нас есть пароль, но если мы попытаемся просто соединиться с клиентом mysql на любой старой машине, мы обнаружим, что за пределами кластера нет соединения.

Например, если я пытаюсь подключиться к моему локальному клиенту mysql, я получаю сообщение об ошибке:

$ ./mysql -h linky-manta-mysql.default.svc.cluster.local -p
Enter password: 
ERROR 2005 (HY000): Unknown MySQL server host 'inky-manta-mysql.default.svc.cluster.local' (0)

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

$ kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never 

$ kubectl get pods
NAME                                      READY     STATUS             RESTARTS   AGE
hello-minikube-3015430129-43g6t           1/1       Running            0          1h
inky-manta-mysql-3326348642-b8kfc   1/1       Running            0          31m
ubuntu                                    1/1       Running            0          25s

Когда он заработает, продолжайте и подцепитесь к нему:

$ kubectl attach ubuntu -i -t

Hit enter for command prompt

Затем установите клиент MySQL:

root@ubuntu2:/# apt-get update && apt-get install mysql-client -y
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
...
Setting up mysql-client-5.7 (5.7.17-0ubuntu0.16.04.1) ...
Setting up mysql-client (5.7.17-0ubuntu0.16.04.1) ...
Processing triggers for libc-bin (2.23-0ubuntu5) ...
Теперь мы должны быть готовы к подключению.
Не забудьте использовать пароль, который мы извлекли на предыдущем шаге.
root@ubuntu2:/# mysql -h inky-manta-mysql -p
Enter password: 

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 410
Server version: 5.7.14 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
Конечно, вы можете делать то, что вы хотите, но сейчас мы пойдем дальше и выйдем из базы данных и контейнера:
mysql> exit
Bye
root@ubuntu2:/# exit
logout
Итак, мы успешно установили приложение – в данном случае MySql, используя Helm.
Но что еще может сделать с Helm?

Работа с ревизиями


Итак, теперь, когда вы увидели Helm в действии, давайте кратко рассмотрим, что вы на самом деле можете с ним сделать.

Helm предназначен для установки, обновления, удаления и отката выпусков.

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

Прежде всего, каждый раз, когда вы вносите изменения в Helm, вы создаете Релиз с определенным номером ревизии.

Развернув MySql, мы создали Release, который мы можем увидеть в этом списке:

$ helm list
NAME             REVISION    UPDATED                     STATUS      CHART           NAMESPACE
inky-manta       1           Thu Mar  1 03:10:58 2018    DEPLOYED    mysql-0.3.4     default  
volted-bronco    1           Thu Mar  1 03:06:03 2018    DEPLOYED    redis-1.1.13    default

Как видите, мы создали ревизию под названием Inky-Manta.

Он основан на чарте mysql-0.3.4 и имеет статус DEPLOYED.

Мы также можем получить информацию, которую мы уже видели, когда бд была впервые развернута, получив статус ревизии:

$ helm status inky-manta
LAST DEPLOYED: Thu Mar  1 03:10:58 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/PersistentVolumeClaim
NAME              STATUS   VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
inky-manta-mysql  Pending  5h

==> v1/Service
NAME              TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)   AGE
inky-manta-mysql  ClusterIP  10.102.240.155  <none>       3306/TCP  5h

==> v1beta1/Deployment
NAME              DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
inky-manta-mysql  1        1        1           0          5h

==> v1/Pod(related)
NAME                               READY  STATUS    RESTARTS  AGE
inky-manta-mysql-588bf547d6-4vvqk  0/1    Init:0/1  0         5h

==> v1/Secret
NAME              TYPE    DATA  AGE
inky-manta-mysql  Opaque  2     5h


NOTES:
MySQL can be accessed via port 3306 on the 
...
Теперь, если бы мы хотели, мы могли бы продолжить и удалить ревизию:
$ helm delete inky-manta
Теперь, если вы перечислите все активные ревизии, оно исчезнет.
$ helm ls
Однако, несмотря на то, что ревизия ушла, вы все равно можете увидеть статус:
$  helm status inky-manta
LAST DEPLOYED: Thu Mar  1 03:10:58 2018
NAMESPACE: default
STATUS: DELETED

NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
inky-manta-mysql.default.svc.cluster.local
...
Хорошо, а что если мы решим, что изменили свое мнение и хотим отменить это удаление?
К счастью, Helm предназначен и для этого.
Мы можем указать, что мы хотим откатить наше приложение до определенной ревизии (в данном случае 1).
$ helm rollback inky-manta 1
Rollback was a success! Happy Helming!
Мы видим, что приложение вернулось, и номер ревизии был увеличен:
$ helm ls
NAME             REVISION    UPDATED                     STATUS      CHART           NAMESPACE
inky-manta       2           Thu Mar  1 08:53:05 2018    DEPLOYED    mysql-0.3.4     default  
volted-bronco    1           Thu Mar  1 03:06:03 2018    DEPLOYED    redis-1.1.13    default

Мы также можем проверить статус:

$ helm status inky-manta
LAST DEPLOYED: Thu Mar  1 08:53:05 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1beta1/Deployment
NAME              DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
inky-manta-mysql  1        1        1           0          48s
...

см.также

📦 10 команд, которые должен знать каждый администратор Ceph

You may also like

Leave a Comment