Рубрики
Uncategorized

Baremetal Kubernetes с Kubeadm за 10 минут? Легкий!

Некоторое время назад, находясь в отпуске по болезни, я бросил вызов на создание кластера Baremetal K8S. Я выбрал Kubeadm потом, и поэтому теперь я делюсь результатами. Теги с Куберовщиками, дежоптом, Kubeadm, Baremetal.

Некоторое время назад, находясь в отпуске по болезни, я бросил вызов на создание кластера Baremetal K8S. Я выбрал Kubeadm Тогда, и поэтому теперь я делюсь результатами.

Да, может быть, у вас уже есть следующий вопрос в уме:

Ну, вы можете рассмотреть голый металлический кластер, так как

👉 Вы настраиваете внутреннюю инфраструктуру для вашей компании, а использование облачных поставщиков не является вариантом, 👉 Вы хотите получить опыт недалеко от продукции с собственным домашним животным K8S, 👉 Вы хорошо знаете, что Minikube, Microk8s и другие , но всегда хотел быть настоящим мульти-узлом кластером, 👉 Вы не хотите платить за предварительно настроенные AKS/GKE/EKS/как только для решения, 👉 Вы хотите настроить все с нуля, хотя бы один раз, из любопытства, 👉 У вас есть свободное время:)

Зачем делать другую статью, пока их уже много? Ну, потому что большая часть материала, очевидно, не для начинающих. Иногда материал чувствует себя фрагментированным, вырванным из контекста чего-то большего или просто не охватывающего весь процесс.

То, что вы должны понимать как раз перед продолжением.

☝️. Это все еще не будет готово к добыче для зрелых проектов! 🚨🚨🚨 ☝️. Тем не менее, с дополнительными часами, посвященными, кластер может стать готовым к производству. ☝️. Но даже так, будет достаточно хорошо для хобби проектов, доказательством концепций, обучения и разведки. ☝️. Вы не получите ни одной панели управления графическим интерфейсом, только RAW kubectl Отказ

Резонирует своими потребностями? Тогда давайте сделаем это!

Узлы

Кубернаны — это кластер , это означает, что обычно участвует более одной машины. Я получил для себя два экземпляра VDS (VPS), с 2 ядрами и 4 ГБ ОЗУ каждый (это минимальные требования), Centos7 на борту. Это был дешевый российский хостинг с центром обработки данных в Москве и неограниченной пропускной способности. Это работает для меня просто хорошо, но вы можете выбрать AWS EC2, Digitalocean или Vult или любой другой поставщик.

Вы также можете получить две виртуальные машины с VirtualBox и Vagrant, но она не даст вам тот же опыт.

  • X.x.x.x — IP-адрес узла A
  • Y.Y.Y.Y — IP-адрес узла B

Так же, как часть препаратов до полета, я запускаю следующие команды, чтобы немного легче сделать весь процесс.

На моей машине:

printf "\nX.X.X.X k8s-master\nY.Y.Y.Y k8s-node01\n" | sudo tee -a /etc/hosts;
scp ~/.ssh/id_rsa.pub root@X.X.X.X:~
scp ~/.ssh/id_rsa.pub root@Y.Y.Y.Y:~

На каждом узле под root :

yum update

# create a non-root user
useradd admin

# enable sudo
usermod -aG wheel admin
passwd admin
passwd -l admin

# enable key-based sign-in
cd /home/admin/
mkdir ./.ssh
chmod 711 ./.ssh
cat ~/id_rsa.pub >> ./.ssh/authorized_keys
chmod 600 ./.ssh/authorized_keys
chown -R admin:admin ./.ssh

Вы также можете отключить аутентификацию на основе паролей SSH, отключить логин root и переключить SSH в другой порт для отключения борсин.

Теперь я могу войти в систему узлов, набрав SSH admin @ k8s-node01 Без пароля и в состоянии запустить Sudo. .

Обычная настройка

Кубернаны логически состоит из двух частей: Управляющий самолет и Вычислить Отказ

  • Управляющий самолет управляет кластером, и он размещен на так называемом Мастер-узел (ы) .
  • Вычислить Запускает контейнерные приложения и размещены на Рабочие узлы .

Поэтому я выбираю Узел A быть главный узел , тогда как Узел BРабочий узел .

Следующий набор команд, которым мне нужно запустить на каждом узле:

➡️. Разрешить узлам обращаться друг с другом по имени:

printf "\nX.X.X.X master\nY.Y.Y.Y node01\n" | sudo tee -a /etc/hosts;

Убедитесь, что узлы на самом деле могут говорить друг с другом:

ping master
ping node01

➡️ K8S не играет красиво с SELinux, отключив его:

sudo setenforce 0
sudo sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

➡️ K8s использует br_netfilter Модуль ядра для его внутренних сетей. Поэтому я проверяю, существует ли модуль, загрузите его и включите нагрузку на загрузку:

sudo modprobe br_netfilter
sudo echo "br_netfilter" | sudo tee -a /etc/modules-load.d/br_netfilter.conf

➡️ Скажите модный модуль использовать iptables :

echo '1' | sudo tee -a /proc/sys/net/bridge/bridge-nf-call-iptables
printf "\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward=1\n" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

➡️ Отключить Firewalld 👻 😱

Некоторые правила брандмауэра в коробке устанавливаются так, как он парализует кластерную сеть. В производстве он полностью имеет смысл найти то, что вызывает это и исправить проблему. Так как я строю неработающую среду, я не беспокою о состоянии инвестирования. Так что я просто отключаю Брандмауэльд И, делая это, я уничтожу все правила брандмауэра.

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl mask --now firewalld

# making sure there is not a single rule left, and the policy is "ACCEPT" on every chain
sudo iptables -L -v -n

➡️ K8s требует своп Раздел для отключения для хорошего:

sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab;

➡️ Установите и настройте Докер

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce

# changing docker cgroupdriver to "systemd" 
sudo mkdir /etc/docker
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

➡️ Установить Кубернеты и kubeadm.

sudo tee /etc/yum.repos.d/kubernetes.repo > /dev/null <<'EOF'
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
        https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

sudo yum install -y kubelet kubeadm kubectl

➡️. Запуск Докер демон

sudo systemctl start docker
sudo systemctl enable docker

➡️. Запуск Кублет демон

Покубренный демон, отвечающий за выполнение всех материалов, связанных с K8S на этом конкретном узле.

sudo systemctl start kubelet
sudo systemctl enable kubelet

AllRight, надеюсь, никаких ошибок там нет, и мы можем перейти к более аккуратному материалу.

Установка для мастера

Приведенные ниже команды должны выполняться только на главном узле.

➡️. Пусть kubeadm. сделать всю тяжелую подъем:

sudo kubeadm init --apiserver-advertise-address=X.X.X.X --pod-network-cidr=10.244.0.0/16 --apiserver-cert-extra-sans=localhost,127.0.0.1

Если все прошло хорошо, мне просто нужно сделать еще несколько дополнительных шагов.

➡️ Создайте файл конфигурации для текущего пользователя (admin)

mkdir -p ${HOME}/.kube
sudo cp -i /etc/kubernetes/admin.conf ${HOME}/.kube/config
sudo chown $(id -u):$(id -g) ${HOME}/.kube/config

➡️. Разверните сеть POD

Таким образом, у нас есть контейнеры. А Контейнер Это контейнерное приложение, написанное на любом языке (узел, Java, Go, …) и работает внутри кластера. А стручок это группа Контейнеры , который разделяет общие ресурсы. Стручки подвергаются воздействию внешнего мира через Услуги Отказ

Да, звучит сложно. Но это то, что делает K8S довольно абстрагированным и, следовательно, беспристрастным и гибким.

Итак, Сетевая сеть Затем представляет собой реализацию модели сети K8S: он позволяет стручками разговаривать друг с другом, к услугам и через сервисы — во внешний мир.

Там есть многочисленные реализации, но я буду придерживаться своего рода по умолчанию, который называется Фланель Отказ Это простое и доказано работать.

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Присоединение к узлам

Ура! Технически ничего не останавливает нас от присоединения к узлам вместе сейчас.

На главном узле я создаю новый токен для присоединения к кластеру:

sudo kubeadm token create

Это принесет мне токен формата xxxxxxxxxxxxxxxxxxxxxxx Отказ

Специальная установка для работников

Приведенные ниже команды должны выполняться только на рабочих узлах (ых).

➡️. Добавить узел рабочего в кластер

Участник, что токен я сделал? Мне нужен этот, чтобы выполнить Присоединяйтесь к Команда на каждом узере работника:

sudo kubeadm join X.X.X.X:6443 --token xxxxxx.xxxxxxxxxxxxxxxx --discovery-token-unsafe-skip-ca-verification

С этого момента на, не будет необходимости делать что-то еще на рабочий Узел, так что я могу закончить эту сессию SSH.

Проверка состояния кластера

Теперь я могу вернуться к Мастер Узел и проверьте, как делает кластер:

kubectl get nodes

Если я вижу что-то вроде этого …

NAME     STATUS   ROLES    AGE    VERSION
node01   Ready       4h7m   v1.19.3
master   Ready    master   45h    v1.19.3

… это означает: «Поздравляем 🎉🎉 🎉 Вы, и я только что получил наши кластеры K8S и бегают! »

Большинство учебных пособий обычно заканчиваются здесь, или они могут показать, как разоблачить контейнер Apache через NodePort Услуги -тип (сделайте контейнер, доступный на рабочем узле непосредственно через случайный порт, превышающий 1023). Это, очевидно, не обычно используется IRL, так как он поражает один из ключевых преимуществ K8S. Поэтому вместо этого давайте пойдем немного дальше и настроить проходность .

➡️ вход

В основном, входчик говорит кластеру «Эй, для этого данного домена, путь и протокол по маршруту все запросы на услугу A. Для другого домена, пути и протокола — на сервис B (и т. Д.)» . Поэтому вход работает как роутер для входящих запросов.

Звучит довольно мощный, не так ли? Я буду использовать Ingress-Nginx , вход по умолчанию Kubernetes, как это довольно просто и легко настраивается:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.40.2/deploy/static/provider/baremetal/deploy.yaml

Давайте проверим, насколько проходит вход:

kubectl get pods -n ingress-nginx

Через несколько минут статус должен выглядеть несколько так:

NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-7dhcj        0/1     Completed   0          22m
ingress-nginx-admission-patch-kcsvt         0/1     Completed   0          22m
ingress-nginx-controller-785557f9c9-7ldcl   1/1     Running     0          22m

➡️. Балансировщик нагрузки

Какой вход не знает, очевидно, как именно кластер связан с внешним миром. Эта задача решается Балансировщик нагрузки что обычно работает вне кластера. Каждый поставщик облака реализует свою собственную, и их балансировщики нагрузки варьируются от одного к другому. Поскольку у меня здесь нет никакого провайдера облака, мне нужна замена.

Так что есть проект под названием Металлб , который я собираюсь использовать на этот вопрос. Пожалуйста, найдите, какую версию — Последние Отказ Кроме того, иногда они делают несовместимые обновления инструкций по установке, поэтому, если что-то не работает, не стесняйтесь Проверьте свои документы Действительно

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.4/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.4/manifests/metallb.yaml
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

Мне также необходимо предоставить файл конфигурации, в противном случае балансировщик остается бездействующим.

tee /tmp/metallb-conf.yml > /dev/null <<'EOF'
apiVersion: v1
kind: ConfigMap
metadata:
    namespace: metallb-system
    name: config
data:
    config: |
        address-pools:
        - name: default
          protocol: layer2
          addresses:
          - Y.Y.Y.Y
EOF
kubectl apply -f /tmp/metallb-conf.yml;
rm /tmp/metallb-conf.yml;

Чтобы увидеть, как делает балансировщик:

kubectl get pods -n metallb-system

Это должно выглядеть так:

NAME                         READY   STATUS    RESTARTS   AGE
controller-8687cdc65-h6d5m   1/1     Running   0          14s
speaker-b4p95                1/1     Running   0          14s
speaker-xhm72                1/1     Running   0          14s

Хорошо, так это красиво это. Я установил кластер вверх, и он работает. В следующей статье (которая скоро придет) Я развернут инфраструктуру с использованием террафора, с фактическими доменами и поддержкой SSL! Быть в курсе.

Исправление проблем

👉🐛 При присоединении к новому узлу процесс зависает на «Preflight], работающих на предварительном полете» навсегда.

Бесконечный процесс или ошибка тайм-аута иногда лежат в плоскости ввода/вывода. Пожалуйста, убедитесь, что узлы могут пинговать друг друга IP и Мастер Узел имеет только правила произведенного кублетом в iptables Отказ

👉🐛 стручки застряли на этапе «контейнерирование»

Эта проблема может иметь много причин. В общем, чтобы увидеть события стручка и где он застрял, а Опишите стручки Команда используется:

kubectl describe pods -n ingress-nginx

Если что-то идет полностью грушевидное, вы можете рассмотреть возможность выполнения следующих командных команд на каждом узле, чтобы вернуть кластер для Pre kubectl init (присоединиться) государство:

sudo kubeadm reset -f
sudo rm -rf /etc/cni/net.d

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X

sudo systemctl restart docker
sudo systemctl restart kubelet

rm -rf ${HOME}/.kube

Полезные ссылки

Изображение покрытия Toni VuoheLainen в Фликр

Оригинал: «https://dev.to/gannochenko/baremetal-kubernetes-with-kubeadm-in-10-minutes-easy-4kc7»