<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[btech-engineering - Medium]]></title>
        <description><![CDATA[We are from btech.id Enginneers, our mission to continuous learning &amp; remember together is better. Hopefully we can share, share and share about our troubleshooting, research, and others here. - Medium]]></description>
        <link>https://medium.com/btech-engineering?source=rss----3b1ae0e73706---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>btech-engineering - Medium</title>
            <link>https://medium.com/btech-engineering?source=rss----3b1ae0e73706---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 06 Jun 2026 17:38:14 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/btech-engineering" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Automation ArgoCD with CI Pipeline Using Image Updater]]></title>
            <link>https://medium.com/btech-engineering/automation-argocd-with-ci-pipeline-using-image-updater-f92782bab4c0?source=rss----3b1ae0e73706---4</link>
            <guid isPermaLink="false">https://medium.com/p/f92782bab4c0</guid>
            <category><![CDATA[argo-cd]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[ci-pipeline]]></category>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[automation]]></category>
            <dc:creator><![CDATA[Fauzan R]]></dc:creator>
            <pubDate>Tue, 09 May 2023 03:34:02 GMT</pubDate>
            <atom:updated>2023-05-09T03:34:02.636Z</atom:updated>
            <content:encoded><![CDATA[<h4>Another way to combine CI Pipeline with ArgoCD</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zD8CLWJdN2t3CyWmNLN7rA.png" /></figure><h3>Introduction</h3><h4>ArgoCD</h4><p>Argo CD is an open-source continuous delivery tool for Kubernetes that automates the deployment of your applications and infrastructure as code. With Argo CD, you can define your Kubernetes application manifests as declarative YAML files and store them in a version control system like Git. Argo CD then continuously monitors your Git repository for changes to your application manifests, and automatically deploys them to your Kubernetes cluster as needed.</p><p>Argo CD also provides a web-based user interface that allows you to view the status of your applications and infrastructure, and roll back to previous versions if needed. In addition, Argo CD can integrate with your existing CI/CD pipelines and GitOps workflows, providing a seamless and automated deployment experience.</p><h4>ArgoCD Image Updater</h4><p>Argo CD Image Updater is an optional component of Argo CD that automates the updating of container images in your Kubernetes deployments. It continuously scans your container image registry for new versions of your images and updates your Kubernetes deployment manifests with the latest image tags.</p><p>Argo CD Image Updater uses customizable strategies to perform image updates, including simple tag updates, canary releases, and blue-green deployments. You can configure it to work with a variety of image registries, including Docker Hub, Google Container Registry, and Amazon Elastic Container Registry.</p><p>Argo CD Image Updater simplifies the process of updating container images in your Kubernetes deployments and allows you to maintain a consistent and up-to-date application environment. By automating image updates, you can reduce the risk of manual errors and improve the efficiency of your DevOps processes.</p><h3>Why?</h3><p><a href="https://argocd-image-updater.readthedocs.io/en/stable/"><strong>argocd-image-updater</strong></a><strong> </strong>is alternative way to combine CI pipeline and CD proses if you’re using ArgoCD. In another way, strategy to combine ArgoCD with CI pipeline is add new pipeline stages that will Pull -&gt; Write -&gt; Push deployment manifest to repository, after that it will trigger sync process ArgoCD for checking new version of deployment app.</p><p>Argo CD Image Updater provides a number of benefits over other ways of combining CI pipelines and Argo CD for image updates:</p><ol><li>Automated image updates: With Argo CD Image Updater, you can automate the process of updating container images in your Kubernetes deployments, which reduces the need for manual intervention and minimizes the risk of human error.</li><li>Flexibility: Argo CD Image Updater supports a variety of image update strategies, including simple tag updates, canary releases, and blue-green deployments, so you can choose the strategy that works best for your specific use case.</li><li>Integration with Argo CD: Argo CD Image Updater is designed to work seamlessly with Argo CD, so you can use a single tool to manage your Kubernetes deployments and image updates.</li><li>Scalability: Argo CD Image Updater is designed to handle large-scale deployments with thousands of images and provides a number of performance optimizations to ensure that image updates are performed quickly and efficiently.</li></ol><h3>How?</h3><h4>Prerequisites</h4><ul><li>Kubernetes with argocd has installed</li><li>Account docker hub</li></ul><h4>Step-by-step</h4><p>1. Install argocd-image-updater as plugin for existing argocd. You can install Argo CD Image Updater by running the following command:</p><pre>helm install argocd-image-updater argo/argocd-image-updater — namespace argocd — set image.repository=&lt;image_repo&gt;</pre><p>Replace &lt;image_repo&gt; with the image repository where you want to pull container images from, such as docker.io. This command installs the Image Updater pod and sets up the necessary RBAC permissions.</p><p>2. Configure your container image registry: You need to configure Argo CD Image Updater with the credentials for your container image registry, so it can pull the latest image versions. You can create a Kubernetes secret containing the registry credentials by running the following command:</p><pre>kubectl create secret docker-registry &lt;secret_name&gt; --docker-server=&lt;registry_url&gt; --docker-username=&lt;username&gt; --docker-password=&lt;password&gt; --docker-email=&lt;email&gt;</pre><p>Replace &lt;secret_name&gt; with a name for the secret, &lt;registry_url&gt; with the URL of your container image registry, &lt;username&gt; with your registry username, &lt;password&gt; with your registry password, and &lt;email&gt; with your email address.</p><p>then, you must add new ConfigMap for argocd-image-updater</p><pre>apiVersion: v1<br>kind: ConfigMap<br>metadata:<br>  name: argocd-image-updater-config<br>data:<br>  registries.conf: |<br>    registries:<br>    - name: Docker Hub<br>      prefix: docker.io<br>      api_url: https://registry-1.docker.io<br>      credentials: secret:&lt;secret_name&gt;<br>      defaultns: library<br>      default: true</pre><p>3. Configure your image update policy: You can configure your image update policy by adding an annotations section to your Argo CD application manifests. Here is an example annotations section that performs simple tag updates:</p><pre>apiVersion: argoproj.io/v1alpha1<br>kind: Application<br>metadata:<br>  name: myapp<br>  namespace: myapp<br>annotations:<br>  argocd-image-updater.argoproj.io/image-list: myimage=some/image:latest<br>  argocd-image-updater.argoproj.io//myimage.update-strategy: digest<br>  argocd-image-updater.argoproj.io/write-back-method: git<br>  argocd-image-updater.argoproj.io/git-branch: master<br>spec:<br>  project: default<br>  source:<br>    repoURL: &lt;repo_url&gt;<br>    path: myapp<br>  destination:<br>    server: https://kubernetes.default.svc<br>    namespace: myapp<br>  syncPolicy:<br>    automated:<br>      prune: true<br>      selfHeal: true</pre><p>Replace &lt;repo_url&gt; with the URL of your Git repository</p><p>4. Monitor and troubleshoot: Once you have set up Argo CD Image Updater, you can monitor its activity and troubleshoot any issues by checking the logs of the Image Updater pod and the Argo CD application controller pod. You can use kubectl to view the logs:</p><pre>kubectl logs -f &lt;pod_name&gt;</pre><p>Replace &lt;pod_name&gt; with the name of the pod you want to view logs for. You can also use the Argo CD UI to view the status of your applications and image updates.</p><h3>Closing</h3><p>implementing Argo CD Image Updater involves installing and configuring the Image Updater pod, configuring your image update policy, and configuring your container image registry. With Argo CD Image Updater, you can automate the updating of container images in your Kubernetes deployments, which simplifies the process of maintaining an up-to-date application environment</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f92782bab4c0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/btech-engineering/automation-argocd-with-ci-pipeline-using-image-updater-f92782bab4c0">Automation ArgoCD with CI Pipeline Using Image Updater</a> was originally published in <a href="https://medium.com/btech-engineering">btech-engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Getting started with Wazuh: Installation and Configuration Guide]]></title>
            <link>https://medium.com/btech-engineering/getting-started-with-wazuh-installation-and-configuration-guide-7caac7d73e42?source=rss----3b1ae0e73706---4</link>
            <guid isPermaLink="false">https://medium.com/p/7caac7d73e42</guid>
            <category><![CDATA[installation]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[monitor]]></category>
            <category><![CDATA[wazuh]]></category>
            <dc:creator><![CDATA[Btech Engineering]]></dc:creator>
            <pubDate>Tue, 02 May 2023 02:39:08 GMT</pubDate>
            <atom:updated>2023-04-28T09:02:15.708Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YBLHlBxeasRAp5-u.png" /><figcaption><a href="https://wazuh.com/">Wazuh</a></figcaption></figure><h3>Introduction</h3><p>Wazuh is a popular open-source security platform that provides an extensive range of threat detection, visibility, and response capabilities. It is designed to help organizations to monitor and manage their security posture more effectively by collecting, analyzing, and correlating security-related data from various sources across their network infrastructure. The platform leverages a combination of host-based intrusion detection (HIDS), log analysis, and security event correlation to detect, identify, and respond to potential security incidents.</p><p>At its core, Wazuh consists of three primary components: the Wazuh server, agents, and the Wazuh app. The Wazuh server is responsible for collecting and analyzing security data from various sources, while the agents are installed on the monitored endpoints to collect security-relevant data such as system events, network traffic, and file integrity. The Wazuh app provides a web-based user interface that allows security analysts to view and analyze security events, configure rules, and manage the Wazuh infrastructure. With its robust feature set and flexible architecture, Wazuh has become a popular choice for security professionals who seek to improve their organization’s security posture while minimizing the risk of security breaches.</p><h3>Preparing for the Installation</h3><h4>Operating System</h4><p>Wazuh can be installed on various operating systems, including CentOS, Debian, Ubuntu, Windows, and macOS.</p><h4>Hardware Specifications</h4><p>Hardware requirements highly depend on the number of protected endpoints and cloud workloads.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/456/1*FzOGVd1C84XiN_PCSsXJhg.png" /><figcaption><a href="https://documentation.wazuh.com/current/quickstart.html">Documentation Wazuh</a></figcaption></figure><h4>Software Dependencies</h4><p>Wazuh requires several software components, including Elastic Stack, Filebeat, and Wazuh Manager. Elastic Stack is a set of open-source tools for data processing and analysis, including Elasticsearch, Logstash, and Kibana. Filebeat is a lightweight agent that collects log data from different sources and forwards it to Elasticsearch. Wazuh Manager is the central component of the Wazuh architecture, which receives data from the Wazuh Agents and processes it to generate alerts and notifications.</p><h3>Step-by-Step Installation</h3><h4><strong>Install Wazuh</strong></h4><pre>apt install -y curl apt-transport-https unzip wget libcap2-bin software-properties-common lsb-release gnupg<br>curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | apt-key add -<br>echo &quot;deb https://packages.wazuh.com/4.x/apt/ stable main&quot; | tee -a /etc/apt/sources.list.d/wazuh.list<br>apt-get update</pre><h4><strong>Install Wazuh Manager</strong></h4><pre>apt install -y wazuh-manager<br><br>systemctl daemon-reload<br>systemctl enable --now wazuh-manager<br>systemctl status wazuh-manager</pre><h4><strong>Install Elasticsearch</strong></h4><p>Install Elasticsearch</p><pre>apt install -y elasticsearch-oss opendistroforelasticsearch<br><br>curl -so /etc/elasticsearch/elasticsearch.yml https://packages.wazuh.com/resources/4.2/open-distro/elasticsearch/7.x/elasticsearch_all_in_one.yml<br>curl -so /usr/share/elasticsearch/plugins/opendistro_security/securityconfig/roles.yml https://packages.wazuh.com/resources/4.2/open-distro/elasticsearch/roles/roles.yml<br>curl -so /usr/share/elasticsearch/plugins/opendistro_security/securityconfig/roles_mapping.yml https://packages.wazuh.com/resources/4.2/open-distro/elasticsearch/roles/roles_mapping.yml<br>curl -so /usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml https://packages.wazuh.com/resources/4.2/open-distro/elasticsearch/roles/internal_users.yml</pre><p>Create certificate</p><pre>rm /etc/elasticsearch/esnode-key.pem /etc/elasticsearch/esnode.pem /etc/elasticsearch/kirk-key.pem /etc/elasticsearch/kirk.pem /etc/elasticsearch/root-ca.pem -f<br><br>curl -so ~/wazuh-cert-tool.sh https://packages.wazuh.com/resources/4.2/open-distro/tools/certificate-utility/wazuh-cert-tool.sh<br>curl -so ~/instances.yml https://packages.wazuh.com/resources/4.2/open-distro/tools/certificate-utility/instances_aio.yml<br><br>bash ~/wazuh-cert-tool.sh<br><br>mkdir /etc/elasticsearch/certs/<br>mv ~/certs/elasticsearch* /etc/elasticsearch/certs/<br>mv ~/certs/admin* /etc/elasticsearch/certs/<br>cp ~/certs/root-ca* /etc/elasticsearch/certs/<br><br>mkdir -p /etc/elasticsearch/jvm.options.d<br>echo &#39;-Dlog4j2.formatMsgNoLookups=true&#39; &gt; /etc/elasticsearch/jvm.options.d/disabledlog4j.options<br>chmod 2750 /etc/elasticsearch/jvm.options.d/disabledlog4j.options<br>chown root:elasticsearch /etc/elasticsearch/jvm.options.d/disabledlog4j.options<br><br>systemctl daemon-reload<br>systemctl enable elasticsearch<br>systemctl start elasticsearch<br><br>export JAVA_HOME=/usr/share/elasticsearch/jdk/ &amp;&amp; /usr/share/elasticsearch/plugins/opendistro_security/tools/securityadmin.sh -cd /usr/share/elasticsearch/plugins/opendistro_security/securityconfig/ -nhnv -cacert /etc/elasticsearch/certs/root-ca.pem -cert /etc/elasticsearch/certs/admin.pem -key /etc/elasticsearch/certs/admin-key.pem</pre><h4>Install Filebeat</h4><p>Install Filebeat</p><pre>apt install -y filebeat</pre><p>Config Filebeat</p><pre>curl -so /etc/filebeat/filebeat.yml https://packages.wazuh.com/resources/4.2/open-distro/filebeat/7.x/filebeat_all_in_one.yml<br><br>curl -so /etc/filebeat/wazuh-template.json https://raw.githubusercontent.com/wazuh/wazuh/4.2/extensions/elasticsearch/7.x/wazuh-template.json<br>chmod go+r /etc/filebeat/wazuh-template.json</pre><p>Install Module Filebeat</p><pre>curl -s https://packages.wazuh.com/4.x/filebeat/wazuh-filebeat-0.1.tar.gz | tar -xvz -C /usr/share/filebeat/module</pre><p>Copy certs</p><pre>mkdir /etc/filebeat/certs<br>cp ~/certs/root-ca.pem /etc/filebeat/certs/<br>mv ~/certs/filebeat* /etc/filebeat/certs/</pre><p>Restart Daemon</p><pre>systemctl daemon-reload<br>systemctl enable filebeat<br>systemctl start filebeat</pre><p>Configure Filebeat</p><pre>filebeat test output</pre><h4>Install Kibana</h4><p>Install package</p><pre>apt install -y opendistroforelasticsearch-kibana</pre><p>Download kibana config</p><pre>curl -so /etc/kibana/kibana.yml https://packages.wazuh.com/resources/4.2/open-distro/kibana/7.x/kibana_all_in_one.yml</pre><p>Prepare directory</p><pre>mkdir /usr/share/kibana/data<br>chown -R kibana:kibana /usr/share/kibana/data</pre><p>Kibana plugin</p><pre>cd /usr/share/kibana<br>sudo -u kibana /usr/share/kibana/bin/kibana-plugin install https://packages.wazuh.com/4.x/ui/kibana/wazuh_kibana-4.2.6_7.10.2-1.zip</pre><p>Elasticsearch certificates</p><pre>mkdir /etc/kibana/certs<br>cp ~/certs/root-ca.pem /etc/kibana/certs/<br>mv ~/certs/kibana* /etc/kibana/certs/<br>chown kibana:kibana /etc/kibana/certs/*</pre><p>Configure netcap</p><pre>setcap &#39;cap_net_bind_service=+ep&#39; /usr/share/kibana/node/bin/node</pre><p>Configure systemd</p><pre>systemctl daemon-reload<br>systemctl enable kibana<br>systemctl start kibana</pre><h3>Add Wazuh Agent (Linux)</h3><h4>Get setup agent commnad</h4><p>Open Wazuh Manager https://&lt;ip_wazuh_manager&gt;</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KNdBGdB-S_gSqzGlC7DV_Q.png" /><figcaption>Debian/Ubuntu</figcaption></figure><p>Set Wazuh Manager Address</p><pre>curl -so wazuh-agent-4.2.6.deb https://packages.wazuh.com/4.x/apt/pool/main/w/wazuh-agent/wazuh-agent_4.2.6-1_amd64.deb &amp;&amp; sudo WAZUH_MANAGER=&#39;172.100.1.11&#39; WAZUH_AGENT_GROUP=&#39;default&#39; dpkg -i ./wazuh-agent-4.2.6.deb</pre><h4>Setup Agent</h4><p>Setup Repo</p><pre>curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | apt-key add -<br>echo &quot;deb https://packages.wazuh.com/4.x/apt/ stable main&quot; | tee -a /etc/apt/sources.list.d/wazuh.list<br>apt-get update</pre><p>Install and register agent</p><pre>curl -so wazuh-agent-4.2.6.deb https://packages.wazuh.com/4.x/apt/pool/main/w/wazuh-agent/wazuh-agent_4.2.6-1_amd64.deb &amp;&amp; sudo WAZUH_MANAGER=&#39;172.100.1.11&#39; WAZUH_AGENT_GROUP=&#39;default&#39; dpkg -i ./wazuh-agent-4.2.6.deb</pre><p>Enable and start agent service</p><pre>sudo systemctl daemon-reload<br>sudo systemctl enable wazuh-agent<br>sudo systemctl start wazuh-agent</pre><h3>Verification</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PyMOjCPWt4talelFoRgQmw.png" /></figure><h3>Conclusion</h3><p>In summary, Wazuh is a comprehensive security platform that provides organizations with the necessary tools to detect and respond to security threats in real-time.</p><p><strong>Documentation By</strong><a href="https://id.linkedin.com/in/ajiarya"><strong> Aji Arya</strong></a></p><h4>Our Tagline</h4><blockquote><em>#ContinuousLearning</em></blockquote><h4>Reference</h4><p><a href="https://documentation.wazuh.com/current/index.html">Wazuh documentation</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7caac7d73e42" width="1" height="1" alt=""><hr><p><a href="https://medium.com/btech-engineering/getting-started-with-wazuh-installation-and-configuration-guide-7caac7d73e42">Getting started with Wazuh: Installation and Configuration Guide</a> was originally published in <a href="https://medium.com/btech-engineering">btech-engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Deploy your VM in Kubernetes Cluster using Kubevirt]]></title>
            <link>https://medium.com/btech-engineering/deploy-your-vm-in-kubernetes-cluster-using-kubevirt-5a544a9b4223?source=rss----3b1ae0e73706---4</link>
            <guid isPermaLink="false">https://medium.com/p/5a544a9b4223</guid>
            <category><![CDATA[kubevirt]]></category>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[virtualization]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[infrastructure]]></category>
            <dc:creator><![CDATA[Btech Engineering]]></dc:creator>
            <pubDate>Mon, 17 Apr 2023 14:50:41 GMT</pubDate>
            <atom:updated>2023-04-14T10:01:56.717Z</atom:updated>
            <content:encoded><![CDATA[<h4>Solution for integration between Microservices &amp; Virtual Machine | Deploy VM on top Kubernetes</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/419/0*1JUvC2fXyQWNf_6Z.png" /><figcaption><a href="https://kubevirt.io/">https://kubevirt.io/</a></figcaption></figure><h3>Intro</h3><p>Kubevirt provides a seamless solution for integrating microservices with virtual machines in a Kubernetes cluster. To get started, install Kubevirt onto your cluster using the Kubevirt Operator, and then use the Kubevirt API to define and create virtual machines. With Kubevirt, you can manage virtual machines just like any other Kubernetes resource, using tools like kubectl to monitor and modify them.</p><p>In addition to Kubernetes features such as RBAC and network policies, Kubevirt also provides a user-friendly web-based interface for managing virtual machines. This allows you to easily create and configure VMs, as well as monitor their performance and resource usage. By deploying your VMs in Kubernetes with Kubevirt, you can enjoy the scalability and reliability of containerized microservices, while also leveraging the versatility and power of virtual machines for your application infrastructure.</p><h4>Purpose</h4><p>This scenario walks through the creation of a Virtual Machine Instance (VMI) on Kubernetes and then how virtctl is used to interact with its console. This tutorial based on <a href="https://kubevirt.io/labs/kubernetes/lab1.html">Kubevirt Documentation</a>.</p><h3>Practical</h3><h4>Pre-requisites</h4><ul><li>Kubernetes Cluster</li><li>Kubevirt already installed on Kubernetes Cluster</li></ul><h4>Installation</h4><p>Create VM</p><pre>nano vm.yaml<br>...<br>apiVersion: kubevirt.io/v1alpha3<br>kind: VirtualMachine<br>metadata:<br>  name: testvm<br>spec:<br>  running: false<br>  template:<br>    metadata:<br>      labels:<br>        kubevirt.io/size: small<br>        kubevirt.io/domain: ubuntu-bionic<br>    spec:<br>      domain:<br>        cpu:<br>          cores: 1<br>        devices:<br>          disks:<br>            - name: containervolume<br>              disk:<br>                bus: virtio<br>            - name: cloudinitvolume<br>              disk:<br>                bus: virtio<br>          interfaces:<br>          - name: default<br>            masquerade: {}<br>        resources:<br>          requests:<br>            memory: 2048M<br>      networks:<br>      - name: default<br>        pod: {}<br>      volumes:<br>        - name: containervolume<br>          containerDisk:<br>            image: tedezed/ubuntu-container-disk:20.0<br>        - name: cloudinitvolume<br>          cloudInitNoCloud:<br>            userData: |-<br>              #cloud-config<br>              chpasswd:<br>                list: |<br>                  ubuntu:ubuntu<br>                  root:toor<br>                expire: False</pre><p>Apply the manifest to Kubernetes</p><pre>kubectl create ns vm<br>kubectl apply -f vm.yaml -n vm<br>...output...<br>virtualmachine.kubevirt.io &quot;testvm&quot; created<br>  virtualmachineinstancepreset.kubevirt.io &quot;small&quot; created</pre><h4>Manage Virtual Machines</h4><p>To get a list of existing Virtual Machines</p><pre>kubectl get vms -n vm<br>...output...<br>NAME     AGE    STATUS    READY<br>testvm   117s   Stopped   False<br>............<br>kubectl get vms -o yaml testvm -n vm</pre><p>To start a Virtual Machine you can use:</p><pre>virtctl start testvm -n vm<br>...output...<br>VM testvm was scheduled to start<br>............<br><br>kubectl get vms -n vm<br>...output...<br>NAME     AGE     STATUS    READY<br>testvm   4m27s   Running   True</pre><p>After start we can check status VM</p><pre>kubectl get vmis -n vm<br>NAME     AGE    PHASE     IP              NODENAME           READY<br>testvm   2m6s   Running   10.10.101.140   kubevirt-worker1   True</pre><h4>Controlling the State of the VM</h4><p>To shut it down:</p><pre>virtctl stop testvm -n vm</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/716/1*ta9Zfv6jOU0ecDHhBXZjDw.png" /></figure><p>To delete a Virtual Machine:</p><pre>kubectl delete vm testvm -n vm</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/717/1*chYb9Yt26Hy9VAEsUDrIeg.png" /></figure><h3>Conclusion</h3><p>In conclusion, Kubevirt is a powerful tool for deploying virtual machines in a Kubernetes cluster. By integrating microservices and virtual machines in this way, you can take advantage of the scalability and flexibility of containerized applications, while also leveraging the power and versatility of virtualization. With Kubevirt, you can manage virtual machines just like any other Kubernetes resource, using familiar tools and interfaces such as kubectl and web-based dashboards.</p><p>In addition, Kubevirt offers a range of features to help you get the most out of your virtual machines, including support for various operating systems, virtualized hardware devices, and high-performance networking. Whether you’re running a complex enterprise application or a simple development environment, Kubevirt can provide a seamless and integrated solution for all your virtualization needs. So, if you’re looking to deploy virtual machines in Kubernetes, be sure to check out Kubevirt and see how it can help you streamline your infrastructure and improve your application performance.</p><h4>Our Tagline</h4><blockquote><em>#ContinuousLearning</em></blockquote><h4>Reference</h4><p><a href="https://kubevirt.io/labs/kubernetes/lab1.html">Use KubeVirt | KubeVirt.io</a></p><p><a href="https://josebiro.medium.com/getting-kubevirt-and-k0s-to-play-nicely-on-ubuntu-20-04-lts-39c33f18a8b2">Getting KubeVirt and K0s to play nicely on Ubuntu 20.04 LTS | by Joseph Bironas | Medium</a></p><p><a href="https://github.com/Tedezed/kubevirt-images-generator">Tedezed/kubevirt-images-generator: Easy Kubevirt images generator — Public images repository 💿 (github.com)</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5a544a9b4223" width="1" height="1" alt=""><hr><p><a href="https://medium.com/btech-engineering/deploy-your-vm-in-kubernetes-cluster-using-kubevirt-5a544a9b4223">Deploy your VM in Kubernetes Cluster using Kubevirt</a> was originally published in <a href="https://medium.com/btech-engineering">btech-engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Deploy OpenIO Multi Nodes]]></title>
            <link>https://medium.com/btech-engineering/deploy-openio-multi-nodes-d4cabd8a890a?source=rss----3b1ae0e73706---4</link>
            <guid isPermaLink="false">https://medium.com/p/d4cabd8a890a</guid>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[filesystem]]></category>
            <category><![CDATA[cloud-computing]]></category>
            <category><![CDATA[storage]]></category>
            <dc:creator><![CDATA[Btech Engineering]]></dc:creator>
            <pubDate>Wed, 12 Apr 2023 01:56:24 GMT</pubDate>
            <atom:updated>2023-04-04T03:02:58.963Z</atom:updated>
            <content:encoded><![CDATA[<h4>OpenIO SDS is a scalable open-source object storage solution.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/200/1*-qeHB_aYIqEZerNVfhwp2w.png" /><figcaption>OpenIO</figcaption></figure><h3>Intro</h3><p>OpenIO is designed to be flexible, scalable, and modular, allowing users to deploy it on-premise, in the cloud, or in a hybrid environment. With its unique architecture, OpenIO provides seamless horizontal scaling, making it an ideal solution for organizations that require a large storage capacity. In this article we will show you our research about deployment OpenIO Multi Nodes.</p><p>Whether you’re a small business looking for a cost-effective storage solution or a large enterprise that requires scalable and secure data storage, OpenIO can cater to your needs. By the end of this blog post, you will have a better understanding of how OpenIO can help you manage your data storage needs and how you can deploy it in your organization. So, let’s dive into the world of OpenIO object storage and explore its deployment options and benefits.</p><h4>Architecture</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/869/1*ys2YspW1mXe8M7M3JXV0RQ.jpeg" /><figcaption><a href="https://docs.openio.io/latest/source/arch-design/fs_overview.html">OpenIO FS Architecture</a></figcaption></figure><h3>Practical</h3><h4>System Requirement</h4><ul><li>Root privileges are required (using sudo).</li><li>SELinux or AppArmor must be disabled.</li><li>All nodes must have different hostnames.</li><li>All nodes must have a version of python greater than 2.7.</li><li>The node used to run the deployment must have a version of python greater than 3.6</li><li>All mounted partitions used for data/metadata must support extended attributes. XFS is recommended</li></ul><h4>Environment</h4><ul><li>Ubuntu 18.04</li><li>3 Computes with (4 CPU, 8G RAM, 100GB Storage)</li><li>OpenIO Version, OpenIO 20.04 oiosds</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/467/1*UIitxfzMsG5IypmHbdk5Eg.png" /><figcaption>Our Lab</figcaption></figure><h4>Pre-Installation</h4><p>Disable AppArmor &amp; UFW (All Nodes)</p><pre>sudo echo &#39;GRUB_CMDLINE_LINUX_DEFAULT=&quot;$GRUB_CMDLINE_LINUX_DEFAULT apparmor=0&quot;&#39; &gt; /etc/default/grub.d/apparmor.cfg<br>sudo update-grub<br>sudo ufw disable<br>sudo systemctl disable ufw.service<br>sudo reboot</pre><p>Format Disk to xfs (All Nodes)</p><pre>for i in 3 2 1; do ssh server0$i /bin/bash &lt;&lt; &#39;EOF&#39;<br><br>parted -a optimal /dev/vdb -s mklabel gpt unit TB mkpart primary 0% 100%<br>parted -a optimal /dev/vdc -s mklabel gpt unit TB mkpart primary 0% 100%<br>parted -a optimal /dev/vdd -s mklabel gpt unit TB mkpart primary 0% 100%<br><br>mkfs.xfs -f -L HDD-1 /dev/vdb1<br>mkfs.xfs -f -L HDD-2 /dev/vdc1<br>mkfs.xfs -f -L HDD-3 /dev/vdd1<br><br>cat &gt;&gt;/etc/fstab &lt;&lt;EOL<br>LABEL=HDD-1 /mnt/data1 xfs defaults,noatime,noexec 0 0<br>LABEL=HDD-2 /mnt/data2 xfs defaults,noatime,noexec 0 0<br>LABEL=HDD-3 /mnt/metadata1 xfs defaults,noatime,noexec 0 0<br>EOL<br><br>mkdir /mnt/{data1,data2,data3,metadata1}<br>mount -a<br><br>reboot<br><br>EOF<br><br>done</pre><p>Update Package (All Nodes)</p><pre>for i in {1..3}; do<br>    ssh server0${i} sudo apt-get install python-netaddr python3-dev libffi-dev gcc libssl-dev python3-selinux python3-setuptools  python3-venv -y<br>done</pre><p>Clone the OpenIO ansible playbook deployment repository</p><pre>git clone https://github.com/open-io/ansible-playbook-openio-deployment.git --branch 20.04 oiosds<br>cd oiosds/products/sds</pre><p>Create Virtual Environment &amp; install ansible</p><pre>python3 -m venv riset<br>source riset/bin/activate<br>pip install -r ansible.pip</pre><h4>Installation</h4><p>First, configure the inventory according to your environment: Change the IP addresses and SSH user in the inventory.yml file.</p><pre><br>nano inventory.yml<br><br>---<br>all:<br>  hosts:<br>    node1:<br>      ansible_host: 10.70.70.110<br>      openio_data_mounts:<br>        - mountpoint: /mnt/data1<br>          partition: /dev/vdb1<br>        - mountpoint: /mnt/data2<br>          partition: /dev/vdc1<br>      openio_metadata_mounts:<br>        - mountpoint: /mnt/metadata1<br>          partition: /dev/vdd1<br>          meta2_count: 2<br>    node2:<br>      ansible_host: 10.70.70.111<br>      openio_data_mounts:<br>        - mountpoint: /mnt/data1<br>          partition: /dev/vdb1<br>        - mountpoint: /mnt/data2<br>          partition: /dev/vdc1<br>      openio_metadata_mounts:<br>        - mountpoint: /mnt/metadata1<br>          partition: /dev/vdd1<br>          meta2_count: 2<br>    node3:<br>      ansible_host: 10.70.70.112<br>      openio_data_mounts:<br>        - mountpoint: /mnt/data1<br>          partition: /dev/vdb1<br>        - mountpoint: /mnt/data2<br>          partition: /dev/vdc1<br>      openio_metadata_mounts:<br>        - mountpoint: /mnt/metadata1<br>          partition: /dev/vdd1<br>          meta2_count: 2</pre><p>Configure for SSH Access</p><pre>for i in {1..3}; do ssh-copy-id -i ~/.ssh/id_rsa.pub root@server0$i; done</pre><p>Then, you can check that everything is configured correctly using this command</p><pre>## On Ubuntu<br>ansible all -i inventory.yml -bv -m ping -e &#39;ansible_python_interpreter=/usr/bin/python3&#39;</pre><p>Finally, run these commands:</p><pre>## To Download &amp; Install requirements<br>./requirements_install.sh</pre><pre>## To deploy and initialize the cluster:<br>./deploy_and_bootstrap.sh</pre><h4>Post-Installation</h4><p>All the nodes are configured to use openio-cli and aws-cli. Run this check script on one of the nodes in the cluster Verify</p><pre>sudo /usr/bin/openio-basic-checks.</pre><p>Sample output</p><pre>#### OpenIO status.<br>Check the services.<br>KEY                         STATUS      PID GROUP<br>OPENIO-account-0            UP        19406 OPENIO,account,0<br>OPENIO-beanstalkd-0         UP        19290 OPENIO,beanstalkd,0<br>OPENIO-conscienceagent-0    UP        24145 OPENIO,conscienceagent,0<br>OPENIO-ecd-0                UP        21021 OPENIO,ecd,0<br>OPENIO-memcached-0          UP        21816 OPENIO,memcached,0<br>OPENIO-meta0-0              UP        21342 OPENIO,meta0,0<br>OPENIO-meta1-0              UP        21361 OPENIO,meta1,0<br>OPENIO-meta2-0              UP        19739 OPENIO,meta2,0<br>OPENIO-meta2-1              UP        19861 OPENIO,meta2,1<br>OPENIO-oio-blob-indexer-0   UP        20320 OPENIO,oio-blob-indexer,0<br>OPENIO-oio-blob-indexer-1   UP        20331 OPENIO,oio-blob-indexer,1<br>OPENIO-oio-blob-rebuilder-0 UP        20638 OPENIO,oio-blob-rebuilder,0<br>OPENIO-oio-event-agent-0    UP        20751 OPENIO,oio-event-agent,0<br>OPENIO-oio-event-agent-0.1  UP        20713 OPENIO,oio-event-agent,0<br>OPENIO-oio-meta2-indexer-0  UP        19960 OPENIO,oio-meta2-indexer,0<br>OPENIO-oioproxy-0           UP        16854 OPENIO,oioproxy,0<br>OPENIO-oioswift-0           UP        24100 OPENIO,oioswift,0<br>OPENIO-rawx-0               UP        20122 OPENIO,rawx,0<br>OPENIO-rawx-1               UP        20140 OPENIO,rawx,1<br>OPENIO-rdir-0               UP        20532 OPENIO,rdir,0<br>OPENIO-rdir-1               UP        20533 OPENIO,rdir,1<br>OPENIO-redis-0              UP        16358 OPENIO,redis,0<br>OPENIO-redissentinel-0      UP        16641 OPENIO,redissentinel,0<br>OPENIO-zookeeper-0          UP        18865 OPENIO,zookeeper,0<br>Task duration: 5ms<br>--<br>Check the cluster.<br>+------------+-------------------+--------------------------------------+------------------------------------+----------------+------------+------+-------+--------+<br>| Type       | Addr              | Service Id                           | Volume                             | Location       | Slots      | Up   | Score | Locked |<br>+------------+-------------------+--------------------------------------+------------------------------------+----------------+------------+------+-------+--------+<br>| account    | 10.70.70.111:6009 | n/a                                  | n/a                                | server02.0 | account    | True |    99 | False  |<br>| account    | 10.70.70.112:6009 | n/a                                  | n/a                                | server03.0 | account    | True |    99 | False  |<br>| account    | 10.70.70.110:6009 | n/a                                  | n/a                                | server01.0 | account    | True |    99 | False  |<br>| beanstalkd | 10.70.70.111:6014 | n/a                                  | /mnt/metadata1/OPENIO/beanstalkd-0 | server02.0 | beanstalkd | True |    99 | False  |<br>| beanstalkd | 10.70.70.112:6014 | n/a                                  | /mnt/metadata1/OPENIO/beanstalkd-0 | server03.0 | beanstalkd | True |    99 | False  |<br>| beanstalkd | 10.70.70.110:6014 | n/a                                  | /mnt/metadata1/OPENIO/beanstalkd-0 | server01.0 | beanstalkd | True |    99 | False  |<br>| meta0      | 10.70.70.111:6001 | n/a                                  | /mnt/metadata1/OPENIO/meta0-0      | server02.0 | meta0      | True |    99 | False  |<br>| meta0      | 10.70.70.112:6001 | n/a                                  | /mnt/metadata1/OPENIO/meta0-0      | server03.0 | meta0      | True |    99 | False  |<br>| meta0      | 10.70.70.110:6001 | n/a                                  | /mnt/metadata1/OPENIO/meta0-0      | server01.0 | meta0      | True |    99 | False  |<br>| meta1      | 10.70.70.111:6110 | n/a                                  | /mnt/metadata1/OPENIO/meta1-0      | server02.0 | meta1      | True |   100 | False  |<br>| meta1      | 10.70.70.112:6110 | n/a                                  | /mnt/metadata1/OPENIO/meta1-0      | server03.0 | meta1      | True |   100 | False  |<br>| meta1      | 10.70.70.110:6110 | n/a                                  | /mnt/metadata1/OPENIO/meta1-0      | server01.0 | meta1      | True |   100 | False  |<br>| meta2      | 10.70.70.111:6121 | n/a                                  | /mnt/metadata1/OPENIO/meta2-1      | server02.1 | meta2      | True |   100 | False  |<br>| meta2      | 10.70.70.111:6120 | n/a                                  | /mnt/metadata1/OPENIO/meta2-0      | server02.0 | meta2      | True |   100 | False  |<br>| meta2      | 10.70.70.112:6120 | n/a                                  | /mnt/metadata1/OPENIO/meta2-0      | server03.0 | meta2      | True |   100 | False  |<br>| meta2      | 10.70.70.112:6121 | n/a                                  | /mnt/metadata1/OPENIO/meta2-1      | server03.1 | meta2      | True |   100 | False  |<br>| meta2      | 10.70.70.110:6120 | n/a                                  | /mnt/metadata1/OPENIO/meta2-0      | server01.0 | meta2      | True |   100 | False  |<br>| meta2      | 10.70.70.110:6121 | n/a                                  | /mnt/metadata1/OPENIO/meta2-1      | server01.1 | meta2      | True |   100 | False  |<br>| oioproxy   | 10.70.70.111:6006 | n/a                                  | n/a                                | server02.0 | oioproxy   | True |    98 | False  |<br>| oioproxy   | 10.70.70.112:6006 | n/a                                  | n/a                                | server03.0 | oioproxy   | True |    98 | False  |<br>| oioproxy   | 10.70.70.110:6006 | n/a                                  | n/a                                | server01.0 | oioproxy   | True |    98 | False  |<br>| oioswift   | 10.70.70.110:6007 | 90ce65f2-4bd8-5423-9326-3674df9ebc04 | n/a                                | server01.0 | oioswift   | True |    99 | False  |<br>| oioswift   | 10.70.70.111:6007 | 673b517b-4ceb-56ae-90fc-cd8715359db4 | n/a                                | server02.0 | oioswift   | True |    99 | False  |<br>| oioswift   | 10.70.70.112:6007 | 5cd8ad2c-f516-5183-8d3a-767639663b45 | n/a                                | server03.0 | oioswift   | True |    99 | False  |<br>| rawx       | 10.70.70.111:6201 | 10.70.70.111:6201                    | /mnt/data2/OPENIO/rawx-1           | server02.1 | rawx       | True |   100 | False  |<br>| rawx       | 10.70.70.111:6200 | 10.70.70.111:6200                    | /mnt/data1/OPENIO/rawx-0           | server02.0 | rawx       | True |   100 | False  |<br>| rawx       | 10.70.70.112:6200 | 10.70.70.112:6200                    | /mnt/data1/OPENIO/rawx-0           | server03.0 | rawx       | True |   100 | False  |<br>| rawx       | 10.70.70.112:6201 | 10.70.70.112:6201                    | /mnt/data2/OPENIO/rawx-1           | server03.1 | rawx       | True |   100 | False  |<br>| rawx       | 10.70.70.110:6201 | 10.70.70.110:6201                    | /mnt/data2/OPENIO/rawx-1           | server01.1 | rawx       | True |   100 | False  |<br>| rawx       | 10.70.70.110:6200 | 10.70.70.110:6200                    | /mnt/data1/OPENIO/rawx-0           | server01.0 | rawx       | True |   100 | False  |<br>| rdir       | 10.70.70.111:6300 | n/a                                  | /mnt/data1/OPENIO/rdir-0           | server02.0 | rdir       | True |    99 | False  |<br>| rdir       | 10.70.70.111:6301 | n/a                                  | /mnt/data2/OPENIO/rdir-1           | server02.1 | rdir       | True |    99 | False  |<br>| rdir       | 10.70.70.112:6301 | n/a                                  | /mnt/data2/OPENIO/rdir-1           | server03.1 | rdir       | True |    99 | False  |<br>| rdir       | 10.70.70.112:6300 | n/a                                  | /mnt/data1/OPENIO/rdir-0           | server03.0 | rdir       | True |    99 | False  |<br>| rdir       | 10.70.70.110:6301 | n/a                                  | /mnt/data2/OPENIO/rdir-1           | server01.1 | rdir       | True |    99 | False  |<br>| rdir       | 10.70.70.110:6300 | n/a                                  | /mnt/data1/OPENIO/rdir-0           | server01.0 | rdir       | True |    99 | False  |<br>+------------+-------------------+--------------------------------------+------------------------------------+----------------+------------+------+-------+--------+<br>Task duration: 548ms<br><br>---<br>---<br><br>*** Commands summary ***<br><br>*** OpenIO status ***<br>Check the services                                                                OK<br>Check the cluster                                                                 OK<br>*** OpenIO directory consistency ***<br>directory status                                                                  OK<br>reverse directory status                                                          OK<br>meta0 status                                                                      OK<br>meta1 status                                                                      OK<br>*** OpenIO API ***<br>Upload the /etc/passwd file to the bucket MY_CONTAINER of the project MY_ACCOUNT  OK<br>Get some information about your object                                            OK<br>List object in container                                                          OK<br>Find the services involved for your container                                     OK<br>Save the data stored in the given object to the &#39;--file&#39; destination              OK<br>Compare local file against data from SDS                                          OK<br>Show the account informations                                                     OK<br>Delete your object                                                                OK<br>Delete your empty container                                                       OK<br>*** AWS API ***<br>Create a bucket &#39;mybucket&#39;                                                        OK<br>Upload the &#39;/etc/passwd&#39; file to the bucket &#39;mybucket&#39;                            OK<br>List your buckets                                                                 OK<br>Save the data stored in the given object to the given file                        OK<br>Compare local file against data from SDS                                          OK<br>Delete your object                                                                OK<br>Delete your empty bucket                                                          OK<br>-------------------<br>Overall check result                                                              OK<br><br>++++<br> AWS S3 summary from (/root/.aws/credentials):<br>  endpoint: http://10.70.70.110:6007<br>  region:  us-east-1<br>  access key:  demo:demo<br>  secret key:  DEMO_PASS<br>  ssl: false<br>  signature_version: s3v4<br>  path style: true</pre><h4>Our Tagline</h4><blockquote>#ContinuousLearning</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d4cabd8a890a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/btech-engineering/deploy-openio-multi-nodes-d4cabd8a890a">Deploy OpenIO Multi Nodes</a> was originally published in <a href="https://medium.com/btech-engineering">btech-engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Step-by-Step Guide to Installing and Using Kiali.io for Microservices Observability]]></title>
            <link>https://medium.com/btech-engineering/a-step-by-step-guide-to-installing-and-using-kiali-io-for-microservices-observability-d4c532c412b1?source=rss----3b1ae0e73706---4</link>
            <guid isPermaLink="false">https://medium.com/p/d4c532c412b1</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[services]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[cloud-computing]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Btech Engineering]]></dc:creator>
            <pubDate>Wed, 12 Apr 2023 01:55:47 GMT</pubDate>
            <atom:updated>2023-03-31T03:01:42.421Z</atom:updated>
            <content:encoded><![CDATA[<h4>Installing and Using Kiali.io: A Comprehensive Guide</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/200/0*qg4RWyC3JoLq_0NX" /><figcaption><a href="https://github.com/kiali">Kiali.IO</a></figcaption></figure><p>Kiali.io is an open-source observability platform that offers real-time monitoring and visualization of microservices topology and interactions. It is a powerful tool that simplifies the management and monitoring of microservices, enabling users to identify and troubleshoot issues more efficiently. In this article, we will provide a step-by-step guide to installing Kiali.io and exploring its features.</p><h3>Overview of Kiali.io</h3><p>Kiali.io provides a comprehensive observability platform that enables users to manage, monitor, and secure their microservices environment more efficiently. With its advanced features and integration capabilities, Kiali.io simplifies the management and monitoring of microservices, enabling users to focus on developing and deploying new services. Some of the key features of Kiali.io include microservices topology visualization, traffic management, metrics and tracing, security, and integration with popular service mesh technologies.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*R3JmtMM6Zl7KPjx3.png" /><figcaption><a href="https://kiali.io/docs/features/details/">Detail Views — Kiali Docs</a></figcaption></figure><h3>Benefits of Kiali.io</h3><p>Kiali.io offers numerous benefits for developers and operators working with microservices. Some of these benefits include improved visibility, enhanced performance, better security, and increased productivity. By providing real-time visibility into the microservices environment, Kiali.io enables users to monitor and troubleshoot issues more efficiently. It also provides detailed metrics and tracing information for microservices, enabling users to optimize resource allocation and improve the overall performance of their services. With its advanced security features, Kiali.io helps users secure their microservices environment and detect potential security threats. By simplifying the management and monitoring of microservices, Kiali.io enables users to focus on developing and deploying new services.</p><h3>Step-by-Step</h3><h4>Pre-Installation</h4><p>For requirements, please visit <a href="https://kiali.io/docs/installation/installation-guide/prerequisites/">https://kiali.io/docs/installation/installation-guide/prerequisites/</a></p><h4>Installation</h4><p>in this article, we will install kiali as an addons on istio</p><p>1. Download &amp; Install Istio</p><pre>curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.6.14 TARGET_ARCH=x86_64 sh -<br><br>vi .bashrc<br>....<br>export ISTIO_HOME=~/istio-1.6.14<br>export PATH=$ISTIO_HOME/bin:$PATH<br>export KUBECONFIG=/etc/kubernetes/admin.conf<br>...<br><br>source .bashrc<br>istioctl install --set profile=demo -y</pre><p>For production, we recommend using the default profile</p><p>2. Install kiali addons(profile default)</p><pre>istioctl install --set profile=default -y<br>kubectl apply -f samples/addons/kiali.yaml</pre><p>Check list profile in istio: <a href="https://istio.io/v1.6/docs/setup/additional-setup/config-profiles/">This Link</a></p><h4>Expose Kiali</h4><p><strong>Port forward(manual)</strong></p><pre>screen -R forward<br>kubectl port-forward svc/kiali --address 10.6X.6X.100 20001:20001 -n istio-system<br># hit ctrl + A + D</pre><p><strong>Create gateway dan virtual service</strong></p><pre>kubectl apply -f - &lt;&lt;EOF<br>apiVersion: networking.istio.io/v1alpha3<br>kind: Gateway<br>metadata:<br>  name: kiali-gateway<br>  namespace: istio-system<br>spec:<br>  selector:<br>    istio: ingressgateway <br>  servers:<br>  - port:<br>      number: 80<br>      name: http-kiali<br>      protocol: HTTP<br>    hosts:<br>    - &quot;*&quot;<br>---<br>apiVersion: networking.istio.io/v1alpha3<br>kind: VirtualService<br>metadata:<br>  name: kiali<br>  namespace: istio-system<br>spec:<br>  hosts:<br>  - &quot;*&quot;<br>  gateways:<br>  - kiali-gateway<br>  http:<br>  - match:<br>    - uri:<br>        prefix: /kiali<br>    route:<br>    - destination:<br>        port:<br>          number: 20001<br>        host: kiali<br>---<br>apiVersion: networking.istio.io/v1alpha3<br>kind: DestinationRule<br>metadata:<br>  name: kiali<br>  namespace: istio-system<br>spec:<br>  host: kiali<br>  trafficPolicy:<br>    tls:<br>      mode: DISABLE<br>---<br>EOF</pre><h4>Deploy Simple Microservice for testing</h4><p>Download Microservice Customer</p><pre>wget https://github.com/redhat-scholars/istio-tutorial/archive/1.4.x.zip<br>tar -xvzf 1.4.x.zip<br>cd istio-tutorial-1.4.x/</pre><p>Create namespace tutorial</p><pre>kubectl create namespace tutorial</pre><p>Deploy customer service</p><pre>kubectl apply -f &lt;(istioctl kube-inject -f customer/kubernetes/Deployment.yml) -n tutorial<br>kubectl create -f customer/kubernetes/Service.yml -n tutorial</pre><p>Expose customer</p><pre>kubectl create -f customer/kubernetes/Gateway.yml -n tutorial<br>kubectl get pods -w -n tutorial<br>kubectl get svc istio-ingressgateway -n istio-system<br>GATEWAY_URL=$(kubectl get svc istio-ingressgateway -n istio-system|awk &#39;{print $3}&#39;|grep -iv cluster)</pre><p>Deploy preference service</p><pre>kubectl apply -f &lt;(istioctl kube-inject -f preference/kubernetes/Deployment.yml)  -n tutorial<br>kubectl create -f preference/kubernetes/Service.yml -n tutorial<br>kubectl get pods -w -n tutorial</pre><p>Deploy preference service</p><pre>kubectl apply -f &lt;(istioctl kube-inject -f preference/kubernetes/Deployment.yml)  -n tutorial<br>kubectl create -f preference/kubernetes/Service.yml -n tutorial<br>kubectl get pods -w -n tutorial</pre><p>Deploy recommendation service</p><pre>kubectl apply -f &lt;(istioctl kube-inject -f recommendation/kubernetes/Deployment.yml) -n tutorial<br>kubectl create -f recommendation/kubernetes/Service.yml -n tutorial<br>kubectl get pods -w -n tutorial</pre><p>Testing</p><pre>curl $GATEWAY_URL/customer</pre><p>Test loop akses</p><pre>while true; do sleep 1; curl http://$GATEWAY_URL:32722/customer;done</pre><h4>Kiali dashboard</h4><ol><li>Akses pada browser ke <a href="http://10.6X.6X.100:20001/kiali">http://10.6X.6X.100:20001/kiali</a></li><li>check pada “Graph”, lalu sesuaikan dengan namespace</li><li>check pada Applications &gt; Namespace: tutorial/bookinfo &gt; customer &gt; inbound Metrics</li></ol><h3>Conclusion</h3><p>Kiali.io is an essential tool for developers and operators working with microservices. It provides a comprehensive observability platform that enables users to manage, monitor, and secure their microservices environment more efficiently. By simplifying the management and monitoring of microservices, Kiali.io enables users to focus on developing and deploying new services. With its advanced features and integration capabilities, Kiali.io is a powerful tool that can help users optimize their microservices environment and improve the overall performance of their services.</p><h4>Our Tagline</h4><blockquote>#ContinuousLearning</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d4c532c412b1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/btech-engineering/a-step-by-step-guide-to-installing-and-using-kiali-io-for-microservices-observability-d4c532c412b1">A Step-by-Step Guide to Installing and Using Kiali.io for Microservices Observability</a> was originally published in <a href="https://medium.com/btech-engineering">btech-engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What is OpenIO ? Object Storage Infrastructure]]></title>
            <link>https://medium.com/btech-engineering/what-is-openio-object-storage-infrastructure-d965c6429182?source=rss----3b1ae0e73706---4</link>
            <guid isPermaLink="false">https://medium.com/p/d965c6429182</guid>
            <category><![CDATA[storage]]></category>
            <category><![CDATA[cloud-computing]]></category>
            <category><![CDATA[infrastructure]]></category>
            <category><![CDATA[storage-solutions]]></category>
            <category><![CDATA[engineering]]></category>
            <dc:creator><![CDATA[Btech Engineering]]></dc:creator>
            <pubDate>Wed, 12 Apr 2023 01:55:29 GMT</pubDate>
            <atom:updated>2023-03-28T02:01:42.941Z</atom:updated>
            <content:encoded><![CDATA[<h3>What is OpenIO ? Object Storage Infrastructure</h3><h4>OpenIO SDS is a scalable open-source object storage solution.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/753/1*EhvZ8VQMX_JhzfyEfYJSyQ.png" /><figcaption>Open IO, AWS S3, Swift Openstack</figcaption></figure><h3>Overview</h3><h4>Intro</h4><p>In today’s world, businesses need to store and manage an ever-increasing amount of data. Traditional storage solutions are often expensive and inflexible, leading to a need for more innovative solutions. OpenIo is an open-source object storage solution that has gained popularity in recent years due to its flexibility, scalability, and affordability.</p><p>OpenIo is an open-source object storage solution that allows businesses to store, manage, and retrieve large amounts of data with ease. It is based on the Object Storage Device (OSD) concept and is designed to be highly scalable and reliable. It is built on top of Ceph, a distributed storage system, which allows OpenIo to be deployed across multiple servers and data centers, providing redundancy and fault tolerance.</p><h4>Benefits</h4><p>One of the key benefits of OpenIO is its flexibility. It can be deployed on-premise, in the cloud, or in a hybrid environment, depending on your needs. This makes it a versatile solution that can adapt to different use cases and workloads.</p><p>OpenIO also provides a number of advanced features, including erasure coding, data compression, and data tiering. These features help to optimize storage efficiency, reduce costs, and improve data durability.</p><p>Another important aspect of OpenIO is its simplicity. The platform is designed to be easy to use, with a user-friendly web interface and a comprehensive set of APIs. This makes it accessible to a wide range of users, from developers to IT administrators.</p><h4>OpenIO Compatible with AWS S3 and Swift OpenStack?</h4><p>OpenIO is compatible with Amazon S3 and OpenStack Swift APIs. This means that you can use OpenIO as a drop-in replacement for these object storage systems, without having to make any changes to your applications or workflows.</p><p>OpenIO’s compatibility with these APIs also means that you can take advantage of the many tools, libraries, and applications that are already built to work with Amazon S3 and OpenStack Swift. This can help to simplify the migration process and reduce the learning curve for new users.</p><p>In addition to S3 and Swift, OpenIO also provides its own RESTful API, which offers additional features and functionality beyond what is available in S3 and Swift. This API can be used to manage objects, buckets, and policies, as well as to perform advanced operations such as data tiering and erasure coding.</p><h3>Conclusion</h3><p>In conclusion, OpenIo is a highly scalable, flexible, and cost-effective object storage solution that can be used to store and retrieve large amounts of unstructured data. Its distributed architecture, support for multiple data access protocols, and highly secure environment make it an ideal choice for developers who need a reliable and flexible storage platform. With its open-source nature, OpenIo also provides developers with the freedom to customize the platform to meet their specific needs, making it a valuable tool for any organization that needs to store and manage large amounts of data.</p><h4>Our Tagline</h4><blockquote>#ContinuousLearning</blockquote><h4>Reference</h4><p><a href="https://www.openio.io/">https://www.openio.io/</a></p><p><a href="https://www.redhat.com/en/topics/storage/object-storage-beginners-guide">https://www.redhat.com/en/topics/storage/object-storage-beginners-guide</a></p><p><a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-object-storage-and-cdn-technology">https://www.digitalocean.com/community/tutorials/an-introduction-to-object-storage-and-cdn-technology</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d965c6429182" width="1" height="1" alt=""><hr><p><a href="https://medium.com/btech-engineering/what-is-openio-object-storage-infrastructure-d965c6429182">What is OpenIO ? Object Storage Infrastructure</a> was originally published in <a href="https://medium.com/btech-engineering">btech-engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Modifying Jumpserver UI]]></title>
            <link>https://medium.com/btech-engineering/modifying-jumpserver-ui-2ac66bb6f830?source=rss----3b1ae0e73706---4</link>
            <guid isPermaLink="false">https://medium.com/p/2ac66bb6f830</guid>
            <category><![CDATA[centralized-management]]></category>
            <category><![CDATA[jump-server]]></category>
            <category><![CDATA[remote-server-management]]></category>
            <category><![CDATA[remote-server]]></category>
            <category><![CDATA[management-system]]></category>
            <dc:creator><![CDATA[Btech Engineering]]></dc:creator>
            <pubDate>Wed, 12 Apr 2023 01:54:42 GMT</pubDate>
            <atom:updated>2023-03-24T02:19:02.657Z</atom:updated>
            <content:encoded><![CDATA[<p>Centralized Management System</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/0*TgTZzYv4hQ11dpxe.jpg" /></figure><h3>Intro</h3><p>JumpServer is an open-source, web-based SSH (Secure Shell) and RDP (Remote Desktop Protocol) gateway that provides secure access to remote servers and network devices.</p><p>JumpServer acts as a centralized management system that allows administrators to control and audit access to critical IT infrastructure. It provides a unified platform for managing remote access and includes features such as user and session management, activity logging, and two-factor authentication.</p><p>JumpServer is built on Python and Django, and is available as a Docker container or can be installed on a Linux server. The platform integrates with various authentication systems, including Active Directory, LDAP, and SAML, and supports a range of protocols, including SSH, RDP, and Telnet.</p><p>JumpServer is designed for use by IT professionals, system administrators, and DevOps teams, and can be used to manage access to servers, networking devices, and other critical infrastructure. It is particularly useful for organizations that require strict security and compliance standards, as it provides granular control over access and activity tracking.</p><h3>Practical</h3><p><strong>Installation</strong></p><p>The following are the steps to install JumpServer:</p><ul><li>Download jumpserver files</li></ul><pre>mkdir jumpserver<br>cd jumpserver<br>wget https://github.com/jumpserver/installer/releases/download/v2.28.5/jumpserver-installer-v2.28.5.tar.gz<br>tar -xf jumpserver-installer-v2.28.5.tar.gz<br>cd jumpserver-installer-v2.28.5/</pre><ul><li>Install jumpserver, will be install an mariadb and redis as container in server</li></ul><pre>./jmsctl.sh install<br><br>docker ps</pre><ul><li>Change configuration of web container from default port (80) to other port (8099). This step is optional if default port used by other app or service</li></ul><pre>vi compose/docker-compose-app.yml<br>...<br>web:<br>    image: jumpserver/web:${VERSION}<br>    container_name: jms_web<br>    ulimits:<br>      core: 0<br>    restart: always<br>    tty: true<br>    environment:<br>      HTTP_PORT: ${HTTP_PORT:-80}<br>      USE_IPV6: ${USE_IPV6:-0}<br>      CLIENT_MAX_BODY_SIZE: ${CLIENT_MAX_BODY_SIZE:-4096m}<br>    ports:<br>      - 8099:80<br>...</pre><ul><li>Start Jumpserver, this step will create other services of jumpserver, like web, koko, lion, core, and magnus</li></ul><pre>./jmsctl.sh start<br><br>docker ps</pre><ul><li>List container for jumpserver app</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0CYm1slj42Kkw-2r85uFQA.png" /></figure><ul><li>Web UI Jumpserver</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4GTkBqhA8BOT2ttrJf1N7A.png" /></figure><p><strong>Web Modification</strong></p><ol><li>Login page text and forward link</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GycWRG59z0gWRkkNRn6mWA.png" /></figure><ul><li>Go inside jms_core container</li></ul><pre>docker exec -it jms_core bash</pre><ul><li>To edit login page text</li></ul><pre>vi apps/jumpserver/context_processor.py<br>...<br>default_interface = dict((<br>    (&#39;logo_logout&#39;, static(&#39;img/logo.png&#39;)),<br>    (&#39;logo_index&#39;, static(&#39;img/logo_text.png&#39;)),<br>    (&#39;login_image&#39;, static(&#39;img/login_image.jpg&#39;)),<br>    (&#39;favicon&#39;, static(&#39;img/facio.ico&#39;)),<br>    (&#39;login_title&#39;, _(&#39;{EDIT_THIS_SECTION}&#39;)),<br>    (&#39;theme&#39;, &#39;classic_green&#39;),<br>    (&#39;theme_info&#39;, {}),<br>))<br>...</pre><ul><li>To edit forward link</li></ul><pre>vi apps/authentication/templates/authentication/login.html<br>...<br>        &lt;a href=&quot;{% if not XPACK_ENABLED %}https://{EDIT_THIS_LINK}/{% endif %}&quot;&gt;<br>            &lt;img src=&quot;{{ INTERFACE.login_image }}&quot; class=&quot;right-image&quot; alt=&quot;screen-image&quot;/&gt;<br>        &lt;/a&gt;<br>...</pre><ul><li>Restart service (the static file of jumpserver will updated to default)</li></ul><pre>./entrypoint.sh restart web</pre><p>2. Login page image</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UTyeJ6tO6-a81jZ4HX4fLg.png" /></figure><ul><li>Copy Image to jms_web container static file</li></ul><pre>docker cp login_image.jpg jms_web:/opt/jumpserver/data/static/img/login_image.jpg</pre><p>3. Logo and favicon</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TidO8malCHki61sFDBAiCQ.png" /></figure><ul><li>Copy image logo and favicon file to jms_web container static file</li></ul><pre>#favicon<br>docker cp adinusa-logo-color.png jms_web:/opt/jumpserver/data/static/img/facio.ico<br><br>#logo<br>docker cp adinusa-logo-color.png jms_web:/opt/jumpserver/data/static/img/logo.png</pre><p>4. Logo Text</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Vo94ZpRoqhkw1LtuhROviA.png" /></figure><ul><li>Copy image logo text to jms_web container static file</li></ul><pre>docker cp logo-acad-trans.png jms_web:/opt/jumpserver/data/static/img/logo_text.png</pre><p>5. Chinese Text, when user will connect to assets</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/491/0*wiu6ta-iavGieA_y.png" /></figure><ul><li>Edit assets in jms_web container</li></ul><pre>docker ps | grep jms_web<br>docker exec -it jms_web bash<br><br>cd /opt/luna/assets/i18n<br>cp zh.json zh.json.bkp<br>cp en.json zh.json<br><br>exit</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/931/0*VTYP4J8USffccOQa.png" /></figure><ul><li>Edit locale LC_MASSAGES in jms_web container</li></ul><pre>docker ps | grep koko<br>docker exec -it jms_koko bash<br>cp locale/zh_CN/LC_MESSAGES/koko.po locale/zh_CN/LC_MESSAGES/koko.po.bkp<br>cp locale/en_US/LC_MESSAGES/koko.po locale/zh_CN/LC_MESSAGES/koko.po<br><br>exit<br><br>docker stop jms_koko<br>docker start jms_koko</pre><p><strong>By </strong><a href="https://www.linkedin.com/in/arditian/"><strong>Razzaaq Arditian</strong></a><strong>, Research Team Btech</strong></p><h4>Our Tagline</h4><p><em># Together is Better &amp; Continuous Learning</em></p><p><strong>Reference:</strong></p><ul><li><a href="https://jumpserver.org/">JumpServer</a></li><li><a href="https://docs.jumpserver.org/zh/v2/#1">JumpServer 文档</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2ac66bb6f830" width="1" height="1" alt=""><hr><p><a href="https://medium.com/btech-engineering/modifying-jumpserver-ui-2ac66bb6f830">Modifying Jumpserver UI</a> was originally published in <a href="https://medium.com/btech-engineering">btech-engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Deploy your VM in Kubernetes Cluster using Kubevirt]]></title>
            <link>https://medium.com/btech-engineering/deploy-your-vm-in-kubernetes-cluster-using-kubevirt-4d0750970a74?source=rss----3b1ae0e73706---4</link>
            <guid isPermaLink="false">https://medium.com/p/4d0750970a74</guid>
            <category><![CDATA[cluster]]></category>
            <category><![CDATA[kubevirt]]></category>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[virtualization]]></category>
            <dc:creator><![CDATA[Btech Engineering]]></dc:creator>
            <pubDate>Wed, 12 Apr 2023 01:54:09 GMT</pubDate>
            <atom:updated>2023-04-07T09:02:09.601Z</atom:updated>
            <content:encoded><![CDATA[<h4>Solution for integration between Microservices &amp; Virtual Machine | Installation Kubevirt</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/419/1*8pQeG2sZJTuVQJV7G9uQlg.png" /><figcaption><a href="https://kubevirt.io/">https://kubevirt.io/</a></figcaption></figure><p>Kubevirt is an open-source virtualization platform that allows users to deploy virtual machines (VMs) in a Kubernetes cluster. It provides a powerful solution for integrating microservices and virtual machines, enabling users to take advantage of the benefits of both technologies. In this article, we will provide an overview of Kubevirt and guide you through the process of deploying a VM in a Kubernetes cluster using Kubevirt.</p><h3>Overview</h3><p>Kubevirt extends the Kubernetes API to provide a platform for managing virtual machines alongside containers. It enables users to deploy, run, and manage VMs as Kubernetes objects, leveraging Kubernetes’ advanced scheduling, networking, and storage capabilities. Kubevirt supports a range of hypervisors, including KVM, QEMU, and VirtualBox, and provides features such as live migration, snapshots, and storage management.</p><h4>Kubevirt Components</h4><p>Kubevirt consists of several components that work together to provide a platform for managing VMs in a Kubernetes cluster. These components include:</p><ol><li>API Server: The Kubevirt API server extends the Kubernetes API to support VMs as a first-class object. It provides a RESTful API for creating, updating, and deleting VMs and their associated resources.</li><li>Virtual Machine Controller: The Virtual Machine Controller (VMC) is responsible for creating and managing VMs. It interacts with the Kubernetes API server to create VMs and their associated resources, such as virtual disks, networks, and interfaces.</li><li>Virtual Machine Instance Controller: The Virtual Machine Instance Controller (VMIC) is responsible for managing the lifecycle of VMs. It interacts with the VMC to create and start VMs, and monitors their status to ensure they are running correctly.</li><li>CDI: The Containerized Data Importer (CDI) is a Kubernetes-native tool for managing the import and export of data between VMs and containers. It enables users to import data into VMs from container images and export data from VMs to container images.</li><li>Virt-Handler: Virt-Handler is a lightweight, secure runtime for running VMs. It runs as a privileged container in the Kubernetes cluster and provides a secure execution environment for VMs.</li></ol><h3>Installation</h3><h4><strong>Lab Environment</strong></h4><ul><li>Kubernetes Cluster 1 Master 2 Node, 1 Nfs Storage</li><li>Each Node 8 CPU, 16GB Ram</li><li>Kubernetes Version 1.26.3</li></ul><h4><strong>Step-by-Step</strong></h4><p><strong>Deploy Kubevirt</strong></p><p>KubeVirt can be installed using the KubeVirt operator, which manages the lifecycle of all the KubeVirt core components.</p><ul><li>Use kubectlto deploy the KubeVirt operator:</li></ul><pre>export VERSION=$(curl -s &lt;https://api.github.com/repos/kubevirt/kubevirt/releases&gt; | grep tag_name | grep -v -- &#39;-rc&#39; | sort -r | head -1 | awk -F&#39;: &#39; &#39;{print $2}&#39; | sed &#39;s/,//&#39; | xargs) echo $VERSION kubectl create -f &lt;https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-operator.yaml&gt;</pre><ul><li>Again use kubectl to deploy the KubeVirt custom resource definitions:</li></ul><pre>kubectl create -f &lt;https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-cr.yaml&gt;</pre><p><strong>Verify Components</strong></p><ul><li>Check the deployment:</li></ul><pre>kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath=&quot;{.status.phase}&quot;  <br><br>... <br>Deployed</pre><ul><li>Check the components:</li></ul><pre>kubectl get all -n kubevirt<br>...<br>Warning: kubevirt.io/v1 VirtualMachineInstancePresets is now deprecated and will be removed in v2.<br>NAME                                   READY   STATUS    RESTARTS   AGE<br>pod/virt-api-9db4877f9-ts4f7           1/1     Running   0          8m24s<br>pod/virt-api-9db4877f9-v4krt           1/1     Running   0          8m24s<br>pod/virt-controller-6b69b5b887-29gqs   1/1     Running   0          7m59s<br>pod/virt-controller-6b69b5b887-kvjkw   1/1     Running   0          7m59s<br>pod/virt-handler-28rrj                 1/1     Running   0          7m59s<br>pod/virt-handler-c487h                 1/1     Running   0          7m59s<br>pod/virt-operator-7848c6bbc7-8zwxp     1/1     Running   0          9m15s<br>pod/virt-operator-7848c6bbc7-dxn5r     1/1     Running   0          9m15s<br><br>NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE<br>service/kubevirt-operator-webhook     ClusterIP   10.100.18.217    &lt;none&gt;        443/TCP   8m27s<br>service/kubevirt-prometheus-metrics   ClusterIP   None             &lt;none&gt;        443/TCP   8m27s<br>service/virt-api                      ClusterIP   10.105.255.140   &lt;none&gt;        443/TCP   8m27s<br>service/virt-exportproxy              ClusterIP   10.107.196.14    &lt;none&gt;        443/TCP   8m27s<br><br>NAME                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE<br>daemonset.apps/virt-handler   2         2         2       2            2           kubernetes.io/os=linux   7m59s<br><br>NAME                              READY   UP-TO-DATE   AVAILABLE   AGE<br>deployment.apps/virt-api          2/2     2            2           8m24s<br>deployment.apps/virt-controller   2/2     2            2           7m59s<br>deployment.apps/virt-operator     2/2     2            2           9m15s<br><br>NAME                                         DESIRED   CURRENT   READY   AGE<br>replicaset.apps/virt-api-9db4877f9           2         2         2       8m24s<br>replicaset.apps/virt-controller-6b69b5b887   2         2         2       7m59s<br>replicaset.apps/virt-operator-7848c6bbc7     2         2         2       9m15s<br><br>NAME                            AGE     PHASE<br>kubevirt.kubevirt.io/kubevirt   8m53s   Deployed</pre><p><strong>Virtctl</strong></p><p>KubeVirt provides an additional binary called <em>virtctl</em> for quick access to the serial and graphical ports of a VM and also handle start/stop operations.</p><ul><li>virtctlcan be retrieved from the release page of the KubeVirt github page.</li></ul><pre>VERSION=$(kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath=&quot;{.status.observedKubeVirtVersion}&quot;)<br>ARCH=$(uname -s | tr A-Z a-z)-$(uname -m | sed &#39;s/x86_64/amd64/&#39;) || windows-amd64.exe<br>echo ${ARCH}<br>curl -L -o virtctl https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-${ARCH}<br>chmod +x virtctl<br>sudo install virtctl /usr/local/bin</pre><p><strong>Check Version</strong></p><pre>~# virtctl version<br>Client Version: version.Info{GitVersion:&quot;v0.59.0-alpha.2&quot;, GitCommit:&quot;6f97adc2fd3144cb9813363e3bb147c39c2260af&quot;, GitTreeState:&quot;clean&quot;, BuildDate:&quot;2023-01-03T16:07:04Z&quot;, GoVersion:&quot;go1.19.2&quot;, Compiler:&quot;gc&quot;, Platform:&quot;linux/amd64&quot;}<br>Server Version: version.Info{GitVersion:&quot;v0.59.0-alpha.2&quot;, GitCommit:&quot;6f97adc2fd3144cb9813363e3bb147c39c2260af&quot;, GitTreeState:&quot;clean&quot;, BuildDate:&quot;2023-01-03T16:07:04Z&quot;, GoVersion:&quot;go1.19.2&quot;, Compiler:&quot;gc&quot;, Platform:&quot;linux/amd64&quot;}</pre><h3>Conclusion</h3><p>Kubevirt is a powerful solution for integrating microservices and virtual machines, enabling users to take advantage of the benefits of both technologies. By deploying VMs in a Kubernetes cluster, users can leverage Kubernetes’ advanced features for managing containers and build hybrid applications that combine microservices and traditional applications. Kubevirt also simplifies the management of VMs, providing a single interface for managing both VMs and containers. With its advanced features and integration capabilities, Kubevirt is an essential tool for users looking to build and manage complex workloads that include both microservices and virtual machines.</p><p><strong>By </strong><a href="https://www.linkedin.com/in/muhammad-fauzan-rafi"><strong>Fauzan Rafi</strong></a><strong>, Research Team Btech</strong></p><h4>Our Tagline</h4><blockquote>#ContinuousLearning</blockquote><h4>Reference</h4><p><a href="https://kubevirt.io/quickstart_cloud/">KubeVirt quickstart with cloud providers | KubeVirt.io</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4d0750970a74" width="1" height="1" alt=""><hr><p><a href="https://medium.com/btech-engineering/deploy-your-vm-in-kubernetes-cluster-using-kubevirt-4d0750970a74">Deploy your VM in Kubernetes Cluster using Kubevirt</a> was originally published in <a href="https://medium.com/btech-engineering">btech-engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Containerize Horizon and Yuyu Dashboard]]></title>
            <link>https://medium.com/btech-engineering/containerize-horizon-and-yuyu-dashboard-48b5cc23e014?source=rss----3b1ae0e73706---4</link>
            <guid isPermaLink="false">https://medium.com/p/48b5cc23e014</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[dashboard]]></category>
            <category><![CDATA[billing]]></category>
            <category><![CDATA[openstack]]></category>
            <category><![CDATA[containerized]]></category>
            <dc:creator><![CDATA[Btech Engineering]]></dc:creator>
            <pubDate>Wed, 12 Apr 2023 01:41:19 GMT</pubDate>
            <atom:updated>2023-04-11T02:01:54.574Z</atom:updated>
            <content:encoded><![CDATA[<p>How to containerize Openstack Dashboard and Yuyu Dashboard to one image container</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/979/1*_m7vqQ_RBB58gY4X_01THg.png" /></figure><h3>Intro</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*fRG7JgPawCt3wIrx.png" /></figure><p>OpenStack Dashboard, also known as Horizon, is a web-based graphical user interface (GUI) that allows users and administrators to manage and monitor OpenStack cloud environments. It provides a centralized dashboard for managing compute, storage, and networking resources, as well as other OpenStack services like Keystone (identity management), Neutron (networking), and Glance (image management).</p><p>Horizon provides a user-friendly interface for common OpenStack operations, such as launching instances, creating volumes, configuring networks, and managing security groups. It also allows users to create custom dashboards and widgets for their specific needs.</p><p>Horizon is extensible and customizable, and provides APIs for integrating with other tools and services. It supports multiple authentication backends, including OpenStack’s own identity service (Keystone), LDAP, and external identity providers like Google and GitHub.</p><p>Overall, Horizon is a powerful tool for managing OpenStack environments, especially for users who prefer a GUI over command-line tools.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*0ZzNEIK-yZNK9XKu.png" /><figcaption>yuyu architecture</figcaption></figure><p>Yuyu is a plugin in openstack that makes it easy for you to manage your openstack bills.</p><p>Yuyu have two components for running bellow :</p><h4>1. Yuyu Server</h4><p>Yuyu server provide ability to manage openstack billing by listening to every openstack event. Yuyu server is a required component to use Yuyu Dashboard. There are 3 main component in Yuyu server: API, Cron, Event Monitor. More detail about Yuyu server at <a href="https://github.com/btechpt/yuyu">https://github.com/btechpt/yuyu</a></p><ul><li><strong>Yuyu API</strong> : Main component to communicate with Yuyu Dashboard.</li><li><strong>Yuyu Cron</strong> : Provide invoice calculation and rolling capabilities that needed to run every month.</li><li><strong>Yuyu Event Monitor</strong> : Monitor event from openstack to calculate billing spent.</li></ul><h4>2. Yuyu Dashboard</h4><p>Yuyu dashboard is a panel at openstack dashboard that is used to manage your openstack bills. More detail about Yuyu server at <a href="https://github.com/btechpt/yuyu_dashboard">https://github.com/btechpt/yuyu_dashboard</a></p><p>Containerize refers to the process of creating a container image that includes an application and its dependencies, which can be run in a containerized environment.</p><p>Containers are a lightweight, standalone executable package that includes everything needed to run an application, including code, runtime, system tools, libraries, and settings. By containerizing an application, it can be easily moved between different environments without worrying about compatibility issues, and it can be run consistently across different infrastructure, from development to production.</p><p>Containerization is often used in DevOps and cloud computing to improve deployment speed, scalability, and portability. By containerizing applications, organizations can quickly build, deploy, and manage applications at scale, and they can more easily adopt new technologies and infrastructure changes. Popular containerization tools include Docker, Kubernetes, and container orchestration platforms like Amazon ECS and Google Kubernetes Engine (GKE).</p><h3>Practical</h3><h4>1. Containerize an Horizon</h4><p>The following are the steps to containerize an horizon service or Openstack Dashboard:</p><ul><li>Install docker on machine or server, for this section we will use docker as tool to containerize an app</li></ul><pre>sudo apt update<br>sudo apt install docker.io</pre><ul><li>Clone horizon file to machine, we will use zed version of horizon openstack</li></ul><pre>git clone https://opendev.org/openstack/horizon -b stable/zed --depth=1<br>ls</pre><ul><li>Modified local_settings.py on horizon directory to new configuration of horizon. The os.environ.get will read value from docker-compose.yml later</li></ul><pre>cp horizon/openstack_dashboard/local/local_settings.py.example horizon/openstack_dashboard/local/local_settings.py<br>vi horizon/openstack_dashboard/local/local_settings.py<br>...<br>DEBUG = False<br><br>ALLOWED_HOSTS = [&#39;*&#39;]<br><br>CACHES = {<br>    &#39;default&#39;: {<br>        &#39;BACKEND&#39;: &#39;django.core.cache.backends.memcached.MemcachedCache&#39;,<br>        &#39;LOCATION&#39;: &#39;127.0.0.1:11211&#39;,<br>    },<br>}<br><br>OPENSTACK_HOST = os.environ.get(&#39;OPENSTACK_HOST&#39;)<br>OPENSTACK_KEYSTONE_URL = &quot;http://%s/v3&quot; % OPENSTACK_HOST<br><br>AVAILABLE_THEMES = [<br>    (&#39;default&#39;, &#39;Default&#39;, &#39;themes/default&#39;),<br>    (&#39;material&#39;, &#39;Material&#39;, &#39;themes/material&#39;),<br>    (&#39;example&#39;, &#39;Example&#39;, &#39;themes/example&#39;),<br>]<br>...</pre><ul><li>Edit requirements file, add horizon and memcached version</li></ul><pre>vi horizon/requirements.txt<br>...<br>horizon===23.0.0<br>python-memcached===1.59<br>...</pre><ul><li>Create Dockerfile, to create an container image of app, with base ubuntu image and apache2 app to run an horizon</li></ul><pre>vi Dockerfile<br>...<br>FROM ubuntu:jammy<br><br>COPY horizon/ /var/www/html/horizon/<br><br>WORKDIR /var/www/html/horizon/<br><br>RUN apt-get update &amp;&amp; apt install python3-pip -y \<br>    &amp;&amp; pip3 install -r requirements.txt \<br>    &amp;&amp; apt install apache2 libapache2-mod-wsgi-py3 -y<br><br>RUN python3 ./manage.py collectstatic --no-input \<br>    &amp;&amp; python3 ./manage.py make_web_conf --wsgi --force \<br>    &amp;&amp; python3 ./manage.py make_web_conf --apache &gt; /etc/apache2/sites-available/horizon.conf \<br>    &amp;&amp; rm /etc/apache2/sites-enabled/000-default.conf<br><br>RUN a2ensite horizon<br><br>RUN chown -R www-data:www-data openstack_dashboard/local/.secret_key_store \<br>    &amp;&amp; chown -R www-data:www-data static/ \<br>    &amp;&amp; chmod a+x openstack_dashboard/horizon_wsgi.py<br><br>EXPOSE 80<br><br>CMD service memcached start &amp;&amp; apachectl -D FOREGROUND<br>...</pre><ul><li>Create an image from Dockerfile</li></ul><pre>docker build -t horizon:zed .</pre><ul><li>Verify an new image on machines</li></ul><pre>docker image ls</pre><ul><li>Test running horizon image with docker-compose.yml file</li></ul><pre>vi docker-compose.yml<br>...<br>version: &quot;3.9&quot;<br><br>services:<br>  horizon:<br>    image: horizon:zed<br>    ports:<br>      - &quot;80:80&quot;<br>    volumes:<br>      - /var/log/horizon/:/var/log/apache2:rw<br>    environment:<br>      OPENSTACK_HOST: 172.168.22.100:5000 ##Edit with your openstack keystone API<br>...<br><br>docker-compose up -d<br>docker ps</pre><ul><li>Verifiy horizon / openstack dashboard, access with machine IP Address</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yN0IXFR7j_vfvqSet_f5XQ.png" /><figcaption>openstack dashboard</figcaption></figure><h4><strong>2. Add yuyu-dashboard on horizon image container</strong></h4><p>The following are the steps to add yuyu-dashboard on horizon image container:</p><ul><li>Clone yuyu-dashboard file</li></ul><pre>git clone https://github.com/Yuyu-billing/yuyu_dashboard.git</pre><ul><li>Edit local_settings.py to add yuyu api configuration, YUYU_URL is filled by IP and port of YUYU_API</li></ul><pre>vi horizon/openstack_dashboard/local/local_settings.py<br>...<br>#add this line<br>YUYU_URL= os.environ.get(&#39;YUYU_SERVER&#39;)<br>CURRENCIES = (&#39;IDR&#39;,)<br>DEFAULT_CURRENCY = &quot;IDR&quot;<br>...</pre><ul><li>Create an Dockerfile to creating horizon yuyu dashboard image with base image horizon:zed we are creating before.</li></ul><pre>vi Dockerfile<br>...<br>FROM horizon:zed<br><br>RUN pip3 install django-money==2.0.1 &amp;&amp; pip3 install python-dateutil==2.8.2 &amp;&amp; pip3 install Pillow&gt;=6.2.0<br><br>COPY horizon/openstack_dashboard/local/local_settings.py /var/www/html/horizon/openstack_dashboard/local/local_settings.py<br><br>RUN mkdir /var/www/html/horizon/openstack_dashboard/dashboards/yuyu/<br>COPY yuyu_dashboard/yuyu/ /var/www/html/horizon/openstack_dashboard/dashboards/yuyu/<br>COPY yuyu_dashboard/yuyu/local/enabled/_6100_yuyu.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6100_yuyu.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6101_admin_billing_panel_group.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6101_admin_billing_panel_group.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6102_admin_billing_overview.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6102_admin_billing_overview.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6103_admin_billing_price_configuration.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6103_admin_billing_price_configuration.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6104_admin_billing_setting.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6104_admin_billing_setting.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6104_admin_billing_setting.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6104_admin_billing_setting.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6105_admin_billing_projects_invoice.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6105_admin_billing_projects_invoice.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6106_admin_notification_center.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6105_admin_notification_center.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6107_admin_billing_projects_balance.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6107_admin_billing_projects_balance.py<br><br>COPY yuyu_dashboard/yuyu/local/enabled/_6111_project_billing_panel_group.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6111_project_billing_panel_group.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6112_project_billing_overview.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6112_project_billing_overview.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6113_project_billing_usage_cost.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6113_project_billing_usage_cost.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6114_project_billing_invoice.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6114_project_billing_invoice.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6115_project_billing_setting.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6115_project_billing_setting.py<br>COPY yuyu_dashboard/yuyu/local/enabled/_6116_project_balance.py /var/www/html/horizon/openstack_dashboard/local/enabled/_6116_project_balance.py<br><br>CMD service memcached start &amp;&amp; apachectl -D FOREGROUND<br>...</pre><ul><li>Build image with this Dockerfile, and list image on machine</li></ul><pre>docker build -t yuyu-horizon:v1 .</pre><ul><li>Verify an new image on machines</li></ul><pre>docker image ls</pre><ul><li>Test running horizon image with docker-compose.yml file</li></ul><pre>vi docker-compose.yml<br>...<br>version: &quot;3.9&quot;<br>services:<br>  yuyu_dashboard:<br>    image: yuyu-horizon:v1<br>    ports:<br>      - &quot;80:80&quot;<br>    volumes:<br>      - /var/log/horizon/:/var/log/apache2:rw<br>    environment:<br>      OPENSTACK_HOST: 172.168.22.100:5000  ##Edit with your openstack keystone API<br>      YUYU_SERVER: http://172.168.22.10:8182 ##Edit with your YUYU Server API<br>...<br><br>docker-compose up -d<br>docker ps</pre><ul><li>Verify horizon and yuyu dashboard, open with browser and access with machine IP Address</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oLs4nYUzf8ZmPpCd70zuQg.png" /><figcaption>billing overview of yuyu-dashboard</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iiwElMpBH7Aa5NSVYfNfPg.png" /><figcaption>price configuration</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xPTLKi77OABqxS__2k2Lzw.png" /><figcaption>invoice</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*d1OlKoJhWDIrlz6XI8c_-g.png" /><figcaption>project balance</figcaption></figure><p><strong>By </strong><a href="https://www.linkedin.com/in/arditian/"><strong>Razzaaq Arditian</strong></a><strong>, Research Team Btech</strong></p><h3>Our Tagline</h3><p><em># Together is Better &amp; Continuous Learning</em></p><p><strong>Reference:</strong></p><ul><li><a href="https://docs.openstack.org/horizon/yoga/install/from-source.html">Manual installation</a></li><li><a href="https://yuyu-billing.dev/">Yuyu - Yuyu.io</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=48b5cc23e014" width="1" height="1" alt=""><hr><p><a href="https://medium.com/btech-engineering/containerize-horizon-and-yuyu-dashboard-48b5cc23e014">Containerize Horizon and Yuyu Dashboard</a> was originally published in <a href="https://medium.com/btech-engineering">btech-engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Prometheus Libvirt Exporter]]></title>
            <link>https://medium.com/btech-engineering/prometheus-libvirt-exporter-af02925ee6d6?source=rss----3b1ae0e73706---4</link>
            <guid isPermaLink="false">https://medium.com/p/af02925ee6d6</guid>
            <category><![CDATA[virtualization]]></category>
            <category><![CDATA[kvm]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[libvirt]]></category>
            <category><![CDATA[prometheus]]></category>
            <dc:creator><![CDATA[Btech Engineering]]></dc:creator>
            <pubDate>Tue, 21 Mar 2023 03:11:27 GMT</pubDate>
            <atom:updated>2023-03-21T02:45:50.827Z</atom:updated>
            <content:encoded><![CDATA[<p>Open-source software used for monitoring</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/0*D1xdKNHSalzZ8z-n.png" /></figure><h3>Intro</h3><p>Prometheus Libvirt Exporter is an open-source software used for monitoring and collecting metrics from virtual machines (VMs) that are running using the Libvirt virtualization toolkit.</p><p>Libvirt is a toolkit that is used for managing virtualization on Linux operating systems. In this context, the Prometheus Libvirt Exporter allows system administrators to monitor VM performance in real-time and collect data such as CPU usage, memory usage, disk I/O, and network I/O.</p><p>The exporter works by accessing the Libvirt API to extract information about the VMs and then exposing the information as Prometheus metrics. The Prometheus server can then scrape these metrics and store them in its time-series database for later querying and visualization using tools such as Grafana.</p><p>Using Prometheus Libvirt Exporter, administrators can gain insights into the performance of their VMs and identify potential bottlenecks or issues that could affect their application or workload. By monitoring and analyzing this data, administrators can take proactive measures to optimize VM performance and ensure that their applications are running smoothly.</p><h3>Practical</h3><p>How to install Prometheus Libvirt Exporter on server?</p><ol><li>CentOS</li></ol><p>If the OS used on the server is not using the release-stream version, then the OS must be changed to the release-stream version using the following method.</p><pre>sudo dnf update<br>cat /etc/centos-release<br><br>sudo dnf in centos-release-stream<br>sudo dnf swap centos-linux-repos centos-stream-repos<br><br>sudo dnf repolist<br>sudo dnf distro-sync<br>sudo dnf update<br><br>cat /etc/centos-release</pre><p>Installation of prometheus-libvirt-exporter with the following steps.</p><pre># install snapd<br>sudo yum install epel-release<br>sudo yum install snapd<br>sudo systemctl enable --now snapd.socket<br>sudo ln -s /var/lib/snapd/snap /snap<br><br># install libvirt_exporter<br>sudo snap install prometheus-libvirt-exporter<br><br># verify<br>systemctl status snap.prometheus-libvirt-exporter.daemon.service<br>netstat -tupln | grep 9177<br>curl localhost:9177</pre><p>2. Ubuntu</p><p>Installation of prometheus-libvirt-exporter on Ubuntu Operation System with the following steps.</p><pre># install snapd<br>sudo apt update<br>sudo apt install snapd<br><br># install libvirt-exporter<br>sudo snap install prometheus-libvirt-exporter<br>sudo systemctl status snap.prometheus-libvirt-exporter.daemon.service<br>snap connect prometheus-libvirt-exporter:libvirt<br><br># verify<br>systemctl status snap.prometheus-libvirt-exporter.daemon.service<br>netstat -tupln | grep 9177<br>curl localhost:9177</pre><p><strong>By </strong><a href="https://www.linkedin.com/in/arditian/"><strong>Razzaaq Arditian</strong></a><strong>, Research Team Btech</strong></p><h4>Our Tagline</h4><p><em># Together is Better &amp; Continuous Learning</em></p><p><strong>Reference:</strong></p><p><a href="https://snapcraft.io/prometheus-libvirt-exporter">Install prometheus-libvirt-exporter on Linux | Snap Store</a></p><ul><li><a href="https://www.cyberciti.biz/howto/upgrade-migrate-from-centos-8-to-centos-stream-conversion/">https://www.cyberciti.biz/howto/upgrade-migrate-from-centos-8-to-centos-stream-conversion/</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=af02925ee6d6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/btech-engineering/prometheus-libvirt-exporter-af02925ee6d6">Prometheus Libvirt Exporter</a> was originally published in <a href="https://medium.com/btech-engineering">btech-engineering</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>