Установка 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-ы:
- Найти готовое решение (готовый чарт) и установить его.
- Создать свой 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» завершена.