PSA: kernel 5.12.11 is safe for bcache, again


With the release of Linux kernel 5.12.11, bcache is safe to use, again. The patch bcache: avoid oversized read request in cache missing code path has been merged.

Due to changes in 5.12 kernels, bcache was prone to cause a BUG_ON() when submitting large I/O requests. The result was a kernel panic or a system freeze. Problem was reported in couple of places: Fedora bug#1965809, bcache mailing list #1, bcache mailing list #2.

At some point UI loses usefulness


When it comes to configurability, modern software often hits a sweet spot. We are given nice, usable User Interface (UI) helping with configuration – by hinting, auto-filling and validating fields. Additionaly, the configuration itself is stored in text format, making it easy to backup and track changes. For example in git version control system.

Recently I encountered at least two cases, where the above features conflict.

Argo CD

Argo CD is a wonderful tool to implement GitOps with you Kubernetes cluster.

Kubernetes is configured by plain text files in YAML format. That's a perfect form to track in git. Argo CD provides synchronization service: what you have in git repository is applied to kubernetes. Synchronization could be automatic or you can opt to sync manually. In later case, Argo CD provides a nice diff view, showing what's currently configured and how should it be.

Argo CD also has a nice concept of responsibility boundaries: it cares only about YAML sections and fields present in the git repo. If you add new section on the running cluster, it won't be touched. It may be a single field, for example – replicas:

Above can be utilized when you manage Argo CD by Argo CD. install.yaml file defines configuration resources likes ConfigMaps and Secrets, yet it doesn't provide actual data: sections. When you configure Argo CD installation – using nice web UI, no less - data: sections are created and configuration is stored into k8s cluster.

Those sections are not part of what is stored in git repository, so they will neither be touched nor rewritten.

But what happens when we want to store the Argo CD configuration in the repository, and gitops it to the Moon and back?

If we add data: sections, they will be synced. But we will lose ability to use nice UI directly! As UI makes changes on the running cluster, Argo CD will notice live configuration differs from git repository one. It will overwrite our new configuration, undoing changes.

If we want to gitops configuration, we basically must stop using UI and manually add all changes to the text files in the repository!

Grafana

Grafana is another cool project. It is a graphing/dashboarding/alerting solution, which looks pretty and is quite powerful, yet easy to use. Mainly because user interface is a pleasure to use; all changes are visible instantly and we are free to experiment.

Behind the scenes dashboards are just text (JSON) files. Great, text, let's store it in git! Well…

First of all, generated JSON tend to be dynamic. If you do some manipulations in the UI, sections in final file may move relative to each other. Even if the content does not change.

Second, those documents tend to be verbose. Like, really. It is not recommended to edit them manually, better use some templating language. For example grafonnet, which is a customisation of jsonnet - templating for JSON.

The reader probably sees where it's all going. Decision to use grafonnet makes the whole nice UI almost useless, as it spits JSON only. Again, to have better control, history and visibility we must forego one of the main selling points of the software.

Solutions? Are there any?

Frankly, I don't see anything perfect. We have some workarounds, but they feel cumbersome.

For Argo CD we can disable self-healing of an app. That is, disable automatic synchronisation. That way we can still use the UI to do the configuration. Argo CD will notice out-of-sync status between git and live cluster. It will also provide helpful diff: showing exactly how changes made in the UI are reflected in the text configuration.

When we're happy with the changes, we have to extract them from diff view and commit to the git repository. Cumbersome. And we lose active counter-measurements against configuration drift.

Grafana problem we fight with sandbox instance. Any (templated) dashboard can be loaded, then customised with clickety click and exported to JSON. Now the tedious part begins: new stuff from JSON need to be identified, extracted, translated back into templating language and hand merged into grafonnet dashboard definition.

The improved dashboard should be imported into sandbox again and verified. If it is all right, it could be promoted to more important environments. Cumbersome².

I'm very interested in better solutions. If you have comments, ideas, links, please use comments section below!

Die Gruppenprojekt Revision


Po dwóch dekadach prowadzeniach bloga można już polemizować z własnymi wpisami. Czasem nawet trzeba.

W czasie studiów na Wydziale ETI PG byłem pierwszym rocznikiem, na którym testowano nową formę zajęć – Projekt Grupowy. Odebrałem go źle i moje negatywne nastawienie utrzymało się długo. Dzisiaj – z bagażem doświadczeń – widzę w jak dużym błędzie byłem.

Z tego co pamiętam, Politechnika wprowadziła Projekt Grupowy (PG wprowadziła PG…) bo ktoś zorientował się, że brakuje przekazywania studentom umiejętności przydatnych w prawdziwym życiu/pracy:

  • pracy w grupie z podziałem obowiązków

  • tworzenia dokumentacji do rozwiązań

  • prezentowania, co się osiągnęło („sprzedania się”)

Dzisiaj zgadzam się, że powyższe są istotnymi zdolnościami. Samo ogarnięcie w technologii nie wystarcza. Wtedy byłem może nie idealistą, ale fascynatem technologii, bawiącym się ciekawymi rozwiązaniami i robiącym nowe rzeczy bo mogłem i bo były intrygujące.

Ciekawe jest, że zżymałem się na stwierdzenie „głównym zadaniem sieci telekomunikacyjnej jest przynoszenie zysku operatorowi ”. Well, duh! Dzisiaj potrzeba business case wydaje się jasna jak Słońce. Owszem, fajnie jest wymyślać nowe rzeczy, bo tak. Ale świat jest tak skonstruowany, że poza środowiskiem naukowym wszystko musi przynosić €€€. Nie ma sensu wydawanie milionów na sieć, aby popatrzeć jak ładnie pakiety się trasują. Rozwiązanie musi rozwiązywać czyjś problem i ta na tyle skutecznie, żeby takie ktosie były skłonne płacić za utrzymanie tego rozwiązania.

Do czego prowadzi oderwanie od biznesu mam niestety przykład w obecnej firmie. Po zainwestowaniu kilku lat pracy i stworzeniu systemu wg założeń dopiero zaczyna się szukanie komu i po co miałby być potrzebny. Brak jasno określonego „jaki jest nasz cel, klient” powoduje, że ludzie nie wiedzą po co robią, nie czują sensu i odchodzą. Jak nie wiadomo do czego dążymy, jakie są warunki dostarczenia bądź zakończenia projektu, to nie można odpowiedzieć ile jeszcze. A niepewność rozwala każde poczucie bezpieczeństwa.

No, ale to dygresja. Przy Projekcie Grupowym jeżyłem się też z powodu słownictwa w instrukcji. Niesłusznie. Może sformułowania nie były najzgrabniejsze, ale nie pozostawiały niedopowiedzeń. Było po prostu zostanie dostarczony, a nie jakieś powinien, musi, itp. Bo co, jeśli nie? Zamiast szukać odpowiedzi na przypadek nie, lepiej go w ogóle nie dopuścić. Teraz zgadzam się z takim podejściem.

Doświadczenie pokazało mi też jak powyższy problem wypływa w przypadku kiepskiego prawa. Mamy np. w ustawie o wspólnotach stwierdzenia, że Zarząd na wniosek zwołuje zebranie, albo że powinien uzyskać absolutorium. A co jeśli nie zwoła lub nie uzyska? Absolutnie nic. Brak penalizacji za niewywiązanie się powoduje, że takie zapisy są martwe, nie mają konsekwencji.

Moje studenckie oburzenie porównałbym do dramy, gdy do szkół niższego stopnia wprowadzono egzaminy opierające się na zrobieniu prezentacji. Że to niby spłycanie i uczenie kolorowania slajdów zamiast twardych konkretów. Tak się jednak składa, że prezentacja osiągnięć to cholernie ważna umiejętność i element całości.

Można sobie siedzieć w piwnicy i robić cuda, ale bez wyjścia z nimi do ludzi umrą razem z autorem. Warto zauważyć, że za początek Linuksa przyjmujemy nie chwilę napisania pierwszej linijki kodu. Obchodzimy za to dzień, w którym 30 lat temu Torvalds wysłał posta, do ludzi, że ma taki hobbistyczny projekt, który nigdy nie będzie tak duży i profesjonalny jak GNU.

Perypetie z HDMI


Dzisiaj mało kontentu. Taki trochę rant, trochę moje zdziwienie objawami.

Wymieniłem ostatnio wyświetlacz w salonie na większy. Jedną z jego funkcji jest bycie cyfrową ramką na zdjęcia, a te w 4k wyglądają lepiej. Do tego czasem obejrzenie jakiś mediów video albo casualowe granie (Stadia FTW).

Zaskakująco, nie zadziało od razu. Dotychczas wystarczało mi iGPU wbudowane w procesor, jednak możliwości tego w i7-3770 kończą się na 2560×1600 przez DisplayPort. Przez HDMI nawet mniej – 1920×1200. Trzeba wymienić sprzęt. Wstępnie postanowiłem poczekać na nowe APU od AMD, w międzyczasie zacząłem szukać jakieś taniej karty graficznej. Z uwagi na sterowniki jedynym sensownym wyjściem są Radeony.

Kolega pożyczył mi swojego Radeona VTX HD 7850. Parę lat temu topowa karta. Dzięki niej po raz pierwszy zobaczyłem 3840×2160 na nowym wyświetlaczu. Ale! Nie było możliwości uzyskania więcej niż 30Hz. Wyjście HDMI było w zbyt starej wersji. Kartę więc oddałem i zacząłem szukać czegoś nowszego.

Wytypowałem i kupiłem na OLX kartę z serii RX 560. Obraz super, odświeżanie 60Hz bez problemu. Natomiast dźwięk przez HDMI – już nie bardzo. Wydawało mi się, że na początku działał, potem cisza. Może oszczędzanie energii zawiniło? Próbowałem z opcjami wysyłania cichego szumu i utrzymania urządzenia w akrtywności, ale bez sukcesów.

W wyniku pogłębionego researchu dodałem do linii poleceń jądra amdgpu.dc=1 amdgpu.audio=1 co z początku zadziałało, ale nie na długo. Dodam, że eksperymenty są dość uciążliwe, bo komputer o którym mowa służy mi też za router do internetu i centrum smart home. Problemu nie rozwiązałem, na szybko przeciągnąłem kable i podpiąłem stare głośniki do komputera.

Jakiś czas później postanowiłem przejrzeć ustawienia samego wyświetlacza. W menu znalazłem pozycję „Rozszerzenie sygnału wejściowego” (po angielsku to chyba “Input Signal Plus”). Jej włączenie spowodowało, że wyświetlacz zaczął raportować obsługę trybów do 120Hz. Hmm. Aż tyle nie udało mi się włączyć, ale wyszedłem trochę ponad 60Hz. Obraz był, natomiast pojawiły się artefakty. Coś jakby kabel był uszkodzony, albo nie dawał rady.

Kabel! Niby pierdoła, ale obecny mam od prawie dziesięciu lat. Kiedy standardy HDMI były mniej wyżyłowane, a 4k to była egzotyka. Tak się złożyło, że miałem inny, nowszy 5-metrowy (komputer stoi w innym pomieszczeniu) przewód HDMI pod ręką. Zamieniłem. Obraz stabilny. I dźwięk też po prostu działa. Hmm!

Wyszło na to, że źródłem problemu jest zbyt stary kabel HDMI, nie zapewniający odpowiedniego pasma przenoszenia. Faktycznie dźwięk po nim działał w rozdzielczości FullHD. Po przełączeniu na 4k, dostępnego pasma już nie starczało na przesłanie audio. Przełączniki do kernela pewnie nie były potrzebne. Nowszy kabel pozwolił na 4k@60Hz z audio, ale osiągnięcie 120Hz też go przerosło.

Wyjaśniło się też, czemu czasami dźwięk był. Przy rozdzielczości Full HD, domyślnej po reboocie, starczało pasma na dźwięk. Przestawienie na 4k już pasmo wyczerpywało i dźwięk magicznie cichł.

Upgrade serwera zostawiam na później – teraz działa, nie mam motywacji do składania nowego. Co prawda jest trochę gorzej – mało slotów PCIe, po włożeniu karty graficznej NVMe musiał powędrować do gniazda 1x – ale nie jest to odczuwalne. A z kablami HDMI zrobiliśmy podobny burdel jak z USB-C. Kabel kablowi nierówny, trzeba dokładnie czytać co obsługuje. Do tego ze znalezieniem HDMI 5-metrowego future-proof (8K z HDR) jest problem.

What's in the box?


Jak pisałem około roku temu, w związku z nową ekranizacją Diuny postanowiłem przeczytać wszystkie książki z uniwersum. Niektóre po raz kolejny, większość jednak po raz pierwszy. O Shai Huludzie, ale trafny kryptonim wybrałem! Jestem mniej więcej w połowie. Premiera filmu została przesunięta, więc tempo czytania mi spadło. A pan Herbert Junior w dalszym ciągu dopycha linię czasu (The Duke of Caladan wyszło w październiku).

Dotychczasowy mój postęp wygląda tak:

Tytuł

Wydanie

Przeczytane

"Hunting Harkonnens"

2002

09.07.2019

The Butlerian Jihad

2002

15.08.2019

"Whipping Mek"

2003

22.08.2019

The Machine Crusade

2003

29.11.2019

The Faces of a Martyr

2004

01.12.2019

The Battle of Corrin

2004

29.01.2020

Sisterhood of Dune

2012

02.04.2020

Mentats of Dune

2014

08.06.2020

"Red Plague"

2016

08.06.2020

Navigators of Dune

2016

19.07.2020

House Atreides

1999

22.10.2020

House Harkonnen

2000

10.01.2021

House Corrino

2001

in progress

Na początku chciałem jeszcze na bieżąco oceniać, ale po recenzji The Butlerian Jihad i recenzji The Battle of Corrin odpuściłem. Im dalej w las, tym więcej wydm. Jakość tych powieści nie zachęca do dodatkowego poświęcania swojego czasu. Z planu przeczytania wszystkich się nie wycofuję, bo zazwyczaj doprowadzam przedsięwzięcia do końca.

Z filmu mamy na razie trailer:

Jedno muszę przyznać: Dave Bautista jest idealny jako Glossu Rabban Harkonnen. Ilekroć pojawia się w książkach (a jest go sporo w prequelach) to widzę właśnie takiego, jak zagrał go Dave.

Do premieru filmu zostało 8 miesięcy i 9 dni.

KubeCon NA 2020 talks to watch, part 1


Pandemic situation forced most of the conferences to go on-line. On the one hand, it's not the same experience as in-person attendance. On the other hand - I can participate in events I wouldn't be able to travel to. Therefore I took part in KubeCon + CloudNativeCon North America 2020 last November. Moving to online format reduced price from $1000+ to just $75, which made it easier to justify 😊. It was a bit unusual to be at work in the morning, then move to couch and stay at the conference past midnight.

The online setup was quite good. There were virtual "booths" one would expect at expo – with demos, links to more materials and exhibitor's crew available for chat. There were additional number of channels on CNCF Slack. I followed the announcement one, sponsors one (heaps of interesting information there!) and some run by specific companies.

During the Conference there were some "meet the maintainer" events and accompanying gatherings. Those mainly had a form of Zoom (the owners of Keybase) video meetings where one could chat with the developers. I liked these!

The main course of conference are talks. There were plenty. Sometimes there were a dozen or so parallel tracks, so I did not have a chance to watch everything. I'm slowly working through backlog of things I missed. The talks itself were pre-recorded, but after the talk there was a live Q&A session with the speaker. Sadly, the Q&A is not available in recordings below. I guess this was one of the exclusive perks for attendees.

Below you'll find part 1 of my selection of most interesting talks. Second part will be coming later, but you can find all descriptions and links to the videos at https://kccncna20.sched.com/.

  • PKI the Wrong Way: Simple TLS Mistakes and Surprising Consequences - Tabitha Sable, Datadog

  • The Quest for the Ultimate Kubernetes Homelab - Dan Garfield, Codefresh

  • Stop Writing Operators - Joe Thompson, HashiCorp

  • Clean Up Your Room! What Does It Mean to Delete Something in K8s - Aaron Alpar, Kasten

  • How to Multiply the Power of Argo Projects By Using Them Together - Hong Wang

  • Stress and Mental Health in Technology - Dr. Jennifer Akullian, Growth Coaching Institute

  • The Open Source Revolution: How Kubernetes is Changing the Games Industry - Dominic Green

  • Admission Control, We Have a Problem - Ryan Jarvinen, Red Hat

  • High Performance KubeVirt in Action - Huamin Chen, Red Hat & Marcin Franczyk, Kubermatic

  • This one is from last year, but interesting: How the Department of Defense Moved to Kubernetes and Istio - Nicolas Chaillan

An observation: as for virtual conference, this one had a hefty carbon footprint! Imagine how many planes were flown to deliver these:

KubeCon NA 2020 swag (t-shirts and a tumbler)

k3s is tiny and cute


After KubeCon I've decided to give k3s a try. And I'm impressed!

K3s is a small distribution of Kubernetes (k8s), Linux container orchestrator system. It's really tiny while being functional. One starts with a single 52MiB binary and after few seconds there's a functional installation with half a dozen of system pods. It's a far cry from OKD and its resource hunger. Of course, compared to OKD, there's much less functionality in k3s, but enough for most cases (including mine).

First, I'm writing now, because only recently cgroupsv2 support was added to k3s. Previously it just didn't work on modern systems, like Fedora.

Second, the etcd database, widely perceived as a mandatory part of k8s, is optional in k3s! By default embedded SQLite is used – enough for simple scenarios. I'm particularly happy for Postgresql support. Yes, you can have your Kubernetes working with pgsql.

But K3s is not a single-node solution only. Adding worker nodes is simple; High-Availability solutions for control-plane looks sound (haven't tried yet, but it's on my TODO).

For networking one can easily encrypt inter-node traffic using WireGuard. It's a matter of single switch for provided flannel network backend. Higher level needs? k3s ships with Traefik (which supports ACME for getting TLS certificates) and klipper-lb.

Unfortunately at the lowest level, networking still depends on iptables. This was horrible choice in the beginning of Kubernetes, already 15 years obsolete when it was selected. With known performance problems: nf-hipac tried to solve the problems when, in 2002? Huawei replaced iptables with Linux IP Virtual Server in 2017 to have k8s scale. But the solution is still not default in upstream Kubernetes.

Anyway, for small cluster k3s with iptables should work fine, but it has a potential to demolish your carefully tuned firewall configuration. So beware. For the positive aspect, go and read klipper-lb entire source code. This is world championship in simplicity and getting things done with existing infrastructure.

Keeping cluster up-to-date can be automated with system-upgrade-controller, which downloads new version and restarts the services. Simple.

k3s is provided by our Rancher friends at SUSE. I strongly recommend giving it some attention (at the moment INSTALL_K3S_COMMIT=fadc5a8057c244df11757cd47cc50cc4a4cf5887 works for me). Besides, I vaguely remember one needs k8s cluster to build some Fedora content. ;)

Unrelated blog summary

This year I've strived to write at least one note per month. Well… I've managed to write 9 notes only. In 2021 I will do better!

Nie chcę dzisiaj spać przy zapalonym świetle


Smarthome uskuteczniam oprogramowaniem openHAB. W wersji 1.8.x, bo w 2.0 zmienił się format konfiguracji, a nie chciało mi się jeszcze robić migracji. Linia 1.8 ostatnie wydanie miała w 2016 roku.

Jako system operacyjny na domowym serwerze używam Fedory. Dzisiaj zrobiłem aktualizację do wersji 33. W tej wersji w końcu systemową Javę podbito do wersji 11.

Mój openHAB na to:

Launching the openHAB runtime...
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.eclipse.osgi.internal.baseadaptor.BaseStorage (file:/opt/openhab-1.8.3/server/plugins/org.eclipse.osgi_3.8.2.v20130124-1349>
WARNING: Please consider reporting this to the maintainers of org.eclipse.osgi.internal.baseadaptor.BaseStorage
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

Czyli nie wstanę, tak będę leżał. Światła nie zgaszę, okapu nie wyłączę, odświeżacz powietrza w WC zasnął. Internety oczywiście wskazały na niekompatybilność z Java11.

Na całe szczęście w Fedorze jest jeszcze dostępna Java8, którą można podłożyć openhabowi. I znowu działa, mam kolejne parę miesięcy na migrację do nowszej wersji (3.0 za płotem). Ale dług technologiczny nawet w domu czeka, żeby znienacka ugryźć człowieka w tyłek.

Nie ma takiej rzeczy, której nie oprogramujesz w Linuksie


Zbyt rzadko sobie przypominam, jakim jestem szczęściarzem, że wciągnąłem się w ekosystem Linuksowy. Tu wszystko jest możliwe. Nota bene zapoznałem się z Linuksem przypadkiem – kolega, który miał mi przegrać FreeBSD miał problem z… zamountowaniem dyskietki (było to w okolicach roku 1998). Przez brak FreeBSD skierowałem się po next best thing czyli lajnuksa.

Zmieniając trochę temat, mam różne mniej lub bardziej poważne hobby. Za to czasem spotyka mnie czułość od Żony. Np. przyszła mnie przytulić, gdy kolejna osoba zginęła chodząc po Himalajach (hobby niebezpieczne, nie moje), a ja akurat siedziałem w gabinecie z lutownicą (hobby bezpieczne, moje).

Ostatnio zgłębiam zasoby Youtube pod kątem współczesnych komputerów PC, konkretnie ich chłodzenia. Mój serwerek/media center to nie jest maszyna jakoś specjalnie wymagająca, nawet dedykowanej karty graficznej nie ma (gram na Stadii). Ma być cichy i trwały. Obejrzawszy jutuby zrobiłem więc porządek z kablami, poprawiłem obieg powietrza, dołożyłem wiatraczek, dwa, ewentualnie dziesięć.

Generalnie działa, czasami coś zmienię albo przełożę.

Prawdziwa zabawa to sterowanie. Podstawowym parametrem do regulacji jest prędkość obrotów wentylatorków. Przeszedłem już przez kilka opcji: sterowanie przez płytę główną, związanie prędkości z temperaturą dysków/NVMe, czy też uzależnienie od temperatury procesora (coretemp). Dorobiłem się po drodze przyjemnych wykresów. Nawet przypomniałem sobie trochę Teorii Sterowania ze studiów. Ostatnio doszedłem do wniosku, że dobrze by było reagować na podstawie temperatury cieczy chłodzącej, bo duża pojemność cieplna wody dobrze uśrednia przebiegi… ale nie mam zestawu mierzącego ten parametr.

Za to mam od paru lat czujniki temperatury typu 1wire. Wziąłem jeden z nich i przykleiłem do radiatora. Do tego napisałem paręnaście linijek w Pythonie. Osiągnąłem efekt wow.

% systemctl show -p StatusText fancontrol-onewire
StatusText=Ambient: 26.1°C, water: 31.7°C, CPU: 39.0°C → PWM: 64

Na innych platformach byłbym zapewne ograniczony do własnościowego oprogramowania. Może byłoby w stanie odczytać temperaturę procesora, może czujniki na płycie głównej i w modułach RAM, ale na pewno nie jakieś zupełnie z kosmosu rzeczy na 1wire.

Jakby dobrze poszło, to we własnościowym sofcie może mógłbym wyrysować z grubsza krzywe zależności między temperaturą a prędkością wiatraczków. A mi się uwidziło zrobić zależność po sinusoidzie – z początku przyrost prędkości większy, potem mniejszy. W pythonie: ależ proszę bardzo. Co więcej, w obliczeniach biorę pod uwagę temperaturę powietrza wokół serwera. Z obserwacji mi wyszło, że w typowej sytuacji radiator jest cieplejszy od otoczenia o ok. 4,5°C. Jak to wyrazić w GUI? Praktycznie nie da rady.

Linux daje mi (mi, specjaliście IT; nie każdemu) mnóstwo swobody. Praktycznie co wymyślę mogę osiągnąć kilkoma prostymi integracjami. Jestem, kurcze, szczęściarzem, że trafiłem na tę platformę.

Trying OKD4: home lab needs to grow


I've spent last week tinkering with OKD4, which is open source base for OpenShift. OpenShift in turn is Red Hat's distribution of Kubernetes. Such opensource/commercial differentiation is quite popular among Red Hat products. OKD/OpenShift relation is like AWX/Ansible Tower, Spacewalk/Satellite, WildFly/JBoss, oVirt/RHEV etc.

I already had previous version deployed - 3.11, then called Origin, not OKD. My cluster consists of two old ThinkPads and a virtual machine, and I was planning to redeploy OKD4 on them. But first some PoC on virtual machines.

So I started with minimal viable cluster – 3 schedulable master nodes. (There's a Code Ready Containers version, too – 1 node cluster, but it's non-upgradable). Requirements table looks scary – 4 CPU cores and 16GiB per master – but that's probably an overkil, right?

As it turned out, I won't be able re-use my legacy hardware to host new cluster. Oh boy, OKD4 is massive.

/dżogstaff/2020.07.25-okd-size.png

That's the cluster dashboard just after the installation. For all practical purposes it's an empty platform, I haven't deployed any of my stuff yet. Almost 5 CPU cores used and 10 gigs of memory. Huh.

My VMs setup is below minimal requirements, each has 10GiB of RAM and 3 CPU cores. I'm used to think that you can't skimp on memory, but you can assign fewer CPU cores – at worst everything would be slower. That won't fly with OKD. Components define CPU needs with requires: sections. If you don't deliver, you'll get admission errors and the pods will not run.

So my home lab would need to be expanded with 64GiB of RAM and some 16 threads CPU, just for OKD. Speaking of CPU…

I'm seriously taken-aback with CPU usage of this empty cluster. I don't know exactly what's using so much. There is Prometheus scraping metric, one CronJob and a handful of healthchecks, that's all. Everything should be event-driven and just be idle when not running any workload. Right now OKD wastes tremendous amount of power just to do nothing.

Enough complaining. I like how OKD is managed and configured.

OKD owns the master nodes, including operating system (Fedora CoreOS). Everything is managed from within the cluster, and configured like normal Kubernetes resources - via YAML. LDAP connectivity, custom logo, apiserver's TLS certificates… create a ConfigMap, update a field in resources definition and it just happens.

I much prefer eventual consistency, asynchronously achieved by k8s operators, to using openshift-ansible. The latter touches everything and tends to break when something isn't 100% right. Which is cumbersome when each run takes 40+ minutes.

With OKD you have clean bootstrapping (with ignition config served by bootstrap k8s node – how cool is that?) and you receive basic working cluster, which you customize using kubernetes YAMLs.

Documentation is also very nice and seem to cover every common (and some less common) case.

Indianie poszli w las


Aktualizacja Fedory do najnowszej stabilnej wymagała spojrzenia w oczy kwestii indiańskiej. Od lat jako serwera WWW używałem Cherokee, ale w końcu został usunięty z dystrybucji jako porzucony. Faktycznie, sporadyczne commity, bugi niepoprawione od lat… software przekroczył już termin przydatności.

Chwilę rozważałem, w którą stronę iść. Postanowiłem jednak uniknąć pułapki niszy i wybrać coś popularnego. Czyli dobry, sowiecki nginx.

Jedną z zalet Cherokee był klikalny (w formie strony web) konfigurator. Wadą był klikalny konfigurator, przez który plik konfiguracyjny miał format dla maszyn, a nie ludzi. Do migracji zaopatrzyłem się w przewodnik po dyrektywach Cherokee→nginx, ale zupełnie nie był potrzebny. Tekstowa konfiguracja nginx jest logiczna i przyjemna. Do tego jest apaczem naszych czasów, więc w necie są przykłady na praktycznie wszystko.

Przy okazji pozbyłem się też nghttpx. Nginx obsługuje HTTP/2 natywnie, a w konfiguracji łatwo mi było rozdzielić rzeczy wewnętrzne od tych dostępnych internetu. Win-win.

Aktualizacja dystrybucji poszła jak zwykle gładko, z drobnym wyjątkiem: PostgreSQL. Przy przejściu z wersji 11 na 12 przestają być obsługiwane tabele z oids. Miałem w swojej instacji kilka takich, jeszcze z czasów studiów (circa 20 lat temu). Po chwili deliberacji tabele wyrzuciłem – na co komu rezerwacje siłowni w DS 3 z początku wieku?

W Fedorze, gdy już mamy nową wersję PostgreSQL w systemie, do operacji na niezmigrowanej bazie trzeba użyć starych binariów. Czyli start za pomocą /usr/lib64/pgsql/postgresql-11/bin/postmaster -D /var/lib/pgsql/data, potem normalnie psql.

O temperaturze i dokładności


Za oknem ciepło i słonecznie, ale dzisiaj skupiłem się na temperaturze wewnątrz komputera. Wykresiki dot. dysku NVMe pokazywały takie dziwne, nieokrągłe końcówki:

# sensors nvme-*
nvme-pci-0100
Adapter: PCI adapter
Composite:    +36.9°C  (low  =  -0.1°C, high = +69.8°C)
                     (crit = +89.8°C)

Dokładnie to widać tu:

nvme-pci-0100
Composite:
  temp1_input: 36.850
  temp1_max: 69.850
  temp1_min: -0.150
  temp1_crit: 89.850
  temp1_alarm: 0.000

Co ciekawe, polecenie nvme smart-log /dev/nvme0 pokazuje „pełne” stopnie. Poprawienie wydruku lm_sensors jest trywialne, w konfiguracji wystarczy dopisać:

chip "nvme-pci-0100"
        # bump readings, all ends with *.85
        compute temp1   @+0.15, @-0.15

I od razu wartości wyglądają na bardziej ludzkie:

# sensors nvme-*
Composite:    +37.0°C  (low  =  +0.0°C, high = +70.0°C)
                       (crit = +90.0°C)

No dobrze. Ale dlaczego takie przesunięcie? Piętnaście setnych to nie jest np. ⅛, co od biedy możnaby podciągnąć pod zaokrąglenia bitowe.

Zacząłem od źródła, czyli specyfikacji Non-Volatile Memory Host Controller Interface Specification (NVMe). Stoi tam:

Composite Temperature: Contains a value corresponding to a temperature in degrees Kelvin that represents the current composite temperature of the controller and namespace(s).

Poza tym, że jest tu błąd – nie ma „stopni” Kelwina, są po prostu kelwiny – to zaczyna wyłaniać się logiczne rozwiązanie.

Jak wiadomo ze szkoły, początek skali, zero kelwinów to -273°C… nie! To -273,15°C. Dla wygody zazwyczaj pomijamy tę końcówkę. I stąd ta rożnica.

Szybkie spojrzenie w kod źródłowy wyjaśnia też różnice w prezentacji. nvme-cli operuje na liczbach całkowitych, odejmując od odczytanej ze sprzętu wartości 273, co daje temperaturę w stopniach Celsjusza.

Z kolei podsystem hwmon w Linuksie operuje na tysięcznych częściach stopnia, a do przeliczenia używane jest makro kelvin_to_millicelsius(). Oczywiście w tym przypadku końcówka piętnastu setnych jest stosowana. Niestety, dane wejściowe nie zapewniają wymaganej dokładności, i efekt jest nie do końca zadowalający. To taka ilustracja powiedzenia, że nadgorliwość gorsza od faszyzmu.

Bojkot Amazona


Amazon, firma najbogatszego czowieka świata, dostarcza ostatnio coraz więcej powodów do bojkotu. Napędza bezsensowny konsumpcjonizm, ale to nie jedyny grzech. W przejściowym okresie przed pełną robotyzacją wszystkiego zatrudnia ludzi (bądź zleca pracę ludziom). I traktuje ich kiepsko – żeby ratownik medyczny błądził po firmie 20 minut zanim trafił do poszkodowanej (która ostatecznie zmarła) – to skandaliczny, wręcza karalny poziom procedur BHP.

Nie jest to jednostkowy przypadek, raczej systematyczne podejście do zasobów^Wpracowników. Amazończycy w ramach protestu zwalniają się. Innym pozostaje bojkot.

Osobiście nie rozumiem sukcesu sklepu Amazona. Wyszukiwanie praktycznie nie działa, filtrów nie ma, pokazywana cena z dostawą potrafi drastycznie wzrosnąć po dodaniu do koszyka (albo nawet zalogowaniu się na konto!). Nic zachęcającego, a jednak są największym detalistą.

Bojkot Amazona ułatwia sama firma. Na stronie AWS IP address ranges wyszczególnione są wszystkie podsieci IP, które wystarczy zablokować na firewallu. Drobna trasformata pliku:

#!/usr/bin/python

import json

with open("ip-ranges.json", "r") as aws_ips:
    data = json.load(aws_ips)


for v4_net in data["prefixes"]:
    print(f"iptables --append AWS --source {v4_net['ip_prefix']} --match comment --comment {v4_net['region']} --jump koniec")


for v6_net in data["ipv6_prefixes"]:
    print(f"ip6tables --append AWS --source {v6_net['ipv6_prefix']} --match comment --comment {v6_net['region']} --jump koniec")

Wcześniej trzeba przygotować tablicę koniec, którą stosuje w celu poprawnego zamykania połączeń:

iptables --new koniec
iptables --append koniec --protocol tcp --jump REJECT --reject-with tcp-reset
iptables --append koniec --jump REJECT --reject-with icmp-port-unreachable

ip6tables --new koniec
ip6tables --append koniec --protocol tcp --jump REJECT --reject-with tcp-reset
ip6tables --append koniec --jump REJECT --reject-with icmp6-adm-prohibited

Teraz wystarczy to połączyć i dodać w tablicy FORWARD skok do AWS. I bum! Przestaje nam działać 1/3 internetu, w tym jakiś Netflix, Spotify, Adobe, Stripe i wiele innych. Prztykanie głównego gracz na rynku wiąże się z wyrzeczeniami.

Oszukany 😭


Lo and behold. Dałem się oszukać w internecie. Bycie kierownikiem zespołu IT w banku i picie wódki z Piotrem Koniecznym nie oznacza, że jestem odporny na na wszystki scamy.

Na OLX „zakupiłem” procesor, zapłaciłem, a kiedy upomniałem się o wysyłkę – konto sprzedającego już nie istniało. Email który mi podał również.

Patrząc wstecz, było kilka czerwonych flag, jednak i tak dałem się złapać. Na pewno moją czujność obniżyły: 100% sukcesów w dotychczasowych transakcjach na OLX i emocjonalne podejście „niezła okazja, trzeba brać”. Natomiast powinienem zwrócić uwagę na:

  • cena niższa o ok. 10% niż podobnych ogłoszeń; niby nic, zwłaszcza przy używanym CPU sprzed 7 lat, ale kieruje uwagę wprost na ogłoszenie oszusta
  • podane w opisie kontakt tylko przez OLX i brak telefonu; oszustowi ułatwia prowadzenie równocześnie wielu wałków, nam utrudnia weryfikację. Policja też wydaje się być bardziej obeznana z uzyskiwaniem danych klienta od telekomów, niż z serwisów internetowych
  • płatność przez PayPal i prośba o zaznaczenie opcji "przesyłam pieniądze znajomemu" aby uniknąć prowizji. Co jeszcze powoduje ta opcja? Brak możliwości założenia sporu via PayPal, bo to przecież nie sprzedaż tylko kasa dla ziomka. Podobnie, Policja rozumie płatność kartą i przelewy z konta, ma gotowe formularze na zwolnienie z tajemnicy bankowej, ale użycie pośredników płatniczych zbija z pantałyku

Oszustwo zgłosilem na komisariacie, potwierdzenie wysłałem z opisem sytuacji do OLX (mają więcej danych i mogą zablokować telefon/IP/tokeny/cokolwiek oszusta). Zgłoszenie chargeback w banku wymagało najwięcej zachodu, bo w BNP Paribas w dwóch oddziałach nie przyznają się do znajomości tego trybu. Dostałem kartkę A4 na której opisałem sytuację i zażądałem chargeback, teraz czekam.

Miejcie oczy otwarte i niech się komuś nie wydaje, że skoro klika w internety od 25 lat, to nie sposób go oszukać.

Projekt Gom Dżabbar


Jakby ktoś nie wiedział (impossible!) to w tym roku będzie miał premierę film Diuna, reżyserem jest Denis Villeneuve (pan zrobił Arrival, Blade Runner 2049, Sicario itp).

Oryginalny sześcioksiąg Diuny przeczytałem dwa razy; najpierw w okolicach 7. klasy podstawówki, natomiast drugie podejście piętnaście lat temu. Wychowalem sie na tym uniwersum: Dune 2 (The Building of a Dynasty… wciąż słyszę The planet Arrakis, known as Dune z intra), książkach i filmie Lyncha. Może by sobie odświeżyć?

(nota bene, przed Lynchem Diunę próbował ekranizować Alejandro Jodorowsky. Nie udało się, ale ekipa wzięła przygotowane pomysły i stylistykę i poszła nakręcić Obcego w 1979).

Wracając do książek. Oryginalną serię dokończył syn Franka Herberta z kolegą, dopisując Hunters of Dune oraz Sandworms of Dune. Tych jeszcze nie czytałem, więc również trafiły do kolejki. Ale poza sequelami powstało też kilka prequeli. Czyż więc wspaniałym pomysłem nie byłoby przeczytanie wszystkiego w kolejności wydarzeń w uniwersum? Tak jak zrobiłem np. z cyklem Fundacji czy Enderem? W internetach można znaleźć pomocną listę z chronologią. Tak zrodził się mój prywatny Projekt Gom Dżabbar.

Na razie przeczytałem 3,5 książki oraz 3 opowiadania. Recenzje (o ile miałem siłę) znajdują się na Lubimy Czytać. Ogólnie – dramat, głównie fabularnie, warsztatowo też słabo. Z niecierpliwością wyczekuję, aż dobrnę do oryginałów Herberta. Na razie kryptonim projektu oddaje w 100% odczucia towarzyszące czytaniu książek autorstwa Briana Herberta i Kevina J. Andersona.

Do premieru filmu zostało 10 miesięcy i 4 dni.

W 2019 nastąpił koniec


Nastąpił koniec sporej liczby seriali. Nie przypominam sobie roku z aż taką kumulacją finałów. A pożegnaliśmy się m. in. z:

  • The Affair – ciekawy eksperyment z pokazywaniem tych samych wydarzeń z różnych perspektyw dał radę na 5 sezonów
  • The Big Bang Theory
  • Designated Survivor – pomysł OK, dalej niestety generic political procedural
  • Elementary
  • Man in the High Castle
  • Mr Robot
  • Game of Thrones – meh
  • Orange is the New Black – everybody loses
  • Preacher
  • Silicon Valley – końcówka bardziej smutna niż śmieszna
  • Suits – tu był nawet jeden odcinek, w którym wszyscy nazwzajem na siebie NIE krzyczeli

Zakończył się też wielki, 11-letni rozdział z Avengers. W sumie dobrze, bo trudno odcinki marvelowego film-serialu odróżnić od siebie, a i Tony Stark już nie taki żywy jak na początku.

Time needed to dist-upgrade Fedora


Every couple of months I upgrade my main home computer to the latest Fedora. As this process is not instantaneous, this means some time without internet, wifi, smart home controls etc. This time I decided to measure how long it takes exactly.

Hardware is mid-range home server: Core i5 CPU, 16GiB of RAM, storage is 2x HDD in btrfs raid1, over LUKS, bcached on NVMe drive.

I've used dnf system-upgrade to download packages, then I rebooted and started counting time.

Wallclock Time since start Time Δ Phase
10:50
System booted. This will take a while displayed.
11:06 16m +16m Upgrade started. 5294 steps to finish.
11:23 33m +17m First thousand steps done.
11:41 51m +18m Second thousand steps done.
11:59 1h09m +18m Third thousand steps done.
12:11 1h21m +12m Fourth thousand steps done.
12:26 1h36m +15m Fifth thousand steps done.
12:29 1h39m +3m 5294 steps done. Running scriptlets begin.
12:31 1h41m +2m Scriptlets done. Verification begin.
12:36 1h46m +5m Verification done. No messages for few minutes.
12:42 1h52m +6m Upgrade done, rebooting.

Basically, full distribution upgrade from Fedora 30 to 31 takes about 2 hours. This is with bcache mode set to writeback. With safer writethrough, upgrade takes couple more hours, but I don't have specific number.

It's election time in Fedora-land


It's time to influence the course of our beloved project – Fedora Linux. Before 5th of December 2019 we have a chance to select people for:

  • Fedora Engineering Steering Committee (FESCo)
  • Fedora Council
  • Mindshare (community groomers)

So, go read candidate interviews at Community Blog, think about them and cast the vote at https://elections.fedoraproject.org/

Over few iterations, I've noticed that my choice is little influenced by the interviews; I put more weight to what I remember about individuals from the mailing list traffic. I mean mainly fedora-devel, although I follow -infrastructure and -server, too. That in turns means, I won't be voting for Haralds, Kevins and Johns juniors haunting those lists, no matter how awesome their interview may be. Abrasive people should be extinguished, not promoted.

There's a minority of people I know personally. Often I do respect their skills, so Zbigniew got my vote.

But over the last few elections, interviews gave me hints who not to vote for. Candidate putting too much weight on modularity raises a red flag, and quickly falls into “do not vote” bucket.

There's a lot to unpack why modularity was like a sand thrown into Fedora's gears. Mailing list threads reached Debian's proportions, overshadowing discussions we had when we were considering systemd. Hard to read them all. Here's a shortcut – go read excellent Fedora's modularity mess at LWN.net. This summary is prime example of LWN's high writing standard. I urge you to pay for subscription to LWN – it's really worth it.

https://badges.fedoraproject.org/pngs/ivoted-f31.png

OpenShift's haproxy as IPv6 ingress


Kubernetes networking always struck me as some PoC mistakenly put into production. Among questionable design choices, Internet Protocol version 6 is hardly supported. But when using OpenShift's default router – haproxy – you can easily handle IPv6 at your ingress.

With recent version is even easier than before. I've started following Customizing HAProxy Router Guide, but after extracting config template I've discovered that all the ground work has been prepared already, for v3.7 and up.

OpenShift's HAProxy container reacts to ROUTER_IP_V4_V6_MODE environment variable. When set to v4v6, the router will gladly accept connections in both IP versions, legacy and v6.

You should oc -n default edit dc/router and in the long block of envvars add this:

- name: ROUTER_IP_V4_V6_MODE
  value: "v4v6"

While editing this, you may want to add ROUTER_ENABLE_HTTP2=true, too.

Gdzie się podziało to pół roku…


Huh. Ostatnie sześć miesięcy zniknęło mi nie wiem gdzie.

Po części to wina zmian zawodowych. Powiedziałem YOLO, wyszedłem poza strefę komfortu, i od lipca dołożyłem sobie obowiązków. Teraz jestem Head of DevOps w naszym kawałku NRD, czyli w Group Data Management Office. Dalej robię jakieś automatyzacje przy Big Data, chociaż bardziej to mój zespół robi. I pamiętajcie dzieci, DevOps to podejście, nie stanowisko.

Strava uprzejmie wypomniała mi, jak się zapuściłem. Dostałem świetny filmik z żałosnymi wynikami. A przeniesienie biura do Gdyni bardzo źle odbiło się na wspinaczce w Elewatorze. Wstyd.

Czas zjadła mi też nauka i certyfikacja. Certified Kubernetes Administrator, Certified Specialist in OpenShift Administration, SAFe Advanced Scrum Master (no joke!).

Pilnowanie fachowca urządzającego mieszkanie, oraz związane z tym wcześniejsze przygotowania też zabrały swoje.

A na koniec roku mały sukces. W końcu, po raz pierwszy udało mi się wylądować w F29 Retaliator. Wcześniej chyba się po prostu nie przykładałem.

F29 na lotnisku

Tak, po 25 latach od kiedy pierwszy w to zagrałem. Kolejny cel: wylądowanie w T.F.X.