Terraform
Попробую в качестве теста делать посты в таком формате.
А вы знали о такой крутой штуке как terraform? Это такая тулза для создания, изменения и версионирования конфигураций ваших серверов. Умеет работать из коробки со множеством провайдеров - aws, gce. Описываете вашу инсталляцию, если нужно прикручиваете helm или ansible, terraform plan && terraform apply...
#terraform #test
Попробую в качестве теста делать посты в таком формате.
А вы знали о такой крутой штуке как 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)
Содержимое файла basic_auth.txt заполняется так:
#grafana #kubernetes #nginx #ingress #terraform
В ролях:
- grafana stable chart
- nginx ingress controller
- terraform
Задача:
Сделать basic auth для графаны на уровне nginx, передавая username в grafana, так чтобы переданное имя использовалось как пользователь в grafana и запихнуть всё это в терраформ.
Решение: (выписка из values.yaml)
ingress:где переменные в main.tf принимают такие значения:
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
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:
2) если вы делали по статье выше, то нужна будет небольшая доработка, выполните пункт из документации:
https://vmware.github.io/vsphere-storage-for-kubernetes/documentation/existing.html#on-the-kubernetes-workers
Что говоришь мальчик? почему бы сразу по ней не сделать? потому что во-первых она мне не в первую очередь попалась на глаза, во-вторых там идет какой-то ручник на мастере, вместо того чтобы сразу проинициализоровать, во-вторых и сам способ изменения systemd мне нрвится меньше чем правка /etc/default, поэтому в моем случае вместо того чтобы править systemd я добавил строчку
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
выставить при создании виртуальной машины такую директиву:
#terraform #vsphere #kubernetes
Эй, буква! - спросите вы, чем ты там занимаешься последнее время что ничего интересного почитать не даешь?
Ну, в кратце новости, я недавно сменил работу и несколько недель привыкал к новому стеку - применял привычные мне инфраструктурные решения на кластер 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" {или govc:
enable_disk_uuid = "true"
...
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 {это на самом деле полуспасение. Оно решает задачу того что терраформ рвется поотсодениять все наши подключаемые тома (ведь для него это изменение инфраструктуры, которое не описано), с другой стороны игнорируя все изменения в дисках мы лишаемся возможности изменять их через terraform. Пока годного решения как и рыбку съесть и терраформом не подавиться я не нашел (но я мало искал).
ignore_changes = [
disk,]
}
#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
из коробки не работает. Буду краток чтобы не вылить поток говен на вмваре.
Проблема: некорректный парсинг интерфейсов скриптом 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
GitHub
debian 9 (stretch) customizing NIC uses wrong interface name · Issue #130 · vmware/open-vm-tools
Hi, ESXi 6.0 Debian 9 stretch/sid open-vm-tools 10.1.0-4449150-2 guestOS other3xlinux-64 The net-tools package is installed to have the ifconfig binary. When customizing the NIC, the wrong adapter ...
описываем динамически диски vmware в terraform
terraform version: 0.12+
1) на нужном уровне задаем переменную
#terraform #vmware
terraform version: 0.12+
1) на нужном уровне задаем переменную
variable "disk_size" {2) создаем саму виртуальную машину:
type = "list"
default = [
{
size = 20,
number = 0
},
{
size = 300,
number = 1
}]
}
resource "vsphere_virtual_machine" "vm" {Использовать count внутри динамических блоков нельзя. он наследуется с уровня выше, а не свой, внутри for_each. Поэтому тут в массиве не только размер дисков, но и его позиция в контроллере.
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
}
}
#terraform #vmware
terraform create dockreg secret in k8s
resource "kubernetes_secret" "company-dkr-key" {#terraform #docker #kubernetes
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"
}
yaml to terraform tf converter
сегодня открыл для себя прикольный репос, в котором автор написал конвертер для yaml-ресурсов куба в те же самые ресурсы, но для терраформа. Оказалось очень полезной штукой.
З.Ы. с CRD оно работать не умеет к сожалению
https://github.com/sl1pm4t/k2tf
#terraform #kubernetes
сегодня открыл для себя прикольный репос, в котором автор написал конвертер для yaml-ресурсов куба в те же самые ресурсы, но для терраформа. Оказалось очень полезной штукой.
З.Ы. с CRD оно работать не умеет к сожалению
https://github.com/sl1pm4t/k2tf
#terraform #kubernetes
GitHub
GitHub - sl1pm4t/k2tf: Kubernetes YAML to Terraform HCL converter
Kubernetes YAML to Terraform HCL converter. Contribute to sl1pm4t/k2tf development by creating an account on GitHub.
Терраформ прекращает поддержку провайдеров для версии 0.11
https://www.hashicorp.com/blog/deprecating-terraform-0-11-support-in-terraform-providers/
#terraform
https://www.hashicorp.com/blog/deprecating-terraform-0-11-support-in-terraform-providers/
#terraform
занимательное чтиво о том как скрестить terraform и vault
https://www.terraform.io/docs/cloud/guides/recommended-practices/index.html
https://medium.com/@jryancanty/hashicorp-vault-and-terraform-on-google-cloud-security-best-practices-3d94de86a3e9
#terraform #vault
https://www.terraform.io/docs/cloud/guides/recommended-practices/index.html
https://medium.com/@jryancanty/hashicorp-vault-and-terraform-on-google-cloud-security-best-practices-3d94de86a3e9
#terraform #vault
https://github.com/hashicorp/terraform/issues/10462#issuecomment-575738220
Парни из terraform взялись за доработку поддержки count, for_each, and depends_on в модулях. (ишью с 2016 года, ну чтож, настало время)
#terraform
Парни из terraform взялись за доработку поддержки count, for_each, and depends_on в модулях. (ишью с 2016 года, ну чтож, настало время)
#terraform
GitHub
depends_on cannot be used in a module · Issue #10462 · hashicorp/terraform
Hi there, Terraform Version 0.8.0 rc1+ Affected Resource(s) module Terraform Configuration Files module "legacy_site" { source = "../../../../../modules/site" na...
где я задаю глупые вопросы по terraform, а потом пишу ответы в канал, будто бы я умный
@terraform_ru
#terraform
@terraform_ru
#terraform