Шпаргалка: Linux / Сети

Эти утилиты не специфичны для Kubernetes/Deckhouse, но постоянно используются в связке с kubectl/d8 k/werf для установки инструментов, отладки сети внутри кластера и подготовки CI. Разворачивается по мере необходимости в M0M1 и используется во всех последующих модулях.

Самые используемые команды

1
2
3
4
5
6
7
8
9
export KUBECONFIG=~/.kube/config
export VAR="value"                       # переменная окружения (секреты, токены, cache-repo и т.п.)
git clone --depth 1 <url>                 # shallow-клон репозитория практики
cat /etc/resolv.conf                       # DNS-конфигурация Pod
nslookup <svc>.<ns>.svc.cluster.local       # проверка DNS-резолвинга Service
curl -H "Host: <host>" http://localhost/    # проверка Ingress/Gateway через Host-заголовок
grep -E "<pattern>"                          # фильтрация вывода
jq                                             # форматирование JSON-вывода
base64 -d                                       # декодирование значения Secret

Установка инструментов через trdl

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
trdl add <tool> <repo-url> <group> <root-sha512> <tool-binary-name>   # добавить репозиторий инструмента
trdl use <tool> <group> <channel>                                       # активировать канал обновления (обычно stable)
. $(trdl use d8 0 stable) && d8 --version                                 # активировать в текущей сессии и проверить версию
trdl use werf 2 stable                                                     # активация стабильной ветки Werf 2 в CI
source ~/.bashrc                                                             # перезагрузить shell rc после trdl use
source ~/.zshrc
chmod +x ./kubectl                                                            # выдать exec-бит скачанному бинарнику
echo $PATH                                                                      # проверить, что каталог с бинарником в PATH
export PATH="$PATH:$HOME/bin"
git --version                                                                    # проверка установки git

kubeconfig

1
2
export KUBECONFIG=~/.kube/config
kubectl config view --minify

Локальный кластер (kind)

1
2
3
4
5
6
7
8
9
bash -c "$(curl -Ls <url>)"              # запуск удалённого скрипта установки kind + Deckhouse CE
curl -Ls <url>                             # скачать скрипт (обычно внутри bash -c)
curl -k https://127.0.0.1:<port>/version    # прямой запрос к API-серверу Kubernetes
kind delete cluster                           # полное удаление локального kind-кластера
docker ps                                       # узлы kind видны как контейнеры (kind-control-plane)
docker exec -it kind-control-plane crictl ps      # список контейнеров внутри узла на уровне containerd
docker exec -it kind-control-plane sh -c "<cmd>"   # выполнить команду внутри узла kind
crictl ps                                            # список контейнеров через CRI (внутри узла)
docker run --rm hello-world                            # проверка работоспособности container runtime

DNS и сетевая отладка внутри кластера

1
2
3
4
5
6
7
cat /etc/resolv.conf                                    # DNS-конфигурация Pod (внутри debug-контейнера)
nslookup <svc>                                             # проверка DNS-резолвинга Service изнутри кластера
nslookup <svc>.<ns>.svc.cluster.local                        # полный FQDN Service
wget -qO- http://<fqdn>/                                       # HTTP-запрос к Service по FQDN из debug-Pod
wget -qO- localhost:9090/api/v1/targets                          # запрос к Prometheus targets API изнутри пода
curl -H "Host: <host>" http://localhost/                           # проверка Ingress/Gateway через Host-заголовок
echo "<ip> <host>" | sudo tee -a /etc/hosts                         # добавить локальную DNS-запись для тестового домена

Секреты, base64, openssl

1
2
3
openssl rand -base64 32                                              # сгенерировать случайный токен для Secret
openssl req -x509 -nodes -newkey rsa:2048 -keyout /dev/null -out - -days 1 -subj "/CN=<host>"  # самоподписанный TLS-сертификат
base64 -d                                                              # декодировать base64-значение (например, из Secret)

jq / grep / python — обработка вывода

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
grep -E "<pattern>"                          # extended regex
grep -i <pattern>                              # case-insensitive поиск
grep -iE "<pattern>"                             # case-insensitive extended regex
grep -A<N> "<pattern>"                             # показать N строк после совпадения
grep -B<N> "<pattern>"                               # показать N строк до совпадения
grep -c "<pattern>"                                    # посчитать число совпадений
grep -rn "<pattern>" <dir>/ | sort                       # рекурсивный поиск с номерами строк, отсортировано
jq                                                          # форматирование/фильтрация JSON
kubectl ... -o jsonpath='...' | jq                            # типовая связка jsonpath + jq
python3 -c "import json,yaml; json.dumps(yaml.safe_load(open('<file>')))" && echo "OK"  # проверка валидности YAML/JSON Schema

Git

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
git init
git add .
git commit -m "<message>"
git remote add origin <repo-url>
git push --set-upstream origin main
git push origin main
git tag v1.2.0
git push origin v1.2.0
git tag v1.2.0 && git push origin v1.2.0    # объединённая команда: создать и опубликовать релизный тег
git clone --depth 1 <url> [<dir>]             # shallow-клон (без истории) для практики/анализа

Переменные окружения, shell-цикл, редиректы

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
export VAR="value"
"${CI_COMMIT_TAG#v}"                          # bash parameter expansion: убрать префикс "v" из тега
2>/dev/null || echo "<message>"                 # подавить stderr и вывести fallback-сообщение при ошибке
; echo                                            # явный перевод строки после jsonpath-вывода без trailing newline
for ns in <ns1> <ns2>; do <command>; done          # bash-цикл по списку значений
for m in <module1> <module2>; do d8 k get module "$m" -o jsonpath='...'; echo; done
cat > <file> <<'EOF' ... EOF                          # запись heredoc в файл
sh -c "<cmd>"                                            # shell-обёртка (например, в initContainer/Job)
sleep <N>                                                  # задержка (preStop/init/симуляция Job)
date                                                          # текущее время
diff <file1> <file2>                                            # сравнение содержимого файлов
touch <file>                                                       # имитация изменения файла (тест инвалидации кэша)
mv <src> <dest>                                                      # переименование/перемещение файла
find <path> -maxdepth <N>                                              # поиск с ограничением глубины
find . -type f | sort                                                    # список файлов дерева, отсортированный
mkdir -p <dir>                                                             # создать директорию (с родителями)
cd <dir>                                                                     # перейти в директорию
ls [-la]                                                                       # список содержимого директории

Процессы, права, время сборки

1
2
3
4
5
ps aux                                    # список процессов (внутри контейнера через kubectl exec)
chmod +x <file>                             # выдать exec-бит
whoami
sudo -l
time <command>                               # замерить время выполнения (например, сборки werf)

Базы данных (проверка персистентности/backup)

1
2
3
4
5
psql -U <user> -c "<sql>"                # выполнить SQL в Postgres внутри Pod
pg_dump                                     # логический дамп PostgreSQL
mysqldump                                     # логический дамп MySQL
etcdctl snapshot save <snapshot-file>           # снапшот etcd (используется внутри d8 backup etcd)
tar -czvf <archive>.tar.gz <snapshot-file>        # упаковать снапшот в архив

Дополнительно: сетевые утилиты для troubleshooting в проде

Не встречаются напрямую в уроках курса, но регулярно нужны при реальной эксплуатации приложений в Kubernetes:

1
2
3
4
5
6
7
8
ss -tulnp                                     # какие порты слушает процесс (замена устаревшего netstat)
dig <host>                                      # альтернатива nslookup с более подробным выводом DNS
dig +short <host>
curl -v <url>                                     # подробный вывод HTTP-запроса (заголовки, TLS handshake)
curl -o /dev/null -s -w "%{http_code}\n" <url>       # только код ответа HTTP
traceroute <host>                                      # маршрут пакетов до хоста
tcpdump -i any port <port>                               # перехват трафика на порту (нужны привилегии)
openssl s_client -connect <host>:<port>                    # проверка TLS-сертификата удалённого сервиса