пятница, 30 августа 2024 г.

k8s kubelet failed to reserve sandbox name

Sometimes containerd files gets corrupted. Why?..

Workaround.

systemctl stop kubelet
systemctl stop containerd


Remove corrupted containerd

mv /var/lib/containerd/ /var/lib/containerd_
mv /run/containerd/ /run/containerd_


Set a specific IP of any k8s api master to work without the missing nginx-proxy

grep localhost /etc/kubernetes/kubelet.conf
server: https://localhost:6443


Return the node to work

systemctl restart kubelet
systemctl restart containerd


Monitoring the start of pods

watch crictl ps


Revert kubelet.conf to localhost

Ceph pgs not deep-scrubbed in time

1. Change scrub_interval

ceph config set osd osd_deep_scrub_interval 1814400
ceph tell osd.* config set osd_deep_scrub_interval 1814400


2. Temporarily increase the number of active scrub tasks

ceph tell 'osd.*' injectargs --osd_max_scrubs=2


3. Check LA and increase osd_scrub_load_threshold

ceph tell 'osd.*' injectargs --osd_scrub_load_threshold=5


4. Force deep scrub tasks

ceph health detail | grep "not deep-scrubbed since" | awk '{ print $2 }' | xargs -n1 ceph pg deep-scrub

вторник, 30 июля 2024 г.

nfs-ganesha

Some non-obvious things in the config

cat /etc/ganesha/ganesha.conf

EXPORT
{
Export_ID=1;
Path = "/nfs-stage";
Pseudo = "/nfs-stage";
Access_Type = RW;
Protocols = 4;
Transports = TCP;
Anonymous_Uid = 1000;
Anonymous_Gid = 1000;
FSAL {
Name = RGW;
User_Id = "nfs-stage";
Access_Key_Id ="ACCESS_KEY";
Secret_Access_Key = "SECRET_KEY";
}
CLIENT
{
Clients = 10.10.0.0/24;
Squash = None;
Access_Type = RW;
}
}
RGW {
        ceph_conf = "/etc/ceph/ceph.conf";
        name = "client.admin";
        cluster = "ceph";
        init_args = "--keyring=/etc/ceph/ceph.client.admin.keyring";
}
#LOG {
#        Facility {
#                name = FILE;
#                destination = "/var/log/ganesha.log";
#                enable = active;
#        }
#}


пятница, 3 ноября 2023 г.

Proxmox. Аналитика выделенных ресурсов

CSV файл со списком всех виртуальных маших и выделенных под них ресурсов 

pvesh get /cluster/resources --type vm --output-format json > /tmp/vm_exp_list.json

cat vm_exp_list.json | jq -r 'sort_by(.vmid)|.[]|select(.status == "running")| [.vmid, .node, .name, .maxcpu, .maxmem, .maxdisk]|@csv'

пятница, 14 июля 2023 г.

Сбор sFlow в Clickhouse для аналитики

Общая схема:

host-sflow -> sFlow -> goflow2 collector -> kafka protobuf -> clickhouse

1. Серверная часть сборки sflow

https://github.com/netsampler/goflow2
NetFlow/IPFIX/sFlow collector in Go


Kafka

Подготовить топик nflow

goflow2

Запущен в Docker

docker run --net=host -ti netsampler/goflow2:latest -transport=kafka -transport.kafka.brokers=localhost:9092 -transport.kafka.topic=nflow -format=pb -format.protobuf.fixedlen=true

 

Clickhouse

Скачать настройки протокола protobuf 

/var/lib/clickhouse/user_files/protocols.csv

Таблицы и подключение к kafka
CREATE TABLE IF NOT EXISTS nflow.flows_kafka
(
time_received UInt64,
time_flow_start UInt64,
sequence_num UInt32,
sampling_rate UInt64,
sampler_address FixedString(16),
src_addr FixedString(16),
dst_addr FixedString(16),
src_as UInt32,
dst_as UInt32,
etype UInt32,
proto UInt32,
src_port UInt32,
dst_port UInt32,
bytes UInt64,
packets UInt64
) ENGINE = Kafka()
SETTINGS
kafka_broker_list = '127.0.0.1:9092',
kafka_topic_list = 'nflow',
kafka_group_name = 'clickhouse',
kafka_format = 'Protobuf',
kafka_schema = 'flow.proto:FlowMessage',
kafka_skip_broken_messages = 1;
        
CREATE TABLE IF NOT EXISTS nflow.flows_raw
(
date Date,
datetime DateTime,
sequence_num UInt32,
sampling_rate UInt64,
sampler_address String,
src_addr String,
dst_addr String,
src_as UInt32,
dst_as UInt32,
etype UInt32,
proto UInt32,
src_port UInt32,
dst_port UInt32,
bytes UInt64,
packets UInt64
) ENGINE = MergeTree()
PARTITION BY date
ORDER BY datetime
TTL date + toIntervalDay(30)
SETTINGS index_granularity = 8192;

        
CREATE MATERIALIZED VIEW IF NOT EXISTS nflow.flows_raw_mv TO nflow.flows_raw
AS SELECT
toDate(time_received) AS date,
time_flow_start AS datetime,
sequence_num,
sampling_rate,
IPv4NumToString(reinterpretAsUInt32(substring(reverse(sampler_address), 13, 4))) AS sampler_address,
IPv4NumToString(reinterpretAsUInt32(substring(reverse(src_addr), 13, 4))) AS src_addr,
IPv4NumToString(reinterpretAsUInt32(substring(reverse(dst_addr), 13, 4))) AS dst_addr,
src_as,
dst_as,
etype,
proto,
src_port,
dst_port,
bytes,
packets        
FROM nflow.flows_kafka;


2. Установка сборщика флоу на хост

Используем host-sflow

cat /etc/hsflowd.conf
sflow {
  collector { ip=goflow2.host.example.com udpport=6343 }
   
  # ====== Local configuration ======
  pcap { dev = eth0 }
  pcap { dev = eth1 }
  # ...
}
 
systemctl enable hsflowd
systemctl start hsflowd 


3. Примеры запросов

Активные сборщики флоу

select sampler_address,count() from nflow.flows_raw where datetime>now()-24*3600 group by sampler_address limit 100;

Найти источник запросов на список внешних ресурсов

select src_addr,count() from nflow.flows_raw where datetime>now()-24*3600 and dst_addr in ('1.1.1.1','8.8.8.8') group by src_addr order by count() desc limit 100; 

вторник, 30 мая 2023 г.

Centos 7 SSH error "shell request failed on channel 0"

Столкнулся с невозможностью подключиться по ssh к нодам k8s под определённым юзером:

ssh user@10.0.0.10
shell request failed on channel 0

Выяснилось, что UID пользователя user был использован в docker image одного из сервисов.

Быстрое решение увеличить лимиты числа процессов для рядовых пользователей в Centos 7, например, на 8192:

/etc/security/limits.d/20-nproc.conf

# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
*          soft    nproc     4096
root       soft    nproc     unlimited

среда, 24 мая 2023 г.

Proxmox ZFS howto find Linked Clone disks

id 200 - proxmox template

id 201 - VM with Linked Clone disk

zfs list -o name,origin
...
rpool/data/vm-201-disk-0 rpool/data/base-200-disk-0@__base__

вторник, 23 мая 2023 г.

NetworkManager vlan on bond interface

nmcli con add type bond con-name bond0 ifname bond0

nmcli con modify bond0 bond.options "mode=802.3ad,xmit_hash_policy=layer2+3,miimon=100,lacp_rate=1"

nmcli con add type ethernet slave-type bond con-name bond0-eno1 ifname "eno1" master bond0

nmcli con add type ethernet slave-type bond con-name bond0-eno2 ifname "eno2" master bond0

nmcli con mod bond0 ipv4.method disabled

nmcli con mod bond0 ipv6.method ignore


nmcli con add type vlan con-name bond0.2222 ifname bond0.2222 dev bond0 id 2222

nmcli con mod bond0.2222 ipv4.addresses '10.0.0.5/24'

nmcli con mod bond0.2222 ipv4.gateway '10.0.0.1'

nmcli con mod bond0.2222 ipv4.dns '8.8.8.8,8.8.4.4'

nmcli con mod bond0.2222 ipv4.method manual 

понедельник, 15 мая 2023 г.

haproxy slowstart backend

Столкнулся с ошибкой приложения при работе с БД в схеме Percona xtradb cluster + Haproxy при рестарте одной из нод кластера

app.CRITICAL: An exception occurred while executing a query: SQLSTATE[08S01]: Communication link failure: 1047 WSREP has not yet prepared node for application use

backend bk_mysql
    mode tcp
    option mysql-check user haproxy
    default-server slowstart 30s weight 100
    server mysql-1 10.0.0.11:3306 check
    server mysql-2 10.0.0.12:3306 check
    ...

haproxy после перевода бэкенда в UP за указанный промежуток времени линейно поднимет его вес  с 0 до 100%, что значительно снизит число ошибок до перехода ноды в wsrep_ready ON.

haproxy tcp acl example

RTFM: https://www.haproxy.com/blog/use-haproxy-response-policies-to-stop-threats/#reject

frontend xxx_ft
        bind 10.0.0.10:29000
        mode tcp
        acl whitelist src 10.0.0.0/24
        tcp-request connection reject if !whitelist
        use_backend xxx_bk
backend xxx_bk
        mode tcp
        server ctcmedia 10.0.0.20:9000

вторник, 22 декабря 2020 г.

Расширение раздела без перезагрузки системы

fdisk /dev/sda

Удалить раздел, создать новый, сохранить


partprobe

Error: Partition(s) 1 on /dev/sda have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use.  As a result, the old partition(s) will remain in use.  You should reboot now before making further changes.


partx -u /dev/sda

partprobe


xfs_growfs /

суббота, 29 июня 2019 г.

Создание wildcard сертификата Let's Encrypt

Создание wildcard сертификата возможно только через DNS challenge. Для подтверждения владения доменом необходимо создать TXT запись вида _acme-challenge.example.com с определенным значением.

Используем docker certbot в ручном режиме
sudo docker run -it --rm -v /docker/volumes/etc/letsencrypt:/etc/letsencrypt -v /docker/volumes/var/lib/letsencrypt:/var/lib/letsencrypt -v /docker/volumes/var/log/letsencrypt:/var/log/letsencrypt certbot/certbot certonly --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory --register-unsafely-without-email --agree-tos --manual-public-ip-logging-ok -d *.example.com
 Вывод:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:
pFIaptscrhj_BZsXNcl_wgj99X-Tuyb9x-_1l9o_bhk
Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

После правки DNS зоны _acme-challenge.example.com сертификат будет сгенерирован в каталоге:
/docker/volumes/etc/letsencrypt/live/

Была идея использовать локальный bind9 c добавлением TXT записей через RFC 2136 Dynamic Updates через плагин certbot-dns-rfc2136, но до практической реализации пока не дошли руки.

понедельник, 6 февраля 2017 г.

XenServer: скрипт очистки диска Dom0 после установки обновлений

После установки обновлений можно очистить место на диске Dom0 XenServer.
#!/bin/sh
PATCHLIST=`xe patch-list params=uuid | awk '{print $5}'`
for UUID in $PATCHLIST
do
        echo "Cleanup patch $UUID"
        xe patch-pool-clean uuid=$UUID
done
Идея скрипта: http://discussions.citrix.com/topic/371712-xenserver-low-root-disk-space-cleaup-script-for-patches/

Для работы скрипта на единичном сервере без пула можно использовать команду xe patch-clean, но фактически patch-pool-clean отрабатывает корректно.

Проверяем свободное место на диске df -h и содержимое каталога /var/patch/
# ls /var/patch/
applied
Содержимое каталога /var/patch/applied не трогать и не удалять!

Также не забываем периодически удалять лог-файлы XenServer.

суббота, 4 февраля 2017 г.

XenServer 6.5: Список актуальных обновлений

Свежая установка XenServer 6.5 требует следующих обновлений:
  • XS65ESP1 - XenServer 6.5.0 Service Pack 1
  • XS65ESP1027 - Fix for vGPU
  • XS65ESP1031 - fixes to Toolstack and v6 licence
  • XS65ESP1035 - fixes to Storage
  • XS65ESP1040 - security fixes to NTP
  • XS65ESP1045 - XenTools fixes
  • XS65ESP1046 - Security fixes to Xen
  • XS65ESP1047 - Security fixes to Toolstack
Устанавливать ранее выпущенные исправления не требуется.

среда, 31 августа 2016 г.

Отключение дискового кеша в Firefox

  1. Открыть about:config
  2. Параметр browser.cache.disk.enable установить в false.
  3. Параметр browser.cache.memory.enable установить в true.
  4. Создать новую настройку browser.cache.memory.capacity (тип Целое) и задать ей значение -1 для автоматической настройки объёма кеша в зависимости от объёма ОЗУ. 

суббота, 6 августа 2016 г.

Mount nfs4 share

/etc/fstab

192.168.0.1:/home/ftp /media/ftp/ nfs vers=4.0,proto=tcp,rsize=524288,wsize=524288,timeo=60,retrans=2,rw,async,hard,intr,_netdev 0 0

вторник, 17 мая 2016 г.

Понедельник как первый день недели в календаре cal

В конец файла ~/.bashrc добавляем:
alias cal='ncal -M -C'

Блокировка опасных вложений в письмах с помощью clamsmtp

В последнее время случаи рассылки вирусов-шифровальщиков в почтовых вложениях пошли на убыль, однако, такие письма продолжают попадаться.

Определимся со списком потенциально опасных вложений:
.ade, .adp, .bat, .chm, .cmd, .com, .cpl, .exe, .hta, .ins, .isp, .jar, .js, .jse, .lib, .lnk, .mde, .msc, .msp, .mst, .pif, .scr, .sct, .shb, .sys, .vb, .vbe, .vbs, .vxd, .wsc, .wsf, .wsh

В том числе, если файлы с такими расширениями находятся в архивах:
.zip, .rar, .7z.

Для фильтрации используется возможность написания собственного файла сигнатур для ClamAV. Формат .cdb файла следующий:
VirusName:ContainerType:ContainerSize:FileNameREGEX:
FileSizeInContainer:FileSizeReal:IsEncrypted:FilePos:
Res1:Res2[:MinFL[:MaxFL]]

Для нашего списка блокировки на примере .exe файлов:
rules_block_exe:CL_TYPE_MAIL:*:\.[Ee][Xx][Ee]$:*:*:*:*:*:*
rules_block_Zip_exe:CL_TYPE_ZIP:*:\.[Ee][Xx][Ee]$:*:*:*:*:*:*
rules_block_Rar_exe:CL_TYPE_RAR:*:\.[Ee][Xx][Ee]$:*:*:*:*:*:*
Полный список http://pastebin.com/Bisxq1ez

Сохраняем наш файл сигнатур в /var/lib/clamav/rules_attachment_block.cdb

Если на почтовом сервере уже используется связка postfix+clamsmtp, то дополнительной  настройки более не требуется. Однако, для удобства пользователей и системного администратора было решено написать скрипт, высылающий получателю сообщение о недоставленном письме с вирусом или запрещённым вложением.

В /etc/clamsmtpd.conf добавляем:
VirusAction: /etc/clamav/script.sh

Скрипт /etc/clamav/script.sh (http://pastebin.com/xTZ9tQ1h)
#!/bin/sh
DOMAIN=domain.com
# Notification receiver

ADMIN=postmaster@domain.com

# E-mail sending function

alert_send() {
( cat <<EOF;
To: $RECIPIENT
Reply-To: $ADMIN
Subject: =?UTF-8?B?`echo -n $SUBJECT | base64`?=
Content-Type: multipart/mixed; boundary=simple boundary

This is a multi-part message in MIME format.
--simple boundary
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64

`echo -n $DATA | base64`
--simple boundary

EOF
) | sendmail -t -oi
}

# E-mail to Administrator
SUBJECT="Письмо добавлено в карантин"
DATA="<p><b>Причина блокировки или имя вируса:</b> $VIRUS<br> \
        <b>Отправитель:</b> $SENDER<br> \
        <b>Получатель:</b> $RECIPIENTS<br><br> \
        <b>Перемещено в карантин:</b> $EMAIL<br><br>"
RECIPIENT=$ADMIN
alert_send

# E-mail to User
for RECIPIENT in $RECIPIENTS
do
     if [ X`echo $RECIPIENT | egrep @$DOMAIN$` != "X" ];
     then
        SUBJECT="Письмо добавлено в карантин"
        DATA="<p><b>Отправитель:</b> $SENDER<br> \
        <b>Получатель:</b> $RECIPIENTS<br><br> \
        <b>Перемещено в карантин:</b> $EMAIL<br><br> \
        Письмо не доставлено и перемещено в карантин из-за подозрительного вложения.<br> \
        Если вы уверены, что это ошибка, свяжитесь с отделом ИТ."
     alert_send
     fi
done

пятница, 13 мая 2016 г.

Xenserver Root Disk Cleanup

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

Контроль места на диске
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 4.0G 2.2G 1.6G 59% /

Удаление применённых пакетов обновлений и hotfix
Для Xenserver 6.2 и выше. Это освобождает место, корректно очищая папку /var/patch/ 
# xe patch-list params=uuid
uuid ( RO)    : d3c08fcb-daa0-4410-bdb2-c298109e88ad
...
# xe patch-clean uuid=<uuid>

Удаление старых лог-файлов
# cd /var/log/ 
# rm -rf *.gz 

Очистка каталога /tmp
# cd /tmp/
# rm -rf *.log