<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>manintheit.org</title>
        <description>Nomod is a multipurpose Jekyll blog theme</description>
        <link>http://0.0.0.0:4000/</link>
        <atom:link href="http://0.0.0.0:4000/feed.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Wed, 25 Feb 2026 21:13:40 +0000</pubDate>
        <lastBuildDate>Wed, 25 Feb 2026 21:13:40 +0000</lastBuildDate>
        <generator>Jekyll v4.4.1</generator>
        
            <item>
                <title>NixOS</title>
                <description>&lt;style&gt;

.p1 {
  font-family: &quot;Graphik Web&quot;;
}

div.first {
    line-height: 1.4em;
}

div.first:first-letter {
    font-size: 4.8em;
    float: left;
    margin-top: 0.10em;
}

&lt;/style&gt;

&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class=&quot;first&quot;&gt;&lt;span class=&quot;second&quot;&gt;T&lt;/span&gt;

     the emergence of Docker and Kubernetes was a massive leap in how we build and deploy software. They accelerated the shift from monolithic applications to microservices architectures and fundamentally changed deployment strategies.

    For the first time, we could package an application together with its runtime and dependencies into a container image. When built correctly (with pinned base images and fixed versions), that image behaves deterministically.

&lt;br /&gt;&lt;br /&gt;

    However, our development machines remains far from this. Traditional Linux distributions such as Ubuntu or Red Hat Enterprise Linux use mutable package management systems. They install packages into a global filesystem, resolve dependencies dynamically, and depend on the current state of remote repositories. That means it does NOT guarantee you will get the same package version, when you try to install the same package after a month or a year. Reproducing the same environment is diffucult, unless you have `Satellite` or `Foreman` like system management tools.

&lt;br /&gt;&lt;br /&gt;

    This is where NixOS comes into play. NixOS is immutable Linux distribution which allows us to define our sytem configurations as code. When your system configuration is declared declaratively, every rebuild produces the same result — consistently, predictably, and reproducibly.

&lt;br /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Feature&lt;/th&gt;
      &lt;th&gt;Traditional Linux (Ubuntu/RHEL)&lt;/th&gt;
      &lt;th&gt;NixOS&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;State Management&lt;/td&gt;
      &lt;td&gt;Imperative (Manual changes)&lt;/td&gt;
      &lt;td&gt;Declarative (Config files)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;File System&lt;/td&gt;
      &lt;td&gt;Mutable (Files can be changed)&lt;/td&gt;
      &lt;td&gt;Immutable (Read-only /nix/store)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Reproducibility&lt;/td&gt;
      &lt;td&gt;Low (Depends on install timing)&lt;/td&gt;
      &lt;td&gt;High (Guaranteed by hashes)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Rollbacks&lt;/td&gt;
      &lt;td&gt;Difficult / Manual&lt;/td&gt;
      &lt;td&gt;Atomic (Instant via Boot Menu)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Under the hood, packages&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;stored in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/nix/store&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Each build is content-adddressed and hashed.&lt;/li&gt;
  &lt;li&gt;Dependencies are isolated.&lt;/li&gt;
  &lt;li&gt;System generations are atomic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Above features provides us following advantages&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Reproducibility&lt;/li&gt;
  &lt;li&gt;Rollbacks&lt;/li&gt;
  &lt;li&gt;Isolation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NixOS has its own programming language. At first glance, it may seem unusual or even intimidating. However, once you become familiar with it, you realize it is a powerful tool for defining system configuration in a precise and reproducible way.&lt;/p&gt;

&lt;p&gt;There is definitely a learning curve when it comes to understanding the Nix language and the core NixOS concepts. However, once you become familiar with overlays, modules, and Home Manager, things start to feel much more intuitive.&lt;/p&gt;

&lt;p&gt;I’m still learning and exploring NixOS myself. I have to admit that the configuration I’m sharing below may be far from best practices. As I continue learning, I plan to refine and improve it over time.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/yilgo/nix-files&quot; target=&quot;_blank&quot;&gt;Mine&lt;/a&gt;: I am using NixOS on my local machine and I have defined my system configuration as code. I am using it to manage my development environment and to ensure that I have the same environment on all my machines.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/mitchellh/nixos-config&quot; target=&quot;_blank&quot;&gt;Michellh&lt;/a&gt;: He is one of creator of Vagrant, Packer and Terraform.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</description>
                <pubDate>Tue, 24 Feb 2026 21:00:00 +0000</pubDate>
                <link>http://0.0.0.0:4000/nixos</link>
                <guid isPermaLink="true">http://0.0.0.0:4000/nixos</guid>
                
                <category>nixos</category>
                
                
            </item>
        
            <item>
                <title>Longhorn on Talos Linux</title>
                <description>&lt;style&gt;

.p1 {
  font-family: &quot;Graphik Web&quot;;
}

div.first {
    line-height: 1.4em;
}

div.first:first-letter {
    font-size: 4.8em;
    float: left;
    margin-top: 0.10em;
}

&lt;/style&gt;

&lt;div class=&quot;first&quot;&gt;&lt;span class=&quot;second&quot;&gt;I&lt;/span&gt;

    am using Talos Linux as my main operating system for Kubernetes clusters. Talos is a modern, secure, and minimal operating system designed specifically for running Kubernetes. Since it does not have a package manager, adding additional packages a bit different procedure than traditional Linux distributions.

    In this blog post, I will walk you through how to setup Longhorn on Talos Linux so that your stateful workload can run happily.
&lt;br /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;add-extensions-to-talos-linux&quot;&gt;Add Extensions to Talos Linux&lt;/h3&gt;
&lt;p&gt;Since we are deploying Longhorn, we need to add necessary packages to Talos Linux. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iscsi-tools&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;util-linux-tools&lt;/code&gt; are the required packages for Longhorn to work properly on Talos Linux.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# extensions.yaml
customization:
  systemExtensions:
    officialExtensions:
      - siderolabs/iscsi-tools
      - siderolabs/util-linux-tools
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-X&lt;/span&gt; POST &lt;span class=&quot;nt&quot;&gt;--data-binary&lt;/span&gt; @extensions.yml https://factory.talos.dev/schematics
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;id&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;613e1592b2da41ae5e265e8789429f22e121aab91cb4deb6bc3c0b6262961245&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;add-extensions-to-talos-linux-1&quot;&gt;Add Extensions to Talos Linux&lt;/h3&gt;

&lt;p&gt;Do not forget to add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--preserve&lt;/code&gt; flag.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
talosctl upgrade &lt;span class=&quot;nt&quot;&gt;--nodes&lt;/span&gt; 10.181.176.4 &lt;span class=&quot;nt&quot;&gt;--image&lt;/span&gt; factory.talos.dev/metal-installer/613e1592b2da41ae5e265e8789429f22e121aab91cb4deb6bc3c0b6262961245:v1.11.1 &lt;span class=&quot;nt&quot;&gt;--preserve&lt;/span&gt;
talosctl upgrade &lt;span class=&quot;nt&quot;&gt;--nodes&lt;/span&gt; 10.181.176.5 &lt;span class=&quot;nt&quot;&gt;--image&lt;/span&gt; factory.talos.dev/metal-installer/613e1592b2da41ae5e265e8789429f22e121aab91cb4deb6bc3c0b6262961245:v1.11.1 &lt;span class=&quot;nt&quot;&gt;--preserve&lt;/span&gt;
talosctl upgrade &lt;span class=&quot;nt&quot;&gt;--nodes&lt;/span&gt; 10.181.176.6 &lt;span class=&quot;nt&quot;&gt;--image&lt;/span&gt; factory.talos.dev/metal-installer/613e1592b2da41ae5e265e8789429f22e121aab91cb4deb6bc3c0b6262961245:v1.11.1 &lt;span class=&quot;nt&quot;&gt;--preserve&lt;/span&gt;
talosctl upgrade &lt;span class=&quot;nt&quot;&gt;--nodes&lt;/span&gt; 10.181.176.7 &lt;span class=&quot;nt&quot;&gt;--image&lt;/span&gt; factory.talos.dev/metal-installer/613e1592b2da41ae5e265e8789429f22e121aab91cb4deb6bc3c0b6262961245:v1.11.1 &lt;span class=&quot;nt&quot;&gt;--preserve&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;adding-block-disks-to-your-worker-nodes&quot;&gt;Adding Block Disks to your Worker Nodes&lt;/h3&gt;

&lt;p&gt;Adding block disks to varies based on your virtualization platform or cloud provider. Since I am using incus for my lab , procedure as follows.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
incus storage volume create pool-nvme-samsung-lvm lh-w0 &lt;span class=&quot;nv&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;200GiB  &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;block
incus storage volume create pool-nvme-samsung-lvm lh-w1 &lt;span class=&quot;nv&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;200GiB  &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;block
incus storage volume create pool-nvme-samsung-lvm lh-w2 &lt;span class=&quot;nv&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;200GiB  &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;block

incus config device add talos-w0 lh-w0 disk &lt;span class=&quot;nv&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;pool-nvme-samsung-lvm &lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;lh-w0
incus config device add talos-w1 lh-w1 disk &lt;span class=&quot;nv&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;pool-nvme-samsung-lvm &lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;lh-w1
incus config device add talos-w2 lh-w0 disk &lt;span class=&quot;nv&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;pool-nvme-samsung-lvm &lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;lh-w2

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;verify-the-block-devices-on-talos-linux&quot;&gt;Verify the Block Devices on Talos Linux&lt;/h3&gt;

&lt;p&gt;You can run the following command for each of nodes you want to add block devices for Longhorn usage.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;root@debian-vm:~# talosctl get volumestatus &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; 10.181.176.5
NODE           NAMESPACE   TYPE           ID                                  VERSION   TYPE        PHASE   LOCATION    SIZE
10.181.176.5   runtime     VolumeStatus   /dev/sdb-1                          2         partition   ready   /dev/sdb1   215 GB
...&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;omitted&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;patch-the-machine-config&quot;&gt;Patch the Machine Config&lt;/h3&gt;
&lt;p&gt;You need to patch the worker nodes with the following maching config in order to mount the block devices properly for Longhorn usage.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# patch.yml&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;machine&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;kubelet&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;extraMounts&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;destination&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/var/mnt/storage/longhorn&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bind&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/var/mnt/storage/longhorn&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bind&lt;/span&gt;
          &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rshared&lt;/span&gt;
          &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rw&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;disks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;device&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/dev/sdb&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;partitions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;mountpoint&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/var/mnt/storage/longhorn&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;TALOSCONFIG&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;~/talosconfig
talosctl patch mc &lt;span class=&quot;nt&quot;&gt;--nodes&lt;/span&gt; 10.181.176.5  &lt;span class=&quot;nt&quot;&gt;--patch&lt;/span&gt; @patch.yml  &lt;span class=&quot;c&quot;&gt;# do it for each worker nodes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;root@debian-vm:~# talosctl get discoveredvolumes &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; 10.181.176.5
NODE           NAMESPACE   TYPE               ID      VERSION   TYPE        SIZE     DISCOVERED   LABEL       PARTITIONLABEL
...&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;omitted&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;...
10.181.176.5   runtime     DiscoveredVolume   sdb     1         disk        215 GB   gpt
10.181.176.5   runtime     DiscoveredVolume   sdb1    1         partition   215 GB   xfs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;root@debian-vm:~# talosctl get mountstatus &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; 10.181.176.5
NODE           NAMESPACE   TYPE          ID                                  VERSION   SOURCE      TARGET                              FILESYSTEM   VOLUME
10.181.176.5   runtime     MountStatus   /dev/sdb-1                          2         /dev/sdb1   /var/mnt/storage/longhorn           xfs          /dev/sdb-1
...&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;omitted&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;install-longhorn-via-helm&quot;&gt;Install Longhorn via Helm&lt;/h3&gt;

&lt;p&gt;You can install Longhorn via Helm as usual. With exception, you need to label &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;longhorn-system&lt;/code&gt; namespace with privileged pod security policy.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Namespace&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;longhorn-system&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;pod-security.kubernetes.io/enforce&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;privileged&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;pod-security.kubernetes.io/audit&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;privileged&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;pod-security.kubernetes.io/warn&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;privileged&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
helm repo add longhorn https://charts.longhorn.io

helm repo update

helm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;longhorn longhorn/longhorn &lt;span class=&quot;nt&quot;&gt;--namespace&lt;/span&gt; longhorn-system &lt;span class=&quot;nt&quot;&gt;--create-namespace&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--set&lt;/span&gt; defaultSettings.defaultDataPath&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/var/mnt/storage/longhorn&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--version&lt;/span&gt; 1.10.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

</description>
                <pubDate>Sun, 23 Nov 2025 08:00:00 +0000</pubDate>
                <link>http://0.0.0.0:4000/longhorn-on-talos-linux</link>
                <guid isPermaLink="true">http://0.0.0.0:4000/longhorn-on-talos-linux</guid>
                
                <category>kubernetes</category>
                
                <category>talos</category>
                
                <category>longhorn</category>
                
                <category>storage</category>
                
                
            </item>
        
            <item>
                <title>Git Pre-commit</title>
                <description>&lt;style&gt;

.p1 {
  font-family: &quot;Graphik Web&quot;;
}

div.first {
    line-height: 1.4em;
}

div.first:first-letter {
    font-size: 4.8em;
    float: left;
    margin-top: 0.10em;
}

&lt;/style&gt;

&lt;div class=&quot;first&quot;&gt;&lt;span class=&quot;second&quot;&gt;W&lt;/span&gt;

    hether you are doing Software development or writing Infrastructure code in a team, it is of utmost importance
    to define some standards for the codebase. There are plenty of plugins for code linting, formatting and much more integrated with IDEs such as VSCode, JetBrains etc.

    But the problem is that everyone has their own IDE setup. For example, some developers add config to &quot;delete trailing spaces&quot;, while others do not. Secondly, not every developer uses the same IDE.

    In order to eliminate such problems, Git pre-commit hooks can be useful. Even though people on the Internet have different opinions,
    I am going to list some benefits of it.
&lt;br /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Allows developers to see and fix their code almost instantly.&lt;/li&gt;
  &lt;li&gt;It keeps the codebase clean and standardized independently of the IDE being used.&lt;/li&gt;
  &lt;li&gt;Besides linting, it also performs secret checks and many other things…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, using it intensively could disrupt the developer’s workflow. It can shift their focus from bug fixing and adding new features to
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;linting&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In this blog post, I will walk you through, how we can add pre-commit hooks to our IaC &lt;img src=&quot;/images/terraform-favicon.png&quot; alt=&quot;tf-favicon&quot; /&gt; codebase.&lt;/p&gt;

&lt;h3 id=&quot;install-pre-commit&quot;&gt;Install pre-commit&lt;/h3&gt;

&lt;p&gt;Since pre-commit written in python you need to install the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pre-commit&lt;/code&gt; module.&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;pre-commit

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;add-a-pre-commit-configuration&quot;&gt;Add a pre-commit Configuration&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;create  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.pre-commit-config.yaml&lt;/code&gt; file. For demonstration purposes, I will add some basic hooks such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;check-yaml&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;end-of-file-fixer&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trailing-whitespace&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;terraform_fmt&lt;/code&gt; hook to format terraform files.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;repos&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;https://github.com/pre-commit/pre-commit-hooks&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;rev&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v6.0.0&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;hooks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt;   &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;check-yaml&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt;   &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;end-of-file-fixer&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt;   &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;trailing-whitespace&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;https://github.com/antonbabenko/pre-commit-terraform&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;rev&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v1.103.0&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;hooks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;terraform_fmt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After add the configuration file, next step to instruct pre-commit to install the hooks.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pre-commit &lt;span class=&quot;nb&quot;&gt;install
&lt;/span&gt;pre-commit installed at .git/hooks/pre-commit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;using-pre-commit&quot;&gt;Using pre-commit&lt;/h3&gt;

&lt;p&gt;In this example, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;variables.tf&lt;/code&gt; file generated and some variables are defined. Of course without any linting.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pre-commit run
check yaml...........................................&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;no files to check&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;Skipped
fix end of files.........................................................Passed
trim trailing whitespace.................................................Passed
Terraform fmt............................................................Failed
- hook &lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;: terraform_fmt
- files were modified by this hook

variables.tf

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you see above, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;terraform_fmt&lt;/code&gt; hook has failed because the file is not formatted well. At first run it failed but plugin has fixed the file.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
index 6b70073..3f21cc1 100644
&lt;span class=&quot;nt&quot;&gt;---&lt;/span&gt; a/terraform/variables.tf
+++ b/terraform/variables.tf
@@ &lt;span class=&quot;nt&quot;&gt;-1&lt;/span&gt;,5 +1,5 @@
 variable &lt;span class=&quot;s2&quot;&gt;&quot;environment&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
-  &lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt;          &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; string
+  &lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; string
 &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can now add it to the staging area and run the pre-commit again.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pre-commit run
check yaml...........................................&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;no files to check&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;Skipped
fix end of files.........................................................Passed
trim trailing whitespace.................................................Passed
Terraform fmt............................................................Passed

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;At this time no issue detected. By the way, you can also run pre-commit for all files in the repository.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pre-commit run &lt;span class=&quot;nt&quot;&gt;--all-files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;tip&quot;&gt;Tip:&lt;/h3&gt;

&lt;p&gt;You can still bypass the hooks.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;I will fix it next time&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--no-verify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For more information you can check following urls about the pre-commit.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;https://git-scm.com/book/ms/v2/Customizing-Git-Git-Hooks&lt;/li&gt;
  &lt;li&gt;https://pre-commit.com/&lt;/li&gt;
  &lt;li&gt;https://github.com/antonbabenko/pre-commit-terraform&lt;/li&gt;
&lt;/ul&gt;

</description>
                <pubDate>Sat, 25 Oct 2025 08:00:00 +0000</pubDate>
                <link>http://0.0.0.0:4000/precommit</link>
                <guid isPermaLink="true">http://0.0.0.0:4000/precommit</guid>
                
                <category>git</category>
                
                
            </item>
        
            <item>
                <title>Upgrade Openshift Cluster Logging Operator from 5 to 6</title>
                <description>&lt;p&gt;Before jumping directly into the upgrade, it’s worth highlighting a few important points.
This blog post is not only about upgrading the OpenShift Logging Operator — it also covers how to continue sending logs without disrupting external systems that use Fluentd Forward.&lt;/p&gt;

&lt;p&gt;To achieve this, we’ll introduce an additional Aggregator component (via Log Forwarding), shown in the diagram below. This component receives OpenShift/Kubernetes logs over HTTP, applies necessary transformations, and then forwards them to external logging systems — such as those using Fluentd Forward or SIEM solutions like Splunk.&lt;/p&gt;

&lt;p&gt;In this upgrade approach, we won’t be performing a direct upgrade from version 5.x to 6.x.Instead, we’ll remove the OpenShift Logging Operator 5 and install the OpenShift Cluster Logging Operator 6 from scratch.&lt;/p&gt;

&lt;p&gt;Also, note that we won’t deploy the full Operator stack (which includes the LokiStack for log storage).
This post focuses only on the collector and forwarder components. The Loki setup will be covered in a separate blog post.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Only update to an N+2 version, where N is your current version. For example, if
you are upgrading from Logging 5.8, select stable-6.0 as the update channel.
Updating to a version that is more than two versions newer is not supported.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Upgrading the OpenShift Logging Operator from version 5.x to 6.x introduces several breaking changes due to significant technological and architectural updates in the operator. Some of the key changes are listed below.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Only supported collector agent now is vector. So, fluentd is not supported anymore.&lt;/li&gt;
  &lt;li&gt;Since fluentd is not a supported collector Fluentdforward is not available as output type.&lt;/li&gt;
  &lt;li&gt;Elasticsearch is replaced with Loki&lt;/li&gt;
  &lt;li&gt;Kibana is replaced with the UIplugin provided by COO.&lt;/li&gt;
  &lt;li&gt;The API for log collection is changed from logging.openshift.io to observability.openshift.io.&lt;/li&gt;
  &lt;li&gt;ClusterLogForwarder and ClusterLogging have been combined under the ClusterLogForwarder resource in the new API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As mentioned at the beginning of this post, with the upgrade to Logging Operator 6, FluentdForward is no longer an available output type.&lt;/p&gt;

&lt;p&gt;If you still rely on FluentdForward for external integrations, there’s a workaround using the LogForwarding component. You can think of this component as a log aggregator and routing layer — it collects logs, processes them, and forwards them to external systems while maintaining compatibility with existing Fluentd-based setups.&lt;/p&gt;

&lt;h2 id=&quot;uninstall-openshift-logging-operator-5&quot;&gt;Uninstall Openshift Logging Operator 5&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Do not to forget to make backup of resources before deleting CRDs other definitions deleted below.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;oc &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; openshift-logging delete subscription cluster-logging
oc &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; openshift-logging delete operatorgroup openshift-logging
oc &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; openshift-logging delete clusterserviceversion cluster-logging&amp;lt;old-version&amp;gt;


oc delete crd clusterlogforwarders.logging.openshift.io
oc delete crd clusterloggings.logging.openshift.io
oc delete crd logfilemetricexporters.logging.openshift.io

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;install-openshift-logging-operator-6&quot;&gt;Install OpenShift Logging Operator 6&lt;/h2&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;operators.coreos.com/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;OperatorGroup&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;openshift-logging&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;openshift-logging&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;targetNamespaces&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;openshift-logging&lt;/span&gt;


&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;operators.coreos.com/v1alpha1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Subscription&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;cluster-logging&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;openshift-logging&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;stable-6.0&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;installPlanApproval&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Automatic&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;cluster-logging&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;redhat-operators&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;sourceNamespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;openshift-marketplace&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;startingCSV&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;cluster-logging.v6.0.7&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Create necessary service account and assign necessary ClusterRoles to the Service Account.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;oc create sa logging-collector &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; openshift-logging

oc adm policy add-cluster-role-to-user collect-application-logs &lt;span class=&quot;nt&quot;&gt;-z&lt;/span&gt; logging-collector &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt;
openshift-logging

oc adm policy add-cluster-role-to-user collect-audit-logs &lt;span class=&quot;nt&quot;&gt;-z&lt;/span&gt; logging-collector &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt;
openshift-logging

 oc adm policy add-cluster-role-to-user collect-infrastructure-log &lt;span class=&quot;nt&quot;&gt;-z&lt;/span&gt; logging-collector &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt;
openshift-logging

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;define-clusterlogforwarder-definition&quot;&gt;Define ClusterLogForwarder Definition&lt;/h2&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;observability.openshift.io/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ClusterLogForwarder&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;instance&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;openshift-logging&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;collector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;tolerations&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{}&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;inputs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;application&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ns1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ns1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;application&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;application&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ns2&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ns2&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;application&lt;/span&gt;

  &lt;span class=&quot;na&quot;&gt;outputs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://logforwarding.openshift-logging.svc:24224/kubernetes/var/log/pods/appgrp&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;appgrp&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://logforwarding.openshift-logging.svc:24224/kubernetes/var/log/pods/extlogging&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;externallogging&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://logforwarding.openshift-logging.svc:24224/kubernetes/splunk&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;splunk&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http&lt;/span&gt;

  &lt;span class=&quot;na&quot;&gt;pipelines&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;inputRefs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;audit&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;audit&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;outputRefs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;splunk&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;inputRefs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;infrastructure&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;infrastructure&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;outputRefs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;splunk&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;inputRefs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;application&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;application&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;outputRefs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;splunk&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;inputRefs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ns1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ns1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;outputRefs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;appgrp&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;inputRefs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ns2&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ns2&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;outputRefs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;appgrp&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;externallogging&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;serviceAccount&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;logging-collector&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;deploy-logforwarding-component&quot;&gt;Deploy Logforwarding Component&lt;/h2&gt;

&lt;p&gt;The LogForwarding component is not part of the Cluster Logging Operator. Instead, it serves as a separate log aggregation and forwarding layer that can send logs over various protocols.&lt;/p&gt;

&lt;p&gt;Since the new Logging Operator no longer supports FluentdForward, this component will receive logs over HTTP and forward them using your desired protocols.&lt;/p&gt;

&lt;p&gt;You can easily deploy this component using a Helm chart or a simple YAML definition. In this post, I’ll share only the ConfigMap definition for the Fluentd configuration.&lt;/p&gt;

&lt;p&gt;If your environment handles a large volume of logs or requires high throughput, consider using Fluent Bit instead of Fluentd for better performance.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/ocp-cluster-logging6.webp&quot; alt=&quot;LogForwarding&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;na&quot;&gt;fluent.conf&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&amp;lt;system&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;log_level info&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&amp;lt;/system&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;s&quot;&gt;&amp;lt;source&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;@type  http&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;@id    input1&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;port  24224&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;bind 0.0.0.0&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&amp;lt;/source&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;s&quot;&gt;&amp;lt;filter kubernetes.var.log.pods.appgrp&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;@type record_transformer&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;enable_ruby&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;lt;record&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;time-filename ${Time.new.strftime(&quot;%Y%m%d_%H%M&quot;)}&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;lt;/record&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&amp;lt;/filter&amp;gt;&lt;/span&gt;


    &lt;span class=&quot;s&quot;&gt;&amp;lt;filter kubernetes.var.log.pods.extlogging&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;@type record_transformer&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;remove_keys $.kubernetes.annotations&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&amp;lt;/filter&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;s&quot;&gt;&amp;lt;match kubernetes.var.log.pods.appgrp&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;@type rewrite_tag_filter&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;lt;rule&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;key $.kubernetes.namespace_name&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;pattern ^(.+)$&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;tag $1.${tag}&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;s&quot;&gt;&amp;lt;match kubernetes.var.log.pods.extlogging&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;@type forward&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;@id upstream&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;transport tcp&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;require_ack_response true&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;lt;server&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;host extlogging.openshift-logging.svc&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;port 24224&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;lt;/server&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;lt;buffer&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;@type file&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;flush_interval 60s&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;flush_mode interval&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;flush_thread_count 2&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;overflow_action block&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;path /var/log/fluentd/extlogging-buffer&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;retry_max_interval 30&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;retry_max_times 3&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;retry_timeout 60s&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;retry_type exponential_backoff&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;total_limit_size 600m&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;lt;/buffer&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;s&quot;&gt;&amp;lt;match *.kubernetes.var.log.pods.appgrp&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;@type file&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;path /var/log/fluentd/backup/${tag[0]}/${tag[0]}.${$.time-filename}&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;compress gzip&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;lt;buffer tag,$.time-filename&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;@type file&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;flush_interval 300s&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;flush_mode interval&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;flush_thread_count 2&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;overflow_action block&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;path /var/log/fluentd/backup-buffer/${tag}/${tag}&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;retry_max_interval 30&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;retry_max_times 3&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;retry_timeout 60s&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;retry_type exponential_backoff&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;total_limit_size 600m&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;lt;/buffer&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;

   &lt;span class=&quot;s&quot;&gt;&amp;lt;match ** &amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;@type splunk_hec&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;protocol https&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;insecure_ssl &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;hec_host splunk&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;sourcetype &amp;lt;source type&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;source &amp;lt;your source&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;index &amp;lt;index&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;hec_port &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;443&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;hec_token &amp;lt;splunk token&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;host &quot;#{ENV[&apos;NODE_NAME&apos;]}&quot;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;lt;buffer&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;@type memory&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;chunk_limit_records &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;100000&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;chunk_limit_size 200m&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;flush_interval 5s&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;flush_thread_count &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;overflow_action block&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;retry_max_times &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;total_limit_size 600m&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&amp;lt;/buffer&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_openshift_logging/6.0/pdf/upgrading_logging/Red_Hat_OpenShift_Logging-6.0-Upgrading_logging-en-US.pdf&quot;&gt;RedHat&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://docs.fluentd.org&quot;&gt;FluentD&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</description>
                <pubDate>Sun, 12 Oct 2025 18:00:00 +0000</pubDate>
                <link>http://0.0.0.0:4000/upgrade-openshift-cluster-logging-operator</link>
                <guid isPermaLink="true">http://0.0.0.0:4000/upgrade-openshift-cluster-logging-operator</guid>
                
                <category>openshift</category>
                
                
            </item>
        
            <item>
                <title>How Fix Certificate Error on Azure Self-Hosted Agent</title>
                <description>&lt;p&gt;Working in a highly regulated corporate environment can often feel daunting, especially when it comes to connecting to the internet. Strict regulations, mandatory security inspections, proxy requirements, and self-signed certificates can all introduce unexpected challenges.&lt;/p&gt;

&lt;p&gt;In such environment, I ran into a problem during the execution of the following pipeline on a self-hosted agent. One part of the pipeline is to fetch a secret from a specified Azure Key Vault.&lt;/p&gt;

&lt;p&gt;Unfortunately, what should have been a straightforward task turned into a 30-minute troubleshooting session.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;self-managed-dev&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;AzureKeyVault@2&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;inputs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;azureSubscription&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;svc-azpipeline-vault-reader&apos;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;KeyVaultName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;lt;REDACTED&amp;gt;&apos;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;SecretsFilter&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;webhooktest&apos;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;RunAsPreJob&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Azure pipeline Definition&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;
...(omitted)
Downloading secret value for: webhooktest.
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#[error]Error while trying to get OIDC token: Error: unable to get local issuer certificate&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#[error]Error while trying to get OIDC token: Error: unable to get local issuer certificate&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#[error]Error while trying to get OIDC token: Error: unable to get local issuer certificate&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#[error]Error while trying to get OIDC token: Error: unable to get local issuer certificate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To make matters worse, the error logs were not very informative. Unless you explicitly enable diagnostic logs, the output doesn’t provide much detail about what’s really happening under the hood.&lt;/p&gt;

&lt;p&gt;Nevertheless, there’s a high chance that issues like this are related to TLS verification.&lt;/p&gt;

&lt;p&gt;After same search that Azure pipeline agent uses nodejs technology and it could the be the reason that nodejs does NOT use system CA certificate bundle, which is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/pki/tls/certs/ca-bundle.crt&lt;/code&gt; for RHEL based hosts.&lt;/p&gt;

&lt;p&gt;Following snippet of code also confirmed that, nodejs is not aware of any system ca-bundle location.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;&amp;lt;Agentfolder&amp;gt;&lt;/span&gt;./node &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;const tls = require(&quot;tls&quot;); console.log(tls.rootCertificates);&apos;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;undefined
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;According to nodejs documentation there is environment variable to define additional ca-bundle certificates.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;NODE_EXTRA_CA_CERTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/etc/pki/tls/certs/ca-bundle.crt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After updated the systemd service file definition and restart the service, on the self-hosted agent, it fetched the secrets successfully.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/systemd/system/azure-pipeline-agent.service&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Unit]
&lt;span class=&quot;nv&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;Azure Pipeline Agent
&lt;span class=&quot;nv&quot;&gt;After&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;network-online.target
&lt;span class=&quot;nv&quot;&gt;Wants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;network-online.target

&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1003
&lt;span class=&quot;nv&quot;&gt;ExecStart&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/home/user1/azure-agent/run.sh
&lt;span class=&quot;nv&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;NODE_EXTRA_CA_CERTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/etc/pki/tls/certs/ca-bundle.crt
&lt;span class=&quot;nv&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;http_proxy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://your-proxy:8080&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;https_proxy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://your-proxy:8080&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;no_proxy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;localhost,127.0.0.1&quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Install]
&lt;span class=&quot;nv&quot;&gt;WantedBy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;multi-user.target

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;NODE_EXTRA_CA_CERTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/etc/pki/tls/certs/ca-bundle.crt
systemctl daemon-reload
systemctl restart azure-pipeline-agent.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;Starting: AzureKeyVault
==============================================================================
Task         : Azure Key Vault
Description  : Download Azure Key Vault secrets
Version      : 1.259.2
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/deploy/azure-key-vault
==============================================================================
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;SubscriptionId: &amp;lt;REDACTED&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;Key vault name: &amp;lt;REDACTED&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;go&quot;&gt;Downloading secret value for: webhooktest.
Finishing: AzureKeyVault

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
                <pubDate>Sat, 13 Sep 2025 18:00:00 +0000</pubDate>
                <link>http://0.0.0.0:4000/how-fix-certificate-error-on-azure-self-hosted-agent</link>
                <guid isPermaLink="true">http://0.0.0.0:4000/how-fix-certificate-error-on-azure-self-hosted-agent</guid>
                
                <category>azure</category>
                
                
            </item>
        
            <item>
                <title>How to Make Simple IR Sender(Samsung TV)</title>
                <description>&lt;p&gt;Although Infrared (IR) technology might seem outdated in today’s world of smart homes and wireless everything, it’s far from obsolete. In fact, IR is still widely used in many household devices—most notably, televisions. Even with the growing presence of Android-based smart TVs, IR remains an inevitable part of device control.&lt;/p&gt;

&lt;p&gt;Most IR receivers are designed to detect signals modulated at 38 kHz. To be detected by the receiver, the IR signal must be modulated at (or very close to) 38 kHz.&lt;/p&gt;

&lt;p&gt;Interestingly, this particular IR sender transmits a modulated signal at 40 kHz, slightly above the more common 38 kHz. Using the formula &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;T = 1 / f&lt;/code&gt;, we can calculate the period of the signal:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;T = 1 / 40,000 Hz = 25 microseconds (µs)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This means each cycle consists of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;12.5 µs ON&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;12.5 µs OFF&lt;/code&gt;, forming the standard square wave used for modulation.&lt;/p&gt;

&lt;p&gt;Now, if you want to send a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4.5 ms&lt;/code&gt; burst at this frequency, you’d need to repeat this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;25 µs&lt;/code&gt; signal &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;180&lt;/code&gt; times:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;4.5 ms / 25 µs = 180 cycles&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ms&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4500&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;µ&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;4500&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;25&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;180&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;duration&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;){&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Set&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IR&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LED&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HIGH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;delay&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;µ&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IR&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LED&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LOW&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;delay&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;µ&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The IR sender that I built for Samsung TV . It has some similarities with NEC protocol but not exactly. It uses following pattern;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;9 ms. START Bit (4.5 milisecond ON , 4.5 milisecond OFF)&lt;/li&gt;
  &lt;li&gt;16 bit device code (0x0707)&lt;/li&gt;
  &lt;li&gt;A 16-bit command code typically consists of an 8-bit command followed by its 8-bit inverse (bitwise NOT).
Example: If the command is 0xA2, the inverse would be ~0xA2 = 0x5D, so the full 16-bit command becomes 0xA25D.&lt;/li&gt;
  &lt;li&gt;ON IR Led for 560 µs and then OFF&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Logic 1 (ON)- 560 µs HIGH, 1690 µs LOW&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Logic 0(OFF) – 560 µs HIGH, 560 µs LOW&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I am sharing you the schematic for IR Sender.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/schematic_IR_Sender_samsung.webp&quot; alt=&quot;Schematic&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can find my C code for IR sender in my &lt;a href=&quot;https://github.com/yilgo/PlatformIO/blob/main/samsungirsender/src/main.cpp&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt; repo.&lt;/p&gt;

&lt;p&gt;You can also find the Logic Analyzer capture in the same GitHub repo. In order to view the capture, you need a program, which you can download from &lt;a href=&quot;https://www.saleae.com/&quot; target=&quot;_blank&quot;&gt;Saleae&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The model I captured the traffic from IR remote control model: BN59-01198Q&lt;/p&gt;
</description>
                <pubDate>Sun, 03 Aug 2025 18:00:00 +0000</pubDate>
                <link>http://0.0.0.0:4000/how-to-make-simple-ir-sendersamsung-tv</link>
                <guid isPermaLink="true">http://0.0.0.0:4000/how-to-make-simple-ir-sendersamsung-tv</guid>
                
                <category>embedded_systems</category>
                
                
            </item>
        
            <item>
                <title>Hack Remote IR Controller with Logic Analyzer</title>
                <description>&lt;p&gt;A logic analyser is one of the cheapest and most powerful tools you can use in electronics. It helps you visualize how devices communicate — showing you logic levels, signal timing, and protocol data in a way that’s far more insightful than just reading datasheets.&lt;/p&gt;

&lt;p&gt;Although I’ve owned a logic analyzer for a while, I had never used it — until now.&lt;/p&gt;

&lt;p&gt;To analyse the IR remote control signals, I built a simple circuit on a breadboard. I’ve also shared the schematic below for reference.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/schematic_IR_Receiver.webp&quot; alt=&quot;Schematic&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After just a few keystrokes, I noticed that the Chinese remote sends each IR signal at least twice to the receiver.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/logic_analyzer_black.webp&quot; alt=&quot;Schematic&quot; /&gt;&lt;/p&gt;

&lt;p&gt;By analyzing the timing with a logic analyzer, I discovered that the remote uses the SIRC protocol. It transmits data at a frequency of 40kHz, following a consistent pattern:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Start bit: 2.4 ms&lt;/li&gt;
  &lt;li&gt;Logic 1: 1.2 ms HIGH + 0.6 ms LOW&lt;/li&gt;
  &lt;li&gt;Logic 0: 0.6 ms HIGH + 0.6 ms LOW&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s important to note that most &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IR receivers are active LOW&lt;/code&gt;, meaning they pull the signal LOW when they detect an IR pulse.&lt;/p&gt;

&lt;p&gt;Please &lt;a href=&quot;https://www.sbprojects.net/knowledge/ir/sirc.php&quot; target=&quot;_blank&quot;&gt;checkout&lt;/a&gt; the website for more information about SIRC and other IR communication protocols.&lt;/p&gt;

&lt;p&gt;Although modern homes often include advanced automation systems like Alexa or Google Home, I decided to go back to basics and write a simple C program to build a SIRC receiver. This receiver toggles relays (or in this case, an LED) based on IR commands—perfect for understanding how things work under the hood.&lt;/p&gt;

&lt;p&gt;You can check on my &lt;a href=&quot;https://github.com/yilgo/PlatformIO/blob/main/sirc/src/sirc_receiver.cpp&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt; repo to see 12 bit version of Sony SIRC protocol.&lt;/p&gt;

&lt;h2 id=&quot;experiment&quot;&gt;Experiment:&lt;/h2&gt;

&lt;p&gt;Here is the output of the Serial monitor. Current version of code supports only two keys combination, which are &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Channel +&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Channel -&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/vscode_sonysirc.webp&quot; alt=&quot;Schematic&quot; /&gt;&lt;/p&gt;
</description>
                <pubDate>Sun, 20 Jul 2025 18:00:00 +0000</pubDate>
                <link>http://0.0.0.0:4000/hack-ir-ir-receiver-with-logic-analyzer</link>
                <guid isPermaLink="true">http://0.0.0.0:4000/hack-ir-ir-receiver-with-logic-analyzer</guid>
                
                <category>embedded_systems</category>
                
                
            </item>
        
            <item>
                <title>My Repair Note on DC – AC Inverter</title>
                <description>&lt;blockquote&gt;
  &lt;p&gt;Dear blog readers before sharing my repair note, I want to make you aware that this activity involves working with high voltage, which can cause serious injury or death. Do not attempt this repair unless you are fully trained and understand the risks. Improper handling of electrical components can be fatal. Safety precautions, proper tools, and a deep understanding of what you’re doing are essential.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Proceed at your own risk.&lt;/p&gt;

&lt;p&gt;I wanted to share how I repaired an inverter that I had been using in my garden. The device had been out of service for quite some time, just sitting there unused. Luckily, I finally set aside some time to take a closer look at it.&lt;/p&gt;

&lt;p&gt;The first step was removing the front panel of the inverter. At first glance, I noticed something unusual — the blade fuses (the small green components) didn’t look quite right. Their color seemed off, which immediately raised a red flag.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/ac-dc-inverter.webp&quot; alt=&quot;Schematic&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After checked them closely, I clearly saw them they were blown out.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/melted_blade_fuse_green.webp&quot; alt=&quot;Schematic&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Nevertheless, I was able to see the value of current for the fuses. (35 A). So, new fuses were ordered on the Internet and replaced old ones with the new ones carefully. Be careful with the replacement… Make sure that no DC supply is provided to inverter and no stored voltage in the capacitors.&lt;/p&gt;

&lt;h2 id=&quot;testing&quot;&gt;Testing&lt;/h2&gt;

&lt;p&gt;It is now time for testing. As simple test, the inverter was supplied with small adjustable DC Power supply at 14V. As result, provided DC and current is enough to produce AC 220 Voltage to drive small RGB Led strip.&lt;/p&gt;

&lt;p&gt;In order to drive more powerful appliances, you need to supply inverter with more powerful DC source such as car batteries.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/power_inverter_fixed.webp&quot; alt=&quot;Schematic&quot; /&gt;&lt;/p&gt;
</description>
                <pubDate>Sun, 20 Jul 2025 18:00:00 +0000</pubDate>
                <link>http://0.0.0.0:4000/my-repair-note-on-dc-ac-inverter</link>
                <guid isPermaLink="true">http://0.0.0.0:4000/my-repair-note-on-dc-ac-inverter</guid>
                
                <category>repair</category>
                
                
            </item>
        
            <item>
                <title>OCP Upgrade with Canary Rollout Strategy</title>
                <description>&lt;p&gt;Node upgrades are a critical aspect of maintaining a healthy OpenShift cluster. Whether it’s applying security patches, updating underlying dependencies, or simply scaling up resources, the process must be executed with precision to avoid disruptions to running workloads.&lt;/p&gt;

&lt;p&gt;OpenShift(Kubernetes) node upgrade methods often involve draining nodes, evacuating workloads, and performing the upgrade, leading to potential downtime and service interruptions. This can be particularly challenging in production environments where any disruption can have cascading effects on business operations.&lt;/p&gt;

&lt;p&gt;Instead of upgrading all nodes simultaneously, a subset of nodes can be selected and upgraded, first.&lt;/p&gt;

&lt;p&gt;In this post, I will walk you through, how to upgrade OCP nodes predictably, while some of workloads are running happily. This method can be useful when only particular set of nodes upgrade desired. Please note in that type of OCP upgrade, node restarts are still inevitable. Nevertheless, it could be useful when you need to postpone upgrading some of nodes and applications working on those nodes for sometime.&lt;/p&gt;

&lt;p&gt;Key feature that gives us this capability in OCP is Machine Config Pool.&lt;/p&gt;

&lt;h3 id=&quot;what-is-machine-config-pool&quot;&gt;What is Machine Config Pool?&lt;/h3&gt;
&lt;p&gt;What is Role Binding to a User/Group, Machine Config Pool is to Nodes. It associates Nodes with Machine Configs. For more information about Machine Config Pool, you can follow, the post.&lt;/p&gt;

&lt;p&gt;OCP Nodes in Sandbox2
To demonstrate Canary like OCP node upgrade, following cluster will be used. Current version of OCP Sandbox2 cluster version is 4.12.10 and it will be upgraded to the OCP 4.14.10.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Note:&lt;/code&gt; To find upgrade path you can use the Red Hat OCP Update Graph &lt;a href=&quot;https://access.redhat.com/labs/ocpupgradegraph/update_path/&quot; target=&quot;_blank&quot;&gt;application&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;According to the Application, OCP versions that we need to follow as below.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;4.12.10(Current version) -&amp;gt; 4.12.47 -&amp;gt; 4.13.19 -&amp;gt; 4.14.10&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc get nodes
NAME                  STATUS   ROLES                  AGE   VERSION
sandbox2-dmzworker0   Ready    dmzworker,worker       11d   v1.25.16+5c97f5b
sandbox2-dmzworker1   Ready    dmzworker,worker       11d   v1.25.16+5c97f5b
sandbox2-infra0       Ready    infra,worker           35d   v1.25.16+5c97f5b
sandbox2-infra1       Ready    infra,worker           35d   v1.25.16+5c97f5b
sandbox2-master0      Ready    control-plane,master   35d   v1.25.16+5c97f5b
sandbox2-master1      Ready    control-plane,master   35d   v1.25.16+5c97f5b
sandbox2-master2      Ready    control-plane,master   35d   v1.25.16+5c97f5b
sandbox2-worker0      Ready    worker                 35d   v1.25.16+5c97f5b
sandbox2-worker1      Ready    worker                 35d   v1.25.16+5c97f5b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;You can see the Node &amp;lt;-&amp;gt; MCP relation of sandbox2 cluster in the following table&lt;/p&gt;
&lt;/blockquote&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Node Name&lt;/th&gt;
      &lt;th&gt;MCP Name&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-worker0&lt;/td&gt;
      &lt;td&gt;worker&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-worker1&lt;/td&gt;
      &lt;td&gt;worker&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-master0&lt;/td&gt;
      &lt;td&gt;master&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-master1&lt;/td&gt;
      &lt;td&gt;master&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-master2&lt;/td&gt;
      &lt;td&gt;master&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-dmzworker0&lt;/td&gt;
      &lt;td&gt;dmzworker&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-dmzworker1&lt;/td&gt;
      &lt;td&gt;dmzworker&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-infra0&lt;/td&gt;
      &lt;td&gt;infra&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-infra1&lt;/td&gt;
      &lt;td&gt;infra&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;machine-config-pools-in-the-sandbox2-cluster&quot;&gt;Machine Config Pools in the Sandbox2 Cluster&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc get mcp
NAME        CONFIG                                                UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
dmzworker   rendered-dmzworker-4b77d58a5da76d5a8126d186460a28a6   True      False      False      2              2                   2                     0                      11d
infra       rendered-infra-4b77d58a5da76d5a8126d186460a28a6       True      False      False      2              2                   2                     0                      35d
master      rendered-master-ddad513671757f22d78d41940ab0255c      True      False      False      3              3                   3                     0                      35d
worker      rendered-worker-4b77d58a5da76d5a8126d186460a28a6      True      False      False      2              2                   2                     0                      35d

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Before Update/Upgrade of the Cluster, it is required to create additional MCPs and join some of nodes to these new MCPs.&lt;/p&gt;

&lt;h3 id=&quot;create-additional-mcp&quot;&gt;Create Additional MCP&lt;/h3&gt;

&lt;p&gt;In this section additional three MPCs will be created and some of nodes will be added to these new MCPs.&lt;/p&gt;

&lt;p&gt;infra-canary&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;machineconfiguration.openshift.io/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;MachineConfigPool&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;infra-canary&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;machineConfigSelector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchExpressions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;machineconfiguration.openshift.io/role&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;operator&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;In&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;values&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;infra&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]}&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;maxUnavailable&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;nodeSelector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchExpressions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;node-role.kubernetes.io/infra-canary&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;operator&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Exists&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;paused&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;dmzworker-canary&lt;/p&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;machineconfiguration.openshift.io/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;MachineConfigPool&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;dmzworker-canary&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;machineConfigSelector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchExpressions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;machineconfiguration.openshift.io/role&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;operator&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;In&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;values&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;dmzworker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]}&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;maxUnavailable&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;nodeSelector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchExpressions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;node-role.kubernetes.io/dmzworker-canary&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;operator&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Exists&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;paused&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;worker-canary&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;machineconfiguration.openshift.io/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;MachineConfigPool&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;worker-canary&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;machineConfigSelector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchExpressions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;machineconfiguration.openshift.io/role&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;operator&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;In&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;values&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]}&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;maxUnavailable&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;nodeSelector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchLabels&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;node-role.kubernetes.io/worker-canary&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;paused&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;update-existing-mcp&quot;&gt;Update existing MCP&lt;/h3&gt;

&lt;p&gt;Existing MCPs will be updated with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;matchExpressions&lt;/code&gt; selector to disjoin desired nodes from its original MCPs.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;machineconfiguration.openshift.io/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;MachineConfigPool&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;dmzworker&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;machineConfigSelector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchExpressions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;machineconfiguration.openshift.io/role&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;operator&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;In&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;values&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;dmzworker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]}&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;maxUnavailable&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;nodeSelector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchExpressions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;node-role.kubernetes.io/dmzworker-canary&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;operator&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;DoesNotExist&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchLabels&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;node-role.kubernetes.io/dmzworker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;paused&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;machineconfiguration.openshift.io/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;MachineConfigPool&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;infra&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;machineConfigSelector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchExpressions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;machineconfiguration.openshift.io/role&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;operator&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;In&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;values&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;infra&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]}&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;maxUnavailable&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;nodeSelector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchExpressions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;node-role.kubernetes.io/infra-canary&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;operator&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;DoesNotExist&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;matchLabels&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;node-role.kubernetes.io/infra&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;paused&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;placing-nodes-to-new-mcps&quot;&gt;Placing nodes to new MCPs&lt;/h3&gt;

&lt;p&gt;To place desired nodes to its new MCPs, additional label needs to be added to the nodes. In this post, nodes with odd number will be re-joined to the new MCPs.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc label node sandbox2-infra1 node-role.kubernetes.io/infra-canary&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc label node sandbox2-dmzworker1 node-role.kubernetes.io/dmzworker-canary&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc label node sandbox2-worker1 node-role.kubernetes.io/worker-canary&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;After adding label to the nodes, Node &amp;lt;-&amp;gt; MCP membership should be as in the table below.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Node Name&lt;/th&gt;
      &lt;th&gt;MCP Name&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-worker0&lt;/td&gt;
      &lt;td&gt;worker&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-worker1&lt;/td&gt;
      &lt;td&gt;worker-canary&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-master0&lt;/td&gt;
      &lt;td&gt;master&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-master1&lt;/td&gt;
      &lt;td&gt;master&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-master2&lt;/td&gt;
      &lt;td&gt;master&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-dmzworker0&lt;/td&gt;
      &lt;td&gt;dmzworker&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-dmzworker1&lt;/td&gt;
      &lt;td&gt;dmzworker-canary&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-infra0&lt;/td&gt;
      &lt;td&gt;infra&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;sandbox2-infra1&lt;/td&gt;
      &lt;td&gt;infra-canary&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Note:&lt;/code&gt; No special configuration applied for control-plane nodes, as only one node will be unavailable at a time during the upgrade of OCP cluster.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc get nodes
NAME                  STATUS   ROLES                          AGE    VERSION
sandbox2-dmzworker0   Ready    dmzworker,worker               3d4h   v1.26.12+9ed7eae
sandbox2-dmzworker1   Ready    dmzworker,dmzworker-canary,worker   3d4h   v1.25.7+eab9cc9
sandbox2-infra0       Ready    infra,worker                   3d4h   v1.26.12+9ed7eae
sandbox2-infra1       Ready    infra,infra-canary,worker           3d4h   v1.25.7+eab9cc9
sandbox2-master0      Ready    control-plane,master           3d5h   v1.26.12+9ed7eae
sandbox2-master1      Ready    control-plane,master           3d5h   v1.26.12+9ed7eae
sandbox2-master2      Ready    control-plane,master           3d5h   v1.26.12+9ed7eae
sandbox2-worker0      Ready    worker                         3d5h   v1.26.12+9ed7eae
sandbox2-worker1      Ready    worker,worker-canary                3d5h   v1.25.7+eab9cc9

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc get mcp  &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;jsonpath={range .items[*]}{.metadata.name} &quot;-------------&amp;gt;&quot;{.spec.paused}{&quot;\n&quot;}&apos;&lt;/span&gt;
dmzworker &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false
&lt;/span&gt;dmzworker-canary &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false
&lt;/span&gt;infra &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false
&lt;/span&gt;infra-canary &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false
&lt;/span&gt;master &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false
&lt;/span&gt;worker &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false
&lt;/span&gt;worker-canary &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;pause--canary-mcps&quot;&gt;Pause &lt;node-role&gt;-canary MCPs&lt;/node-role&gt;&lt;/h3&gt;

&lt;p&gt;This is the last and highly important step before the Update/Upgrade of the cluster. In this step, &lt;node-role&gt;-canary MCPs paused set to true. With that, no cluster update/upgrade will take place on these nodes. Consequently, workloads running on these nodes will not be affected.&lt;/node-role&gt;&lt;/p&gt;

&lt;p&gt;Note: Please do not forget to check deprecated/removed feature before OpenShift Upgrade, otherwise running applications can be affected due to removed API versions/features.&lt;/p&gt;

&lt;p&gt;According to following setting any update/upgrade &lt;node-role&gt;-canary will not be affected for nodes member of canary MCPs. (paused: true)&lt;/node-role&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc patch mcp/worker-canary &lt;span class=&quot;nt&quot;&gt;--patch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;{&quot;spec&quot;:{&quot;paused&quot;:true}}&apos;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;merge
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc patch mcp/infra-canary &lt;span class=&quot;nt&quot;&gt;--patch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;{&quot;spec&quot;:{&quot;paused&quot;:true}}&apos;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;merge
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc patch mcp/dmzworker-canary  &lt;span class=&quot;nt&quot;&gt;--patch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;{&quot;spec&quot;:{&quot;paused&quot;:true}}&apos;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;merge


&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc get mcp  &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;jsonpath={range .items[*]}{.metadata.name} &quot;-------------&amp;gt;&quot;{.spec.paused}{&quot;\n&quot;}&apos;&lt;/span&gt;
dmzworker &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false
&lt;/span&gt;dmzworker-canary &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true
&lt;/span&gt;infra &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false
&lt;/span&gt;infra-canary &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true
&lt;/span&gt;master &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false
&lt;/span&gt;worker &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false
&lt;/span&gt;worker-canary &lt;span class=&quot;s2&quot;&gt;&quot;-------------&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;rhocp-update-41210-to-41247&quot;&gt;RHOCP Update (4.12.10 to 4.12.47)&lt;/h3&gt;
&lt;p&gt;Before the update/upgrade of OpenShift, required OpenShift version images are mirrored to container registry. You can follow the guide how to mirror image for disconnected update/upgrade of OpenShift, &lt;a href=&quot;https://docs.openshift.com/container-platform/4.12/installing/disconnected_install/installing-mirroring-disconnected.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; scripts/signatures/rhocp-release-4.12.47.json

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc adm upgrade &lt;span class=&quot;nt&quot;&gt;--allow-explicit-upgrade&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--to-image&lt;/span&gt; registry.local.io/openshift/openshift-release-dev@sha256:fcc9920ba10ebb02c69bdd9cd597273260eeec1b22e9ef9986a47f4874a21253
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;rhocp-upgrade-41247-to-41329&quot;&gt;RHOCP Upgrade (4.12.47 to 4.13.29)&lt;/h3&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; scripts/signatures/rhocp-release-4.13.29.json

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc adm upgrade &lt;span class=&quot;nt&quot;&gt;--allow-explicit-upgrade&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--to-image&lt;/span&gt; registry.local.io/openshift/openshift-release-dev@sha256:9c4a4471bb93ab11d255925535ff719742cafa8ae06d622b870133787a72abc3

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; openshift-config patch cm admin-acks &lt;span class=&quot;nt&quot;&gt;--patch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;{&quot;data&quot;:{&quot;ack-4.12-kube-1.26-api-removals-in-4.13&quot;:&quot;true&quot;}}&apos;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;merge
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;rhocp-upgrade-41329-to-41410&quot;&gt;RHOCP Upgrade (4.13.29 to 4.14.10)&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; scripts/signatures/rhocp-release-4.14.10.json

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc adm upgrade &lt;span class=&quot;nt&quot;&gt;--allow-explicit-upgrade&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--to-image&lt;/span&gt; registry.local.io/openshift/openshift-release-dev@sha256:03cc63c0c48b2416889e9ee53f2efc2c940323c15f08384b439c00de8e66e8aa

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; openshift-config patch cm admin-acks &lt;span class=&quot;nt&quot;&gt;--patch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;{&quot;data&quot;:{&quot;ack-4.13-kube-1.27-api-removals-in-4.14&quot;:&quot;true&quot;}}&apos;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;merge
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;As you can see all Nodes which where member of existing MCPs are Updated/Upgraded. But member of &lt;node-role&gt;-canary nodes are still the same version.&lt;/node-role&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc get nodes
NAME                  STATUS   ROLES                          AGE    VERSION
sandbox2-dmzworker0   Ready    dmzworker,worker               3d5h   v1.27.9+e36e183
sandbox2-dmzworker1   Ready    dmzworker,dmzworker-canary,worker   3d5h   v1.25.7+eab9cc9
sandbox2-infra0       Ready    infra,worker                   3d5h   v1.27.9+e36e183
sandbox2-infra1       Ready    infra,infra-canary,worker           3d5h   v1.25.7+eab9cc9
sandbox2-master0      Ready    control-plane,master           3d6h   v1.27.9+e36e183
sandbox2-master1      Ready    control-plane,master           3d6h   v1.27.9+e36e183
sandbox2-master2      Ready    control-plane,master           3d6h   v1.27.9+e36e183
sandbox2-worker0      Ready    worker                         3d6h   v1.27.9+e36e183
sandbox2-worker1      Ready    worker,worker-canary               3d6h   v1.25.7+eab9cc9
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;upgrade-nodes-in--canary-mcp&quot;&gt;Upgrade Nodes in &lt;node-role&gt;-canary MCP&lt;/node-role&gt;&lt;/h3&gt;
&lt;p&gt;There are two ways to upgrade paused nodes. (Nodes which have not been touched yet).&lt;/p&gt;

&lt;p&gt;Set paused: false to new MCPs(&lt;node-role&gt;-canary) OR remove  label `node-role.kubernetes.io/&lt;node-role&gt;-canary` on node.&lt;/node-role&gt;&lt;/node-role&gt;&lt;/p&gt;

&lt;h3 id=&quot;upgrade-nodes-in-infra-canary-mcpfirst-method&quot;&gt;Upgrade Nodes in infra-canary MCP(First Method)&lt;/h3&gt;
&lt;p&gt;Set paused: false which upgrade all nodes which member of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;infra-canary&lt;/code&gt; MCP.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc patch mcp/infra-canary &lt;span class=&quot;nt&quot;&gt;--patch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;{&quot;spec&quot;:{&quot;paused&quot;:false}}&apos;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;merge
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc get nodes
NAME                  STATUS   ROLES                          AGE    VERSION
sandbox2-dmzworker0   Ready    dmzworker,worker               3d6h   v1.27.9+e36e183
sandbox2-dmzworker1   Ready    dmzworker,dmzworker-canary,worker   3d6h   v1.25.7+eab9cc9
sandbox2-infra0       Ready    infra,worker                   3d6h   v1.27.9+e36e183
sandbox2-infra1       Ready    infra,infra-canary,worker           3d6h   v1.27.9+e36e183
sandbox2-master0      Ready    control-plane,master           3d7h   v1.27.9+e36e183
sandbox2-master1      Ready    control-plane,master           3d7h   v1.27.9+e36e183
sandbox2-master2      Ready    control-plane,master           3d7h   v1.27.9+e36e183
sandbox2-worker0      Ready    worker                         3d6h   v1.27.9+e36e183
sandbox2-worker1      Ready    worker,worker-canary                3d6h   v1.25.7+eab9cc9
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;upgrade-nodes-in-dmzworker-canary-mcp-second-method&quot;&gt;Upgrade Nodes in dmzworker-canary MCP (Second Method)&lt;/h3&gt;

&lt;p&gt;In this method label &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;node-role.kubernetes.io/dmzworker-canary&lt;/code&gt; label will be removed and node dmzworker1 will rejoin to dmzworker MCP.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc label node sandbox2-dmzworker1 node-role.kubernetes.io/dmzworker-canary-
node/sandbox2-dmzworker1 unlabeled

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc get mcp dmzworker-a
NAME          CONFIG                                                  UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
dmzworker-canary   rendered-dmzworker-canary-fce74906989201f3653152f435f3a9e3   True      False      False      0              0                   0                     0                      3d3h
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc get mcp dmzworker
NAME        CONFIG                                                UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
dmzworker   rendered-dmzworker-fce74906989201f3653152f435f3a9e3   False     True       False      2              1                   1                     0                      3d6h
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;upgrade-nodes-in--worker-canary-mcp-first-method&quot;&gt;Upgrade Nodes in  worker-canary MCP (First Method)&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oc patch mcp/worker-canary &lt;span class=&quot;nt&quot;&gt;--patch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;{&quot;spec&quot;:{&quot;paused&quot;:false}}&apos;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;merge
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
                <pubDate>Sun, 20 Jul 2025 18:00:00 +0000</pubDate>
                <link>http://0.0.0.0:4000/ocp-upgrade-with-canary-rollout-strategy</link>
                <guid isPermaLink="true">http://0.0.0.0:4000/ocp-upgrade-with-canary-rollout-strategy</guid>
                
                <category>openshift</category>
                
                <category>kubernetes</category>
                
                
            </item>
        
            <item>
                <title>Share Serial Devices with WSL Machine</title>
                <description>&lt;p&gt;&lt;a href=&quot;https://github.com/dorssel/usbipd-win&quot; target=&quot;_blank&quot;&gt;usbipd-win&lt;/a&gt; is a project to share serial devices with WSL machine. (Windows Subsystem for Linux).&lt;/p&gt;

&lt;p&gt;It is highly useful when you develop embedded systems on Windows hosts inside WSL machine.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Download and install usbipd MSI Package in GitHub releases page.&lt;/li&gt;
  &lt;li&gt;Run CMD Prompt as Admin(Run as Administrator)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;C:&lt;span class=&quot;se&quot;&gt;\W&lt;/span&gt;indows&lt;span class=&quot;se&quot;&gt;\S&lt;/span&gt;ystem32&amp;gt;usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
1-4    0489:e0e2  MediaTek Bluetooth Adapter                                    Not shared
2-1    1a86:7523  USB-SERIAL CH340 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;COM4&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;                                       Attached
4-1    05ac:12a8  Apple Mobile Device USB Composite Device                      Not shared
5-1    3277:0033  USB2.0 FHD UVC WebCam, USB2.0 IR UVC WebCam, Camera DFU D...  Not shared
7-3    046d:082d  HD Pro Webcam C920                                            Not shared
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this example, I want to share USB-SERIAL device in order to program ESP8266 chip.&lt;/p&gt;

&lt;h3 id=&quot;bind-serial-device&quot;&gt;Bind Serial Device:&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
C:&lt;span class=&quot;se&quot;&gt;\W&lt;/span&gt;indows&lt;span class=&quot;se&quot;&gt;\S&lt;/span&gt;ystem32&amp;gt;usbipd &lt;span class=&quot;nb&quot;&gt;bind&lt;/span&gt;  &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt;  1a86:7523
usbipd: info: Device with hardware-id &lt;span class=&quot;s1&quot;&gt;&apos;1a86:7523&apos;&lt;/span&gt; found at busid &lt;span class=&quot;s1&quot;&gt;&apos;2-1&apos;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;attach-serial-device-into-wsl&quot;&gt;Attach Serial Device into WSL&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;C:&lt;span class=&quot;se&quot;&gt;\W&lt;/span&gt;indows&lt;span class=&quot;se&quot;&gt;\S&lt;/span&gt;ystem32&amp;gt;usbipd attach &lt;span class=&quot;nt&quot;&gt;--wsl&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt;  1a86:7523
usbipd: info: Device with hardware-id &lt;span class=&quot;s1&quot;&gt;&apos;1a86:7523&apos;&lt;/span&gt; found at busid &lt;span class=&quot;s1&quot;&gt;&apos;2-1&apos;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
usbipd: info: Using WSL distribution &lt;span class=&quot;s1&quot;&gt;&apos;Ubuntu&apos;&lt;/span&gt; to attach&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; the device will be available &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;all WSL 2 distributions.
usbipd: info: Detected networking mode &lt;span class=&quot;s1&quot;&gt;&apos;nat&apos;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
usbipd: info: Using IP address 172.19.144.1 to reach the host.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;dmesg-message-on-wslubuntu&quot;&gt;dmesg message on WSL(Ubuntu)&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; 6188.974470] usb 1-1: SetAddress Request &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;2&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; to port 0
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; 6189.019112] usb 1-1: New USB device found, &lt;span class=&quot;nv&quot;&gt;idVendor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1a86, &lt;span class=&quot;nv&quot;&gt;idProduct&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;7523, &lt;span class=&quot;nv&quot;&gt;bcdDevice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 2.54
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; 6189.019130] usb 1-1: New USB device strings: &lt;span class=&quot;nv&quot;&gt;Mfr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0, &lt;span class=&quot;nv&quot;&gt;Product&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;2, &lt;span class=&quot;nv&quot;&gt;SerialNumber&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; 6189.019134] usb 1-1: Product: USB2.0-Serial
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; 6189.050824] usbcore: registered new interface driver ch341
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; 6189.050843] usbserial: USB Serial support registered &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;ch341-uart
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; 6189.050857] ch341 1-1:1.0: ch341-uart converter detected
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; 6189.064874] usb 1-1: ch341-uart converter now attached to ttyUSB0
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; 6250.842958] vhci_hcd: unlink-&amp;gt;seqnum 6680
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; 6250.842963] vhci_hcd: urb-&amp;gt;status &lt;span class=&quot;nt&quot;&gt;-104&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; 6250.843465] vhci_hcd: unlink-&amp;gt;seqnum 6681
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
                <pubDate>Sun, 23 Feb 2025 18:00:00 +0000</pubDate>
                <link>http://0.0.0.0:4000/share-serial-devices-with-wsl-machine</link>
                <guid isPermaLink="true">http://0.0.0.0:4000/share-serial-devices-with-wsl-machine</guid>
                
                <category>linux</category>
                
                <category>embedded_systems</category>
                
                
            </item>
        
    </channel>
</rss>