# Kubernetes

# Создание нового проекта для деплоя в кластер

  1. Авторизация в кластере
  2. Заведение подгруппы.

# 1. Создание подгруппы и репозиториев

Читайте рекомендации на странице /gitlab.

# 2. Shared Tools (рекомендуется)

Смотрите инструкцию по подключению в apliteni/k8s/shared-tools/blob/master/README.md.

# Подготовка рабочего окружения администратора кластера

При обычной разработке этого не требуется. Достаточно настроить деплой в Gitlab CI/CD.

# Настройка kubectl

Установите kubectrl.

Для Mac OS: brew install kubernetes-cli.

Создание нового конфига с кластером:

kubectl config set-cluster hz-dev-1 --server=https://K8S_API_URL --insecure-skip-tls-verify=true

Адрес K8s API найдете в репозитории our-clusters

Создание контекста (это связка user + cluster + namespace):

kubectl config set-context hz-dev-1-gdbc --cluster=hz-dev-1 --user=user-ivan-ivanov --namespace=gdbc

Установка пользователя с токеном (токен предварительно создается администратором кластера):

kubectl config set-credentials user-ivan-ivanov --token=...

Переключение на созданный контекст

kubectl config use-context hz-dev-1-gdbc

# Отладка внутри кластера

Для отладки внутри кластера можно запустить терминал через pod:

dnsutils, netcat, net-tools, nmap, jq, curl traceroute

kubectl run --namespace=NAMESPACE -it --rm --image=apliteni/network-utils debug-pod -- bash

psql

kubectl run --namespace=NAMESPACE -it --rm --image=postgres debug-pod -- bash

# Примеры проектов

Смотрите apliteni/k8s/shared-tools/blob/master/README.md

# Список наших кластеров

Смотрите DevOps.

# Рекомендации

  1. Старайтесь использовать инструментарий shared-tools.

  2. Для dev-окружения предпочитайте описывать контейнеры в Docker Compose пример.

  3. Проверить корректность helm chart можно через --dry-run --debug:

    helm install --dry-run --debug ci/chart --values ci/chart/values.production.yaml --name RELEASE_NAME

# Соглашение по taints и labels для нод:

  • Роль ноды: node-role.kubernetes.io/maintenance=true (maintenance - это роль)
  • Taint ноды: node-role.kubernetes.io/maintenance=true:NoSchedule (maintenance - имя taint'а)

# Решение проблем с кластером

# Одна из нод в состоянии NotReady

  1. В первую очередь нужно убрать с нее все деплои и поды (подробнее):

    kubectl drain [имя_ноды] --ignore-daemonsets

  2. Проверьте досутпность ноды по ssh

  3. Проверьте состояние и журнул kubelet service status kubelet.

  4. Проверьте события OOMKiller grep Killed /var/log/messages.

После восстановления верните доступность ноды для запусска подов kubectl unccordon [имя_ноды]

# Helm

  • Используем helm v3.
  • Чарты общего назначения публикуем в нашем Chart Registry.
  • Для работы из Docker, используйте наш image apliteni/kubernetes-helm:3.

# Chart Registry

  • Публикуйте только чарты общего назначения, чарты специфические только для определенного проекта держите в самом проекте.
  • Чарты храним в неймспейсе apliteni/charts, каждый в своем репозитории.
  • Настройте .gitlab-ci.yml на автоматический линтинг и публикацю.
  • Не держите в чартах пароли и ключи.
  • Покрывайте чарты тестами.

# Полезные инструменты

# Aliases

alias k=kubectl 
alias h=helm

# Показ всех taints по нодам

kubectl get nodes -o json | jq ".items[]|{NAME:.metadata.name, TAINTS:.spec.taints}"

# Показ меток по всем нодам

 kubectl get nodes --show-labels