Сложность – вещь относительная.
Развертывание приложения с использованием контейнеров может быть намного проще, чем попытка управлять развертыванием традиционного приложения в разных средах, но попытка управлять и масштабировать несколько контейнеров вручную намного сложнее, чем их оркестрация с использованием 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
$ sudo mv l*/helm /usr/local/bin/.
$ 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
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 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... ...
$ 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
Получить пароль MySQL
В большинстве случаев вы сможете получить пароль root, просто выполнив код, оставленный разработчиком:
$ kubectl get secret --namespace default inky-manta-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo DBTzmbAikO
$ kubectl get secret --namespace default inky-manta-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo Invalid character in input stream.
По сути, мы собираемся выполнить те же шаги, что и в этой строке кода, но по одному за раз.
Начните с изучения секретов, которыми управляет 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
Работа с ревизиями
Итак, теперь, когда вы увидели 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 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 ...
см.также