Админим с Буквой
5.52K subscribers
303 photos
8 videos
59 files
1.16K links
Канал о системном администрировании, DevOps и немного Инфобеза.

По всем вопросам обращаться к @bykva. Рекламу не размещаю.
Download Telegram
Terraform

Попробую в качестве теста делать посты в таком формате.

А вы знали о такой крутой штуке как terraform? Это такая тулза для создания, изменения и версионирования конфигураций ваших серверов. Умеет работать из коробки со множеством провайдеров - aws, gce. Описываете вашу инсталляцию, если нужно прикручиваете helm или ansible, terraform plan && terraform apply...

#terraform #test
Grafana basic auth

В ролях:
- grafana stable chart
- nginx ingress controller
- terraform

Задача:
Сделать basic auth для графаны на уровне nginx, передавая username в grafana, так чтобы переданное имя использовалось как пользователь в grafana и запихнуть всё это в терраформ.

Решение: (выписка из values.yaml)

ingress:
enabled: true
annotations:
'kubernetes.io/ingress.class': ${var.controller_ingress_class}
'nginx.ingress.kubernetes.io/auth-type': ${var.auth-type}
'nginx.ingress.kubernetes.io/auth-secret': ${var.basic_auth_secret_name}
'nginx.ingress.kubernetes.io/auth-realm': ${var.auth-realm}
'nginx.ingress.kubernetes.io/configuration-snippet': |
proxy_set_header X-Remote-User $remote_user;
....
grafana.ini:
users:
allow_sign_up: false
allow_org_create: false
auth:
disable_login_form: true
auth.proxy:
enabled: true
header_name: X-Remote-User
header_property: username
auto_sign_up: true

где переменные в main.tf принимают такие значения:

auth-type         = "basic"
auth-secret = "nginx-ingress-auth"
auth-realm = "Authentication Required - OK"
basic_auth_secret = "${file("basic_auth.txt")}"


Содержимое файла basic_auth.txt заполняется так:

htpasswd -nb username long_long_password > basic_auth.txt


#grafana #kubernetes #nginx #ingress #terraform
Vsphere persistent volume provisioning in k8s

Эй, буква! - спросите вы, чем ты там занимаешься последнее время что ничего интересного почитать не даешь?

Ну, в кратце новости, я недавно сменил работу и несколько недель привыкал к новому стеку - применял привычные мне инфраструктурные решения на кластер vmware. Самое интересное в этой истории - это то как я настраивал pv через нативный cloud provider. Все шаги целиком я не буду описывать, потому как есть несколько полезных статей где это уже сделано:
тыц: https://blog.mimacom.com/ocp-persistent-storage/
и тыц: https://cloud-provider-vsphere.sigs.k8s.io/tutorials/kubernetes-on-vsphere-with-kubeadm.html

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

1) поддержка disk.UUID для виртуальных машин с vmware:

terraform:
resource "vsphere_virtual_machine" "vm" {
enable_disk_uuid = "true"
...

или govc:
govc vm.change -json -vm.ipath="/path/to/VM" -e="disk.enableUUID=1"

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

2) если вы делали по статье выше, то нужна будет небольшая доработка, выполните пункт из документации:
https://vmware.github.io/vsphere-storage-for-kubernetes/documentation/existing.html#on-the-kubernetes-workers

Что говоришь мальчик? почему бы сразу по ней не сделать? потому что во-первых она мне не в первую очередь попалась на глаза, во-вторых там идет какой-то ручник на мастере, вместо того чтобы сразу проинициализоровать, во-вторых и сам способ изменения systemd мне нрвится меньше чем правка /etc/default, поэтому в моем случае вместо того чтобы править systemd я добавил строчку KUBELET_EXTRA_ARGS="--cloud-provider=vsphere" в файл /etc/default/kubelet. Это логичнее и проще в автоматизации

3) выставляем корректные поля provider ID:
https://vmware.github.io/vsphere-storage-for-kubernetes/documentation/existing.html#update-all-node-providerid-fields

и далее по статье можно шикарным способом прибить нужные контейнеры (контроллер, апи, перезапустить кублет). Если кластер не жалко проще всего сделать ребут или systemctl restart docker kubelet

4) Проверяем что все работает: https://vmware.github.io/vsphere-storage-for-kubernetes/documentation/persistent-vols-claims.html
Здесь я привел пример со статикой, ибо с динамикой у меня с наскока сделать не получилось. Да, если у вас в организации права на кластер выдают гранулировано, то нужно попросить создать на некотором datastore папку и выдать на нее права Low level operations. Я видел статью где в миллион и одну картинку описано как настраивать все это дело (абсолютно не читабельно, поэтому пропустил, но сохранил в загашничек потому что очень информативно и вдруг пригодится). Так вот в ней на 100500 скриншотах описаны какие права надо выдать. Может вам в этой ситуации пригодится, мне повезло решить с нашими it-шниками вопрос и так.

5) если вы используете terraform

выставить при создании виртуальной машины такую директиву:
  lifecycle {
ignore_changes = [
disk,]
}

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

#terraform #vsphere #kubernetes
vmware Guest customization on Debian

из коробки не работает. Буду краток чтобы не вылить поток говен на вмваре.

Проблема: некорректный парсинг интерфейсов скриптом customization.pm, расположенном на вцентре.
Обсуждение: https://github.com/vmware/open-vm-tools/issues/130

Адекватное решение: исправление парсящего скрипта на вцентре. Примеры можно увидеть в обсуждении. Но некоторые пункты все равно придется выполнить, иначе скрипт не отработает (см 2.х)

Кривое решение1:
1.1 перевести дебиан на нетплан
1.2 заменить os_release на убунту 18.04+
После чего скрипты парсинга будут думать что ось - убунта и применять на него настройку нетплана. Тут есть еще несколько нюансов, но чтобы не повторяться, я их опишу только один раз чуть ниже.
Версия вцентра: 6.5 u2+

Кривое решение 2:
2.1 Поставить пакет net-tools лохматых годов. Именно из-за того что поменялся вывод ifconfig(sic!) поломался и парсинг.
https://launchpad.net/ubuntu/xenial/amd64/net-tools/1.60-26ubuntu1
2.2 Правим юнит файл open-vm-tools
https://kb.vmware.com/articleview?docid=56409
2.3 Создаем симлинк на dhcp
https://kb.vmware.com/s/article/2051469
2.4 Ставим гостевой ОС - ubuntu64

#vmware #debian #terraform
описываем динамически диски vmware в terraform

terraform version: 0.12+

1) на нужном уровне задаем переменную

variable "disk_size" {
type = "list"
default = [
{
size = 20,
number = 0
},
{
size = 300,
number = 1
}]
}

2) создаем саму виртуальную машину:

resource "vsphere_virtual_machine" "vm" {
name = "${var.prefix}${var.name}-${count.index}"
count = "${var.instance_count}"

....

dynamic "disk" {
for_each = [for d in var.disk_size: {
size = d.size
number = d.number
}]

content {
label = format("disk%s", disk.value.number)
size = disk.value.size
thin_provisioned = "${data.vsphere_virtual_machine.template.disks.0.thin_provisioned}"
eagerly_scrub = "${data.vsphere_virtual_machine.template.disks.0.eagerly_scrub}"
unit_number = disk.value.number
}
}

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

#terraform #vmware
terraform create dockreg secret in k8s

resource "kubernetes_secret" "company-dkr-key" {
metadata {
name = "company-dkr-key"
namespace = "${kubernetes_namespace.company.metadata.0.name}"
}

data = {
".dockerconfigjson" = "{\"auths\":{\"${var.company-dkr-url}\":{\"username\":\"${var.company-dkr-user}\",\"password\":\"${var.company-dkr-password}\",\"email\":\"email\",\"auth\":\"${base64encode(format("%s:%s", var.company-dkr-user, var.company-dkr-password))}\"}}}"

## OR u can also do this from file
# ".dockercfg" = "${file("${path.module}/docker.cfg")}"

}

type = "kubernetes.io/dockercfg"
}

#terraform #docker #kubernetes
yaml to terraform tf converter

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

З.Ы. с CRD оно работать не умеет к сожалению

https://github.com/sl1pm4t/k2tf

#terraform #kubernetes
Терраформ прекращает поддержку провайдеров для версии 0.11

https://www.hashicorp.com/blog/deprecating-terraform-0-11-support-in-terraform-providers/

#terraform
где я задаю глупые вопросы по terraform, а потом пишу ответы в канал, будто бы я умный

@terraform_ru

#terraform