Установка Helm в Unix/Linux

Установка Helm в Unix/Linux

Helm — это бинарный файл, который управляет развертыванием chart-ов (диаграм) в Kubernetes.  Что такое chart или диаграмма? А это собственно, — упакованная единица вашего программного обеспечения для деплоя в kubernetes. Он содержит все определения ресурсов, необходимые для запуска приложения, инструмента или службы внутри кластера Kubernetes (Это что-то подобное как в  Homebrew, Apt dpkg или RPM Yum).

Helm помогает вам управлять приложениями Kubernetes — Helm Charts помогает вам определять, устанавливать и обновлять даже самое сложное приложения в k8s.

Репозиторий (Repo) — это место, где диаграммы (chart-ы) могут хранится и использоваться. Это похоже на архив CPAN Perl или базу данных Fedora пакетов, но для Kubernetes.

Выпуск (Release) представляет собой экземпляр диаграммы, выполняющейся в кластере Kubernetes. Одна диаграмма может быть установлена много раз на один и тот же k8s кластер.

Установка Helm в Unix/Linux

Так как helm нужен для помощи с k8s, то нужно установить Kubernetes. Если еще не сделали, то вот полезные маны:

Установка Kubernetes в Unix/Linux

Установка Kubernetes кластера в Unix/Linux

Я буду использовать minikube (но это не столь важно) для стоих локальных тестов. И так, давайте приступим к установке хелма и посмотрим как можно работать с ним.

-=== СПОСОБ 1 ===-

Можно вытянуть мастер ветку с гита через wget/curl, например:

$ wget https://codeload.github.com/helm/helm/zip/master -O /usr/local/src/helm.zip && unzip /usr/local/src/helm.zip -d /usr/local/src

Или через git:

$ cd /usr/local/src && git clone https://github.com/helm/helm.git

Перейдем в папку:

$ cd helm

И выполняем билд:

$ make bootstrap build

Готово!

-=== СПОСОБ 2 ===-

Зайти на сайт и выкачать последний релиз-кандидат. Я люблю автоматизацию и по этому захотелось найти способ получить последние релизы прям из терминала, вот команда:

$ curl -s --list-only https://github.com/helm/helm/releases | grep -E "https://storage.googleapis.com/kubernetes-helm/helm-"| grep -E "MacOS|Linux"| cut -d">" -f2| cut -d"=" -f2| cut -d '"' -f2

Покажет примерно вот такое:

https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-darwin-amd64.tar.gz
https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-linux-amd64.tar.gz
https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-linux-arm.tar.gz
https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-linux-arm64.tar.gz
https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-linux-386.tar.gz
https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-linux-ppc64le.tar.gz
https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-linux-s390x.tar.gz
https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-rc.4-darwin-amd64.tar.gz
https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-rc.4-linux-amd64.tar.gz
https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-rc.4-linux-arm.tar.gz
https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-rc.4-linux-arm64.tar.gz

.............

Находим необходимую ссылку и качаем

$ wget https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-darwin-amd64.tar.gz -O /usr/local/src/helm-v2.11.0-darwin-amd64.tar.gz

Получаем бинарник из архива:

$ tar xfvz /usr/local/src/helm-v2.11.0-darwin-amd64.tar.gz -C /usr/local/src

Перемещаем бинарник:

$ mv darwin-amd64/helm /usr/local/bin/helm && sudo chmod +x /usr/local/bin/helm

Да! Иногда я велосипедю))) Но разве это плохо? xD

Почитав доку с хелмом, нашел их решение по уставновке (ЛОЛка):

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

Или:

$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
$ chmod 700 get_helm.sh
$ ./get_helm.sh

Можно юзать все кому что удобно.

-=== СПОСОБ 3 ===-

Для Mac OS X имеется установщик через homebrew (Установка homebrew тут):

$ brew install kubernetes-helm kubernetes-cli

Может есть еще другие способы установить данное ПО себе на машину, но думаю этих хватит.

Настройка Helm в Unix/Linux

Для хелма нужно следующее:

  • Кластер с кубернетисом (иногда я его буду называть — куб или кубик). Для последней версии Helm рекомендуется использовать последнюю стабильную версию Kubernetes.
  • Настройка политик безопасности для кластера и работы с хелмом.
  • Вы также должны иметь локальную конфигурацию kubectl.
  • Установка и настройка Helm and Tiller (со стороны кластера).

ПРИМЕЧАНИЕ. Kubernetes до 1.6 версии имеет ограниченный или не поддерживаются для управления доступом на основе ролей (RBAC).

Чтобы узнать, какой Tiller кластер будет установлен, вы можете запустить:

$ kubectl config current-context
gke_terraform-2018_us-east1-b_test-cc-stage

Или, можно выполнить:

$ kubectl cluster-info
Kubernetes master is running at https://104.196.128.119

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Unable to connect to the server: x509: certificate signed by unknown authority

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

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

Если в вашем кластере включен контроль доступа на основе ролей (RBAC), вы можете настроить учетную запись службы и правила до того как приступите юзать хелм.

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

$ kubectl get nodes

NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   1d    v1.10.0

Т.к у меня  это первое знакомство и по этому я не буду приводить примеры по защите k8s кластера. Но когда это понадобится (получу больше опыта) — обязательно дополню статью навыми полезностями.

Инициализация Helm и установка Tiller

Как только вы установили Helm, можете инициализировать его CLI (командную строку), а также установить Tiller в кластер Kubernetes:

$ helm init

Вывод:

Creating /Users/captain/.helm
Creating /Users/captain/.helm/repository
Creating /Users/captain/.helm/repository/cache
Creating /Users/captain/.helm/repository/local
Creating /Users/captain/.helm/plugins
Creating /Users/captain/.helm/starters
Creating /Users/captain/.helm/cache/archive
Creating /Users/captain/.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 /Users/captain/.helm.

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

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!

PS: Можно инициализировать Helm следующим образом:

$ helm init --output json

По умолчанию helm init обеспечит настройку локального $HELM_HOME, а затем установит Tiller на кластере. Можно отказатся от установки Tiller, для этого используйте:

$ helm init --client-only

Можно использовать не стабильную версию ПО, для этого есть «—canary-image» опция:

$ helm init --canary-image

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

$ helm init --upgrade

По умолчанию helm сохраняет информацию о release в ConfigMaps пространстве имен (т.е там где он запущен). Начиная с Helm версии 2.7.0, теперь есть бета-версия бета-памяти, которая использует Secrets для хранения информации. Это было добавлено для дополнительной защиты в Kubernetes.

Чтобы включить Secrets бэкэнд, вам необходимо запустить Tiller со следующими параметрами:

$ helm init --override 'spec.template.spec.containers[0].command'='{/tiller,--storage=secret}'

Данная команда установит Tiller в кластер Kubernetes, который вы видели с помощью:

$ kubectl config current-context

Можно получить все контенты:

$ kubectl config get-contexts
CURRENT   NAME                                          CLUSTER                                       AUTHINFO                                      NAMESPACE
          docker-for-desktop                            docker-for-desktop-cluster                    docker-for-desktop
          gke_terraform-2018_us-east1-b_test-cc-stage   gke_terraform-2018_us-east1-b_test-cc-stage   gke_terraform-2018_us-east1-b_test-cc-stage
*         minikube                                      minikube                                      minikube

Как видно с вывода, у меня юзается миникуб и он активный в данный момент.

Советы:

  • СОВЕТ 1. Хотите установить в другой кластер? Используйте флаг «—kube-context».
  • СОВЕТ 2. Если вы хотите обновить Tiller, просто запустите «helm init —upgrade».

По умолчанию Tiller устанавливается в кластер контекста kubectl (kubectl config current-context), в пространство имён kube-system, но это можно изменить, используя соответствующие опции и переменные окружения — они описаны в справке (helm init —help).

$ kubectl get all --selector=name=tiller --namespace kube-system

NAME                                 READY   STATUS    RESTARTS   AGE
pod/tiller-deploy-6fd8d857bc-snfsf   1/1     Running   4          1d

NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE
service/tiller-deploy   ClusterIP   10.100.44.210   <none>        44134/TCP   1d

NAME                            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/tiller-deploy   1         1         1            1           1d

NAME                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/tiller-deploy-6fd8d857bc   1         1         1       1d

Можно вывести инфу только для tiller-а:

$ kubectl --namespace kube-system get pods | grep tiller

tiller-deploy-6fd8d857bc-snfsf          1/1     Running   4          1d

Для помощи всегда есть:

$ helm -h
The Kubernetes package manager

To begin working with Helm, run the 'helm init' command:

	$ helm init

This will install Tiller to your running Kubernetes cluster.
It will also set up any necessary local configuration.

Common actions from this point include:

- helm search:    search for charts
- helm fetch:     download a chart to your local directory to view
- helm install:   upload the chart to Kubernetes
- helm list:      list releases of charts

Environment:
  $HELM_HOME          set an alternative location for Helm files. By default, these are stored in ~/.helm
  $HELM_HOST          set an alternative Tiller host. The format is host:port
  $HELM_NO_PLUGINS    disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins.
  $TILLER_NAMESPACE   set an alternative Tiller namespace (default "kube-system")
  $KUBECONFIG         set an alternative Kubernetes configuration file (default "~/.kube/config")
  $HELM_TLS_CA_CERT   path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem")
  $HELM_TLS_CERT      path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem")
  $HELM_TLS_KEY       path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem")
  $HELM_TLS_VERIFY    enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false")
  $HELM_TLS_ENABLE    enable TLS connection between Helm and Tiller (default "false")

Usage:
  helm [command]

Available Commands:
  completion  Generate autocompletions script for the specified shell (bash or zsh)
  create      create a new chart with the given name
  delete      given a release name, delete the release from Kubernetes
  dependency  manage a chart's dependencies
  fetch       download a chart from a repository and (optionally) unpack it in local directory
  get         download a named release
  help        Help about any command
  history     fetch release history
  home        displays the location of HELM_HOME
  init        initialize Helm on both client and server
  inspect     inspect a chart
  install     install a chart archive
  lint        examines a chart for possible issues
  list        list releases
  package     package a chart directory into a chart archive
  plugin      add, list, or remove Helm plugins
  repo        add, list, remove, update, and index chart repositories
  reset       uninstalls Tiller from a cluster
  rollback    roll back a release to a previous revision
  search      search for a keyword in charts
  serve       start a local http web server
  status      displays the status of the named release
  template    locally render templates
  test        test a release
  upgrade     upgrade a release
  verify      verify that a chart at the given path has been signed and is valid
  version     print the client/server version information

Flags:
      --debug                           enable verbose output
  -h, --help                            help for helm
      --home string                     location of your Helm config. Overrides $HELM_HOME (default "/Users/captain/.helm")
      --host string                     address of Tiller. Overrides $HELM_HOST
      --kube-context string             name of the kubeconfig context to use
      --kubeconfig string               absolute path to the kubeconfig file to use
      --tiller-connection-timeout int   the duration (in seconds) Helm will wait to establish a connection to tiller (default 300)
      --tiller-namespace string         namespace of Tiller (default "kube-system")

Use "helm [command] --help" for more information about a command.

Перейдем к использованию.

Использование SSL/TLS между Helm и Tiller

Первое что делаем, — это создаем центр сертификации:

$ openssl genrsa -out ./ca.key.pem 4096
Generating RSA private key, 4096 bit long modulus
.......................................++
.............................................................................++
e is 65537 (0x10001)

И потом запускаем:

$ openssl req -key ca.key.pem -new -x509 -days 7300 -sha256 -out ca.cert.pem -extensions v3_ca
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:UA
State or Province Name (full name) []:Ukraine
Locality Name (eg, city) [Default City]:Kiev
Organization Name (eg, company) [Default Company Ltd]:linux-notes
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:Tiller
Email Address []:solo.metal@bigmir.net

Идем дальше, генерируем ключ для Tiller:

$ openssl genrsa -out ./tiller.key.pem 4096
Generating RSA private key, 4096 bit long modulus
.......................................++
.......................++
e is 65537 (0x10001)

Идем дальше, генерируем ключ для Helm:

$ openssl genrsa -out ./helm.key.pem 4096
Generating RSA private key, 4096 bit long modulus
..................++
............................................................................++
e is 65537 (0x10001)

Затем нам нужно создать сертификаты из этих ключей:

$ openssl req -key tiller.key.pem -new -sha256 -out tiller.csr.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:UA
State or Province Name (full name) []:Ukraine
Locality Name (eg, city) [Default City]:Kiev
Organization Name (eg, company) [Default Company Ltd]:linux-notes
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:Tiller-server
Email Address []:solo.metal@bigmir.net

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

PS: Я пароль не устанавливал для ключа. Не вижу смысла, т.к настраиваю для тестового окружения.

И мы повторяем этот шаг для Helm сертификата:

$ openssl req -key helm.key.pem -new -sha256 -out helm.csr.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:UA
State or Province Name (full name) []:Ukraine
Locality Name (eg, city) [Default City]:Kiev
Organization Name (eg, company) [Default Company Ltd]:linux-notes
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:Helm
Email Address []:solo.metal@bigmir.net

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Теперь мы подписываем каждую из этих CSR с созданным CA-сертификатом (скорректируйте параметр days в соответствии с вашими требованиями):

$ openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in tiller.csr.pem -out tiller.cert.pem -days 365
Signature ok
subject=/C=UA/ST=Ukraine/L=Kiev/O=linux-notes/CN=Tiller-server/emailAddress=solo.metal@bigmir.net
Getting CA Private Key

И снова для клиентского сертификата:

$ openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in helm.csr.pem -out helm.cert.pem  -days 365
Signature ok
subject=/C=UA/ST=Ukraine/L=Kiev/O=linux-notes/CN=Helm/emailAddress=solo.metal@bigmir.net
Getting CA Private Key

На данный момент важными для нас являются следующие файлы:

  • CA. Убедитесь, что ключ хранится в секрете: ca.cert.pem и ca.key.pem.
  • Файлы Helm клиента: helm.cert.pem и helm.key.pem
  • Файлы Tiller сервера: tiller.cert.pem и tiller.key.pem

Т.е структура всех файлов имеет вид:

$ ll
total 72
-rwxrwxrwx  1 captain  staff  2065 Nov  6 10:40 ca.cert.pem
-rwxrwxrwx  1 captain  staff  3247 Nov  6 10:38 ca.key.pem
-rwxrwxrwx  1 captain  staff    17 Nov  6 10:46 ca.srl
-rwxrwxrwx  1 captain  staff  1948 Nov  6 10:46 helm.cert.pem
-rwxrwxrwx  1 captain  staff  1720 Nov  6 10:45 helm.csr.pem
-rwxrwxrwx  1 captain  staff  3243 Nov  6 10:41 helm.key.pem
-rwxrwxrwx  1 captain  staff  1960 Nov  6 10:45 tiller.cert.pem
-rwxrwxrwx  1 captain  staff  1736 Nov  6 10:43 tiller.csr.pem
-rwxrwxrwx  1 captain  staff  3243 Nov  6 10:41 tiller.key.pem

После того как все сгенерировано, можно запустить тиллер:

$ helm init --tiller-tls \
--tiller-tls-cert ./tiller.cert.pem \
--tiller-tls-key ./tiller.key.pem \
--tiller-tls-verify \
--tls-ca-cert ca.cert.pem \
--dry-run \
--debug

Через минуту или две он должен быть готов. Мы можем проверить Тиллера следующим образом:

$ kubectl -n kube-system get deployment

NAME            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
... other stuff
tiller-deploy   1         1         1            1           2m

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

$ kubectl get pods -n kube-system

На этом этапе вы должны получить ошибку при запуске основных команд Helm:

$ helm ls
Error: transport is closing

Это связано с тем, что ваш Helm клиент не имеет правильного сертификата для аутентификации в Tiller. Tiller теперь работает с TLS. Пришло время настроить Helm клиент для работы с TLS. Выполним проверку:

$ helm ls --tls --tls-ca-cert ca.cert.pem --tls-cert helm.cert.pem --tls-key helm.key.pem

Эта конфигурация отправляет наш клиентский сертификат для установления личности, использует ключ клиента для шифрования и использует CA сертификат для проверки идентификатора удаленного Tiller.

Данная команда, — рабочая, но очень длинная. Чтобы пофиксить все это дело, выполняем:

$ cp ca.cert.pem $(helm home)/ca.pem
$ cp helm.cert.pem $(helm home)/cert.pem
$ cp helm.key.pem $(helm home)/key.pem

После чего, можно смело юзать:

$ helm ls --tls

Как-то так!

Деплой или разворачивания char-тов в Helm

У Helm есть несколько способов установить chart-ы:

  1. Найти готовое решение (готовый чарт) и установить его.
  2. Создать свой chart и потом задеплоить его.

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

Получаем/обновляем репозиторий со всеми диаграмами(чартами):

$ helm repo update

Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈

По умолчанию Helm использует официальный репозиторий чартов Kubernetes. Он содержит тщательно проработанные актуальные чарты для решения множества прикладных задач. Этот репозиторий именуется stable:

$ helm repo list

NAME  	URL
stable	https://kubernetes-charts.storage.googleapis.com
local 	http://127.0.0.1:8879/charts

Ну что, давайте развернем что-то, я не знаю что, но можно поискать:

$ helm search grafana

NAME          	CHART VERSION	APP VERSION	DESCRIPTION
stable/grafana	1.17.4       	5.3.2      	The leading tool for querying and visualizing time series...

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

$ helm search

Добавить репозиторий с каким-то чартом (пример incubator репозиторий):

$ helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/

"incubator" has been added to your repositories

И теперь можно поискать\поставить пакет.

PS: Для удаления репозитория можно выполнить:

$ helm repo remove incubator

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

$ helm inspect stable/grafana

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

$ helm inspect values stable/grafana

Установка пакета будет следующим образом:

$ helm install --name=grafana stable/grafana

NAME:   grafana
LAST DEPLOYED: Sat Nov  3 21:23:59 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/ClusterRole
NAME                 AGE
grafana-clusterrole  1s

==> v1/Service
grafana  1s

==> v1beta2/Deployment
grafana  1s

==> v1/Pod(related)

NAME                      READY  STATUS             RESTARTS  AGE
grafana-5688858b6c-s9vq2  0/1    ContainerCreating  0         1s

==> v1beta1/PodSecurityPolicy

NAME     AGE
grafana  1s

==> v1/Secret
grafana  1s

==> v1/ClusterRoleBinding
grafana-clusterrolebinding  1s

==> v1beta1/Role
grafana  1s

==> v1beta1/RoleBinding
grafana  1s

==> v1/ConfigMap
grafana  1s

==> v1/ServiceAccount
grafana  1s


NOTES:
1. Get your 'admin' user password by running:

   kubectl get secret --namespace default grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster:

   grafana.default.svc.cluster.local

   Get the Grafana URL to visit by running these commands in the same shell:

     export POD_NAME=$(kubectl get pods --namespace default -l "app=grafana,component=" -o jsonpath="{.items[0].metadata.name}")
     kubectl --namespace default port-forward $POD_NAME 3000

3. Login with the password from step 1 and the username: admin
#################################################################################
######   WARNING: Persistence is disabled!!! You will lose your data when   #####
######            the Grafana pod is terminated.                            #####
#################################################################################

ЗАМЕЧАНИЕ! С вывода что выше, указаны некоторые инструкции, но у меня не заработал форвардинг портов (пришлось гуглить).

Графана запущена в ПОД-е и доступна только в нем, но чтобы она заработала, нужно выполнить форвординг портов:

$ export POD_NAME=$(kubectl get pods --namespace default -l "app=grafana" -o jsonpath="{.items[0].metadata.name}")

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

$ kubectl --namespace default port-forward $POD_NAME 3000

Доступ к графане будет на 127.0.0.1:3000. Логин у нас — admin, а вот пароль получаем:

$ kubectl get secret --namespace default grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

Теперь можете пробовать залогинится и проверить как оно работает. Такой запуск имеет свои недостатки, — после выключения ПОД-а, данные с графана-сервера пропадут. Я пока не гуглил как я могу это исправить, но попозже обязательно найду и добавлю в эту статью! Если кто-то знает как это сделать — просьба описать процесс.

Посмотрим какие сервисы уже установились в системе:

$ minikube service list

|-------------|----------------------|--------------|
|  NAMESPACE  |         NAME         |     URL      |
|-------------|----------------------|--------------|
| default     | grafana              | No node port |
| default     | kubernetes           | No node port |
| kube-system | kube-dns             | No node port |
| kube-system | kubernetes-dashboard | No node port |
| kube-system | tiller-deploy        | No node port |
|-------------|----------------------|--------------|

Смотрим релизы:

$ helm list

NAME   	REVISION	UPDATED                 	STATUS  	CHART         	APP VERSION	NAMESPACE
grafana	1       	Sat Nov  3 21:23:59 2018	DEPLOYED	grafana-1.17.4	5.3.2      	default

Чтобы посмотреть ваши ревизии, заюзайте:

$ helm history grafana

REVISION	UPDATED                 	STATUS  	CHART         	DESCRIPTION
1       	Sat Nov  3 21:23:59 2018	DEPLOYED	grafana-1.17.4	Install complete

У меня только одна ревизия релиза т.к я ничего больше не передеплоивал.

Можно выполнить ролбек (откат к какому-то релизу):

$ helm rollback grafana 1

Rollback was a success! Happy Helming!

В хелме ведется история, ее можно просмотерть:

$ helm history grafana

REVISION	UPDATED                 	STATUS    	CHART         	DESCRIPTION
1       	Sat Nov  3 21:23:59 2018	SUPERSEDED	grafana-1.17.4	Install complete
2       	Sat Nov  3 23:28:31 2018	DEPLOYED  	grafana-1.17.4	Rollback to 1

Давайте заскейлим графану до 3- репликаций:

$ kubectl scale --replicas 3 deployment/grafana

deployment.extensions/grafana scaled

Получаем поды:

$ kubectl get pods

NAME                       READY   STATUS    RESTARTS   AGE
grafana-5688858b6c-btxjv   1/1     Running   0          25s
grafana-5688858b6c-d99kb   1/1     Running   0          2m
grafana-5688858b6c-g46fz   1/1     Running   0          25s

Чтобы проверить работает ли скейлинг подов, можно удалить какй-то под и посмотреть что будет:

$ kubectl delete pod grafana-5688858b6c-btxjv
pod "grafana-5688858b6c-btxjv" deleted

Чекаем:

$ kubectl get pods

NAME                       READY   STATUS    RESTARTS   AGE
grafana-5688858b6c-cz4gx   1/1     Running   0          6s
grafana-5688858b6c-d99kb   1/1     Running   0          3m
grafana-5688858b6c-g46fz   1/1     Running   0          1m

С вывода видно что поды вернулись в нужно состояние (т.к я установил репликацию в 3).

Можем получить задеплоиный сервис:

$ kubectl get service

Удалить можно следующим образом:

$ kubectl delete service grafana

Можно получить много полезной информации через:

$ kubectl describe svc grafana

Name:              grafana
Namespace:         default
Labels:            app=grafana
                   chart=grafana-1.17.4
                   heritage=Tiller
                   release=grafana
Annotations:       <none>
Selector:          app=grafana,release=grafana
Type:              ClusterIP
IP:                10.105.2.247
Port:              service  80/TCP
TargetPort:        3000/TCP
Endpoints:         172.17.0.6:3000,172.17.0.7:3000,172.17.0.8:3000
Session Affinity:  None
Events:            <none>

Для удаления релиза можно использовать следующую команду:

$ helm delete grafana

release "grafana" deleted

Для полного удаления релиза используется опция —purge:

$ helm delete --purge grafana

Это я примеры приводил для работы с готовыми chart-ами, которые находятся в репозиторие(ях). Пришло время создать что-то свое. Возможно велосипед, а возможно и произведение искуства =D.

Создание своего chart-а для Helm

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

$ mkdir -p ~/Projects/k8s

Собственно в данной папке будут лежать все мои созданные chart-endpoint-ы.

Создадим каркас для одного из них (где endpoints — это имя вашего чарта):

$ helm create endpoints

Это создаст настройку для Helm Chart, которую вам нужно будет отредактировать:

  • $ vim endpoints/templates/deployment.yaml
  • $ vim endpoints/templates/service.yaml

Теперь можно установить созданную диаграмму на Kubernetes кластер. Допустим, у вас есть Helm Chart (я назвал его endpoints), мы можем установить ее в наш активный кластер Kubernetes с помощью следующей команды:

$ helm install --name endpoints endpoints

Данное действие установит чарт на k8s кластер с нужными параметрами которые описали в настройках (значения по умолчанию). Что делать, если мы хотим изменить одно значение в файле values.yaml? Мы можем легко это сделать с помощью «—set»команды:

$ helm install --name endpoints endpoints \
--set your_key=your_value

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

$ helm install --name endpoints endpoints \
--set your_key=your_value \
--dry-run \
--debug

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

$ helm package endpoints
Successfully packaged chart and saved it to: /Users/captain/Projects/k8s/endpoints-0.1.0.tgz

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

$ helm install ./endpoints-0.1.0.tgz

Вот так вот можно создавать свои чарты.

Установка плагинов в Helm

Для helm-а имеется плагины которые расширяют его функционал. Поставить плагин можно следующим образом:

$ helm plugin install https://github.com/technosophos/helm-template

Установщик позволяет устанавливать плагины и с локальной папки или заархирвированного архива по УРЛу или локальной папке.

Можно писать свои плагины, но если знаешь GO. У меня пока нет времени на его изучение, хотя и хочу!

Работа с Role-based Access Control в Helm

Пока не было возможности поюзать. Дополню как прийдет время.

Автодополнение команд в Helm

Я нашел команду которая генерирует функции для SH/BASH оболочек. Я придумал следующее решение:

$ helm completion bash >> ~/.bash_helm

После чего, открываем файл:

$ vim ~/.bashrc

И пропишем:

if [ -f $HOME/.bash_helm ]; then
    . $HOME/.bash_helm
fi

Сохраняем и перечитаем файл:

$ . ~/.bashrc

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

$ source <(helm completion bash)

PS:  Для миникуба имеется похожее решение!

Больше полезностей будет после того, как я найду что-то полезное. Вот и все, статья «Установка Helm в Unix/Linux» завершена.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.