Установка и базовая настройка k3s на Ubuntu
Обновлено:
Опубликовано:
Используемые термины: Kubernetes, Ubuntu.
k3s представляет из себя легковесный одноузловой кластер Kubernetes. Сценарии его использования:
- Познакомиться и набить руку для работы с Kubernetes без развертывания дорогого кластера.
- Настроить инфраструктуру заранее, чтобы проще было сделать перенос в продуктивную среду.
- Развертывание тестовой среды для разработки приложения.
- Замена более простой оркестрации на базе docker-compose.
Мы рассмотрим команды на примере Linux Ubuntu. В инструкции не будут рассмотрены примеры по написанию манифестов и запуску проектов — только установка платформы оркестрации.
Подготовка системы
Установка и проверка запуска ноды
Настройка k3s для получения сертификатов от Let's Encrypt
Установка и настройка менеджера Helm
Настройка кэширующего DNS
Дополнительные материалы
Предварительная настройка системы
Выполним минимальный набор действия для более оптимальной работы k3s.
Создаем файл:
vi /etc/sysctl.d/99-k3s-performance.conf
# Увеличение лимита открытых файлов
fs.file-max = 1200000
# Оптимизация работы с виртуальной памятью
vm.overcommit_memory = 1
vm.panic_on_oom = 0
# Увеличение лимитов на отслеживание сетевых соединений
net.core.somaxconn = 32768
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_syn_backlog = 16384
Применяем настройки:
sysctl --system
Можно переходить к установке облегченного кубернетеса.
Установка и запуск
Развертывание k3s, без преувеличения, выполняется одной командой:
curl -sfL https://get.k3s.io | sh -
Как правило, установка и конфигурирование завершается в течение одной минуты.
Посмотреть список нод можно командой:
kubectl get node
Чаще всего, для своего удобства, администраторы kubernetes делают алиасы:
cat << 'EOF' >> ~/.bashrc
# Kubernetes Aliases
alias k='kubectl'
alias kg='kubectl get'
alias ka='kubectl apply'
alias kd='kubectl describe'
EOF
Применим их для текущей сессии:
source ~/.bashrc
С их помощью вместо команды kubectl можно будет вводить просто k / kg / ka / kd.
Кластер готов к работе.
Let's Encrypt
По умолчанию, в качестве ingress контроллера в k3s используется traefik. Для того, чтобы он мог получать бесплатные сертификаты от Let's Encrypt нужна его донастройка.
Создаем файл:
vi /var/lib/rancher/k3s/server/manifests/traefik-config.yaml
Между директивами valuesContent и deployment вставляем:
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
additionalArguments:
- "--certificatesresolvers.default.acme.email=postmaster@dmosk.local"
- "--certificatesresolvers.default.acme.storage=/data/acme.json"
- "--certificatesresolvers.default.acme.tlschallenge=true"
ports:
web:
exposedPort: 80
websecure:
exposedPort: 443
* обратите внимание, что в параметре email необходимо заменить postmaster@dmosk.local на свое значение.
После сохранения файла настройки должны примениться в течение 10 секунд. Проверить можно командой:
kubectl get deployment traefik -n kube-system -o yaml | grep -A 20 -B 2 "args:"
Теперь traefik сможет получать сертификат.
Установка и настройка Helm
Для работы с менеджером пакетов helm необходимо его установить и настроить для подключения к нашему k3s.
Установка
По сути, для этого нужно просто скачать бинарный файл.
Для начала узнаем последнюю версию приложения и сохраним ее в переменную HELM_VER:
HELM_VER=$(curl -s https://api.github.com/repos/helm/helm/releases/latest | grep 'tag_name' | cut -d\" -f4)
Скачаем архив с бинарным файлом:
wget https://get.helm.sh/helm-${HELM_VER}-linux-amd64.tar.gz
Распакуем его:
tar -zxf helm-${HELM_VER}-linux-amd64.tar.gz
И переместим в каталог usr/local/bin:
mv linux-amd64/helm /usr/local/bin/
Скачанный архив и распакованную папку можно удалить:
rm -rf helm-${HELM_VER}-linux-amd64.tar.gz linux-amd64
Проверить, что shell оболочка видит helm можно командой:
helm version
Настройка подключения
Утилите helm нужно правильное значение переменной KUBECONFIG. По умолчанию, helm ищет конфигурацию для подключения в домашней директории пользователя, каталоге .kube. Однако, k3s хранит конфигурацию в другом месте.
В bashrc добавим строку и сразу примени настройку для текущей сессиии:
echo 'export KUBECONFIG=/etc/rancher/k3s/k3s.yaml' >> ~/.bashrc
source ~/.bashrc
* мы указали в качестве значения для переменной KUBECONFIG путь до файла /etc/rancher/k3s/k3s.yaml.
Попробуйте ввести команду:
helm list
Система должна вернуть либо список установленных пакетов, либо пустой вывод. Ошибок быть не должно.
Наш helm готов для работы с k3s.
Установка локального кэширующего DNS
NodeLocal DNSCache в кластере Kubernetes снижает нагрузку на kube-dns и ускоряет резолвинг внутри кластера.
Скачаем шаблон манифеста node-local-dns:
wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml
Посмотрим текущий сервис kube-dns, чтобы узнать его ClusterIP и значение занесем в переменную:
KUBE_DNS=$(kubectl get svc kube-dns -n kube-system -o jsonpath='{.spec.clusterIP}')
Отредактируем скачанный файл:
sed -i "s/__PILLAR__LOCAL__DNS__/169.254.20.10/g" nodelocaldns.yaml
sed -i "s/__PILLAR__DNS__SERVER__/${KUBE_DNS}/g" nodelocaldns.yaml
sed -i "s/__PILLAR__DNS__DOMAIN__/cluster.local/g" nodelocaldns.yaml
Применим готовый манифест:
kubectl apply -f nodelocaldns.yaml
Проверим, что DaemonSet поднялся и все поды готовы:
kubectl get ds -n kube-system node-local-dns
Мы должны увидеть, что READY и AVAILABLE совпадают с DESIRED:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR
node-local-dns 1 1 1 1 1 <none>
Локальный кэширующий DNS настроен и готов к работе.
Читайте также
Другие материалы, которые могут быть полезны:
1. Установка и настройка ArgoCD для хранения манифестов Kubernetes.