melmus.github.io

DevOps Customer

View on GitHub

Helm в определенном namespace’e

Здесь описано работа с helm в пределах одного namespace.

Сначала будет показано создание аккаунта для Tiller (нужно делать с повышенными правами), а после все дейсвия пользователь сможет сделать самостоятельно.

В примере будет испрользоваться:

Команда: demo

Namespace: Demo-team

Server: test-server

Context (для пользователя): demo-team-admin-context

Создание аккаунта (для Support)

Создайте в namespace’е команды учётную запись tiller

apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: demo-team
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: edit
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: demo-team

Применяем конфиг и удаляем файл

sudo -u kube kubectl apply -f /tmp/tiller-account.yml
rm -f /tmp/tiller-account.yml

Всё. Дальше начинает работать пользователь.

Helm должен быть установлен по статье Установка Helm

Пример работы пользователя

Опционально прописываем прокси команды

export http_proxy=http://USER:PASSWORD@proxy:3128
export https_proxy=http://USER:PASSWORD@proxy:3128
export no_proxy=`hostname -I | cut -d' ' -f1`

Инициализирует Helm на Вашем аккаунте. Не забывайте проставлять настоящие контексты и названия namespace’а

helm init --kube-context demo-team-admin-context --tiller-namespace demo-team --override 'spec.template.spec.containers[0].resources.limits.cpu'="500m" --override 'spec.template.spec.containers[0].resources.limits.memory'="512Mi" --override 'spec.template.spec.containers[0].resources.requests.cpu'="100m" --override 'spec.template.spec.containers[0].resources.requests.memory'="100Mi" --service-account tiller

По факту будет создан каталог .helm в домашнем каталоге пользоватлея и запущен один под “tiller-deploy” в рабочем Namespace’е

kubectl --namespace demo-team --context=demo-team-admin-context get pods
NAME                             READY   STATUS    RESTARTS   AGE
tiller-deploy-6c979f68f6-x6l7r   1/1     Running   0          17m

Отлично. Теперь можно работать с helm. Попробуем выполнить поиск

helm search postgres 
NAME                                   CHART VERSION    APP VERSION    DESCRIPTION                                                 
stable/postgresql                      6.0.0            11.4.0         Chart for PostgreSQL, an object-relational database manag...
stable/prometheus-postgres-exporter    0.7.1            0.5.1          A Helm chart for prometheus postgres-exporter               
stable/stolon                          1.1.2            0.13.0         Stolon - PostgreSQL cloud native High Availability.         
stable/gcloud-sqlproxy                 0.6.1            1.11           DEPRECATED Google Cloud SQL Proxy  

В качестве эксперимента попробуем развернуть postgresql версии 11.4.0

helm install --kube-context demo-team-admin-context --tiller-namespace demo-team --set resources.limits.cpu=500m --set resources.limits.memory=512Mi --set resources.requests.cpu=100m --set resources.requests.memory=100Mi --set persistence.enabled=false stable/postgresql --name mypostgresql --set postgresqlUsername=test --set postgresqlPassword=test --set postgresqlDatabase=ttt

Параметрами resources.limits.cpu=500m –set resources.limits.memory=512Mi выбираются лимиты по CPU и памяти соотвественно, name - название heml-релиза и postgresqlUsername=test –set postgresqlPassword=test –set postgresqlDatabase=ttt задаётся логин, пароль и БД соотвественно.

helm install --kube-context demo-team-admin-context --tiller-namespace demo-team --set resources.limits.cpu=500m --set resources.limits.memory=512Mi --set resources.requests.cpu=100m --set resources.requests.memory=100Mi --set persistence.enabled=false stable/postgresql --name mypostgresql --set postgresqlUsername=test --set postgresqlPassword=test --set postgresqlDatabase=ttt

Смотрим, что у нас получилось

helm list  --kube-context demo-team-admin-context --tiller-namespace demo-team
NAME            REVISION    UPDATED                     STATUS      CHART               APP VERSION    NAMESPACE
mypostgresql    1           Mon Jul 22 21:16:11 2019    DEPLOYED    postgresql-6.0.0    11.4.0         demo-team

У нас есть один Helm-релиз и он успешно DEPLOYED. Узнать более подробную информацию о нём можно через команду status

helm status mypostgresql --kube-context demo-team-admin-context --tiller-namespace demo-team
LAST DEPLOYED: Tue Jul 23 19:04:06 2019
NAMESPACE: demo-team
STATUS: DEPLOYED

RESOURCES:
==> v1/Pod(related)
NAME                       READY  STATUS   RESTARTS  AGE
mypostgresql-postgresql-0  1/1    Running  0         41h

==> v1/Secret
NAME          TYPE    DATA  AGE
mypostgresql  Opaque  1     41h

==> v1/Service
NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)   AGE
mypostgresql           ClusterIP  10.109.89.180  <none>       5432/TCP  41h
mypostgresql-headless  ClusterIP  None           <none>       5432/TCP  41h

==> v1beta2/StatefulSet
NAME                     READY  AGE
mypostgresql-postgresql  1/1    41h


NOTES:
** Please be patient while the chart is being deployed **

PostgreSQL can be accessed via port 5432 on the following DNS name from within your cluster:

    mypostgresql.demo-team.svc.cluster.local - Read/Write connection
To get the password for "test" run:

    export POSTGRES_PASSWORD=$(kubectl get secret --namespace demo-team mypostgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)

To connect to your database run the following command:

    kubectl run mypostgresql-client --rm --tty -i --restart='Never' --namespace demo-team --image docker.io/bitnami/postgresql:11.4.0-debian-9-r12 --env="PGPASSWORD=$POSTGRES_PASSWORD" --command -- psql --host mypostgresql -U test -d ttt -p 5432



To connect to your database from outside the cluster execute the following commands:

    kubectl port-forward --namespace demo-team svc/mypostgresql 5432:5432 &
    PGPASSWORD="$POSTGRES_PASSWORD" psql --host 127.0.0.1 -U test -d ttt -p 5432

Кроме статуса ниже ещё предложены возможности подключения через запуск psql в контейнере или через port-forward. К сожалению, использовать psql в контейнере не удобно, а port-forward не работает в закрытой сети. Однако есть возможность вывести его через NodePort

Делается это вот так:

apiVersion: v1
kind: Service
metadata:
  name: mypostgres
  namespace: demo-team
  labels:
    name: mypostgres-svc
spec:
  type: NodePort
  ports:
    - port: 5432
  selector:
    app: postgresql
kubectl --context=demo-team-admin-context  apply -f /tmp/service-mypostgresql.yml
kubectl --namespace demo-team --context=demo-team-admin-context get service
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
mypostgres              NodePort    10.115.239.175   <none>        5432:30539/TCP   36s
mypostgresql            ClusterIP   10.115.89.165    <none>        5432/TCP         41h
mypostgresql-headless   ClusterIP   None             <none>        5432/TCP         41h
tiller-deploy           ClusterIP   10.102.175.21    <none>        44134/TCP        2d16h

В примере рабочий порт 5432 контейнера замапился на наружний порт 30539. Попробуем подключиться к нему со своей машины

psql -h test-server -p 30539 -U test -d ttt
Password for user test: 
psql (9.6.10, server 11.4)
WARNING: psql major version 9.6, server major version 11.
         Some psql features might not work.
Type "help" for help.
ttt=> 

Отлично! Удаление

Если данный релиз больше не нужен - можете удалить всё следующими командами

kubectl --namespace demo-team  --context=demo-team-admin-context delete service mypostgres
helm delete --purge mypostgresql --kube-context demo-team-admin-context --tiller-namespace demo-team