<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Catatan Perjalanan - Nicolas Julian]]></title><description><![CDATA[Halo, Saya Nicolas Julian seorang Cloud Engineer, DevOps, Bug Hunter, dan kadang menulis kode 🍻.]]></description><link>https://nicolas.my.id</link><generator>GatsbyJS</generator><lastBuildDate>Sun, 08 Nov 2026 12:52:08 GMT</lastBuildDate><item><title><![CDATA[How to Recover Kubernetes Cluster After Cilium Network Policy Lockout - etcd Disaster Recovery Guide]]></title><description><![CDATA[TL;DR: Learn how to recover from a complete Kubernetes cluster lockout caused by misconfigured Cilium network policies. This guide covers…]]></description><link>https://nicolas.my.id/etcd-disaster-recovery-ruide/</link><guid isPermaLink="false">https://nicolas.my.id/etcd-disaster-recovery-ruide/</guid><pubDate>Sat, 13 Sep 2025 13:39:31 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Learn how to recover from a complete Kubernetes cluster lockout caused by misconfigured Cilium network policies. This guide covers etcd disaster recovery using &lt;code class=&quot;language-text&quot;&gt;--force-new-cluster&lt;/code&gt;, fixing lost quorum, and preventing similar incidents.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;In this comprehensive guide, I&apos;ll show you how one Cilium network policy configuration mistake completely locked me out of my production Kubernetes cluster, and the exact step-by-step process I used to recover without any data loss. If you&apos;re running Kubernetes with Cilium CNI and working with network policies, this post will help you avoid and recover from similar disasters.&lt;/p&gt;
&lt;h2&gt;Background: Our Kubernetes Cluster Setup&lt;/h2&gt;
&lt;p&gt;I run a 3-node Kubernetes cluster with the following configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deployment tool:&lt;/strong&gt; Kubespray&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Infrastructure:&lt;/strong&gt; VPS with public IPs only (no private networking)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CNI:&lt;/strong&gt; Cilium&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;etcd:&lt;/strong&gt; External etcd cluster (systemd service)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Production workloads requiring strict network security&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because our cluster runs on VPS with only public IPs exposed, network security through Cilium network policies is critical. My colleague was implementing security hardening and needed to restrict node-exporter metrics endpoint (port 9100) access using Cilium&apos;s clusterwide network policies.&lt;/p&gt;
&lt;p&gt;What seemed like a simple security improvement turned into a complete cluster outage within seconds.&lt;/p&gt;
&lt;h2&gt;The Problem: Kubernetes Cluster Completely Locked Out&lt;/h2&gt;
&lt;h3&gt;What Went Wrong With Cilium Network Policy&lt;/h3&gt;
&lt;p&gt;Here&apos;s the exact Cilium clusterwide network policy that caused the complete cluster lockout:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cilium.io/v2
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; CiliumClusterwideNetworkPolicy
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; restrict&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;exporter&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;hostport&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9100&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;nodeSelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;matchLabels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Applied to ALL nodes - this was the problem&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ingress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;fromCIDR&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; 103.xxx.xxx.xxx/32
    &lt;span class=&quot;token key atrule&quot;&gt;toPorts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9100&quot;&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TCP
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;fromEntities&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; cluster
    &lt;span class=&quot;token key atrule&quot;&gt;toPorts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9100&quot;&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TCP&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Understanding Cilium Clusterwide Network Policy Behavior&lt;/h3&gt;
&lt;p&gt;The critical mistake: &lt;strong&gt;Cilium clusterwide network policies with empty &lt;code class=&quot;language-text&quot;&gt;nodeSelector&lt;/code&gt; operate in whitelist mode, not blacklist mode&lt;/strong&gt;. This is a common misunderstanding that causes many Kubernetes cluster outages.&lt;/p&gt;
&lt;p&gt;By only specifying port 9100 in the ingress rules, we unintentionally created a default-deny policy for ALL other ports across the entire cluster, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Port 6443&lt;/strong&gt; - Kubernetes API server (no kubectl access)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port 2379/2380&lt;/strong&gt; - etcd cluster communication (quorum lost)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port 10250&lt;/strong&gt; - kubelet API (node communication broken)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port 53&lt;/strong&gt; - DNS (service discovery failed)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This created a perfect deadlock:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cannot delete the network policy → need API server access&lt;/li&gt;
&lt;li&gt;Cannot restore API server → need etcd working&lt;/li&gt;
&lt;li&gt;Cannot fix etcd → need cluster communication (blocked by Cilium)&lt;/li&gt;
&lt;li&gt;Cannot disable Cilium → need etcd to delete DaemonSet&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Kubernetes Cluster Troubleshooting: Identifying the Issue&lt;/h2&gt;
&lt;h3&gt;Symptom 1: API Server Unreachable&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ kubectl get nodes
Unable to connect to the server: dial tcp &lt;span class=&quot;token number&quot;&gt;103&lt;/span&gt;.xxx.xxx.xxx:6443: connect: connection refused

$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-k&lt;/span&gt; https://127.0.0.1:6443/healthz
curl: &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Failed to connect to &lt;span class=&quot;token number&quot;&gt;127.0&lt;/span&gt;.0.1 port &lt;span class=&quot;token number&quot;&gt;6443&lt;/span&gt;: Connection refused&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Symptom 2: etcd Lost Quorum - No Leader&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token assign-left variable&quot;&gt;ETCDCTL_API&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; etcdctl endpoint status &lt;span class=&quot;token parameter variable&quot;&gt;-w&lt;/span&gt; table
+----------------+------------------+---------+---------+-----------+------------+
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;    ENDPOINT    &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;        ID        &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; VERSION &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; DB SIZE &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; IS LEADER &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; RAFT &lt;span class=&quot;token environment constant&quot;&gt;TERM&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
+----------------+------------------+---------+---------+-----------+------------+
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;127.0&lt;/span&gt;.0.1:2379 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; 760112fd749b508a &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token number&quot;&gt;3.5&lt;/span&gt;.6 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;  &lt;span class=&quot;token number&quot;&gt;497&lt;/span&gt; MB &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token number&quot;&gt;13384&lt;/span&gt;    &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
+----------------+------------------+---------+---------+-----------+------------+

ERROR: etcdserver: no leader&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The etcd cluster lost quorum because nodes couldn&apos;t communicate on ports 2379/2380. Without a Raft leader, etcd refuses all write operations - meaning we cannot delete the problematic network policy even if we had API access.&lt;/p&gt;
&lt;h2&gt;Complete Kubernetes Disaster Recovery Process&lt;/h2&gt;
&lt;h3&gt;Step 1: Stop Cilium Agent to Disable Network Policies&lt;/h3&gt;
&lt;p&gt;First attempt to disable Cilium network policy enforcement:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Find cilium-agent container using nerdctl&lt;/span&gt;
$ nerdctl &lt;span class=&quot;token function&quot;&gt;ps&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; cilium-agent &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; pause

&lt;span class=&quot;token comment&quot;&gt;# Stop the cilium-agent container&lt;/span&gt;
$ nerdctl stop &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;cilium-container-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Cilium stopped but API server was already crashed. etcd still had no leader because the damage was already done.&lt;/p&gt;
&lt;h3&gt;Step 2: Attempt Cilium Uninstall&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ cilium uninstall
🔥 Deleting agent DaemonSet&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
🔥 Deleting operator Deployment&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
✅ Cilium was successfully uninstalled.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; This command requires etcd to work, creating a circular dependency. We needed a different approach.&lt;/p&gt;
&lt;h3&gt;Step 3: Backup etcd Before Recovery (Critical Step)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Always backup etcd before attempting any disaster recovery operations:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ETCDCTL_API&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; etcdctl snapshot save /root/etcd-backup-&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +%Y%m%d-%H%M%S&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;.db &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--endpoints&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;127.0&lt;/span&gt;.0.1:2379 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--cacert&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/ca.pem &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--cert&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/node-argocd-1.pem &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/node-argocd-1-key.pem&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Snapshot saved at /root/etcd-backup-20251013-110002.db&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This backup is your safety net. If the recovery process fails, you can restore from this snapshot.&lt;/p&gt;
&lt;h3&gt;Step 4: etcd Disaster Recovery - Force New Cluster&lt;/h3&gt;
&lt;p&gt;This is the nuclear option for etcd disaster recovery. The &lt;code class=&quot;language-text&quot;&gt;--force-new-cluster&lt;/code&gt; flag forces a node to become a single-member cluster with itself as the leader.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What &lt;code class=&quot;language-text&quot;&gt;--force-new-cluster&lt;/code&gt; does:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Removes all other members from the cluster configuration&lt;/li&gt;
&lt;li&gt;Keeps all existing data intact (does NOT delete data)&lt;/li&gt;
&lt;li&gt;Forces this node to become the Raft leader&lt;/li&gt;
&lt;li&gt;Allows the cluster to operate as single-node temporarily&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Stop etcd systemd service&lt;/span&gt;
$ systemctl stop etcd

&lt;span class=&quot;token comment&quot;&gt;# Start etcd with force-new-cluster flag&lt;/span&gt;
$ etcd --force-new-cluster &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --data-dir&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/var/lib/etcd &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;etcd2 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --advertise-client-urls&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://103.xxx.xxx.xxx:2379 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --listen-client-urls&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://103.xxx.xxx.xxx:2379,https://127.0.0.1:2379 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --cert-file&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/member-argocd-1.pem &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --key-file&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/member-argocd-1-key.pem &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --trusted-ca-file&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/ca.pem &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --client-cert-auth&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;true &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Success! etcd became leader:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{&quot;level&quot;:&quot;info&quot;,&quot;ts&quot;:&quot;2025-10-13T11:28:12.212+0700&quot;,&quot;msg&quot;:&quot;760112fd749b508a became leader at term 13385&quot;}
{&quot;level&quot;:&quot;info&quot;,&quot;ts&quot;:&quot;2025-10-13T11:28:12.215+0700&quot;,&quot;msg&quot;:&quot;published local member to cluster through raft&quot;}
{&quot;level&quot;:&quot;info&quot;,&quot;ts&quot;:&quot;2025-10-13T11:28:12.218+0700&quot;,&quot;msg&quot;:&quot;serving client traffic securely&quot;}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now etcd had a leader, and the Kubernetes API server automatically came back online!&lt;/p&gt;
&lt;h3&gt;Step 5: Delete the Problematic Cilium Network Policy&lt;/h3&gt;
&lt;p&gt;With API access restored, we could finally delete the bad network policy:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ kubectl get ciliumclusterwidenetworkpolicies
NAME                                   AGE
restrict-node-exporter-hostport-9100   94m

$ kubectl delete ciliumclusterwidenetworkpolicies/restrict-node-exporter-hostport-9100
ciliumclusterwidenetworkpolicy.cilium.io &lt;span class=&quot;token string&quot;&gt;&quot;restrict-node-exporter-hostport-9100&quot;&lt;/span&gt; deleted&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Step 6: Restore etcd Cluster - Add Members Back&lt;/h3&gt;
&lt;p&gt;Running with single-node etcd is risky. We needed to restore the 3-node cluster for high availability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Add first member back to etcd cluster:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ETCDCTL_API&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; etcdctl member &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; etcd1 --peer-urls&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://103.xxx.xxx.xxx:2380 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--endpoints&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;127.0&lt;/span&gt;.0.1:2379 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--cacert&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/ca.pem &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--cert&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/node-argocd-1.pem &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/node-argocd-1-key.pem&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Member d25f65265e3477c7 added to cluster ed92624dcc0aa007
ETCD_NAME=&quot;etcd1&quot;
ETCD_INITIAL_CLUSTER=&quot;etcd2=https://103.xxx.xxx.xxx:2380,etcd1=https://103.xxx.xxx.xxx:2380&quot;
ETCD_INITIAL_CLUSTER_STATE=&quot;existing&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;On the second node, rejoin the cluster:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; root@103.xxx.xxx.xxx

&lt;span class=&quot;token comment&quot;&gt;# Stop etcd and backup old data&lt;/span&gt;
$ systemctl stop etcd
$ &lt;span class=&quot;token function&quot;&gt;mv&lt;/span&gt; /var/lib/etcd /var/lib/etcd.old

&lt;span class=&quot;token comment&quot;&gt;# Update etcd configuration to join existing cluster&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s/ETCD_INITIAL_CLUSTER_STATE=.*/ETCD_INITIAL_CLUSTER_STATE=existing/&apos;&lt;/span&gt; /etc/etcd.env
$ &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s/ETCD_INITIAL_CLUSTER=.*/ETCD_INITIAL_CLUSTER=etcd2=https:\/\/103.xxx.xxx.xxx:2380,etcd1=https:\/\/103.xxx.xxx.xxx:2380/&apos;&lt;/span&gt; /etc/etcd.env

&lt;span class=&quot;token comment&quot;&gt;# Start etcd to rejoin cluster&lt;/span&gt;
$ systemctl start etcd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Repeat this process for the third node.&lt;/p&gt;
&lt;h3&gt;Step 7: Verify Complete Kubernetes Cluster Recovery&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Check etcd cluster members:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token assign-left variable&quot;&gt;ETCDCTL_API&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; etcdctl member list &lt;span class=&quot;token parameter variable&quot;&gt;-w&lt;/span&gt; table
+------------------+---------+-------+------------------------------+------------------------------+------------+
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;        ID        &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; STATUS  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; NAME  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;          PEER ADDRS          &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;         CLIENT ADDRS         &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; IS LEARNER &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
+------------------+---------+-------+------------------------------+------------------------------+------------+
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; 760112fd749b508a &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; started &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; etcd2 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; https://103.xxx.xxx.xxx:2380 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; https://103.xxx.xxx.xxx:2379 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;      &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; d25f65265e3477c7 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; started &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; etcd1 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; https://103.xxx.xxx.xxx:2380 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; https://103.xxx.xxx.xxx:2379 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;      &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; da70198d6c2536f2 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; started &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; etcd3 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; https://103.xxx.xxx.xxx:2380 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; https://103.xxx.xxx.xxx:2379 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;      &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
+------------------+---------+-------+------------------------------+------------------------------+------------+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Verify etcd health and leader election:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token assign-left variable&quot;&gt;ETCDCTL_API&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; etcdctl endpoint status &lt;span class=&quot;token parameter variable&quot;&gt;-w&lt;/span&gt; table
+----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;       ENDPOINT       &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;        ID        &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; VERSION &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; DB SIZE &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; IS LEADER &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; IS LEARNER &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; RAFT &lt;span class=&quot;token environment constant&quot;&gt;TERM&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; RAFT INDEX &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; RAFT APPLIED INDEX &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; ERRORS &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
+----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;103&lt;/span&gt;.xxx.xxx.xxx:2379 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; 760112fd749b508a &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token number&quot;&gt;3.5&lt;/span&gt;.6 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;  &lt;span class=&quot;token number&quot;&gt;497&lt;/span&gt; MB &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;      &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;      &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;     &lt;span class=&quot;token number&quot;&gt;13388&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2079555217&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;         &lt;span class=&quot;token number&quot;&gt;2079555217&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;        &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;103&lt;/span&gt;.xxx.xxx.xxx:2379 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; d25f65265e3477c7 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token number&quot;&gt;3.5&lt;/span&gt;.6 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;  &lt;span class=&quot;token number&quot;&gt;497&lt;/span&gt; MB &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;     &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;      &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;     &lt;span class=&quot;token number&quot;&gt;13388&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2079555218&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;         &lt;span class=&quot;token number&quot;&gt;2079555218&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;        &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;103&lt;/span&gt;.xxx.xxx.xxx:2379 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; da70198d6c2536f2 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token number&quot;&gt;3.5&lt;/span&gt;.6 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;  &lt;span class=&quot;token number&quot;&gt;497&lt;/span&gt; MB &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;     &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;      &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;     &lt;span class=&quot;token number&quot;&gt;13388&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2079555220&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;         &lt;span class=&quot;token number&quot;&gt;2079555220&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;        &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
+----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Perfect! All three etcd members are healthy, synchronized (same RAFT term), with proper leader election. Kubernetes cluster fully recovered with zero data loss!&lt;/p&gt;
&lt;h2&gt;The Correct Cilium Network Policy Configuration&lt;/h2&gt;
&lt;p&gt;Here&apos;s how to properly configure Cilium clusterwide network policy without locking yourself out:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cilium.io/v2
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; CiliumClusterwideNetworkPolicy
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; restrict&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;exporter&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;hostport
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;nodeSelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;matchLabels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ingress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# Allow node-exporter access from monitoring server only&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;fromCIDR&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; 103.xxx.xxx.xxx/32
    &lt;span class=&quot;token key atrule&quot;&gt;toPorts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9100&quot;&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TCP
  
  &lt;span class=&quot;token comment&quot;&gt;# CRITICAL: Allow all cluster-internal communication&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;fromEntities&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; cluster
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; host
  
  &lt;span class=&quot;token comment&quot;&gt;# CRITICAL: Explicitly allow Kubernetes control plane ports&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;toPorts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;6443&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Kubernetes API server&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TCP
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2379&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# etcd client port&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TCP
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2380&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# etcd peer port&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TCP
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;10250&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# kubelet API&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TCP
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;53&quot;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;# CoreDNS&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TCP
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;53&quot;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;# CoreDNS&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; UDP&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Key differences:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Added &lt;code class=&quot;language-text&quot;&gt;fromEntities: [cluster, host]&lt;/code&gt; to allow all internal cluster communication&lt;/li&gt;
&lt;li&gt;Explicitly whitelisted all critical Kubernetes ports&lt;/li&gt;
&lt;li&gt;Maintained the port 9100 restriction to specific monitoring IP&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Kubernetes Network Policy Best Practices&lt;/h2&gt;
&lt;h3&gt;1. Understand Cilium Policy Modes&lt;/h3&gt;
&lt;p&gt;Cilium clusterwide network policies with &lt;code class=&quot;language-text&quot;&gt;nodeSelector&lt;/code&gt; work as &lt;strong&gt;whitelist mode&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only explicitly allowed traffic is permitted&lt;/li&gt;
&lt;li&gt;All other traffic is denied by default&lt;/li&gt;
&lt;li&gt;Very different from traditional firewall deny rules&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Always Whitelist Critical Kubernetes Ports&lt;/h3&gt;
&lt;p&gt;When using any network policies, ALWAYS allow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;6443&lt;/strong&gt; - Kubernetes API server (kubectl access)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2379/2380&lt;/strong&gt; - etcd cluster communication (critical for consensus)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;10250&lt;/strong&gt; - kubelet API (node management)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;53&lt;/strong&gt; - CoreDNS (service discovery)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. Test Network Policies in Staging Environment&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Never test Cilium clusterwide network policies directly in production.&lt;/strong&gt; Always:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create identical staging cluster&lt;/li&gt;
&lt;li&gt;Apply policies in staging first&lt;/li&gt;
&lt;li&gt;Verify all critical services remain accessible&lt;/li&gt;
&lt;li&gt;Monitor for 24 hours before production rollout&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. Prefer Namespaced Network Policies&lt;/h3&gt;
&lt;p&gt;Instead of &lt;code class=&quot;language-text&quot;&gt;CiliumClusterwideNetworkPolicy&lt;/code&gt;, use namespaced &lt;code class=&quot;language-text&quot;&gt;CiliumNetworkPolicy&lt;/code&gt; when possible:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cilium.io/v2
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; CiliumNetworkPolicy  &lt;span class=&quot;token comment&quot;&gt;# Namespaced - safer&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; restrict&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;exporter
  &lt;span class=&quot;token key atrule&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; monitoring
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;endpointSelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;matchLabels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; node&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;exporter
  &lt;span class=&quot;token comment&quot;&gt;# Only affects pods in monitoring namespace&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Namespaced policies reduce blast radius and prevent cluster-wide outages.&lt;/p&gt;
&lt;h3&gt;5. Implement Kubernetes Monitoring and Alerts&lt;/h3&gt;
&lt;p&gt;Set up monitoring for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;etcd cluster health (alert on &quot;no leader&quot;)&lt;/li&gt;
&lt;li&gt;etcd member count changes&lt;/li&gt;
&lt;li&gt;API server availability&lt;/li&gt;
&lt;li&gt;Network policy changes (audit log)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These alerts would have caught the issue within seconds instead of after the lockout occurred.&lt;/p&gt;
&lt;h3&gt;6. Document etcd Disaster Recovery Procedures&lt;/h3&gt;
&lt;p&gt;Every Kubernetes administrator should know:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How to take etcd snapshots&lt;/li&gt;
&lt;li&gt;How to restore from etcd backup&lt;/li&gt;
&lt;li&gt;When and how to use &lt;code class=&quot;language-text&quot;&gt;etcd --force-new-cluster&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;How to rejoin etcd members after recovery&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Emergency Kubernetes Recovery Commands&lt;/h2&gt;
&lt;p&gt;Save these commands for disaster recovery situations:&lt;/p&gt;
&lt;h3&gt;etcd Snapshot Backup&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ETCDCTL_API&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; etcdctl snapshot save /root/etcd-backup-&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +%Y%m%d-%H%M%S&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;.db &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--endpoints&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;127.0&lt;/span&gt;.0.1:2379 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--cacert&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/ca.pem &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--cert&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/node-argocd-1.pem &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/node-argocd-1-key.pem&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;etcd Health Check&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ETCDCTL_API&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; etcdctl endpoint health &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--endpoints&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;127.0&lt;/span&gt;.0.1:2379 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--cacert&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/ca.pem &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--cert&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/node-argocd-1.pem &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/ssl/etcd/ssl/node-argocd-1-key.pem&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;etcd Force New Cluster (Last Resort)&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl stop etcd
etcd --force-new-cluster &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --data-dir&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/var/lib/etcd &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;node-name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --advertise-client-urls&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ip&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;:2379 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --listen-client-urls&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ip&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;:2379,https://127.0.0.1:2379 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;additional TLS flags&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Add etcd Member&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ETCDCTL_API&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; etcdctl member &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; --peer-urls&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ip&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;:2380&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Restore etcd from Snapshot&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ETCDCTL_API&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; etcdctl snapshot restore &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;backup-file&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --data-dir&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/var/lib/etcd-restore&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Frequently Asked Questions (FAQ)&lt;/h2&gt;
&lt;h3&gt;Q: Will &lt;code class=&quot;language-text&quot;&gt;etcd --force-new-cluster&lt;/code&gt; delete my data?&lt;/h3&gt;
&lt;p&gt;No. The &lt;code class=&quot;language-text&quot;&gt;--force-new-cluster&lt;/code&gt; flag only modifies cluster membership configuration. All your Kubernetes resources, configurations, and data remain intact in the etcd data directory.&lt;/p&gt;
&lt;h3&gt;Q: Can I recover without &lt;code class=&quot;language-text&quot;&gt;--force-new-cluster&lt;/code&gt;?&lt;/h3&gt;
&lt;p&gt;If you have lost etcd quorum and cannot restore communication between nodes, &lt;code class=&quot;language-text&quot;&gt;--force-new-cluster&lt;/code&gt; is the only option. It&apos;s specifically designed for disaster recovery when the cluster cannot elect a leader.&lt;/p&gt;
&lt;h3&gt;Q: Should I use Cilium clusterwide policies at all?&lt;/h3&gt;
&lt;p&gt;Yes, but carefully. Clusterwide policies are powerful for enforcing security across your entire cluster, but they require thorough testing and understanding. For most use cases, namespaced policies are safer.&lt;/p&gt;
&lt;h3&gt;Q: What if I don&apos;t have an etcd backup?&lt;/h3&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;--force-new-cluster&lt;/code&gt; method works without a backup because it uses the existing data directory. However, always maintain regular etcd backups for other disaster scenarios like disk failure or data corruption.&lt;/p&gt;
&lt;h2&gt;Conclusion: Key Takeaways for Kubernetes Administrators&lt;/h2&gt;
&lt;p&gt;One misconfigured Cilium network policy brought down our entire production Kubernetes cluster. But with proper understanding of etcd operations and disaster recovery procedures, we recovered completely without any data loss.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Critical lessons:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cilium clusterwide policies with &lt;code class=&quot;language-text&quot;&gt;nodeSelector&lt;/code&gt; create whitelist mode - understand this before applying&lt;/li&gt;
&lt;li&gt;Always explicitly allow critical Kubernetes ports (6443, 2379, 2380, 10250, 53)&lt;/li&gt;
&lt;li&gt;Test network policies in staging environments, never directly in production&lt;/li&gt;
&lt;li&gt;Know how to use &lt;code class=&quot;language-text&quot;&gt;etcd --force-new-cluster&lt;/code&gt; before you need it&lt;/li&gt;
&lt;li&gt;Maintain regular etcd backups and document recovery procedures&lt;/li&gt;
&lt;li&gt;Implement monitoring and alerting for etcd cluster health&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;etcd --force-new-cluster&lt;/code&gt; command saved us from rebuilding the entire cluster from scratch. Every Kubernetes administrator should understand this critical disaster recovery tool.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[[Personal Takes] Network Storage: Principal]]></title><description><![CDATA[Warning: This post is mostly about Ceph, but the principles apply to most distributed storage systems. Your mileage may vary with other…]]></description><link>https://nicolas.my.id/network-storage/</link><guid isPermaLink="false">https://nicolas.my.id/network-storage/</guid><pubDate>Wed, 11 Dec 2024 06:44:58 GMT</pubDate><content:encoded>&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;: This post is mostly about Ceph, but the principles apply to most distributed storage systems. Your mileage may vary with other solutions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;The Reality Check&lt;/h2&gt;
&lt;p&gt;After years of building, breaking, and rebuilding network storage systems, I&apos;ve learned that most documentation glosses over the harsh realities. The vendor presentations show perfect scenarios with uniform hardware and infinite budgets. The real world? Well, that&apos;s messier. Here are the hard-earned lessons that&apos;ll save you some sleepless nights.&lt;/p&gt;
&lt;h2&gt;1. Why Busy the Network if We Don&apos;t Have To?&lt;/h2&gt;
&lt;p&gt;This might sound obvious, but you&apos;d be amazed how often people overcomplicate their storage architecture. Every byte that crosses the network is a byte that could cause latency, congestion, or worse - complete failure during peak loads.&lt;/p&gt;
&lt;p&gt;The principle is simple: &lt;strong&gt;keep data local whenever possible&lt;/strong&gt;. If your application can work with local storage, don&apos;t force it through the network just because you have a fancy distributed storage system. Reserve network storage for when you actually need the redundancy, accessibility, or shared state.&lt;/p&gt;
&lt;p&gt;I&apos;ve seen perfectly good applications hobbled by unnecessary network hops. Sometimes the best network storage solution is no network storage at all.&lt;/p&gt;
&lt;h2&gt;2. How to Move Data Fast? Don&apos;t Move It at All&lt;/h2&gt;
&lt;p&gt;The fastest data transfer is the one that never happens. This isn&apos;t just philosophical - it&apos;s practical architecture.&lt;/p&gt;
&lt;p&gt;Instead of designing systems that constantly shuffle data around, design them to minimize data movement from the start. Use techniques like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data locality&lt;/strong&gt;: Keep related data on the same nodes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smart caching&lt;/strong&gt;: Cache frequently accessed data locally&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lazy replication&lt;/strong&gt;: Only replicate when necessary, not because you can&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you absolutely must move data, batch it. Move large chunks during off-peak hours rather than constant tiny transfers that create network chatter.&lt;/p&gt;
&lt;h2&gt;3. Fast Local Storage is Easy and Cheap. Fast Shared Storage is Hard and Expensive&lt;/h2&gt;
&lt;p&gt;This is the fundamental economics of storage that marketing teams don&apos;t want you to understand. You can build blazing-fast local storage with consumer SSDs for a fraction of what enterprise shared storage costs.&lt;/p&gt;
&lt;p&gt;But the moment you want that performance &lt;strong&gt;shared&lt;/strong&gt; across multiple nodes? Welcome to complexity hell. Now you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High-speed networking (expensive)&lt;/li&gt;
&lt;li&gt;Specialized protocols (complex)&lt;/li&gt;
&lt;li&gt;Redundancy mechanisms (more expensive)&lt;/li&gt;
&lt;li&gt;Synchronization overhead (performance killer)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&apos;t build shared storage unless you genuinely need it. And if you do need it, budget accordingly - both in money and complexity.&lt;/p&gt;
&lt;h2&gt;4. Your Cluster Storage System is Only as Good as Its Network&lt;/h2&gt;
&lt;p&gt;I cannot stress this enough: &lt;strong&gt;your storage cluster will perform like your worst network link&lt;/strong&gt;. It doesn&apos;t matter if you have the fastest SSDs money can buy if they&apos;re connected with gigabit Ethernet from 2010.&lt;/p&gt;
&lt;p&gt;Network considerations for storage clusters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bandwidth&lt;/strong&gt;: More is always better, but consistency matters more&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latency&lt;/strong&gt;: Low latency beats high bandwidth for small operations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reliability&lt;/strong&gt;: One flaky switch can bring down your entire cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Invest in your network infrastructure. It&apos;s not glamorous, but it&apos;s the foundation everything else depends on.&lt;/p&gt;
&lt;h2&gt;5. Mixing Drive Capacities: Proceed with Extreme Caution&lt;/h2&gt;
&lt;p&gt;&quot;It&apos;s okay to mix drive capacities, but keep them as uniform as possible.&quot; This sounds contradictory, but here&apos;s the reality:&lt;/p&gt;
&lt;p&gt;When you mix drive sizes, several problems emerge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Uneven distribution&lt;/strong&gt;: Smaller disks fill up faster, creating hotspots&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Placement group imbalance&lt;/strong&gt;: Larger disks handle more placement groups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uneven wear&lt;/strong&gt;: Some disks work harder than others, failing sooner&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance degradation&lt;/strong&gt;: The cluster performance drops to accommodate the differences&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you must mix capacities (and sometimes you must), try to keep ratios reasonable. Don&apos;t put 1TB drives next to 10TB drives in the same pool. Your future self will thank you.&lt;/p&gt;
&lt;h2&gt;6. Don&apos;t Exceed 80% Capacity if You Want Nice Weekend Trips&lt;/h2&gt;
&lt;p&gt;This is the &quot;golden rule&quot; of storage administration, and it exists for good reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance degradation&lt;/strong&gt;: Most storage systems slow down significantly above 80% capacity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rebalancing headaches&lt;/strong&gt;: Less free space means longer recovery times&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Emergency buffer&lt;/strong&gt;: You need space for temporary operations and emergency growth&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Peace of mind&lt;/strong&gt;: Nothing ruins a weekend like a full storage cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;ve learned this the hard way. That extra 15% capacity seems wasteful until you&apos;re frantically trying to free up space at 2 AM because someone decided to upload their entire video collection to the company share.&lt;/p&gt;
&lt;h2&gt;7. We&apos;ll Figure It Out on the Fly&lt;/h2&gt;
&lt;p&gt;This isn&apos;t defeatism - it&apos;s pragmatism. No matter how much you plan, real-world usage will surprise you. Applications will behave differently than expected. Users will find creative ways to stress your system. Hardware will fail in ways the vendor said were impossible.&lt;/p&gt;
&lt;p&gt;The key is building systems that are &lt;strong&gt;observable&lt;/strong&gt; and &lt;strong&gt;adjustable&lt;/strong&gt;. You need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Good monitoring&lt;/strong&gt;: Know what&apos;s happening in real-time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible architecture&lt;/strong&gt;: Be able to adapt without complete rebuilds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Write down what you learn for next time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&apos;t aim for perfection on day one. Aim for &quot;good enough to start&quot; and &quot;flexible enough to improve.&quot;&lt;/p&gt;
&lt;h2&gt;8. Don&apos;t Sabotage Your Beautiful Cluster with Terrible Frontend Networking&lt;/h2&gt;
&lt;p&gt;This is the classic mistake: spending thousands on high-performance storage nodes, then connecting clients through whatever network infrastructure was lying around.&lt;/p&gt;
&lt;p&gt;Your storage cluster might be capable of hundreds of thousands of IOPS, but if clients connect through old gigabit switches with oversubscribed uplinks, users will experience the performance of those old gigabit switches.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The client experience is what matters.&lt;/strong&gt; Build your network architecture from the user backward, not from storage forward.&lt;/p&gt;
&lt;h2&gt;The Bottom Line&lt;/h2&gt;
&lt;p&gt;Network storage is about trade-offs, not absolutes. Every decision has consequences, and those consequences compound over time. The best storage architecture is the one that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Meets your actual needs (not your imagined ones)&lt;/li&gt;
&lt;li&gt;Fits your budget (including operational costs)&lt;/li&gt;
&lt;li&gt;Can evolve as requirements change&lt;/li&gt;
&lt;li&gt;Doesn&apos;t keep you up at night&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Remember&lt;/strong&gt;: perfect is the enemy of good, but &quot;good enough&quot; is the enemy of excellent. Find your balance, document your decisions, and always keep learning.&lt;/p&gt;
&lt;p&gt;Because in six months, you&apos;ll need to explain to your future self why you made these choices. Make sure it&apos;s a conversation you&apos;ll enjoy having.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Expose Service In Your Baremetal without Public IP in Kubernetes with Cloudflare Tunnel]]></title><description><![CDATA[Thumbnail: "Indonesian Students in Prague, Czech Republic During the Graduation of One of Their Friends in 1968. Photo from Soegeng Soejono…]]></description><link>https://nicolas.my.id/exposing-service-in-kubernetes-with-cloudflare-tunnel/</link><guid isPermaLink="false">https://nicolas.my.id/exposing-service-in-kubernetes-with-cloudflare-tunnel/</guid><pubDate>Mon, 04 Mar 2024 11:54:36 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Thumbnail&lt;/strong&gt;: &lt;em&gt;&quot;Indonesian Students in Prague, Czech Republic During the Graduation of One of Their Friends in 1968. Photo from Soegeng Soejono&apos;s Archive.&quot;&lt;/em&gt; - &lt;a href=&quot;https://www.vice.com/id/article/pakmpn/gestapu-menghapus-satu-generasi-intelektual-indonesia&quot;&gt;Gestapu Menghapus Satu Generasi Intelektual Indonesia&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;So if we are hosting our own Kubernetes, one of problem is expose your service, how to do that? NodePort? Loadbalancer, or what?. This problem is make &lt;a href=&quot;https://metallb.universe.tf&quot;&gt;metallb.universe.tf&lt;/a&gt; born.&lt;/p&gt;
&lt;p&gt;But even white these tools, we still need to have deal with IPs pools, route, etc. It&apos;s good if when you need it, but what if your goals is just get &lt;code class=&quot;language-text&quot;&gt;ingress-nginx&lt;/code&gt;, and point your DNS to IP from cloudflare, and enable Cloudflare Proxy? then this is the right blog post for you. You can just utilize &lt;strong&gt;Cloudflare Tunnel&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Lets get into the details.&lt;/p&gt;
&lt;h2&gt;What is Cloudflare Tunnel&lt;/h2&gt;
&lt;p&gt;Cloudflare Tunnel provides you with a secure way to connect your resources to Cloudflare without a publicly routable IP address. With Tunnel, you do not send traffic to an external IP — instead, a lightweight daemon in your infrastructure (‘cloudflared’) creates outbound-only connections to Cloudflare’s global network.&lt;/p&gt;
&lt;p&gt;This way, your origins can serve traffic through Cloudflare without being vulnerable to attacks that bypass Cloudflare.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/111feb9ce469c67a44d4a2aed0462be5/ccf45/How-it-works.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.0253164556962%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB3VSUD//EABUQAQEAAAAAAAAAAAAAAAAAAAEg/9oACAEBAAEFAmv/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAUEAEAAAAAAAAAAAAAAAAAAAAg/9oACAEBAAY/Al//xAAYEAADAQEAAAAAAAAAAAAAAAAAASEQEf/aAAgBAQABPyGOlYtR/9oADAMBAAIAAwAAABBQD//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABsQAAIDAAMAAAAAAAAAAAAAAAABESExQXGh/9oACAEBAAE/EGaNLhvZwfA6V6Si9GvSEsrowf/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;How it works&quot;
        title=&quot;&quot;
        src=&quot;/static/111feb9ce469c67a44d4a2aed0462be5/828fb/How-it-works.jpg&quot;
        srcset=&quot;/static/111feb9ce469c67a44d4a2aed0462be5/ff44c/How-it-works.jpg 158w,
/static/111feb9ce469c67a44d4a2aed0462be5/a6688/How-it-works.jpg 315w,
/static/111feb9ce469c67a44d4a2aed0462be5/828fb/How-it-works.jpg 630w,
/static/111feb9ce469c67a44d4a2aed0462be5/0ede0/How-it-works.jpg 945w,
/static/111feb9ce469c67a44d4a2aed0462be5/3ac88/How-it-works.jpg 1260w,
/static/111feb9ce469c67a44d4a2aed0462be5/ccf45/How-it-works.jpg 1768w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Let&apos;s just set it up!&lt;/h2&gt;
&lt;h3&gt;1. Get your cloudflare tunnel token&lt;/h3&gt;
&lt;p&gt;Login to your cloudflare accout, navigate to &lt;a href=&quot;https://one.dash.cloudflare.com&quot;&gt;one.dash.cloudflare.com&lt;/a&gt;, follow these guide &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel/&quot;&gt;get-started - cloudflare tunnel&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;2. Create a daemonset in your Kubernetes&lt;/h3&gt;
&lt;p&gt;Put your token value inside &lt;code class=&quot;language-text&quot;&gt;TUNNEL_TOKEN&lt;/code&gt; key, and then you ready to deploy it.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; v1
&lt;span class=&quot;token key atrule&quot;&gt;stringData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;TUNNEL_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; eyJhXXXXxXXxXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTM3OWJXXXXXXxxxxXXXXXxxxxxxxXXXXXXXXXXXXXXXXFNCJ9
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Secret
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cf&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;tunel&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;production
  &lt;span class=&quot;token key atrule&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudflared
&lt;span class=&quot;token key atrule&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Opaque
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; apps/v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; DaemonSet
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudflared
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudflared&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;daemonset
  &lt;span class=&quot;token key atrule&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudflared
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;matchLabels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;pod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudflared
  &lt;span class=&quot;token key atrule&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;pod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudflared
    &lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; cloudflared
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; tunnel
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;metrics
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; 0.0.0.0&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; run
          &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudflare/cloudflared&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;latest
          &lt;span class=&quot;token key atrule&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; NO_AUTOUPDATE
              &lt;span class=&quot;token key atrule&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;envFrom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;secretRef&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cf&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;tunel&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;production
          &lt;span class=&quot;token key atrule&quot;&gt;imagePullPolicy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Always
          &lt;span class=&quot;token key atrule&quot;&gt;livenessProbe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;failureThreshold&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;httpGet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /ready
              &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;scheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; HTTP
            &lt;span class=&quot;token key atrule&quot;&gt;initialDelaySeconds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;periodSeconds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;successThreshold&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;timeoutSeconds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudflared&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl create ns cloudflared
kubectl create &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; deployment-cloudflare-tunnel.yaml &lt;span class=&quot;token comment&quot;&gt;# above yaml files.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;3. Point your service&lt;/h3&gt;
&lt;p&gt;Let&apos;s say you wanna expose the Ingress-Nginx, so you can just point everything at the same tunnel.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/742934d7bad5cc08734378543386eb88/b325c/leave-it-blank.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 45.56962025316456%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA7ElEQVR42p2RXWrFIBCFs/9FdB/dQJ/71udwoTESrYl/UUdPVfC2lJZyE/iCjOOZc5hp4RI3JsE3CbFtkFKilIKr37TvCuvyjnVl4JyDMQbv/SWxZmRSSmGeZxhjEGPEeZ44jgNaa+Sc780hhD7ou/ufSbpgaxpiRKmKEM5as9YgE/V6o/U02sBRo3r/q0MhJFJKWLnAwhU+dgdRkZWcy2OR2yTnbI3joI2FOnwXlHs9a38XbM3/LasLUn3gAmAj4Cv5+oKHYEZMXxDlvozBcPYX9YeQCoxvxjKmURyUB6Aep+D1VvD0UvD8VvAJ+tnDkW9rcc4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Leave subdomain blank&quot;
        title=&quot;&quot;
        src=&quot;/static/742934d7bad5cc08734378543386eb88/f058b/leave-it-blank.png&quot;
        srcset=&quot;/static/742934d7bad5cc08734378543386eb88/c26ae/leave-it-blank.png 158w,
/static/742934d7bad5cc08734378543386eb88/6bdcf/leave-it-blank.png 315w,
/static/742934d7bad5cc08734378543386eb88/f058b/leave-it-blank.png 630w,
/static/742934d7bad5cc08734378543386eb88/40601/leave-it-blank.png 945w,
/static/742934d7bad5cc08734378543386eb88/78612/leave-it-blank.png 1260w,
/static/742934d7bad5cc08734378543386eb88/b325c/leave-it-blank.png 2770w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8e93e2f38d576723e2215334ef8ca05e/38abd/point-dns.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 31.0126582278481%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAvklEQVR42q2Pyw6CMBBF+//f4j+4dOHaREANQrEFKS2vFClwpXVjIGyMk5zM685MhvBMgrIcShb4hxHdViiVAstbyPqFuq6gtcY0TT9BQl7CpwrXR4neDBiGD0vhln333MLDbcLu2GJ/arE1Z4xB13UYx3F1pO97NE3j+lZHjK4gRY6yeKIoBOT8vlogpQTnHIwxpGnqvM1tbMmyDEIIpyU0SRAEF5w9D57nI7zHiOM1lFIks9b6JbYeRZFb/gYK286IOhxsegAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Point tunnel to ingress nginx&quot;
        title=&quot;&quot;
        src=&quot;/static/8e93e2f38d576723e2215334ef8ca05e/f058b/point-dns.png&quot;
        srcset=&quot;/static/8e93e2f38d576723e2215334ef8ca05e/c26ae/point-dns.png 158w,
/static/8e93e2f38d576723e2215334ef8ca05e/6bdcf/point-dns.png 315w,
/static/8e93e2f38d576723e2215334ef8ca05e/f058b/point-dns.png 630w,
/static/8e93e2f38d576723e2215334ef8ca05e/40601/point-dns.png 945w,
/static/8e93e2f38d576723e2215334ef8ca05e/78612/point-dns.png 1260w,
/static/8e93e2f38d576723e2215334ef8ca05e/38abd/point-dns.png 2766w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Also if your goals is just make HTTPS from user to your site, then just ignore the verify so you dont have to deal with Failed termination or ininitfy loops.&lt;/p&gt;
&lt;p&gt;To edit, just click on &lt;strong&gt;&quot;Additional application settings&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8f17238076f272e7fd4023b81495a452/ed84e/disable-verify.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 38.60759493670886%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxklEQVR42p1Ryw6DMAzr///lLrvwLC19peDhoiIEaJMWyYoojuMkykdBzoJ1XfFPsO5cq5qmATHPM0IIB7z3EJGfgiklxBgLl8Kq6zpU8EclMJNUkXO+5c0bJMmO7W1ZFqhhGKC1vjmk6Pn77Nw5VxoyKGScRUhxmx+7Q2NMIZBMPAlVMbo4h2xOX90b2tt9h33fHx2vIz+hHqEegg04MicsOxzHEdM0HQ6+jcp8jSwZ1tpiqjhs2xYEH64CdU+/rsx63oKCH1j5c4uX9OZVAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Ignore verify cert&quot;
        title=&quot;&quot;
        src=&quot;/static/8f17238076f272e7fd4023b81495a452/f058b/disable-verify.png&quot;
        srcset=&quot;/static/8f17238076f272e7fd4023b81495a452/c26ae/disable-verify.png 158w,
/static/8f17238076f272e7fd4023b81495a452/6bdcf/disable-verify.png 315w,
/static/8f17238076f272e7fd4023b81495a452/f058b/disable-verify.png 630w,
/static/8f17238076f272e7fd4023b81495a452/40601/disable-verify.png 945w,
/static/8f17238076f272e7fd4023b81495a452/78612/disable-verify.png 1260w,
/static/8f17238076f272e7fd4023b81495a452/ed84e/disable-verify.png 2656w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;4. Lets try expose an app&lt;/h3&gt;
&lt;p&gt;This is example of my apps running in kubernetes withs service name &lt;code class=&quot;language-text&quot;&gt;nginx-test-expose&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; networking.k8s.io/v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Ingress
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nginx
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ingressClassName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nginx
  &lt;span class=&quot;token key atrule&quot;&gt;rules&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;not-actual-my-domain.io&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /
        &lt;span class=&quot;token key atrule&quot;&gt;pathType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Prefix
        &lt;span class=&quot;token key atrule&quot;&gt;backend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nginx&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;test&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;expose
            &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8080&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;tls&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;hosts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; not&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;actual&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;my&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;domain.io&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Final, results
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0870e55de65c88abfff50f8080e5f30e/d185f/example-app.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 72.15189873417721%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAACJklEQVR42p2SS2tTQRTHJygVi6UbN4IUKvVJP0OvEvwArlx14dKFoME0LZqFyJWWuEgkuLMggk36VQKBvJObF0nIo3ncvMjzJnOc/2hDIlWiF/537py585v/OXPYdXb/9o3Ve56ta0+821efebYuPfVuXHnsvcxu/qaNBa0IrZlueVfZXc+a6cHpumn7ZIVt3mHPd+3Ke8sXOtr7LnTCDw+OST34TG9eOujtq48zYT4vxD7sfSL19TE/2v9Gh/tf6cXuO4UlEokdvdkwGnrNIJqMicj4R832RCKRHRaNRpVms0nhcIRisRjXtCSJQyiXy9HZWZXq9To1Gg3q9/vEOafpdLqgyWTCER+PxxQMBhUJ7Ha7gJHP5+PJZJKgTCZDg8GAlng4XgK8CBSjcBnmoVCISqUSVatVeepwOCTDMOQGCK7m5+If6RAxCfT7/UqxWCSRP1LlcHruEKlXKhWZcqvVIpSm0+lQrVaTpcBcrHHEcDDMMVDhCM7i8TgvFAoShhpiY6/Xk5B2uy2FbADHN0Yxl8DRaPQTiBcWRbqwzOFKgAmuAUM6/1VDgHDLIkipVIry+bxMFTU7v90/wP8OTKfTFAgE5CUBjng2m5WudV2XhPm2uRCIGmCDcCbbBu5wGSg86oRawi3+Qz9ihIlftbsYCBDaBm40TaNyuUxLPjMgOobZbLZ1h8Px0Gq1mi0Wi9lut8tRVVWz2+02O53OpeRyuR6B9QPUAZTSuuCecAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Example App in Main TLD Domain, with Cloudflare Tunnel&quot;
        title=&quot;&quot;
        src=&quot;/static/0870e55de65c88abfff50f8080e5f30e/f058b/example-app.png&quot;
        srcset=&quot;/static/0870e55de65c88abfff50f8080e5f30e/c26ae/example-app.png 158w,
/static/0870e55de65c88abfff50f8080e5f30e/6bdcf/example-app.png 315w,
/static/0870e55de65c88abfff50f8080e5f30e/f058b/example-app.png 630w,
/static/0870e55de65c88abfff50f8080e5f30e/40601/example-app.png 945w,
/static/0870e55de65c88abfff50f8080e5f30e/78612/example-app.png 1260w,
/static/0870e55de65c88abfff50f8080e5f30e/d185f/example-app.png 2686w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Pros and Cons&lt;/h2&gt;
&lt;p&gt;If you want to implement this architecture, you have to consider did your egress traffic is free? if yes, the you are lucky. If not you should consire just using Public IP just like usual. Cause traffic cost is very scary!&lt;/p&gt;
&lt;p&gt;The pros is you have your simple apps easy quck behind cloudflare, anti DDOS, etc. But the cons is you are depens on cloudflare Proxy &lt;strong&gt;(But is actualy the same like you are using cloudflare with Proxied)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The choice is yours!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Configuring WordPress Behind Ingress Nginx in Kubernetes with Cloudflare]]></title><description><![CDATA[This setup will help you configure WordPress behind an Ingress Nginx in a Kubernetes cluster while using Cloudflare for SSL/TLS termination…]]></description><link>https://nicolas.my.id/configuring-wordpress-behind-ingress-nginx-in-kubernetes-with-cloudflare/</link><guid isPermaLink="false">https://nicolas.my.id/configuring-wordpress-behind-ingress-nginx-in-kubernetes-with-cloudflare/</guid><pubDate>Tue, 26 Sep 2023 21:48:36 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;This setup will help you configure WordPress behind an Ingress Nginx in a Kubernetes cluster while using Cloudflare for SSL/TLS termination and security.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1. Set Home Page&lt;/h2&gt;
&lt;p&gt;Log in to your database, and update the &lt;code class=&quot;language-text&quot;&gt;wp_options&lt;/code&gt; table:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;mysql&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; wp_options &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; option_value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;https://migrate.nicolas.io/&apos;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; option_name &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;siteurl&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;home&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
Query OK&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;rows&lt;/span&gt; affected &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.00&lt;/span&gt; sec&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;Rows&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;matched&lt;/span&gt;: &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;  Changed: &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;Warnings&lt;/span&gt;: &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;2. WordPress Configuration&lt;/h2&gt;
&lt;p&gt;Add the following logic to your &lt;code class=&quot;language-text&quot;&gt;wp-config.php&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// If we&apos;re behind a proxy server and using HTTPS, we need to alert WordPress of that fact&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// see also https://wordpress.org/support/article/administration-over-ssl/#using-a-reverse-proxy&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;strpos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;HTTP_X_FORWARDED_PROTO&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;https&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;HTTPS&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;on&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// (we include this by default because reverse proxying is extremely common in container environments)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;3. Set Cloudflare SSL/TLS to Full/Strict&lt;/h2&gt;
&lt;p&gt;Navigate to your Cloudflare account and update your SSL/TLS settings.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d2a4ff90b5de0cb2eadac00eab3eeaff/b12f7/cloudflare_full_ssl.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.53164556962025%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABU0lEQVR42pVS2W4CMQzc//+UfkefUVWpvLTiKix7kj2yV46dZkIDFKkSRLLGTpyJPXHUDwOEEKjrGk3ToKoq7xMHd/bsimTXIU1T5HmOoii8T8yyDOM4Pk84zzOuBtzGt8tai77vXRc1ZPd/5dGjL5MwdCJEhWmaYIzxprW+FBDttlu0ssWoFKzYw65fYTqBwV2QUnp9w2VqzCqpLbFzchGZx3NP+LFcIk6OSIoM+vCO8e0FQ7nD0cX7wwGLxcIT8QJ1JQG1DaTBuMcqo8DMNVsN5SqFNZc2QyKNPx/ImUdj9cFnfsSfoGPs9WOs8xkTL4+5g7IsfZVETgLlCBKwfT4Uta1E2zao2xGnxqCsNXJnonUtVtppeyadPenfKbifBK/hdz5glYz4jBW+jgqbdMQ66Rz2WMUSm6T3cXxyH2MfmENlZkz63izUL/pYneP5gcH+AXcuWrxvzBWYAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Cloudflare SSL/TLS Settings&quot;
        title=&quot;&quot;
        src=&quot;/static/d2a4ff90b5de0cb2eadac00eab3eeaff/f058b/cloudflare_full_ssl.png&quot;
        srcset=&quot;/static/d2a4ff90b5de0cb2eadac00eab3eeaff/c26ae/cloudflare_full_ssl.png 158w,
/static/d2a4ff90b5de0cb2eadac00eab3eeaff/6bdcf/cloudflare_full_ssl.png 315w,
/static/d2a4ff90b5de0cb2eadac00eab3eeaff/f058b/cloudflare_full_ssl.png 630w,
/static/d2a4ff90b5de0cb2eadac00eab3eeaff/40601/cloudflare_full_ssl.png 945w,
/static/d2a4ff90b5de0cb2eadac00eab3eeaff/b12f7/cloudflare_full_ssl.png 1020w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;4. Ingress Configuration&lt;/h2&gt;
&lt;p&gt;Create your Ingress configuration YAML file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; networking.k8s.io/v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Ingress
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; wordpress&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;migrate
  &lt;span class=&quot;token key atrule&quot;&gt;annotations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;kubernetes.io/ingress.class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nginx
    &lt;span class=&quot;token key atrule&quot;&gt;nginx.ingress.kubernetes.io/proxy-body-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 500m
    &lt;span class=&quot;token key atrule&quot;&gt;nginx.ingress.kubernetes.io/proxy-read-timeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1000s
    &lt;span class=&quot;token key atrule&quot;&gt;nginx.org/proxy-read-timeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1000s
    &lt;span class=&quot;token key atrule&quot;&gt;nginx.ingress.kubernetes.io/configuration-snippet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
      more_set_headers   &quot;X-Forwarded-Proto https&quot;;&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;rules&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;migrate.nicolas.io&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;pathType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Prefix
            &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /
            &lt;span class=&quot;token key atrule&quot;&gt;backend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; wp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;migrate
                &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                  &lt;span class=&quot;token key atrule&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;tls&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;hosts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; migrate.nicolas.io
      &lt;span class=&quot;token key atrule&quot;&gt;secretName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; wildcard&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;nicolas&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;io&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;5. DNS Configuration&lt;/h2&gt;
&lt;p&gt;Finally, point your DNS to the IP address of your Ingress Nginx.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Getting Secrets from HashiCorp Vault in Ansible Playbooks]]></title><description><![CDATA[In this blog post, I'll explain how to securely manage secret dependencies in your infrastructure using HashiCorp Vault and Ansible. Storing…]]></description><link>https://nicolas.my.id/getting-secrets-from-hashicorp-vault-in-ansible-playbooks/</link><guid isPermaLink="false">https://nicolas.my.id/getting-secrets-from-hashicorp-vault-in-ansible-playbooks/</guid><pubDate>Fri, 15 Sep 2023 15:03:57 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;In this blog post, I&apos;ll explain how to securely manage secret dependencies in your infrastructure using HashiCorp Vault and Ansible. Storing keys inside your repositories can be risky, and I&apos;ll show you a better way.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;Before we get started, make sure you have the following prerequisites in place:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install the Latest Version of Ansible:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure you have the most up-to-date version of Ansible installed on your system.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the Ansible Community HashiCorp Vault Collection:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can install it by running the following command:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ansible-galaxy collection &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; community.hashi_vault&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;To confirm the installation, run:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ansible-galaxy collection list &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt;  community.hashi_vault&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the Python Module &lt;code class=&quot;language-text&quot;&gt;hvac&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install the &lt;code class=&quot;language-text&quot;&gt;hvac&lt;/code&gt; module using pip:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; hvac&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Create Your Ansible Playbooks&lt;/h3&gt;
&lt;p&gt;Here&apos;s an example of an Ansible playbook that retrieves secrets from HashiCorp Vault:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Return all kv v2 secrets from a path
  &lt;span class=&quot;token key atrule&quot;&gt;hosts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; test
  &lt;span class=&quot;token key atrule&quot;&gt;tasks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Get required secret from Vault
      &lt;span class=&quot;token key atrule&quot;&gt;ansible.builtin.set_fact&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;apm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ lookup(&apos;community.hashi_vault.vault_kv2_get&apos;, &apos;apm&apos;, url=&apos;https://your.vault-server.service&apos;) }}&quot;&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Display the APM Results
      &lt;span class=&quot;token key atrule&quot;&gt;ansible.builtin.debug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Activeate : {{ apm.secret.ELASTIC_APM_ACTIVE }}&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Environment : {{ apm.secret.ELASTIC_APM_ENVIRONMENT }}&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;The Secret: {{ apm.secret.ELASTIC_APM_SECRET_TOKEN }}&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;The URL : {{ apm.secret.ELASTIC_APM_SERVER_URL }}&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Run Your Ansible Playbooks&lt;/h3&gt;
&lt;p&gt;To run your Ansible playbooks securely with HashiCorp Vault, follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Set the environment variables &lt;code class=&quot;language-text&quot;&gt;ANSIBLE_HASHI_VAULT_TOKEN&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;ANSIBLE_HASHI_VAULT_AUTH_METHOD&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;ANSIBLE_HASHI_VAULT_TOKEN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;YOURSECRETKEYYYYYYYYYYYY
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;ANSIBLE_HASHI_VAULT_AUTH_METHOD&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;token&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Execute your playbook:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ansible-playbook &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; inventory.ini vault.yml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9cf2dd82d08e664e4f9b8e2c541801d6/20f89/ansible-result.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51.89873417721519%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABXUlEQVR42pVS2W6DMBDkI6o+VKKt1ADmDLbxxREgCW3+/4ema6hURU3V9GE0LJjZ2R0H2s5w3QLeHFCLHo3uIKQDFxZpzq+Q/YI8F2BpDa0HBKY9oyVBZWZoe4J1C2y7wLgzic934gjRTGTsHYHsZuouELMKXB0g6YNsRjowQqrpLnhRf95PGqjhRJYlGKvRuBmKuslV7P+C1guWqkfhHBIuUQ8jajOirHtUhLJqUdyBct8iL91qIkhSg2I8oFxGPIYveAhDPIURnl9TREzSKpo/kaQKUSLBJYXCCg2WKaTEcUy7TAQyei4qu3bec3K67zbHxFvdXtXeJcvMGmxQ1ZY6UPSFoetCYdgJuj2hHy6U+hHDeFnT9wv3dTd8QBvi/oup9vvzDYw7kiAf6A7p1fY6QuIhEZHb6AbviHfxNfv/3iKxjZzkBuwG0txf7I2/3xlah/3BGXFMhho94RNzvj44z/rh7wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Result&quot;
        title=&quot;&quot;
        src=&quot;/static/9cf2dd82d08e664e4f9b8e2c541801d6/f058b/ansible-result.png&quot;
        srcset=&quot;/static/9cf2dd82d08e664e4f9b8e2c541801d6/c26ae/ansible-result.png 158w,
/static/9cf2dd82d08e664e4f9b8e2c541801d6/6bdcf/ansible-result.png 315w,
/static/9cf2dd82d08e664e4f9b8e2c541801d6/f058b/ansible-result.png 630w,
/static/9cf2dd82d08e664e4f9b8e2c541801d6/40601/ansible-result.png 945w,
/static/9cf2dd82d08e664e4f9b8e2c541801d6/20f89/ansible-result.png 1213w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After running your playbook, you&apos;ll securely retrieve secrets from HashiCorp Vault and be able to use them in your Ansible tasks.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Menjalankan Windows Server Dengan Kubevirt]]></title><description><![CDATA[Pada artikel ini, saya akan menunjukkan bagaimaan cara memenuhi kebutuhan server Windows Kita dengan KubeVirt. Saya juga akan menjelaskan…]]></description><link>https://nicolas.my.id/menjalankan-windows-server-dengan-kubevirt/</link><guid isPermaLink="false">https://nicolas.my.id/menjalankan-windows-server-dengan-kubevirt/</guid><pubDate>Sat, 15 Apr 2023 21:59:36 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Pada artikel ini, saya akan menunjukkan bagaimaan cara memenuhi kebutuhan server Windows Kita dengan KubeVirt. Saya juga akan menjelaskan beberapa kasus di mana Kita bisa memilih Kubevirt sebagai pilihan yang tepat.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Latar Belakang&lt;/h2&gt;
&lt;p&gt;Saya bekerja untuk perusahaan yang memiliki applikasi yang berjalan di Server Windows, dan biaya menggunakan windows di &lt;em&gt;Public Cloud&lt;/em&gt; cukup tinggi. Untuk mengatasi tantangan ini, saya mengusulkan solusi untuk menjalankan server Windows pada BMAAS yang sudah kita sewa (sudah menjadi cluster kubernetes). Pendekatan ini tidak hanya memberikan latensi yang lebih baik karena server ada di Indonesia, tetapi juga signifikan mengurangi biaya.&lt;/p&gt;
&lt;h2&gt;Persyaratan&lt;/h2&gt;
&lt;h3&gt;1. Virtualisasi Diaktifkan&lt;/h3&gt;
&lt;p&gt;Pastikan &lt;em&gt;node&lt;/em&gt; kubernetes Kita sudah mengaktifkan mode virtualisasi.&lt;/p&gt;
&lt;h3&gt;2. Penyimpanan Backend Yang Persisten&lt;/h3&gt;
&lt;p&gt;Kita membutuhkan storageclass kubernetes dengan penyimpanan backend persisten seperti CEPH, Longhorn, vSAN, atau apa pun.&lt;/p&gt;
&lt;h3&gt;3. Pahami Apa yang Dilakukan Kubevirt&lt;/h3&gt;
&lt;p&gt;Jika Anda belum memahami apa yang dilakukan kubevirt, &lt;em&gt;kubevirt pada dasarnya melakukan automasi terhadap operasional kvm dan qemu dengan YAML kubernetes&lt;/em&gt;. Lihat &lt;a href=&quot;https://kubevirt.io&quot;&gt;kubevirt.io&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;4. Menginstal KubeVirt dan Container Data Importer Engine&lt;/h3&gt;
&lt;p&gt;Ikuti panduan dari dokumen resmi, atau baca artikel saya sebelumnya &lt;a href=&quot;https://nicolas.my.id/virtualmachine-orcestration-with-kubevirt/&quot;&gt;tentang kubevirt&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;5. Plugin Virt Kubectl&lt;/h3&gt;
&lt;p&gt;Kita memerlukan plugin ini untuk memudahkan hidup kita, instal dengan &lt;a href=&quot;https://krew.sigs.k8s.io/&quot;&gt;krew.sigs.k8s.io&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ kubectl krew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; virt                  &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Mari Buat Windows Kita&lt;/h2&gt;
&lt;p&gt;Dalam blog ini, saya akan menggunakan &lt;em&gt;image base&lt;/em&gt; dari &lt;a href=&quot;https://cloudbase.it/windows-cloud-images/&quot;&gt;cloudbase.it&lt;/a&gt;, karena &lt;em&gt;image&lt;/em&gt; tersebut sudah terdapat &lt;strong&gt;cloudinit&lt;/strong&gt; atau beberapa orang mungkin mengatakan &quot;Cloud Native&quot;.&lt;/p&gt;
&lt;h3&gt;1. Unduh Image Base&lt;/h3&gt;
&lt;p&gt;Unduh &lt;em&gt;image base&lt;/em&gt; dari tempat di mana kita dapat mengakses cluster kita dengan &lt;code class=&quot;language-text&quot;&gt;kubectl&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;2. Forward Service CDI Upload Proxy ke Local&lt;/h3&gt;
&lt;p&gt;Container data Importer Engine mempunyai proxy yang dapat kita gunakan untuk mengunggah file &lt;em&gt;image base&lt;/em&gt; kita mejadi PVC. Di sini saya melakukan &lt;em&gt;forwarding&lt;/em&gt; port 6969 di localhost saya menuju service &lt;code class=&quot;language-text&quot;&gt;cdi-uploadproxy&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl port-forward svc/cdi-uploadproxy &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; cdi &lt;span class=&quot;token number&quot;&gt;6969&lt;/span&gt;:443&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;3. Unggah Image Base Dengan Virt Plugin&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl virt image-upload &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
--image-path&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;./windows_server_2012_kvm.qcow2 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
--pvc-name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;iso-winserver-r12 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
--access-mode&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ReadWriteOnce &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
--pvc-size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;20G &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
--storage-class&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;kind-local &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
--uploadproxy-url&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://localhost:6969 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;--insecure&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;4. Buat Spesifikasi Perangkat Windows Kita&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; kubevirt.io/v1alpha3
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; VirtualMachine
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;creationTimestamp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token datetime number&quot;&gt;2023-04-10T15:03:08Z&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;generation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;kubevirt.io/os&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; windows
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; windowsvm1
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;running&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;creationTimestamp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null important&quot;&gt;null&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;kubevirt.io/domain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; windowsvm1
    &lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;cpu&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;cores&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;devices&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;disks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;disk&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;bus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; virtio
            &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; disk0
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;cdrom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;bus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sata
              &lt;span class=&quot;token key atrule&quot;&gt;readonly&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudinitdisk
        &lt;span class=&quot;token key atrule&quot;&gt;machine&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; q35
        &lt;span class=&quot;token key atrule&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;memory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4096M
      &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; disk0
        &lt;span class=&quot;token key atrule&quot;&gt;persistentVolumeClaim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;claimName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; iso&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;winserver&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;r12
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;cloudInitConfigDrive&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;userData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
            #ps1
            net user Administrator THizisMypzzzowrd&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudinitdisk&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;5. Verifikasi VM Running State&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/24f1ac9229709e18ffef020df6a5d212/a0730/verify_vm_croped.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 20.253164556962027%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAv0lEQVR42l2Paw6CMBCEOYOKVsBSVGgLLVhQg4re/1ZjH2qIPyaTZne+nUZymFDwAXlpILs7sn0HVvZWBglTOMoLlttqpvLvHbQgwSNuHuB69FCuRuytH+QZrDLY5g3oobPLARKnAutMfgDlT9/ZKuGImuGFouqRFhqiHT2gaq6+MaEBmDKNza6G0DcoM4EeT7a9nklBtnfEiUDE6gt0//QXiA2RXePDbtG1cS2d1pnw7o44T3IF4tzCfJbW/stvBy1wiFVIE+IAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Verify VM Running State&quot;
        title=&quot;&quot;
        src=&quot;/static/24f1ac9229709e18ffef020df6a5d212/f058b/verify_vm_croped.png&quot;
        srcset=&quot;/static/24f1ac9229709e18ffef020df6a5d212/c26ae/verify_vm_croped.png 158w,
/static/24f1ac9229709e18ffef020df6a5d212/6bdcf/verify_vm_croped.png 315w,
/static/24f1ac9229709e18ffef020df6a5d212/f058b/verify_vm_croped.png 630w,
/static/24f1ac9229709e18ffef020df6a5d212/40601/verify_vm_croped.png 945w,
/static/24f1ac9229709e18ffef020df6a5d212/a0730/verify_vm_croped.png 1131w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Running Windows Server With Kubevirt]]></title><description><![CDATA[In this post i will show you how to run your windows server workloads and needs in KubeVirt. Also probably what usecase when you need this…]]></description><link>https://nicolas.my.id/running-windows-server-with-kubevirt/</link><guid isPermaLink="false">https://nicolas.my.id/running-windows-server-with-kubevirt/</guid><pubDate>Sat, 15 Apr 2023 21:59:36 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;In this post i will show you how to run your windows server workloads and needs in KubeVirt. Also probably what usecase when you need this.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;I work for a company that has workloads running on Windows Servers, and the cost of using public cloud windows is quite high. To address this challenge, I proposed a solution to host the Windows servers on bare metal as service servers (already bootstrapped with Kubespray). This approach not only provides better latency since the servers are in our country (Indonesia), but it also significantly reduces costs.&lt;/p&gt;
&lt;h2&gt;Prerequisite&lt;/h2&gt;
&lt;h3&gt;1. Virualization Enabled&lt;/h3&gt;
&lt;p&gt;Make sure your kubernetes nodes already enable Virtualization&lt;/p&gt;
&lt;h3&gt;2. Presistent Backend Storage&lt;/h3&gt;
&lt;p&gt;You need storageclass kubernetes with presistent backend storage like CEPH, Longhorn, vSAN or whatever.&lt;/p&gt;
&lt;h3&gt;3. Understand What Kubevirt Do&lt;/h3&gt;
&lt;p&gt;If you has&apos;t understand what kubevirt do, is basicly do what kvm and qemu automation with YAML kubernetes. Go checkout &lt;a href=&quot;http://kubevirt.io&quot;&gt;kubevirt.io&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;4. Installed the KubeVirt and Container Data Importer Engine&lt;/h3&gt;
&lt;p&gt;Follow the guide from official docs, or here &lt;a href=&quot;https://nicolas.my.id&quot;&gt;my previouse introduction about kubevirt&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;5. Virt Plugin Kubectl&lt;/h3&gt;
&lt;p&gt;We need this plugin to make our life easier, install it with &lt;a href=&quot;https://krew.sigs.k8s.io/&quot;&gt;krew.sigs.k8s.io&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Let&apos;s Deploy Your Windows&lt;/h2&gt;
&lt;p&gt;In this blog i will use &lt;a href=&quot;https://cloudbase.it/windows-cloud-images/&quot;&gt;cloudbase.it&lt;/a&gt; image, bacause the image is already cloudinit-able or some people may say &quot;Cloud Native&quot;&lt;/p&gt;
&lt;h3&gt;1. Download the Image&lt;/h3&gt;
&lt;p&gt;Download the image where ever you can access your your cluster with &lt;code class=&quot;language-text&quot;&gt;kubectl&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;2. Forward Your CDI Upload Proxy&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl port-forward svc/cdi-uploadproxy &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; cdi &lt;span class=&quot;token number&quot;&gt;6969&lt;/span&gt;:443&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;3. Upload With Virt Plugin&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl virt image-upload &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
--image-path&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;./windows_server_2012_kvm.qcow2 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
--pvc-name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;iso-winserver-r12 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
--access-mode&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ReadWriteOnce &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
--pvc-size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;20G &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
--storage-class&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;kind-local &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
--uploadproxy-url&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://localhost:6969 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;--insecure&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;4. Specifiying Your VM&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; kubevirt.io/v1alpha3
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; VirtualMachine
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;creationTimestamp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token datetime number&quot;&gt;2023-04-10T15:03:08Z&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;generation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;kubevirt.io/os&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; windows
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; windowsvm1
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;running&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;creationTimestamp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null important&quot;&gt;null&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;kubevirt.io/domain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; windowsvm1
    &lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;cpu&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;cores&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;devices&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;disks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;disk&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;bus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; virtio
            &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; disk0
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;cdrom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;bus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sata
              &lt;span class=&quot;token key atrule&quot;&gt;readonly&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudinitdisk
        &lt;span class=&quot;token key atrule&quot;&gt;machine&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; q35
        &lt;span class=&quot;token key atrule&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;memory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4096M
      &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; disk0
        &lt;span class=&quot;token key atrule&quot;&gt;persistentVolumeClaim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;claimName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; iso&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;winserver&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;r12
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;cloudInitConfigDrive&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;userData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
            #ps1
            net user Administrator THizisMypzzzowrd&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudinitdisk&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;5. Verify VM Running State&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/24f1ac9229709e18ffef020df6a5d212/a0730/verify_vm_croped.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 20.253164556962027%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAv0lEQVR42l2Paw6CMBCEOYOKVsBSVGgLLVhQg4re/1ZjH2qIPyaTZne+nUZymFDwAXlpILs7sn0HVvZWBglTOMoLlttqpvLvHbQgwSNuHuB69FCuRuytH+QZrDLY5g3oobPLARKnAutMfgDlT9/ZKuGImuGFouqRFhqiHT2gaq6+MaEBmDKNza6G0DcoM4EeT7a9nklBtnfEiUDE6gt0//QXiA2RXePDbtG1cS2d1pnw7o44T3IF4tzCfJbW/stvBy1wiFVIE+IAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Verify VM Running State&quot;
        title=&quot;&quot;
        src=&quot;/static/24f1ac9229709e18ffef020df6a5d212/f058b/verify_vm_croped.png&quot;
        srcset=&quot;/static/24f1ac9229709e18ffef020df6a5d212/c26ae/verify_vm_croped.png 158w,
/static/24f1ac9229709e18ffef020df6a5d212/6bdcf/verify_vm_croped.png 315w,
/static/24f1ac9229709e18ffef020df6a5d212/f058b/verify_vm_croped.png 630w,
/static/24f1ac9229709e18ffef020df6a5d212/40601/verify_vm_croped.png 945w,
/static/24f1ac9229709e18ffef020df6a5d212/a0730/verify_vm_croped.png 1131w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[[Sebuah Cerita Tentang Implementasi GitOps] - Management Secret Dengan Vault dan ArgoCD]]></title><description><![CDATA[Ketika menggunakan repository sebagai media penyimpanan deployment files, maka tantangan yang dihadapi adalah management sensitif data pada…]]></description><link>https://nicolas.my.id/sebuah-cerita-implementasi-gitops-part-2/</link><guid isPermaLink="false">https://nicolas.my.id/sebuah-cerita-implementasi-gitops-part-2/</guid><pubDate>Thu, 02 Feb 2023 16:10:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Ketika menggunakan repository sebagai media penyimpanan deployment files, maka tantangan yang dihadapi adalah management sensitif data pada deployment tersebut&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Latar belakang&lt;/h2&gt;
&lt;p&gt;Ketika akan melakukan implementasi GitOps di kubernetes &lt;em&gt;&lt;strong&gt;(Menggunakan Git sebagai tempat penyimpanan Manifest dari resources Kubernetes)&lt;/strong&gt;&lt;/em&gt; maka melakukan management sensitif data perlu dilakukan dengan &lt;em&gt;rapihh~~~&lt;/em&gt;, menuliskan sensitif data secara &lt;em&gt;telanjang&lt;/em&gt; pada Git Repo yang digunakan sebagai pusat operation kita adalah sesuatu yang &lt;strong&gt;kurang etis&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Masalah&lt;/h2&gt;
&lt;p&gt;Untuk dapat melakukan management resource &lt;strong&gt;Kind=Secret&lt;/strong&gt; pada kubernetes bisa dihandle dengan sangat cantik oleh CustomResoureDefintion dari &lt;strong&gt;External Secrets Operator&lt;/strong&gt;, namun terkadang konfidensial data perlu juga diletakkan pada resources lain selain seperti ConfigMaps atau resources lainnya, sayangnya hal tersebut tidak disupport oleh &lt;code class=&quot;language-text&quot;&gt;external-secrets&lt;/code&gt; operator.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Statement dari &lt;a href=&quot;https://github.com/external-secrets/external-secrets/blob/main/design/design-crd-spec.md&quot;&gt;design-crd-spec.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6753bc4030a75cb762e50ed7ca3ca45b/2cb21/goals-eso.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 25.949367088607595%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAArklEQVR42p2QSw6CQBBEOYD8BhiYDwLDEKMeQi+iuMD7H6FsWkgMboyLl+pFp7qqA7PvYRuPNKsgcoU4LQiJRJR/EeTSwvkT3ED4I5TtoIlcGkRJwUt8gFgPxcu8hQ2VaeEPZ1SmQUYJi9IQlgw1RKY49a+wYd0MaPs5mUOlO6ZcVJmVllO/cRvtYGrHO2x4uQpM0w7jGOJBzPqcQtxvES1Lqj3/5vunXPNzXiq/AEkvggqOkYYkAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ESO Desing&quot;
        title=&quot;&quot;
        src=&quot;/static/6753bc4030a75cb762e50ed7ca3ca45b/f058b/goals-eso.png&quot;
        srcset=&quot;/static/6753bc4030a75cb762e50ed7ca3ca45b/c26ae/goals-eso.png 158w,
/static/6753bc4030a75cb762e50ed7ca3ca45b/6bdcf/goals-eso.png 315w,
/static/6753bc4030a75cb762e50ed7ca3ca45b/f058b/goals-eso.png 630w,
/static/6753bc4030a75cb762e50ed7ca3ca45b/40601/goals-eso.png 945w,
/static/6753bc4030a75cb762e50ed7ca3ca45b/78612/goals-eso.png 1260w,
/static/6753bc4030a75cb762e50ed7ca3ca45b/2cb21/goals-eso.png 2174w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Contoh keperluan confidential data di resources selain secret.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/5b3efde672ebb1d402fea68bdb11bfa9/0f586/initsql.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 8.860759493670885%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAWElEQVR42kWMCQrAMAgE+/+f5iSURGNssXUhrTCMIrsHyWVLb9ujqmDOaaUUUGsFrTU4hACnlL7/9nHyG15/oRcxMxxjBF7g4ZwzdiLCf4xhvXfcnhERewDAM5nOWo3xAQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;initsql dari resources&quot;
        title=&quot;&quot;
        src=&quot;/static/5b3efde672ebb1d402fea68bdb11bfa9/f058b/initsql.png&quot;
        srcset=&quot;/static/5b3efde672ebb1d402fea68bdb11bfa9/c26ae/initsql.png 158w,
/static/5b3efde672ebb1d402fea68bdb11bfa9/6bdcf/initsql.png 315w,
/static/5b3efde672ebb1d402fea68bdb11bfa9/f058b/initsql.png 630w,
/static/5b3efde672ebb1d402fea68bdb11bfa9/40601/initsql.png 945w,
/static/5b3efde672ebb1d402fea68bdb11bfa9/78612/initsql.png 1260w,
/static/5b3efde672ebb1d402fea68bdb11bfa9/0f586/initsql.png 1498w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;External Secret Operator&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;There&apos;s some schedule &lt;code class=&quot;language-text&quot;&gt;RefreshInterval&lt;/code&gt; by design&lt;/td&gt;
&lt;td&gt;Only support &lt;code class=&quot;language-text&quot;&gt;Kind=Secret&lt;/code&gt; resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;More mature project also more wide comunity&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple namespace management secret by design&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;ArgoCD Vault Plugin&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Handle all resources k8s&lt;/td&gt;
&lt;td&gt;Required hard refresh the application, if we want to pull new values from vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ArgoCD Ecosystem&lt;/td&gt;
&lt;td&gt;Required third party tools like &lt;code class=&quot;language-text&quot;&gt;relector&lt;/code&gt; or create multi application in all wanted namespace where resources going to deploy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Pilih Solusi Sesuai Kebutuhan&lt;/h2&gt;
&lt;p&gt;Apabila tidak ada keperluan konfidensial data di luar &lt;code class=&quot;language-text&quot;&gt;Kind=Secret&lt;/code&gt; maka Externalsecret.io operator adalah piliahan paling cantik.&lt;/p&gt;
&lt;h3&gt;External Secret Operator&lt;/h3&gt;
&lt;p&gt;Penggunaan External Secret secara sederhana seperti menifest dibawah. Secret tersebut akan terbuat di namespace yang memiliki label &lt;code class=&quot;language-text&quot;&gt;eso=test&lt;/code&gt;
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/99a603ce5135c4597feec91d59b6c2d9/92e9f/eso-contoh.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.75949367088608%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABz0lEQVR42qWS227TQBBA8wF9q4KRSiKSNnVsx/eN9+Jrtm6au1QsBEXlBVHUByT+oQq/HD/U3WGdUpAIVAUejmZWszo7u7ONiWm+4Bm5cWn4NQjomiCyJoSug4DcI/MwTtexxPPQH0EouDEQajUCj/KUzwGnM0hGSxGRHFw/3eKhFBwvgYHFwLQZGCb9HeIh73TMvKFbHk9OVncsnVdRtrgN6WmFglElhZXlhJXcWKna8DFu63isobt2R5NC3eOx7I6GY/BRJiw7BH1AQDMC6OtPQtRRSqHV6Z822l2dMymLkqlsm4ieirbFJ8p2hYrS5QHmMJ68AkxzUXf3f8KDLvf8BJJsBiw6E/4w+xvZrnBfafN6mvWV5STF/fvhfxce6xZHYQ6ML4DGU5FEZ+DjEdheDA5KwPIicOWBA/lt1HpQA/wroo51bSs03eEJi6bA4iUwLIV+Dr6dgqkxsI0QTJ2BY0TbtXqIfnL0A/GQt1pS2KNuQq/Oy+TLRRlfv96Mrosy/FyU/sd5ia4Wu3xalP6HWelcjEv3neT9ZONeTkr7Tb45DO2s0dSbe/vTLnq2PCLKqoeVQsMvL63HeWthZaXhg+I7533yvFBRM23ufQN6WVSX9e56uAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;External Secret Cluster&quot;
        title=&quot;&quot;
        src=&quot;/static/99a603ce5135c4597feec91d59b6c2d9/f058b/eso-contoh.png&quot;
        srcset=&quot;/static/99a603ce5135c4597feec91d59b6c2d9/c26ae/eso-contoh.png 158w,
/static/99a603ce5135c4597feec91d59b6c2d9/6bdcf/eso-contoh.png 315w,
/static/99a603ce5135c4597feec91d59b6c2d9/f058b/eso-contoh.png 630w,
/static/99a603ce5135c4597feec91d59b6c2d9/40601/eso-contoh.png 945w,
/static/99a603ce5135c4597feec91d59b6c2d9/78612/eso-contoh.png 1260w,
/static/99a603ce5135c4597feec91d59b6c2d9/92e9f/eso-contoh.png 2620w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;ArgoCD Vault Plugin&lt;/h3&gt;
&lt;p&gt;Untuk &lt;strong&gt;argocd-vault-plugin&lt;/strong&gt;, tools tersebut akan dipasang sebagai plugin dari argocd. Setiap saat sebuah manifests akan di-render maka command tersebut bisa dijalankan.&lt;/p&gt;
&lt;p&gt;Lakukan penyesuaian pada Deployment &lt;strong&gt;argocd-repo-server&lt;/strong&gt; kita pada beberapa bagian.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menambahkan &lt;code class=&quot;language-text&quot;&gt;initContainer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Menambahkan sidecar container.&lt;/li&gt;
&lt;li&gt;Melakukan Mounting &lt;code class=&quot;language-text&quot;&gt;ServiceAccountToken&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Menambah clusterrolebinding di untuk SA argocd-repo-server.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1. Create backend configruation&lt;/h4&gt;
&lt;p&gt;Di sini backend saya menggunakan Vault dari Hascicorp dan menggunakan metode autentifikasi github token.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; v1
&lt;span class=&quot;token key atrule&quot;&gt;stringData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;VAULT_ADDR&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; http&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//vault.myvaultserver.com
  &lt;span class=&quot;token key atrule&quot;&gt;AVP_AUTH_TYPE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; github
  &lt;span class=&quot;token key atrule&quot;&gt;AVP_GITHUB_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; t0ke3nsecret
  &lt;span class=&quot;token key atrule&quot;&gt;AVP_TYPE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; vault
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Secret
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;credentials
  &lt;span class=&quot;token key atrule&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd
&lt;span class=&quot;token key atrule&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Opaque&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;2. InitContainer - Download binary argocd-vault-plugin&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Download tools&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;initContainers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; download&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;tools
&lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; registry.access.redhat.com/ubi8
&lt;span class=&quot;token key atrule&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; AVP_VERSION
    &lt;span class=&quot;token key atrule&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.11.0
&lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;sh&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;
    curl &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;L https&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//github.com/argoproj&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;labs/argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin/releases/download/v$(AVP_VERSION)/argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin_$(AVP_VERSION)_linux_amd64 &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;o argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin &lt;span class=&quot;token important&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    chmod +x argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin &lt;span class=&quot;token important&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    mv argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin /custom&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;tools/
&lt;span class=&quot;token key atrule&quot;&gt;volumeMounts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;mountPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /custom&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;tools
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; custom&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;tools
&lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;configMap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cmp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cmp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; custom&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;tools
  &lt;span class=&quot;token key atrule&quot;&gt;emptyDir&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;3. Configure argocd-repo-server Container&lt;/h4&gt;
&lt;p&gt;Add backend Secret to Environment Variables in argocd-repo-server container, and mount argocd-vault-plugin.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;server
&lt;span class=&quot;token key atrule&quot;&gt;volumeMounts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; custom&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;tools
  &lt;span class=&quot;token key atrule&quot;&gt;mountPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /usr/local/bin/argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin
  &lt;span class=&quot;token key atrule&quot;&gt;subPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin        
&lt;span class=&quot;token key atrule&quot;&gt;envFrom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;secretRef&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;credentials&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;4.  Add ClusterRoleBinding&lt;/h4&gt;
&lt;p&gt;Untuk dapat membaca konfigurasi backend vault yang sudah kita masukkan ke secret &lt;strong&gt;argocd-vault-plugin-credentials&lt;/strong&gt; maka token dari service account &lt;strong&gt;argocd-repo-server&lt;/strong&gt; perlu mendapatkan akses read ke secrets.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; rbac.authorization.k8s.io/v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ClusterRole
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# &quot;namespace&quot; omitted since ClusterRoles are not namespaced&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault
&lt;span class=&quot;token key atrule&quot;&gt;rules&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;apiGroups&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# at the HTTP level, the name of the resource for accessing Secret&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# objects is &quot;secrets&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;secrets&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;verbs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;get&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;watch&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; rbac.authorization.k8s.io/v1
&lt;span class=&quot;token comment&quot;&gt;# This cluster role binding allows anyone in the &quot;manager&quot; group to read secrets in any namespace.&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ClusterRoleBinding
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; read&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;secrets&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;server
&lt;span class=&quot;token key atrule&quot;&gt;subjects&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ServiceAccount
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;server
  &lt;span class=&quot;token key atrule&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd
&lt;span class=&quot;token key atrule&quot;&gt;roleRef&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ClusterRole
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault
  &lt;span class=&quot;token key atrule&quot;&gt;apiGroup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; rbac.authorization.k8s.io&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;5.  Mounting ServiceAccountToken&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; apps/v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Deployment
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;server
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;serviceAccount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;server
      &lt;span class=&quot;token key atrule&quot;&gt;serviceAccountName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;repo&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;server
      &lt;span class=&quot;token key atrule&quot;&gt;automountServiceAccountToken&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;6. Buat konfigurasi plugin argo-cd&lt;/h4&gt;
&lt;p&gt;YAML berikut bukanlah resources dari kubernetes, namun syntax dari Plugin argo-cd yang mengikuti rules dari Kubernetes YAML.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Plugin&lt;/em&gt; ini hanya akan berjalan apabila terdapat file &lt;code class=&quot;language-text&quot;&gt;./kustomization.yaml&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ConfigMap
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cmp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin
&lt;span class=&quot;token key atrule&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;avp-kustomize.yaml&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
    ---
    apiVersion: argoproj.io/v1alpha1
    kind: ConfigManagementPlugin
    metadata:
      name: argocd-vault-plugin-kustomize
    spec:
      allowConcurrency: true&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;# Note: this command is run _before_ anything is done, therefore the logic is to check&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# if this looks like a Kustomize bundle&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;discover&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;fileName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./kustomization.yaml&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;generate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; sh
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-c&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;kustomize build . |  argocd-vault-plugin generate --secret-name argocd:argocd-vault-plugin-credentials -&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;lockRepo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;7. Tambahkan sidecar container.&lt;/h4&gt;
&lt;p&gt;Sidecar container ini ditambahkan pada deployment argocd-repo-server.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# argocd-vault-plugin with Kustomize&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; avp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;kustomize
&lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;/var/run/argocd/argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cmp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;server&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; quay.io/argoproj/argocd&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;v2.4.0
&lt;span class=&quot;token key atrule&quot;&gt;securityContext&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;runAsNonRoot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;runAsUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;volumeMounts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;mountPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /var/run/argocd
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; var&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;files
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;mountPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /home/argocd/cmp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;server/plugins
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; plugins
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;mountPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /tmp
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; tmp
  &lt;span class=&quot;token comment&quot;&gt;# Register plugins into sidecar&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;mountPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /home/argocd/cmp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;server/config/plugin.yaml
    &lt;span class=&quot;token key atrule&quot;&gt;subPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; avp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;kustomize.yaml
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cmp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin
  &lt;span class=&quot;token comment&quot;&gt;# Important: Mount tools into $PATH&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; custom&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;tools
    &lt;span class=&quot;token key atrule&quot;&gt;subPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin
    &lt;span class=&quot;token key atrule&quot;&gt;mountPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /usr/local/bin/argocd&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;vault&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;plugin&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Contoh Penggunaan&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Buat Secret baru di hasci vault&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/90e50f5e12d2e6d10c9299dd4bdd9902/0e909/secret-in-vault.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 35.44303797468354%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAoElEQVR42q2RywrCMBBF8///428IgkIWDbhwZStYtU2TzOSYvrZFqIFDLkNy505iqspxvlistTjndmM0Z+51Q9u25KL3LqOqxexF7z0ppV2MgaaEdfPAF8OxMDYQUWISUtlF8zaS53MyT2egFGPHEOJkpCJFK8935OOFPrDNoPggdMNiGBIcjnCrA7LEXt9y1b+gyx1TJuN0zXQlDX/4lC9hGiETZe9hdwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Create new secret in Vault&quot;
        title=&quot;&quot;
        src=&quot;/static/90e50f5e12d2e6d10c9299dd4bdd9902/f058b/secret-in-vault.png&quot;
        srcset=&quot;/static/90e50f5e12d2e6d10c9299dd4bdd9902/c26ae/secret-in-vault.png 158w,
/static/90e50f5e12d2e6d10c9299dd4bdd9902/6bdcf/secret-in-vault.png 315w,
/static/90e50f5e12d2e6d10c9299dd4bdd9902/f058b/secret-in-vault.png 630w,
/static/90e50f5e12d2e6d10c9299dd4bdd9902/40601/secret-in-vault.png 945w,
/static/90e50f5e12d2e6d10c9299dd4bdd9902/78612/secret-in-vault.png 1260w,
/static/90e50f5e12d2e6d10c9299dd4bdd9902/0e909/secret-in-vault.png 3008w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Buat resources secret, dengan annotation &lt;code class=&quot;language-text&quot;&gt;avp.kubernets.io/path: &quot;secret/data/test-secret&quot;&lt;/code&gt;, annotation tersebut menunjukan alamat dari path secret yang akan diambil. Lalu &lt;code class=&quot;language-text&quot;&gt;&amp;lt;supper-secret&gt;&lt;/code&gt; pada isi &lt;strong&gt;stringData&lt;/strong&gt; secret tersebut menunjukan property key yang harus diambil dari path yang di-define pada annotation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/629027885e2a67efeb7b15802c08c68e/0330c/secret-in-repo.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.53164556962025%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAAByUlEQVR42o3R3Y7SQBgG4Ek8IPHEA40bihhLaZn+0NJ2pjO0NVBXMMKCwoni/09AvFETL2F7sDewa+gFLP2c1vVgF9z14Mnb5pu+mXxFL47i935I155Hl55HVh65LEmS1eFwWObVWYnSpU/pmnP+1q9Wb6Po2WQTD6bQccPcdkOwbH6J3QnBEYq8OruQt50umG12Wq83FcQG8010+BJsJzoXtlgPti1MBFrSWv4fungvZrvOscFAxeT0Xq2hIoc9zaLxArz4eU6TCZD+BIosPZkCT6ZA2AAMiwM2gn1y3WSg6f5ZrShMRvNs/vE7zN58zecfvsHs1Sc4mi5gLIwmr4H1RuC4PbCsLrT+p7DDkoyFA7GjSOwigrYtdiUOWOJGRWJMQKzgX7fbLdQwybTiI53mApTEwb/P1xTtL1Qx22gGB80ItkKuGexmOsubF5QW26qYQ0MlZ+VPCQOSBW4AHVHmWiJ1Ag72r+WZFCLHh9j14THz85gT6PruL1mSNbSaNX4u+s5Jr2kex7KaculhSu9XU3og7UWEvqKkn10pXVIpXY9rx1/GD07eDWs/TEWqI4TqEqocyKhSeYSQULlzM7RDRuiuJMpu/QbhRicae8HcKwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;How to Save the Secret in Repo&quot;
        title=&quot;&quot;
        src=&quot;/static/629027885e2a67efeb7b15802c08c68e/f058b/secret-in-repo.png&quot;
        srcset=&quot;/static/629027885e2a67efeb7b15802c08c68e/c26ae/secret-in-repo.png 158w,
/static/629027885e2a67efeb7b15802c08c68e/6bdcf/secret-in-repo.png 315w,
/static/629027885e2a67efeb7b15802c08c68e/f058b/secret-in-repo.png 630w,
/static/629027885e2a67efeb7b15802c08c68e/40601/secret-in-repo.png 945w,
/static/629027885e2a67efeb7b15802c08c68e/78612/secret-in-repo.png 1260w,
/static/629027885e2a67efeb7b15802c08c68e/0330c/secret-in-repo.png 2458w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Deploy dengan Argocd&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/748563f0fff205b1906869b7181d9c49/f6dc6/deploy.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 37.34177215189873%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAHABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQD/2gAMAwEAAhADEAAAAdkJYL//xAAWEAEBAQAAAAAAAAAAAAAAAAAAESH/2gAIAQEAAQUCxFf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAUEAEAAAAAAAAAAAAAAAAAAAAQ/9oACAEBAAY/An//xAAaEAACAgMAAAAAAAAAAAAAAAAAMRGhIUFR/9oACAEBAAE/IUVkOWY6P//aAAwDAQACAAMAAAAQcC//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPxBX/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhAAAgMBAQAAAAAAAAAAAAAAESEAAWFBUf/aAAgBAQABPxCwa48KBXeoSAtn/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Deploy with Argocd&quot;
        title=&quot;&quot;
        src=&quot;/static/748563f0fff205b1906869b7181d9c49/828fb/deploy.jpg&quot;
        srcset=&quot;/static/748563f0fff205b1906869b7181d9c49/ff44c/deploy.jpg 158w,
/static/748563f0fff205b1906869b7181d9c49/a6688/deploy.jpg 315w,
/static/748563f0fff205b1906869b7181d9c49/828fb/deploy.jpg 630w,
/static/748563f0fff205b1906869b7181d9c49/0ede0/deploy.jpg 945w,
/static/748563f0fff205b1906869b7181d9c49/3ac88/deploy.jpg 1260w,
/static/748563f0fff205b1906869b7181d9c49/f6dc6/deploy.jpg 2114w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Lihat final Secret&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/719b9430f0c4fb96a1fdc8656318247f/0330c/final-secret.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.53164556962025%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAABYlAAAWJQFJUiTwAAABaElEQVR42pWRy07CQBiF+yAmRGgLTGmnnU6npaU3ysU0USMoicY3hF5IgLDRJ7HiojwDGxb+kJAYoxEn3+L/z5yTnMxwry+rZJ6m2TxLszzLlqvVYrlcLJYZbLBn+WyW5PkclDRNkyQB63Q6W6/Xu92O86IrEbcRdjAyKHU16lLmY+I0JCopJpLZJa/UBMzXtaqAYQYuKohQd7P54OLbR38w6g7vbbNvOwNqRoYF9FTdI0ZIaICJp9JA0wONBi3caWFHbDJm9YrinQvjkRdPguHEJoFlRrLakbGjaK6idTBxseZKig2iArrqwKxRX2wahtU9hHUWioghuY0kq9my4OIIOw3fqSNWq+vQ7hAmhs+LOkhHjNPwKw3J5L+EA1hA+jP2QxhqCw0KhUE9B3CCn7WPYXiMShXXRL0qkHMAJ/jhL96KgrsbP/lhHPVvur3rcwAn+McPz2W55cqyLKDBfw74t2W53+8/ATXI3HfNp0oIAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Final Secret&quot;
        title=&quot;&quot;
        src=&quot;/static/719b9430f0c4fb96a1fdc8656318247f/f058b/final-secret.png&quot;
        srcset=&quot;/static/719b9430f0c4fb96a1fdc8656318247f/c26ae/final-secret.png 158w,
/static/719b9430f0c4fb96a1fdc8656318247f/6bdcf/final-secret.png 315w,
/static/719b9430f0c4fb96a1fdc8656318247f/f058b/final-secret.png 630w,
/static/719b9430f0c4fb96a1fdc8656318247f/40601/final-secret.png 945w,
/static/719b9430f0c4fb96a1fdc8656318247f/78612/final-secret.png 1260w,
/static/719b9430f0c4fb96a1fdc8656318247f/0330c/final-secret.png 2458w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Kekurangan Saat ini&lt;/h3&gt;
&lt;p&gt;Jika kita menggunakan ArgoCD Plugin dan juga &lt;strong&gt;argocd-image-updater&lt;/strong&gt; maka ada sedikit penyesuaian yang perlu dilakukan pada setiap YAML application, ya itu penambahan &lt;code class=&quot;language-text&quot;&gt;annotation&lt;/code&gt; writeback target&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;annotation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;argocd-image-updater.argoproj.io/write-back-target&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; kustomization&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;My Talk at Kubernetes Meetup X BukaMeetup&lt;/h3&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 59.27083333333333%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vRhfx6Ca6K7btAWn2TuXTR12GGl01iMc_6yrqrCOoankAOu_zTlMOfwctMQY-VnDxCHrdU8jfFUpMd8/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;h2&gt;Referensi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.hashicorp.com/vault/docs/auth/kubernetes#configuring-kubernetes&quot;&gt;https://developer.hashicorp.com/vault/docs/auth/kubernetes#configuring-kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://argo-cd.readthedocs.io/en/stable/user-guide/config-management-plugins/#installing-a-cmp&quot;&gt;https://argo-cd.readthedocs.io/en/stable/user-guide/config-management-plugins/#installing-a-cmp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/argoproj-labs/argocd-vault-plugin/tree/main/manifests/cmp-sidecar&quot;&gt;https://github.com/argoproj-labs/argocd-vault-plugin/tree/main/manifests/cmp-sidecar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thedatabaseme.de/2022/12/02/enhanced-with-plugins-make-argocd-more-powerful-with-plugins-running-as-sidecar/&quot;&gt;https://thedatabaseme.de/2022/12/02/enhanced-with-plugins-make-argocd-more-powerful-with-plugins-running-as-sidecar/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://argocd-vault-plugin.readthedocs.io/en/stable/usage/&quot;&gt;https://argocd-vault-plugin.readthedocs.io/en/stable/usage/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/argoproj-labs/argocd-image-updater/issues/168&quot;&gt;https://github.com/argoproj-labs/argocd-image-updater/issues/168&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Melakukan Orkestrasi Virtual Machine Dengan KubeVirt]]></title><description><![CDATA[Cerita tentang bermain (lagi) di Baremetal. KubeVirt, sebuah operator virtual machine yang didesain untuk melakukan management VM melalui…]]></description><link>https://nicolas.my.id/virtualmachine-orcestration-with-kubevirt/</link><guid isPermaLink="false">https://nicolas.my.id/virtualmachine-orcestration-with-kubevirt/</guid><pubDate>Mon, 28 Nov 2022 17:39:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Cerita tentang bermain (lagi) di Baremetal. &lt;strong&gt;KubeVirt&lt;/strong&gt;, sebuah operator virtual machine yang didesain untuk melakukan management VM melalui Kubernetes CRD.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Latar belakang&lt;/h2&gt;
&lt;p&gt;Selayaknya hari mager seperti biasa (dikarenakan semuanya sudah beres), saya scroll twitter dengan santuy ... mata saya sekejap melihat akun &lt;strong&gt;CNCF Official&lt;/strong&gt; meberikan re-twitt terhadap post @kubevirt yang berisikan release terbaru dari mereka, dengan rasa penasaran &quot;Apaan nih kubevirt ?&quot; sambil memberikan dugaan awal, saya mengujungi akun tersebut.&lt;/p&gt;
&lt;p&gt;Seperti yang saya duga sejak awal, &lt;strong&gt;KubeVirt&lt;/strong&gt; &lt;em&gt;&quot;Paling &lt;del&gt;cuman&lt;/del&gt; jalanin VM di container pake virt, manage pake CRD kube&quot;&lt;/em&gt;. Setelah saya membaca sedikit, saya kembali ke timeline dan melanjutkan &lt;em&gt;scroll ...&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Kewajiban pun datang. Seperti kata saudara se-tongkrongan Bekasi &lt;a href=&quot;https://humanz.moe&quot;&gt;JustHumanz&lt;/a&gt; satu satunya hal sulit jika bermain di public cloud adalah &lt;em&gt;Cost Optimization&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Saya mendapatkan sebuah situasi dimana ada baremetal yang hanya berisikan 1 VM akan segera Expired &lt;em&gt;(this is cost optimization desicion moment)&lt;/em&gt;, di sisi lain saya memiliki kubernetes cluster yang berjalan di atas baremetal tanpa ada overlay VMs. Seketika &lt;em&gt;KubeVirt&lt;/em&gt; terpanggil di benak saya.&lt;/p&gt;
&lt;h2&gt;Masalah&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tidak ada masalah&lt;/strong&gt;, hanya ada &quot;Ini kalau bisa dipindahin ke sini, yang ini bisa di-terminate&quot;, &lt;em&gt;Cost Optimization Moment~~&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Saya sangat bisa memahami hal tersebut, dan untuk hal ini saya sangat setuju. Maka dari itu saya akan mencari &lt;del&gt;MASALAH&lt;/del&gt; solusi memindahkan VM tersebut ke Kubernetes Cluster dengan bantuan KubeVirt.&lt;/p&gt;
&lt;h2&gt;Solusi&lt;/h2&gt;
&lt;h3&gt;Memahami Arsitektur dari KubeVirt&lt;/h3&gt;
&lt;p&gt;Dikarenakan bermain dengan virt adalah hal yang sudah pernah saya lakukan di kehidupan sebelumnya &lt;em&gt;(maksudnya di kantor sebelumnya )&lt;/em&gt; hal ini merupakan &lt;em&gt;&quot;gitu gitu doang moment ~~&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dengan bahasa anak tongkrongan yang &quot;semoga&quot; mudah dimengerti,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;KubeVirt adalah operator dengan CRD kubernetes yang nantinya akan melakukan spawn container berisikan kvm dan segala utility-nya seperti libvirtd, virsh, dkk.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Untuk persistent disk, qemu image-nya akan disupply melalui PVC, atau bisa menggunakan epehemeral volume untuk disk yang bersifat temporary, seperti SWAP.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Dikarenakan VM tersebut berada di overlay container, maka networking dari VM akan menggunakan network CNI kubernetes. Sehingga VM dan juga Pod App kita berada di Network yang sama.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/230ce1941656b06b8caf738ce3c8deaf/6897f/architecture-simple.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 43.67088607594937%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAC4jAAAuIwF4pT92AAACgUlEQVR42mNggIL6+nqm+uhovo7QUP6ZM2ey3tq2jX1OUhJvKJA/f/58jjNnzrDGx8dzuLi48APVcjAQArdu3WKXdHPTYDU011u1ahV/5pbDggxu/rK6RkbGy+bMkdqyZYtgbm6ujJ2VlWVLVZUkToPq//9nAtH/7e1ZBNdvPy6+addHi+kLpCXWbpnLu2n3l6a1GzYdXrXq0cY1a6z3rluXtGfNmrd71q6NAOkBWsyM0+D/oaHMImu3HpbYuP2D0/Tp0pJrNs/g3rjzffPqdesPrlr1cMf69Va71q5N3Lly5Ztdq1eHgfXs38/y//9/RhgGG6S6bU+g4Y5jKiC2RWgoJ0NpKe9+ewaWiopsYY/6epmZaWn8DAwynEBp5v76eoG+lhbJ/vx8gXoGBiZY2EPdxAgMb2YGx5MX/rudOH1XZeNW11nnr5SvunRlQu7JS2EMM5foMkxbahy6YVvI0qvX25ZcudYqtW67JcOS9boM/TMsmw8eLVl98fKk7guXitffvtu16vbddufl6x0YnPcc/B9888pN7dXrHWaePV+27tr1zoYr1yKl126zUFu6ziZ+w+aIlVeuNa+7cafe6cAJR7U1W63lZy92aD9wOH/VuQsdUy9fz998/2Hjqlt36v1WrLFjMFm82M/l7l25JydPqj159GjLnTt3Npw+fnzHkwcPDj979GjztUuXul88f779/NmzGy6fO7f3zfPnR+7cvDn7wb17c4Hqt548dmzL9WvX1j9/+nQPMGl5wyNlGzDdnTp1Svbw4cNyy5cvl92/f7/MkSNHpIC0yNmzZ+U3bdokt3jtWhmQmqNHj4oBNUuCxEFqd+/eLQdi79y5kxsAAc1D3isdpwcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Arsitektur KubeVirt&quot;
        title=&quot;&quot;
        src=&quot;/static/230ce1941656b06b8caf738ce3c8deaf/f058b/architecture-simple.png&quot;
        srcset=&quot;/static/230ce1941656b06b8caf738ce3c8deaf/c26ae/architecture-simple.png 158w,
/static/230ce1941656b06b8caf738ce3c8deaf/6bdcf/architecture-simple.png 315w,
/static/230ce1941656b06b8caf738ce3c8deaf/f058b/architecture-simple.png 630w,
/static/230ce1941656b06b8caf738ce3c8deaf/40601/architecture-simple.png 945w,
/static/230ce1941656b06b8caf738ce3c8deaf/78612/architecture-simple.png 1260w,
/static/230ce1941656b06b8caf738ce3c8deaf/6897f/architecture-simple.png 3780w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Penjelasan di atas hanya &lt;em&gt;&quot;how it works&quot;&lt;/em&gt;, dan sependek pengetahuan saya untuk lebih detail, lengkap dan akurat silahkan merujuk ke &lt;a href=&quot;https://kubevirt.io/user-guide/architecture/&quot;&gt;https://kubevirt.io/user-guide/architecture/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Kembali ke LAB&lt;del&gt;top&lt;/del&gt;&lt;/h3&gt;
&lt;p&gt;Seperti kebiasaan lama, sebelum membawa sesuatu untuk dihidangkan, saya selalu memasak matang - matang hidangan tersebut di Lab pribadi.&lt;/p&gt;
&lt;h4&gt;Install KubeVirt Operator&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Point at latest release&lt;/span&gt;
$ &lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;RELEASE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; https://storage.googleapis.com/kubevirt-prow/release/kubevirt/kubevirt/stable.txt&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Deploy the KubeVirt operator&lt;/span&gt;
$ kubectl apply &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; https://github.com/kubevirt/kubevirt/releases/download/&lt;span class=&quot;token variable&quot;&gt;${RELEASE}&lt;/span&gt;/kubevirt-operator.yaml
&lt;span class=&quot;token comment&quot;&gt;# Create the KubeVirt CR (instance deployment request) which triggers the actual installation&lt;/span&gt;
$ kubectl apply &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; https://github.com/kubevirt/kubevirt/releases/download/&lt;span class=&quot;token variable&quot;&gt;${RELEASE}&lt;/span&gt;/kubevirt-cr.yaml
&lt;span class=&quot;token comment&quot;&gt;# wait until all KubeVirt components are up&lt;/span&gt;
$ kubectl &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; kubevirt &lt;span class=&quot;token function&quot;&gt;wait&lt;/span&gt; kv kubevirt &lt;span class=&quot;token parameter variable&quot;&gt;--for&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;condition&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Available&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Install CDI Operator&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Container Data Importer&lt;/em&gt;, salah satu komponen yang dibutuhkan untuk management disk PVC pada VM nantinya.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Point at latest release&lt;/span&gt;
$ &lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;TAG&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-w&lt;/span&gt; %&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;redirect_url&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; https://github.com/kubevirt/containerized-data-importer/releases/latest&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
$ &lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;VERSION&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;TAG&lt;span class=&quot;token comment&quot;&gt;##*/}&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Deploy CDI operator&lt;/span&gt;
$ kubectl create &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; https://github.com/kubevirt/containerized-data-importer/releases/download/&lt;span class=&quot;token variable&quot;&gt;$VERSION&lt;/span&gt;/cdi-operator.yaml
$ kubectl create &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; https://github.com/kubevirt/containerized-data-importer/releases/download/&lt;span class=&quot;token variable&quot;&gt;$VERSION&lt;/span&gt;/cdi-cr.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Install Kubectl Virt Plugin&lt;/h4&gt;
&lt;p&gt;Hal ini Opsional, namun untuk hidup yang lebih baik sebaiknya dilakukan, dikarenakan akan digunakan untuk melakukan forwarding ke pod virt-launcer, dan akan otomatis membuka vnc client pada device kita.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;krew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; virt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Halangan&lt;/h3&gt;
&lt;h4&gt;Backend Storage&lt;/h4&gt;
&lt;p&gt;Di sini lah sebuah keputusan yang sangat besar perlu ditentukan. Keputusan yang akan berdampak pada kehidupan setelah VM terdeploy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;choose your backend storage wisely&quot;&lt;/strong&gt; pertimbangkan dengan seksama. Apa kebutuhannya, dan bagaimana kondisinya.&lt;/p&gt;
&lt;p&gt;Pada kasus ini kebutuhan saya hanya memindahkan VM tersebut ke worker kubernetes dengan KubeVirt, lalu kemudahan ketika scaling up disk, cpu, dan ram jika dibutuhkan. Namun keadaannya adalah tidak ada block storage kosong yang dapat digunakan.&lt;/p&gt;
&lt;h4&gt;Hostpath Operator&lt;/h4&gt;
&lt;p&gt;Pilihan saya jatuh pada hostpath operator&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Install Hostpath Provisoner&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Deploy cert-manager, do not required if already deployed (1.7.x up version).&lt;/span&gt;
$ kubectl create &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.yaml
&lt;span class=&quot;token comment&quot;&gt;# Create hostpath-provisioner namespace&lt;/span&gt;
$ kubectl create &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/kubevirt/hostpath-provisioner-operator/main/deploy/namespace.yaml
&lt;span class=&quot;token comment&quot;&gt;# Deploy Webhook &lt;/span&gt;
$ kubectl create &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/kubevirt/hostpath-provisioner-operator/main/deploy/webhook.yaml &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; hostpath-provisioner
&lt;span class=&quot;token comment&quot;&gt;# Deploy Operator&lt;/span&gt;
$ kubectl create &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/kubevirt/hostpath-provisioner-operator/main/deploy/operator.yaml &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; hostpath-provisioner
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2. Create Pool and StorageClass&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Data dari PVC nanti akan tersimpan pada node2 di folder /data-kubevirt.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hostpathprovisioner.kubevirt.io/v1beta1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; HostPathProvisioner
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hostpath&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;provisioner&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node2
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;imagePullPolicy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Always
  &lt;span class=&quot;token key atrule&quot;&gt;storagePools&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; node&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /data&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;kubevirt
  &lt;span class=&quot;token key atrule&quot;&gt;workload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;nodeSelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;kubernetes.io/hostname&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; node2
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;allowVolumeExpansion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; storage.k8s.io/v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; StorageClass
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hostpath&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;csi&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node2
&lt;span class=&quot;token key atrule&quot;&gt;parameters&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;storagePool&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; node&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;provisioner&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; kubevirt.io.hostpath&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;provisioner
&lt;span class=&quot;token key atrule&quot;&gt;reclaimPolicy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Retain
&lt;span class=&quot;token key atrule&quot;&gt;volumeBindingMode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; WaitForFirstConsumer&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Kembali ke LAB ( Mari Membuat VMs )&lt;/h3&gt;
&lt;h4&gt;Download Image to PVC with DataVolume&lt;/h4&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/802620985385ea38b844f3e67e1fb62a/561da/download-image.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.35443037974683%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAABf0lEQVR42uWSS0/CQBCASTzoHzDKwZTSF0Xo0tLutkifWLQGX3f9Afq/9CDlov+OrBlnt0Q9Kh6d5MvsY+abPWzrbh7q1XxUTug4jyKviGNaXFb5N2KZq82+LKOizKMixzpKHYTkjI3KNHT1lgg2MJ5o6IBt2Zz0bYhYgFAIXBc8QoDREGZpArOsYVGdw+3VAmZ5CicRE/CyyCDw3GcpjLJqdbq4hzy54adsDkV2DdPpBZBhDIE/A+Ik4Ayn4I5SsEwKuuaDaWDu+niWgeflnAYl2L2glkJ7ENYePYORk3FKEimwTAY9K8SiSK4NPfjMWneM+DIf9yfICSdOikO8RqgcDWoxTVVdrqoedBHxip8gpFjPdY2C8DTCzrA2cbreHXMDi4wfyr4Yc9Ng0EFPI1RQiAfiQv+17JtQ+c9CZ9kI/TXyvgXrRugspVDtkFXPmojPKif9HspFv/BI4f6+8tg+1N7ah/pL+0Crt2CJ/a/oeWhtYgfZRfb+wO7G0/oAL2xalzPRuvcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Download Image&quot;
        title=&quot;&quot;
        src=&quot;/static/802620985385ea38b844f3e67e1fb62a/f058b/download-image.png&quot;
        srcset=&quot;/static/802620985385ea38b844f3e67e1fb62a/c26ae/download-image.png 158w,
/static/802620985385ea38b844f3e67e1fb62a/6bdcf/download-image.png 315w,
/static/802620985385ea38b844f3e67e1fb62a/f058b/download-image.png 630w,
/static/802620985385ea38b844f3e67e1fb62a/40601/download-image.png 945w,
/static/802620985385ea38b844f3e67e1fb62a/561da/download-image.png 969w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; DataVolume
&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cdi.kubevirt.io/v1beta1
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;image
  &lt;span class=&quot;token key atrule&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; default
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; https&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//cloud&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;images.ubuntu.com/jammy/current/jammy&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;server&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cloudimg&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;amd64.img
  &lt;span class=&quot;token key atrule&quot;&gt;pvc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;accessModes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; ReadWriteOnce
    &lt;span class=&quot;token key atrule&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;storage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3Gi
    &lt;span class=&quot;token key atrule&quot;&gt;storageClassName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hostpath&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;csi&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Create Virtual Machine&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; DataVolume
&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cdi.kubevirt.io/v1beta1
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; myvm&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;volume&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;data
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;pvc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; default
      &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;image
  &lt;span class=&quot;token key atrule&quot;&gt;pvc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;accessModes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; ReadWriteOnce
    &lt;span class=&quot;token key atrule&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;storage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 30Gi
    &lt;span class=&quot;token key atrule&quot;&gt;storageClassName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hostpath&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;csi&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; kubevirt.io/v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; VirtualMachine
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; my&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ubuntu
  &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; my&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ubuntu
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;runStrategy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Always
  &lt;span class=&quot;token key atrule&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; my&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ubuntu
    &lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;terminationGracePeriodSeconds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;cpu&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;memory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4092M
        &lt;span class=&quot;token key atrule&quot;&gt;devices&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;disks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; datavolume&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;disk1
            &lt;span class=&quot;token key atrule&quot;&gt;disk&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;bus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; virtio
          &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;disk&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;token key atrule&quot;&gt;bus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; virtio
            &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudinitdisk
      &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;dataVolume&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; myvm&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;volume&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;data
        &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; datavolume&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;disk1
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cloudinitdisk
        &lt;span class=&quot;token key atrule&quot;&gt;cloudInitNoCloud&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;userData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;#cloud-config&lt;/span&gt;
            &lt;span class=&quot;token key atrule&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Hayomaucarileaksdigithubgwya&lt;span class=&quot;token punctuation&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;?&lt;/span&gt;ngerixxxxxxxxxAdaHeker
            &lt;span class=&quot;token key atrule&quot;&gt;chpasswd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;expire&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;False&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Operasional VM&lt;/h2&gt;
&lt;h3&gt;Get in to Console&lt;/h3&gt;
&lt;p&gt;Get to the console with &lt;code class=&quot;language-text&quot;&gt;kubectl virt vnc your-vm-name&lt;/code&gt;. All YAML that used here is on my github repos &lt;a href=&quot;https://github.com/nicolasjulian/KubeVirt&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/06e7d6217b292f85e9ff77881d3ee9a6/a2b91/spawn-vm.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.65822784810127%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAADU0lEQVR42mWSXWhbdRiHT766ZmvSps3H0iQnp81Jk5OkTXJykiYnJ2nt1qQfapu0zXoxVOasRSxIEZFNpndjsKnDuXnnBBHGGKLiRHAXKmN4US8EQafz68KLgRciSNkuHo9tvZkXDz/+F//n/b3wCrqmUSuo1FSVp2fHuHRU5mJnhIsLMuenhjhXjXKuHOVsKcrposSV0iCfG0E+KoXZlFIkohqiVGAgUmBU0hDGJ+apVRrUjSZlo0FqtEoiXSExqiOnysSUcZJZg6w2QbwwxdniMD81+vix5eKW4aMRVhFCJdzhca43TGGmMs9Etbkr1BuMVw5j1GbIqTVSGVOWKjE6pqOqBsn8JGc0iR9m3PxytJu/jgm8XxRx+Sq8aqjc7ygI1akOhw89TH1ibkdU+zfrs4xmqyY62byxg1qoMZKrc1od5PtpO789ZuP+8wJ32i7ezOe425K504whpAsNiqUJVG2SvFonY7YZyxk0mkvMzndoziwz3WwzM7NEvbnCO60K288q3Dslcu+EwPaGjT8XDvLzdJStqoggjpRJKxpJE2Uv0+aqiwtt2u1lOiurLC+t0DLfi4ttnmg/ylp7jpOrNbZPmcL1bn49FOQbI8SXhUEEt2wgKmXEVJWwohNOmpkoYrPbEQThf1gtuxn1CPx9wsLdeR/fVga5pQX4WPEjbFaSbGoKx5NhNnIRXjSiLEtRHFY7FqsV6wPYbVZTaCMesPLHsR5ul4N8pfr5ZKSfazEPwneGldu6yM10iC8UG79PW7iR34dTsO42EixY9rDusNfQZWfLkLiZDfFhvI8PEr18PdmP8HLQwfmIh7ekHJeGNK7KYa7nPbjslp2PlgdW/u/tdXTx9kiCy1KYq4kB8yYH2NJ7EQruAB2XlzWPyEagzMmIzutDMY4f7GPSOYDa7WVsv49CTwjDPYS6v5cjkR5aAZEXggkuDIl8pga4kXPzaWafOcwr43VLlLvCzHXH6HhKPBMs8losxit+iSNOmUcOyCy4FR736jzlL7IejLPmL5kFMrwxHOOyHODdWA/vyabQ5jWP0Sfj9AyTdYhMdSVo9WqsmoPW/RGWuod5yCFRcwwz5Uyy4q6w6NKZd+Z4si/Hc/44Lw2GOBPu54J4gH8Abcu1fDix7VIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Get to Console&quot;
        title=&quot;&quot;
        src=&quot;/static/06e7d6217b292f85e9ff77881d3ee9a6/f058b/spawn-vm.png&quot;
        srcset=&quot;/static/06e7d6217b292f85e9ff77881d3ee9a6/c26ae/spawn-vm.png 158w,
/static/06e7d6217b292f85e9ff77881d3ee9a6/6bdcf/spawn-vm.png 315w,
/static/06e7d6217b292f85e9ff77881d3ee9a6/f058b/spawn-vm.png 630w,
/static/06e7d6217b292f85e9ff77881d3ee9a6/40601/spawn-vm.png 945w,
/static/06e7d6217b292f85e9ff77881d3ee9a6/78612/spawn-vm.png 1260w,
/static/06e7d6217b292f85e9ff77881d3ee9a6/a2b91/spawn-vm.png 3360w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Resize CPU, and RAM&lt;/h3&gt;
&lt;p&gt;Change the CPU, and memory section with resource you want, and make sure your worker is have that space.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ kubectl delete vm/my-ubuntu
$ &lt;span class=&quot;token function&quot;&gt;vim&lt;/span&gt; virtualmachine.yaml
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        resources:
          requests:
            cpu: &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
            memory: 4092M
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
$ kubectl apply &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; virtualmachine.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Scale Up Disk&lt;/h3&gt;
&lt;p&gt;In this case, resize disk become tricky, because hostpath-provisioner is different than real storage cluster like Rook, longhorn. So we need to scale image manualy with &lt;code class=&quot;language-text&quot;&gt;qemu-img&lt;/code&gt; comand&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ kubectl delete vm/my-ubuntu
$ kubectl virt guestfs myvm-volume-data &lt;span class=&quot;token parameter variable&quot;&gt;--root&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--image&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;quay.io/kubevirt/libguestfs-tools:v0.57.1
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
bash-4.4 &lt;span class=&quot;token comment&quot;&gt;# qemu-img resize disk.img 10G&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
$ kubectl apply &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; virtualmachine.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/fb8fc2e14c02b1aba4bfdd0b310fa1ae/52576/resize-disk.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 77.21518987341771%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAABYlAAAWJQFJUiTwAAACQklEQVR42p1T227aQBDlDyLlpRJxRLgEMBgMXtt4vbuY+yVRgHxC+cJa7c8Vi53OrIGGFqmXh6OZndUen5kzLqy43x8NxVevF6WSISKZilCkkclVKgI6yzQRSTpN5ul8skgnapLyQJi612Wp7/pf/F7wrWt3+wXXE+9yvIMwXGkVzLWIVpAkG4j5CqLBAuMaONYYm0K/NzK5z2Z4t4ShegOvP9FYP9pNDo+P9rZgd9g2Hm9ByM1h6M8OKn7JBuEiC4N5Fvgzg3YrzurPYVatsMxpC3N2u0OTY/3QqA++16o+ErY2BdsJd3HyBkpt9Jiv9FC+XtT5/hQ6joSWHYPdjAAJzJlAOaFlc413x1o1yBUyluwUkkjxognj0RaiCMnYhGoQBjODQTg3kUdLeK4FQIooIjTmR8oNoYMKRbzGGc41KtKkLicg0im0cxWAbRqlpIrIPuCa0HX4TqlXQ2ijfHqMM4FK2bsAZ3dBpcz+QOjyHanCVjQaQI4BDtwowoH/+vgWbhEuaUYajdA0Oxo6rQGp/WdCB1sWYm0UdjtKn51sNqK/IfudkLlyd3LTEOZrwi9O/kfL0piCKjVjE91zh0C41S49+mjQCRpx3TL+FaAk7iEijleA0eyd1x8DGmV2ErfA/HrtljDrQx/MEZ8W288Jn5veu4+LHEVr3W9L3Ts5fN49muk5kgpy/oJ6SHdIyI9t/MjTExJalvVQqjmfrZK9L38q761ibX9/XzS4u7vGuf4T1t6yyvtisbwvlRp0fvgBZc6scIRKKtgAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Resize Disk&quot;
        title=&quot;&quot;
        src=&quot;/static/fb8fc2e14c02b1aba4bfdd0b310fa1ae/f058b/resize-disk.png&quot;
        srcset=&quot;/static/fb8fc2e14c02b1aba4bfdd0b310fa1ae/c26ae/resize-disk.png 158w,
/static/fb8fc2e14c02b1aba4bfdd0b310fa1ae/6bdcf/resize-disk.png 315w,
/static/fb8fc2e14c02b1aba4bfdd0b310fa1ae/f058b/resize-disk.png 630w,
/static/fb8fc2e14c02b1aba4bfdd0b310fa1ae/40601/resize-disk.png 945w,
/static/fb8fc2e14c02b1aba4bfdd0b310fa1ae/78612/resize-disk.png 1260w,
/static/fb8fc2e14c02b1aba4bfdd0b310fa1ae/52576/resize-disk.png 1412w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Expose VM Port with Service&lt;/h3&gt;
&lt;p&gt;You can expose the what you want trough service kubernetes.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Service
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; vmiservice
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;27017&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TCP
    &lt;span class=&quot;token key atrule&quot;&gt;targetPort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; my&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ubuntu
  &lt;span class=&quot;token key atrule&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; LoadBalancer
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;    
&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Service
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;domain
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9100&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TCP
    &lt;span class=&quot;token key atrule&quot;&gt;targetPort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9100&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; metrics
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8080&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TCP
    &lt;span class=&quot;token key atrule&quot;&gt;targetPort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8080&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; app
  &lt;span class=&quot;token key atrule&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; my&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ubuntu
  &lt;span class=&quot;token key atrule&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ClusterIP&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Akhiran (Opinion are my own)&lt;/h3&gt;
&lt;p&gt;Singkat cerita setelah mengimplementasi hal tersebut saya berhasil memindahkan 1 VM tersebut ke Managed by KubeVirt yang berdampak baik karena tentu saja mengurangi biaya server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;; Saya menghadiri &lt;a href=&quot;https://community.cncf.io/events/details/cncf-kcd-indonesia-presents-kubernetes-community-days-openinfra-days-indonesia-2022/&quot;&gt;Kubernetes Comunity Day&lt;/a&gt;, dan di sana saya sempat berbincang di booth RedHat, karena saya melihat mereka melakukan demostrasi terhadap provisioning Virtual Machine di Openshift mereka.&lt;/p&gt;
&lt;p&gt;Pada Cluster Openshift mereka saya melihat bagaimana KubeVirt yang sebenarnya terintegrasi dengan backend storage yang &lt;em&gt;proper&lt;/em&gt;. Tanpa tricky tricks seperti pada kasus saya.&lt;/p&gt;
&lt;p&gt;Saya dan sobat nongs warga Bekasi kabupaten &lt;a href=&quot;https://ammarun.my.id&quot;&gt;Ammarun&lt;/a&gt; tentu saja membredel berbagai pertanyaan kepada sales Redhat (karena rasa penasaran) mereka juga menjawab dengan senang hati. Lalu warlo(c)k Tambun ini mengajukan pertanyaan terkait &quot;Mengapa yang di show nga ada Openstack ? kan monitornya 2&quot; &lt;em&gt;they said&lt;/em&gt; &quot;Kita sudah lebih fokus ke CloudNative, development Openstack saat ini lebih ke Telco&quot;. Bahkan kata mereka, Redhat melakukan stop development terhadap RHV &lt;em&gt;(No new feature, just fix bugs. Link announcement ada di referensi)&lt;/em&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;em&gt;So where the world of cloud will moving ?, will everything is Webhook Kubernetes in Future ?&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;Well my opinions everything should be back to what you have, and what you need. &lt;strong&gt;That&apos;s it&lt;/strong&gt;. Running openshift for Small company with small scale of loads is overkill, probably what you need is just couple of VMs in Digital Ocean or something.&lt;/p&gt;
&lt;p&gt;But if you have your own Data Center, or you Running a Banking system that used by millions of people dependen on your Infrastructure, considering have something that make your life is more easier is something that you have to contemplate. It&apos;s does&apos;t have to be openshift, or kubernetes in general.&lt;/p&gt;
&lt;p&gt;So the Kubernetes-ing is just an option, i guess. Option to manage your repetitive task and automating it. The cloud providers will have their own option to choose what they need with what they have. &lt;strong&gt;BUT IF I WAS THE ONE WHO CHOOSE WHAT STACK. DEFINITELY KUBERNETES ON OF TOP BAREMETAL IS THE ONE!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1d21b86df5b4f4fdc411abbd019133a2/7e35d/redhat.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 173.41772151898735%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAjABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAMFAQIEBv/EABYBAQEBAAAAAAAAAAAAAAAAAAEAAv/aAAwDAQACEAMQAAABq+3nukhXAvGRywtkVHsCBr//xAAeEAACAQMFAAAAAAAAAAAAAAABAgADBBAREhMhMv/aAAgBAQABBQJE3s1qUUWMtuq1crw6iN5w7wZGP//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8BX//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8BX//EAB0QAAIBBAMAAAAAAAAAAAAAAAABEQISIDEiUWH/2gAIAQEABj8CtWyambKH6QnPLs3hCy//xAAhEAACAQQABwAAAAAAAAAAAAABEQAhMUFREGFxgZHR4f/aAAgBAQABPyFVcWlkdgUiR7/ITCgyM0LjkbzlvMFIBlwsigSiOoIhfeFQ9Yzxsz//2gAMAwEAAgADAAAAEKTxTXvv/8QAFREBAQAAAAAAAAAAAAAAAAAAASD/2gAIAQMBAT8QGv/EABcRAAMBAAAAAAAAAAAAAAAAAAABESD/2gAIAQIBAT8QZc//xAAeEAEAAgEFAQEAAAAAAAAAAAABABEhMUFRYXGBkf/aAAgBAQABPxDEQWrbsNMsUJqtG8ChsyslSFwH7AgNKfec6QYw/wASuVRcwDBSpnZj4DksdRnkYTWjHkYkv2WXln//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Redhat Openshif with KubeVirt&quot;
        title=&quot;&quot;
        src=&quot;/static/1d21b86df5b4f4fdc411abbd019133a2/828fb/redhat.jpg&quot;
        srcset=&quot;/static/1d21b86df5b4f4fdc411abbd019133a2/ff44c/redhat.jpg 158w,
/static/1d21b86df5b4f4fdc411abbd019133a2/a6688/redhat.jpg 315w,
/static/1d21b86df5b4f4fdc411abbd019133a2/828fb/redhat.jpg 630w,
/static/1d21b86df5b4f4fdc411abbd019133a2/0ede0/redhat.jpg 945w,
/static/1d21b86df5b4f4fdc411abbd019133a2/3ac88/redhat.jpg 1260w,
/static/1d21b86df5b4f4fdc411abbd019133a2/7e35d/redhat.jpg 1728w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;My Talk at Open Infra - Bekasi, Jawa Barat, Indonesia&lt;/h3&gt;
&lt;p&gt;Saya juga mebawakan materi tersebut pada acara meetup reguler Open Infra Indonesia, pada bulan februari 2023 kemarin.&lt;/p&gt;
&lt;h4&gt;Live Stream&lt;/h4&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/1kFQDEC057s&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;h4&gt;Google Slides&lt;/h4&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 59.27083333333333%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vQoBs-A4PKjyG6zUvYuq07y7SXOOc1wYqtWhUowf6lZssOe-E1TtkaKF7DbFeCsg6LMROq9QpVdGMWv/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;h3&gt;Referensi&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nicolasjulian/KubeVirt: Bundle to getting start with KubeVirt - &lt;a href=&quot;https://github.com/nicolasjulian/KubeVirt&quot;&gt;https://github.com/nicolasjulian/KubeVirt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KubeVirt User-Guide - &lt;a href=&quot;https://kubevirt.io/user-guide/&quot;&gt;https://kubevirt.io/user-guide/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Red Hat Virtualization Life Cycle - Red Hat Customer Portal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://access.redhat.com/support/policy/updates/rhev&quot;&gt;https://access.redhat.com/support/policy/updates/rhev&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenShift virtualization: Not as scary as it seems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.redhat.com/en/blog/openshift-virtualization-not-scary-it-seems&quot;&gt;https://www.redhat.com/en/blog/openshift-virtualization-not-scary-it-seems&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Menghalang Serangan - Serangan Dasar Web Dari Sisi Ingress Nginx (Infrastruktur)]]></title><description><![CDATA[Menghalangi serangan pada aplikasi berbasis web merupakan sebuah PR yang sangat panjang. Di tulisan ini saya akan mencoretkan beberapa…]]></description><link>https://nicolas.my.id/menghalang-serangan-dasar-menggunakan-ingress-nginx/</link><guid isPermaLink="false">https://nicolas.my.id/menghalang-serangan-dasar-menggunakan-ingress-nginx/</guid><pubDate>Tue, 20 Sep 2022 00:45:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Menghalangi serangan pada aplikasi berbasis web merupakan sebuah PR yang sangat panjang. Di tulisan ini saya akan mencoretkan beberapa langkah awal melakukan pertahanan terhadap serangan-serangan yang &quot;biasa&quot; terjadi. Penghalang ini diterapkan di sisi Infrastruktur.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Latar belakang&lt;/h2&gt;
&lt;p&gt;Pada dasarnya hampir semua serangan pada aplikasi berbasis web menggunakan &lt;em&gt;HTTP Request&lt;/em&gt;, sehingga hal pertama yang bisa dilakukan adalah melakukan filtering terhadap &lt;em&gt;request&lt;/em&gt; yang diterima applikasi tersebut.&lt;/p&gt;
&lt;p&gt;Filtering terhadap request yang masuk tersebut, disebut &lt;strong&gt;WAF (Web Application Firewall)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Sudah banyak berbagai penyedia WAF ternama seperti Imperva, Cloudflare, hingga untuk skala bisnis lebih besar seperti Akamai.&lt;/p&gt;
&lt;p&gt;Untuk saat ini Cloudflare merupakan penyedia WAF yang memberikan layanannya secara cuma-cuma kepada para penggunanya. Hanya cukup menggunakan NS milik Cloudflare, pengguna sudah bisa mengaktifkan WAF secara &lt;strong&gt;Gratis&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Masalah&lt;/h2&gt;
&lt;h3&gt;Bypass Cloudflare&lt;/h3&gt;
&lt;p&gt;Ketika pengguna mengaktifkan WAF dari cloudflare, maka semua request yang masuk ke domain tersebut akan diarahkan menuju reverse proxy milik Cloudflare yang sudah diberikan filtering untuk menyaring semua request yang masuk. Namun apabila seseorang menemukan IP dibalik dari WAF tersebut. Maka dia bisa leluasa melakukan pointing langsung dari &lt;code class=&quot;language-text&quot;&gt;/etc/hosts&lt;/code&gt; miliknya pribadi untuk melakukan bypass terhadap WAF cloudflare.&lt;/p&gt;
&lt;h2&gt;Pendekatan Untuk Dilakukan&lt;/h2&gt;
&lt;p&gt;Pada dasarnya tidak ada tolak ukur yang &lt;strong&gt;pasti&lt;/strong&gt; untuk mengukur sebuah sistem &lt;em&gt;&quot;Aman&quot;&lt;/em&gt;, namun seperti kata &lt;strong&gt;Voltaire &quot;Perfect is the enemy of good&quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Penggambaran di bawah dapat digunakan juga dalam hal Security Design. Tolak ukur untuk melakukan hardening yang &lt;em&gt;&quot;secure&quot;&lt;/em&gt; mutlak selamanya adalah tak terhingga.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a10695cf2ac27e5dbcb18c9bb8d759cd/c1b63/Secure-is-infinite.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 44.30379746835443%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAyElEQVR42qWRywqDMBBF8/9f4043IriRIK5FRERXQUuaQKTGR9MrQ1Wkm+JdhMnJnBAmzDn3/sad8hNeOHM3woQQdV0XRaG1pouxrusKWJYl1qqqlmWh7q7rAJumAYTIsixLksTzvLZtdxndYRgGQRDHse/71lqS8zwH55xHUZSmKcPBPM9wIEynEBnHEQ56CIKA410oADcZFfzXFjRbaiKIPQkocEi3HPI+Qyll3z+U0sYYaJfZKKWkfJphgHwM7Na0Tx/4t/wBGzEI60WoQVoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Secure is infinite&quot;
        title=&quot;&quot;
        src=&quot;/static/a10695cf2ac27e5dbcb18c9bb8d759cd/f058b/Secure-is-infinite.png&quot;
        srcset=&quot;/static/a10695cf2ac27e5dbcb18c9bb8d759cd/c26ae/Secure-is-infinite.png 158w,
/static/a10695cf2ac27e5dbcb18c9bb8d759cd/6bdcf/Secure-is-infinite.png 315w,
/static/a10695cf2ac27e5dbcb18c9bb8d759cd/f058b/Secure-is-infinite.png 630w,
/static/a10695cf2ac27e5dbcb18c9bb8d759cd/40601/Secure-is-infinite.png 945w,
/static/a10695cf2ac27e5dbcb18c9bb8d759cd/c1b63/Secure-is-infinite.png 1200w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Tujuan kita ada di titik &quot;Something&quot; agar mengurangi &lt;em&gt;point of attack&lt;/em&gt; hingga seminim mungkin. Untuk mencapai itu ada beberapa pendekatan yang dapat dilakukan.&lt;/p&gt;
&lt;h3&gt;1. Jangan Pernah Mematikan WAF&lt;/h3&gt;
&lt;p&gt;Jangan mematikan WAF dari penyedia seperti Cloudflare. Dikarenakan dapat meng-ekspose alamat IP origin server dibalik WAF tersebut, dan tersimpan selamanya di record list seperti &lt;em&gt;Security Trails, dnsdumpster&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;2. Aktifkan ModSecurity &amp;#x26; OWASP ModSecurity CRS (Ingress Nginx)&lt;/h3&gt;
&lt;h4&gt;Mengaktifkan ModSecurity Pada Ingress&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ConfigMaps&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; v1
&lt;span class=&quot;token key atrule&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;allow-snippet-annotations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;enable-modsecurity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;enable-owasp-modsecurity-crs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ConfigMap
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ingress&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;nginx&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;controller&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ingress&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; networking.k8s.io/v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Ingress
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bwapp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ingress
  &lt;span class=&quot;token key atrule&quot;&gt;annotations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;nginx.ingress.kubernetes.io/rewrite-target&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /
    &lt;span class=&quot;token key atrule&quot;&gt;nginx.ingress.kubernetes.io/modsecurity-snippet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
      SecRuleEngine On&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Perbandingan ketika mengaktifkan ModSecurity tersebut.&lt;/h4&gt;
&lt;p&gt;Untuk melakukan testing terhadap efisiensi dari ModSecurity di sini saya melakukan &lt;em&gt;spawning bwapp&lt;/em&gt;. Full deployment dapat dilihat di &lt;a href=&quot;https://github.com/nicolasjulian/bwapp-k8s&quot;&gt;https://github.com/nicolasjulian/bwapp-k8s&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Melakukan serangan terhadap paramter rentan &lt;em&gt;title&lt;/em&gt;, berjalan dengan sangat mudah.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/79559e05d1b096119aae5b2a09d4e5b2/6c86f/sqlmap-bwapp.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 82.91139240506328%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB90lEQVR42qVUWXabQBDkBpbEsImdYZHYhJFkJR9O7n+qSncjMPLy4rx81OueYVRTXQUy0v4FYTEiKkcE+TN8PcBNWkIHJ27hpR2hX9ZcGbzHaztqpPdob9+8wmh1ADtIYPs5ocLGSvGkEjxxnftlnUy4rzd3TOdi7NILjDhr4actQt0jyk/wSZ0X1fDiGvukmRA3S8/7fMYJj7BIgBVUJOgAa1/AKX/A8IsO2fGE/HhFdjhPpHSBHPJLmF6xQr70Ozd/hJNB5S+ksO5xHEZU7U/CTVDUV8TFIApkNDujmkl9j62jJ9gpTH0lQlFEhocHUcXVjY4CHl0qj09j8wVqX0KRQq6z0plQMWFCSpiURw31Sbxk8NjTJZX4NXumyKuZkMGEopbCMjMi1ORbUj4LIZvORKzIJXVO9Kj4o6dvxIr8tYobjLDsEZcDhXJBVo1CygdFzeoHTGbfE50qKb/3kjY9l5ST5oyyuyKnIFIiZCU8hlqlOae7dfJPg3kYOa4GBLp7C+Z+26xqrXAi1Z9jDqWgUdmveZSdqwXrV2JjE74iek8YZB1M9+OLuv0bwZcKmwul2iwPJoX/QdhfXuWrYJ/Y9J2onQL4J5BFStOnV/c3ir+UfwtOisG3zf23oSKY6RlGNf6Gm49QyWmBlQ4P628h7mDXv/AH+cDJ8YTfeT0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Bwapp SQL Injection&quot;
        title=&quot;&quot;
        src=&quot;/static/79559e05d1b096119aae5b2a09d4e5b2/f058b/sqlmap-bwapp.png&quot;
        srcset=&quot;/static/79559e05d1b096119aae5b2a09d4e5b2/c26ae/sqlmap-bwapp.png 158w,
/static/79559e05d1b096119aae5b2a09d4e5b2/6bdcf/sqlmap-bwapp.png 315w,
/static/79559e05d1b096119aae5b2a09d4e5b2/f058b/sqlmap-bwapp.png 630w,
/static/79559e05d1b096119aae5b2a09d4e5b2/40601/sqlmap-bwapp.png 945w,
/static/79559e05d1b096119aae5b2a09d4e5b2/78612/sqlmap-bwapp.png 1260w,
/static/79559e05d1b096119aae5b2a09d4e5b2/6c86f/sqlmap-bwapp.png 1720w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Melakukan serangan terhadap paramter rentan &lt;em&gt;title&lt;/em&gt;, dengan metode yang sama. Namun tidak berhasil seperti sebelumnya.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dapat juga terlihat ada 249 request yang mendapatkan balikan &lt;strong&gt;403 (Forbidden)&lt;/strong&gt; dapat dipastikan penghalang yang dipasang bekerja dengan baik.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c490e73992df1cfedf3c379d9ec34ef8/6c86f/after-mod-sec.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 82.91139240506328%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAACWUlEQVR42oWU6VLbQBCE/QYBJOuWdUu7un0ANhS8/1t1elaCip3g/PhqdI56u2e16VWNsNQI8x5BPsFNe9iRNli3hOr7un1FC5v3nOYNmzBp4ZMg6RCkHbxYEwVvp+GvLMetQe5LdcIG26DGNqyXY7+EW52xieoBpZ5R96/ImwOy+oC02sPll91YUHypgROtyMvkya/w4BZ4JFIfthms4hkbX7FhO6HQJxTqaJom5YSQSxc1NlXIS09eabDWKjyuDQ1OBlsaJt2Ifp6ghgvUeEZDpWp8heaxKA3YWOwIM3pLVb+o5KrRbUNf1PV71N0LeUbVElZpLIhqUSs+i2I3UvcbenpCRg+L5kj/9mSmshk7LjsuRqNMGolvFhX+tdTbhm4zIlGT8S6tJtMsV4fFS55L8pbHAJz8Z0woKaycDZvTBYNw+EC/f8d0+kQ7vS1LJ6JSfIyyYVU8GKJ8Qa5FOeFKfJnDYpwwHyd08wd5I++moZ4uxleXM+hEy1zeJn6Fmy9LDhlKNRD9YhSVHB8JRQ2v5jgpZwT8ungpcyk+/icUhkBKdTLeZQ2DoY+phMOQxFNJ+GvAv1T+PDbdHkU3U90Lh/toxqRchzxjMDF9ku31+MeuuK+wnZG0i0JpIOlKY1G2NGuMR3dTFr5S1u2Ij2FALTtlOHOHXMy+lq0og+1zl4h33q41VQIyNdbf1809Ca65YKP4c+jSysQfZx1izl1EnKAyf5BtIFSm2jy3vWKpK/KceZbXtyUVxkw3Us/Y6TO84gAnn7FNZ1jJ+E/s7zpd39v1cPQnfgP9DNj9lvVjkAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Bwapp SQL Injection - Prevented&quot;
        title=&quot;&quot;
        src=&quot;/static/c490e73992df1cfedf3c379d9ec34ef8/f058b/after-mod-sec.png&quot;
        srcset=&quot;/static/c490e73992df1cfedf3c379d9ec34ef8/c26ae/after-mod-sec.png 158w,
/static/c490e73992df1cfedf3c379d9ec34ef8/6bdcf/after-mod-sec.png 315w,
/static/c490e73992df1cfedf3c379d9ec34ef8/f058b/after-mod-sec.png 630w,
/static/c490e73992df1cfedf3c379d9ec34ef8/40601/after-mod-sec.png 945w,
/static/c490e73992df1cfedf3c379d9ec34ef8/78612/after-mod-sec.png 1260w,
/static/c490e73992df1cfedf3c379d9ec34ef8/6c86f/after-mod-sec.png 1720w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Penampakan logs yang masuk ke ingress ketika aplikasi web tersebut mendapat percobaan serangan SQL Injection. Semua request yang dianggap &lt;em&gt;abusive&lt;/em&gt; diblok oleh ModSecurity.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e60c48cf0c7b48173925a9277969531f/fe9e8/ingress-got-attack.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.0253164556962%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB50lEQVR42l1S2XLbMAz0L6TJTNpYsnXxkCyJOnzFTpxOp8f/fxG6C9ru8YABCQKLxYILE96l2uxhB7Hdq7iedrrfq/ag5sJJPOLN+CbtfJHNdJFu+yE+nKVC3toMkg4/ZGH7s9hmK6WfZVX28JMUbpTMBPXrqoePsdwyHn1uB1nmrdYUqC1tkGwEoB8v4siw3kqGxBQAqypoRyZmKOSZlgOY3jQ7NAoKxpqk6CXJalkTsMIYBgwNQO1mB+A53lFkYSXujmNfvbLFFBVymM+80iPfg/X8E4DUDWAc2SCBBTyTDbvzziKa7w+wYwSC+e6AhlsFLwwmG77LwoAhdePINA8Wlg1wJiNt1MSzbffqm/AqNZZHQIeYJXNoroBueNOlkFFCkaFNCm2oD/VKiu6fWPpX/POqlmXGxUDzsrsuZXhXrbQTxuAGqRtHujGsrmMxhxKQaYzPcUFokJWt5JNqeELCTov4eBudFr/LFIGvEnD8P0u5AXOBsxTzLwC2+LwI8ouwc4GucSmjegISnMV1OEK741076sg4wVfFRtL+G0c+i9f1ozP+nG93qimbUIISwEbZM0bwCYD7qDvyGSO4q/Ej+G3c9FUSiPqcdfK49GpPSa32//0W+/SCOM4PL+5+fvxi5Ln5kN/bPWW9WF9CowAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Ingress Traffic Logs&quot;
        title=&quot;&quot;
        src=&quot;/static/e60c48cf0c7b48173925a9277969531f/f058b/ingress-got-attack.png&quot;
        srcset=&quot;/static/e60c48cf0c7b48173925a9277969531f/c26ae/ingress-got-attack.png 158w,
/static/e60c48cf0c7b48173925a9277969531f/6bdcf/ingress-got-attack.png 315w,
/static/e60c48cf0c7b48173925a9277969531f/f058b/ingress-got-attack.png 630w,
/static/e60c48cf0c7b48173925a9277969531f/40601/ingress-got-attack.png 945w,
/static/e60c48cf0c7b48173925a9277969531f/fe9e8/ingress-got-attack.png 1146w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;Percobaan Bypass ModSecurity dengan Tampering SQLMAP&lt;/h4&gt;
&lt;p&gt;Saya mencari berbagai bypass yang untuk filtering dari ModSecurity tersebut, salah satunya yang saya coba seperti gambar di bawah. Namun metode tersebut tidak berhasil.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python3 sqlmap.py  &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://bwapp.staging.nicolas.my.id/sqli_1.php?title=aa&amp;amp;action=search&quot;&lt;/span&gt;  &lt;span class=&quot;token parameter variable&quot;&gt;--cookie&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;PHPSESSID=kt0q1vf9dfdushriq9kdd5vj23; security_level=0&apos;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--tables&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--level&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; --random-agent &lt;span class=&quot;token parameter variable&quot;&gt;--batch&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a80f4949fa10e1a51ef66eb2caa2da58/6c86f/failed-bypass.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 82.91139240506328%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAACCUlEQVR42pWU65aaQBCEfYLsqojcRrkNDHdEUHGT/PD936nSPaxms0l0/VGHORz8qOpqmTnVgKDsIasRQu4QZAOi4oikPut7UX6Aat7gRg0WToqlq/4tJ8EqGTGzswY+SWY9RFghSFp9nVTCCwpsohpLS2Juhv/XyocR9gQsO4TFDml5hC9bRGoPn6EEsTYZTC/FfB09lhnAiAYC5i0CUlIcNISBMblNyoM+WyJ7DmipWkdmiIgq7Y5BITslx6b7pEOLYFeHm7hGmHZ0pmKyPYE7DWWXrzynL0Um4HWGWzk5ZaDMBxTNCHuTY2nLZyKTw6yllgc9w5BcsbtYO9zTS1rY2/zrDhmo14Yc8XpwZI4apDsaQaNh7JCBd6G/W54iq+o0NZz3OjbDHL+AwQtLxRiOhHEv+udSeIZcynVtOHpILrkUlghr7XYt1AOHH9aGIwcJ/f3SqV0Gbskpw0xP3S/n5jDlGU6l+ARjZwxl2PSSBmuCceyFFT8GemUD1XbI6WOgqiNUfdJro3eRnHLMFc3x4YJfgXVe41KUiKmUvB01kCUJyG55lVz6UHBBNsmiF9j6nMOhD4cXlXQtKUGCdXoihxTHowaFKOG69LCtYJo0q0WAxTK86eV1e9O3F//9+n5v7tNZYC46zKKfZySXH5CX7/DGXkuMw986f9D459k70u8Oe3hvF/wCwW7ZLbNxqmQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Try Bypass ModSecurity&quot;
        title=&quot;&quot;
        src=&quot;/static/a80f4949fa10e1a51ef66eb2caa2da58/f058b/failed-bypass.png&quot;
        srcset=&quot;/static/a80f4949fa10e1a51ef66eb2caa2da58/c26ae/failed-bypass.png 158w,
/static/a80f4949fa10e1a51ef66eb2caa2da58/6bdcf/failed-bypass.png 315w,
/static/a80f4949fa10e1a51ef66eb2caa2da58/f058b/failed-bypass.png 630w,
/static/a80f4949fa10e1a51ef66eb2caa2da58/40601/failed-bypass.png 945w,
/static/a80f4949fa10e1a51ef66eb2caa2da58/78612/failed-bypass.png 1260w,
/static/a80f4949fa10e1a51ef66eb2caa2da58/6c86f/failed-bypass.png 1720w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Secara garis besar kita sudah berada pada titik lebih baik daripada sebelumnya. SQL Injection tidak bisa dilakukan dengan sangat mudah.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ModSecurity only is not enough to protect your website You need to fix the BUG.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;3. Ketahui Aset Kita Yang Terekspos&lt;/h3&gt;
&lt;p&gt;Lakukan aset &lt;em&gt;discovery&lt;/em&gt; terhadap infrastruktur kita sendiri. Dengan melakukan subdomain enumeration menggunakan simple tools seperti Amass, Subfinder, knockpy, atau gunakan &lt;a href=&quot;http://Securitytrails.com&quot;&gt;Security Trails&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Lakukan pencarian sensitif informasi seperti environment variable, password, ip address. Menggunakan tools seperti &lt;a href=&quot;https://github.com/trufflesecurity/trufflehog&quot;&gt;Truffle Hog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Jika kita menemukan sesuatu yang semestinya tidak ter-ekspose ke publik, maka sebaiknya segera kita lakukan mitigasi pada temuan tersebut.&lt;/p&gt;
&lt;h3&gt;4. (Cloudflare as Front Liner) Hanya Izinkan Subnet Cloudflare&lt;/h3&gt;
&lt;p&gt;Salah satu pencegahan yang mudah dilakukan untuk menghindari bypass cloudflare adalah, dengan mengizinkan hanya subnet cloudflare saja yang boleh mengakses port dari service kita. Informasi tersebut dapat ditemukan di &lt;a href=&quot;https://www.cloudflare.com/ips/&quot;&gt;https://www.cloudflare.com/ips&lt;/a&gt;. Hal ini seharusnya dapat dilakukan juga pada sistem WAF yang lain.&lt;/p&gt;
&lt;h2&gt;Referensi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;NGINX Tutorial: Protect Kubernetes Apps from SQL Injection - NGINX &lt;a href=&quot;https://www.nginx.com/blog/microservices-march-protect-kubernetes-apps-from-sql-injection/&quot;&gt;https://www.nginx.com/blog/microservices-march-protect-kubernetes-apps-from-sql-injection/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ModSecurity with ingress-nginx &lt;a href=&quot;https://containerinfra.com/blog/cloud/2021-07-30-using-nginx-ingress-waf/&quot;&gt;https://containerinfra.com/blog/cloud/2021-07-30-using-nginx-ingress-waf/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OWASP ModSecurity Core Rule Set | OWASP Foundation &lt;a href=&quot;https://owasp.org/www-project-modsecurity-core-rule-set/&quot;&gt;https://owasp.org/www-project-modsecurity-core-rule-set/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How To Use ModSecurity and OWASP CRS For Web App Firewall (WAF) To Secure Your Website &lt;a href=&quot;https://blog.runcloud.io/modsecurity-firewall/#what-is-owasp-crs&quot;&gt;https://blog.runcloud.io/modsecurity-firewall/#what-is-owasp-crs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Annotations - NGINX Ingress Controller &lt;a href=&quot;https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#modsecurity&quot;&gt;https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#modsecurity&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/sqlmapproject/sqlmap/issues/4529&quot;&gt;https://github.com/sqlmapproject/sqlmap/issues/4529&lt;/a&gt; [CRITICAL] WAF/IPS identified as ‘’modsecurity (Trustwave)’ · Issue #4529 · sqlmapproject/sqlmap&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[[Production Case] Menelusuri Misteri Kubernetes DNS Penyebab "ENOTFOUND"]]></title><description><![CDATA[Sepengal kisah tentang jejak penelusuran pada salah satu komponen utama Kubernetes Cluster. Latar belakang Dikisahkan di sebuah startup…]]></description><link>https://nicolas.my.id/menelusuri-jejak-misterius-kube-dns/</link><guid isPermaLink="false">https://nicolas.my.id/menelusuri-jejak-misterius-kube-dns/</guid><pubDate>Sat, 20 Aug 2022 15:19:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Sepengal kisah tentang jejak penelusuran pada salah satu komponen utama Kubernetes Cluster.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Latar belakang&lt;/h2&gt;
&lt;p&gt;Dikisahkan di sebuah &lt;em&gt;startup&lt;/em&gt; terdapat urban legend mengenai Apps yang berjalan di atas Kubernetes namun sering mendapatkan logs error dikarenakan gagal melakukan &lt;em&gt;resolve&lt;/em&gt; ke DNS. Apps tersebut dibangun dengan menggunakan &lt;strong&gt;Java Scripts&lt;/strong&gt; berjalan dengan &lt;code class=&quot;language-text&quot;&gt;Runtime&lt;/code&gt; &lt;strong&gt;node.js&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;getaddrinfo ENOTFOUND disini.namadomain.com&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dikarenakan gagalnya resolve ke DNS tersebut, membuat apps sering bermasalah.&lt;/p&gt;
&lt;h2&gt;Penelusuran&lt;/h2&gt;
&lt;p&gt;Pada malam jum&apos;at pukul 23:11, Kota Bekasi, Jawa Barat. Di sebuah kamar temenung sosok pemuda yang sedang menatapi langit-langit kamar. Dengan suara latar lagu &lt;a href=&quot;https://www.youtube.com/watch?v=7C1_8c2Tu4Y&quot;&gt;NDX AKA - Sido Sayang Ora&lt;/a&gt;. Pemuda tersebut dalam hati berkata &lt;em&gt;&quot;Si A███ lagi ngopo yo ?, jane ki kepiye to karep e ki ?&quot;&lt;/em&gt; pemuda itu adalah &lt;del&gt;saya&lt;/del&gt; Sobat Ambyar. Untuk kedepannya akan kita sebut singkat sebagai &quot;Sobyar&quot;.&lt;/p&gt;
&lt;p&gt;Sobyar seketika terbangun dari ranjang tidurnya. Karena ingin melepaskan penat memikirkan sang pujaan hati yang entah menghilang kemana. Ia ingin menghibur diri. &lt;strong&gt;CTRL + ENTER&lt;/strong&gt;, terbukalah Terminal dengan mode fullscreen. Dirinya teringat akan  &lt;code class=&quot;language-text&quot;&gt;getaddrinfo ENOTFOUND&lt;/code&gt; yang terjadi di Cluster Kubernetes tempat Sobyar bekerja.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sobyar kemudian membuka &lt;code class=&quot;language-text&quot;&gt;nvim&lt;/code&gt; sambil membuka browser.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Pencarian Solusi&lt;/h2&gt;
&lt;p&gt;Setelah membaca berbagai sumber, sobyar mengkrucutkan ke beberapa pendekatan solusi. Diataranya sebagai berikut&lt;/p&gt;
&lt;h3&gt;1. Masalah Node.js Library&lt;/h3&gt;
&lt;p&gt;Dikarenakan apps berjalan menggunakan &lt;code class=&quot;language-text&quot;&gt;runtime&lt;/code&gt; node.js, maka Sobyar mencari - cari apakah ada keterkaitan dengan Bug di NodeJS. Hingga dia menemukan artikel terkait salah satu bug di &lt;code class=&quot;language-text&quot;&gt;node/lib/dns.js&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;errnoException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;err&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; syscall&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; hostname&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// FIXME(bnoordhuis) Remove this backwards compatibility nonsense and pass&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// the true error to the user. ENOTFOUND is not even a proper POSIX error!&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; uv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;UV_EAI_MEMORY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
      err &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; uv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;UV_EAI_NODATA&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
      err &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; uv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;UV_EAI_NONAME&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    err &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ENOTFOUND&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Namun ternyata issue tersebut sudah di-&lt;em&gt;fix&lt;/em&gt; pada node v8.x, dan node di &lt;em&gt;production&lt;/em&gt; sudah menggunakan v12.x. Dapat disimpulkan bahwa masalah yang terjadi bukan dari bug &lt;em&gt;Runtime&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;2. Memasang Pod CoreDNS Cache Dengan Node Local DNS&lt;/h3&gt;
&lt;p&gt;Selain masalah &lt;code class=&quot;language-text&quot;&gt;ETNOTFOUND&lt;/code&gt; ada masalah lain yang terjadi di kantor Sobyar, yaitu waktu &lt;em&gt;resolving&lt;/em&gt; yang cukup lama ketika traffic sedang tinggi-tingginya.&lt;/p&gt;
&lt;p&gt;Seakan Qos coredns termakan HABIS!, maka pada malam itu Sobyar mencari juga apakah ada &quot;tune-up&quot; untuk masalah performa coredns tersebut, dan ia menemukan; KubeCon Talk &lt;a href=&quot;https://www.youtube.com/watch?v=XbkViBUuScE&quot;&gt;Going from 5s to 5ms: Benefits of a Node-Local DNSCache - Pavithra Ramesh &amp;#x26; Blake Barnett
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sebenarnya Sobyar &lt;em&gt;nga ngerti-ngerti amat secara detil mendalamnya&lt;/em&gt; namun dia paham gambaran gampangnya.
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a94ee39aa6fab89abfc507eb487cb4aa/898f6/topo.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 103.79746835443038%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAIAAADJt1n/AAAACXBIWXMAAAsTAAALEwEAmpwYAAABqUlEQVR42o3T6Y7aQBAEYN7/7ZCQAIG475sEA8FA9ttpLQIvWad+jDx211R1uafy99+43++/En4ntFqtwWBwPB7jzXa7rfxMzrLsdrvleT6fz0ejUa/XW61W1+t1v9/vdrsSMgVFmJ1Op91uW4nbLhYL+uXKpIbD4XQ67ff7s9kMbTKZrNdr4pVC9TWBz1vC4XA4n89/Ehx0uVzyBNvT6fRCtj8kIBDk0JssgXk+QwCivkh2NkGl3W5Xk3w6iBTbcg7yo/6F7DNZXQmm0Wi0EoS82Wz+i0xT9TRBMMyPx2NrWCgk+kLOvxDBaBXhksCOtUj2WdExIUbnlOC9reSfp+UNWSmmVUh+Zhxku1wuQ80R32U/ySHCpEmIAfTgN0pOn74qsg0Lb5Qp4JBtNptyJu4PC8kYyY9b5OeQX5T15orsEjzIxuhp0h/iP8hv57fyyPYBpWQl5yHStlJ2SkH/zcXQHi8h6yeLQP+MWGNOfiKHIAuRf71ejyutI0eUkPnkmbK0a7VatVqVqDtsLVdGZtt4+nM4+jento4rV+aQQlzjGKG4z3FVn8kf1MG/CgJqxrgAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;NodeLocalDNS Topology&quot;
        title=&quot;&quot;
        src=&quot;/static/a94ee39aa6fab89abfc507eb487cb4aa/f058b/topo.png&quot;
        srcset=&quot;/static/a94ee39aa6fab89abfc507eb487cb4aa/c26ae/topo.png 158w,
/static/a94ee39aa6fab89abfc507eb487cb4aa/6bdcf/topo.png 315w,
/static/a94ee39aa6fab89abfc507eb487cb4aa/f058b/topo.png 630w,
/static/a94ee39aa6fab89abfc507eb487cb4aa/898f6/topo.png 798w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;Penjelasan Singat dan Hasil Implementasi&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;NodeLocalDNS&lt;/strong&gt; akan membuat pods di setiap nodes kubernetes yang berperan sebagai coredns cache &lt;code class=&quot;language-text&quot;&gt;(Daemonset)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pod tersebut akan menggunakan &lt;strong&gt;hostNetwork&lt;/strong&gt; dan membuat interface baru, dengan IP address yang sama seperti IP dari service kube-dns. Sehingga ketika pods di setiap nodes akan melakukan resolve dns maka akan di-&lt;em&gt;routing&lt;/em&gt; ke pods LocalDNS di masing-masing nodes. &lt;em&gt;CMIIW&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2d0c5f0f3e2cabe7ea5477df8e9d9315/b5cea/nodelocaldns-port-and-iptables.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.65822784810127%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACJUlEQVR42lVT2Y7aQBDkDzAgcawXnzO+TzDm2l0pm0hRkoco//8xleoGtOKhVDM9PdXV7fGkOI4oqzPi8gTbvBFXmPqCiLGwOME1O7yYHq7d4dXulTdxh8W2/IJXY76OsR7+YpIwuaiOSMoDUiKrRqTFgI4YuA7DEjMmLxRGeb6KMVtGX1gZOM4Gq+43Jq4tEWV7hGmPMOl0neYDWgrmtrtdJuYUc5b3NeFQaEoIz9YWzuwFq/4PHY4DEjpMxVk9wlIoTHcIKZzUR0RcCwyLJOXIgjtkjG+8AkHSYxs3cMThQzArb2K2YMsUNhR8jWoEdCcXRdw3LXzuZSy+bbUbESq7C7vqnwXz5qhCOkOyONxGjSaKoBTwTadCUvjh2KOgnMfs5NkhgwIRFLZkqS6XivasbYlDk++1ZXH8GIs4lFE8C7KqJOqMuI558dFyep+hpwV6zbuJD8piQgw8CRbNCTmdSLt5c9a2PCY/HMb8CDIz2af1SYVFUIpU/VU7eBKUtycfRGZxYz7gsFIHUl3iMgKBnAe2V/dbdvE4f3bIORTdFRndyUxSOvZ4wfBytXvTdykuLNvNeBbTnXQj3Ow/NO7IO5y7N0FLR4aI+KiV+TVdP4cXVbA53ZgGr0Ghe5PxufDPkVzhOO005ixDTKcrLLtfmJSH78gPn8j231DcOSg5O/7X1fEHTPuOqL4q58Onxm33AZ857eUnwuqKRdBi4abYjP/wHzRSfV4JKajsAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Contoh&quot;
        title=&quot;&quot;
        src=&quot;/static/2d0c5f0f3e2cabe7ea5477df8e9d9315/f058b/nodelocaldns-port-and-iptables.png&quot;
        srcset=&quot;/static/2d0c5f0f3e2cabe7ea5477df8e9d9315/c26ae/nodelocaldns-port-and-iptables.png 158w,
/static/2d0c5f0f3e2cabe7ea5477df8e9d9315/6bdcf/nodelocaldns-port-and-iptables.png 315w,
/static/2d0c5f0f3e2cabe7ea5477df8e9d9315/f058b/nodelocaldns-port-and-iptables.png 630w,
/static/2d0c5f0f3e2cabe7ea5477df8e9d9315/40601/nodelocaldns-port-and-iptables.png 945w,
/static/2d0c5f0f3e2cabe7ea5477df8e9d9315/b5cea/nodelocaldns-port-and-iptables.png 1140w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Hari semakin larut, jam dinding menujukan waktu pukul dua dini hari. Sobyar bergegas tidur agar besok tidak mengantuk di KRL.&lt;/p&gt;
&lt;p&gt;Siang hari di jam kerja, Sobyar melakukan diskusi dan meminta izin kepada petuah di &lt;em&gt;startup&lt;/em&gt; tempat ia bekerja untuk melakukan ritual pemasangan &lt;strong&gt;nodelocaldns&lt;/strong&gt;. Dengan segera para petuah pun menyetujui.&lt;/p&gt;
&lt;p&gt;Ritual pemasangan &lt;strong&gt;nodelocaldns&lt;/strong&gt; berjalan dengan lancar, namun masih belum terlihat jelas perbedaan yang signifikan.&lt;/p&gt;
&lt;p&gt;Hingga hari event tiba, beberapa cluster mendadak &lt;em&gt;stuck&lt;/em&gt; ketika melakukan &lt;em&gt;resolving dns&lt;/em&gt;. Namun tidak terjadi pada cluser yang sudah dilakukan ritual &lt;strong&gt;nodelocaldns&lt;/strong&gt;. Sehingga sekarang dapat terlihat jelas perbandingannya.&lt;/p&gt;
&lt;p&gt;Setelah itu semua &lt;em&gt;cluster critical&lt;/em&gt; Kubernetes dilakukan ritual &lt;strong&gt;nodelocaldns&lt;/strong&gt;., dan benar saja seketia cluster yang &lt;em&gt;stuck&lt;/em&gt; langsung berjalan normal kembali.&lt;/p&gt;
&lt;p&gt;Sobyar pun membuat &lt;strong&gt;HELM Template&lt;/strong&gt; untuk mempermudah ritualnya.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;helm repo &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; auto-node-local-dns https://nicolasjulian.github.io/node-local-dns/
helm &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; my-node-local-dns auto-node-local-dns/node-local-dns &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt;.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Namun, apakah sudah tidak ditemukan logs &lt;code class=&quot;language-text&quot;&gt;ENOTFOUND&lt;/code&gt; ? jawabannya masih, namun tidak sebanyak sebelumnya.&lt;/p&gt;
&lt;h3&gt;3. Efisiensi resolv.conf&lt;/h3&gt;
&lt;p&gt;Di malam hari Soybar menyalakan rokok, dan membuat secangkir kopi dengan mug yang bertuliskan &lt;em&gt;&quot;1000 hari mengenang bapak █████████&quot;&lt;/em&gt; saat itu malam minggu. Sobyar tidak keluar malam itu, suasana hatinya masih sama &lt;em&gt;&quot;ra karu - karu an, pokok e&quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Dinyalakannya Laptop, dan seketika terminal terbuka. Ia bergumam, &lt;em&gt;&quot;opo aku kurang sat set sat set yo ?, dek&apos;e wis karo wong liyo koyone.., jan██████&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Untuk menghilangkan penat. Maka sobyar memilih membaca &lt;a href=&quot;https://www.die.net&quot;&gt;die.net&lt;/a&gt; dikarenakan Ia menemukan salah satu &lt;a href=&quot;https://pracucci.com/kubernetes-dns-resolution-ndots-options-and-why-it-may-affect-application-performances.html&quot;&gt;artikel&lt;/a&gt; tentang penurunan performa coredns ketika menggunakan &lt;code class=&quot;language-text&quot;&gt;ndots:5&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;resolv.conf&lt;/code&gt; akan menentukan bagaimana perilaku ketika melakukan &lt;strong&gt;resolving&lt;/strong&gt; ke DNS Server.&lt;/p&gt;
&lt;h4&gt;Ada dua hal yang perlu dipahami&lt;/h4&gt;
&lt;h4&gt;search&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;search Search list for host-name lookup.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The search list is normally determined from the local domain name; by default, it contains only the local domain name. This may be changed by listing the desired domain search path following the search keyword with spaces or tabs separating the names. Resolver queries having fewer than ndots dots (default is 1) in them will be attempted using each component of the search path in turn until a match is found. For environments with multiple subdomains please read options ndots:n below to avoid man-in-the-middle attacks and unnecessary traffic for the root-dns-servers. Note that this process may be slow and will generate a lot of network traffic if the servers for the listed domains are not local, and that queries will time out if no server is available for one of the domains.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The search list is currently limited to six domains with a total of 256 characters.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;ndots&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;ndots:n&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;sets a threshold for the number of dots which must appear in a name given to res_query(3) (see resolver(3)) before an initial absolute query will be made. The default for n is 1, meaning that if there are any dots in a name, the name will be tried first as an absolute name before any search list elements are appended to it. The value for this option is silently capped to 15.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Default Kubernetes Config resolv.conf&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;root@nginx:/&lt;span class=&quot;token comment&quot;&gt;# cat /etc/resolv.conf &lt;/span&gt;
nameserver &lt;span class=&quot;token number&quot;&gt;10.96&lt;/span&gt;.0.10
search &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;namespace&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;.svc.cluster.local svc.cluster.local cluster.local
options ndots:5&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Rangkuman search &amp;#x26; ndots&lt;/h4&gt;
&lt;p&gt;Search memiliki 4 list value, seperti yang dilihat di atas, list tersebut berisikan &lt;code class=&quot;language-text&quot;&gt;local domain name&lt;/code&gt; default dari kubernetes. Sedangkan ndots menentukan berapa jumlah titik yang diperlukan sebuah domain dapat disebut &quot;FQDN (Fully qualified domain name)&quot; dan dilakukan resolv pertama kali.&lt;/p&gt;
&lt;h4&gt;Bagaimana kerja default resolv.conf Kubernetes&lt;/h4&gt;
&lt;p&gt;Supaya mempercepat latency, ndots diberikan value 5 (default). Sehingga domain yang pertama kali dilakukan resolv adalah &lt;code class=&quot;language-text&quot;&gt;nama-service.&amp;lt;namespace&gt;.svc.cluster.local.&lt;/code&gt;Sangat masuk akal performanya akan sangat baik, jika &lt;em&gt;domain name&lt;/em&gt; yang diresolve adalah pada level &lt;em&gt;service&lt;/em&gt; Kubernetes Cluster. Namun jika yang di-&lt;em&gt;resolve&lt;/em&gt; adalah &lt;em&gt;public domain&lt;/em&gt; maka hal tersebut hanya akan menimbulkan becana.&lt;/p&gt;
&lt;p&gt;Berikut adalah contoh melakukan resolve public domain, jika menggunakan default ndots values. Empat kali proses &lt;code class=&quot;language-text&quot;&gt;pathing&lt;/code&gt; nama domain dengan &lt;em&gt;local domain name search&lt;/em&gt; supaya mencapai &lt;em&gt;path&lt;/em&gt; yang benar.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4d5b298975656a208f0c4362ea5115b3/4ad3a/contoh-resolve-default.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.0253164556962%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABu0lEQVR42o2T2W7bMBBF/QEtbEuyrYXUQoqiFivxIssJWvQ1SBEgaPr/33I7w8Ru4SRwHw5IajkczgwnZvMDtr9H1d/BrO+gmgN0N6LsjgjzNeaRJSp4sf0Qn5jFDZSU2A0jJqodYbsDymZAbm4h1Q3RI4gNlsJiQWMQGfhhiflSfYi30vgyk/iqv2MizI5EGwgS8RhlnZO6dbWF1D3NX1nJGl6oMV9dwJsFEsv6GyZFe0RRbZDQ8RaJxZR29Dkigj+e0Zp5J7kQznyJwJIwb0aI4lXGL0+yk3CRVBR1izBtaF1eF54izNyxeycXRY847xwsDuLq/yNM7QDDBaF86XrvpDltIPUNlN0h1bcXOSyvC6VaI5QNVbQ655AruxT1OY+nn68Ks/rg2iRMW/exFxoHSzmvDOePWfGmb7n+VKipmQu7dUeM8hZJ0SGhiHkeE1wUjtT1JBHQes6t8y8RCaltAm6bzOxh7B653kCVW4i0Q1ZQc2c9Cnom0jVi0SCWLQKq8tTLLygoOoXpNIGv7+mmPNJ1e6SCPO1hfx9RvYxutOfx75zfVb8OMG+UzwP0zx39O0A99NAvD/gDXGBLjxq/JOwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ndots value 5&quot;
        title=&quot;&quot;
        src=&quot;/static/4d5b298975656a208f0c4362ea5115b3/f058b/contoh-resolve-default.png&quot;
        srcset=&quot;/static/4d5b298975656a208f0c4362ea5115b3/c26ae/contoh-resolve-default.png 158w,
/static/4d5b298975656a208f0c4362ea5115b3/6bdcf/contoh-resolve-default.png 315w,
/static/4d5b298975656a208f0c4362ea5115b3/f058b/contoh-resolve-default.png 630w,
/static/4d5b298975656a208f0c4362ea5115b3/40601/contoh-resolve-default.png 945w,
/static/4d5b298975656a208f0c4362ea5115b3/4ad3a/contoh-resolve-default.png 1152w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Berikut contoh hasil jika menggunakan &lt;code class=&quot;language-text&quot;&gt;ndots:1&lt;/code&gt;, dikarenakan hanya perlu satu titik di dalam nama domain untuk menjadi FQDN maka nama dns langsung menuju ke &lt;code class=&quot;language-text&quot;&gt;google.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2ee08a5ad7703a4308c54ac8aa360841/4ad3a/contoh-resolve-tuning.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.0253164556962%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABx0lEQVR42pVS23LTMBD1B0Dj+JLEF9myJN8S24lTNy2UF564DAxD+f9vOewqJJRmwkwfzqyk1R7tOVpHD49otu9hugfIZkJqdpD1LUQ50npErAZERY9l3iEULby4/gc+wY1bKCGwnw5wEr1DpjrE+QaZ7rESDRK5RpS3SIvuuM5ayq8RxhXmC3UBb6nxxhV4qz/AKdb3kNWOCjsEUYmbQGJOF7yVgUuXZ+EJBe21zV2A7s4DgUXzCEdtHpDrASvqIqAOFmnzBySHHgiTirpusWS5XHiF0PUFgpoIZXuAqkbIcodUdbbTpDhaEMuNfYSlXiV7SSiqW6h6T/5tbWTC3GyJvCcrRgjqPqVPEbRfkr9M7Efm/x3Kcmu7CZPaesVSGSydfWScip+vrxLyb7JnnDySmTMhgx+zNlBkLy9InxPyL7OHJ5lMzhK5+Oxh8goPs3pCtZlQNHvoNQ20GWjAR2TlAEVnGT9E8ykMeZiRhxETvAApcmlsAh4b3d4jzUhKVCNYGNy4ObyA5jDUNs48aTH3yUu/OO//guaTcrNZAl+/g9P/+gj1ZUT5nTr9eYeSwLF6Opz312B+TNBfSdm3CepzD/30Cb8BwqhKnzD0SjIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ndots value 1&quot;
        title=&quot;&quot;
        src=&quot;/static/2ee08a5ad7703a4308c54ac8aa360841/f058b/contoh-resolve-tuning.png&quot;
        srcset=&quot;/static/2ee08a5ad7703a4308c54ac8aa360841/c26ae/contoh-resolve-tuning.png 158w,
/static/2ee08a5ad7703a4308c54ac8aa360841/6bdcf/contoh-resolve-tuning.png 315w,
/static/2ee08a5ad7703a4308c54ac8aa360841/f058b/contoh-resolve-tuning.png 630w,
/static/2ee08a5ad7703a4308c54ac8aa360841/40601/contoh-resolve-tuning.png 945w,
/static/2ee08a5ad7703a4308c54ac8aa360841/4ad3a/contoh-resolve-tuning.png 1152w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Malam itu berjalan dengan cepat. Singkat certia hari Senin tiba, Sobyar menyampaikan temuannya kepada petuah, dan meminta izin untuk melakukan ritual perubahan Deployment.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;  &lt;span class=&quot;token key atrule&quot;&gt;dnsConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ndots
        &lt;span class=&quot;token key atrule&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Petuah memberi izin,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;minggu depan yaa ...&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&quot;Wokeee ...&quot; jawab Sobyar. Minggu yang dimaksud telah tiba, pada hari itu developer Apps tersebut juga menanyakan perihal solusi untuk masalah tersebut. Momen yang tepat. Deployment pun dilakukan perubahan di hari itu.&lt;/p&gt;
&lt;p&gt;Benar saja. &lt;code class=&quot;language-text&quot;&gt;Logs ENOTFOUND&lt;/code&gt; berangsur menghilang untuk service tersebut, dan 1 jam kemudian semua error ENOTFOUND sudah tidak terlihat. Everybody happy!&lt;/p&gt;
&lt;p&gt;Berikut logs selama 2 minggu setelah melakukan tuning.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d9e9b340e00b561ffc1e5b61dae1f3d2/58873/kibana.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 27.21518987341772%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAABEUlEQVR42o2OS0vDQBSF87f9G+7c6UJBwWpFa16t7kVREbrwAYZCtTVpM0lmMq97vEn8AQ4czuXMfXxBGCc0Oj1HGCWIkykiVu9xylmKJJ1hOrvtPQ4TXIcpJqwwHPovuR5fJbQ/usHuwUQElTSkjce/nrHw3qPrJhoiPzi9rIGjeymC5aqgbaWgWo1GaVjLQyB8vL3j+fEJ2hhIqVA3DfJii7IUUErxbgvnXC+e6ddKWYvgc/FFRdnAOA/dGmT5GievD9g53MPZxRiuI2I5/ifG8ozU1Z7rjvKPlLz1yPMNL1xu6Ls0WAkHrQnZ5gfH8ztE2RyLpkTVDjTaWYimRq0ktDUMwBnnnbfGUHdMCCF+AU8Acpjt7K8nAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Kibana Logs Last 2 Weeks&quot;
        title=&quot;&quot;
        src=&quot;/static/d9e9b340e00b561ffc1e5b61dae1f3d2/f058b/kibana.png&quot;
        srcset=&quot;/static/d9e9b340e00b561ffc1e5b61dae1f3d2/c26ae/kibana.png 158w,
/static/d9e9b340e00b561ffc1e5b61dae1f3d2/6bdcf/kibana.png 315w,
/static/d9e9b340e00b561ffc1e5b61dae1f3d2/f058b/kibana.png 630w,
/static/d9e9b340e00b561ffc1e5b61dae1f3d2/40601/kibana.png 945w,
/static/d9e9b340e00b561ffc1e5b61dae1f3d2/78612/kibana.png 1260w,
/static/d9e9b340e00b561ffc1e5b61dae1f3d2/58873/kibana.png 3367w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Satu chart spike terakhir di atas adalah percobaan apabila deployment tidak menggunakan efisien &lt;code class=&quot;language-text&quot;&gt;resolv.conf&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Penyesuaian Lainnya&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Perubahan Upstream DNS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hal ini dilakukan karena ternyata &lt;code class=&quot;language-text&quot;&gt;/etc/resolv.conf&lt;/code&gt; bawaan dari cloud provider, mengarah ke DNS yang berada di belahan dunia lain. Sobyar mengangap hal seperti itu tidak best practice.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/56cf29dc47f3d16dc609f8b3483f4808/a07de/ovh-resolver-default.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 70.88607594936708%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAOABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABQAG/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAXzE8eOWdq//xAAaEAACAgMAAAAAAAAAAAAAAAAAAQMUAhAy/9oACAEBAAEFAi5gnej1J2f/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwFH/8QAGRAAAgMBAAAAAAAAAAAAAAAAAAECEDFx/9oACAEBAAY/AhpqRkqfa//EABsQAAIBBQAAAAAAAAAAAAAAAAABEBEhMaHx/9oACAEBAAE/IRswUthHKjfR/9oADAMBAAIAAwAAABBIL//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPxBKkH//xAAeEAEAAgEEAwAAAAAAAAAAAAABABEhEDFBYaGx0f/aAAgBAQABPxBcNYzVkTApTyDUTU2un2J7jtevzp//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Server di Singapore tapi DNS di Paris&quot;
        title=&quot;&quot;
        src=&quot;/static/56cf29dc47f3d16dc609f8b3483f4808/828fb/ovh-resolver-default.jpg&quot;
        srcset=&quot;/static/56cf29dc47f3d16dc609f8b3483f4808/ff44c/ovh-resolver-default.jpg 158w,
/static/56cf29dc47f3d16dc609f8b3483f4808/a6688/ovh-resolver-default.jpg 315w,
/static/56cf29dc47f3d16dc609f8b3483f4808/828fb/ovh-resolver-default.jpg 630w,
/static/56cf29dc47f3d16dc609f8b3483f4808/0ede0/ovh-resolver-default.jpg 945w,
/static/56cf29dc47f3d16dc609f8b3483f4808/3ac88/ovh-resolver-default.jpg 1260w,
/static/56cf29dc47f3d16dc609f8b3483f4808/a07de/ovh-resolver-default.jpg 1287w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mengaktifkan AutoPath&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Menjadi tidak berguna apabila sudah melakukan efisiensi resolv.conf&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If the autopath plugin sees a query that matches the first element of the configured search path, it will follow the chain of search path elements and return the first reply that is not NXDOMAIN&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Berikut adalah &lt;em&gt;full&lt;/em&gt; configMaps pada bagian &lt;code class=&quot;language-text&quot;&gt;Corefile&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;  &lt;span class=&quot;token key atrule&quot;&gt;Corefile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;
    .&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;53 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        log
        errors
        autopath @kubernetes
        health &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            lameduck 5s
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        ready
        kubernetes cluster.local in&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;addr.arpa ip6.arpa &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            pods verified
            fallthrough in&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;addr.arpa ip6.arpa
            ttl 30
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        prometheus &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9153&lt;/span&gt;
        forward . 8.8.8.8 8.8.4.4 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          prefer_udp
          policy sequential
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        cache 30
        loop
        reload
        loadbalance
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Referensi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;nicolasjulian/node-local-dns: Deploy Helm Chart for Node Local DNS with GitOps Way &lt;a href=&quot;https://github.com/nicolasjulian/node-local-dns&quot;&gt;https://github.com/nicolasjulian/node-local-dns&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What is DNS? | How DNS works | Cloudflare &lt;a href=&quot;https://www.cloudflare.com/learning/dns/what-is-dns/&quot;&gt;https://www.cloudflare.com/learning/dns/what-is-dns/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;autopath &lt;a href=&quot;https://coredns.io/plugins/autopath/#:~:text=Description,the%20original%20reply%20is%20returned&quot;&gt;https://coredns.io/plugins/autopath/#:~:text=Description,the%20original%20reply%20is%20returned&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kubernetes_DNS_Horror_Stories.pdf &lt;a href=&quot;https://static.sched.com/hosted_files/kccnceu20/de/Kubernetes_DNS_Horror_Stories.pdf&quot;&gt;https://static.sched.com/hosted_files/kccnceu20/de/Kubernetes_DNS_Horror_Stories.pdf&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Embracing high request loads on Kubernetes | by Nitin Bisht | Blocket Engineering | Medium &lt;a href=&quot;https://medium.com/blocket-engineering/embracing-high-request-loads-on-kubernetes-1c9d4e84c508&quot;&gt;https://medium.com/blocket-engineering/embracing-high-request-loads-on-kubernetes-1c9d4e84c508&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DNS Lookups in Kubernetes &lt;a href=&quot;https://mrkaran.dev/posts/ndots-kubernetes/&quot;&gt;https://mrkaran.dev/posts/ndots-kubernetes/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kubernetes pods /etc/resolv.conf ndots:5 option and why it may negatively affect your application performances &lt;a href=&quot;https://pracucci.com/kubernetes-dns-resolution-ndots-options-and-why-it-may-affect-application-performances.html&quot;&gt;https://pracucci.com/kubernetes-dns-resolution-ndots-options-and-why-it-may-affect-application-performances.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to fix nodejs DNS issues?. Networking issues are always most… | by Aleksandar Mirilovic | Medium &lt;a href=&quot;https://medium.com/@amirilovic/how-to-fix-node-dns-issues-5d4ec2e12e95&quot;&gt;https://medium.com/@amirilovic/how-to-fix-node-dns-issues-5d4ec2e12e95&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setting up NodeLocal DNS Cache | Yandex Cloud - Documentation &lt;a href=&quot;https://cloud.yandex.com/en/docs/managed-kubernetes/tutorials/node-local-dns&quot;&gt;https://cloud.yandex.com/en/docs/managed-kubernetes/tutorials/node-local-dns&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Elastic Kubernetes Service: load-testing and high-load tuning – problems and solutions &lt;a href=&quot;https://rtfm.co.ua/en/kubernetes-load-testing-and-high-load-tuning-problems-and-solutions/&quot;&gt;https://rtfm.co.ua/en/kubernetes-load-testing-and-high-load-tuning-problems-and-solutions/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[[Personal Project] Menghapus Bloatware Pada Ponsel Xiaomi]]></title><description><![CDATA[Latar Belakang Sudah lama saya merasa bahwa ponsel yang saya gunakan, semakin lama penyimpanan yang tersisa semakin sedikit. Maka dari itu…]]></description><link>https://nicolas.my.id/menghapus-bloatware-xiaomi/</link><guid isPermaLink="false">https://nicolas.my.id/menghapus-bloatware-xiaomi/</guid><pubDate>Sun, 03 Jul 2022 14:30:00 GMT</pubDate><content:encoded>&lt;hr&gt;
&lt;h2&gt;Latar Belakang&lt;/h2&gt;
&lt;p&gt;Sudah lama saya merasa bahwa ponsel yang saya gunakan, semakin lama penyimpanan yang tersisa semakin sedikit. Maka dari itu, saya merencanakan akan melakukan pemeliharaan dengan membersihkan &lt;em&gt;files&lt;/em&gt; yang sekiranya sudah jarang saya akses secara &lt;em&gt;mobile&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Masalah&lt;/h2&gt;
&lt;p&gt;Namun di tengan jalan ketika melakukan pembersihan saya merasa bahwa ada sesuatu yang sangat menggangu yaitu iklan dari aplikasi-aplikasi bawaan Xiaomi yang tidak pernah saya gunakan.&lt;/p&gt;
&lt;h2&gt;Solusi&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Hapus Bloatware. Saya mencoba meng-&lt;em&gt;Uninstall&lt;/em&gt; aplikasi - aplikasi tersebut namun tidak terdapat opsi &lt;em&gt;Uninstall&lt;/em&gt;. Saya sempat berfikir mungkin diperlukan akses root untuk melakukan tindakan tersebut. Tapi ternyata ada trik untuk melakukan hal tersebut tanpa memerlukan akses root.&lt;/li&gt;
&lt;li&gt;Pindahkan data ke HDD.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Hapus Bloatware Dengan ADB (Android Debug Bridge)&lt;/h3&gt;
&lt;p&gt;Untuk meng-&lt;em&gt;Uninstall&lt;/em&gt; Aplikasi yang tidak berguna bawaaan dari OS tersebut kita hanya perlu melakukannya via SHELL tanpa harus memiliki &lt;em&gt;priviledge&lt;/em&gt; root.&lt;/p&gt;
&lt;h4&gt;Install ADB (Ubuntu)&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; adb                             		      
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; list &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; adb 						      &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Hubungkan ADB Ke Ponsel Xiaomi&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ adb devices                                                              
* daemon not running&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; starting now at tcp:5037
* daemon started successfully
List of devices attached

$ adb devices                                                             
List of devices attached
HU7HQ4PZCY9TFY75	device&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Lis Semua Aplikasi&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ adb shell                                                                
angelica:/ $
angelica:/ $ pm list packages &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt;                                                       
package:com.miui.screenrecorder
package:com.mediatek.ims
package:com.google.android.apps.subscriptions.red
package:com.mediatek.op01.phone.plugin
package:com.android.cts.priv.ctsshim
package:com.google.android.youtube
package:com.android.internal.display.cutout.emulation.corner
package:com.google.android.ext.services
package:com.android.internal.display.cutout.emulation.double
package:com.android.providers.telephony
package:com.android.dynsystem
package:com.miui.powerkeeper
package:com.xiaomi.miplay_client
package:com.google.android.googlequicksearchbox
package:com.miui.fm
package:com.xiaomi.calendar
package:com.xiaomi.bluetooth.overlay
package:com.xiaomi.discover
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;--------------&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Hapus Aplikasi Bloatware&lt;/h4&gt;
&lt;p&gt;Namun &lt;strong&gt;ada pengecualian untuk beberapa aplikasi yang jika dihapus akan menyebabkan permasalahan seperti boot-loop, dll&lt;/strong&gt;. Berikut daftarnya:
&lt;em&gt;(dikutip dari referensi di bawah)&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Apps&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;com.xiaomi.finddevice&lt;/td&gt;
&lt;td&gt;endless boot loop, some time after it will ask to erase the phone and start over. Guess how I learned that?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;com.miui.securitycenter&lt;/td&gt;
&lt;td&gt;phone reboots only in recovery mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;com.android.contacts&lt;/td&gt;
&lt;td&gt;you lose the phone icon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;com.mi.android.globalminusscreen&lt;/td&gt;
&lt;td&gt;Xiaomi App Vault. if you are logged in with Mi account, device becomes locked, to unlock you should bring it to Xiaomi Services Center. Settings -&gt; Home Screen crashes Settings app.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Tambahan, pengalaman pribadi; jika kita menghapus &lt;strong&gt;com.miui.miwallpaper&lt;/strong&gt; wallpapaer lockscreen tidak akan bisa dirubah.&lt;/p&gt;
&lt;p&gt;Hapus aplikasi bloatware sesuai yang diinginkan. &lt;strong&gt;DWYOR!&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;angelica:/ $ pm uninstall &lt;span class=&quot;token parameter variable&quot;&gt;--user&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; com.miui.analytics                                  
Success
angelica:/ $ pm uninstall &lt;span class=&quot;token parameter variable&quot;&gt;--user&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; com.xiaomi.mipicks                                  
Success
angelica:/ $ pm uninstall &lt;span class=&quot;token parameter variable&quot;&gt;--user&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; com.miui.msa.global                                 
Success
angelica:/ $ pm uninstall &lt;span class=&quot;token parameter variable&quot;&gt;--user&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; com.miui.videoplayer                                
Success
angelica:/ $ pm uninstall &lt;span class=&quot;token parameter variable&quot;&gt;--user&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; com.miui.player                                     
Success
angelica:/ $ pm uninstall &lt;span class=&quot;token parameter variable&quot;&gt;--user&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; com.mi.globalbrowser                                
Success
angelica:/ $ pm uninstall &lt;span class=&quot;token parameter variable&quot;&gt;-k&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--user&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; com.android.thememanager
Success
angelica:/ $ pm uninstall &lt;span class=&quot;token parameter variable&quot;&gt;-k&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--user&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; com.miui.miwallpaper
Success
angelica:/ $ pm uninstall &lt;span class=&quot;token parameter variable&quot;&gt;-k&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--user&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; com.xiaomi.midrop
Success
angelica:/ $ pm uninstall &lt;span class=&quot;token parameter variable&quot;&gt;-k&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--user&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; com.xiaomi.calendar&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Pindahkan Data Dari Ponsel Ke HDD&lt;/h3&gt;
&lt;p&gt;Kelemahan ketika melakukan transfer menggunakan MTP (Media Transfer Protocol) adalah performa dari transfer file yang sangat lamban, meskipun sudah menggunakan USB 3.0.&lt;/p&gt;
&lt;p&gt;Alternatif lain untuk melakukan pemindahan data dengan performa yang lebih cepat adalah menggunakan &lt;em&gt;ADB pull command&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /hdd/
$ adb pull /sdcard/ ./sdcard&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Akhir&lt;/h3&gt;
&lt;p&gt;Iklan pada Lock Screen akan hilang, dan &lt;em&gt;experience&lt;/em&gt; untuk penggunaan sehari-hari terasa lebih nyaman.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;Home Screen&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;Lock Screen&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2d342dd5996cc43c6facc8fc86367b46/80e3c/miui.home.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 222.1518987341772%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAsABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEDBAL/xAAXAQEBAQEAAAAAAAAAAAAAAAABAwAC/9oADAMBAAIQAxAAAAFdQvSzMpjSQ4YsidD6xubYyjv/xAAcEAADAAMBAQEAAAAAAAAAAAAAAQIDERITISL/2gAIAQEAAQUCX1D0Ytop8r1Z61CeezLX6TkfJetzls7oqnbTek2M/8QAGREAAwADAAAAAAAAAAAAAAAAAAERAhJR/9oACAEDAQE/AVl03Q2UhD//xAAYEQEAAwEAAAAAAAAAAAAAAAAAARESEP/aAAgBAgEBPwFUq5pt/8QAIRAAAAYCAQUAAAAAAAAAAAAAAAEQESExAlESAyIyQWH/2gAIAQEABj8Cg1pKBNmVaEdQq0L5fRODwPH0ILiCZ4gMx6odyWe0/8QAHhABAAIDAAMBAQAAAAAAAAAAAQARIUFRMWFxkaH/2gAIAQEAAT8hRcDA7Bpb9htFU7g2I/JStzS62Vaeoy0flXXI7dLrwI8LMn72cnfvvsuzxXhiNAVamHY1i4q0xDKn3MP+zcSM/9oADAMBAAIAAwAAABC7/f8AKN//xAAYEQEBAQEBAAAAAAAAAAAAAAAAEQFBYf/aAAgBAwEBPxDCU8XbFqa//8QAGxEBAAICAwAAAAAAAAAAAAAAAQARECExUbH/2gAIAQIBAT8QR4MQOvIGo0NEKlVP/8QAIBABAAMAAgICAwAAAAAAAAAAAQARIUFxMVFhkaHB0f/aAAgBAQABPxD6BiKcHolwuFF0rYN5YgL31GLjwDWIATcGxqGiSTGjkxYAqaN/ZAasbCV8QAWqW0vh0JaKbBRV/H8RCaA28vvYGGkkCA8RBJHtH13L5h+eVXEMkCnDycwFgKxSz27mLbvVeWf/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Home Screen&quot;
        title=&quot;&quot;
        src=&quot;/static/2d342dd5996cc43c6facc8fc86367b46/828fb/miui.home.jpg&quot;
        srcset=&quot;/static/2d342dd5996cc43c6facc8fc86367b46/ff44c/miui.home.jpg 158w,
/static/2d342dd5996cc43c6facc8fc86367b46/a6688/miui.home.jpg 315w,
/static/2d342dd5996cc43c6facc8fc86367b46/828fb/miui.home.jpg 630w,
/static/2d342dd5996cc43c6facc8fc86367b46/80e3c/miui.home.jpg 720w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9ab956ca58073204c0190b440a60633a/80e3c/lockscreen.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 222.1518987341772%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAsABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIDAQX/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAeVJsyADcsTUByx1no5MP//EABoQAAICAwAAAAAAAAAAAAAAABEgAAEQMkH/2gAIAQEAAQUC4oTbBEq1/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8BIU//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AV//xAAZEAACAwEAAAAAAAAAAAAAAAAgMQERITD/2gAIAQEABj8Cc8ssGH//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEQIUFhcVH/2gAIAQEAAT8h14MW/ZcKvL2MHpi7I06ldQA5uMCXpiC3QxcW5//aAAwDAQACAAMAAAAQXDiyJO//xAAXEQEAAwAAAAAAAAAAAAAAAAABABAR/9oACAEDAQE/EKRMaaT/xAAWEQEBAQAAAAAAAAAAAAAAAAAAERD/2gAIAQIBAT8QyqiP/8QAGxABAAMBAQEBAAAAAAAAAAAAAQARIUExUXH/2gAIAQEAAT8QECw+DyHv5FPUxdUXfmwIXYdY1eOcuKC3CrmnhqesKPkEpUegXLCCmvED20rtj0MsRws4x4AO18ls1wmDAorOz//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Lock Screen&quot;
        title=&quot;&quot;
        src=&quot;/static/9ab956ca58073204c0190b440a60633a/828fb/lockscreen.jpg&quot;
        srcset=&quot;/static/9ab956ca58073204c0190b440a60633a/ff44c/lockscreen.jpg 158w,
/static/9ab956ca58073204c0190b440a60633a/a6688/lockscreen.jpg 315w,
/static/9ab956ca58073204c0190b440a60633a/828fb/lockscreen.jpg 630w,
/static/9ab956ca58073204c0190b440a60633a/80e3c/lockscreen.jpg 720w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[Q] Faster MTP transfer solution? | XDA Forums&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://forum.xda-developers.com/t/q-faster-mtp-transfer-solution.1954616/&quot;&gt;https://forum.xda-developers.com/t/q-faster-mtp-transfer-solution.1954616/&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Android: adb pull file on desktop - Stack Overflow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/17629889/android-adb-pull-file-on-desktop?answertab=trending#tab-top&quot;&gt;https://stackoverflow.com/questions/17629889/android-adb-pull-file-on-desktop?answertab=trending#tab-top&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How to make adb shell ps list all processes in Android O? - Stack Overflow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/44732749/how-to-make-adb-shell-ps-list-all-processes-in-android-o&quot;&gt;https://stackoverflow.com/questions/44732749/how-to-make-adb-shell-ps-list-all-processes-in-android-o&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adb useful commands list&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/Pulimet/5013acf2cd5b28e55036c82c91bd56d8&quot;&gt;https://gist.github.com/Pulimet/5013acf2cd5b28e55036c82c91bd56d8&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Removing all unnecessary bloatware from Xiaomi MIUI 11/12 (Android 9/10) without root&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://selivan.github.io/2020/02/25/removing-bloatware-from-xiaomi-miui-android.html&quot;&gt;https://selivan.github.io/2020/02/25/removing-bloatware-from-xiaomi-miui-android.html&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How to free up internal storage on Android, including &apos;other&apos; storage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://nerdschalk.com/how-to-free-up-storage-on-android/&quot;&gt;https://nerdschalk.com/how-to-free-up-storage-on-android/&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[[Personal Project] Utas Tentang Laptop Yang Melawan Untuk Rehat]]></title><description><![CDATA[Laptop dengan spesifikasi super, port utilitas yang lengkap, dan bandel sejak dahulu. Latar belakang Jarum pendek menunjuk antara angka…]]></description><link>https://nicolas.my.id/thinkpad-x220/</link><guid isPermaLink="false">https://nicolas.my.id/thinkpad-x220/</guid><pubDate>Sun, 19 Jun 2022 11:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Laptop dengan spesifikasi super, port utilitas yang lengkap, dan bandel sejak dahulu.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Latar belakang&lt;/h3&gt;
&lt;p&gt;Jarum pendek menunjuk antara angka 2 dan 3. Jarum panjang menunjuk angka 6. Jam menunjuk pukul dua lebih tiga puluh menit, sudah dini hari. Tidak ada angin, tidak ada hujan saya merasa perlu sebuah perangkat yang &lt;em&gt;ready to go&lt;/em&gt;, dan &lt;em&gt;nga rewel&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Langsung seketika saya buka marketplace langganan, dan menuliskan &quot;Laptop&quot; dengan filter harga tertinggi 1 juta rupiah. Seketika saya teringat dengan &lt;strong&gt;Thinkpad&lt;/strong&gt; laptop murah dengan &lt;em&gt;daleman&lt;/em&gt; yang mundah di-&lt;em&gt;oprek&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;Riset&lt;/h3&gt;
&lt;p&gt;Setelah melihat-lihat marketplace kesayangan, saya mulai jatuh cinta dengan &lt;strong&gt;Thinkpad T-60&lt;/strong&gt; dimana laptop tersebut masih terpajang logo &lt;strong&gt;IBM&lt;/strong&gt; yang sangat terasa &lt;em&gt;retro&lt;/em&gt;. Saya &lt;em&gt;mbatin&lt;/em&gt; di dalam hati &quot;mantep iki retroo.. poooll..&quot; belum lagi ditambah keyboard yang diisikan berbagai bentuk kanji bahasa jepang yang pasti saya tidak tahu artinya, dan &lt;em&gt;nga bakal kepake juga&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Dalam beberapa hari setiap kali meimiliki waktu luang. Kerjaan saya hanya ngeliat-in marketplace..., apa ada barang bagus baru hari?. Saya juga menyempatkan untuk bergabung ke dalam group Telegram &lt;strong&gt;&quot;Cari Laptop Lenovo Thinkpad&quot;&lt;/strong&gt;. Tidak cukup sampai di situ, bahkan saya menghubungi kolega lama, yang saya ketahui beliau adalah pemilik Laptop Thinkpad &lt;em&gt;segede gaban&lt;/em&gt;. Untuk menggali informasi lebih dalam mengenai harga pasaran, dll.&lt;/p&gt;
&lt;p&gt;Kemudian saya meluncur ke situs berbagai video &quot;Youtube&quot;. Referensi dari berbagai permasalahan hidup. Saya menemukan beberapa video yang saya rasa sangat informatif mengenai Laptop Thinkpad ini, diantarnya :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Best Value ThinkPads in 2020 &lt;a href=&quot;https://www.youtube.com/watch?v=x-c-_A4AdSw&quot;&gt;https://www.youtube.com/watch?v=x-c-_A4AdSw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Which ThinkPad Should You Get? (And Libreboot notes) &lt;a href=&quot;https://www.youtube.com/watch?v=La3sb5y7e-k&quot;&gt;https://www.youtube.com/watch?v=La3sb5y7e-k&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dari video tersebut saya mendapatkan informasi bahwasannya salah satu laptop yang masih memiliki design warisan dari IBM dan memiliki kapasitas &lt;em&gt;upgradeable&lt;/em&gt; yang paling mumpuni adalah &lt;strong&gt;Thinkpad X220&lt;/strong&gt;. Seketika saya campakkan keinginan untuk meminang &lt;strong&gt;T-60&lt;/strong&gt; yang saya pikir &lt;em&gt;retro&lt;/em&gt; dan keren itu. Dikarenakan hal-hal berikut..&lt;/p&gt;
&lt;p&gt;Menurut sumber pelbagai wiki yang saya baca salah satunya &lt;a href=&quot;https://www.thinkwiki.org/wiki/Category:X220&quot;&gt;thinkwiki.com&lt;/a&gt;. Laptop ini adalah salah satu laptop dengan &lt;em&gt;hardware specification&lt;/em&gt; yang paling tangguh pada zamannya. CPU tertinggi yang dapat dipasang pada papan utama laptop ini adalah &lt;strong&gt;Intel® Core™ i7-2640M (2.8GHz, 4MB L3 cache)&lt;/strong&gt; dengan kapasitas RAM &lt;strong&gt;Up to 8GB PC3-10600 DDR3 memory at 1333MHz&lt;/strong&gt;, bahkan di BIOS versi 1.28 batasan kecepatan RAM yang bisa dicapai ada di &lt;strong&gt;1866MHz&lt;/strong&gt;. Saya &lt;em&gt;mbatin&lt;/em&gt; &quot;Muuuaanteepp ikii..&quot;&lt;/p&gt;
&lt;h4&gt;Akhir Riset&lt;/h4&gt;
&lt;p&gt;Dengan hati yang mantap setelah melakukan pelbagai riset. Saatnya saya beraksi. Semua marketplace pun saya jelajahi berharap mendapat harga &quot;musuh&quot;&lt;em&gt;(murah~~)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Di salah satu group Facebook, laptop tipe ini dibandrol dengan harga kisaran 2,5 hingga 3,9 Juta rupiah. Saya pikir &lt;em&gt;&quot;loh kok iseh larangg..&quot;&lt;/em&gt; bahkan saya berfikir untuk mencoba &lt;em&gt;International Marketplace&lt;/em&gt; &lt;a href=&quot;Ebay.com&quot;&gt;Ebay.com&lt;/a&gt; namun harga yang ditawarkan masih relatif mahal dikarenakan jika saya membeli barang dari luar negeri, maka saya harus membayar pajak barang impor.&lt;/p&gt;
&lt;p&gt;Beberapa hari berlalu, kerjaan saya jika sedang &lt;em&gt;gabut&lt;/em&gt; hanya mantengin marketplace (di KRL, sebelum tidur, di Stasiun). Hingga saya jatuh cinta dengan salah satu produk yang terpajangan di marketplace kesayangan. Di situ tertuliskan &quot;&lt;em&gt;Thinkpad X220 - Intel Core i7&lt;/em&gt;&quot; dibandrol dengan harga 2.200.000 rupiah. Toko tersebut sudah menjual lebih dari 10 unit laptop dengan tipe tersebut. Kemudian saya mencoba memulai obrolan melalui fitur &lt;em&gt;chat&lt;/em&gt; untuk memastikan bahwa penjual laptop tersebut &lt;em&gt;legit&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Setelah mengobrol dengan penjual saya langsung melakukan pembelian dengan metode pengiriman &lt;em&gt;Same Day Delivery&lt;/em&gt; untuk menghindari kerusakan apabila menggunakan pengiriman cargo.&lt;/p&gt;
&lt;h3&gt;Kedatangan&lt;/h3&gt;
&lt;p&gt;Laptop diantar kurir sekitar pukul 22:00 WIB. Dengan semangat saya membuka pintu dan wajah saya difoto oleh kurir dengan senyum merek sikat gigi.&lt;/p&gt;
&lt;p&gt;Ketika unboxing saya dikejutkan dengan isi dari kotak kardus tersebut, karena barang yang saya terima terasa BNIB &lt;em&gt;(Brand New in Packet)&lt;/em&gt; tidak terasa bahwa saya membeli laptop bekas berumur lebih dari 10 Tahun. Di dalam kotak tersebut berisi tas, kertas brosur, charger, dan juga plastik barang elektronik.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c32f3454dee7bfec03a79b887d609632/a3429/bnib.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.202531645569614%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAgP/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAcqx5kJzD//EABkQAAMAAwAAAAAAAAAAAAAAAAABAgMREv/aAAgBAQABBQLIqcuK4dLcFjP/xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPwEZ/8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8BZ//EABwQAAIABwAAAAAAAAAAAAAAAAABAhESICFCcf/aAAgBAQAGPwKGltcNpmVZ/8QAGhAAAQUBAAAAAAAAAAAAAAAAAQARITFxEP/aAAgBAQABPyG7KlBQcluUMyTe1l//2gAMAwEAAgADAAAAEOff/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8Qgf/EABcRAAMBAAAAAAAAAAAAAAAAAAABITH/2gAIAQIBAT8QiCw//8QAHBABAAICAwEAAAAAAAAAAAAAAQARMUEhUXFh/9oACAEBAAE/ELMi3alQHMBaqze/kZioByjUwfGYzL7P/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Laptop&quot;
        title=&quot;&quot;
        src=&quot;/static/c32f3454dee7bfec03a79b887d609632/828fb/bnib.jpg&quot;
        srcset=&quot;/static/c32f3454dee7bfec03a79b887d609632/ff44c/bnib.jpg 158w,
/static/c32f3454dee7bfec03a79b887d609632/a6688/bnib.jpg 315w,
/static/c32f3454dee7bfec03a79b887d609632/828fb/bnib.jpg 630w,
/static/c32f3454dee7bfec03a79b887d609632/0ede0/bnib.jpg 945w,
/static/c32f3454dee7bfec03a79b887d609632/3ac88/bnib.jpg 1260w,
/static/c32f3454dee7bfec03a79b887d609632/a3429/bnib.jpg 4160w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Kesan Pertama&lt;/h3&gt;
&lt;p&gt;Kesan paling pertama adalah &quot;&lt;em&gt;keyboardnya enak bettt&lt;/em&gt;&quot; berbeda dengan keyboard butterfly dari MacBook Pro 2017 yang biasa saya gunakan sehari-hari &lt;del&gt;rasanya kek batu&lt;/del&gt;.&lt;/p&gt;
&lt;p&gt;Segera saya mencoba semua fungsionaltias dari laptop tersebut, mulai dari wifi hingga semua tombol-tombol keyboard. Semua normal, hanya saja tombol switch wifi card tidak terlalu klik. Tapi saya rasa itu sesuai dengan harga yang saya bayar.&lt;/p&gt;
&lt;h3&gt;Hardware Upgrade&lt;/h3&gt;
&lt;p&gt;Sebelum meminang laptop ini, salah satu hal yang saya pertimbangkan adalah &lt;em&gt;upgradeable&lt;/em&gt;-nya. Beberapa perangkat keras yang sangat mempengaruhi performa di laptop ini saya rasa mudah dilakukan &lt;em&gt;upgrade&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Perangkat keras yang saya lakukan peningkatan diantaranya adalah RAM, dan SSD, namun hal yang termasuk krusial untuk mendapatkan performa yang lebih baik saya rasa adalah pindah ke &lt;strong&gt;OS&lt;/strong&gt; dengan &lt;em&gt;Kernel Linux&lt;/em&gt;.&lt;/p&gt;
&lt;h4&gt;Upgrade RAM&lt;/h4&gt;
&lt;p&gt;Saya membeli 2 keping RAM dari marketplace dengan kapasitas 8GB setiap kepingnya.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f4050ea469bf400e14d98fbce0e221af/0f98f/up-ram.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 102.53164556962024%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAVABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQCBQP/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABzyOjObTD0mC0R//EABsQAAICAwEAAAAAAAAAAAAAAAECAAMEEhMy/9oACAEBAAEFArrVrEXJZRjkatZAu0uTm0Tx/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHBAAAwABBQAAAAAAAAAAAAAAAAEREAISMTJh/9oACAEBAAY/App7vnzEiY9ypIUieEf/xAAbEAEBAQACAwAAAAAAAAAAAAABEQAQQSExYf/aAAgBAQABPyFAQdDIy4Kpu3HVb+XQ9UMozy4R4eP/2gAMAwEAAgADAAAAEEAHPP/EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8QH//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8QH//EABwQAQADAQEAAwAAAAAAAAAAAAEAESFBMXGBkf/aAAgBAQABPxAFs6r+nrEgtHvJWcdAI19RLdcEOt6y4g8FCl+Y0CFsMAlZfpFe7HKK8n//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Upgrade RAM&quot;
        title=&quot;&quot;
        src=&quot;/static/f4050ea469bf400e14d98fbce0e221af/828fb/up-ram.jpg&quot;
        srcset=&quot;/static/f4050ea469bf400e14d98fbce0e221af/ff44c/up-ram.jpg 158w,
/static/f4050ea469bf400e14d98fbce0e221af/a6688/up-ram.jpg 315w,
/static/f4050ea469bf400e14d98fbce0e221af/828fb/up-ram.jpg 630w,
/static/f4050ea469bf400e14d98fbce0e221af/0ede0/up-ram.jpg 945w,
/static/f4050ea469bf400e14d98fbce0e221af/3ac88/up-ram.jpg 1260w,
/static/f4050ea469bf400e14d98fbce0e221af/0f98f/up-ram.jpg 1920w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;Upgrade SSD&lt;/h4&gt;
&lt;p&gt;Untuk SSD saya membeli m-Sata dengan kapasitas 128GB. Nantinya Kernel dan juga semua Home directory dari sistem operasi akan dipasang di dalam m-Sata.&lt;/p&gt;
&lt;p&gt;Sedangkan HDD sebesar 350GB bawaan dari laptop hanya akan dimounting menjadi External Partisi untuk menyimpan data yang memang jarang diakses.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b9f1474a2e0de4e798233c5fdd543af4/a3429/ssd.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.202531645569614%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABvU1FocID/8QAGxAAAQQDAAAAAAAAAAAAAAAAAgABAwQRMUL/2gAIAQEAAQUCsE4gFh8KTXS//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGBAAAwEBAAAAAAAAAAAAAAAAAQIQYQD/2gAIAQEABj8CU7yLtE//xAAcEAACAgIDAAAAAAAAAAAAAAAAASExEBFRYbH/2gAIAQEAAT8h50SXQ+hDs94oPYZ//9oADAMBAAIAAwAAABBs7//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAEDAQE/ECf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAbEAEAAwADAQAAAAAAAAAAAAABABExIXGhgf/aAAgBAQABPxBRAKYc0y35ASHAYtOqiHF7U9cPBNT/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Upgrade SSD&quot;
        title=&quot;&quot;
        src=&quot;/static/b9f1474a2e0de4e798233c5fdd543af4/828fb/ssd.jpg&quot;
        srcset=&quot;/static/b9f1474a2e0de4e798233c5fdd543af4/ff44c/ssd.jpg 158w,
/static/b9f1474a2e0de4e798233c5fdd543af4/a6688/ssd.jpg 315w,
/static/b9f1474a2e0de4e798233c5fdd543af4/828fb/ssd.jpg 630w,
/static/b9f1474a2e0de4e798233c5fdd543af4/0ede0/ssd.jpg 945w,
/static/b9f1474a2e0de4e798233c5fdd543af4/3ac88/ssd.jpg 1260w,
/static/b9f1474a2e0de4e798233c5fdd543af4/a3429/ssd.jpg 4160w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;Memasang Sistem Operasi&lt;/h4&gt;
&lt;p&gt;Kemudian saya memilih memasang Sistem Operasi Xubuntu. Sistem operasi yang ringan karena minimnya perangkat lunak bawaan, dan menggunakan &lt;em&gt;Xfce desktop environment&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/60fce33c64c4fb66386b3ac9de4f9241/8cd5d/install-os.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 91.13924050632912%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAASABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAEDAgQF/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAEDAv/aAAwDAQACEAMQAAAB1pzstPmhuwQ2Af/EABkQAAMBAQEAAAAAAAAAAAAAAAABAgMQEf/aAAgBAQABBQKc1TeUo8RFKR6wPqP/xAAYEQACAwAAAAAAAAAAAAAAAAAAARAREv/aAAgBAwEBPwF6Lc//xAAYEQACAwAAAAAAAAAAAAAAAAAAAhASIv/aAAgBAgEBPwHJRZ//xAAYEAACAwAAAAAAAAAAAAAAAAAAQRAgIf/aAAgBAQAGPwIcaKv/xAAcEAEAAgIDAQAAAAAAAAAAAAABABExQRAhgaH/2gAIAQEAAT8hWWVM98EbcRtrrcSUlPYi4cdCf//aAAwDAQACAAMAAAAQc+D9/8QAGhEAAAcAAAAAAAAAAAAAAAAAAAEQESExYf/aAAgBAwEBPxAzooZL/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAEQQWH/2gAIAQIBAT8QSuaz/8QAHRABAAMAAQUAAAAAAAAAAAAAAQARIUFRcaGx0f/aAAgBAQABPxAqABdhcGUIOT6QSARQBUBRTwzYGdwvuJaJUw50gF1Ubip2n//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Install Xubuntu&quot;
        title=&quot;&quot;
        src=&quot;/static/60fce33c64c4fb66386b3ac9de4f9241/828fb/install-os.jpg&quot;
        srcset=&quot;/static/60fce33c64c4fb66386b3ac9de4f9241/ff44c/install-os.jpg 158w,
/static/60fce33c64c4fb66386b3ac9de4f9241/a6688/install-os.jpg 315w,
/static/60fce33c64c4fb66386b3ac9de4f9241/828fb/install-os.jpg 630w,
/static/60fce33c64c4fb66386b3ac9de4f9241/0ede0/install-os.jpg 945w,
/static/60fce33c64c4fb66386b3ac9de4f9241/3ac88/install-os.jpg 1260w,
/static/60fce33c64c4fb66386b3ac9de4f9241/8cd5d/install-os.jpg 2260w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Total Biaya&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;Barang&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;Harga&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;Laptop&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Rp 2.200.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;SSD MSATA&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Rp 234.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;RAM DDR3 16GB (8X2)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Rp 593.200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Rp 3.027.200&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Akhir&lt;/h3&gt;
&lt;p&gt;Dengan biaya &lt;em&gt;3.027.200&lt;/em&gt; rupiah saya bisa mendapatkan performa laptop Core i7-2640M di generasi ke-2 &lt;em&gt;(Max Supported X220)&lt;/em&gt; disandingkan dengan RAM 16 GB, juga didukung SSD sebagai operasional sistem operasi, belum lagi HDD 350GB. Saya rasa performa laptop ini jauh melampaui performa MacBook yang saya gunakan sehari hari.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Monitor ZFS for Better Sleep]]></title><description><![CDATA[Monitoring is the key to happy consumer. Monitoring with Grafana and Prometheus ZFS Exporter Setup: Prometheus Configuration: Critical…]]></description><link>https://nicolas.my.id/zfs-monitor/</link><guid isPermaLink="false">https://nicolas.my.id/zfs-monitor/</guid><pubDate>Mon, 16 May 2022 06:44:58 GMT</pubDate><content:encoded>&lt;p&gt;Monitoring is the key to happy consumer.&lt;/p&gt;
&lt;h3&gt;Monitoring with Grafana and Prometheus&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;ZFS Exporter Setup:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Install zfs_exporter for Prometheus metrics&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /opt
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/pdf/zfs_exporter.git
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; zfs_exporter
go build &lt;span class=&quot;token comment&quot;&gt;# to get most latest metrics, or just simply wget&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Create systemd service&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /etc/systemd/system/zfs-exporter.service &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;EOF&apos;
[Unit]
Description=ZFS Prometheus Exporter
After=network.target

[Service]
Type=simple
User=root
ExecStart=/opt/zfs_exporter/zfs_exporter --web.listen-address=:9254
Restart=always

[Install]
WantedBy=multi-user.target
EOF&lt;/span&gt;

systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--now&lt;/span&gt; zfs-exporter&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Prometheus Configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Add to prometheus.yml&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;job_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;zfs&apos;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;static_configs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;targets&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;localhost:9254&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;scrape_interval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 30s&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Critical Grafana Dashboard Panels:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Pool Health Status&lt;/span&gt;
zfs_pool_state&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;pool&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$pool&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Pool Capacity Utilization (Alert at 80%)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;zfs_pool_allocated_bytes&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;pool&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$pool&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; / zfs_pool_size_bytes&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;pool&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$pool&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; * &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ARC Hit Ratio (Alert below 85%)&lt;/span&gt;
rate&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;zfs_arc_hits_total&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;5m&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; / &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rate&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;zfs_arc_hits_total&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;5m&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; + rate&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;zfs_arc_misses_total&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;5m&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;))&lt;/span&gt; * &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Checksum Errors (Alert on any)&lt;/span&gt;
increase&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;zfs_pool_checksum_errors_total&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;pool&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$pool&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;5m&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Fragmentation Percentage&lt;/span&gt;
zfs_pool_fragmentation_percent&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;pool&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$pool&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Read/Write IOPS&lt;/span&gt;
rate&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;zfs_pool_read_ops_total&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;pool&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$pool&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;5m&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
rate&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;zfs_pool_write_ops_total&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;pool&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$pool&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;5m&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Read/Write Latency&lt;/span&gt;
zfs_pool_read_latency_seconds&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;pool&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$pool&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
zfs_pool_write_latency_seconds&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;pool&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$pool&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Alerting Rules (alerts.yml):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;groups&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; zfs&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;alerts
  &lt;span class=&quot;token key atrule&quot;&gt;rules&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ZFSPoolDegraded
    &lt;span class=&quot;token key atrule&quot;&gt;expr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; zfs_pool_state &lt;span class=&quot;token tag&quot;&gt;!=&lt;/span&gt; 0
    &lt;span class=&quot;token key atrule&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0m
    &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;severity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; critical
    &lt;span class=&quot;token key atrule&quot;&gt;annotations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZFS pool {{ $labels.pool }} is degraded&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Pool state: {{ $value }}&quot;&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ZFSPoolCapacityHigh
    &lt;span class=&quot;token key atrule&quot;&gt;expr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; (zfs_pool_allocated_bytes / zfs_pool_size_bytes) * 100 &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt; 80
    &lt;span class=&quot;token key atrule&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5m
    &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;severity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; warning
    &lt;span class=&quot;token key atrule&quot;&gt;annotations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZFS pool {{ $labels.pool }} capacity is {{ $value }}%&quot;&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ZFSARCHitRateLow
    &lt;span class=&quot;token key atrule&quot;&gt;expr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; (rate(zfs_arc_hits_total&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;5m&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;) / (rate(zfs_arc_hits_total&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;5m&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;) + rate(zfs_arc_misses_total&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;5m&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;))) * 100 &amp;lt; 85
    &lt;span class=&quot;token key atrule&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10m
    &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;severity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; warning
    &lt;span class=&quot;token key atrule&quot;&gt;annotations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZFS ARC hit ratio is {{ $value }}%&quot;&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ZFSChecksumErrors
    &lt;span class=&quot;token key atrule&quot;&gt;expr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; increase(zfs_pool_checksum_errors_total&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;5m&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;) &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt; 0
    &lt;span class=&quot;token key atrule&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0m
    &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;severity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; critical
    &lt;span class=&quot;token key atrule&quot;&gt;annotations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZFS checksum errors detected on pool {{ $labels.pool }}&quot;&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ZFSFragmentationHigh
    &lt;span class=&quot;token key atrule&quot;&gt;expr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; zfs_pool_fragmentation_percent &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt; 50
    &lt;span class=&quot;token key atrule&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 30m
    &lt;span class=&quot;token key atrule&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;severity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; warning
    &lt;span class=&quot;token key atrule&quot;&gt;annotations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZFS pool {{ $labels.pool }} fragmentation is {{ $value }}%&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Reference Dashboards:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://grafana.com/grafana/dashboards/11337&quot;&gt;ZFS Grafana Dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/prometheus-pve/prometheus-pve-exporter&quot;&gt;Proxmox ZFS Monitoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Spearfoot/FreeNAS-scripts&quot;&gt;ZFS Health Check Scripts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Smashing ZFS Storage]]></title><description><![CDATA[ZFS is reliable, and rock solid. Here's why, and how to test smashh it! 1. Understanding ZFS Architecture 1.1. Core Components ZFS operates…]]></description><link>https://nicolas.my.id/zfs-failure-test/</link><guid isPermaLink="false">https://nicolas.my.id/zfs-failure-test/</guid><pubDate>Mon, 11 Apr 2022 06:44:58 GMT</pubDate><content:encoded>&lt;p&gt;ZFS is reliable, and rock solid. Here&apos;s why, and how to test smashh it!&lt;/p&gt;
&lt;h3&gt;1. Understanding ZFS Architecture&lt;/h3&gt;
&lt;h4&gt;1.1. Core Components&lt;/h4&gt;
&lt;p&gt;ZFS operates through three main layers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SPA (Storage Pool Allocator)&lt;/strong&gt;: Manages physical storage and presents unified address space.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DMU (Data Management Unit)&lt;/strong&gt;: Handles transactions and ensures ACID properties.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ARC (Adaptive Replacement Cache)&lt;/strong&gt;: Smart caching that adapts to workload patterns.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2. ARC Operation&lt;/h4&gt;
&lt;p&gt;The ARC uses four lists for intelligent caching:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;T1&lt;/strong&gt;: Recently used blocks (accessed once)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;T2&lt;/strong&gt;: Frequently used blocks (accessed multiple times)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;B1/B2&lt;/strong&gt;: Ghost lists tracking evicted entries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check your current ARC status:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# View ARC statistics&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /proc/spl/kstat/zfs/arcstats

&lt;span class=&quot;token comment&quot;&gt;# Check ARC size limits&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ARC max: &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /sys/module/zfs/parameters/zfs_arc_max&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ARC min: &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /sys/module/zfs/parameters/zfs_arc_min&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# arc stat command (monitor L2arc)&lt;/span&gt;
arcstat &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; read,hits,miss,hit%,l2read,l2hits,l2miss,l2hit%,arcsz,l2size &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# very detail &lt;/span&gt;
arc_summary&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;1.3. L2ARC vs ARC&lt;/h4&gt;
&lt;p&gt;L2ARC extends ARC to SSDs but operates as a simple FIFO ring buffer, not adaptive replacement. It caches blocks that are about to be evicted from ARC.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Monitor L2ARC if configured&lt;/span&gt;
zpool iostat &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;2. ZFS Data Ingestion for Proxmox/KVM&lt;/h3&gt;
&lt;h4&gt;2.1. VM Storage Options&lt;/h4&gt;
&lt;p&gt;For Proxmox/KVM workloads, you have two main options:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ZVOLs (Block devices) - Manual Creation:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Create zvol for VM disk - these WON&apos;T appear in Proxmox UI&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Using default volblocksize (16K since OpenZFS v2.2)&lt;/span&gt;
zfs create &lt;span class=&quot;token parameter variable&quot;&gt;-V&lt;/span&gt; 50G tank/vm-101-disk-0

&lt;span class=&quot;token comment&quot;&gt;# For specific workloads, adjust volblocksize as needed&lt;/span&gt;
zfs create &lt;span class=&quot;token parameter variable&quot;&gt;-V&lt;/span&gt; 50G &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;volblocksize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;16K tank/vm-102-disk-0  &lt;span class=&quot;token comment&quot;&gt;# Database VMs&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Manual ZVOLs appear as block devices&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-la&lt;/span&gt; /dev/zvol/tank/vm-*
&lt;span class=&quot;token comment&quot;&gt;# /dev/zvol/tank/vm-101-disk-0&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# /dev/zvol/tank/vm-102-disk-0&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Manual ZVOLs created via command line won&apos;t show in Proxmox GUI storage management. You must manage them entirely via CLI or use Proxmox&apos;s ZFS storage integration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Proxmox-managed ZFS storage:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Add ZFS storage in Proxmox (this goes in /etc/pve/storage.cfg)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Proxmox will manage ZVOLs automatically through the GUI&lt;/span&gt;
pvesm &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; zfspool local-zfs &lt;span class=&quot;token parameter variable&quot;&gt;-pool&lt;/span&gt; tank &lt;span class=&quot;token parameter variable&quot;&gt;-content&lt;/span&gt; images,rootdir&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Raw disk images on datasets:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Create dataset for VM images - these appear in Proxmox GUI&lt;/span&gt;
zfs create tank/vmimages
pvesm &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;dir&lt;/span&gt; vmstore &lt;span class=&quot;token parameter variable&quot;&gt;-path&lt;/span&gt; /tank/vmimages &lt;span class=&quot;token parameter variable&quot;&gt;-content&lt;/span&gt; images,iso,vztmpl
&lt;span class=&quot;token comment&quot;&gt;# VMs stored as files: /tank/vmimages/101/vm-101-disk-0.raw&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;2.4. Managing Manual ZVOLs with VMs&lt;/h4&gt;
&lt;p&gt;When you create ZVOLs manually, you need to configure VMs to use them:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Create ZVOL for VM&lt;/span&gt;
zfs create &lt;span class=&quot;token parameter variable&quot;&gt;-V&lt;/span&gt; 50G &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;volblocksize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;16K tank/vm-103-disk-0

&lt;span class=&quot;token comment&quot;&gt;# Add to VM configuration manually&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;scsi0: /dev/zvol/tank/vm-103-disk-0,cache=none,discard=on&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; /etc/pve/qemu-server/103.conf

&lt;span class=&quot;token comment&quot;&gt;# Or use qm command&lt;/span&gt;
qm &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;103&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--scsi0&lt;/span&gt; /dev/zvol/tank/vm-103-disk-0,cache&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;none,discard&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;on

&lt;span class=&quot;token comment&quot;&gt;# ZVOL won&apos;t appear in Proxmox GUI storage management&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Manage snapshots, clones, etc. via ZFS commands:&lt;/span&gt;
zfs snapshot tank/vm-103-disk-0@backup-&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +%Y%m%d&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
zfs clone tank/vm-103-disk-0@backup-20241201 tank/vm-104-disk-0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Recent testing shows raw disk images often outperform ZVOLs by 6x for small random I/O:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Optimize dataset for VM images&lt;/span&gt;
zfs &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;recordsize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;64K tank/vmimages
zfs &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;compression&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;lz4 tank/vmimages
zfs &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;xattr&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;sa tank/vmimages
zfs &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;logbias&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;throughput tank/vmimages

&lt;span class=&quot;token comment&quot;&gt;# For zvols, optimize at creation&lt;/span&gt;
zfs create &lt;span class=&quot;token parameter variable&quot;&gt;-V&lt;/span&gt; 50G &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;volblocksize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;8K &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;compression&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;lz4 tank/vm-disk&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;2.3. Data Flow in VM Workloads&lt;/h4&gt;
&lt;p&gt;VM I/O flows: &lt;strong&gt;Guest OS → QEMU → Host Kernel → ZFS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Key considerations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Async writes&lt;/strong&gt;: Buffered in ARC, flushed every 5 seconds via TXG&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sync writes&lt;/strong&gt;: Must hit stable storage before acknowledgment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache modes&lt;/strong&gt;: Use &lt;code class=&quot;language-text&quot;&gt;cache=none&lt;/code&gt; in QEMU to let ZFS handle all caching&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Monitor TXG sync times&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;watch&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;zpool iostat -v 1 1&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Check for sync write pressure&lt;/span&gt;
zpool iostat &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;3. Creating Production Test Pools&lt;/h3&gt;
&lt;h4&gt;3.1. Production Disk Pool Creation&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;WARNING: This will destroy all data on specified disks. Only use spare/test disks.&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# List available disks&lt;/span&gt;
lsblk
&lt;span class=&quot;token function&quot;&gt;fdisk&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Create various topologies for testing with real disks&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ENSURE these are spare disks - this destroys all data!&lt;/span&gt;
zpool create testmirror mirror /dev/sdc /dev/sdd
zpool create testraidz1 raidz /dev/sde /dev/sdf /dev/sdg  
zpool create testraidz2 raidz2 /dev/sdh /dev/sdi /dev/sdj /dev/sdk

&lt;span class=&quot;token comment&quot;&gt;# Verify pool creation&lt;/span&gt;
zpool status
zpool list&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;3.2. Add Cache and Log Devices&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Add NVMe SSD as cache device (L2ARC)&lt;/span&gt;
zpool &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; testmirror cache /dev/nvme0n1

&lt;span class=&quot;token comment&quot;&gt;# Add smaller SSD as log device (SLOG) - only for sync-heavy workloads&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# SLOG should be mirrored in production&lt;/span&gt;
zpool &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; testmirror log mirror /dev/sdb1 /dev/sdb2

&lt;span class=&quot;token comment&quot;&gt;# Verify topology&lt;/span&gt;
zpool status testmirror&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;4. Simulating ZFS Failures&lt;/h3&gt;
&lt;h4&gt;4.1. Simulating Disk Failures&lt;/h4&gt;
&lt;p&gt;Like Ceph, there are hard and soft failure scenarios. ZFS handles both gracefully with proper redundancy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redundant ZFS pool (mirror or raidz) with spare disks&lt;/li&gt;
&lt;li&gt;Root access to the system&lt;/li&gt;
&lt;li&gt;Test data with known checksums&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CRITICAL: Ensure you&apos;re using test/spare disks only&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.2. Soft Failure Simulation (Clean Offline)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Procedure:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Take real device offline cleanly:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Offline physical device in mirror&lt;/span&gt;
zpool offline testmirror /dev/sdc

&lt;span class=&quot;token comment&quot;&gt;# Check degraded status  &lt;/span&gt;
zpool status testmirror&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Expected output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;  pool: testmirror
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
        Sufficient replicas exist for the pool to continue functioning in a
        degraded state.
action: Online the device using &apos;zpool online&apos; or replace the device with
        &apos;zpool replace&apos;.
config:
        NAME         STATE     READ WRITE CKSUM
        testmirror   DEGRADED     0     0     0
          mirror-0   DEGRADED     0     0     0
            /dev/sdc OFFLINE      0     0     0
            /dev/sdd ONLINE       0     0     0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Bring device back online:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;zpool online testmirror /dev/sdc
zpool status testmirror  &lt;span class=&quot;token comment&quot;&gt;# Should show resilvering&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;4.3. Hard Failure Simulation (Physical Removal)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Procedure:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create test VM with active workload:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Create ZVOL for test VM (using default 16K volblocksize)&lt;/span&gt;
zfs create &lt;span class=&quot;token parameter variable&quot;&gt;-V&lt;/span&gt; 20G testmirror/vm-999-disk-0

&lt;span class=&quot;token comment&quot;&gt;# Create test VM configuration&lt;/span&gt;
qm create &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; zfs-test-vm &lt;span class=&quot;token parameter variable&quot;&gt;--memory&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2048&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--cores&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--net0&lt;/span&gt; virtio,bridge&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;vmbr0
qm &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--scsi0&lt;/span&gt; /dev/zvol/testmirror/vm-999-disk-0,cache&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;none,discard&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;on
qm &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--cdrom&lt;/span&gt; local:iso/ubuntu-22.04-live-server-amd64.iso
qm &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--boot&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;scsi0

&lt;span class=&quot;token comment&quot;&gt;# Start VM and install/configure it with test workload&lt;/span&gt;
qm start &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Once VM is running, create continuous I/O workload inside VM&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# SSH into VM and run:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# nohup dd if=/dev/zero of=/home/test-large-file bs=1M count=1000 &amp;amp;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# nohup find / -type f -exec wc -l {} \; &gt; /dev/null 2&gt;&amp;amp;1 &amp;amp;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Monitor VM status and ZFS pool&lt;/span&gt;
qm status &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Should show &apos;running&apos;&lt;/span&gt;
zpool iostat testmirror &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Observe I/O activity&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Simulate physical disk failure during VM operation:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Remove device from system while VM is running (simulates hardware failure)&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /sys/block/sdc/device/delete

&lt;span class=&quot;token comment&quot;&gt;# Check pool status - should detect failure but continue operation&lt;/span&gt;
zpool status testmirror

&lt;span class=&quot;token comment&quot;&gt;# Verify VM continues running without interruption&lt;/span&gt;
qm status &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Should still show &apos;running&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Check VM console for any I/O errors (there should be none)&lt;/span&gt;
qm terminal &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Monitor detection and recovery:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Watch pool operating in degraded mode while VM continues&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;watch&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;zpool status testmirror&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Expected output shows DEGRADED state but ONLINE operation:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   pool: testmirror&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#  state: DEGRADED&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# config:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#         NAME         STATE     READ WRITE CKSUM&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#         testmirror   DEGRADED     0     0     0&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#           mirror-0   DEGRADED     0     0     0&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#             /dev/sdc UNAVAIL      0     0     0  cannot open&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#             /dev/sdd ONLINE       0     0     0&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Verify VM performance during degraded operation&lt;/span&gt;
qm monitor &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# (qm) info block&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Check for I/O statistics and verify no errors&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Test VM responsiveness&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ping&lt;/span&gt; VM_IP  &lt;span class=&quot;token comment&quot;&gt;# Should respond normally&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; user@VM_IP &lt;span class=&quot;token string&quot;&gt;&quot;uptime&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Should show continued operation&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Monitor VM I/O during degraded state&lt;/span&gt;
zpool iostat &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; testmirror &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Watch I/O patterns&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Expected Behavior:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VM continues running without interruption&lt;/li&gt;
&lt;li&gt;No I/O errors in VM guest OS&lt;/li&gt;
&lt;li&gt;Pool operates in DEGRADED state but remains functional&lt;/li&gt;
&lt;li&gt;Performance may be slightly reduced but still acceptable&lt;/li&gt;
&lt;li&gt;ZFS transparently handles the failure without VM awareness&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.4. Disk Replacement Procedure&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Procedure:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Replace failed disk while VM continues operation:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# After physical disk replacement, rescan SCSI bus&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;- - -&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /sys/class/scsi_host/host0/scan

&lt;span class=&quot;token comment&quot;&gt;# Replace failed device with new one&lt;/span&gt;
zpool replace testmirror /dev/sdc /dev/sdl

&lt;span class=&quot;token comment&quot;&gt;# Monitor resilver progress while VM remains active&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;watch&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;zpool status -v testmirror&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Expected output during resilver:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   pool: testmirror&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#  state: DEGRADED&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# status: One or more devices is currently being resilvered.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#  scan: resilver in progress since [timestamp]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#        X.XXG scanned at X.XXG/s, X.XXG issued at X.XXG/s, X.XXG total&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#        X.X% done, X.XXh to go&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Verify VM performance during resilver&lt;/span&gt;
qm status &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Should remain &apos;running&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Test VM I/O performance during resilver (expect some impact)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; user@VM_IP &lt;span class=&quot;token string&quot;&gt;&quot;dd if=/dev/zero of=/tmp/test bs=1M count=100 oflag=direct&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Monitor resilver completion&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; zpool status testmirror &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-q&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;resilver&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; 
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Resilver progress: &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;zpool status testmirror &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; resilver&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;VM status: &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;qm status &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Resilver complete - verifying VM integrity&quot;&lt;/span&gt;
qm status &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Should show &apos;running&apos;&lt;/span&gt;
zpool status testmirror  &lt;span class=&quot;token comment&quot;&gt;# Should show ONLINE&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Clean up test VM after successful test&lt;/span&gt;
qm stop &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt;
qm destroy &lt;span class=&quot;token number&quot;&gt;999&lt;/span&gt;
zfs destroy testmirror/vm-999-disk-0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Production Considerations:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VMs experience minimal impact during single disk failure&lt;/li&gt;
&lt;li&gt;Resilver operations may cause 10-30% performance degradation&lt;/li&gt;
&lt;li&gt;Monitor VM response times during resilver operations&lt;/li&gt;
&lt;li&gt;Schedule resilvers during maintenance windows for critical systems&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.6. L2ARC Cache Device Failure Simulation&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Procedure:&lt;/strong&gt;
Test L2ARC device failure scenarios - cache failures should not affect pool integrity:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Prerequisites: Pool with L2ARC device configured&lt;/span&gt;
zpool status testmirror  &lt;span class=&quot;token comment&quot;&gt;# Verify cache device present&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Create workload to populate L2ARC&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Populating L2ARC cache...&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;dd&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/dev/urandom &lt;span class=&quot;token assign-left variable&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/testmirror/testfs/cachefile&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1M &lt;span class=&quot;token assign-left variable&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Verify L2ARC is populated&lt;/span&gt;
zpool iostat &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; testmirror &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /proc/spl/kstat/zfs/arcstats &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; l2_

&lt;span class=&quot;token comment&quot;&gt;# Test read performance with L2ARC active&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Testing read performance with L2ARC...&quot;&lt;/span&gt;
fio &lt;span class=&quot;token parameter variable&quot;&gt;--direct&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--iodepth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rw&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;randread &lt;span class=&quot;token parameter variable&quot;&gt;--ioengine&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;libaio &lt;span class=&quot;token parameter variable&quot;&gt;--bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;64k &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;500M &lt;span class=&quot;token parameter variable&quot;&gt;--numjobs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--group_reporting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--filename&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/testmirror/testfs/l2arc-test &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;L2ARC_Active_Test

&lt;span class=&quot;token comment&quot;&gt;# Simulate L2ARC device failure&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Simulating L2ARC device failure...&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-b&lt;/span&gt; /dev/nvme0n1 &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Physical device failure simulation&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /sys/block/nvme0n1/device/delete
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# File-based cache failure simulation&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; /mnt/zfs-test/cache.img &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;/dev/null &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Check pool status - should remain ONLINE with cache device UNAVAIL&lt;/span&gt;
zpool status testmirror

&lt;span class=&quot;token comment&quot;&gt;# Expected output shows:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# pool: testmirror&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# state: ONLINE&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# config:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#         NAME                      STATE     READ WRITE CKSUM&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#         testmirror                ONLINE       0     0     0&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#           mirror-0                ONLINE       0     0     0&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#             /dev/sdc              ONLINE       0     0     0&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#             /dev/sdd              ONLINE       0     0     0&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#         cache&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#           /dev/nvme0n1            UNAVAIL      0     0     0&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Test read performance without L2ARC&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Testing read performance without L2ARC...&quot;&lt;/span&gt;
fio &lt;span class=&quot;token parameter variable&quot;&gt;--direct&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--iodepth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rw&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;randread &lt;span class=&quot;token parameter variable&quot;&gt;--ioengine&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;libaio &lt;span class=&quot;token parameter variable&quot;&gt;--bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;64k &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;500M &lt;span class=&quot;token parameter variable&quot;&gt;--numjobs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--group_reporting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--filename&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/testmirror/testfs/l2arc-test &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;L2ARC_Failed_Test

&lt;span class=&quot;token comment&quot;&gt;# Remove failed cache device from pool&lt;/span&gt;
zpool remove testmirror /dev/nvme0n1

&lt;span class=&quot;token comment&quot;&gt;# Verify pool operates normally without cache&lt;/span&gt;
zpool status testmirror  &lt;span class=&quot;token comment&quot;&gt;# Should show no cache devices&lt;/span&gt;
zpool iostat &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; testmirror

&lt;span class=&quot;token comment&quot;&gt;# Add replacement cache device if available&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-b&lt;/span&gt; /dev/nvme1n1 &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    zpool &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; testmirror cache /dev/nvme1n1
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Replacement cache device added&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;L2ARC failure test complete - pool integrity maintained&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Expected Behavior:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pool remains ONLINE despite cache device failure&lt;/li&gt;
&lt;li&gt;No data loss occurs&lt;/li&gt;
&lt;li&gt;Read performance may degrade temporarily&lt;/li&gt;
&lt;li&gt;Cache device can be safely removed and replaced&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critical&lt;/strong&gt;: L2ARC failures never affect pool integrity&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.7. Multiple Device Failures&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Procedure:&lt;/strong&gt;
Test RAIDZ resilience with real disks:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# RAIDZ1 can survive 1 disk failure&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /sys/block/sde/device/delete  &lt;span class=&quot;token comment&quot;&gt;# Pool remains online&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Simulate second failure - pool becomes unavailable&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /sys/block/sdf/device/delete
zpool status testraidz1  &lt;span class=&quot;token comment&quot;&gt;# Will show FAULTED state&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Procedure:&lt;/strong&gt;
Test RAIDZ resilience with real disks:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# RAIDZ1 can survive 1 disk failure&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /sys/block/sde/device/delete  &lt;span class=&quot;token comment&quot;&gt;# Pool remains online&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Simulate second failure - pool becomes unavailable&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /sys/block/sdf/device/delete
zpool status testraidz1  &lt;span class=&quot;token comment&quot;&gt;# Will show FAULTED state&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;5. Production Monitoring&lt;/h3&gt;
&lt;h4&gt;5.1. Critical Metrics to Monitor&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Pool health check&lt;/span&gt;
zpool status &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Capacity monitoring (alert at 80%)&lt;/span&gt;
zpool list

&lt;span class=&quot;token comment&quot;&gt;# I/O latency tracking  &lt;/span&gt;
zpool iostat &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ARC efficiency&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /proc/spl/kstat/zfs/arcstats &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-E&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hits|misses|hit_rate&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;5.2. Automated Monitoring Script&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# /usr/local/bin/zfs-monitor.sh&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Check pool status&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;pool&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;zpool list &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; name&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;zpool list &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; health $pool&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$status&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ONLINE&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ALERT: Pool &lt;span class=&quot;token variable&quot;&gt;$pool&lt;/span&gt; status: &lt;span class=&quot;token variable&quot;&gt;$status&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; mail &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZFS Alert&quot;&lt;/span&gt; admin@company.com
    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;# Check capacity&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;cap&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;zpool list &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; capacity $pool &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;%&apos;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$cap&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-gt&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;WARNING: Pool &lt;span class=&quot;token variable&quot;&gt;$pool&lt;/span&gt; at &lt;span class=&quot;token variable&quot;&gt;${cap}&lt;/span&gt;% capacity&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; mail &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZFS Capacity&quot;&lt;/span&gt; admin@company.com
    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;5.3. ZED Configuration&lt;/h4&gt;
&lt;p&gt;Only if your &lt;code class=&quot;language-text&quot;&gt;mail&lt;/code&gt; command can send email to the world, just configure the email address in the zed.rc file as needed, and you should start getting email.&lt;/p&gt;
&lt;p&gt;Configure ZFS Event Daemon for automated responses:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Edit ZED configuration&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;vim&lt;/span&gt; /etc/zfs/zed.d/zed.rc

&lt;span class=&quot;token comment&quot;&gt;# Key settings:&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;ZED_EMAIL_ADDR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;admin@company.com&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;ZED_EMAIL_PROG&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mail&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;ZED_NOTIFY_VERBOSE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;ZED_SPARE_ON_IO_ERRORS&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;ZED_SPARE_ON_CHECKSUM_ERRORS&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Enable and start ZED&lt;/span&gt;
systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; zfs-zed
systemctl start zfs-zed&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Configure ZFS Event Daemon for automated responses:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Edit ZED configuration&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;vim&lt;/span&gt; /etc/zfs/zed.d/zed.rc

&lt;span class=&quot;token comment&quot;&gt;# Key settings:&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;ZED_EMAIL_ADDR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;admin@company.com&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;ZED_EMAIL_PROG&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mail&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;ZED_NOTIFY_VERBOSE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;ZED_SPARE_ON_IO_ERRORS&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;ZED_SPARE_ON_CHECKSUM_ERRORS&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Enable and start ZED&lt;/span&gt;
systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; zfs-zed
systemctl start zfs-zed&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;6. Performance Tuning for VM Workloads&lt;/h3&gt;
&lt;h4&gt;6.1. ARC Sizing for Virtualization Hosts&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Conservative: 25% of RAM (adjust based on VM memory requirements)&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$((&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;grep MemTotal &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;proc&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;meminfo &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; awk &apos;{print $&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;}&apos;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;25&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;))&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /sys/module/zfs/parameters/zfs_arc_max

&lt;span class=&quot;token comment&quot;&gt;# Check current ARC usage&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;size&quot;&lt;/span&gt; /proc/spl/kstat/zfs/arcstats&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;6.2. Recordsize Optimization&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# For VM datasets (guest filesystem dependent)&lt;/span&gt;
zfs &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;recordsize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;16K tank/databases     &lt;span class=&quot;token comment&quot;&gt;# Database and general VMs&lt;/span&gt;
zfs &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;recordsize&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1M tank/backups        &lt;span class=&quot;token comment&quot;&gt;# Large sequential files&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Monitor record size effectiveness&lt;/span&gt;
zfs get recordsize,written,referenced tank/vmimages&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;7. Recovery Verification&lt;/h3&gt;
&lt;h4&gt;7.1. VM-Based Data Integrity Testing&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Create multiple test VMs for comprehensive failure testing&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Function to create test VM with known data&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;create_test_vm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;vmid&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$2&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;# Create ZVOL for VM (using default 16K volblocksize)&lt;/span&gt;
    zfs create &lt;span class=&quot;token parameter variable&quot;&gt;-V&lt;/span&gt; 10G &lt;span class=&quot;token variable&quot;&gt;${pool}&lt;/span&gt;/vm-&lt;span class=&quot;token variable&quot;&gt;${vmid}&lt;/span&gt;-disk-0
    
    &lt;span class=&quot;token comment&quot;&gt;# Create VM&lt;/span&gt;
    qm create &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;zfs-test-vm-&lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--memory&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--cores&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;token parameter variable&quot;&gt;--net0&lt;/span&gt; virtio,bridge&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;vmbr0 &lt;span class=&quot;token parameter variable&quot;&gt;--onboot&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    qm &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--scsi0&lt;/span&gt; /dev/zvol/&lt;span class=&quot;token variable&quot;&gt;${pool}&lt;/span&gt;/vm-&lt;span class=&quot;token variable&quot;&gt;${vmid}&lt;/span&gt;-disk-0,cache&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;none,discard&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;on
    qm &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--cdrom&lt;/span&gt; local:iso/ubuntu-22.04-live-server-amd64.iso
    
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Created test VM &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt; on pool &lt;span class=&quot;token variable&quot;&gt;$pool&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Create test VMs before failure scenarios&lt;/span&gt;
create_test_vm &lt;span class=&quot;token number&quot;&gt;990&lt;/span&gt; testmirror
create_test_vm &lt;span class=&quot;token number&quot;&gt;991&lt;/span&gt; testmirror
create_test_vm &lt;span class=&quot;token number&quot;&gt;992&lt;/span&gt; testmirror

&lt;span class=&quot;token comment&quot;&gt;# Start VMs and create unique test data in each&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;vmid&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;990&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;991&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;992&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    qm start &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;# Wait for VM to boot and create test data&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;# SSH into each VM and create unique test files with known checksums&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; user@VM_&lt;span class=&quot;token variable&quot;&gt;${vmid}&lt;/span&gt;_IP &lt;span class=&quot;token string&quot;&gt;&quot;
        echo &apos;Creating test data in VM &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;&apos;
        dd if=/dev/urandom of=/home/testfile-&lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt; bs=1M count=100
        md5sum /home/testfile-&lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt; &gt; /home/checksum-&lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;.txt
        sync
    &quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# After failure scenarios, verify VM data integrity&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;verify_vm_integrity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;vmid&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;
    
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Verifying integrity of VM &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;&quot;&lt;/span&gt;
    qm status &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;
    
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;qm status $vmid&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;running&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; user@VM_&lt;span class=&quot;token variable&quot;&gt;${vmid}&lt;/span&gt;_IP &lt;span class=&quot;token string&quot;&gt;&quot;
            echo &apos;Verifying checksum in VM &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;&apos;
            md5sum -c /home/checksum-&lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;.txt
            if [ \&lt;span class=&quot;token variable&quot;&gt;$?&lt;/span&gt; -eq 0 ]; then
                echo &apos;VM &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;: Data integrity PASSED&apos;
            else
                echo &apos;VM &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;: Data integrity FAILED&apos;
            fi
        &quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;VM &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt; is not running - attempting to start&quot;&lt;/span&gt;
        qm start &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; user@VM_&lt;span class=&quot;token variable&quot;&gt;${vmid}&lt;/span&gt;_IP &lt;span class=&quot;token string&quot;&gt;&quot;md5sum -c /home/checksum-&lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;.txt&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Verify all VMs after recovery&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;=== VM Data Integrity Verification ===&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;vmid&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;990&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;991&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;992&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    verify_vm_integrity &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Cleanup test VMs&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;cleanup_test_vms&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;vmid&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;990&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;991&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;992&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
        qm stop &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;/dev/null
        qm destroy &lt;span class=&quot;token variable&quot;&gt;$vmid&lt;/span&gt;
        zfs destroy testmirror/vm-&lt;span class=&quot;token variable&quot;&gt;${vmid}&lt;/span&gt;-disk-0
    &lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Uncomment to cleanup after testing&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# cleanup_test_vms&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;7.2. Performance Impact Assessment - VM Workload (Cheat Sheet)&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Cheat Sheet - ZFS Performance &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# This mimics real VM I/O patterns with 4K blocks and high queue depths&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Login to the VM&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;TESTDIR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/testmirror&quot;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Baseline tests before failure&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;=== BASELINE PERFORMANCE TESTS ===&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Random write test (VM boot, application startup)&lt;/span&gt;
fio &lt;span class=&quot;token parameter variable&quot;&gt;--direct&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--iodepth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rw&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;randwrite &lt;span class=&quot;token parameter variable&quot;&gt;--ioengine&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;libaio &lt;span class=&quot;token parameter variable&quot;&gt;--bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;4k &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1G &lt;span class=&quot;token parameter variable&quot;&gt;--numjobs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--group_reporting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--filename&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-randwrite &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Baseline_Random_Write
&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-*&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sync&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Random read test (database queries, file access)&lt;/span&gt;
fio &lt;span class=&quot;token parameter variable&quot;&gt;--direct&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--iodepth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rw&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;randread &lt;span class=&quot;token parameter variable&quot;&gt;--ioengine&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;libaio &lt;span class=&quot;token parameter variable&quot;&gt;--bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;4k &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1G &lt;span class=&quot;token parameter variable&quot;&gt;--numjobs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--group_reporting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--filename&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-randread &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Baseline_Random_Read
&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-*&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sync&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Mixed random I/O (typical VM workload - 70% read, 30% write)&lt;/span&gt;
fio &lt;span class=&quot;token parameter variable&quot;&gt;--direct&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--iodepth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rw&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;randrw &lt;span class=&quot;token parameter variable&quot;&gt;--rwmixread&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;70&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--ioengine&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;libaio &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;4k &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1G &lt;span class=&quot;token parameter variable&quot;&gt;--numjobs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--group_reporting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--filename&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-randmix &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Baseline_Mixed_Random
&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-*&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sync&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Sequential write test (large file transfers, backups)&lt;/span&gt;
fio &lt;span class=&quot;token parameter variable&quot;&gt;--direct&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--iodepth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rw&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;write &lt;span class=&quot;token parameter variable&quot;&gt;--ioengine&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;libaio &lt;span class=&quot;token parameter variable&quot;&gt;--bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;4k &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1G &lt;span class=&quot;token parameter variable&quot;&gt;--numjobs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--group_reporting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--filename&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-seqwrite &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Baseline_Sequential_Write
&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-*&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sync&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Sequential read test (streaming, large file access)&lt;/span&gt;
fio &lt;span class=&quot;token parameter variable&quot;&gt;--direct&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--iodepth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rw&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;read &lt;span class=&quot;token parameter variable&quot;&gt;--ioengine&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;libaio &lt;span class=&quot;token parameter variable&quot;&gt;--bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;4k &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1G &lt;span class=&quot;token parameter variable&quot;&gt;--numjobs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--group_reporting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--filename&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-seqread &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Baseline_Sequential_Read
&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-*&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sync&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Test during degraded operation (one disk offline)&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;=== DEGRADED POOL PERFORMANCE TESTS ===&quot;&lt;/span&gt;
zpool offline testmirror /dev/sdc

&lt;span class=&quot;token comment&quot;&gt;# Critical test: Random write performance during degraded operation&lt;/span&gt;
fio &lt;span class=&quot;token parameter variable&quot;&gt;--direct&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--iodepth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rw&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;randwrite &lt;span class=&quot;token parameter variable&quot;&gt;--ioengine&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;libaio &lt;span class=&quot;token parameter variable&quot;&gt;--bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;4k &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1G &lt;span class=&quot;token parameter variable&quot;&gt;--numjobs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--group_reporting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--filename&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-degraded-randwrite &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Degraded_Random_Write
&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-*&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sync&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Mixed workload during degraded state&lt;/span&gt;
fio &lt;span class=&quot;token parameter variable&quot;&gt;--direct&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--iodepth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rw&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;randrw &lt;span class=&quot;token parameter variable&quot;&gt;--rwmixread&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;70&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--ioengine&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;libaio &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;4k &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1G &lt;span class=&quot;token parameter variable&quot;&gt;--numjobs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--group_reporting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--filename&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-degraded-mixed &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Degraded_Mixed_Random
&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-*&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sync&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Bring pool back online and test during resilver&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;=== RESILVER PERFORMANCE TESTS ===&quot;&lt;/span&gt;
zpool online testmirror /dev/sdc

&lt;span class=&quot;token comment&quot;&gt;# Test performance during resilver (most critical for production)&lt;/span&gt;
fio &lt;span class=&quot;token parameter variable&quot;&gt;--direct&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--iodepth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rw&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;randrw &lt;span class=&quot;token parameter variable&quot;&gt;--rwmixread&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;70&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--ioengine&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;libaio &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;4k &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;512M &lt;span class=&quot;token parameter variable&quot;&gt;--numjobs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;120&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--group_reporting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--filename&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-resilver-mixed &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Resilver_Mixed_Random &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Monitor resilver progress&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; zpool status testmirror &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-q&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;resilver&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; 
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Resilver in progress: &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;zpool status testmirror &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; resilver&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;wait&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Wait for fio to complete&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-*&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sync&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Final performance test after recovery&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;=== POST-RECOVERY PERFORMANCE TESTS ===&quot;&lt;/span&gt;
fio &lt;span class=&quot;token parameter variable&quot;&gt;--direct&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--iodepth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rw&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;randrw &lt;span class=&quot;token parameter variable&quot;&gt;--rwmixread&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;70&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--ioengine&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;libaio &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;4k &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1G &lt;span class=&quot;token parameter variable&quot;&gt;--numjobs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--group_reporting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--filename&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-recovered-mixed &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Recovered_Mixed_Random
&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${TESTDIR}&lt;/span&gt;/iotest-*&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sync&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;8. Production Notes&lt;/h3&gt;
&lt;h4&gt;8.1. Disk Identification&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;CRITICAL: Always verify disk identification before testing:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Use multiple methods to identify disks&lt;/span&gt;
lsblk &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; NAME,SIZE,MODEL,SERIAL
smartctl &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; /dev/sdc
&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-la&lt;/span&gt; /dev/disk/by-id/ &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; sdc

&lt;span class=&quot;token comment&quot;&gt;# Check if disk contains important data&lt;/span&gt;
blkid /dev/sdc
&lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; sdc
&lt;span class=&quot;token function&quot;&gt;lsof&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; sdc&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;8.2. Safe Testing Environment&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Create isolated test environment&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Use dedicated test disks - never production storage&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Label test pools clearly&lt;/span&gt;
zpool create &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;comment&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;TEST POOL - SAFE TO DESTROY&quot;&lt;/span&gt; testmirror mirror /dev/sdc /dev/sdd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This hands-on approach lets you thoroughly test ZFS failure scenarios using realistic Proxmox VM workloads without risking production data. The key is understanding that ZFS self-healing only works with proper redundancy - never test these scenarios on single-device pools in production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key of good sleep:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VMs continue running transparently during single disk failures&lt;/li&gt;
&lt;li&gt;Resilver operations cause measurable but acceptable performance impact&lt;/li&gt;
&lt;li&gt;Data integrity is automatically maintained without VM awareness&lt;/li&gt;
&lt;li&gt;L2ARC failures have no impact on VM operation or data safety&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Hard Notes: ZFS can protect against drive failures but not against operator errors.&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[Using Strace to Debug Your Stuck Commands]]></title><description><![CDATA[Strace  is  a  useful  diagnostic, instructional, and debugging tool.  System administrators, diagnosticians and trouble-shooters will find…]]></description><link>https://nicolas.my.id/using-strace-to-debug-your-stuck-command/</link><guid isPermaLink="false">https://nicolas.my.id/using-strace-to-debug-your-stuck-command/</guid><pubDate>Sun, 23 Jan 2022 18:04:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Strace  is  a  useful  diagnostic, instructional, and debugging tool.  System administrators, diagnosticians and trouble-shooters will find it invaluable for solving problems with programs for which the source is not readily available since they do  not  need to  be  recompiled  in  order to trace them.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Dalam tulisan saya kali ini, saya akan menceritakan sebuah &lt;em&gt;&quot;mejik~~&quot;&lt;/em&gt; tool yang sudah menyelamatkan &lt;strong&gt;Production&lt;/strong&gt; cluster berisikan lebih dari &lt;strong&gt;1000&lt;/strong&gt; VMs&lt;/p&gt;
&lt;h3&gt;TL;DR&lt;/h3&gt;
&lt;p&gt;Di sebuah pagi ketika saya baru saja sampai di kantor untuk on-site. Saya melakukan pengecekan terhadap CEPH cluster &lt;em&gt;(dikarenakan sebelumnya sedang proses recovery slow ops osd)&lt;/em&gt; dengan menggunakan perintah :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ubuntu@xxxxxxxxxxxx ~$ ceph &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt;
  cluster:
    id:     xxxxx-xx-xxx-xxxx-xxxxxxx
    health: HEALTH_WARN
            &lt;span class=&quot;token number&quot;&gt;500011&lt;/span&gt; slow ops, oldest one blocked &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;104335&lt;/span&gt; sec, &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;mon.xxxxx-01,mon.xxxxx-02,mon.xxxxx-03&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; has slow ops&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Saya melihat adanya slow ops hanya ada pada ceph-mon, &lt;em&gt;&quot;berarti slow ops osd sebelumnya, sudah resolved&quot;&lt;/em&gt; pikir saya.&lt;/p&gt;
&lt;p&gt;Kemudian saya memeriksa &lt;code class=&quot;language-text&quot;&gt;systemd&lt;/code&gt; di setiap host ceph monitor, dan menemukan bahwa &lt;code class=&quot;language-text&quot;&gt;systemd&lt;/code&gt; ceph-mon pada host &lt;strong&gt;xxxxx-02&lt;/strong&gt; &lt;em&gt;inactive (Dead)&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ubuntu@xxxxx-02:~$ systemctl status ceph-mon@xxxxx-02
● ceph-mon@xxxxx-02.service - Ceph cluster monitor daemon
   Loaded: loaded &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/lib/systemd/system/ceph-mon@.service&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; disabled&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; vendor preset: enabled&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
   Active: inactive &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dead&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; since Mon &lt;span class=&quot;token number&quot;&gt;2022&lt;/span&gt;-01-24 02:32:16 WIB&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt; hours ago
 Main PID: &lt;span class=&quot;token number&quot;&gt;875486&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ceph-mon&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    Tasks: &lt;span class=&quot;token number&quot;&gt;27&lt;/span&gt;
   CGroup: /system.slice/system-ceph&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;x2dmon.slice/ceph-mon@xxxxx-02.service
           └─875486 /usr/bin/ceph-mon &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--cluster&lt;/span&gt; ceph &lt;span class=&quot;token parameter variable&quot;&gt;--id&lt;/span&gt; xxxxx-02 &lt;span class=&quot;token parameter variable&quot;&gt;--setuser&lt;/span&gt; ceph &lt;span class=&quot;token parameter variable&quot;&gt;--setgroup&lt;/span&gt; ceph&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Namun ketika dilakukan pengecekan menggunakan &lt;code class=&quot;language-text&quot;&gt;ps aux | grep ceph-mon&lt;/code&gt; binary &lt;strong&gt;/usr/bin/ceph-mon&lt;/strong&gt; running. Dapat disimpulkan bahwa ceph-mon pada host &lt;strong&gt;xxxxx-02&lt;/strong&gt; running, namun tidak di bawah pantauan systemd.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sehingga saya putuskan untuk kill pid ceph-mon yang running tersebut&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;kill&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-9&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;pid-ceph-mon&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Seketia saya tekan tombol ENTER, &quot;Klakk....&quot; tiba-tiba command ceph tidak bisa dieksekusi alias stuck.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Dalam hati saya berkata &quot;Oh mungkin leader mon-nya pindah tungguin aja... Sambil saya meng-aktifkan systemd ceph-mon pada host xxxxx-02&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Setelah menunggu 10-30 menit, command &lt;code class=&quot;language-text&quot;&gt;ceph&lt;/code&gt; masih tidak bisa dijalankan alias masih &lt;em&gt;stuck&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dalam hati saya berkata &quot;Wadoohh, napa ni yakkk!!&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Troubleshoot&lt;/h3&gt;
&lt;h4&gt;1. Check Systemd Status&lt;/h4&gt;
&lt;p&gt;Langkah pertama yang saya lakukan adalah melakukan pengecekan pada systemd ceph-mon di semua Host.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; xxxxx-01 xxxxx-02 xxxxx-03 &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;systemctl status ceph-mon@&lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hasilnya semua running well.&lt;/p&gt;
&lt;h4&gt;2. Check Leader via admin socket ceph-mon&lt;/h4&gt;
&lt;p&gt;Pada dasarnya ceph perlu memiliki 2 ceph-mon yang &lt;em&gt;qorum&lt;/em&gt; agar bisa berjalan normal.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;root@xxxxx-03:/home/ubuntu&lt;span class=&quot;token comment&quot;&gt;# ceph--admin-daemon/var/run/ceph/ceph-mon.xxxxx-03.asok mon_status&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;xxxxx-03&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;rank&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;state&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;leader&quot;&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;election_epoch&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15370&lt;/span&gt;,
    &lt;span class=&quot;token string&quot;&gt;&quot;quorum&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;,
        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;,
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dapat terlihat bahwa terdapat 2 ceph-monitor yang &lt;em&gt;qorum&lt;/em&gt;, sehingga secara teori, ceph seharusnya berjalan sebagaimana mustinya.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mengumpat di dalam hati &quot;█████ kenapa kagak bisa dahhh...&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;3. Ceph command dengan Sepesifik Monitor&lt;/h4&gt;
&lt;p&gt;Salah satu kolega saya &lt;a href=&quot;https://blog.ajiarya.id&quot; target=&quot;_blank&quot;&gt;Aji Arya&lt;/a&gt; menyarankan untuk melakukan percobaan menjalalankan command dengan argumen &lt;code class=&quot;language-text&quot;&gt;-m&lt;/code&gt; yang akan membuat ceph  menembak ke sepesifik monitor.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ceph &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;172&lt;/span&gt;.x.238.56&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;172.x.238.56&lt;/code&gt; merupakan IP segment ceph monitor milik xxxxx-03, seharusnya jika memang monitor tersebut sebagai leader, ceph command bisa dijalankan. Namun hasilnya teteap &lt;em&gt;stuck&lt;/em&gt;.&lt;/p&gt;
&lt;h4&gt;4. Despreate&lt;/h4&gt;
&lt;p&gt;Setelah 8 jam berdiskusi dengan para kolega, dan lain-lain. Saya merehatkan diri &lt;em&gt;&quot;toh VM exsisting tidak ada yang ter-impact saat itu&quot;&lt;/em&gt; dan saya masih berfikiran bahwa itu hanya kasus di mana &lt;code class=&quot;language-text&quot;&gt;storedb&lt;/code&gt; ceph-mon yang tinggi sedang &lt;em&gt;compacting&lt;/em&gt; istilah kasarnya &lt;em&gt;&quot;lagi ngejar (nge-sync) ituu, storedb ceph-mon nyaa..&quot;&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Troubleshoot dilanjutkan oleh para kolega lain&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hingga saya bagun di pagi hari, dan melanjutkan hidup, dikarenakan hari itu adalah hari sabtu., dan saya adalah manusia normal yang selayaknya perlu malam mingguan.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Namun semesta berkata lain, malam minggu saya harus berada di depan laptop...&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;5. Strace &amp;#x26; Debug mode&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Saya join troubleshoot lagi karena &lt;del&gt;disuruh&lt;/del&gt; penasaran, bersama CEO saya.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se-dari awal, saya sudah mencoba menjalalankan command &lt;code class=&quot;language-text&quot;&gt;ceph -s --debug-mode=99&lt;/code&gt; yang mana artinya menggunakan mode debug paling &lt;em&gt;&quot;nge-poooll..&quot;&lt;/em&gt; namum tidak muncul apa-apa.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Kalo mode debug aja nga muncul apa-apa gimana mau debug dah...&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hingga saya menemukan kasus yang sama di &lt;em&gt;Mailing Lists - Ceph&lt;/em&gt;, dan dalam kasus tersebut beliau menyarankan melakukan debug menggunakan &lt;code class=&quot;language-text&quot;&gt;strace&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Meskipun di hari sebelumnya saya sudah mencoba menggunakan tools tersebut, namun tidak saya perhatikan dengan teliti, karena output-nya yang musing-innn..&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kemudian saya memikiran skenario apa yang harus dicoba, dan saya mendapatkan sebuah ide.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;strace&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; ceph &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; --debug-ms&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;99&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;172&lt;/span&gt;.x.238.56
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052239&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; connect&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;, &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;sa_family&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;AF_INET &lt;span class=&quot;token assign-left variable&quot;&gt;sin_port&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ntons&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3300&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;,sin_addr-inet_addr&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;172.xx.238.56&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;, &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt; sunfinished
pid &lt;span class=&quot;token number&quot;&gt;3052240&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. fentl resumed» &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; 0x2 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;flags O_RDAR&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052239&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. connect resumed &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-1&lt;/span&gt; ECONNREFUSED &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Connection refused&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052240&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; fcntl&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;, F_SETFL, O_RDWRIO_NONBLOCK&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052239&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; futex&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0x7fcb9805d8e4, FUTEX_MAKE_PRIVATE, &lt;span class=&quot;token number&quot;&gt;2147483647&lt;/span&gt; «unfinished
pid &lt;span class=&quot;token number&quot;&gt;3052240&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; setsockopt&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;, SOL_TCP, TCP NODELAY, &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; «unfinished
pid &lt;span class=&quot;token number&quot;&gt;3052241&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt; futex resumed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052240&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. setsockopt resumed&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052241&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; futex&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0x7fcb9805d890, FUTEX_WAIT_PRIVATE, &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;, NULL ‹unfinished &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052240&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; connect&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;, &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;sa_family&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;AF_INET, sin_port-htons&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6789&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, sin_addr-inet_addr&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;172.xx.238.56&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;, &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt; sunfinished
pid &lt;span class=&quot;token number&quot;&gt;3052239&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. futex resumed &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052239&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; futex&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0x7fcb9805d890, FUTEX_WAKE_PRIVATE, &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; «unfinished &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052240&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;connect resumed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-1&lt;/span&gt; EINPROGRESS &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Operation now &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; progress&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052241&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. futex resumed &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052240&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; poll_ctl&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;, EPOLL_CTL_ADD, &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;, &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;EPOLLINIEPOLLET, &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;u32-13, &lt;span class=&quot;token assign-left variable&quot;&gt;464&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; cunfinished
pid &lt;span class=&quot;token number&quot;&gt;3052241&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; futex&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0x7fcb9805d890, FUTEX_WAKE_PRIVATE, &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; unfinished &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052240&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;• epol1_ctl resumedo &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052241&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. futex resumed &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;3052240&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; connect &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;, &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;sa_family-AF_INET,sin_port-htons&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6789&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;,sin_addrainet_addr&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;172.xx.238.56&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;, &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt; unfinished
pid &lt;span class=&quot;token number&quot;&gt;3052241&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; futex&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0x7fcb9805d8e0, FUTEX_WAIT_PRIVATE, &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;, NULL cunfinished
pid &lt;span class=&quot;token number&quot;&gt;3052240&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;.connect resumed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-1&lt;/span&gt; ECONNREFUSED &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Connection refused&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
pid &lt;span class=&quot;token number&quot;&gt;30522391&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;futex resumed &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Dan saya notice sesuatu yang janggal, &quot;Lohh... kok refused&quot;, buru-buru saya check apakah semua ceph-mon hidup, dan running pada port tersebut.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Check LISTEN Port ceph-mon&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; xxxxx-01 xxxxx-02 xxxxx-03&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sudo lsof -i -P -n | grep LISTEN|grep 6789&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; xxxxx-01 xxxxx-02 xxxxx-03&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$i&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sudo lsof -i -P -n | grep LISTEN|grep 3300&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hasil pengecekan menunjukkan bahwa ternyata ceph-mon running &lt;strong&gt;bukan&lt;/strong&gt; di segment IP yang sebagaimana mustinya.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Posisi Binding Port Ceph Mon
- xxxxx-01  =&gt;  172.x.251.54
- xxxxx-02  =&gt;  172.x.238.55
- xxxxx-03  =&gt;  172.x.251.56&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Setelah itu saya seperti mendapat pencerahan, &quot;owalahhh....&quot; dan saya coba ubah skenarionya.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;strace&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; ceph &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; --debug-ms&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;99&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;172&lt;/span&gt;.x.251.56
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
futex&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Oxa745cc, FUTEX_WAKE_PRIVATE, &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
futex&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Oxa74560, FUTEX_WAKE_PRIVATE, &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
futex&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0x218db20, FUTEX_WAIT_BITSET_PRIVATE I FUTEX_CLOCK_REALTIME, O, NULL, Oxffffffff&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
futexCoxa745c8, FUTEX_WAIT_BITSET_PRIVATE I FUTEX_CLOCK_REALTIME, &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;tv_sec&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1642852349&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;tv_nsec&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;778854000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;, Oxffffffff&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-1&lt;/span&gt; EAGAIN &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Resource temporarily unavailable&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
futexCoxa74560, FUTEX_WAKE_PRIVATE, &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
futex&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;@x7ff4c0000e70, FUTEX_WAIT_BITSET_PRIVATE I FUTEX_CLOCK_REALTIME, &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;tv_sec&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3790335996&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;tv_nsec&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;773920000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;, Oxffffffff&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
write&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot; cluster:&lt;span class=&quot;token entity&quot; title=&quot;\n&quot;&gt;\n&lt;/span&gt; id: 3938d835-&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;., &lt;span class=&quot;token number&quot;&gt;862&lt;/span&gt; cluster:
    id: xxxxx-xx-xxx-xxxx-xxxxxxx
    health: HEALTH_WARN
            no active mgr
            mons xxxxx-03, xxxxx-01 are using a lot of disk space
            &lt;span class=&quot;token number&quot;&gt;1981&lt;/span&gt; slow ops, oldest one blocked &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;77&lt;/span&gt; sec, daemons &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;mon.xxxxx-03, mon.xxxxx-01&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; have slow ops.
    services:
      mon: &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; daemons, quorum xxxxx-03, xxxxx-01 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;age 19s&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      mgr: no daemons active &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;since 32h&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      osd: &lt;span class=&quot;token number&quot;&gt;836&lt;/span&gt; osds: &lt;span class=&quot;token number&quot;&gt;826&lt;/span&gt; up &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;since 15h&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, &lt;span class=&quot;token number&quot;&gt;816&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;since 15h&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;154&lt;/span&gt; remapped pgs
    data:
      pools:    &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; pools, &lt;span class=&quot;token number&quot;&gt;12513&lt;/span&gt; pgs
      objects:  &lt;span class=&quot;token number&quot;&gt;346&lt;/span&gt;.45M objects, &lt;span class=&quot;token number&quot;&gt;1.3&lt;/span&gt; PiB
      usage:    &lt;span class=&quot;token number&quot;&gt;2.0&lt;/span&gt; PiB used, &lt;span class=&quot;token number&quot;&gt;1.8&lt;/span&gt; PiB / &lt;span class=&quot;token number&quot;&gt;3.8&lt;/span&gt; PiB avail
      pgs:      &lt;span class=&quot;token number&quot;&gt;12513&lt;/span&gt; active+clean
    io:
      client:    &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt; MiB/s rd, &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt; MiB/s wr, &lt;span class=&quot;token number&quot;&gt;813&lt;/span&gt; op/s rd, &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;.54k op/s wr
      cache:     &lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt; MiB/s flush, &lt;span class=&quot;token number&quot;&gt;627&lt;/span&gt; MiB/s evict, &lt;span class=&quot;token number&quot;&gt;52&lt;/span&gt; op/s promote

&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;862&lt;/span&gt;
munmapC0x7ff4c459b000, &lt;span class=&quot;token number&quot;&gt;262144&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
munmap&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Øx7ff4c455b000, &lt;span class=&quot;token number&quot;&gt;262144&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
munmap@x7ff4c44db000, &lt;span class=&quot;token number&quot;&gt;262144&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
munmap&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;@x7ff4c465b000, &lt;span class=&quot;token number&quot;&gt;262144&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
clone&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;child_stack&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;0x7ff4bf59dfbo, &lt;span class=&quot;token assign-left variable&quot;&gt;flags&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;CLONE_VMI CLONE_FS ICLONE_FILES I CLONE_SIGHAND I CLONE_THREAD I CLONE_SYSVSEMI CLONE_SETTLS I CLONE_PARENT_SETTIDICLONE_CHILD_CLEARTID, &lt;span class=&quot;token assign-left variable&quot;&gt;parent_tidptr&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;0x7ff4bf59e9do, &lt;span class=&quot;token assign-left variable&quot;&gt;tls&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;0x7ff4bf59e700, &lt;span class=&quot;token assign-left variable&quot;&gt;child_tidptr&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;0x7ff4bf59e9d0
- &lt;span class=&quot;token number&quot;&gt;490490&lt;/span&gt;
futexCoxa745cc, FUTEX_WAKE_PRIVATE, &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
futexCoxa74560, FUTEX_WAKE_PRIVATE, &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
futex&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0x218db20, FUTEX_WAIT_BITSET_PRIVATE I FUTEX_CLOCK_REALTIME, O, NULL, Oxffffffff&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
+++ exited with &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; +++&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Ternyata menurut kisah yang beredar, &lt;code class=&quot;language-text&quot;&gt;ceph-mon&lt;/code&gt; tersebut berubah segment IP dikarenakan pernah terjadi proses recreate &lt;code class=&quot;language-text&quot;&gt;ceph-mon&lt;/code&gt; menggunakan segment yang berbeda. Itu penyebab ketika saya &lt;code class=&quot;language-text&quot;&gt;kill ceph-mon&lt;/code&gt; pada host xxxxx-02, membuat &lt;code class=&quot;language-text&quot;&gt;ceph&lt;/code&gt; command &lt;em&gt;stuck&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Untuk me-&lt;em&gt;resolve&lt;/em&gt; hal tersebut hanya cukup mengubah config &lt;code class=&quot;language-text&quot;&gt;/etc/ceph/ceph.conf&lt;/code&gt; ke segment .251 &lt;em&gt;(hal tersebut juga menyelesaikan masalah &lt;code class=&quot;language-text&quot;&gt;no active mgr&lt;/code&gt;)&lt;/em&gt;, kemudian melakukan recreate ceph-mon, kembali ke .238. Baru setelah itu mengubah file konfigurasi seperti yang seharusnya.&lt;/p&gt;
&lt;p&gt;Setelah &lt;strong&gt;Root Cause&lt;/strong&gt; dari isu ini akhirnya selesai, *&quot;saya akhirnya bisa melanjutkan malam minggu meskipun jatuhnya minggu-subuhan, bukan malam mingguan&quot;*🥱.&lt;/p&gt;
&lt;h3&gt;Notes&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Proses troubleshooting tidak semudah 5 langkah di atas, banyak sekali faktor/problem yang dalam prosesnya dilakukan. Namun tidak dituliskan. Tulisan di atas merupakan sebagian pendekatan yang saya lakukan sehingga bisa mengerucutkan proses troubleshooting.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Everything will be fine if you just keep working on it, and take some cigarettes or coffee to meanwhile break also give a moment think clearly.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Reference&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;strace(1) - Linux manual page &lt;a href=&quot;https://man7.org/linux/man-pages/man1/strace.1.html&quot;&gt;https://man7.org/linux/man-pages/man1/strace.1.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bug #14340: client command stuck forever  - Ceph&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://ceph-users.ceph.narkive.com/xiTpiO1U/fwd-rbd-map-command-hangs&quot;&gt;https://ceph-users.ceph.narkive.com/xiTpiO1U/fwd-rbd-map-command-hangs&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Troubleshooting Monitors - Ceph Documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.ceph.com/en/latest/rados/troubleshooting/troubleshooting-mon/&quot;&gt;https://docs.ceph.com/en/latest/rados/troubleshooting/troubleshooting-mon/&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ceph: how to fix if monitor IP changes - 尚码园 &lt;a href=&quot;https://www.shangmayuan.com/a/05cc4d6ab2e44b6cb71978d5.html&quot;&gt;https://www.shangmayuan.com/a/05cc4d6ab2e44b6cb71978d5.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Resize Root Volume in Openstack Without Downtime]]></title><description><![CDATA[Terkadang kita perlu scale up volume pada partisi root (biasanya ), yang menjadi masalah adalah volume tersebut tidak bisa di-deatach. Lalu…]]></description><link>https://nicolas.my.id/resize-root-volume-openstack-without-downtime/</link><guid isPermaLink="false">https://nicolas.my.id/resize-root-volume-openstack-without-downtime/</guid><pubDate>Sat, 11 Dec 2021 17:35:11 GMT</pubDate><content:encoded>&lt;!-- *Resize Volumes could be some nightmare in real production case, some people are think that they need to do LVM inside Clouds, wich should be no necessary these day.* --&gt;
&lt;p&gt;&lt;em&gt;Terkadang kita perlu scale up volume pada partisi root (biasanya &lt;code class=&quot;language-text&quot;&gt;/dev/sda&lt;/code&gt;), yang menjadi masalah adalah volume tersebut tidak bisa di-deatach. Lalu bagaimana cara me-resize-nya ? berikut hal yang dapat dilakukan dengan syarat dan ketentuan yang berlaku..&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Syarat dan Ketentuan&lt;/h3&gt;
&lt;p&gt;Pastikan VM tidak menggunakan &lt;em&gt;Ephemeral storage&lt;/em&gt;, dalam kasus ini Saya menggunakan &lt;em&gt;Backend Storage CEPH&lt;/em&gt;.&lt;/p&gt;
&lt;h4&gt;Resize From Openstack Side&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;## set status to available to a volume&lt;/span&gt;
openstack volume &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--state&lt;/span&gt; available &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;volume id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;## resize the volume&lt;/span&gt;
openstack volume &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;40&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;volume id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;## check size and status again&lt;/span&gt;
openstack volume show &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;volume id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;## set status to in-use again&lt;/span&gt;
openstack volume &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--state&lt;/span&gt; in-use &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;volume id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Resize from Inside VM Side&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;## Grow part (Contoh akan resize root partisi)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; growpart /dev/vda &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;## Check apakah volume sudah grow sesuai size baru&lt;/span&gt;
lsblk

&lt;span class=&quot;token comment&quot;&gt;## Resize ‘/’ partition to fill all space&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; resize2fs /dev/vda1

&lt;span class=&quot;token comment&quot;&gt;## (option) If your filesystem is XFS, it can be grown while mounted using the xfs_growfs command:&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; xfs_growfs /

&lt;span class=&quot;token comment&quot;&gt;## Verify&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Reference&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;How To resize an ext2/3/4 and XFS root partition without LVM | ComputingForGeeks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://computingforgeeks.com/resize-ext-and-xfs-root-partition-without-lvm/&quot;&gt;https://computingforgeeks.com/resize-ext-and-xfs-root-partition-without-lvm/&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How to resize a volume in an instance on OpenStack? - Server Fault&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://serverfault.com/questions/1006906/how-to-resize-a-volume-in-an-instance-on-openstack&quot;&gt;https://serverfault.com/questions/1006906/how-to-resize-a-volume-in-an-instance-on-openstack&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extend a Linux file system after resizing a volume - Amazon Elastic Compute Cloud&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html&quot;&gt;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Using TCPDump & Wireshark to Debug Your Intermitten Interconnection]]></title><description><![CDATA[tcpdump is a powerful command-line packet analyzer; and libpcap, a portable C/C++ library for network traffic capture. Dalam tulisan Saya…]]></description><link>https://nicolas.my.id/using-tcpdump-for-debug-your-intermitten-network/</link><guid isPermaLink="false">https://nicolas.my.id/using-tcpdump-for-debug-your-intermitten-network/</guid><pubDate>Sat, 27 Nov 2021 19:00:51 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;tcpdump is a powerful command-line packet analyzer; and libpcap, a portable C/C++ library for network traffic capture.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Dalam tulisan Saya kali ini, Saya akan menceritakan sebuah &lt;strong&gt;Production&lt;/strong&gt; Case yang cukup &lt;em&gt;me-musingkan&lt;/em&gt;, sekaligus membuat bingung Saya dan Team yang menangani Case tersebut.&lt;/p&gt;
&lt;h3&gt;TL;DR&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Pada siang hari di saat Saya dan para kolega sedang menikmati coffe break, tiba-tiba kita mendapatkan pesan dari salah satu client yang kita manage service openstack-nya. Dalam pesannya mereka menyampaikan bahwa, terdapat salah satu Tenant yang Floating IP-nya tidak bisa diakses dari manapun.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Pesan tersebut seketika membuat Saya yang tadinya sedang menikmati sebatang Sampoernah Mild, buru-buru untuk membuka laptop.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Quick Check&lt;/h3&gt;
&lt;p&gt;Segera setelah itu Saya melakukan pengecekan, apakah benar terjadi hal seperti dalam pesan yang &lt;em&gt;client&lt;/em&gt; sampaikan.&lt;/p&gt;
&lt;h4&gt;1. Testing ICMP Connection&lt;/h4&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a5665dabc784ac43b8c7cd4d3d1c6637/2b608/ICMP-Testing-New.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 44.93670886075949%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABeklEQVR42lWRWW7CYAyEc5qWJbSiISshC9k3IOyVev9ruJ6JKpUHy3F+e/zZNqrmIul+UOslK46yi1vBv254yHZXS16epKhG6Q9PSTSnrC+MC/3f9XfWLkxXZguHZsRpz0IvKFSs0e+KSRBy/ZwNkINmXlBKnHQSqYVRzQbImS//CTbtTTueZZ8dKILktr+RKIwaabrpuxue+tZqfOUEsBaEWvciWOkIiRKQIp9GLuuzCtxJu88PSndiDCKMm5cjiSGI2oXpvY4MfF9HBlEQVizkyF5O4kRXAGFPx+PI2hTrgZi/LV8Je10+8CEAD7Hh+JTT+Ycj4jjD8VtGjXMlRT7I4LEK0C9XnrzP7Ukw1IPYTiobNSz4z4N0bUXieBljHM71M8Yw253+f21iir3NNvSGZSd8mERKjgAPYYig2PwI2B2jgWa58ukR4w2N11bMXRqFLhhHaNqr+lFavSovzkM8eGW8181Vas3BMQBh2Snp0NhRWoCsPgP5BVvbPGv9BsQFAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Testing Koneksi ICMP &quot;
        title=&quot;&quot;
        src=&quot;/static/a5665dabc784ac43b8c7cd4d3d1c6637/f058b/ICMP-Testing-New.png&quot;
        srcset=&quot;/static/a5665dabc784ac43b8c7cd4d3d1c6637/c26ae/ICMP-Testing-New.png 158w,
/static/a5665dabc784ac43b8c7cd4d3d1c6637/6bdcf/ICMP-Testing-New.png 315w,
/static/a5665dabc784ac43b8c7cd4d3d1c6637/f058b/ICMP-Testing-New.png 630w,
/static/a5665dabc784ac43b8c7cd4d3d1c6637/40601/ICMP-Testing-New.png 945w,
/static/a5665dabc784ac43b8c7cd4d3d1c6637/78612/ICMP-Testing-New.png 1260w,
/static/a5665dabc784ac43b8c7cd4d3d1c6637/2b608/ICMP-Testing-New.png 1540w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Ketika Saya mencoba melakukan testing ICMP koneksi menggunakan &lt;code class=&quot;language-text&quot;&gt;ping&lt;/code&gt;, dari Host controller menuju VM pada tenant yang bermasalah, hasilnya semua &lt;em&gt;running well&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Di dalam hati Saya berkata &quot;oh, harusnya aman ini, orang di-ping aja bisa... Paling cuman Security Groups...&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;2. Testing Access SSH&lt;/h4&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 612px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/534d26864fe01386bfef74c8ef3a32ec/8c76f/ssh-failed.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 39.24050632911392%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABPUlEQVR42n2R63KCMBCF+yqtgGJRUCuIXBJCEm5W+/4vc7ob7XTaan/s7GaHfDnn8DSezpjez7D9ANEoNNqilg2aVsPQrqZdP05QWiOKE6w3W6yoR3GMVZJgFsx/1NPpfEHVNGiNJYiBsh00FUMrqlIIesTgWNUoaoF9lsFfhHjxAzx7/l/gRMBSSLTWuotFLdENIyQpTPMcuzTFW3bA/pAjOxZ0zpBsdw46I+hdhaymH08OKNrWwXXXI1rH8OYLd5krCJcIFks38/437Aq8XFxODJFKUWkHNt1ANivKaeNyY1UxFc9flu8C2TJnNUwT8rJyQM7Tkm3+KVK1yIsSMYHC1Rrha/RQ3c3yh8tQGXPrHSnU1DUEwVg126+kxHafwifYI3UOuKOPOFzvlhO/7s2vefHscgu/c/sPxsBPSEkA9EySb38AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Testing Access SSH ke salah satu FIP di Tenant tersebut.&quot;
        title=&quot;&quot;
        src=&quot;/static/534d26864fe01386bfef74c8ef3a32ec/8c76f/ssh-failed.png&quot;
        srcset=&quot;/static/534d26864fe01386bfef74c8ef3a32ec/c26ae/ssh-failed.png 158w,
/static/534d26864fe01386bfef74c8ef3a32ec/6bdcf/ssh-failed.png 315w,
/static/534d26864fe01386bfef74c8ef3a32ec/8c76f/ssh-failed.png 612w&quot;
        sizes=&quot;(max-width: 612px) 100vw, 612px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Dapat terlihat bahwa ketika melakukan akses ssh ke FIP tersebut menggunakan argument debug ( &lt;code class=&quot;language-text&quot;&gt;-vvv&lt;/code&gt; ), &lt;em&gt;connection established&lt;/em&gt;. Namun session SSH tidak terbuka-buka.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Di dalam hati Saya berkata lagi, &quot;Loh,, kok kagak bisa yak!&quot;.
Kemudian Saya dan Team sedikit berfikir, mungkin karena MTU yang berbeda.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;3. Testing Ping Jumbo Frames&lt;/h4&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 524px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d0a54a53ad9637f436db677497631c04/664c8/ping-router.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.835443037974684%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABg0lEQVR42lVS23aCQAzsL9jWqqCA3K8LiAjebf//n6aTWHv0ISe7gUxmJvtmuguK5ohqc0bdXZGUg0bZnpBWexTMec3cnFBuTqjaM1KzxyqoEaRb2H6F93mEj0Ws8Wa2V2T8Icp3iMsRYdYTaFAgAfTZ9AAO8x5FfeCAvyCRlMMfYAq48mssfaPhBA3sdaXT3bDRmr02sLwScyfHp5VgtsrwtcywcAuec40XwCDtUW8vKqndfaMbf9SChGzlLtLjYiDLkXmnMmWQSs7u5xfJGalX3ZnNNzT9TeWLh1IX0Lw+wnBgTWsaRst/vLjF1E6V5XSZvjKMixEO5flpBz/ZQixYcaobtcrCY1Y7wpa1Rm0RwIVb6neR/MJwSc9CUveTDgllCSuRJgt4LMlh493HAnMCaGbYnoAa9fYf0CGDiABevKEnvWZhIMuRuyxHagIsL0EUWGRneZWeRcnUfgIc6NnAJeTM8r7WZCo5Nwc1PaAV4qk8HbFGmiezUGVOZpGenz38BfaRB7jjib2+AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Testing Ping Jumbo Frame&quot;
        title=&quot;&quot;
        src=&quot;/static/d0a54a53ad9637f436db677497631c04/664c8/ping-router.png&quot;
        srcset=&quot;/static/d0a54a53ad9637f436db677497631c04/c26ae/ping-router.png 158w,
/static/d0a54a53ad9637f436db677497631c04/6bdcf/ping-router.png 315w,
/static/d0a54a53ad9637f436db677497631c04/664c8/ping-router.png 524w&quot;
        sizes=&quot;(max-width: 524px) 100vw, 524px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Setelah dilakukan percobaan &lt;code class=&quot;language-text&quot;&gt;ping&lt;/code&gt; ke vRouter pada tenant tersebut dengan Jumbo Frame, hasilnya memang tidak bisa dilakukan. Namun ternyata vRouter pada tenant tersebut memang menggunakan MTU 1500, sehingga hal tersebut wajar terjadi.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Saya berkata lagi, namun kali ini tidak dalam hati &quot;INI KENAPA OYYYY!!!&quot;. Teman Saya yang sedang handle pekerjaan yang lebih santai, tertawa melihat Saya yang terlihat puyeng.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Saya mencoba memutar otak; skenario apa yang perlu Saya coba lagi, hingga Saya  mendapat ide...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;4. Testing SSH Access ( VM -&gt; Controller)&lt;/h4&gt;
&lt;p&gt;Jika akses SSH dari &lt;strong&gt;[Controller -&gt; VM]&lt;/strong&gt; tidak bisa, &lt;strong&gt;&quot;seharusnya&quot;&lt;/strong&gt; SSH dari &lt;strong&gt;[VM -&gt; Controller]&lt;/strong&gt;, juga tidak bisa.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 628px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7f7d5076f892d8e482db8dc620c342df/b4e32/ssh-reverse-back.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.69620253164557%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEDBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAced0MYf/8QAGRAAAgMBAAAAAAAAAAAAAAAAAAECERIx/9oACAEBAAEFAnN3tkZOsoyjh//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABgQAAMBAQAAAAAAAAAAAAAAAAABMRCR/9oACAEBAAY/AqyvpXkz/8QAGRABAAMBAQAAAAAAAAAAAAAAAQAQIaHB/9oACAEBAAE/ITo6UhnsimpWAwT/2gAMAwEAAgADAAAAEFMP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGxABAAIDAQEAAAAAAAAAAAAAAQARMUFRkWH/2gAIAQEAAT8QJFpu8Wz7oFe28TQq5Z8HsEpo5P/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;SSH Reverse Back dari VM ke Controller&quot;
        title=&quot;&quot;
        src=&quot;/static/7f7d5076f892d8e482db8dc620c342df/b4e32/ssh-reverse-back.jpg&quot;
        srcset=&quot;/static/7f7d5076f892d8e482db8dc620c342df/ff44c/ssh-reverse-back.jpg 158w,
/static/7f7d5076f892d8e482db8dc620c342df/a6688/ssh-reverse-back.jpg 315w,
/static/7f7d5076f892d8e482db8dc620c342df/b4e32/ssh-reverse-back.jpg 628w&quot;
        sizes=&quot;(max-width: 628px) 100vw, 628px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Ternyata hasilnya sebaliknya, SSH dari &lt;strong&gt;[VM -&gt; Controller]&lt;/strong&gt; bisa dilakukan.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dalam hati Saya berkata &quot;Loh kok aneh.....!&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;In-depth Check&lt;/h3&gt;
&lt;h4&gt;1. Service Network Openstack&lt;/h4&gt;
&lt;p&gt;Saya melakukan pemeriksaan di semua service network openstack. Namun &lt;strong&gt;tidak ditemukan&lt;/strong&gt; adanya error yang menyebabkan hal semacam ini terjadi.&lt;/p&gt;
&lt;h4&gt;2. Firewall&lt;/h4&gt;
&lt;p&gt;Pemeriksaan Firewall di semua Host dan VM untuk memastikan bahwa tidak ada firewall yang menghadang paket. Namun &lt;strong&gt;tidak ditemukan&lt;/strong&gt; adanya tanda - tanda firewall penghadang.&lt;/p&gt;
&lt;h4&gt;3. TCPdump &amp;#x26; Wireshark&lt;/h4&gt;
&lt;p&gt;Di saat-saat &lt;em&gt;despreate&lt;/em&gt; seperti ini TCPdump dan Wireshark merupakan &lt;em&gt;perfect combination&lt;/em&gt;&lt;/p&gt;
&lt;h5&gt;TCPDump DARI CONTROLLER&lt;/h5&gt;
&lt;p&gt;Di sini Saya menggunakan &lt;em&gt;Tmux window 1&lt;/em&gt; dan &lt;em&gt;window 2&lt;/em&gt;. Keduanya melakukan eksekusi &lt;em&gt;command&lt;/em&gt; yang berbeda.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;### Window 1&lt;/span&gt;
tcpdump &lt;span class=&quot;token parameter variable&quot;&gt;-ni&lt;/span&gt; team0.1102 &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;65535&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;host&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;172.16&lt;/span&gt;.100.228 &lt;span class=&quot;token parameter variable&quot;&gt;-w&lt;/span&gt; debug-ssh.pcap

&lt;span class=&quot;token comment&quot;&gt;### Window 2&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-vvv&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;172.16&lt;/span&gt;.100.228&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Keduanya Saya biarkan berjalan sekitar ±5 menit.&lt;/p&gt;
&lt;h5&gt;IMPORT KE Whireshark&lt;/h5&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c8cb6d189dc89ad825809f5d977c4dce/21e8f/intermittent-wr.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.39240506329114%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACK0lEQVR42qWRX2/SYBTG+2mM2c0EGWyMuQEqo7Slb9u3ZSY6xmaMuzDx0pt9PXUxZhsDMtStm2MChQYSEgKVPp42mxovjH9O8svz9pznPT09FfbfvpkeVo9w0DhBrVbHcb2Ko9p7VGukR5Q/OET1uI5Go45msxny4ReaJyf+p7MzvN5/1xcWRcUTNR2SYUJiOh6oGlYlBWmFIZLLIyXKKHILom5CNjiUwBeg8RCZUA3LT8sqnr3ac4V5iXvLmoWAFaOEu7KBmGIiVuSYE3UsqCZSuoUE41gmTQY+/ggJuYS4VEKCSMob/p28ifXNp64wJz/xlqxtLPIKkqRRVsa8WkZUL+OW9BgRrUz5CuJUD3xxvo2EuYOIsoWIvBVqTKn4t8VNqM9fukJCUb10iWHNZMhsMCRVFUmm4p6pIVEk5VSzGFapHvgyRNpSEX1YQCQrYj6bRywn+/G8Craz6woLUtHLGjoyOu2P61imXSzJRaQYQ7SgYIVpyFkm7ps81ID1koU1xcCarIdki9xfKmjguy9cwbZtz6Y/dHZ6inPbxueLC1wQrctLtK6ucEV0Ox30HIfood/rfdfwHD47/nAwgOM4rtBut71utwu330eXLvVdF+PxGJPJBDfh+/5vmc1mfuCjO65ADTwKTKfTsMnPxr+I0Ew9XGE4HAaj+PSWGensH+Pr9YQ9YTQaeTef9R/xY0L73P5CO+wTtFvnjwi8nU4n5DoXxKDVan38BpGo0bUOWrViAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Hasil Import dari TCPdump&quot;
        title=&quot;&quot;
        src=&quot;/static/c8cb6d189dc89ad825809f5d977c4dce/f058b/intermittent-wr.png&quot;
        srcset=&quot;/static/c8cb6d189dc89ad825809f5d977c4dce/c26ae/intermittent-wr.png 158w,
/static/c8cb6d189dc89ad825809f5d977c4dce/6bdcf/intermittent-wr.png 315w,
/static/c8cb6d189dc89ad825809f5d977c4dce/f058b/intermittent-wr.png 630w,
/static/c8cb6d189dc89ad825809f5d977c4dce/40601/intermittent-wr.png 945w,
/static/c8cb6d189dc89ad825809f5d977c4dce/78612/intermittent-wr.png 1260w,
/static/c8cb6d189dc89ad825809f5d977c4dce/21e8f/intermittent-wr.png 1684w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Dari visualisasi pada Wireshark tersebut sudah dapat terlihat pokok ujung dari permasalahan ini.&lt;/p&gt;
&lt;p&gt;Mac-address &lt;code class=&quot;language-text&quot;&gt;fa:16:3e:3c:42:16&lt;/code&gt;, merupakan &lt;code class=&quot;language-text&quot;&gt;mac&lt;/code&gt; dari vRouter tenant yang bermasalah. Jika dilihat pattern yang terjadi; semua &lt;code class=&quot;language-text&quot;&gt;TCP Retransmission&lt;/code&gt;,  &lt;code class=&quot;language-text&quot;&gt;Dup ACK&lt;/code&gt; terus menerus terjadi dan tidak ada paket yang berhasil melewati vRouter tenant tersebut.&lt;/p&gt;
&lt;h3&gt;Final Action&lt;/h3&gt;
&lt;p&gt;Setelah melakukan diskusi dengan Team dan &lt;em&gt;Client&lt;/em&gt;, kita memutuskan untuk melakukan &lt;em&gt;recreate&lt;/em&gt; vRouter pada tenant tersebut, dan melakukan konfigurasi Gateway yang lebih &lt;em&gt;proper&lt;/em&gt;.&lt;/p&gt;
&lt;h4&gt;After Recreate vRouter&lt;/h4&gt;
&lt;p&gt;Berikut tampilan visualisasi TCPDump setelah dilakukan Action Recreate vRouter.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/dc2ac63fdccf4544a2f9d5668ecb4ea0/cc6fe/result-success-wr.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63.92405063291139%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACEUlEQVR42q2QaXPaQAyG/f//VJsDvLbBF17fJzYYcEOghAANyxt5Sac0/dKZVjPPyJLWrw7FHrGzzT3hhLHgQSA8nwvXN4XDTeFObDEem2LINGFZloiiSCRJLInjXyQf3uP8rDDVwN3DAANm4HGoYqgyOK6Lu8dHmLYDc2yBaTo0fQRNM6DSt/oR93lGuR6V6bCdBArnHQmlJBrhy32Ah0GCLN3JnOd1CMNnjM2G4gRfH0JqFMm3ml5iyHJY9lzWs2SHWX2CEkUbGJTQjCkYYYwb1NMf0if0KE1faOIlRtYcql7BpSbcX0s8/oQg3MAPnjGtTlgtLlCCYA19VEsxRl37776oj2sS/C6ZkEifN+1WClpOS+stwEkwire00R5FfsCyJcHJpMNQK2mlDPeDlO5ToiyOMhdQ5zDY0FoLDNRC1oesILElnWIj6z5NGoZb5NkrCQootkP3MFwJ0x2J68bScz+ndQq4k4QmuzLhKU1dI8/nkoyYzZ/QdTu07RqKGU2h8gqaP4UWNBi4OZiMacWkhVdvJVG7R7I6Il4eEC72vxG0LwjmV5SyrFAUJbIsR93MMK0brLpveD0ccTieIC6QnMUNlz+5vqEb7vd79CaEwOVywb9Y/7+y2+1Er3c+n8WtfY4/135ya29vb0I5nU74XyYnTNJsVRRFV1VV1zTNX1GWZZfnuaSua5nrPems3gG3k7Y1DL/KWQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Smoth Packet Network&quot;
        title=&quot;&quot;
        src=&quot;/static/dc2ac63fdccf4544a2f9d5668ecb4ea0/f058b/result-success-wr.png&quot;
        srcset=&quot;/static/dc2ac63fdccf4544a2f9d5668ecb4ea0/c26ae/result-success-wr.png 158w,
/static/dc2ac63fdccf4544a2f9d5668ecb4ea0/6bdcf/result-success-wr.png 315w,
/static/dc2ac63fdccf4544a2f9d5668ecb4ea0/f058b/result-success-wr.png 630w,
/static/dc2ac63fdccf4544a2f9d5668ecb4ea0/40601/result-success-wr.png 945w,
/static/dc2ac63fdccf4544a2f9d5668ecb4ea0/78612/result-success-wr.png 1260w,
/static/dc2ac63fdccf4544a2f9d5668ecb4ea0/cc6fe/result-success-wr.png 1860w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Dapat dilihat hasil visualisasi TCPDump dari akses SSH yang menggunakan vRouter baru &amp;#x26; Gateway yang lebih &lt;em&gt;proper&lt;/em&gt; tidak menunjukkan adanya &lt;code class=&quot;language-text&quot;&gt;TCP Retransmission&lt;/code&gt; ataupun  &lt;code class=&quot;language-text&quot;&gt;Dup ACK&lt;/code&gt; .&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Akhirnya setelah semuanya selesai, baru Saya bakar lagi sebatang Sampoerna Mild yang baru saja buka bungkus.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Reference&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;D.3. tcpdump: Capturing with “tcpdump” for viewing with Wireshark&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.wireshark.org/docs/wsug_html_chunked/AppToolstcpdump.html&quot;&gt;https://www.wireshark.org/docs/wsug_html_chunked/AppToolstcpdump.html&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tcpdump(1) man page | TCPDUMP &amp;#x26; LIBPCAP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.tcpdump.org/manpages/tcpdump.1.html&quot;&gt;https://www.tcpdump.org/manpages/tcpdump.1.html&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP Retransmission Timeout (RTO): Causes &amp;#x26; Performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.extrahop.com/company/blog/2016/retransmission-timeouts-rtos-application-performance-degradation/#:~:text=What%20Is%20TCP%20Retransmission%3F,expires%2C%20the%20segment%20is%20retransmitted&quot;&gt;https://www.extrahop.com/company/blog/2016/retransmission-timeouts-rtos-application-performance-degradation/#:~:text=What%20Is%20TCP%20Retransmission%3F,expires%2C%20the%20segment%20is%20retransmitted&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP Series #3: Network Packet Loss, Retransmissions, and Dup Acks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://accedian.com/blog/network-packet-loss-retransmissions-and-duplicate-acknowledgements/&quot;&gt;https://accedian.com/blog/network-packet-loss-retransmissions-and-duplicate-acknowledgements/&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Memahami Message [watchdog: BUG: soft lockup - CPU#X stuck for XXs!]]]></title><description><![CDATA[This 'soft lockup' can happen if the kernel is busy, working on a huge amount of objects which need to be scanned, freed, or allocated…]]></description><link>https://nicolas.my.id/memahami-apa-itu-BUG-soft-lockup-CPU-X-stuck-for-XXs/</link><guid isPermaLink="false">https://nicolas.my.id/memahami-apa-itu-BUG-soft-lockup-CPU-X-stuck-for-XXs/</guid><pubDate>Sat, 25 Sep 2021 10:50:58 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;This &apos;soft lockup&apos; can happen if the kernel is busy, working on a huge amount of objects which need to be scanned, freed, or allocated, respectively.&lt;/em&gt;&lt;/p&gt;
&lt;!-- ![Tokopedia Tower](./Tokopedia_Tower.jpeg)

5 Februari 2020, Bulan dimana saya memasuki bulan ke-2 program *apprentice* di salah satu IT Konsultan di Bogor. --&gt;
&lt;hr&gt;
&lt;p&gt;Berdasarkan pengalaman, kernel message &lt;code class=&quot;language-text&quot;&gt;watchdog: BUG: soft lockup - CPU#X stuck for XXs!&lt;/code&gt; dalam beberapa kasus tidak akan terjadi problem (Hang) jika stuck hanya beberapa detik. Namun jika sudah stuck &lt;em&gt;time&lt;/em&gt; -nya semakin lama, dan message tersebut sering muncul mengindikasikan kernel space busy tiada henti.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A soft lockup is a situation usually caused by a bug, when a task is executing in kernel space on a CPU without rescheduling. The task also does not allow any other task to execute on that particular CPU. As a result, a warning is displayed to a user through the system console. This problem is also referred to as the soft lockup firing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Soft lockup merupakan situasi yang disebabkan oleh bug, ketika sebuah task dieksekusi oleh kernel space di CPU tanpa rescheduling. Task tersebut juga tidak mengizinkan task yang lain dieksekusi di CPU tertentu. Sehingga muncul Warning message dari kernel, &lt;code class=&quot;language-text&quot;&gt;watchdog: BUG: soft lockup - CPU#X stuck for XXs!&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Untuk indikasi lebih dalam perlu pengecekan Host dari VM tersebut.&lt;/p&gt;
&lt;h3&gt;Beberapa Opsi yang bisa dicoba untuk menangani hal tersebut&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Disable kerenel panic; By default RHEL 8 sudah melakukan hal tersebut. Parameters ini berguna supaya tidak terjadi kernel panic ketika ada &lt;code class=&quot;language-text&quot;&gt;soft lockup&lt;/code&gt;; &lt;strong&gt;Sehingga VM Tidak Hang ketika terjadi &lt;code class=&quot;language-text&quot;&gt;soft lockup&lt;/code&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;kernel.softlockup_panic=0&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; /etc/sysctl.conf
 &lt;span class=&quot;token function&quot;&gt;sysctl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--system&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Incrase watchdog_thresh, agar message soft lockup muncul hanya ketika cpu stuck lebih dari 30s.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;   &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;kernel.watchdog_thresh=30&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; /etc/sysctl.conf                
   &lt;span class=&quot;token function&quot;&gt;sysctl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--system&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Upgrade Kernel to latest. Kembali lagi tindakan yang bisa dilakukan untuk bug kernel tidak banyak, opsi terbaik adalah &lt;em&gt;patch the bug&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Check VM Host, issue seperti ini sering terjadi pada teknologi virtualisasi seperti VMware, KVM. Tidak menutup kemungkinan Host VM tersebut memang sudah &lt;em&gt;exhausted&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Reference&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;What are all these &quot;Bug: soft lockup&quot; messages about? | Support | SUSE&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.suse.com/support/kb/doc/?id=000018705&quot;&gt;https://www.suse.com/support/kb/doc/?id=000018705&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kernel - watchdog: BUG: soft lockup - CPU#6 stuck for 23s - Ask Ubuntu&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://askubuntu.com/questions/1264859/watchdog-bug-soft-lockup-cpu6-stuck-for-23s&quot;&gt;https://askubuntu.com/questions/1264859/watchdog-bug-soft-lockup-cpu6-stuck-for-23s&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Error message: &quot;NMI watchdog: BUG: soft lockup - CPU#X stuck for XXs!&quot; on console (67623)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://kb.vmware.com/s/article/67623&quot;&gt;https://kb.vmware.com/s/article/67623&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VMware virtual machine guest soft lockups in mpt_put_msg_frame - Red Hat Customer Portal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://access.redhat.com/solutions/3176741&quot;&gt;https://access.redhat.com/solutions/3176741&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Virtualization lags and hypervisor overcommitment - Red Hat Customer Portal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://access.redhat.com/articles/5008811&quot;&gt;https://access.redhat.com/articles/5008811&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chapter 7. Keeping kernel panic parameters disabled in virtualized environments Red Hat Enterprise Linux 8 | Red Hat Customer Portal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/keeping-kernel-panic-parameters-disabled-in-virtualized-environments_managing-monitoring-and-updating-the-kernel&quot;&gt;https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/keeping-kernel-panic-parameters-disabled-in-virtualized-environments_managing-monitoring-and-updating-the-kernel&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;linux - What does &quot;kernel:NMI watchdog: BUG: soft lockup&quot; followed by other errors mean? - Unix &amp;#x26; Linux Stack Exchange&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://unix.stackexchange.com/questions/216959/what-does-kernelnmi-watchdog-bug-soft-lockup-followed-by-other-errors-mean&quot;&gt;https://unix.stackexchange.com/questions/216959/what-does-kernelnmi-watchdog-bug-soft-lockup-followed-by-other-errors-mean&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;NMI watchdog: BUG: soft lockup - CPU # stuck for #s! [X:3005]&quot; in message log file after a Flame application crash | Flame Products 2020 | Autodesk Knowledge Network&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://knowledge.autodesk.com/support/flame-products/troubleshooting/caas/sfdcarticles/sfdcarticles/NMI-watchdog-BUG-soft-lockup-CPU-stuck-for-s-X-3005-in-message-log-file-after-a-Flame-application-crash.html&quot;&gt;https://knowledge.autodesk.com/support/flame-products/troubleshooting/caas/sfdcarticles/sfdcarticles/NMI-watchdog-BUG-soft-lockup-CPU-stuck-for-s-X-3005-in-message-log-file-after-a-Flame-application-crash.html&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.kernel.org/doc/Documentation/lockup-watchdogs.txt&quot;&gt;https://www.kernel.org/doc/Documentation/lockup-watchdogs.txt&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.kernel.org/doc/Documentation/sysctl/kernel.txt&quot;&gt;https://www.kernel.org/doc/Documentation/sysctl/kernel.txt&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[OpenStack Multi-Tenancy Architecture: Glance, Keystone, and Cross-Tenant Resource Sharing]]></title><description><![CDATA[Multi-tenancy is one of OpenStack's fundamental design principles, enabling secure resource isolation while allowing controlled sharing when…]]></description><link>https://nicolas.my.id/openstack-multi-tenancy-glance-keystone-cross-tenant-sharing/</link><guid isPermaLink="false">https://nicolas.my.id/openstack-multi-tenancy-glance-keystone-cross-tenant-sharing/</guid><pubDate>Tue, 22 Dec 2020 10:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Multi-tenancy is one of OpenStack&apos;s fundamental design principles, enabling secure resource isolation while allowing controlled sharing when needed. Understanding how this works at the architectural level, particularly the interaction between Keystone&apos;s authentication layer and Glance&apos;s image management is crucial for operating production OpenStack deployments.&lt;/p&gt;
&lt;h2&gt;OpenStack Multi-Tenancy Architecture&lt;/h2&gt;
&lt;h3&gt;Keystone: Projects, Domains, and RBAC&lt;/h3&gt;
&lt;p&gt;Keystone implements multi-tenancy through a hierarchical model:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# tree&lt;/span&gt;
Domain
  └── Projects &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Tenants&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
       └── Users + Roles&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Projects&lt;/strong&gt; (formerly called tenants) are the fundamental isolation boundary. Each project has its own quota, resource ownership, and access control. &lt;strong&gt;Domains&lt;/strong&gt; provide an additional layer of organization, allowing multiple projects to be grouped, useful for large organizations with multiple departments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Role-Based Access Control (RBAC)&lt;/strong&gt; determines what users can do within a project. Common roles include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;admin&lt;/code&gt;: Full control within a project&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;member&lt;/code&gt;: Standard user operations&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;reader&lt;/code&gt;: Read-only access&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These roles are enforced through &lt;code class=&quot;language-text&quot;&gt;policy.json&lt;/code&gt; files in each OpenStack service.&lt;/p&gt;
&lt;h3&gt;Token Scoping Mechanisms&lt;/h3&gt;
&lt;p&gt;Keystone tokens can be scoped in different ways, fundamentally changing what resources they can access:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Unscoped token - can list projects but access no resources&lt;/span&gt;
openstack token issue

&lt;span class=&quot;token comment&quot;&gt;# Project-scoped token - access resources in specific project&lt;/span&gt;
openstack --os-project-name production token issue

&lt;span class=&quot;token comment&quot;&gt;# Domain-scoped token - administrative operations across projects&lt;/span&gt;
openstack --os-domain-name engineering token issue&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When a user authenticates, Keystone returns a token containing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User identity and roles&lt;/li&gt;
&lt;li&gt;Scope (project/domain)&lt;/li&gt;
&lt;li&gt;Service catalog (API endpoints)&lt;/li&gt;
&lt;li&gt;Expiration timestamp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This token is presented to every OpenStack service (Nova, Glance, Cinder, etc.), which validates it against Keystone and enforces authorization based on the scope and roles.&lt;/p&gt;
&lt;h3&gt;Control Plane vs Data Plane Authorization&lt;/h3&gt;
&lt;p&gt;OpenStack separates two authorization layers:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Control Plane&lt;/strong&gt;: API-level authorization enforced by &lt;code class=&quot;language-text&quot;&gt;policy.json&lt;/code&gt; rules. Example from Glance:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;get_image&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;role:admin or role:member&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;add_member&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;role:admin&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;modify_member&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;role:admin&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Data Plane&lt;/strong&gt;: Database-level ownership and visibility. Even if you have API access, you can only see resources you own or that have been explicitly shared with you.&lt;/p&gt;
&lt;h2&gt;Glance Image Management Architecture&lt;/h2&gt;
&lt;p&gt;Glance is the OpenStack Image Service, responsible for discovering, registering, and delivering virtual machine images. Its architecture cleanly separates concerns.&lt;/p&gt;
&lt;h3&gt;Image Registry vs Image Store&lt;/h3&gt;
&lt;p&gt;Glance uses a two-component architecture:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;glance-registry&lt;/strong&gt;: Manages image metadata in a database (MySQL). Stores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Image properties (name, size, format, container format)&lt;/li&gt;
&lt;li&gt;Ownership (project_id)&lt;/li&gt;
&lt;li&gt;Visibility (public/private/shared/community)&lt;/li&gt;
&lt;li&gt;Custom metadata (key-value pairs)&lt;/li&gt;
&lt;li&gt;Image members (sharing relationships)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;glance-api&lt;/strong&gt;: Handles API requests and interfaces with storage backends. Acts as the gateway between clients and actual image data.&lt;/p&gt;
&lt;p&gt;This separation allows metadata operations (listing images, updating properties) to be fast database queries, while image data transfers happen through optimized storage backends.&lt;/p&gt;
&lt;h3&gt;Backend Storage Drivers&lt;/h3&gt;
&lt;p&gt;Glance supports multiple storage backends, each with different characteristics:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# In /etc/glance/glance-api.conf&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;glance_store&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
stores &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;http&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;swift&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;rbd
default_store &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rbd

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;glance_store&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;rbd&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
rbd_store_pool &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; images
rbd_store_user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; glance
rbd_store_ceph_conf &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;ceph&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;ceph&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Storage backend comparison:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ceph (RBD)&lt;/strong&gt;: High performance, distributed, supports CoW (copy-on-write) for fast cloning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Swift&lt;/strong&gt;: Object storage, highly scalable, geographically distributed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filesystem&lt;/strong&gt;: Simple, limited scalability, useful for small deployments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP&lt;/strong&gt;: Read-only store for importing images from HTTP/HTTPS URLs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Image Metadata Schema&lt;/h3&gt;
&lt;p&gt;Every image has core metadata and supports custom properties:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ openstack image create &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --disk-format qcow2 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --container-format bare &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --min-disk &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --min-ram &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--property&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;os_type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;linux &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--property&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;os_distro&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ubuntu &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--property&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;os_version&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20.04&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--file&lt;/span&gt; ubuntu-20.04.qcow2 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  ubuntu-base

+------------------+------------------------------------------------------+
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Field            &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Value                                                &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
+------------------+------------------------------------------------------+
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; checksum         &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; 4d8b3f50b6e7c8a2d9f1e3a5c6b8d9e1                     &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; container_format &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; bare                                                 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; created_at       &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2020&lt;/span&gt;-12-15T10:30:00Z                                 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; disk_format      &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; qcow2                                                &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt;             &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; /v2/images/a3c7b4d1-2e8f-4a9b-b2c1-5d6e7f8a9b0c/file &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;id&lt;/span&gt;               &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; a3c7b4d1-2e8f-4a9b-b2c1-5d6e7f8a9b0c                 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; min_disk         &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;                                                   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; min_ram          &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt;                                                 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; name             &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; ubuntu-base                                          &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; os_distro        &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; ubuntu                                               &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; os_type          &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; linux                                                &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; os_version       &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20.04&lt;/span&gt;                                                &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; owner            &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; f4e8d2c1a3b5e7d9c8b6a4f2e1d3c5b7                     &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; protected        &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; False                                                &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; schema           &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; /v2/schemas/image                                    &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; size             &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2361393152&lt;/span&gt;                                           &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; status           &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; active                                               &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; tags             &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;                                                      &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; updated_at       &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2020&lt;/span&gt;-12-15T10:31:45Z                                 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; virtual_size     &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; None                                                 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; visibility       &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; private                                              &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
+------------------+------------------------------------------------------+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Custom properties enable advanced functionality:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;hw_scsi_model=virtio-scsi&lt;/code&gt;: Use virtio SCSI for better performance&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;hw_disk_bus=scsi&lt;/code&gt;: Set disk bus type&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;os_secure_boot=required&lt;/code&gt;: Enable UEFI Secure Boot&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;img_signature&lt;/code&gt;: GPG signature for image verification&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Image Visibility States&lt;/h3&gt;
&lt;p&gt;Glance defines four visibility levels:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;public&lt;/strong&gt;: Visible to all projects (requires admin to create)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;private&lt;/strong&gt;: Visible only to owning project (default)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;shared&lt;/strong&gt;: Shared with specific projects via image members&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;community&lt;/strong&gt;: Shared with all, but not in default listings&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The state machine:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;private → shared → community
   │         ↑              ↑
   └─────────┴──────────────┘
          (admin only)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Image Membership Model&lt;/h3&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;glance.image_members&lt;/code&gt; table implements sharing (see &lt;a href=&quot;https://docs.openstack.org/glance/pike/_modules/glance/api/v2/image_members.html#/&quot;&gt;Glance API v2 Image Members implementation&lt;/a&gt;):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; image_members &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  id &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  image_id &lt;span class=&quot;token keyword&quot;&gt;VARCHAR&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  member &lt;span class=&quot;token keyword&quot;&gt;VARCHAR&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;-- target project_id&lt;/span&gt;
  can_share &lt;span class=&quot;token keyword&quot;&gt;BOOLEAN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;FALSE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ENUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;pending&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;accepted&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;rejected&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;pending&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  created_at &lt;span class=&quot;token keyword&quot;&gt;DATETIME&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  updated_at &lt;span class=&quot;token keyword&quot;&gt;DATETIME&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  deleted_at &lt;span class=&quot;token keyword&quot;&gt;DATETIME&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  deleted &lt;span class=&quot;token keyword&quot;&gt;BOOLEAN&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;FALSE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;UNIQUE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;image_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; member&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;status&lt;/code&gt; field implements a three-way handshake for sharing, preventing spam.&lt;/p&gt;
&lt;h3&gt;Image Lifecycle State Machine&lt;/h3&gt;
&lt;p&gt;Images transition through several states:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;queued → saving → active → deactivated → deleted
                    ↓
                 pending_delete&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;queued&lt;/strong&gt;: Metadata created, no data uploaded yet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;saving&lt;/strong&gt;: Data upload in progress&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;active&lt;/strong&gt;: Ready for use&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;deactivated&lt;/strong&gt;: Temporarily disabled (admin action)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pending_delete&lt;/strong&gt;: Scheduled for removal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;deleted&lt;/strong&gt;: Soft-deleted (recoverable)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cross-Tenant Image Sharing&lt;/h2&gt;
&lt;p&gt;The complete workflow for sharing an image between projects involves several steps and database changes.&lt;/p&gt;
&lt;h3&gt;The Complete API Workflow&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Image owner creates member&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# As project A (owner), share image with project B&lt;/span&gt;
$ openstack image &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; project &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  my-ubuntu-image &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;project-b-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Low-level API call&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; POST &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;X-Auth-Token: &lt;span class=&quot;token variable&quot;&gt;$TOKEN_PROJECT_A&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  http://glance:9292/v2/images/&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;/members &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{&quot;member&quot;: &quot;&amp;lt;project-b-id&gt;&quot;}&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The query that happens in database:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; image_members
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;image_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; member&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; created_at&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;image-id&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;project-b-id&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;pending&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;NOW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;At this point, project B cannot see the image yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Project B accepts the share&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# As project B, list pending shares&lt;/span&gt;
$ openstack --os-project-name project-b image member list &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Accept the share&lt;/span&gt;
$ openstack --os-project-name project-b image &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--accept&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Low-level API call&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; PUT &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;X-Auth-Token: &lt;span class=&quot;token variable&quot;&gt;$TOKEN_PROJECT_B&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  http://glance:9292/v2/images/&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;/members/&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;project-b-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{&quot;status&quot;: &quot;accepted&quot;}&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The query that happens in database:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; image_members
&lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;accepted&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; updated_at &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;NOW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; image_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;image-id&gt;&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; member &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;project-b-id&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Verification&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Project B can now see and use the image&lt;/span&gt;
$ openstack --os-project-name project-b image list

$ openstack --os-project-name project-b server create &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--image&lt;/span&gt; my-ubuntu-image &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--flavor&lt;/span&gt; m1.small &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  test-instance&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Policy.json Rules&lt;/h3&gt;
&lt;p&gt;The sharing workflow is governed by policies in &lt;code class=&quot;language-text&quot;&gt;/etc/glance/policy.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;add_member&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;role:admin or (role:member and project_id:%(owner)s)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;get_member&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;role:admin or project_id:%(owner)s or project_id:%(member)s&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;modify_member&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;role:admin or (role:member and project_id:%(member)s)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;delete_member&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;role:admin or (role:member and project_id:%(owner)s)&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Key points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only the image &lt;strong&gt;owner&lt;/strong&gt; can add members&lt;/li&gt;
&lt;li&gt;Only the &lt;strong&gt;target project&lt;/strong&gt; can accept/reject membership&lt;/li&gt;
&lt;li&gt;Both owner and member can view membership status&lt;/li&gt;
&lt;li&gt;Only owner can revoke sharing&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Keystone Token Validation Integration&lt;/h3&gt;
&lt;p&gt;When project B makes an API call to Glance:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Glance receives the request with project B&apos;s token&lt;/li&gt;
&lt;li&gt;Glance validates token with Keystone (cached for performance)&lt;/li&gt;
&lt;li&gt;Glance extracts &lt;code class=&quot;language-text&quot;&gt;project_id&lt;/code&gt; from token context&lt;/li&gt;
&lt;li&gt;Glance queries database:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; images i
&lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; image_members m &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;image_id
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;owner &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;project-b-id&gt;&apos;&lt;/span&gt;
   &lt;span class=&quot;token operator&quot;&gt;OR&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;visibility &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;public&apos;&lt;/span&gt;
   &lt;span class=&quot;token operator&quot;&gt;OR&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;member &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;project-b-id&gt;&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;accepted&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Policy.json rules are evaluated with context variables&lt;/li&gt;
&lt;li&gt;If authorized, the operation proceeds&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Sharing vs Cloning&lt;/h3&gt;
&lt;p&gt;Two approaches to make an image available across projects:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Image Sharing&lt;/strong&gt; (membership):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Single image, multiple viewers&lt;/li&gt;
&lt;li&gt;No storage duplication&lt;/li&gt;
&lt;li&gt;Owner controls lifecycle (can delete/modify)&lt;/li&gt;
&lt;li&gt;Changes propagate to all members&lt;/li&gt;
&lt;li&gt;Uses &lt;code class=&quot;language-text&quot;&gt;image_members&lt;/code&gt; table&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Image Cloning&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Download from project A&lt;/span&gt;
openstack image save &lt;span class=&quot;token parameter variable&quot;&gt;--file&lt;/span&gt; /tmp/image.qcow2 &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Upload to project B&lt;/span&gt;
openstack --os-project-name project-b image create &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--file&lt;/span&gt; /tmp/image.qcow2 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --disk-format qcow2 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  cloned-image&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Complete copy, independent lifecycle&lt;/li&gt;
&lt;li&gt;Double storage consumption&lt;/li&gt;
&lt;li&gt;Full ownership by target project&lt;/li&gt;
&lt;li&gt;Immune to source image changes&lt;/li&gt;
&lt;li&gt;Better for long-term independence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With Ceph RBD backend, cloning is more efficient:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Create copy-on-write clone (instant, no data copy)&lt;/span&gt;
rbd clone images/&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;@snap images/&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;new-image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Architectural Tradeoffs&lt;/h2&gt;
&lt;h3&gt;Sharing vs Cloning: When to Use Each&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Use sharing when:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Image is large (100GB+ VM templates)&lt;/li&gt;
&lt;li&gt;Centralized image management desired&lt;/li&gt;
&lt;li&gt;Regular updates need to propagate&lt;/li&gt;
&lt;li&gt;Storage efficiency is critical&lt;/li&gt;
&lt;li&gt;Short-term collaboration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Use cloning when:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Projects need full control&lt;/li&gt;
&lt;li&gt;Image stability required (prod vs dev)&lt;/li&gt;
&lt;li&gt;Compliance requires data isolation&lt;/li&gt;
&lt;li&gt;Projects might outlive image owner&lt;/li&gt;
&lt;li&gt;Network transfer is acceptable&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Security Boundaries and Tenant Isolation&lt;/h3&gt;
&lt;p&gt;OpenStack provides strong isolation guarantees:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Network isolation&lt;/strong&gt;: Neutron ensures projects cannot see each other&apos;s traffic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage isolation&lt;/strong&gt;: Ceph uses project-specific pools/namespaces&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compute isolation&lt;/strong&gt;: Hypervisor (KVM/QEMU) provides process isolation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API isolation&lt;/strong&gt;: All cross-tenant operations require explicit authorization&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;However, shared images introduce a trust boundary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Malicious image owner could include backdoors&lt;/li&gt;
&lt;li&gt;Image updates affect all consumers&lt;/li&gt;
&lt;li&gt;Metadata visibility (image size, format) is shared&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Best practices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use image signature verification&lt;/li&gt;
&lt;li&gt;Clone images for production workloads&lt;/li&gt;
&lt;li&gt;Implement image scanning pipelines&lt;/li&gt;
&lt;li&gt;Restrict public image creation to admins&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Advanced Topics&lt;/h2&gt;
&lt;h3&gt;Image Deactivation and Reactivation&lt;/h3&gt;
&lt;p&gt;Admins can temporarily disable images without deletion:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Deactivate image (prevents new instance creation)&lt;/span&gt;
openstack image &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--deactivate&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Existing instances continue running&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# New instance creation fails:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ERROR: Image &amp;lt;image-id&gt; is deactivated&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Reactivate when issue resolved&lt;/span&gt;
openstack image &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--activate&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Database transition:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; images &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;deactivated&apos;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;image-id&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Later...&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt; images &lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;active&apos;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;image-id&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Security vulnerability discovered&lt;/li&gt;
&lt;li&gt;Licensing issues&lt;/li&gt;
&lt;li&gt;Corrupted image data&lt;/li&gt;
&lt;li&gt;Maintenance windows&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Multi-Backend Configuration&lt;/h3&gt;
&lt;p&gt;Glance can use different backends for different images:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;glance_store&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
stores &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ceph_ssd&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;ceph_hdd&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;swift_backup
default_store &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ceph_ssd

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;glance_store&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;ceph_ssd&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
rbd_store_pool &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; images&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;fast

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;glance_store&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;ceph_hdd&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
rbd_store_pool &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; images&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;archive

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;glance_store&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;swift_backup&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
swift_store_auth_address &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; https&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;//&lt;/span&gt;swift&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;example&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;auth&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;v1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Migrating images between backends:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Copy image to different backend&lt;/span&gt;
glance --os-image-api-version &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; image-import &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--method&lt;/span&gt; copy-image &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--store&lt;/span&gt; ceph_hdd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Image Import Methods&lt;/h3&gt;
&lt;p&gt;Glance v2 supports three import methods:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. glance-direct&lt;/strong&gt; (default): Upload directly to Glance&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;openstack image create &lt;span class=&quot;token parameter variable&quot;&gt;--file&lt;/span&gt; image.qcow2 my-image&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2. web-download&lt;/strong&gt;: Glance downloads from URL&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;openstack image create my-image
openstack image &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; my-image &lt;span class=&quot;token parameter variable&quot;&gt;--property&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;hw_disk_bus&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;scsi

&lt;span class=&quot;token comment&quot;&gt;# Trigger import&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; POST &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;X-Auth-Token: &lt;span class=&quot;token variable&quot;&gt;$TOKEN&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  http://glance:9292/v2/images/&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;/import &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{
    &quot;method&quot;: {
      &quot;name&quot;: &quot;web-download&quot;,
      &quot;uri&quot;: &quot;https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img&quot;
    }
  }&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;3. copy-image&lt;/strong&gt;: Copy between Glance stores&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;glance image-import &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--method&lt;/span&gt; copy-image &lt;span class=&quot;token parameter variable&quot;&gt;--store&lt;/span&gt; swift_backup&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Image Signature Verification&lt;/h3&gt;
&lt;p&gt;For trusted image pipelines:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Generate GPG signature&lt;/span&gt;
gpg --detach-sign &lt;span class=&quot;token parameter variable&quot;&gt;--armor&lt;/span&gt; image.qcow2

&lt;span class=&quot;token comment&quot;&gt;# Upload with signature&lt;/span&gt;
openstack image create &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--file&lt;/span&gt; image.qcow2 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--property&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;img_signature&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; image.qcow2.asc &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; base64 &lt;span class=&quot;token parameter variable&quot;&gt;-w0&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--property&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;img_signature_hash_method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;SHA-256 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--property&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;img_signature_key_type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;GPG &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--property&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;img_signature_certificate_uuid&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$KEY_UUID&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  trusted-ubuntu&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nova can be configured to reject unsigned images:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ini&quot;&gt;&lt;pre class=&quot;language-ini&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;glance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;verify_glance_signatures&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Glance Integration with Cinder and Nova&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cinder (volumes from images)&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Create bootable volume from image&lt;/span&gt;
openstack volume create &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--image&lt;/span&gt; ubuntu-20.04 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--bootable&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  my-boot-volume&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Backend flow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cinder calls Glance API to get image location&lt;/li&gt;
&lt;li&gt;Cinder uses &lt;code class=&quot;language-text&quot;&gt;qemu-img convert&lt;/code&gt; or Ceph RBD clone&lt;/li&gt;
&lt;li&gt;Volume marked as bootable with image metadata&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Nova (ephemeral disk creation)&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;openstack server create &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--image&lt;/span&gt; ubuntu-20.04 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--flavor&lt;/span&gt; m1.small &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  instance-1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Backend flow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Nova queries Glance for image details&lt;/li&gt;
&lt;li&gt;Nova creates ephemeral disk (Ceph RBD clone or qcow2 backing file)&lt;/li&gt;
&lt;li&gt;Nova boots VM with disk attached&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With Ceph RBD:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Nova creates instant CoW clone&lt;/span&gt;
rbd clone images/ubuntu-20.04@snap vms/instance-1_disk&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Ceph RBD Cloning: Flatten vs Not-Flatten&lt;/h3&gt;
&lt;p&gt;When Cinder creates volumes from Glance images stored in Ceph RBD, it can either create a &lt;strong&gt;copy-on-write (CoW) clone&lt;/strong&gt; or &lt;strong&gt;flatten&lt;/strong&gt; the volume. This choice has significant performance implications for production clusters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Clone Hierarchy Problem:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Glance Image (parent)
    └── Volume Clone (child)
         └── Snapshot
              └── Another Clone (grandchild)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Each clone maintains a dependency on its parent, creating a chain that Ceph must traverse on every read operation that hasn&apos;t been overwritten yet.&lt;/p&gt;
&lt;h4&gt;Performance Impact Analysis&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Flattening (decoupling from parent):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When you flatten a volume, Ceph copies all data from the parent image into the child volume, making it independent:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Flatten a volume manually&lt;/span&gt;
rbd flatten volumes/volume-abc123&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Impact on OSDs during flattening:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Massive sequential I/O&lt;/strong&gt;: The entire parent image is copied to the volume&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OSD saturation&lt;/strong&gt;: Sequential writes can consume hundreds of MB/s per OSD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Immediate Slow Ops&lt;/strong&gt;: Other VMs experience degraded performance during the operation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duration&lt;/strong&gt;: Can take 10+ minutes for a 100GB volume depending on cluster load&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Not Flattening (keeping CoW clone):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Volumes remain as thin clones, sharing data with the parent image:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Check clone relationship&lt;/span&gt;
rbd info volumes/volume-abc123
&lt;span class=&quot;token comment&quot;&gt;# Shows: parent: images/ubuntu-20.04@snap&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Impact on ongoing operations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Random I/O spikes&lt;/strong&gt;: Every first read of a block triggers a &quot;copy-up&quot; operation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Increased metadata lookups&lt;/strong&gt;: Ceph must check parent chain for unchanged blocks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chronic Slow Ops&lt;/strong&gt;: Sustained performance degradation during normal VM operations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Higher read latency&lt;/strong&gt;: 2-10x increase for reads hitting parent blocks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deep clone chains&lt;/strong&gt;: &gt;5 levels can severely impact performance&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Cinder Configuration Options&lt;/h4&gt;
&lt;p&gt;In &lt;code class=&quot;language-text&quot;&gt;/etc/cinder/cinder.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ini&quot;&gt;&lt;pre class=&quot;language-ini&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;DEFAULT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Clone from Glance image (fast initial creation)&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;rbd_flatten_volume_from_snapshot&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;false&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Enable copy-on-read to gradually flatten on-demand&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;rbd_clone_copy_on_read&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Maximum clone depth before forcing flatten&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;rbd_max_clone_depth&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Blueprint reference&lt;/strong&gt;: &lt;a href=&quot;https://blueprints.launchpad.net/cinder/+spec/flatten-volume-from-image&quot;&gt;Cinder Flatten Volume from Image&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Real-World Impact Summary&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Impact on OSDs&lt;/th&gt;
&lt;th&gt;Consequence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flattening&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Massive, sustained sequential I/O while decoupling&lt;/td&gt;
&lt;td&gt;Immediate Slow Ops due to OSD saturation during the move&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Not Flattening&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Random I/O spikes (copy-ups) and increased metadata lookups&lt;/td&gt;
&lt;td&gt;Chronic Slow Ops during normal VM operations and high read latency&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;Production Recommendations&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;1. Use &lt;code class=&quot;language-text&quot;&gt;rbd_clone_copy_on_read = true&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This enables Copy-on-Read, which moves data to the clone upon first read, effectively &quot;flattening&quot; the image on-demand:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ini&quot;&gt;&lt;pre class=&quot;language-ini&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;DEFAULT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;rbd_clone_copy_on_read&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gradual flattening during normal operations&lt;/li&gt;
&lt;li&gt;No massive I/O spike&lt;/li&gt;
&lt;li&gt;Parent blocks copied only when accessed&lt;/li&gt;
&lt;li&gt;Eventually achieves independent volume&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. Avoid Long Clone Chains:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Limit clone depth to prevent performance degradation:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ini&quot;&gt;&lt;pre class=&quot;language-ini&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;DEFAULT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;rbd_max_clone_depth&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If your Glance configuration allows deep hierarchies (e.g., snapshot → clone → snapshot → clone), ensure you&apos;re not exceeding 5-10 levels. Each level adds latency to read operations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Flatten During Low Traffic:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you must flatten to decouple from a parent (e.g., before deleting a &quot;golden image&quot;), schedule it during off-peak hours:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Flatten all volumes derived from an image before deletion&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;vol&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;rbd &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; volumes &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; parent-image&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    rbd flatten volumes/&lt;span class=&quot;token variable&quot;&gt;$vol&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;wait&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This avoids competing with production VM traffic and prevents widespread Slow Ops warnings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Monitor Clone Depth:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Track clone chain depth in your monitoring:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Check clone depth for a volume&lt;/span&gt;
rbd info volumes/volume-abc123 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; parent

&lt;span class=&quot;token comment&quot;&gt;# Recursive script to find depth&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-name function&quot;&gt;clone_depth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;depth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; rbd info &lt;span class=&quot;token variable&quot;&gt;$img&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;/dev/null &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-q&lt;/span&gt; parent&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
        &lt;span class=&quot;token assign-left variable&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;rbd info $img &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; parent &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;{print $2}&apos;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;((&lt;/span&gt;depth&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$depth&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

clone_depth volumes/volume-abc123&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alert when depth exceeds 5 to trigger manual flattening or investigation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Pre-flatten Critical Workload Volumes:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For performance-sensitive workloads (databases, high-IOPS applications), flatten volumes immediately after creation:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Create volume from image&lt;/span&gt;
openstack volume create &lt;span class=&quot;token parameter variable&quot;&gt;--image&lt;/span&gt; ubuntu-db &lt;span class=&quot;token parameter variable&quot;&gt;--size&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt; db-volume

&lt;span class=&quot;token comment&quot;&gt;# Get volume ID and flatten&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;VOL_ID&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;openstack volume show db-volume &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; value &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
rbd flatten volumes/volume-&lt;span class=&quot;token variable&quot;&gt;$VOL_ID&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This ensures predictable, low-latency I/O without parent lookups.&lt;/p&gt;
&lt;h4&gt;Debugging Clone-Related Performance Issues&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Symptom&lt;/strong&gt;: VMs experience high I/O latency and Ceph shows &quot;slow ops&quot;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Check for slow ops in Ceph&lt;/span&gt;
ceph health detail
&lt;span class=&quot;token comment&quot;&gt;# HEALTH_WARN 15 slow ops, oldest one blocked for 32 sec&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Identify which volumes have deep clone chains&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;vol&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;rbd &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; volumes&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;depth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;clone_depth volumes/$vol&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$depth&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-gt&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Volume &lt;span class=&quot;token variable&quot;&gt;$vol&lt;/span&gt; has depth &lt;span class=&quot;token variable&quot;&gt;$depth&lt;/span&gt;&quot;&lt;/span&gt;
        rbd info volumes/&lt;span class=&quot;token variable&quot;&gt;$vol&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Flatten volumes with deep chains during maintenance window or enable &lt;code class=&quot;language-text&quot;&gt;rbd_clone_copy_on_read&lt;/code&gt; to gradually resolve the issue.&lt;/p&gt;
&lt;h2&gt;Technical Troubleshooting&lt;/h2&gt;
&lt;h3&gt;Keystone Role Assignment Issues&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Issue&lt;/strong&gt;: Member acceptance fails with 403 Forbidden.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ glance member-update &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;project-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; accepted
&lt;span class=&quot;token number&quot;&gt;403&lt;/span&gt; Forbidden: Policy doesn&apos;t allow modify_member to be performed&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Diagnosis&lt;/strong&gt;: Verify user has correct role in target project:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;openstack role assignment list &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--user&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$USER_ID&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--project&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$PROJECT_ID&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--names&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;openstack role &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--user&lt;/span&gt; john.doe &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--project&lt;/span&gt; project-b &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  member&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Image Member State Machine Errors&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Issue&lt;/strong&gt;: Image shows as shared but isn&apos;t visible in target project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diagnosis&lt;/strong&gt;: Check member status in database:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;member &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; project_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;created_at
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; images i
&lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; image_members m &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;image_id
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;image-id&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Expected output:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;+------------+------------------+----------+---------------------+
| name       | project_id       | status   | created_at          |
+------------+------------------+----------+---------------------+
| my-ubuntu  | abc123...        | accepted | 2020-01-22 10:30:00 |
+------------+------------------+----------+---------------------+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If &lt;code class=&quot;language-text&quot;&gt;status = &apos;pending&apos;&lt;/code&gt;, the target project needs to accept:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;glance member-update &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;image-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;project-id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; accepted&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Storage Backend Connectivity Problems&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Issue&lt;/strong&gt;: Image uploads hang or fail with timeout.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diagnosis&lt;/strong&gt;: Test Ceph connectivity:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Check Ceph cluster health&lt;/span&gt;
ceph health detail

&lt;span class=&quot;token comment&quot;&gt;# Test RBD access with Glance credentials&lt;/span&gt;
rbd &lt;span class=&quot;token parameter variable&quot;&gt;--id&lt;/span&gt; glance &lt;span class=&quot;token parameter variable&quot;&gt;--keyring&lt;/span&gt; /etc/ceph/ceph.client.glance.keyring &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; images

&lt;span class=&quot;token comment&quot;&gt;# Monitor Glance API logs&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tail&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; /var/log/glance/glance-api.log &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; error&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Common errors:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ERROR glance.common.client [req-...] Connection timeout to Ceph cluster&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;: Verify network connectivity and credentials:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Test network to Ceph monitors&lt;/span&gt;
telnet ceph-mon-1 &lt;span class=&quot;token number&quot;&gt;6789&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Verify keyring permissions&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-la&lt;/span&gt; /etc/ceph/ceph.client.glance.keyring
&lt;span class=&quot;token comment&quot;&gt;# Should be readable by glance user&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Debugging with Glance Logs and SQL Queries&lt;/h3&gt;
&lt;p&gt;Enable debug logging in &lt;code class=&quot;language-text&quot;&gt;/etc/glance/glance-api.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ini&quot;&gt;&lt;pre class=&quot;language-ini&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;DEFAULT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;True&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;log_file&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;/var/log/glance/glance-api.log&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Monitor API requests:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tail&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; /var/log/glance/glance-api.log &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-E&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;(POST|PUT|DELETE|ERROR)&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Useful database queries:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;-- Find all images shared with project&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;owner&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;visibility&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; share_status
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; images i
&lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; image_members m &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;image_id
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;member &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;project-id&gt;&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;OR&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;owner &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;project-id&gt;&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;created_at &lt;span class=&quot;token keyword&quot;&gt;DESC&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;-- Find orphaned image members (target project deleted)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; image_members m
&lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; keystone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;project p &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;member &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;deleted &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;-- Check image storage usage by project&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  owner &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; project_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; image_count&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_gb
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; images
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; deleted &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; owner
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; total_gb &lt;span class=&quot;token keyword&quot;&gt;DESC&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;OpenStack&apos;s multi-tenancy architecture demonstrates sophisticated separation of concerns: Keystone handles authentication and authorization, Glance manages image lifecycle and metadata, and the cross-tenant sharing mechanism provides controlled collaboration without sacrificing isolation.&lt;/p&gt;
&lt;p&gt;Understanding these internals, from token scoping to database schema to policy enforcement, enables operators to troubleshoot issues quickly, implement custom workflows, and optimize for specific use cases. The key insight is that multi-tenancy isn&apos;t just API-level filtering; it&apos;s a comprehensive system spanning authentication tokens, database constraints, policy rules, and storage backends working together to provide both isolation and controlled sharing.&lt;/p&gt;
&lt;p&gt;For production deployments, remember:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use image signature verification for security&lt;/li&gt;
&lt;li&gt;Clone images for critical workloads to avoid dependency on other projects&lt;/li&gt;
&lt;li&gt;Monitor quota usage and enforce limits at both API and database layers&lt;/li&gt;
&lt;li&gt;Implement proper RBAC through Keystone and policy.json&lt;/li&gt;
&lt;li&gt;Choose storage backends based on your performance and scale requirements&lt;/li&gt;
&lt;li&gt;Maintain detailed logs for audit and troubleshooting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The multi-tenancy model is what makes OpenStack suitable for large-scale cloud deployments, enabling thousands of projects to safely coexist while sharing infrastructure efficiently.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Special thanks to my mentor whose blog posts on OpenStack provided foundational knowledge for this deep dive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://misskecupbung.wordpress.com/2018/05/17/layanan-keystone-untuk-autentikasi-identitas-di-openstack-bagian-2/#/&quot;&gt;Layanan Keystone untuk Autentikasi Identitas di OpenStack (Bagian 2)&lt;/a&gt; - Comprehensive guide to Keystone authentication and identity services&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://misskecupbung.wordpress.com/2018/07/29/openstack-image-service-managing-snapshots-backups/&quot;&gt;OpenStack Image Service: Managing Snapshots &amp;#x26; Backups&lt;/a&gt; - Detailed coverage of Glance image management&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.openstack.org/glance/latest/&quot;&gt;OpenStack Glance Official Documentation&lt;/a&gt; - Glance architecture and API&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blueprints.launchpad.net/cinder/+spec/flatten-volume-from-image&quot;&gt;Cinder Flatten Volume from Image Blueprint&lt;/a&gt; - Specification for Ceph RBD volume flattening feature&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Centralized Logging Dengan Graylog]]></title><description><![CDATA[Apa itu Centralized Logging ? Centralized Loging, jika diBahasa-kan (Pencatatan yang tersentralisasi). Sentralisasi logingg di sini dapat…]]></description><link>https://nicolas.my.id/centralized-logging-dengan-graylog/</link><guid isPermaLink="false">https://nicolas.my.id/centralized-logging-dengan-graylog/</guid><pubDate>Wed, 16 Sep 2020 06:44:58 GMT</pubDate><content:encoded>&lt;h3&gt;Apa itu Centralized Logging ?&lt;/h3&gt;
&lt;p&gt;Centralized Loging, jika diBahasa-kan &lt;em&gt;(Pencatatan yang tersentralisasi)&lt;/em&gt;. Sentralisasi logingg di sini dapat diartikan dimana terdapat berbagai sumber &lt;code class=&quot;language-text&quot;&gt;log&lt;/code&gt;, yang di dorong ke satu pusat antarmuka. Di antarmuka tersebut kita dapat melakukan penguraian, penambahan, dan pemantauan waktu nyata terhadap semua data-data &lt;code class=&quot;language-text&quot;&gt;log&lt;/code&gt; tersebut.&lt;/p&gt;
&lt;p&gt;Pada tulisan Saya kali ini, Saya akan memberikan ringkasan langkah-langkah dalam &lt;em&gt;installasi&lt;/em&gt; Graylog kluster sederhana sebagai &lt;em&gt;Centralized Logging&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;Topologi&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/efc363b2b326fbaa9170f8d83e2937ed/fdaf8/Case-Topology.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51.89873417721519%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoUlEQVR42m1RW3OaQBT2//+G9iEP7VszmabTTl9MWx2DMYoJBh1DhAV2uS97YwFXIESnD2n93s6Z+W7nDAghGGN6BMH5avmoz+YPc305110XFFJxoQrZJmmOEOy6rm3b7i8GQoimaU5DTW2WTWiqFfk0efqlqj1PbmLvIvM+ZWiNgvgM+XBQbfvGp+HuWf9pGUNnNfSexmqvCDY9cBN4v6Ngi1B03rnfNJVSxb5T3UFUTXlo6lYVdVM23TGWLEr4f+y+su9P4+gW2sahwAVZsOhehHfUXtU0ZmjC8EIks3A1dnZOTzg6tSeJQYZTTbsaDi+M1S0Jgalfmg/ftsZXsNEwsp+Na1P7sllcrRffbWv3r7OUJWOCc8m56A/OqOBUUMJREMIggC6EtosA9GGA87zvyDjhnFCKSykH3XuchKuqytKE4RQDN4mTu9HoUdOWs3vfh5ztOd3HEXEAGLTvcXqbLOoitTge5dYPhhyZrVPnmrzMBAaR+zEAH8D6s9uTzzrXtUrgzjJH9maShl6KXizzT+CYJAsDXwvhdLcduwC8AodMKPtofpfvAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Topologi&quot;
        title=&quot;&quot;
        src=&quot;/static/efc363b2b326fbaa9170f8d83e2937ed/f058b/Case-Topology.png&quot;
        srcset=&quot;/static/efc363b2b326fbaa9170f8d83e2937ed/c26ae/Case-Topology.png 158w,
/static/efc363b2b326fbaa9170f8d83e2937ed/6bdcf/Case-Topology.png 315w,
/static/efc363b2b326fbaa9170f8d83e2937ed/f058b/Case-Topology.png 630w,
/static/efc363b2b326fbaa9170f8d83e2937ed/fdaf8/Case-Topology.png 674w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
Topologi di atas adalah infrastruktur yang akan kita coba untuk bangun.&lt;/p&gt;
&lt;h3&gt;Dependency&lt;/h3&gt;
&lt;p&gt;Langkah pertama adalah melakukan pemasangan &lt;code class=&quot;language-text&quot;&gt;Dependency&lt;/code&gt; yang dibutuhkan oleh graylog :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install Dependency&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; upgrade
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; apt-transport-https openjdk-8-jre-headless uuid-runtime pwgen&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;The Stack&lt;/h3&gt;
&lt;p&gt;Untuk membangun Graylog Server yang siap digunakan, ada graylog-server memberlukan integrasi dengan beberapa perangkat lunak lain diantaranya Elasticsearch dan MongoDB :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install MongoDB&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; apt-key adv &lt;span class=&quot;token parameter variable&quot;&gt;--keyserver&lt;/span&gt; hkp://keyserver.ubuntu.com:80 &lt;span class=&quot;token parameter variable&quot;&gt;--recv&lt;/span&gt; 9DA31620334BD75D9DCB49F368818C72E52529D4
$ &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; /etc/apt/sources.list.d/mongodb-org-4.0.list
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; mongodb-org
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl daemon-reload
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; mongod.service
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl restart mongod.service
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token parameter variable&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;service &lt;span class=&quot;token parameter variable&quot;&gt;--state&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;active &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; mongod&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Install Elasticsearch&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-q&lt;/span&gt; https://artifacts.elastic.co/GPG-KEY-elasticsearch &lt;span class=&quot;token parameter variable&quot;&gt;-O&lt;/span&gt; myKey
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; apt-key &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; myKey
$ &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;deb https://artifacts.elastic.co/packages/oss-6.x/apt stable main&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-a&lt;/span&gt; /etc/apt/sources.list.d/elastic-6.x.list
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; elasticsearch-oss
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-a&lt;/span&gt; /etc/elasticsearch/elasticsearch.yml &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /dev/null &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;EOT
cluster.name: graylog
action.auto_create_index: false
EOT&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl daemon-reload
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; elasticsearch.service
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl restart elasticsearch.service
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token parameter variable&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;service &lt;span class=&quot;token parameter variable&quot;&gt;--state&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;active &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; elasticsearch&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Install Graylog Server&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt; https://packages.graylog2.org/repo/packages/graylog-3.3-repository_latest.deb
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dpkg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; graylog-3.3-repository_latest.deb
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; graylog-server graylog-enterprise-plugins graylog-integrations-plugins graylog-enterprise-integrations-plugins
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-E&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;s/password_secret =.*/password_secret = &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;pwgen &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;/&quot;&lt;/span&gt; /etc/graylog/server/server.conf
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;s/root_password_sha2 =.*/root_password_sha2 = &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;InP8TP@AsssowrdKamudiSini&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; shasum &lt;span class=&quot;token parameter variable&quot;&gt;-a&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cut&lt;/span&gt; -d&lt;span class=&quot;token string&quot;&gt;&apos; &apos;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f1&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;/&quot;&lt;/span&gt; /etc/graylog/server/server.conf
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;s/#http_bind_address\s=\s127.0.0.1:9000/http_bind_address = 10.252.10.81:9000/g&quot;&lt;/span&gt; /etc/graylog/server/server.conf
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl daemon-reload
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; graylog-server.service
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl start graylog-server.service
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token parameter variable&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;service &lt;span class=&quot;token parameter variable&quot;&gt;--state&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;active &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; graylog&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cek apakah graylog-server sudah berasil &lt;em&gt;bind&lt;/em&gt; port 9000&lt;/p&gt;
&lt;p&gt;Web interface Graylog dapat diakses sekitar 2-3 menit setelah service graylog-server di-&lt;em&gt;start&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10.252&lt;/span&gt;.10.81:9000
&lt;span class=&quot;token function&quot;&gt;netstat&lt;/span&gt; -nputw&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9000&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Integrasi Inputs Logs&lt;/h3&gt;
&lt;p&gt;Untuk melakukan &lt;em&gt;input log&lt;/em&gt; ke graylog kita memberlukan sebuah &lt;em&gt;forwarder log message&lt;/em&gt; yang berfungsi sebagai pengirim logs ke graylog server. Cukup banyak &lt;em&gt;Forwarder&lt;/em&gt; yang dapat digunakan diantaranya &lt;strong&gt;Ryslog, Filebeat, Fluentd, dan Khusus untuk Docker Gelf(Graylog Extended Format logging driver)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ryslogs&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install rsyslog&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; ryslog &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;vi&lt;/span&gt; /etc/rsyslog.d/graylog.conf
  *.* @10.252.10.81:1514&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;RSYSLOG_SyslogProtocol23Format&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;10.252.10.81&lt;/code&gt;, Merupakan alamat IP graylog server.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;1514&lt;/code&gt;, Meruapakan port yang &lt;em&gt;listent&lt;/em&gt; input dengan format syslog&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gelf&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; run &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8889&lt;/span&gt;:80 --log-driver&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;gelf --log-opt gelf-address&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;udp://10.252.10.81:18312 httpd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--log-driver=gelf&lt;/code&gt;, Adalah yang kita butuhkan untuk menggunakan gelf sebagai forwarder logs menuju graylog server.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--log-opt gelf-address=udp://10.252.10.81:18312&lt;/code&gt;, dibutuhkan untuk memberitahukan alamat dan port yang me-&lt;em&gt;listent&lt;/em&gt; gelf input pada graylog server.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Bug Hunting di Platform Tokopedia]]></title><description><![CDATA[5 Februari 2020, Bulan dimana saya memasuki bulan ke-2 program apprentice di salah satu IT Konsultan di Bogor. Semua berawal ketika saya…]]></description><link>https://nicolas.my.id/temuan-bug-di-tokopedia/</link><guid isPermaLink="false">https://nicolas.my.id/temuan-bug-di-tokopedia/</guid><pubDate>Mon, 07 Sep 2020 06:44:58 GMT</pubDate><content:encoded>&lt;p&gt;5 Februari 2020, Bulan dimana saya memasuki bulan ke-2 program &lt;em&gt;apprentice&lt;/em&gt; di salah satu IT Konsultan di Bogor.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Semua berawal ketika saya duduk di kursi kerja, dan merasa bosan, karena sudah menyelesaikan pekerjaan saya. Seketika langsung saja saya ketikkan di terminal kesayangan &lt;code class=&quot;language-text&quot;&gt;amass enum -d tokopedia.net,tokopedia.com -json tokopedia-subdomains.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Menunggu dengan mata yang sayup-sayup mengantuk saat tengah hari, di bawah AC yang sangat dingin. Saya lihat hasil output dari amass &lt;code class=&quot;language-text&quot;&gt;cat tokopeda-subdomains.json | jq &apos;.name&apos; | tr -d &apos;&quot;&apos;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Saya mencoba melihat baris demi baris, dari nama-nama &lt;em&gt;subdomain&lt;/em&gt; yang didapat, tapi tak ada yang menarik.
Kemudian saya lanjutkan melakukan &lt;em&gt;request&lt;/em&gt; ke semua subdomain yang didapat untuk mengetahui protokol yang tersedia &lt;em&gt;&lt;strong&gt;http/https&lt;/strong&gt;&lt;/em&gt; &lt;code class=&quot;language-text&quot;&gt;cat tokopeda-subdomains.json | jq &apos;.name&apos; | tr -d &apos;&quot;&apos;| httprobe | tee -a results&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Lalu saya melakukan &lt;em&gt;request&lt;/em&gt; lagi menggunakan &lt;code class=&quot;language-text&quot;&gt;meg&lt;/code&gt; untuk mendapatkan semua &lt;em&gt;content&lt;/em&gt;, yang ada di setiap &lt;strong&gt;subdomain&lt;/strong&gt;, &lt;code class=&quot;language-text&quot;&gt;meg / results all-front-index&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Argumen &lt;code class=&quot;language-text&quot;&gt;/&lt;/code&gt; digunakan untuk men-spesifikasikan path apa yang akan coba diakses, dalam kasus ini saya menggunakan &lt;code class=&quot;language-text&quot;&gt;/&lt;/code&gt;, contoh &lt;em&gt;request&lt;/em&gt; yang akan terbuat adalah &lt;code class=&quot;language-text&quot;&gt;tokopedia.com/&lt;/code&gt;yang mana seharusnya akan mengarah ke front page index  halaman domain tersebut.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Argumen &lt;code class=&quot;language-text&quot;&gt;results&lt;/code&gt; merupakan nama file yang berisikan list &lt;code class=&quot;language-text&quot;&gt;domain&lt;/code&gt; lengkap dengan protokol yang terdeteksi oleh &lt;code class=&quot;language-text&quot;&gt;httprope&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Argumen &lt;code class=&quot;language-text&quot;&gt;all-front-index&lt;/code&gt;, merupakan nama folder yang akan terbuat dan menyimpan semua content hasil dari &lt;code class=&quot;language-text&quot;&gt;request&lt;/code&gt; yang dilakukan oleh meg.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Setelah proses &lt;em&gt;request&lt;/em&gt; menggunakan &lt;code class=&quot;language-text&quot;&gt;meg&lt;/code&gt; selesai, langsung saja saya berpindah direktori &lt;code class=&quot;language-text&quot;&gt;cd all-front-index&lt;/code&gt;, dan eksekusi &lt;code class=&quot;language-text&quot;&gt;gf urls&lt;/code&gt;, maka munculah semua &lt;code class=&quot;language-text&quot;&gt;string&lt;/code&gt; yang &lt;code class=&quot;language-text&quot;&gt;match&lt;/code&gt; dengan &lt;strong&gt;pattern regex url&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dengan mata yang semakin mengantuk, saya melihat ke baris demi baris berharap dewi fortuna berpihak, dan terlihatlah sesuatu yang menarik perhatian saya.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 510px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/335b1ad85b20f9cd8d1ebb50610dcc50/0abdd/1This_Bug.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 4.430379746835443%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAIAAABR8BlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAPUlEQVR42g3KsQ6AIBBEwSv23nYWFiYqKCbA/3+ilJNM7NI0p9Rh4CfzkD6Y9iUtvtCgZN5SNWVzVa4QET9i7gMQ+P/NtAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Match Patter Regex URL &quot;
        title=&quot;&quot;
        src=&quot;/static/335b1ad85b20f9cd8d1ebb50610dcc50/0abdd/1This_Bug.png&quot;
        srcset=&quot;/static/335b1ad85b20f9cd8d1ebb50610dcc50/c26ae/1This_Bug.png 158w,
/static/335b1ad85b20f9cd8d1ebb50610dcc50/6bdcf/1This_Bug.png 315w,
/static/335b1ad85b20f9cd8d1ebb50610dcc50/0abdd/1This_Bug.png 510w&quot;
        sizes=&quot;(max-width: 510px) 100vw, 510px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Dengan sedikit harapan, percobaan eksekusi XSS dimulai :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;https://www.tokopedia.com/amp/find/&amp;lt;script&gt;alert(1)&amp;lt;/script&gt;&lt;/code&gt; &lt;strong&gt;Fail&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;https://www.tokopedia.com/amp/find/&quot;&gt;&amp;lt;img src onerror=alert(1)&quot;&amp;lt;/script&gt;&lt;/code&gt; &lt;strong&gt;Fail&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;https://www.tokopedia.com/amp/find/{&gt;&amp;lt;img src onerror=alert(document.domain)}&lt;/code&gt; &lt;strong&gt;XSS Fired&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dengan menambahkan &lt;em&gt;cruly brackets&lt;/em&gt;, filter content yang telah diterapkan di &lt;em&gt;input form&lt;/em&gt; tersebut di-&lt;em&gt;render&lt;/em&gt;, menjadi bagian dari halamat tersebut.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 566px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c6fdc35e6cc1497d1f5d17b91151e305/6fe44/1Bagian.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 41.139240506329116%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsTAAALEwEAmpwYAAABXklEQVR42m1PTU/CQBDdYMWTRm4mBlsSIUJivHlST/wkj574CgUl+BPgpBw4IvEnmHj3CnZLu/3gq+3Sbbt1BC4aXt5mZmfmvcwgSZQKhUL+Ig8Uz8SMlMmIUvo0nTpOCXsC2gVB2E8mDxKJBMplc9nzLMiKxWK7/SzLj5VKrV5v1qr1crkKLJUqUAFCIstNaF5fXp0cHt3c3qHWU6vZaDbkRqfTnUw0RcGj0fj7G2N1oulEX9MwTEIM+JuWrRPzfTDsv/YGb0PEGPN933VcQsh8PldVVQEDjA1iYAXPZrOY8yAIwjCMonCTcM7jOIYEsYAFITzmUQ9gmRbIbNt2XZevEe8AFHnAGHJ8h7gGDemSOlEU/Y5HuzWb0oLy/iftfXjalCHq0dUasPlW/A/xNkITHPQFf3hR77vjL7xCcLCzdOAYaK/A5y9hf03TiE7AGsY0TbdMw5kaPPCc5eIHG/BruooxrtQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Match Patter Regex URL &quot;
        title=&quot;&quot;
        src=&quot;/static/c6fdc35e6cc1497d1f5d17b91151e305/6fe44/1Bagian.png&quot;
        srcset=&quot;/static/c6fdc35e6cc1497d1f5d17b91151e305/c26ae/1Bagian.png 158w,
/static/c6fdc35e6cc1497d1f5d17b91151e305/6bdcf/1Bagian.png 315w,
/static/c6fdc35e6cc1497d1f5d17b91151e305/6fe44/1Bagian.png 566w&quot;
        sizes=&quot;(max-width: 566px) 100vw, 566px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Seketika mata saya yang sebelumnya mengantuk berat, jadi bagaikan terkena boncabai..&lt;/p&gt;
&lt;p&gt;Dari saat itu saya cukup rajin untuk melakukan uji coba ke beberapa scope tokopedia.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e7330b2fe620ade0222e69aaf95a7c9f/27b7a/1Bugs.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.48101265822784%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsTAAALEwEAmpwYAAACF0lEQVR42m2TW2sVMRSF5///CB/7pAi+lEKxIIpv4gWsbanWKnpmzpn7STJJdhK/JArewjkh2Vn7svZe00zTeOh7a23X7uZpss4e9vuubY3Z1mXZ7TDOWuuu68BwnabJOdf3vdam4bRZ670PMfLzXI0BjR00B/Zt247Ho/eOawhBvMeGSwNUMDj79uTB1ZOHKaVxGJXSHIAOw8BjjFEpJSLGmHVdiatcCjE1Ma/Ef923x67lrI0GhzMg0FhYhKh7jRWKsaFEB9Ta/uSR+/oN49D3FFkzj+NY4SQkotZqWRaCrjYJmVNdxF9V8lgSDGtmWHH+9R7TP4uG2czZuw+nj28vzoBM40/O8IRzDVQj0kOIeJHNF865z9QVwnB7Pd3fgaO9leFvmSNGCVJHQxQrudZGypBikP3V++HjTSwJCV8axqiUlEC41SH5cnChOIPILfH+9vz0y8tnOCOA6sw+z3Nli2Z8Hq/VjPaPsnkXad+9PlxfAqTVtVqgSh0zhRgrl5L4f5lvLs7unj+NWSTDVjJTM2IsmSNizFT/ysyc6QFqUK/e+HGy4uk2UyUJO92m+CwppSiHydeDyjbfcMvOWvfnL/T3gw1SRpXFiB5wJhtAuJAcO8YsUuMszpAok5QUPiV7LxJ4JkNt2DIvlEDldUL1aymjYrgxf1U4INu0XibzOSttXfkwqzA4F/HHrI3aba29eCOZ8w9rtp3dBpKWOAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Bugs&quot;
        title=&quot;&quot;
        src=&quot;/static/e7330b2fe620ade0222e69aaf95a7c9f/f058b/1Bugs.png&quot;
        srcset=&quot;/static/e7330b2fe620ade0222e69aaf95a7c9f/c26ae/1Bugs.png 158w,
/static/e7330b2fe620ade0222e69aaf95a7c9f/6bdcf/1Bugs.png 315w,
/static/e7330b2fe620ade0222e69aaf95a7c9f/f058b/1Bugs.png 630w,
/static/e7330b2fe620ade0222e69aaf95a7c9f/27b7a/1Bugs.png 804w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Untuk soal &quot;Reward&quot; di tokopedia memang tidak sebesar &lt;em&gt;big company&lt;/em&gt; di hackerone dan Bugcrowd. &lt;em&gt;But, money is the not only priority, maybe money&apos;s the motivation; but not one and only.&lt;/em&gt;&lt;/p&gt;</content:encoded></item></channel></rss>