<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Archives des Kubernetes - dbi Blog</title>
	<atom:link href="https://www.dbi-services.com/blog/category/kubernetes/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.dbi-services.com/blog/category/kubernetes/</link>
	<description></description>
	<lastBuildDate>Wed, 14 Jan 2026 08:35:46 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/05/cropped-favicon_512x512px-min-32x32.png</url>
	<title>Archives des Kubernetes - dbi Blog</title>
	<link>https://www.dbi-services.com/blog/category/kubernetes/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Access your Kubernetes pods via Tailscale using a Sidecar container</title>
		<link>https://www.dbi-services.com/blog/access-your-kubernetes-pods-via-tailscale-using-a-sidecar-container/</link>
					<comments>https://www.dbi-services.com/blog/access-your-kubernetes-pods-via-tailscale-using-a-sidecar-container/#respond</comments>
		
		<dc:creator><![CDATA[Rémy Gaudey]]></dc:creator>
		<pubDate>Tue, 13 Jan 2026 09:00:00 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[kubernetes]]></category>
		<category><![CDATA[speedtest-tracker]]></category>
		<category><![CDATA[tailscale]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=42364</guid>

					<description><![CDATA[<p>Tailscale is a mesh VPN (Virtual Private Network) service that streamlines connecting devices and services securely across different networks. It enables encrypted point-to-point connections using the open source WireGuard protocol, which means only devices on your private network can communicate with each other. (source: https://tailscale.com/kb/1151/what-is-tailscale) I’ve been using Tailscale to connect my personal devices for [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/access-your-kubernetes-pods-via-tailscale-using-a-sidecar-container/">Access your Kubernetes pods via Tailscale using a Sidecar container</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Tailscale is a mesh VPN (Virtual Private Network) service that streamlines connecting devices and services securely across different networks. It enables encrypted point-to-point connections using the open source WireGuard protocol, which means only devices on your private network can communicate with each other. <br>(source: <a href="https://tailscale.com/kb/1151/what-is-tailscale">https://tailscale.com/kb/1151/what-is-tailscale</a>)</p>



<p class="wp-block-paragraph">I’ve been using Tailscale to connect my personal devices for a while. I have it installed almost everywhere: on my laptop, my phone, my Synology NAS, etc. It is very convenient as it helps me connect to any device, from anywhere. Tailscale adds a virtual interface to your device and manages its own IP address (you’ll understand why this is important in a minute)</p>



<p class="wp-block-paragraph">Tailscale automatically assigns a unique IP address to each device in your Tailscale network (known as a tailnet). This IP address is known as a Tailscale IP address and comes from the shared address space defined in RFC6598, known as Carrier-Grade NAT (CGNAT). <br>(source: <a href="https://tailscale.com/kb/1015/100.x-addresses">https://tailscale.com/kb/1015/100.x-addresses</a>)</p>



<p class="wp-block-paragraph">Today, I’m taking it to the next level: I’d like to install Tailscale alongside one of my application pod and access the web interface my pod exposes, directly from my Tailscale network (aka Tailnet).</p>



<h2 class="wp-block-heading" id="h-the-challenge"><strong>The challenge:</strong></h2>



<p class="wp-block-paragraph">I’ve installed Tailscale on the VM hosting my Kubernetes cluster (it’s a 1 node cluster, just for playing). Cool, I can access the VM from any other device. However, what about the web app my pod provides? How can I access it from my Tailnet?<br><br>As mentioned before, Tailscale has its own IP addressing, using 100.x.y.z addresses : your devices are assigned an IP from this address space.</p>



<p class="wp-block-paragraph">Moreover, the network interface Tailscale creates (tailscale0) is not a standard interface and Kubernetes cannot simply expose services through that interface as for any other NodePort. To do so, you need to deploy Tailscale in your Kubernetes cluster.</p>



<p class="wp-block-paragraph">Let’s do that.</p>



<h2 class="wp-block-heading" id="h-the-options"><strong>The options:</strong></h2>



<p class="wp-block-paragraph" id="h-the-options-tailscale-offers-several-options-to-connect-your-cluster-to-your-tailnet">Tailscale offers several options to connect your cluster to your tailnet:</p>



<ul class="wp-block-list">
<li><strong>Proxy</strong>: Tailscale proxies traffic to one of your Kubernetes services. Your tailnet devices can communicate with the service but not with any other Kubernetes resources. Tailscale users can reach the service using the proxy&#8217;s name.</li>



<li><strong>Sidecar</strong>: Tailscale runs as a sidecar next to a specific pod in your cluster. It lets you expose that pod on your tailnet without allowing access to any others. Tailscale users can connect to the pod using its name.</li>



<li><strong>Subnet router</strong>: A subnet router deployment exposes your entire cluster network in your tailnet. Your Tailscale devices can connect to any pod or service in your cluster, provided that applicable Kubernetes network policies and Tailscale access controls allow it.</li>
</ul>



<p class="wp-block-paragraph">My use-case is to expose a specific pod to my tailnet (my speedtest-tracker app frontend), the “sidecar” option is then enough for my need.<br>Let’s see how to configure that together.<br><br>I invite you to read <a href="https://www.dbi-services.com/blog/monitor-your-isps-performance-with-speedtest-tracker/">my other blog about speedtest-tracker</a>. This is the app we are going to work with today.<br>I’ve been using speedtest-tracker for a while, but the app is only available from within my local network for now. Let’s see how to adapt my app’s deployment definition to add the Tailscale sidecar container.</p>



<h2 class="wp-block-heading" id="h-what-we-need"><strong>What we need:</strong></h2>



<ol class="wp-block-list">
<li>An application (that’s my speedtest-tracker app that already exists)</li>



<li>To generate an auth key that will be used by the Tailscale service deployed into the cluster</li>



<li>A secret with this auth key value in my cluster, for my pod to authenticate to my Tailscale account.</li>



<li>A service account, role and role binding to configure RBAC for my deployment ( my pod will use this service account and RBAC permissions to interact with the cluster)</li>



<li>Finally, I will add the sidecar container running Tailscale alongside my speedtest-tracker app container</li>
</ol>



<h2 class="wp-block-heading" id="h-generate-an-auth-key">Generate an auth key</h2>



<p class="wp-block-paragraph">First, let’s generate the auth key from my Tailscale account web interface. <br>This is done under Settings &#8211;&gt; Keys &#8211;&gt; Generate auth key…</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="645" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/BLOG-auth-ky-1024x645.png" alt="" class="wp-image-42368" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/BLOG-auth-ky-1024x645.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/BLOG-auth-ky-300x189.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/BLOG-auth-ky-768x483.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/BLOG-auth-ky-1536x967.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/BLOG-auth-ky-2048x1289.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Fill out the form, and make the key reusable. Then configure the device this key applies to as ephemeral (so is your pod).<br>Copy the key value somewhere as we are going to need it in a moment.</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="508" height="708" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/BLOG-auth-ky2.png" alt="" class="wp-image-42369" style="width:418px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/BLOG-auth-ky2.png 508w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/BLOG-auth-ky2-215x300.png 215w" sizes="(max-width: 508px) 100vw, 508px" /></figure>



<h2 class="wp-block-heading" id="h-create-a-secret">Create a secret</h2>



<p class="wp-block-paragraph">I create my secret, here is my tailscale-secret.yaml file:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
apiVersion: v1
kind: Secret
metadata:
  name: tailscale-auth
stringData:
  TS_AUTHKEY: &lt;my key value from previous step&gt;
</pre></div>


<p class="wp-block-paragraph">I apply the configuration to my speedtest namespace:</p>



<pre class="wp-block-code"><code>kubectl apply -f tailscale-secret.yaml -n speedtest</code></pre>



<h2 class="wp-block-heading">Service account, role and role binding</h2>



<p class="wp-block-paragraph">Next step is to configure RBAC for my Tailscale deployment. I need a service account, a role and role binding. Lucky me, Tailscale doc is well written, all I need is to follow their instructions.</p>



<p class="wp-block-paragraph">I create a manifest called tailscale-rbac.yaml:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tailscale

---

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: tailscale
rules:
  - apiGroups: &#x5B;&quot;&quot;]
    resourceNames: &#x5B;&quot;tailscale-auth&quot;]
    resources: &#x5B;&quot;secrets&quot;]
    verbs: &#x5B;&quot;get&quot;, &quot;update&quot;, &quot;patch&quot;]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: tailscale
subjects:
  - kind: ServiceAccount
    name: tailscale
roleRef:
  kind: Role
  name: tailscale
  apiGroup: rbac.authorization.k8s.io
</pre></div>


<p class="wp-block-paragraph">I apply the configuration to my speedtest namespace:</p>



<pre class="wp-block-code"><code>kubectl apply -f tailscale-rbac.yaml -n speedtest</code></pre>



<h2 class="wp-block-heading" id="h-add-the-sidecar-container-to-my-deployment">Add the sidecar container to my deployment</h2>



<p class="wp-block-paragraph">Last step is to adapt my existing deployment to add the tailscale sidecar container.</p>



<p class="wp-block-paragraph">Under the spec section, we need to assign the serviceAccount created previously, to the pod:</p>



<pre class="wp-block-code"><code>serviceAccountName: tailscale</code></pre>



<p class="wp-block-paragraph">Then I create the sidecar container as per the tailscale documentation</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
apiVersion: apps/v1
kind: Deployment
metadata:
  name: speedtest-tracker
spec:
  replicas: 1
  revisionHistoryLimit: 0
  selector:
    matchLabels:
      app: speedtest-tracker
  template:
    metadata:
      labels:
        app: speedtest-tracker
    spec:
      serviceAccountName: tailscale  ## &lt;-- Add the Service Account Name
      containers:
        ##### Tailscal sidecar container definition#######
        - name: tailscale-sidecar
          image: ghcr.io/tailscale/tailscale:latest
          env:
            - name: TS_KUBE_SECRET
              value: tailscale-auth
            - name: TS_AUTHKEY
              valueFrom:
                secretKeyRef:
                  name: tailscale-auth
                  key: TS_AUTHKEY
            - name: TS_USERSPACE
              value: &quot;false&quot;
          securityContext:
            capabilities:
              add:
               - NET_ADMIN
        ######################

        - name: speedtest-tracker
          image: lscr.io/linuxserver/speedtest-tracker:latest
          ports:
            - containerPort: 80
          env:
            - name: PUID
              value: &quot;1000&quot;
            - name: PGID
              value: &quot;1000&quot;
            - name: DB_CONNECTION
              value: pgsql
            - name: DB_HOST
              value: postgres
            - name: DB_PORT
              value: &quot;5432&quot;
            - name: DB_DATABASE
              value: speedtest_tracker
            - name: DB_USERNAME
              value: speedy
            - name: DB_PASSWORD
              value: password

          volumeMounts:
            - mountPath: /config
              name: speedtest-tracker
      volumes:
        - name: speedtest-tracker
          persistentVolumeClaim:
            claimName: speedtest-tracker

</pre></div>


<p class="wp-block-paragraph">I apply the configuration to my speedtest namespace:</p>



<pre class="wp-block-code"><code>kubectl apply -f speedtest-tracker.yaml -n speedtest</code></pre>



<p class="wp-block-paragraph">Quick check, my speedtest-tracker pod is now running with 2 containers inside:</p>



<pre class="wp-block-code"><code>Rancher:~/syno/speedtest # kubectl get pods -n speedtest
NAME                                READY   STATUS    RESTARTS   AGE
postgres-7958dd877c-f4d2l           1/1     Running   0          22h
speedtest-tracker-8975967cd-s2fmc   2/2     Running   0          105m
</code></pre>



<p class="wp-block-paragraph">And that’s it!</p>



<p class="wp-block-paragraph">I can now access my app from both networks : my local network and my tailnet.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="499" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/Picture-1-1024x499.png" alt="" class="wp-image-42377" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/Picture-1-1024x499.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/Picture-1-300x146.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/Picture-1-768x375.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/Picture-1.png 1384w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">My pod is now seen as a device in my Tailscale network and can communicate with my other machines.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="904" height="534" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/Picture-2.png" alt="" class="wp-image-42378" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/Picture-2.png 904w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/Picture-2-300x177.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2026/01/Picture-2-768x454.png 768w" sizes="auto, (max-width: 904px) 100vw, 904px" /></figure>



<h2 class="wp-block-heading" id="h-conclusion">Conclusion</h2>



<p class="wp-block-paragraph">What we&#8217;ve done is to turn our Pod into a Tailscale node by injecting a WireGuard interface into the Pod’s shared network namespace, with the help of a tailscale sidecar container. This allows encrypted traffic to flow directly to the app container without Kubernetes Services or Ingress.</p>



<p class="wp-block-paragraph">This is it, I hope you enjoyed reading this blog and that you learned something new.</p>



<p class="wp-block-paragraph"> If so, drop a like, it&#8217;s always appreciated 😉</p>



<p class="wp-block-paragraph">To go further, please visit the Tailscale official documentation that will take you through all the steps and options to configure your tailnet on Kubernetes:<br><a href="https://tailscale.com/learn/managing-access-to-kubernetes-with-tailscale#sidecar-deployments">https://tailscale.com/learn/managing-access-to-kubernetes-with-tailscale#sidecar-deployments</a></p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/access-your-kubernetes-pods-via-tailscale-using-a-sidecar-container/">Access your Kubernetes pods via Tailscale using a Sidecar container</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/access-your-kubernetes-pods-via-tailscale-using-a-sidecar-container/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Two days at the KCD Suisse Romande</title>
		<link>https://www.dbi-services.com/blog/two-days-at-the-kcd-suisse-romande/</link>
					<comments>https://www.dbi-services.com/blog/two-days-at-the-kcd-suisse-romande/#respond</comments>
		
		<dc:creator><![CDATA[Nicolas Meunier]]></dc:creator>
		<pubDate>Thu, 11 Dec 2025 07:14:28 +0000</pubDate>
				<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[KCD]]></category>
		<category><![CDATA[kubernetes]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=41790</guid>

					<description><![CDATA[<p>The 4th and 5th december, I attended KCD Suisse Romande in Geneva. It was a great event in a great place with great people. I really enjoyed the talks and the workshops. First Day: the workshops After a meeting at the entrance of the CERN, we went to attend the workshops: 20000 issues sous les [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/two-days-at-the-kcd-suisse-romande/">Two days at the KCD Suisse Romande</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The 4th and 5th december, I attended <a href="https://community.cncf.io/events/details/cncf-kcd-suisse-romande-presents-kcd-suisse-romande/">KCD Suisse Romande</a> in Geneva. It was a great event in a great place with great people. I really enjoyed the talks and the workshops.</p>



<h2 class="wp-block-heading" id="h-first-day-the-workshops"><strong>First Day: the workshops</strong></h2>



<p class="wp-block-paragraph">After a meeting at the entrance of the CERN, we went to attend the workshops:</p>



<h3 class="wp-block-heading" id="h-20000-issues-sous-les-mers-moving-like-a-fish-in-a-tempestuous-sea"><strong>20000 issues sous les mers &#8211; Moving Like a Fish in a Tempestuous Sea</strong></h3>



<p class="wp-block-paragraph">A very interesting workshop reproducing a possible real use case:</p>



<p class="wp-block-paragraph">We are given a Kubernetes infrastructure, we only have one Kubeconfig, we need to discover, debug, and fix the problems on the cluster.</p>



<p class="wp-block-paragraph">A good exercise very close to real life !</p>



<h3 class="wp-block-heading" id="h-platform-engineering-in-the-age-of-ai-secure-the-software-supply-chain-empower-the-developer"><strong>Platform Engineering in the Age of AI: Secure the Software Supply Chain, Empower the Developer</strong></h3>



<p class="wp-block-paragraph">Apart from the somewhat misleading title (nothing about AI in the workshop), a good overview of the possibilities of Openshift to build a self-service catalog, deploy and provision applications.</p>



<p class="wp-block-paragraph"><strong>The visit of the CERN</strong></p>



<p class="wp-block-paragraph">At the end of the day a visit of one facility of the CERN was organized. For my part, I visited the <a href="https://home.cern/science/physics/antimatter">Antimatter Factory</a>. A great experience to know more about antimatter.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="577" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/12/antimatter_factory-1024x577.jpg" alt="" class="wp-image-41791" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/12/antimatter_factory-1024x577.jpg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/12/antimatter_factory-300x169.jpg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/12/antimatter_factory-768x432.jpg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/12/antimatter_factory-1536x865.jpg 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/12/antimatter_factory.jpg 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading" id="h-second-day-the-talks"><strong>Second Day: the talks</strong></h2>



<p class="wp-block-paragraph">The second day at the CERN auditorium was dedicated to talks.</p>



<p class="wp-block-paragraph">After the keynote, we followed various talks that allowed us to learn about real life scenario of Kubernetes implementations in different environments, such as public structures, pension funds, banks, etc.</p>



<p class="wp-block-paragraph">One talk focused on building an AI platform based on Kubernetes, which was very interesting. How to build a scalable and efficient infrastructure for AI workloads and how to scale up pods quickly was a very interesting subject.</p>



<h2 class="wp-block-heading" id="h-conclusion"><strong>Conclusion</strong></h2>



<p class="wp-block-paragraph">Overall, the KCD Suisse Romande was a great event, the location at the CERN was incredible. Both workshops and talks were very interesting and confirmed that Kubernetes is now a key technology in the IT world. For a first edition of the KCD Suisse Romande, it was a great success, and I look forward to the next edition!</p>
<p>L’article <a href="https://www.dbi-services.com/blog/two-days-at-the-kcd-suisse-romande/">Two days at the KCD Suisse Romande</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/two-days-at-the-kcd-suisse-romande/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Monitor your ISP&#8217;s performance with Speedtest Tracker</title>
		<link>https://www.dbi-services.com/blog/monitor-your-isps-performance-with-speedtest-tracker/</link>
					<comments>https://www.dbi-services.com/blog/monitor-your-isps-performance-with-speedtest-tracker/#respond</comments>
		
		<dc:creator><![CDATA[Rémy Gaudey]]></dc:creator>
		<pubDate>Tue, 05 Aug 2025 07:30:00 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[rke2]]></category>
		<category><![CDATA[speedtest]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=39861</guid>

					<description><![CDATA[<p>I recently changed ISP, and I wanted to monitor its performance and make sure I get what I&#8217;m paying for. I initially started writing a bash script that I was running in a crontab, then writing the results in an md file. But that&#8217;s not very sexy. I wanted something graphical with a nice UI. [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/monitor-your-isps-performance-with-speedtest-tracker/">Monitor your ISP&#8217;s performance with Speedtest Tracker</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I recently changed ISP, and I wanted to monitor its performance and make sure I get what I&#8217;m paying for. I initially started writing a bash script that I was running in a crontab, then writing the results in an md file. <br>But that&#8217;s not very sexy. I wanted something graphical with a nice UI.</p>



<p class="wp-block-paragraph">It turns out that there is a project called <a href="https://github.com/alexjustesen/speedtest-tracker">Speedtest-tracker</a>, written and maintained by <a href="https://www.linkedin.com/in/alexander-justesen/">Alex Justesen</a> on GitHub that does just what I was looking for. Behind the scenes, speedtest-tracker uses the <a href="https://www.speedtest.net/apps/cli">official Ookla CLI</a>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Speedtest Tracker is a self-hosted application that monitors the performance and uptime of your internet connection. Built using Laravel and Speedtest CLI from Ookla®, deployable with Docker.</p>
</blockquote>



<p class="wp-block-paragraph">The cool thing is that Speedtest Tracker is containerized; you can run it anywhere you want! At first, I had installed it as a Docker container on my Synology, but the NAS I own only has 1Gbps Ethernet ports, and my ISP advertises DL/UL speeds of 5 Gbps / 900 Mbps</p>



<p class="wp-block-paragraph">I have a mini PC that I use for my <a href="https://www.dbi-services.com/blog/install-a-single-node-kubernetes-cluster-with-suse-rke2-and-deploy-your-own-yak-instance/">YaK projects</a>, which embeds a 2.5Gbps Ethernet card. I&#8217;d rather use this machine than the NAS. Even though I will not be able to test the full speed my ISP provides, at least I will be able to see if I get near 2.5Gbps, which is already a great download speed.</p>



<p class="wp-block-paragraph">OK, enough talking, let&#8217;s get our hands dirty and let&#8217;s deploy Speedtest-tracker!</p>



<h2 class="wp-block-heading" id="h-your-list-of-ingredients">Your list of ingredients</h2>



<p class="wp-block-paragraph">Here is what you need to add to your recipe:</p>



<ul class="wp-block-list">
<li>A hypervisor, in my case I&#8217;m using Proxmox</li>



<li>A virtual machine (on which I&#8217;m using SUSE Linux, but any distro will work just fine)</li>



<li>A Kubernetes cluster. Keep it simple, <a href="https://docs.rke2.io/install/quickstart">install a single node RKE2</a></li>



<li>A persistent volume: <a href="https://github.com/rancher/local-path-provisioner">local-path provisioner</a> does the job</li>
</ul>



<p class="wp-block-paragraph">I&#8217;m passing these steps here, but you can find them in <a href="https://www.dbi-services.com/blog/install-a-single-node-kubernetes-cluster-with-suse-rke2-and-deploy-your-own-yak-instance/">my other blog</a> dedicated to installing the YaK, if you need.</p>



<p class="wp-block-paragraph">Everything is well documented on <a href="https://docs.speedtest-tracker.dev/">Speedtest tracker web page</a></p>



<p class="wp-block-paragraph">There is already a <a href="https://github.com/maximemoreillon/kubernetes-manifests/tree/master/speedtest-tracker">community manifest</a> available for Kubernetes, written and maintained by <a href="https://github.com/maximemoreillon">Maxime Moreillon</a>.</p>



<h2 class="wp-block-heading" id="h-how-to-install-speedtest-tracker">How to install speedtest-tracker?</h2>



<p class="wp-block-paragraph">Installing speedtest tracker is as simple as deploying 2 yaml files:</p>



<ul class="wp-block-list">
<li>1 for the postgreSQL database</li>



<li>1 for the frontend app</li>
</ul>



<p class="wp-block-paragraph">The PG database and the application manifests are available <a href="https://github.com/maximemoreillon/kubernetes-manifests/tree/master/speedtest-tracker">here</a>.<br>All the credit goes to <a href="https://github.com/maximemoreillon">Maxime Moreillon</a>, who wrote these manifests and made them available to the community.<br>All I had to do was save the files to my &#8220;speedtest&#8221; folder and adjust them to my context.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
localhost:~ # cd speedtest
localhost:~/speedtest # ls -ltrh
total 8.0K
-rw-r--r-- 1 root root 1.1K Jul 29 16:29 postgres.yaml
-rw-r--r-- 1 root root 2.2K Aug  3 18:48 speedtest-tracker.yaml
</pre></div>


<h3 class="wp-block-heading" id="h-my-postgres-manifest">My Postgres manifest </h3>



<p class="wp-block-paragraph">I haven&#8217;t changed a single line from Maxime Moreillon&#8217;s code. The manifest includes the PVC definition, the PostgreSQL deployment itself, and a service:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:15.1
          env:
            - name: POSTGRES_PASSWORD
              value: password
            - name: POSTGRES_DB
              value: speedtest_tracker
            - name: POSTGRES_USER
              value: speedy
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgres
      volumes:
        - name: postgres
          persistentVolumeClaim:
            claimName: postgres

---
apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  ports:
    - port: 5432
  selector:
    app: postgres
  type: ClusterIP
</pre></div>


<h3 class="wp-block-heading" id="h-my-speedtest-tracker-manifest">My speedtest-tracker manifest </h3>



<p class="wp-block-paragraph">With a few adjustments from Maxime&#8217;s code to fit my needs. It comes with the PVC definition, the application deployment, and the service:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: speedtest-tracker
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: local-path  # Adjust if you&#039;re using a different StorageClass

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: speedtest-tracker
spec:
  replicas: 1
  revisionHistoryLimit: 0
  selector:
    matchLabels:
      app: speedtest-tracker
  template:
    metadata:
      labels:
        app: speedtest-tracker
    spec:
      containers:
        - name: speedtest-tracker
          image: lscr.io/linuxserver/speedtest-tracker:latest
          ports:
            - containerPort: 80
          env:
            - name: PUID
              value: &quot;1000&quot;
            - name: PGID
              value: &quot;1000&quot;
            - name: DB_CONNECTION
              value: pgsql
            - name: DB_HOST
              value: postgres
            - name: DB_PORT
              value: &quot;5432&quot;
            - name: DB_DATABASE
              value: speedtest_tracker
            - name: DB_USERNAME
              value: speedy
            - name: DB_PASSWORD
              value: password

########MY PERSONAL ENV VARIABLES########
            - name: APP_NAME
              value: home-speedtest-k8s
            - name: APP_KEY
              value: &lt;generate your own app key&gt;
            - name: DISPLAY_TIMEZONE
              value: Europe/Paris
            - name: SPEEDTEST_SERVERS
              value: &quot;62493&quot;
            - name: SPEEDTEST_SCHEDULE
              value: &#039;*/30 * * * *&#039;
            - name: PUBLIC_DASHBOARD
              value: &quot;true&quot;
#########################################

          volumeMounts:
            - mountPath: /config
              name: speedtest-tracker
      volumes:
        - name: speedtest-tracker
          persistentVolumeClaim:
            claimName: speedtest-tracker

---
apiVersion: v1
kind: Service
metadata:
  name: speedtest-tracker
  labels:
    app: speedtest-tracker
spec:
  selector:
    app: speedtest-tracker
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      nodePort: 30080  # You can change this to any port in the 30000-32767 range
</pre></div>


<p class="wp-block-paragraph">Now, generate your own APP KEY and paste the value in the placeholder in the code above (including the <code>base64:</code> prefix), here is how:</p>



<pre class="wp-block-code"><code>
echo -n 'base64:'; openssl rand -base64 32;</code></pre>



<p class="wp-block-paragraph">And that&#8217;s it!<br>Once your manifests are ready and once you are happy with the environment variables you want (the list of env. variables is <a href="https://docs.speedtest-tracker.dev/getting-started/environment-variables">available here</a>), you just need to create your namespace on your cluster and apply the configuration:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
kubectl create ns speedtest
kubectl apply -f speedtest/postgres.yaml -n speedtest
kubectl apply -f speedtest/speedtest-racker.yaml -n speedtest
</pre></div>


<p class="wp-block-paragraph">After a few seconds, your pods will come up:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
localhost:~/speedtest # kubectl get pods -n speedtest
NAME                                 READY   STATUS    RESTARTS        AGE
postgres-6c8499b968-rbwlw            1/1     Running   2 (4d18h ago)   5d21h
speedtest-tracker-7997cbdc8f-64n7c   1/1     Running   0               19h
</pre></div>


<h2 class="wp-block-heading" id="h-enjoy">Enjoy !</h2>



<p class="wp-block-paragraph">If you did things right, you should be able to monitor your internet speed and display the results on a neat UI. In my case, I fire a speedtest every 30 minutes (I know, that&#8217;s overkill, but I just wanted to play a bit. I will reduce the frequency to something more reasonable, I promise <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> )<br></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="601" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/image-1-1024x601.png" alt="Speedtest-tracker UI" class="wp-image-39874" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/image-1-1024x601.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/image-1-300x176.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/image-1-768x451.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/image-1-1536x901.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/08/image-1-2048x1201.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Cool, no?</p>



<h2 class="wp-block-heading" id="h-to-go-further">To go further</h2>



<p class="wp-block-paragraph">I&#8217;d love to monitor the full bandwidth my ISP advertises, but I&#8217;m limited by my hardware: my router does not support link aggregation, and it only comes with one 10G fiber-optic WAN interface + one 2.5 Gbps and two 1Gbps LAN interfaces. There is no chance I can test the full fiber-optic capacity with this hardware.</p>



<p class="wp-block-paragraph">In the future, I might buy a switch that supports LACP and configure my router in bridge mode to be able to reach the full WAN bandwidth, or invest in a router that provides more high-speed interfaces. But to be honest, the investment is not really worth it.</p>



<p class="wp-block-paragraph">One thing I could do however would be to enable HTTPS and add a Let&#8217;s Encrypt certificate to secure the connections to my frontend. That&#8217;s an improvement I could make soon.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/monitor-your-isps-performance-with-speedtest-tracker/">Monitor your ISP&#8217;s performance with Speedtest Tracker</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/monitor-your-isps-performance-with-speedtest-tracker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>YaK Core – The Holy Grail for Deploying Ansible Code Everywhere</title>
		<link>https://www.dbi-services.com/blog/yak-core-the-holy-grail-for-deploying-ansible-code-everywhere/</link>
					<comments>https://www.dbi-services.com/blog/yak-core-the-holy-grail-for-deploying-ansible-code-everywhere/#respond</comments>
		
		<dc:creator><![CDATA[Hervé Schweitzer]]></dc:creator>
		<pubDate>Tue, 29 Apr 2025 13:52:46 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Database management]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[OCI]]></category>
		<category><![CDATA[YaK]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=38158</guid>

					<description><![CDATA[<p>YaK core Multi-Platform open source Automation Tool simplifies the deployment of Ansible playbooks through a clean UI and API. It offers an intuitive interface where users can upload playbooks, configure parameters, and deploy them seamlessly across various platforms, and all managed through a centralized inventory stored in a PostgreSQL database. With YaK Core, developers can [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/yak-core-the-holy-grail-for-deploying-ansible-code-everywhere/">YaK Core – The Holy Grail for Deploying Ansible Code Everywhere</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="510" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/yak-core-open-source-multi-platform-1-1024x510.png" alt="" class="wp-image-38228" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/yak-core-open-source-multi-platform-1-1024x510.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/yak-core-open-source-multi-platform-1-300x149.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/yak-core-open-source-multi-platform-1-768x383.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/yak-core-open-source-multi-platform-1.png 1134w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="has-medium-font-size wp-block-paragraph"><strong>YaK core Multi-Platform open source Automation Tool </strong>simplifies the deployment of Ansible playbooks through a clean UI and API. It offers an intuitive interface where users can upload playbooks, configure parameters, and deploy them seamlessly across various platforms, and all managed through a centralized inventory stored in a PostgreSQL database. With YaK Core, developers can focus on writing application code without worrying about infrastructure setup or management.</p>



<p class="has-medium-font-size wp-block-paragraph"><strong>YaK</strong> consists of two parts: <strong>YaK Core</strong>, which is open source, and <strong>YaK Components</strong>, which can be installed on top. These <strong>YaK Components </strong>are platform-agnostic service packages (e.g., PostgreSQL, Oracle DB, MongoDB, Kubernetes, etc.), written in Ansible by experts. They provide essential operational features such as backup, patching, upgrades, and high availability. If you&#8217;d like to learn more about the available YaK components, feel free to <a href="https://yak4all.io/contact">contact us!</a></p>



<p class="has-medium-font-size wp-block-paragraph">But that’s not all. <strong>YaK Core </strong>also lets you create your own <strong>YaK Components</strong> <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" />. Once created, your component becomes immediately available for deployment across all platforms supported by YaK Core.</p>



<p class="has-medium-font-size wp-block-paragraph">In this blog, I’ll show you how easy it is to create your own <strong>YaK Component</strong> using Ansible, upload it to <strong>YaK Core</strong>, and deploy it across any supported platform.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading has-text-align-center" id="h-yak-demo-platform-provisioning">YaK Demo platform provisioning</h2>



<p class="wp-block-paragraph">To get started with YaK Core Multi-Platform open source solution, visit <a class="" href="https://yak4all.io">https://</a><a href="https://yak4all.io" target="_blank" rel="noreferrer noopener">yak4all</a><a class="" href="https://yak4all.io">.io</a> and provision your own YaK demo environment (take 5 minutes to be ready).</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-yak wp-block-embed-yak"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="iT6gmuzgX5"><a href="https://yak4all.io/demo/">Demo</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;Demo&#8221; &#8212; YaK" src="https://yak4all.io/demo/embed/#?secret=rhIPnL8eSE#?secret=iT6gmuzgX5" data-secret="iT6gmuzgX5" width="500" height="282" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading has-text-align-center" id="h-build-your-yak-component">Build your YaK Component</h2>



<p class="has-medium-font-size wp-block-paragraph">To build a YaK Component, you need to declare at least the following three files </p>



<p class="has-text-align-left wp-block-paragraph"><strong>     1. playbooks/create_linux_users.yml<br>     2. manifest.yml<br>     3. yak_variables_specifications/basic_variables_specifications.yml</strong></p>



<h3 class="wp-block-heading has-text-color has-link-color wp-elements-c7ffa4e866b5c2f8365c6699e09153cd" id="h-1-the-ansible-playbook" style="color:#006fb5">1. The Ansible Playbook </h3>



<p class="has-medium-font-size wp-block-paragraph"><strong>playbooks/create_linux_users.yml</strong><br>This file is simply your Ansible playbook, nothing more. The only requirement is that the code uses variables, which will be exposed in the UI for configuration. The example playbook below will create a user and optionally grant them sudo privileges.</p>



<pre class="wp-block-code"><code>---
- name: Create Linux users
  hosts: linux_hosts
  become: true
  gather_facts: true

  tasks:
    - debug:
        var: user

    - name: Create users
      ansible.builtin.user:
        name: "{{ item.username }}"
        create_home: "{{ item.create_home | default(true) }}"
        state: present
      loop: "{{ user }}"

    - name: Add users to sudoers
      community.general.sudoers:
        name: "yak-sudoer-{{ item.username }}"
        user: "{{ item.username }}"
        commands: ALL
        state: present
      loop: "{{ user }}"
      when: item.is_sudoer
        
  post_tasks:
    - name: Update component state
      delegate_to: localhost
      yak.core.yak_component_state_update:
        component_state_name: 'deployed'
...</code></pre>



<h3 class="wp-block-heading has-text-color has-link-color wp-elements-9766ac0c91f53fa89ea1455a27f3848d" id="h-2-manifest-file" style="color:#006fb5">2. Manifest file</h3>



<p class="has-medium-font-size wp-block-paragraph"><strong>manifest.yml</strong><br>This file contains the basic information about your component and specifies which playbooks can be executed.</p>



<pre class="wp-block-code"><code>name: linux_users

version:
  major: 1
  minor: 0
  patch: 0

sub_component_types:
  - display_label: Linux users
    name: create_linux_users
    features:
      - display_label: Create Linux users
        name: create_linux_users
        playbook_name: playbooks/create_linux_users.yml

    inventory_maps:
      - group_name: linux_hosts
        group_nicename: Linux hosts
        group_description: Host on which the users will be created
        group_min_hosts: 1
        group_max_hosts: 100
        type: host
        os_type: Linux</code></pre>



<h3 class="wp-block-heading has-text-color has-link-color wp-elements-4433a9419864971a558f59cbb6ad037e" id="h-3-variable-specification-file" style="color:#006fb5">3. Variable specification file</h3>



<p class="has-medium-font-size wp-block-paragraph"><strong>yak_variables_specifications/basic_variables_specifications.yml</strong><br>Now you can define and provide all the specifications for the variables you want to make configurable, with all the required settings <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" />.</p>



<pre class="wp-block-code"><code>- variableName: user
  niceName: Users to create
  dataType: array
  children:
    - variableName: username
      niceName: Username
      dataType: string
      mandatory: true
      defaultValue: yak
      isOneOffSetting: false
      usage: Name of the user to create

    - variableName: create_home
      niceName: Create Home directory
      dataType: boolean
      mandatory: true
      defaultValue: true
      isOneOffSetting: false
      usage: Tick the box if you want to create a Home directory for the user (/home/&lt;username&gt;)

    - variableName: is_sudoer
      niceName: Grant sudo privileges
      dataType: boolean
      mandatory: true
      defaultValue: true
      isOneOffSetting: false
      usage: Tick the box if you want to grant "ALL" privileges escalation to the user</code></pre>



<p class="has-medium-font-size wp-block-paragraph">That&#8217;s it! You now have all the necessary files for your first YaK Component. Next, create a ZIP package and upload it to your deployed YaK Demo environment.</p>



<p class="has-medium-font-size wp-block-paragraph">To make things easier, I&#8217;ve created a ZIP file that you can upload directly. : <a href="https://www.swisstransfer.com/d/6db7e854-c74a-4616-be89-bc4375059161">create_linux_user.zip</a> </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1016" height="566" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.10.48.png" alt="" class="wp-image-38208" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.10.48.png 1016w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.10.48-300x167.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.10.48-768x428.png 768w" sizes="auto, (max-width: 1016px) 100vw, 1016px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading has-text-align-center" id="h-setup-a-server">Setup a Server</h2>



<p class="has-medium-font-size wp-block-paragraph">For this task, simply follow the documentation below up to Step 4: <em>Deploy your server</em> <a href="https://dbi-services.gitbook.io/yak-user-doc/introduction/yak-demo">https://dbi-services.gitbook.io/yak-user-doc/introduction/yak-demo</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading has-text-align-center" id="h-declare-and-deploy-your-component">Declare and deploy your Component </h2>



<p class="has-medium-font-size wp-block-paragraph">You’re now ready to declare and deploy your component!</p>



<h3 class="wp-block-heading has-text-color has-link-color wp-elements-aec523cc5c9123a8748ed34598dfbbd4" id="h-1-declare" style="color:#006fb5">1. Declare </h3>



<p class="has-medium-font-size wp-block-paragraph"><strong>YaK UI -&gt; Components -&gt; Declare -&gt; Component_type : linux_users -&gt; Save</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="994" height="872" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.21.47.png" alt="" class="wp-image-38209" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.21.47.png 994w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.21.47-300x263.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.21.47-768x674.png 768w" sizes="auto, (max-width: 994px) 100vw, 994px" /></figure>



<h3 class="wp-block-heading has-text-color has-link-color wp-elements-a421b9f745833b9dda3d46b9d7e21629" id="h-2-deploy" style="color:#006fb5">2 Deploy </h3>



<p class="has-medium-font-size wp-block-paragraph"><strong>YaK UI -&gt; Components -&gt; Select LinuxUser -&gt; Action -&gt; Create Linux User -&gt; Confirm</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="990" height="326" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.23.48.png" alt="" class="wp-image-38212" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.23.48.png 990w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.23.48-300x99.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.23.48-768x253.png 768w" sizes="auto, (max-width: 990px) 100vw, 990px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading has-text-align-center" id="h-conclusion">Conclusion</h2>



<p class="has-medium-font-size wp-block-paragraph">This component can now be deployed on any cloud platform or integrated on On-Premises environment using the YaK UI, and can also be deployed in parallel on up to 100 servers, as specified in your Manifest file.</p>



<p class="has-medium-font-size wp-block-paragraph">With this solution, you can provide your colleagues with an intuitive and efficient way to work with Ansible playbooks, enhancing their overall experience <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" />.</p>



<p class="has-medium-font-size wp-block-paragraph">For more Information about YaK see the blogs available here : <a href="https://www.dbi-services.com/blog/yak">https://www.dbi-services.com/blog/yak</a></p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/yak-core-the-holy-grail-for-deploying-ansible-code-everywhere/">YaK Core – The Holy Grail for Deploying Ansible Code Everywhere</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/yak-core-the-holy-grail-for-deploying-ansible-code-everywhere/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>My journey to KubeCon 2025</title>
		<link>https://www.dbi-services.com/blog/my-journey-to-kubecon-2025-day-1/</link>
					<comments>https://www.dbi-services.com/blog/my-journey-to-kubecon-2025-day-1/#comments</comments>
		
		<dc:creator><![CDATA[Rémy Gaudey]]></dc:creator>
		<pubDate>Mon, 07 Apr 2025 09:53:40 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=37914</guid>

					<description><![CDATA[<p>Wednesday, April 2nd. Today is my first day at the KubeCon 2025 in London. It’s 8 AM, I’m in the lobby of my hotel and I can already hear “HAProxy”, “NGINX”, “Pipeline”, and “Kubernetes” here and there. There is no doubt, I am at the right place. When I walked to the Excel London, I [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/my-journey-to-kubecon-2025-day-1/">My journey to KubeCon 2025</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="h-wednesday-april-2nd"><strong>Wednesday, April 2nd.</strong></h2>



<p class="wp-block-paragraph"><br>Today is my first day at the KubeCon 2025 in London. It’s 8 AM, I’m in the lobby of my hotel and I can already hear “HAProxy”, “NGINX”, “Pipeline”, and “Kubernetes” here and there. There is no doubt, I am at the right place.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/8DDFAD0C-EB7A-4048-BECE-A4F95EDC611A_1_105_c-1.jpeg" alt="" class="wp-image-37917" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/8DDFAD0C-EB7A-4048-BECE-A4F95EDC611A_1_105_c-1.jpeg 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/8DDFAD0C-EB7A-4048-BECE-A4F95EDC611A_1_105_c-1-300x225.jpeg 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/8DDFAD0C-EB7A-4048-BECE-A4F95EDC611A_1_105_c-1-768x576.jpeg 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">When I walked to the Excel London, I didn’t know what to expect. The place is just huge. The day has not started, and I already know I should have grabbed another pair of shoes.</p>



<p class="wp-block-paragraph">To give you an idea, they expect between 12 and 15 thousand people….<br>I’m starting to realize this event is a one-of-a-kind.</p>



<p class="wp-block-paragraph">Opening session in the Auditorium, my first thought was: how are they gonna fit all these people in? <br>Well, the Linux Foundation organizers seem to know what they are doing… <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>Drum rolls, lights shade, this is not just another IT people gathering, it’s a freaking show.</p>



<p class="wp-block-paragraph">The tone is set, a few welcome words from the CNCF representatives and we are already talking about LLM. This is not a surprise; Artificial Intelligence is everywhere in this Kubecon.<br><br><strong>Christin Yen</strong>, CEO and cofounder at Honeycomb tells us about observability and the impact of application development on users. How can AI help improve user experience by monitoring response time and analyzing tons of metadata.</p>



<p class="wp-block-paragraph">Followed by <strong>Vijay Samuel</strong>, Architect at Ebay enlightening us on how they are making use of AI and LLM: human comprehension is limited, and the systems we manage have become so complex and so big that sorting of logs is impossible without the help of machine learning to attach a root cause to an alert.</p>



<p class="wp-block-paragraph"><strong>Andrew Randall</strong> reminds us how awesome Kubernetes is but also how intimidating it can be for novice users. There is no such thing as a simple <em>“apt-get install kubernetes” </em>command: willing to install a Vanilla Kubernetes? You’d have to figure it out yourself, it’s a steep learning curve before you can even deploy your first cluster.<br>Based on this observation and willingness to reduce the impact on developers’ productivity, Microsoft has announced a new project called Headlamp, designed to make Kubernetes easier to use and, above all, easier to adopt. It comes with an in-cluster web portal (a k8s dashboard), a unified UI for multiple remote clusters, and a “Kubernetes Desktop”.<br>Pretty much like what our SUSE friends have accomplished with the great SUSE Rancher ;-). Let’s see!</p>



<p class="wp-block-paragraph"><strong>Greg Kroah-Hartmann</strong> (Linux maintainer, Linux Foundation) attended to discuss the Linux Kernel and how they are integrating Rust and C into it.<br>Today’s Linux kernel contains 34 million lines of C, and about 25000 lines of Rust code.<br>Rust brings more safety as it allows the kernel to “crash safely” when an error occurs and makes the code more “maintainable”. Rust can prevent a huge majority of security issues at build time, not at review time: code is simpler, reviewing is easier, fewer bugs, more fun!</p>



<p class="wp-block-paragraph">Closing the keynote with a great use-case of AI, I loved it because it really demonstrated how technology can improve people’s lives and I truly believe this is what technology should be about: moving science forward, promoting education, and closing the gap between our societies. Indeed, <strong>Rob Koch</strong> from <strong>Slalom </strong>explained how AI, combined with Kubernetes, is revolutionizing the world of deaf people with AI-driven sign language interpretation and recognition.<br>He explained the challenges they’re facing as it is overly complicated for a machine to capture the movement of a hand when hand-signing.<br>Making the difference between a “P” and a “Q” is a good example of this complexity as these 2 signs are very similar in sign language and capturing the right sign highly depends on the camera’s angle of view: perspective and scaling are important. AI models need a phenomenal amount of authentic data and scenarios to be trained. Moreover, machines need to “understand” the context of the conversation, not only words.<br>Kubernetes is ideal for that as it provides scaling capabilities, resource optimization for video processing, and task repeatability.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="782" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-07-at-10.35.36-1024x782.png" alt="" class="wp-image-37920" style="width:420px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-07-at-10.35.36-1024x782.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-07-at-10.35.36-300x229.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-07-at-10.35.36-768x586.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-07-at-10.35.36.png 1040w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph"><strong>End of the keynote</strong>, it&#8217;s time for me to wander the corridors of the KubeCon and visit the booths.<br>All the big tech players are there of course…. but dozens of open source projects that we use daily within our infrastructures are represented and have a booth. It’s great to see that Open Source solutions are everywhere and everybody’s using them. I feel like a kid in a candy shop!</p>



<p class="wp-block-paragraph">Alright, let’s &#8220;get some swag&#8221;. There are enough tee shirts, stickers, and other cool gadgets at this KubeCon for me to fill a massive suitcase, but I will try to be reasonable. Everyone has something to propose: hats, backpacks, tote bags, stickers, keyrings, lego sets. It’s too tempting, let’s see how long I can refrain from taking it all.</p>



<p class="wp-block-paragraph"><strong>Visiting the RedHat stand:</strong><br>I met with Stevan Le Meur, a developer at RedHat and we had a great exchange on what RedHat does with regards to Kubernetes. Stevan specializes in bootable containers and invited me to take a closer look at what <a href="https://docs.fedoraproject.org/en-US/bootc/getting-started/">bootc</a> and <a href="https://podman.io/">podman</a> can achieve.<br>The occasion for me to talk about our <a href="https://yak4all.io">YaK project</a>. Why not consider bootable containers with the YaK in a future release?<br>That’s clearly a topic we can discuss during our next roadmap meeting, let’s see if we add it to the list of upcoming features&#8230;</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="768" height="1024" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/7C18A2CC-2B98-4489-83FC-C59FED64BB36_1_105_c.jpeg" alt="" class="wp-image-37925" style="width:333px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/7C18A2CC-2B98-4489-83FC-C59FED64BB36_1_105_c.jpeg 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/7C18A2CC-2B98-4489-83FC-C59FED64BB36_1_105_c-225x300.jpeg 225w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>
</div>


<p class="wp-block-paragraph">Walking down the hallway, I passed by the <strong>Linux Foundation booth</strong> where the topic being discussed was the certification exams.<br>For those interested in the CKA (Certified Kubernetes Administrator) exam, know that a new version has just been released.<br>This new version is a bit more difficult than the previous one, the passing score is still 66% and the format has not changed: it is still a proctored hands-on lab exam.</p>



<p class="wp-block-paragraph">Good resources to practice before the exam: killer.sh (<a href="https://killer.sh/">https://killer.sh/</a>) , and the great environments and training material provided by KodeKloud (<a href="https://kodekloud.com/">https://kodekloud.com/</a>)</p>



<p class="wp-block-paragraph">That’s enough reading for today.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/my-journey-to-kubecon-2025-day-1/">My journey to KubeCon 2025</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/my-journey-to-kubecon-2025-day-1/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Building multi-architecture images with GitLab CI/CD</title>
		<link>https://www.dbi-services.com/blog/building-multi-architecture-images-with-gitlab-ci-cd/</link>
					<comments>https://www.dbi-services.com/blog/building-multi-architecture-images-with-gitlab-ci-cd/#respond</comments>
		
		<dc:creator><![CDATA[Nicolas Meunier]]></dc:creator>
		<pubDate>Fri, 06 Dec 2024 09:06:15 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[YaK]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[GitlabCI/CD]]></category>
		<category><![CDATA[Image buid]]></category>
		<category><![CDATA[multi-architecture]]></category>
		<category><![CDATA[x86]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=35955</guid>

					<description><![CDATA[<p>Building multi-architecture images become more and more useful. Indeed, many recent computers use ARM processors architecture. Examples include MacBooks using M(x) processors, and Amazon EC2 instances using AWS Graviton processors. However, the diversification of processor architectures adds a new level of complexity to the creation of container images. Indeed, the construction has to cope with [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/building-multi-architecture-images-with-gitlab-ci-cd/">Building multi-architecture images with GitLab CI/CD</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Building multi-architecture images become more and more useful. Indeed, many recent computers use ARM processors architecture. Examples include MacBooks using M(x) processors, and Amazon EC2 instances using <a href="https://aws.amazon.com/fr/ec2/graviton/">AWS Graviton</a> processors.</p>



<p class="wp-block-paragraph">However, the diversification of processor architectures adds a new level of complexity to the creation of container images. Indeed, the construction has to cope with different instruction sets.</p>



<h2 class="wp-block-heading" id="h-docker-buildx-the-solution-for-building-multi-architecture-images">Docker buildx, the solution for building multi-architecture images</h2>



<p class="wp-block-paragraph">For the <a href="https://gitlab.com/yak4all/yak_core">YaK</a> project, we want to make amd64 (x86) and arm64 images available using GitLab CI/CD.</p>



<p class="wp-block-paragraph">In order to create a build compatible with several architectures, I had to use “docker buildx” in my .gitlab-ci.yml file:</p>



<pre class="wp-block-code"><code>build:
  image: docker:latest
  stage: build
  services:
    - docker:dind
  before_script:
    - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
    - docker buildx create --name yakbuilder --use
  script:
    - docker buildx build --pull --builder=yakbuilder --platform linux/amd64,linux/arm64 -t &#091;IMG]:&#091;TAG] --push .
</code></pre>



<h3 class="wp-block-heading" id="h-how-it-works">How it works:</h3>



<ul class="wp-block-list">
<li>In the <code>"before_script"</code> section , I initialize a QEMU container to emulate ARM architecture and to create a buildx context using the QEMU container</li>



<li>In the <code>"script"</code> section itself, instead of a simple &#8220;docker build&#8221;, I use the <code>"docker <strong>buildx</strong> build"</code> command</li>



<li>I also pass the buildx context created in the <code>"before_script"</code> with the <code>--builder</code> flag</li>



<li>Finally, I add the list of architectures required for the build with the <code>--platform</code> flag</li>
</ul>



<h2 class="wp-block-heading" id="h-build-result">Build Result</h2>



<p class="wp-block-paragraph">With this method, the build is slower. That&#8217;s normal as several images are created (one per architecture) instead of just one.</p>



<p class="wp-block-paragraph">The result can be seen in the GitLab container registry:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="428" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/Container-registry-1024x428.png" alt="container registry details" class="wp-image-35958" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/Container-registry-1024x428.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/Container-registry-300x125.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/Container-registry-768x321.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/Container-registry.png 1070w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Now, below the image tag, a small “index” label is shown. This refers to the fact that several images are available for this tag. During the image pull, the container engine will choose the image version corresponding to its architecture.</p>



<h2 class="wp-block-heading" id="h-conclusion">Conclusion</h2>



<p class="wp-block-paragraph">With <strong>buildx</strong> and QEMU in GitLab CI/CD, building multi-architecture images is easy. You can manage different processor architectures and meet the needs of a wide range of users and ensure the compatibility of your container images.</p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/building-multi-architecture-images-with-gitlab-ci-cd/">Building multi-architecture images with GitLab CI/CD</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/building-multi-architecture-images-with-gitlab-ci-cd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Migrating AWX from one Kubernetes cluster to another: A custom approach</title>
		<link>https://www.dbi-services.com/blog/migrating-awx-from-one-kubernetes-cluster-to-another-a-custom-approach/</link>
					<comments>https://www.dbi-services.com/blog/migrating-awx-from-one-kubernetes-cluster-to-another-a-custom-approach/#respond</comments>
		
		<dc:creator><![CDATA[Donovan Winter]]></dc:creator>
		<pubDate>Mon, 14 Oct 2024 08:25:54 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[awx]]></category>
		<category><![CDATA[awxoperator]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[kubernetes]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=35153</guid>

					<description><![CDATA[<p>In this guide, we’ll walk through migrating an AWX instance from one Kubernetes infrastructure to another, with two important considerations. First, both AWX instances are on completely different networks, meaning there’s no direct connectivity between them. Second, we aim to replicate the credentials (including passwords) stored in AWX, which requires careful handling. This approach differs [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/migrating-awx-from-one-kubernetes-cluster-to-another-a-custom-approach/">Migrating AWX from one Kubernetes cluster to another: A custom approach</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In this guide, we’ll walk through migrating an AWX instance from one Kubernetes infrastructure to another, with two important considerations. First, both AWX instances are on completely different networks, meaning there’s no direct connectivity between them. Second, we aim to replicate the credentials (including passwords) stored in AWX, which requires careful handling. This approach differs from the <a href="https://ansible.readthedocs.io/projects/awx-operator/en/latest/migration/migration.html" target="_blank" rel="noreferrer noopener">official documentation</a> due to these two specific constraints.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="900" height="600" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/migrating-awx.png" alt="" class="wp-image-35156" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/migrating-awx.png 900w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/migrating-awx-300x200.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/migrating-awx-768x512.png 768w" sizes="auto, (max-width: 900px) 100vw, 900px" /></figure>



<h2 class="wp-block-heading" id="h-step-1-backup-awx-on-the-old-infrastructure">Step 1: Backup AWX on the old infrastructure</h2>



<p class="wp-block-paragraph">To back up AWX on the old infrastructure, we’ll use the <code>AWXBackup</code> resource provided by the AWX Operator. This will capture all necessary configurations, including credentials, job templates, and database data.</p>



<ul class="wp-block-list">
<li><strong>Create the AWXBackup resource</strong></li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
apiVersion: awx.ansible.com/v1beta1
kind: AWXBackup
metadata:
  name: awx-backup
  namespace: &lt;namespace-awx&gt;
spec:
  deployment_name: &lt;awx-instance-name&gt;
</pre></div>


<ul class="wp-block-list">
<li><strong>Apply the backup configuration</strong></li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl apply -f awxbackup.yaml
</pre></div>


<ul class="wp-block-list">
<li><strong>Verify the backup</strong><br>Check the status of the AWXBackup resource to ensure the backup is complete</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl get awxbackup -n &lt;namespace-awx&gt;
</pre></div>


<ul class="wp-block-list">
<li><strong>Access the backup data</strong><br>AWXBackup creates a PVC to store the backup data. We need to retrieve it.</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl get pvc -n &lt;namespace-awx&gt;
</pre></div>


<ul class="wp-block-list">
<li><strong>Mount the backup PVC</strong><br>Create a temporary pod to access the backup files</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
apiVersion: v1
kind: Pod
metadata:
  name: awx-backup-access
  namespace: &lt;namespace-awx&gt;
spec:
  containers:
  - name: backup-container
    image: busybox:latest
    command: &#x5B;&quot;/bin/sh&quot;, &quot;-c&quot;, &quot;sleep 3600&quot;]
    volumeMounts:
    - mountPath: /backup-data
      name: awx-backup-pvc
  volumes:
  - name: awx-backup-pvc
    persistentVolumeClaim:
      claimName: &lt;awx-backup-pvc&gt;
</pre></div>


<ul class="wp-block-list">
<li><strong>Compress the backup</strong><br>Once inside the pod, go to the backup directory and archive the latest directory</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl exec -it awx-backup-access -n &lt;namespace-awx&gt; -- /bin/sh
cd /backup-data
ls -l
## Find the latest directory
tar -czvf /awx_backup.tar.gz &lt;latest-directory&gt;
</pre></div>


<ul class="wp-block-list">
<li><strong>Copy the archive locally</strong><br>Use <code>kubectl cp</code> to copy the archive from the pod to your local machine</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl cp &lt;namespace-awx&gt;/awx-backup-access:/backup-data/awx_backup.tar.gz ./awx_backup.tar.gz
</pre></div>


<ul class="wp-block-list">
<li><strong>Clean up the temporary pod</strong><br>Once the backup is copied, delete the temporary pod</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl delete pod awx-backup-access -n &lt;namespace-awx&gt;
</pre></div>


<ul class="wp-block-list">
<li><strong>Recover the decryption key for secret keys</strong></li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl get secrets -n &lt;namespace-awx&gt; &lt;awx-instance-name&gt;-secret-key -o jsonpath=&#039;{.data.secret_key}&#039; &amp;&amp; echo;
</pre></div>


<p class="wp-block-paragraph">Save the base 64 encrypted key, we will need it for during the restoring step.</p>



<h2 class="wp-block-heading" id="h-step-2-setup-the-new-awx-instance">Step 2: Setup the new AWX instance</h2>



<p class="wp-block-paragraph">On the new infrastructure, we first need to install AWX via the AWX Operator.</p>



<ul class="wp-block-list">
<li><strong>Install the AWX Operator</strong><br>For this step follow the official <a href="https://ansible.readthedocs.io/projects/awx-operator/en/latest/" target="_blank" rel="noreferrer noopener">documentation of AWX Operator</a><br>Maybe you will need to deploy AWX using a local repository, you can read my other article: <a href="https://www.dbi-services.com/blog/deploy-awx-operator-with-helm-using-images-from-a-local-registry/" target="_blank" rel="noreferrer noopener">Deploy awx-operator with Helm using images from a local registry</a></li>
</ul>



<ul class="wp-block-list">
<li><strong>Verify the AWX deployment</strong><br>Check that the new AWX instance is up and running</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl get awx -n &lt;new-namespace-awx&gt;
</pre></div>


<h2 class="wp-block-heading" id="h-step-3-backup-awx-on-the-new-infrastructure">Step 3: Backup AWX on the new infrastructure</h2>



<p class="wp-block-paragraph">Next, we need to create an AWXBackup on the new infrastructure.</p>



<ul class="wp-block-list">
<li><strong>Create an AWXBackup for the backup data</strong><br>Create the <code>awxbackup.yaml</code> file:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
apiVersion: awx.ansible.com/v1beta1
kind: AWXBackup
metadata:
  name: awx-backup-migration
  namespace: &lt;namespace-awx&gt;
spec:
  deployment_name: &lt;awx-instance-name&gt;
</pre></div>


<ul class="wp-block-list">
<li><strong>Apply the backup configuration</strong></li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl apply -f awxbackup.yaml
</pre></div>


<ul class="wp-block-list">
<li><strong>Verify the backup</strong><br>Check the status of the AWXBackup resource to ensure the backup is complete</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl get awxbackup -n &lt;namespace-awx&gt;
</pre></div>


<ul class="wp-block-list">
<li><strong>Identify the backup PVC</strong></li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl get pvc -n &lt;namespace-awx&gt;
</pre></div>


<h2 class="wp-block-heading" id="h-step-4-transfer-and-restore-the-backup-on-the-new-infrastructure">Step 4: Transfer and restore the backup on the new infrastructure</h2>



<p class="wp-block-paragraph">Now that the new AWX is set up, we’ll transfer the backup data and restore it.</p>



<ul class="wp-block-list">
<li><strong>Transfer the backup archive</strong><br>Copy the <code>awx_backup.tar.gz</code> file to the new infrastructure by uploading it to the new backup PVC using a temporary pod</li>
</ul>



<ul class="wp-block-list">
<li><strong>Create a temporary pod to restore data</strong><br>Create the awx-restore-access.yaml file</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
apiVersion: v1
kind: Pod
metadata:
  name: awx-backup-restore
  namespace: &lt;new-namespace-awx&gt;
spec:
  containers:
  - name: restore-container
    image: busybox:latest
    command: &#x5B;&quot;/bin/sh&quot;, &quot;-c&quot;, &quot;sleep 3600&quot;]
    volumeMounts:
    - mountPath: /backup-data
      name: awx-backup-pvc
  volumes:
  - name: awx-backup-pvc
    persistentVolumeClaim:
      claimName: &lt;pvc-for-awx-backup&gt;
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl apply -f awx-restore-access.yaml
</pre></div>


<ul class="wp-block-list">
<li><strong>Use <code>kubectl cp</code> to upload the archive to the pod</strong></li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl cp ./awx-backup-migration.tar.gz &lt;namespace-awx&gt;/awx-restore-access:/awx_backup.tar.gz
</pre></div>


<ul class="wp-block-list">
<li><strong>Replace the data from archive</strong><br>Inside the pod, extract the archive</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl exec -it awx-backup-restore -n &lt;new-namespace-awx&gt; -- /bin/sh
cd /backup-data
ls -l
## Find the latest directory

rm -rf /backup-data/&lt;latest-backup-directory&gt;/{tower.db,awx-objects}
cd
tar -xzvf /awx_backup.tar.gz

cp backup-data/&lt;backup-directory-from-tar.gz&gt;/tower.db /backup-data/&lt;latest-backup-directory&gt;/.
cp backup-data/&lt;backup-directory-from-tar.gz&gt;/awx-objects /backup-data/&lt;latest-backup-directory&gt;/.

vi /backup-data/&lt;latest-backup-directory&gt;/secret.yml
## Replace the value of the variable
## secrets:
##   secretKeySecret:
##     data: {secret_key: ###insert here the base64 of the decryption key recover at the end of the Step 1### }
</pre></div>


<ul class="wp-block-list">
<li><strong>Create the AWXRestore resource</strong><br>Create an <code>AWXRestore</code> resource to apply the backup</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
apiVersion: awx.ansible.com/v1beta1
kind: AWXRestore
metadata:
  name: awx-backup-restore
  namespace: &lt;new-namespace-awx&gt;
spec:
  deployment_name: &lt;awx-instance-name&gt;
  backup_name: awx-backup-migration
  no_log: false
  force_drop_db: true
</pre></div>


<ul class="wp-block-list">
<li><strong>Apply the AWXRestore</strong></li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl apply -f awxrestore.yaml
</pre></div>


<ul class="wp-block-list">
<li><strong>Monitor the restoration</strong><br>Ensure the restoration completes successfully</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl get awxrestore -n &lt;new-namespace-awx&gt;
</pre></div>


<h2 class="wp-block-heading" id="h-step-5-log-in-to-the-new-infrastructure-awx">Step 5: Log in to the new infrastructure AWX</h2>



<ul class="wp-block-list">
<li>You can log in as admin (the password will be that of the old infrastructure)</li>



<li>Explore the various AWX resources and check that everything has been migrated correctly</li>



<li>Run a template job to validate correct operation</li>
</ul>



<h2 class="wp-block-heading" id="h-conclusion">Conclusion</h2>



<p class="wp-block-paragraph">By following this procedure, we’ve successfully migrated an AWX instance across two isolated Kubernetes clusters while maintaining full fidelity of the AWX credentials and configurations.</p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/migrating-awx-from-one-kubernetes-cluster-to-another-a-custom-approach/">Migrating AWX from one Kubernetes cluster to another: A custom approach</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/migrating-awx-from-one-kubernetes-cluster-to-another-a-custom-approach/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Control-M for Kubernetes &#8211; Installation</title>
		<link>https://www.dbi-services.com/blog/control-m-for-kubernetes-installation/</link>
					<comments>https://www.dbi-services.com/blog/control-m-for-kubernetes-installation/#comments</comments>
		
		<dc:creator><![CDATA[David Diab]]></dc:creator>
		<pubDate>Mon, 30 Sep 2024 12:50:32 +0000</pubDate>
				<category><![CDATA[Control-M]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[kubernetes]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=34916</guid>

					<description><![CDATA[<p>After showing you an overview and the preparation of Control-M for Kubernetes, it is time to deep in with the installation of this solution. In fact, without the installation of Control-M for Kubernetes you can&#8217;t modernize your batch! In this blog, I will share with you how to do the installation of this solution step [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/control-m-for-kubernetes-installation/">Control-M for Kubernetes &#8211; Installation</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">After showing you an <a href="https://www.dbi-services.com/blog/control-m-for-kubernetes-overview/" target="_blank" rel="noreferrer noopener">overview</a> and the <a href="https://www.dbi-services.com/blog/control-m-for-kubernetes-preparation/" target="_blank" rel="noreferrer noopener">preparation</a> of Control-M for Kubernetes, it is time to deep in with the installation of this solution. In fact, without the installation of Control-M for Kubernetes you can&#8217;t modernize your batch!</p>



<span id="more-34916"></span>



<p class="wp-block-paragraph">In this blog, I will share with you how to do the installation of this solution step by step. Let&#8217;s remember the architecture.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="710" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/Screenshot-2024-09-03-152037-1-1024x710.png" alt="" class="wp-image-34918" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/Screenshot-2024-09-03-152037-1-1024x710.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/Screenshot-2024-09-03-152037-1-300x208.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/Screenshot-2024-09-03-152037-1-768x533.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/Screenshot-2024-09-03-152037-1.png 1228w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading" id="h-deploy-kubernetes-plug-in">Deploy kubernetes Plug-in</h2>



<p class="wp-block-paragraph">Firstly, download the Kubernetes Plugin, download the version 2.0.00 from the <a href="https://www.bmc.com/available/ddl.html?path=/LP/432491/432492&amp;fltk_=H1Xk4lhaAEEB4zdvEUcM1h6T8hJksIsesTplqG41Fye3juWNbvqKNjSOhPYDaNv4" target="_blank" rel="noreferrer noopener">Kubernetes plug-in download</a> page in the <a href="http://www.bmc.com/available/epd.html" target="_blank" rel="noreferrer noopener">Electronic Product Distribution</a> site.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="875" height="393" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/image-46.png" alt="" class="wp-image-34932" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/image-46.png 875w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/image-46-300x135.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/image-46-768x345.png 768w" sizes="auto, (max-width: 875px) 100vw, 875px" /></figure>



<p class="wp-block-paragraph">Once downloaded, publish the plug-in by putting the zip file in the following location: </p>



<pre class="wp-block-code"><code>$HOME_CTM/ctm_em/AUTO_DEPLOY
</code></pre>



<h2 class="wp-block-heading" id="h-generate-an-api-token">Generate an API Token</h2>



<p class="wp-block-paragraph">Basically, the API Token will be used later in the next step. In fact, we need to set up access to Control-M to register the Control-M/Agents, for sure, this step should be done by a Control-M Administrator.</p>



<p class="wp-block-paragraph">I assume that you know what is an API Token, and how to generate it, below are the steps quickly.</p>



<p class="wp-block-paragraph">To generate the API Token, go to the Control-M UI -&gt; Configuration, from the drop-down list, select API Tokens.</p>



<p class="wp-block-paragraph">The API Token tab appears, click Add Token.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="919" height="442" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/image-47.png" alt="" class="wp-image-34933" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/image-47.png 919w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/image-47-300x144.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/image-47-768x369.png 768w" sizes="auto, (max-width: 919px) 100vw, 919px" /></figure>



<p class="wp-block-paragraph">To generate the API Token, fill the following:</p>



<ul class="wp-block-list">
<li>The Token Name field.</li>



<li>The Roles field, remove or select the roles that you want to associate with the API Token (by default all roles are selected, which is not recommended).</li>



<li>Expiration Date, select Indefinitely from the drop-down list.</li>
</ul>



<p class="wp-block-paragraph">Click on Generate button.</p>



<h2 class="wp-block-heading" id="h-prepare-the-control-m-agent-deployment">Prepare the Control-M Agent deployment</h2>



<p class="wp-block-paragraph">I recommend to deploy the agent using the Helm shared by BMC! It is easy to configure and to maintain in a Kubernetes cluster.</p>



<p class="wp-block-paragraph">First of all, add a repository named controlm to contain the helm charts of the Control-M/Agent that is obtained from the Control-M Repository by running the following:</p>



<pre class="wp-block-code"><code>helm repo add controlm https://controlm-charts.s3.us-west-2.amazonaws.com/
</code></pre>



<p class="wp-block-paragraph">Then, ensure that the Control-M repository is listed as one of your repositories by running the following command line:</p>



<pre class="wp-block-code"><code>helm repo list</code></pre>



<p class="wp-block-paragraph">You can also list the charts within the new controlm repo by running the following command:</p>



<pre class="wp-block-code"><code>helm search repo controlm</code></pre>



<p class="wp-block-paragraph">Create the namespace, by executing the following:</p>



<pre class="wp-block-code"><code>kubectl create namespace ctmagt
</code></pre>



<h2 class="wp-block-heading" id="h-control-m-agent-deployment">Control-M Agent deployment</h2>



<p class="wp-block-paragraph">To deploy the Control-M Agent you should execute the Helm Install inside your kubernetes cluster:</p>



<pre class="wp-block-code"><code>helm install ctm-dbi controlm/controlm-agent --version 9.21.200 \
--set server.name=dbitest --set server.host=dbitest --set server.port=7005 --set server.ip=XX.XX.XX.XX \
--set api.endpoint=https://dbitest.x.com:8446/automation-api \
--set api.token=b2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX== \
--set pvc.storageClass=dbistorage</code></pre>



<p class="wp-block-paragraph">Adapt the command line to your environment!</p>



<p class="wp-block-paragraph">Check the pod status on the namespace (ctmagt) just created, once the agents pods are ready, check if they appear in Control-M -&gt; Configuration.</p>



<p class="wp-block-paragraph">By default, two pods should be created, two agents deployed. Sometimes agents are not available directly, don&#8217;t hesitate to disable and enable them.</p>



<h2 class="wp-block-heading" id="h-conclusion">Conclusion</h2>



<p class="wp-block-paragraph">Finally, we have two Control-M agents deployed on Kubernetes.</p>



<p class="wp-block-paragraph">In the next blog we will see how to create the connection profile, and how to create Control-M jobs to execute Kubernetes jobs.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/control-m-for-kubernetes-installation/">Control-M for Kubernetes &#8211; Installation</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/control-m-for-kubernetes-installation/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Control-M for Kubernetes &#8211; Preparation</title>
		<link>https://www.dbi-services.com/blog/control-m-for-kubernetes-preparation/</link>
					<comments>https://www.dbi-services.com/blog/control-m-for-kubernetes-preparation/#respond</comments>
		
		<dc:creator><![CDATA[David Diab]]></dc:creator>
		<pubDate>Wed, 25 Sep 2024 13:01:09 +0000</pubDate>
				<category><![CDATA[Control-M]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[kubernetes]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=34826</guid>

					<description><![CDATA[<p>As promised in the first blog of this series, here we are with the second blog to show you how to prepare the Control-M for Kubernetes solution, this solution allow to create and start Kubernetes pods using Control-M jobs. To implement Control-M for Kubernetes you will need to verify and prepare some prerequisites, like check [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/control-m-for-kubernetes-preparation/">Control-M for Kubernetes &#8211; Preparation</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">As promised in the <a href="https://www.dbi-services.com/blog/control-m-for-kubernetes-overview" target="_blank" rel="noreferrer noopener">first blog</a> of this series, here we are with the second blog to show you how to prepare the Control-M for Kubernetes solution, this solution allow to create and start Kubernetes pods using Control-M jobs.</p>



<span id="more-34826"></span>



<p class="wp-block-paragraph">To implement Control-M for Kubernetes you will need to verify and prepare some prerequisites, like check access, compatibility with OS, persistent storage, memory, firewall, aso.</p>



<p class="wp-block-paragraph">The compatibility between Control-M components has been shown in the <a href="https://www.dbi-services.com/blog/control-m-for-kubernetes-overview" target="_blank" rel="noreferrer noopener">previous blog</a>.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="320" height="170" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/bmc-control-m-2.png" alt="" class="wp-image-34832" style="width:364px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/bmc-control-m-2.png 320w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/bmc-control-m-2-300x159.png 300w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="576" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/Kubernetes-Logo-3-1024x576.png" alt="" class="wp-image-34835" style="width:357px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/Kubernetes-Logo-3-1024x576.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/Kubernetes-Logo-3-300x169.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/Kubernetes-Logo-3-768x432.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/Kubernetes-Logo-3-1536x864.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/Kubernetes-Logo-3-2048x1152.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>
</div>



<h2 class="wp-block-heading" id="h-access">Access</h2>



<p class="wp-block-paragraph">First of all, the following access should be delivered to the expert(s) to allow a smooth implementation of Control-M for Kubernetes:</p>



<ul class="wp-block-list">
<li>Full admin access to Control-M UI</li>



<li>Access on the servers hosting the Control-M Server and Control-M EM</li>



<li>Sudo to Control-M EM user, and Control-M/Server user</li>



<li>Access to OpenShift or Kubernetes cluster</li>



<li>A valid account to access <a href="http://www.bmc.com/available/epd.html">BMC Support Central / Electronic Product Distribution</a> to download Control-M plugins.</li>
</ul>



<h2 class="wp-block-heading" id="h-compatibility">Compatibility</h2>



<p class="wp-block-paragraph">Additionally to the Control-M components compatibility, the Control-M Automation API Command Line Interface (CLI) will not be available on the following platforms as they do not support a secure version of Node.js:</p>



<ul class="wp-block-list">
<li>Amazon Linux 2</li>



<li>SUSE Linux 12</li>



<li>Red Hat 7</li>



<li>Oracle Linux 7</li>



<li>CentOS 7</li>
</ul>



<p class="wp-block-paragraph">Please be sure that you are on a version compatible with the Control-M Automation API CLI.</p>



<h2 class="wp-block-heading" id="h-persistent-storage">Persistent Storage</h2>



<p class="wp-block-paragraph">Prepare a persistent Storage that will be used by Control-M Agents for storage on OpenShift or Kubernetes cluster. Basically, the persistent volume ensures that job data and Agent state are kept during pod restarts.</p>



<p class="wp-block-paragraph">BMC recommends that you run multiple Agents on separate nodes in the namespace. The default is two Agents.</p>



<p class="wp-block-paragraph">To support multiple Agents, the storage class (and underlying storage technology) must support ReadWriteMany access mode. The recommended storage size is minimum 5Gi per agent (by default 10Gi).</p>



<p class="wp-block-paragraph">If NFS Storage Class is used, ensure that the UID and GID, which are&nbsp;Storage Class parameters for dynamic provisioning,&nbsp;are set to the following values:</p>



<ul class="wp-block-list">
<li>UID=1000  </li>



<li>GID=0</li>
</ul>



<h2 class="wp-block-heading" id="h-memory">Memory</h2>



<p class="wp-block-paragraph">By default, there could be some limitation in your cluster, please review the limitations on pods/containers memory.</p>



<p class="wp-block-paragraph">For example, via the OpenShift console, adapt the maximum memory authorized to allow 2Gi of memory, which is the default value of Helm Control-M Agent installation.</p>



<h2 class="wp-block-heading" id="h-firewall">Firewall</h2>



<p class="wp-block-paragraph">Some rules need to be configured on Firewall level, to authorize the agent to reach out to Control-M. The list of ports depends on your organization, in mine the ports opened where 7005-7015 + 13075.</p>



<p class="wp-block-paragraph">There is no need to open the Firewall from server to agent, or to configure any ingress, as it uses the cluster API entry point.</p>



<p class="wp-block-paragraph"> </p>



<p class="wp-block-paragraph">When all prerequisites are ready, you can move forward to publish Plug-In, get the API Token, prepare and deploy the Control-M agent on Kubernetes. These steps will be shared in the next blog so stay connected <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">For further reading, please find all blogs around <a href="https://www.dbi-services.com/blog/category/control-m/" target="_blank" rel="noreferrer noopener">Control-M</a>, and <a href="https://www.dbi-services.com/blog/category/kubernetes/" target="_blank" rel="noreferrer noopener">Kubernetes</a>.</p>



<p class="wp-block-paragraph"></p>
<p>L’article <a href="https://www.dbi-services.com/blog/control-m-for-kubernetes-preparation/">Control-M for Kubernetes &#8211; Preparation</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/control-m-for-kubernetes-preparation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Control-M for Kubernetes &#8211; Overview</title>
		<link>https://www.dbi-services.com/blog/control-m-for-kubernetes-overview/</link>
					<comments>https://www.dbi-services.com/blog/control-m-for-kubernetes-overview/#respond</comments>
		
		<dc:creator><![CDATA[David Diab]]></dc:creator>
		<pubDate>Fri, 13 Sep 2024 08:10:19 +0000</pubDate>
				<category><![CDATA[Control-M]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[kubernetes]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=34745</guid>

					<description><![CDATA[<p>At a customer, I implemented Control-M for Kubernetes/OpenShift, as the customer has a hybrid environment between VM, on-premise/Cloud Kubernetes/OpenShift. This is the first blog of a series, in which I will share with you from A to Z how to implement Control-M for Kubernetes and OpenShift. Control-M for Kubernetes enables you to execute Control-M job(s) [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/control-m-for-kubernetes-overview/">Control-M for Kubernetes &#8211; Overview</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">At a customer, I implemented Control-M for Kubernetes/OpenShift, as the customer has a hybrid environment between VM, on-premise/Cloud Kubernetes/OpenShift. This is the first blog of a series, in which I will share with you from A to Z how to implement Control-M for Kubernetes and OpenShift. </p>



<span id="more-34745"></span>



<p class="wp-block-paragraph"><a href="https://www.bmc.com/it-solutions/control-m.html" target="_blank" rel="noreferrer noopener">Control-M</a> for <a href="https://kubernetes.io/docs/home/" target="_blank" rel="noreferrer noopener">Kubernetes </a>enables you to execute Control-M job(s) to run one or more pods to completion in a Kubernetes cluster. This enables you to integrate Control-M capabilities, such as advanced scheduling criteria, status monitoring, and SLA management.</p>



<p class="wp-block-paragraph">In fact, my story with Control-M began before Kubernetes existed, today, as a Control-M and Kubernetes expert I will be able to help you to understand and implement Control-M for Kubernetes. This first blog will be more a quick overview on these technologies and understand the implementation.</p>



<p class="wp-block-paragraph">To be honest, you will need at least intermediate level on Control-M and Kubernetes to implement smoothly this solution. If you want to know more about Docker and Kubernetes, I would recommend this <a href="https://www.dbi-services.com/courses/docker-and-kubernetes-essential-skills/" target="_blank" rel="noreferrer noopener">training</a>.</p>



<h2 class="wp-block-heading" id="h-control-m-overview">Control-M Overview</h2>



<p class="wp-block-paragraph">Control-M is a workload automation solution that enables you to automate the scheduling and processing the business workflows across various platforms and applications from a single point of control. Nowadays, those platforms and application could be on VM, Kubernetes cluster, Cloud, etc.</p>



<p class="wp-block-paragraph">Today, Control-M allow you to execute jobs in almost every platform, but what is a job?</p>



<p class="wp-block-paragraph">A job is an execution unit, each job needs specific run information to be executed, such as scheduling criteria, post processing actions, and also job dependencies as shown in the following:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="631" height="476" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/ss-accelerate-new-applications.svg" alt="" class="wp-image-34755" /></figure>



<p class="wp-block-paragraph">On &#8220;legacy&#8221; systems, a job could be a script or command, that is executed at the operating system level. On Kubernetes, a job take another role, which allow you at the end to deploy pods in Kubernetes. Let&#8217;s get a quick overview on Kubernetes and understand pods <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 class="wp-block-heading" id="h-kubernetes-overview">Kubernetes Overview</h2>



<p class="wp-block-paragraph">Kubernetes is a portable, extensible, open source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation. The smallest unit of a Kubernetes application is a pod!</p>



<p class="wp-block-paragraph">A Kubernetes <a href="https://kubernetes.io/docs/concepts/workloads/pods/" target="_blank" rel="noreferrer noopener">pod </a>is a collection of one or more Linux containers. Any given pod can be composed of multiple, tightly coupled containers or just a single container.</p>



<h2 class="wp-block-heading" id="h-control-m-for-kubernetes-overview">Control-M for Kubernetes Overview</h2>



<p class="wp-block-paragraph">Now, we understood Control-M jobs and Kubernetes pods, let see how those will be connected.</p>



<p class="wp-block-paragraph">The following diagram demonstrates how the components of Control-M for Kubernetes are incorporated into a Kubernetes cluster and how they enable you to run one or more pods to completion.</p>



<p class="wp-block-paragraph">In this example, two Control-M/Agents are deployed as cluster pods.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="751" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/KubernetesDiagramOnprem-1024x751.png" alt="" class="wp-image-34748" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/KubernetesDiagramOnprem-1024x751.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/KubernetesDiagramOnprem-300x220.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/KubernetesDiagramOnprem-768x563.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/09/KubernetesDiagramOnprem.png 1357w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">This setup has the following main features:</p>



<ul class="wp-block-list">
<li>The Agent pods run as a StatefulSet, so that the hostname is identified consistently across pod restarts. This enables Control-M/Server to identify the Control-M/Agent continuously and consistently.</li>



<li>Agent pods use a persistent volume, so that job data and the Control-M/Agent state are kept during pod restarts.</li>



<li>The Agents belong to a host group, to ensure high availability and load balancing between the Agents.</li>



<li>Agent to Server communication is set up as a persistent connection that is initiated by the Agent. This prevents the exposure of the Kubernetes cluster to outside connections.</li>



<li>The Kubernetes plug-in adds a Kubernetes-type job to Control-M, which enables you to run one or more pods to completion in the Application namespace.</li>
</ul>



<p class="wp-block-paragraph">But how it works? which component allow us to create a pod inside Kubernetes?</p>



<p class="wp-block-paragraph">In fact, it is mainly the role of the plug-in, which is responsible for the following stages in the execution of the Kubernetes-type job in Control-M:</p>



<ul class="wp-block-list">
<li>Starts a Kubernetes job entity that runs one or more Application pods in the Application namespace in the Kubernetes cluster.</li>



<li>From Control-M, monitors the status of the job in Kubernetes until it ends when the Application pods finish running.</li>



<li>Captures the pod logs for display in the Control-M job output.</li>



<li>Deletes the Kubernetes job entity to free cluster resources.</li>
</ul>



<h2 class="wp-block-heading" id="h-compatibility">Compatibility</h2>



<p class="wp-block-paragraph"><strong>Kubernetes</strong></p>



<p class="wp-block-paragraph">Control-M for Kubernetes is a generic solution for all Kubernetes-based container platforms. The following platforms were tested by BMC:</p>



<ul class="wp-block-list">
<li>RedHat OpenShift</li>



<li>Amazon Elastic Kubernetes Service (EKS)</li>



<li>Azure&nbsp;Kubernetes Service (AKS)</li>
</ul>



<p class="wp-block-paragraph">Supported versions of Kubernetes: 1.26-1.29</p>



<p class="wp-block-paragraph"><strong>Control-M</strong></p>



<p class="wp-block-paragraph">Before any action on your system, please insure that you have at least the following versions:</p>



<figure class="wp-block-table"><table><tbody><tr><td>Component</td><td>Minimum version</td></tr><tr><td>Control-M/EM</td><td>9.0.21.100</td></tr><tr><td>Control-M/Server</td><td>9.0.20.200</td></tr><tr><td>Control-M Automation API</td><td>9.0.21.305</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Take a look on the versions that should be installed to implement Control-M for Kubernetes:</p>



<figure class="wp-block-table"><table><tbody><tr><td><strong>Component</strong></td><td><strong>Current Version</strong></td></tr><tr><td>Control-M</td><td>9.0.21</td></tr><tr><td>Helm Chart</td><td>9.0.21.200</td></tr><tr><td>Agent image</td><td>9.0.21.200</td></tr><tr><td>Control-M Agent</td><td>9.0.21.200</td></tr><tr><td>Kubernetes plug-in</td><td>1.0.00</td></tr><tr><td>Java</td><td>17</td></tr></tbody></table></figure>



<h2 class="wp-block-heading" id="h-conclusion">Conclusion</h2>



<p class="wp-block-paragraph">We saw together what is Control-M, OpenShift, a quick overview on how Control-M for Kubernetes will be installed, how it will work in general, and the compatibility between all versions!</p>



<p class="wp-block-paragraph">In the next blog, we will start the implementation of Control-M for Kubernetes.</p>



<p class="wp-block-paragraph">In the meantime, to enrich your knowledge and be ready for the next step, here are some <a href="https://www.dbi-services.com/" target="_blank" rel="noreferrer noopener">dbi services</a> blogs around <a href="https://www.dbi-services.com/blog/category/control-m/" target="_blank" rel="noreferrer noopener">Control-M</a> and <a href="https://www.dbi-services.com/blog/category/kubernetes/" target="_blank" rel="noreferrer noopener">Kubernetes</a>.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/control-m-for-kubernetes-overview/">Control-M for Kubernetes &#8211; Overview</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/control-m-for-kubernetes-overview/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Lazy Loading (feed)

Served from: www.dbi-services.com @ 2026-06-16 09:06:43 by W3 Total Cache
-->