# Kubernetes

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

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

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

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

# 2. Подготовка namespace'а в k8s для проекта

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

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

# Настройка 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/helm.production.yaml --name RELEASE_NAME

  4. Рекомендации по меткам

    1. https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/#labels
    2. https://www.replex.io/blog/9-best-practices-and-examples-for-working-with-kubernetes-labels

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

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

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

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

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

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

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

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

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

# Aliases

alias k=kubectl 

# Switch context
alias kx="kubectl config set-context"

# Switch namespace
alias kn="kubectl config set-context --current --namespace="

# Показ всех запушенных подов и на каких нодах

kubectl get nodes -o=custom-columns="NAME:.metadata.name,STATUS:.status.conditions[].message,TAINTS:spec.taints[].key"

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

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

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

 kubectl get nodes --show-labels