Pull to refresh
6
0
Andrey @OxCom

Technical Lead – Web Platforms

Send message
Vagrant, как хорошее средство выделить время на кофе, пока все собирается :)

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

Vagrantfile
# encoding: utf-8
# -*- mode: ruby -*-
# vi: set ft=ruby :

### configuration parameters
# K8S requires minimum 2 CPU cores
VM_GROUP = "Kubernetes Deployment"
VM_BOX_IMAGE = "ubuntu/bionic64"
VM_BOX_VERSION = "20200908.0.0"
VM_PREFIX = "k8s"
VM_CPU = "4"
VM_MEM = "2048"
VM_CPU_MASTER = "2"
VM_MEM_MASTER = "2048"

# Number of nodes in cluster
K8S_NODES = 4
# Master IP address (x.y.z.K8S_MASTER)
K8S_MASTER_IP = 10
K8S_NETWORK = "100.77.42"
K8S_HEAD_IP = "#{K8S_NETWORK}.#{K8S_MASTER_IP}"

Vagrant.configure("2") do |config|
    config.disksize.size = '50GB'

    config.vm.define "#{VM_PREFIX}-head" do |node|
        node.vm.provision "shell", inline: "echo Configuring node: #{VM_PREFIX}-head"

        node.vm.box = VM_BOX_IMAGE
        node.vm.box_version = VM_BOX_VERSION
        node.vm.hostname = "#{VM_PREFIX}-head"
        node.vm.network :private_network, ip: "#{K8S_HEAD_IP}"

        node.vm.provider "virtualbox" do |v|
            v.name = "#{VM_PREFIX}-head"
            v.customize ["modifyvm", :id, "--groups", "/#{VM_GROUP}"]
            v.customize ["modifyvm", :id, "--memory", VM_MEM_MASTER]
            v.customize ["modifyvm", :id, "--cpus", VM_CPU_MASTER]
            # Prevent VirtualBox from interfering with host audio stack
            v.customize ["modifyvm", :id, "--audio", "none"]
        end

        # Install/setup base services on VM
        node.vm.provision :shell, path: "./k8s-base.sh"

        # Install/setup related services on VM
        node.vm.provision :shell, path: "./k8s-head.sh"
    end

    (1..K8S_NODES).each do |i|
        vm_name = "#{VM_PREFIX}-node-#{i}"
        vm_ip = K8S_MASTER_IP + i

        config.vm.define "#{vm_name}" do |node|
            node.vm.provision "shell", inline: "echo Configuring node: #{vm_name}"

            node.vm.box = VM_BOX_IMAGE
            node.vm.box_version = VM_BOX_VERSION
            node.vm.hostname = vm_name
            node.vm.network :private_network, ip: "#{K8S_NETWORK}.#{vm_ip}"

            node.vm.provider "virtualbox" do |v|
                v.name = vm_name
                v.customize ["modifyvm", :id, "--groups", "/#{VM_GROUP}"]
                v.customize ["modifyvm", :id, "--memory", VM_MEM]
                v.customize ["modifyvm", :id, "--cpus", VM_CPU]
                # Prevent VirtualBox from interfering with host audio stack
                v.customize ["modifyvm", :id, "--audio", "none"]

                # see https://www.virtualbox.org/manual/ch08.html#vboxmanage-storageattach
                # Disk 100GB
                disk_name = "data/disk-#{vm_name}.vdb"
                unless File.exist?(disk_name)
                    v.customize ["createhd", "--filename", disk_name, "--size", 102400 ]
                end

                v.customize [ "storageattach", :id, "--storagectl", "SCSI", "--port", 3, "--device", 0, "--type", "hdd", "--medium", disk_name ]
            end

            # Install/setup base services on VM
            node.vm.provision :shell, path: "./k8s-base.sh"

            # Install/setup related services on VM
            node.vm.provision :shell, path: "./k8s-node.sh", env: {"K8S_HEAD_IP" => K8S_HEAD_IP}
        end
    end
end



k8s-base.sh
#!/usr/bin/env bash

apt-get update
apt-get upgrade -y -f
apt-get install -y apt-transport-https ca-certificates curl software-properties-common

# Install docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"
apt-get update
apt-cache policy docker-ce
apt-get install -y docker-ce
systemctl enable docker
systemctl status docker

# run docker commands as vagrant user (sudo not required)
usermod -aG docker vagrant

# kubelet requires swap off
swapoff -a

# keep swap off after reboot
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# Install kubeadm
# https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubeadm kubelet kubectl
apt-mark hold kubelet kubeadm kubectl

# set node-ip
IP_ADDR=`hostname -I | cut -d' ' -f2`
echo "Environment=\"KUBELET_EXTRA_ARGS=--node-ip=$IP_ADDR\"" | sudo tee -a /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

systemctl daemon-reload
systemctl restart kubelet
systemctl restart docker



k8s-head.sh
#!/usr/bin/env bash

echo "> Init k8s admin (kubeadm)"
IP_ADDR=`hostname -I | cut -d' ' -f2`
HOST_NAME=$(hostname -s)
echo "> Init k8s admin (kubeadm): ${HOST_NAME} => ${IP_ADDR}"
kubeadm init --apiserver-advertise-address=$IP_ADDR --apiserver-cert-extra-sans=$IP_ADDR  --node-name $HOST_NAME --pod-network-cidr=172.16.0.0/16

echo "> Set credentials to regular user (vagrant)"
sudo --user=vagrant mkdir -p /home/vagrant/.kube
cp -i /etc/kubernetes/admin.conf /home/vagrant/.kube/config
chown $(id -u vagrant):$(id -g vagrant) /home/vagrant/.kube/config

echo "> Switch 'cgroup-driver' to 'systemd' (cover case when init command resets env flags)"
export KUBECONFIG=/etc/kubernetes/admin.conf
sed -i "s/cgroup-driver=cgroupfs/cgroup-driver=systemd/g" /var/lib/kubelet/kubeadm-flags.env

# echo "> Use Calico pod network add-on". Use your own network provider
# kubectl apply -f ./network-calico.yaml

echo "> Create k8s join token"
kubeadm token create --print-join-command >> /etc/kubeadm_join_cmd.sh
chmod +x /etc/kubeadm_join_cmd.sh

echo "> Remove password for ssh between guest VMs"
sed -i "/^[^#]*PasswordAuthentication[[:space:]]no/c\PasswordAuthentication yes" /etc/ssh/sshd_config
service sshd restart

echo "> Install Helm"
curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

echo "> Restarting services"
systemctl daemon-reload
systemctl restart kubelet
systemctl restart docker

echo "> kubectrl autocompetition"
kubectl completion bash > /etc/bash_completion.d/kubectl



k8s-node.sh
#!/usr/bin/env bash

echo "> Install sshpass"
add-apt-repository universe
apt-get update
apt-get install -y sshpass

echo "> Join to cluster"
sshpass -p "vagrant" scp -o StrictHostKeyChecking=no vagrant@${K8S_HEAD_IP}:/etc/kubeadm_join_cmd.sh .
sh ./kubeadm_join_cmd.sh

echo "> Restarting services"
systemctl daemon-reload
systemctl restart kubelet
systemctl restart docker



Доступ к CLI каждой машны:

vagrant ssh <name>


Ordos Посмотрите в сторону Vagrant: удобно и меньше ручной работы.
Не сильный аргумент, но не приятный: vagrant + hyper-v.
Частично согласен с автором. Fullstack — выглядит как затычка в любой бочке. Эдакий и швец, и жнец, и на дуде игрец. Это смесь front-, back- и devops. Да, сложно изучать все. Да нельзя знать все, но ничего не мешает быть в каком-то сегменте технологий на самом «гребне волны».
Для меня есть несколько проблем:
1) Постоянно нужно учиться, что очень сильно влияет на личную/общественную жизнь.
2) Из-за №1 нужно постоянно распределять время на задачи: работа / учеба / семья /…
3) Постоянно находишься на краю выгорания
4) Постоянная борьба сделать все «правильно» и «доставить продукт / фичу вовремя»

Плюсы:
1) Можно найти решение задачи, которое будет проще / легче / быстрее / правильнее на стыке технологий, чем решение той же задачи в одной технологии. Например, отдавать файлы очень большие файлы с проверкой доступа по большому количеству правил.
2) Возможность разобраться в коде другого приложения, которые используется проектом и, возможно, исправить баг
3) Понимание того, как протекают процессы в более широком смысле. Не в рамках PHP или Java, а начиная с момента его формирования и заканчивая рендером.
4) Можно в любой момент заменить любого члена команды, пока тот болеет.

Совет: закладывайте правильную архитектуру с начала, но не пишите все сразу. Расставляйте приоритеты и планируйте.
Не во всех метро работает: в более старых моделях оно или отсутствует или не работает. В трамваях тоже часто встречается. А вот в автобусах не скажу, так как редко катался.

В больших офисах кондиционер — это норма, но это громадная система на все здание. Для маленьких офисов чаще встречал вентиляторы, которые не хуже кондиционеров охлаждают (цена около 300 евро).

Вообще я местных спрашивал, почему нет в домах кондиционеров. Говорят, что не прижилось это чудо техники, так как жара стоит всего 2-3 недели в году. Да и дома хорошо изолируют. Мы закрываем все окна и опускаем ролеты: на улице +35, а в квартире +27.
Ох, повезло со стажем. Мне 10 лет — просто выкинули на ветер. Пытался, но никак. Нет и все. Может страховая такая (HUK).

Про Euro4, да дизельные, толь по моим наблюдениям их тут большинство. Теперь мне надо продавать свою ракету и как это делать, я не знаю.
В 21 веке юзают кредитные карты, а не монеты и купюры

Проезд на метро можно оплатить кредиткой / карточной, но некоторые банки снимают 20 центов за транзакцию. Мелочь, но очень не приятно. В автобусах — карточки не принимают. Так же приемник карточки может быть сломан.

На ярмарках тоже редко принимают карты. И паковочные автоматы вдоль дорого (не большие парковки) тоже работают только с мелочью.

Машина в Германии нужна.

Это моле личное мнение, но:
1) С ребенком/семьей поехать в бассейн в любой день или момент: 1 час и 30 минут на общественном транспорте. Да можно выбрать другой, но есть же любимые места.
2) Находясь в Германии покататься по окрестностям. Поехать в соседний город не всегда тривиальная задача. Да, туда можно доехать на транспорте, но опять же: время и комфорт
3) Ездить на работу. Мне до работы ехать сейчас 1 час и 20 минут. На машине 20 минут.
4) В больницу ехать лучше на своей машине, чем на такси. Да и опять же дети. Маленьких детей нужно заказывать большое кресло, что очень редко. Чаще всего подкладка под мягкое место.
5) Магазин. Ненавижу ходить в магазин ножками и потом все это тянуть на себе. Проще закупаться на неделю.
6) Учитывая, что много людей, с кем мы общаемся разбросаны по городу, а некоторые даже за городом, то это превращается в квест по добиранию «в гости» :)

Да, можно купить / снять жилье где-то возле, но всегда нужно учитывать, что автобусы ездят медленно (они совершают очень много передвижений по узким улочками, чтобы покрыть районы). Иногда быстрее пройтись пешком, чем проехать на автобусе.
Живу во Франкфурте около 3 лет.

> Сестре, опять-таки из-за «неправильной» визы, счета в банке пока не полагалось.
Можно попробовать оформить еще одну карту на текущий счет, но на ее имя. Можно будет и лимит установить. При таком оформлении про визу не спрашивали (Commerzbank).
Совет: имейте на руках мелкие деньги, так как часто при покупке проездных билетов автомат может не принимать купюры больше 10 евро (место заканчивается).

> открыл счет в пригородном отделении банка, не убедившись, что смогу его обслуживать там, где собираюсь жить. Sparkasse
Как вариант: идете в свое отделение и просите сменить отделение банка на другое, куда переедете, но учтите, что некоторые отделения банка той же Sparkasse могут брать комиссию за перевод между филиалами

> Мобильная связь
Теперь в Германии требуется активировать сим-карту путем прохождения идентификации (online или отделение почты). После прохождения сим-карта начнет работать, а номер будет привязан к вам лично.
Если карта оформлена не на вас (рекомендую проверить всех, кто покупал карту больше 2 лет назад), то с ней ничего нельзя сделать через оператора, кроме пополнения счета. Проще выкинуть и купить новую.

> Интернет
Смотрите внимательно насколько старые провода в доме. Может случиться так, что провайдер не сможет обеспечить заявленную скорость из-за этого. Вариантов решения не так много: писать владельцу съемного жилья, чтобы сменить проводку, попробовать другого провайдера, переехать и смириться.

> Медицинская страховка
Цена страховки не самое главное. Обращайте внимание на то, какие лекарства и процедуры страховка покрывает. Может быть так, что лекарство одной страховкой покрывается, а другой страховой кампанией нет.
Приватная страховка имеет свои плюсы и минусу. Например, вам будут доступны термины прям сейчас или на следующий день, когда по обычной ближайший термин будет через месяц. Приватная страховка стоит дороже и потом очень сложно перейти с нее на обычную.
Когда пользуетесь приватной страховкой, то вы будете оплачивать все, а потом возвращать все отправляя чеки в страховую.
В Германии на лекарства дают сколько видов рецептов: зеленый, синий и красный. Отличаются тем, как много нужно платить самому. Зеленый – платишь все сам, синий – только часть, красный – платит страховая. Бывают случаи, когда страховая даже красные рецепты не оплачивает и нужно заплатить около 5 евро, но, опять же, все зависит от страховой.

> Поиск постоянного жилья
По приезду у нас был срок 3 месяца. Работодатель оплатил жилье с полной комплектацией: стиральная машина, кухня, телевизор и т.п., но после этого нам нужно было съехать или продолжать платить (1750 в месяц).
Найти квартиру во Франкфурте сложно, но можно. По всей Германии работает такая схема:
— нашел объявление
— звонишь маклеру или хозяину и берешь термин
— смотришь квартиру, а в это время маклер смотрит на тебя
— заполняешь анкету, что согласен снимать
— ждешь, пока хозяин делает выбор из всех анкет, которые ему оставили
Решающие факторы:
— Доход на семью. Чем больше, тем лучше.
— Наличие детей. Можно встретить очень крутые квартиры/дома, но там будет ограничение: только для пары без детей.
— Наличие животных. Без животных вероятность снять будет выше.
— Количество членов семьи. Многие считают, что ребенку нужна своя комната, родителям своя, а также зал, в котором никто не спит и вы принимаете гостей :)
Так же постарайтесь ходить на осмотр квартиры семьей, чтобы хозяин видел всех, кто потенциально будет там жить.
Мы нашли подходящую квартиру на окраине города за 3 месяца. Отправили больше 100 заявок. Из них: 20-30 посмотрели, 10-15 понравились, согласились сдать 2.

> Вид на жительство
Ausländerbehörde и термины – это две очень долгие вещи. Следите за актуальностью документов, чтобы взять термин заранее. Был там с семьей пол года назад: утром очередей не было, но, возможно, это мне так повезло.
> нужно всегда выяснять заранее и в деталях
Получая любую бумажку с термином или электронное письмо (да, они отвечают), там всегда можно найти список того, что нужно принести.

> Машина в Германии
Машина в Германии нужна. Какая? Зависит от вашего образа жизни. Стоит дорого, сейчас даже не скажу сколько стоит, так во Франкфурте с февраля 2019 запрещают въезд автомобилям Euro4 и с сентября 2019 – запрет на Euro5.
У всех приезжих, водительские права считаются действительными первые полгода, потом надо подтверждать или сдавать на новые. Сдача на права – отдельная история на несколько страниц. Мне обошлось подтверждение в (700 евро).
Не забывайте про страховку на авто. Ваш страж безаварийного вождения не считается. Будет считаться только с момента получения немецких прав. Мне страховка выходить в 800 евро в год.

Еще один полезный сайт: http://surfin-birds.ru/

Пробуйте. Использую в работе, но с расширенным функционалом (изменение размера и т.п.).
Получите задание на технологию, которую вы знаете и открытый вопрос (не требующий рабочей реализации) о том как бы вы реализовали задание с использованием того, что используем мы.

До текущей схемы можно было подобрать более подходящие задания для тестирования после живого общения. Пока что мы в поиске более оптимального способа.
«Пока ты собеседуешь кандидата, он — собеседует тебя»
При прохождении собеседования пытаюсь выяснить как в компании принимаются решения, как решены те или иные задачи. Если не узнать этого, то можно потом пожалеть. С другой стороны, когда кандидат проходит собеседование, можно увидеть насколько свободно он себя чувствует.
«Есть ложь, наглая ложь, а есть — резюме»
Чаще всего в список попадают технологии, которые человек знает на уровне «читал где-то», «один знакомый показал». Мне очень не приятно такое говорить, но такие вещи встречаются у определенных национальностей.
«Никогда не перезванивайте кандидату»
Считаю, что нельзя давать кандидату обратную связь сразу после прохождения этапа. Даже если ты лично принимаешь решение. Люди бывает разные и все понимают приходящую информацию по-разному: одному показалось, что все супер, а у тебя закралось сомнение. Стоит обсудить, так как результат может измениться. Но отзыв о кандидате должен быть сформирован до конца дня (чем быстрее, тем лучше), иначе все забудете.

Из моего опыта проведения и прохождения собеседований могу выделить следующие моменты.
При поиске работы очень много агентов и HR в компаниях даже не читают, что написано в резюме и в сопроводительном письме. Например, мне предлагали работу C#, .NET разработчиком, хотя я никакого прямого отношения к этой отрасли не имею.
Бывает, что звонят из одной и той же фирмы разные агенты и задают один и тот же круг вопросов (промежуток между звонками может быть в неделю и более). Последний раз спросил прямо, почему они тратят мое время, но ответа так и не получил. Очень сильно раздражает, так как один такой разговор затягивается на 30-40 минут.
Из 100 пройденных собеседований я получил только 2 письма, где мне дали информацию почему они не хотят мне делать предложение.

Сейчас в компании провожу собеседования по следующей схеме:
  1. Получили резюме. По которому смотрим насколько подходит набор навыков, где и когда он их применял по проектам. Допускаем, что некоторые могут быть не указаны.
  2. Тестовое задание с использованием тех технологий, которые чаще всего применяются в проекте. Если у нас нет Kubernetes, то и задачи такой стоять не будет.
  3. Техническое собеседование (skype, телефон и т.п.) с обсуждением тестового задания. Вопросы на собеседовании покрывают текущие технологии, а так же те, которые сейчас внедряются. Так же задаем вопрос о персональных качествах.
  4. Приглашаем в офис, где кандидат проходит еще одного собеседование с командой (задаются как личные так и технические вопрос), в которой он будет работать, а так же посмотрит офис.
  5. Кандидат едет домой. Через неделю получает отказ или приглашение на работу.

До этого пробовали проводить техническое собеседование, а потом тестовое задание, но получалось много потраченного времени на людей, у которых навыки не соответствуют
Vagrant:
В репозитории есть пример, как запустить это дело с vagrant. Vagrant сейчас использую только для поднятия стабильных версий проектов, когда ожидается поведение: поднял и забыл или тестирование.

Docker:
Засунуть NGINX, PHP-FPM разных версий, Bind9, DB и все остально – это здорово, но когда приходится ковырятся в исходниках того же NGINX или PHP, изучая почему что-то упало причины странного поведения, то лучше иметь все локально.
Так же есть очень неприятный факт, что не все разработчики идут в ногу с текущими реалиями разработки: некоторые все еще игнорируют CI/DC, Composer, NodeJS, виртуальные машины, а docker для них как телевизор, который излучает радиацию. И с ними нужно считаться, но это другая история о том, как устраиваются родсвенники начальников и т.п.

У меня есть в планах написать статью, как это сделать с помощью docker, но прежде всего мне нужно донести и обкатать это на коллегах.
Решение проблемы нашел сегодня:
неправильный права доступа
$ find <somerepo>/.git -ls | grep 'r--r--r--'
$ chmod 0644 {file-path}
Интересный подход. Несколько раз смотрел в эту сторону, но нет. Мне действительно нужна двусторонняя синхронизация. Одна из причин — как ни крути, но в unix консоль более удобна и приятная в использовании чем cmd и windows решение для GIT.

Еще я рассматривал монтирование с использованием SSHFS for Win, но PHPStorm постоянно засыпал меня уведомления, что GIT «упал» и все. Попытки решить проблему не увенчались успехом. Возможно нужно ждать обновлений.
Мне будет очень интересно посмотреть, как это реализовали другие люди, так как от DevOps я относительно далеко, но уж очень интересно посмотреть.
smple
Спасибо за совет! Планирую все это завернуть в Vagrant + Chef, и возможно что-то завернуть Docker.
Так уж случилось, что у меня еще есть Win7, в которой этого нет, но я работаю в ней с тем же подходом.
Я сомневаюсь, что до текущего момента все компании поголовно перешли на Win10.
Разработчику ничего не мешает применить такой подход к «правильным» HTML тегам.

Как я указал в статье и как подметил Veikedo есть минусы с поддержкой в IE для версии младше 11.

Пример проблемы для IE10
при большой вложенности блоков с display: flex; и различных свойствах таких как: flex-direction, flex, align-items и justify-content; периодически возникает ситуация, когда IE неправильно рассчитывает размеры и позиции блоков, что приводит к крайне неприятному отображению: элементы не на своих местах, большие расстояния между блоками, неправильное выравнивание, один блок занимает все пространство контейнера и вытесняет все остальные.


Так же замечательный ресурс caniuse ( Veikedo, спасибо за напоминание ) должен вселить в Вас больше уверенности в использовании flexbox.

Почему я решил использовать flexbox и прекратить поддержку IE < 11 версии? Так случилось, что на текущем проекте мы поддерживаем только те браузеры, процент использования которых на нашем портале больше 2%. Опираясь на данные Google Analytics мы имеем:
  • 88% — Chrome
  • 4% — Firefox
  • 2% — Edge
  • 1% — YaBrowser

Information

Rating
Does not participate
Location
Frankfurt am Main, Hessen, Германия
Date of birth
Registered
Activity

Specialization

Fullstack Developer, Software Architect
From 90,000 €
PHP
Symfony
Kubernetes
High-loaded systems
Elasticsearch
JavaScript
Node.js
SCSS