<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>OpenShift | Luis Cacho</title><link>https://luiscachog.io/category/openshift/</link><atom:link href="https://luiscachog.io/category/openshift/index.xml" rel="self" type="application/rss+xml"/><description>OpenShift</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><lastBuildDate>Thu, 22 Jun 2023 00:00:00 +0000</lastBuildDate><image><url>https://luiscachog.io/media/icon_hu4fa4dbbaafd6f1b45a88958b9b4a0dd0_11007_512x512_fill_lanczos_center_3.png</url><title>OpenShift</title><link>https://luiscachog.io/category/openshift/</link></image><item><title>Trigger a scheduled job manually on Kubernetes</title><link>https://luiscachog.io/garden/trigger-scheduled-job-kubernetes/</link><pubDate>Thu, 22 Jun 2023 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/trigger-scheduled-job-kubernetes/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Mockup command&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kubectl create job --from&lt;span class="o">=&lt;/span>cronjob/&amp;lt;cronjob-name&amp;gt; &amp;lt;job-name&amp;gt; -n &amp;lt;namespace-name&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>How can I trigger a Kubernetes Scheduled Job manually?&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>&lt;a href="https://stackoverflow.com/questions/40401795/how-can-i-trigger-a-kubernetes-scheduled-job-manually" target="_blank" rel="noopener">https://stackoverflow.com/questions/40401795/how-can-i-trigger-a-kubernetes-scheduled-job-manually&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Understanding the Compliance Operator</title><link>https://luiscachog.io/understanding-compliance-operator/</link><pubDate>Tue, 16 Aug 2022 00:00:00 +0000</pubDate><guid>https://luiscachog.io/understanding-compliance-operator/</guid><description>&lt;details class="toc-inpage d-print-none " open>
&lt;summary class="font-weight-bold">Table of Contents&lt;/summary>
&lt;nav id="TableOfContents">
&lt;ul>
&lt;li>&lt;a href="#compliance-operator-introduction">Compliance Operator Introduction&lt;/a>&lt;/li>
&lt;li>&lt;a href="#why-compliance-operator">Why Compliance Operator?&lt;/a>&lt;/li>
&lt;li>&lt;a href="#how-can-i-implement-compliance-operator-in-my-cluster">How can I implement Compliance Operator in my cluster?&lt;/a>&lt;/li>
&lt;/ul>
&lt;/nav>
&lt;/details>
&lt;p>Compliance studies a company’s security processes. It details their security at a moment in time and compares it to a specific set of regulatory requirements. These requirements come in the form of legislation, industry regulations, or standards created from best practices.&lt;/p>
&lt;p>Every company can protect its data accordingly if they follow Compliance frameworks and have quality security in place. To have proper protection, companies must understand that Compliance is not the same thing as security. However, security is a big part of Compliance.&lt;/p>
&lt;p>Becoming secure and compliant means securing information assets, preventing damage, protecting it, eliminating potential attack vectors and decreasing the system&amp;rsquo;s attack surface.&lt;/p>
&lt;h2 id="compliance-operator-introduction">Compliance Operator Introduction&lt;/h2>
&lt;p>The &lt;a href="https://github.com/openshift/compliance-operator" target="_blank" rel="noopener">Compliance Operator&lt;/a> was released in OpenShift Container Platform v4.6, and allows OpenShift Container Platform administrators describe the desired compliance state of a cluster and provides them with an overview of gaps and ways to remediate them. The Compliance Operator assesses compliance of both the Kubernetes API resources of OpenShift Container Platform, as well as the nodes running the cluster. The Compliance Operator uses OpenSCAP, a NIST-certified tool, to scan and enforce security policies provided by the content.&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>
&lt;div class="alert alert-warning">
&lt;div>
The Compliance Operator is available for Red Hat Enterprise Linux CoreOS (RHCOS) deployments only.
&lt;/div>
&lt;/div>
&lt;p>To secure your OpenShift cluster, it is necessary to consider both; platform (Kubernetes/OpenShift API) and host OS (RHCOS) perspectives, because Kubernetes is composed of control plane machines (master) and worker machines (node), then the Kubernetes services such as API Server, etcd, or controller manager run on the control plane to manage the workloads on the worker machines.&lt;/p>
&lt;figure id="figure-compliance-perspective">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Platform and Host Perspective" srcset="
/media/posts/understanding-compliance-operator/rhocp_rhcos_hu09dd5e15593eede621f9d1f9bf3b1c60_26104_f0dc721849f341f527a8d4a81017d68b.webp 400w,
/media/posts/understanding-compliance-operator/rhocp_rhcos_hu09dd5e15593eede621f9d1f9bf3b1c60_26104_8dc31d55033365b42ba3854173c8b36e.webp 760w,
/media/posts/understanding-compliance-operator/rhocp_rhcos_hu09dd5e15593eede621f9d1f9bf3b1c60_26104_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/posts/understanding-compliance-operator/rhocp_rhcos_hu09dd5e15593eede621f9d1f9bf3b1c60_26104_f0dc721849f341f527a8d4a81017d68b.webp"
width="282"
height="271"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Platform and Host Perspective
&lt;/figcaption>&lt;/figure>
&lt;p>The basic approach to perform hardening in a RHCOS host is described in the &lt;a href="https://docs.openshift.com/container-platform/4.7/security/container_security/security-hardening.html" target="_blank" rel="noopener">documentation&lt;/a> and it is based in the &lt;a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/security_hardening/index#scanning-container-and-container-images-for-vulnerabilities_scanning-the-system-for-security-compliance-and-vulnerabilities" target="_blank" rel="noopener">RHEL 8 Security Hardening&lt;/a>.
For instance, the hardening consists in validate if the file has appropriately restrictive file permissions, if the file ownership is appropriately set, if required systemd services or processes are launched with appropriate arguments or parameters in the configuration, or if the appropriate kernel parameters are set. Then, hardening the control plane is specific to the Kubernetes services and includes the control plane components or the master configuration files. It should validate if the API server has started with restrictive arguments regarding allowing specific admission plug-ins, enabling audit logging, applying etcd server and peer configurations, and restricting RBAC, among others.
For clusters that use RHCOS, updating or upgrading are designed to become automatic events from the central control plane, because OpenShift completely controls the systems and services that run on each machine, including the operating system itself through the &lt;a href="https://github.com/openshift/machine-config-operator" target="_blank" rel="noopener">Machine Config Operator&lt;/a>.&lt;/p>
&lt;h2 id="why-compliance-operator">Why Compliance Operator?&lt;/h2>
&lt;p>Why is the Compliance Operator needed to validate the hardening and apply changes in the configuration of the operating system and the platform?
The Compliance Operator is defined as follows:&lt;/p>
&lt;p>&lt;em>The Compliance Operator lets OpenShift Container Platform administrators describe the required compliance state of a cluster and provides them with an overview of gaps and ways to remediate them. The Compliance Operator assesses compliance of both the Kubernetes API resources of OpenShift Container Platform, as well as the nodes running the cluster. The Compliance Operator uses OpenSCAP, a NIST-certified tool, to scan and enforce security policies provided by the content.&lt;/em>&lt;sup id="fnref1:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>
&lt;p>In other words, the Compliance Operator checks the host and the platform to detect gaps in compliance by specifying profiles for scan and creates summary reports about security compliance so that you will be able to find if there is any configuration that violates the policy in the cluster. The reports also show which remediations are applied, so you can choose if you want to apply the recommended configuration by hand, step-by-step, or automatically. In short, the whole process goes like this: choosing a profile for scanning, specifying the scan settings, then initiating the scan, and generating the reports.&lt;/p>
&lt;figure id="figure-compliance-overview">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Compliance Operator Overview" srcset="
/media/posts/understanding-compliance-operator/rhocp_compliance_operator_hu27b70ccd330baa61a155b96202450126_295729_57140cb0159c62dc40056d2ffff800ea.webp 400w,
/media/posts/understanding-compliance-operator/rhocp_compliance_operator_hu27b70ccd330baa61a155b96202450126_295729_d84562e804fc16ee4c799468924dfe26.webp 760w,
/media/posts/understanding-compliance-operator/rhocp_compliance_operator_hu27b70ccd330baa61a155b96202450126_295729_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/posts/understanding-compliance-operator/rhocp_compliance_operator_hu27b70ccd330baa61a155b96202450126_295729_57140cb0159c62dc40056d2ffff800ea.webp"
width="760"
height="417"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Compliance Operator Overview
&lt;/figcaption>&lt;/figure>
&lt;p>The Compliance Operator leverages &lt;a href="https://www.open-scap.org/" target="_blank" rel="noopener">OpenSCAP&lt;/a>, a NIST-certified tool, to scan and enforce security policies, and the security policies for the compliance checks are derived through SCAP content and built from the community-based &lt;a href="https://github.com/ComplianceAsCode/content" target="_blank" rel="noopener">ComplianceAsCode/content&lt;/a> project. A bundle of security policies, or profiles created by default when the operator is installed and profiles scheduled include NIST 800-53 Moderate (FedRAMP), Australian Cyber Security Centre (ACSC) Essential Eight, CIS OpenShift Benchmark, and others, so far. You can also create or tailor your own profiles so that you can pick the rules you want to run other than the profiles provided by default.&lt;/p>
&lt;h2 id="how-can-i-implement-compliance-operator-in-my-cluster">How can I implement Compliance Operator in my cluster?&lt;/h2>
&lt;p>First of all, you will need to install the Compliance Operator, for that, you can follow the &lt;a href="https://docs.openshift.com/container-platform/4.8/security/compliance_operator/compliance-operator-installation.html" target="_blank" rel="noopener">documentation steps&lt;/a>&lt;/p>
&lt;p>Great, the Operator is installed and functional, now lets check how to create, run and evaluate a compliance scan.&lt;/p>
&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>&lt;a href="https://docs.openshift.com/container-platform/4.8/security/compliance_operator/compliance-operator-understanding.html" target="_blank" rel="noopener">https://docs.openshift.com/container-platform/4.8/security/compliance_operator/compliance-operator-understanding.html&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&amp;#160;&lt;a href="#fnref1:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Delete OpenShift Operator</title><link>https://luiscachog.io/garden/delete-openshift-operator/</link><pubDate>Mon, 15 Aug 2022 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/delete-openshift-operator/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Mockup commands&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">oc get subscription &amp;lt;operator&amp;gt; -n openshift-operators -o yaml &lt;span class="p">|&lt;/span> grep
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">currentCSV
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">oc delete subscription &amp;lt;operator&amp;gt; -n openshift-operators
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">oc delete clusterserviceversion &amp;lt;currentCSV&amp;gt; -n openshift-operators
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"># Example commands
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">oc get subscription jaeger -n openshift-operators -o yaml | grep currentCSV
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">oc delete subscription jaeger -n openshift-operators
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">oc delete clusterserviceversion jaeger-operator.v1.8.2 -n openshift-operators
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Delete OpenShift Project</title><link>https://luiscachog.io/garden/delete-openshift-project/</link><pubDate>Mon, 15 Aug 2022 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/delete-openshift-project/</guid><description>&lt;ul>
&lt;li>Issue, can&amp;rsquo;t delete a namespace/project and is stuck in a &amp;ldquo;Terminating&amp;rdquo; status&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">oc delete project fishbone
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">oc get projects fishbone
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NAME DISPLAY NAME STATUS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fishbone Fishbone Terminating
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>
&lt;p>Solution&lt;/p>
&lt;ul>
&lt;li>Define the namespace/project to delete&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">NAMESPACE&lt;/span>&lt;span class="o">=&lt;/span>fishbone
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Cleanup the finalizers section from the namespace definition and define a json file with that&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">oc get namespace &lt;span class="nv">$NAMESPACE&lt;/span> -o&lt;span class="o">=&lt;/span>json &lt;span class="p">|&lt;/span> jq &lt;span class="s1">&amp;#39;.spec = {&amp;#34;finalizers&amp;#34;:[]}&amp;#39;&lt;/span> &amp;gt; &lt;span class="nv">$NAMESPACE&lt;/span>.json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;v1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;Namespace&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;metadata&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;annotations&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;openshift.io/description&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;openshift.io/display-name&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;Fishbone&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;openshift.io/requester&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;system:admin&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;openshift.io/sa.scc.mcs&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;s0:c24,c14&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;openshift.io/sa.scc.supplemental-groups&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;1000580000/10000&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;openshift.io/sa.scc.uid-range&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;1000580000/10000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;creationTimestamp&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;2021-02-20T03:29:59Z&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;deletionTimestamp&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;2021-02-20T03:31:35Z&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;fishbone&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;resourceVersion&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;270664&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;selfLink&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;/api/v1/namespaces/fishbone&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;uid&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;885c4440-6f05-4e72-a103-28e61705406f&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;spec&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;finalizers&amp;#34;&lt;/span>: &lt;span class="o">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;kubernetes&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;status&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;conditions&amp;#34;&lt;/span>: &lt;span class="o">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">]&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;phase&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;Terminating&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Apply the json file from the previous step to delete the finalizers and therefore the deletion of the namespace/project&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">curl -k -H &lt;span class="s2">&amp;#34;authorization: Bearer &lt;/span>&lt;span class="k">$(&lt;/span>oc whoami --show-token&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> -H &lt;span class="s2">&amp;#34;Content-Type: application/json&amp;#34;&lt;/span> -X PUT --data-binary @&lt;span class="nv">$NAMESPACE&lt;/span>.json &lt;span class="k">$(&lt;/span>oc whoami --show-server&lt;span class="k">)&lt;/span>/api/v1/namespaces/&lt;span class="nv">$NAMESPACE&lt;/span>/finalize
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Verify that the namspace/project has been deleted&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">oc get projects &lt;span class="nv">$NAMESPACE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Error from server &lt;span class="o">(&lt;/span>NotFound&lt;span class="o">)&lt;/span>: namespaces &lt;span class="s2">&amp;#34;fishbone&amp;#34;&lt;/span> not found
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Kubernetes Advanced Topics&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/li>
&lt;li>Kubernetes Namespace Stuck&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>&lt;/li>
&lt;li>Red Hat article[^3]&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>&lt;a href="https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#advanced-topics" target="_blank" rel="noopener">https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#advanced-topics&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>&lt;a href="https://success.mirantis.com/article/kubernetes-namespace-stuck-in-terminating" target="_blank" rel="noopener">https://success.mirantis.com/article/kubernetes-namespace-stuck-in-terminating&lt;/a>
[^3]:&lt;a href="https://www.redhat.com/sysadmin/troubleshooting-terminating-namespaces" target="_blank" rel="noopener">https://www.redhat.com/sysadmin/troubleshooting-terminating-namespaces&lt;/a>&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>How to Retrieve secrets values</title><link>https://luiscachog.io/garden/retrieve-secrets-values/</link><pubDate>Mon, 15 Aug 2022 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/retrieve-secrets-values/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">oc get secret my-secret -n my-project --template&lt;span class="o">={{&lt;/span>.data.my-secret-key&lt;span class="o">}}&lt;/span> &lt;span class="p">|&lt;/span> base64 -d
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">oc get secret my-secret -n my-project -o go-template --template&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;{{.data.my-secret-key|base64decode}}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">oc extract secrets/my-secret -n my-project
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">oc get secret my-secret -n my-project -o &lt;span class="nv">jsonpath&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;{.data[&amp;#39;tls\.key&amp;#39;]}&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> base64 -d
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>How to test the OpenShift Cluster and Machine Autoscaler</title><link>https://luiscachog.io/garden/test-openshift-autoscaler/</link><pubDate>Mon, 15 Aug 2022 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/test-openshift-autoscaler/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="l">oc new-project work-queue&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">echo &amp;#39;apiVersion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">batch/v1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">kind&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Job&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">metadata&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">generateName&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">work-queue-&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">tolerations&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">effect&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">NoSchedule&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">node-role.kubernetes.io/infra&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">reserved&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">effect&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">NoExecute&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">node-role.kubernetes.io/infra&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">reserved&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">containers&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">work&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">busybox&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">command&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;sleep&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;300&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">resources&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">requests&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">memory&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">2Gi&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">cpu&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">4&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restartPolicy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Never&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">parallelism&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">50&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">completions&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">250&lt;/span>&lt;span class="l">&amp;#39; | oc create -f - -n work-queue&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">oc get jobs -n work-queue&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">oc get pods -n work-queue &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">oc get machineset -n openshift-machine-api&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">oc get machines -n openshift-machine-api&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">oc get nodes&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">oc delete project work-queue&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>How to list the taints on kubernetes nodes</title><link>https://luiscachog.io/garden/list-node-taints/</link><pubDate>Sun, 14 Aug 2022 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/list-node-taints/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">oc get nodes -o json &lt;span class="p">|&lt;/span> jq &lt;span class="s1">&amp;#39;.items[].spec.taints&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">oc get nodes -o json &lt;span class="p">|&lt;/span> jq &lt;span class="s1">&amp;#39;.items[] | {node_name:.metadata.name,taints:.spec.taints[]?}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">oc get nodes -o=custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">get nodes -o=jsonpath=&amp;#39;&lt;/span>&lt;span class="o">{&lt;/span>range .items&lt;span class="o">[&lt;/span>*&lt;span class="o">]}{&lt;/span>.metadata.name&lt;span class="o">}{&lt;/span>&lt;span class="s2">&amp;#34;\t&amp;#34;&lt;/span>&lt;span class="o">}{&lt;/span>.spec.taints&lt;span class="o">}{&lt;/span>&lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="o">}{&lt;/span>end&lt;span class="o">}&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> StackOverflow&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>]: &lt;a href="https://stackoverflow.com/questions/43379415/how-can-i-list-the-taints-on-kubernetes-nodes" target="_blank" rel="noopener">https://stackoverflow.com/questions/43379415/how-can-i-list-the-taints-on-kubernetes-nodes&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>OpenID autodiscovery URL integration in OpenShift</title><link>https://luiscachog.io/garden/openid-integration-openshift/</link><pubDate>Mon, 23 May 2022 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/openid-integration-openshift/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Discover the available URLs from your autodiscovery URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl https://&amp;lt;idp_host&amp;gt;/.well-known/openid-configuration
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">CLIENT_SECRET&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>oc get secret -n openshift-config my-id-secret my-id-secret -o &lt;span class="nv">jsonpath&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;{.items[0].data.clientSecret}&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> base64 -D&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -s -X POST https://&amp;lt;idp_host&amp;gt;/idp/userinfo.openid -H &lt;span class="s1">&amp;#39;content-type: application/x-www-form-urlencoded&amp;#39;&lt;/span> -d &lt;span class="s2">&amp;#34;client_id=ocp4testawsuswest2QA&amp;amp;client_secret=&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">CLIENT_SECRET&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;amp;access_token=&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">ACCESS_TOKEN&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> jq
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>References:&lt;/strong>
- &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> &lt;a href="https://access.redhat.com/solutions/4605141" target="_blank" rel="noopener">https://access.redhat.com/solutions/4605141&lt;/a>&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>&lt;a href="https://access.redhat.com/solutions/4605141" target="_blank" rel="noopener">https://access.redhat.com/solutions/4605141&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>How to access an OpenShift 4 Node</title><link>https://luiscachog.io/garden/access-ocp4-node/</link><pubDate>Thu, 16 Sep 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/access-ocp4-node/</guid><description>&lt;p>In order to review the underline node, you need to follow the next steps:&lt;/p>
&lt;ul>
&lt;li>Get the node name that is having issues or your need to login&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">oc get nodes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Run the &lt;code>oc debug&lt;/code> command into the node&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">oc debug node/ip-10-0-129-255.us-east-2.compute.internal
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Once you are logged in the node, you&amp;rsquo;ll need to run:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">chroot /host
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>References:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> OCP4 Documentation&lt;/li>
&lt;/ul>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>&lt;a href="https://docs.openshift.com/container-platform/4.10/support/gathering-cluster-data.html#support-collecting-network-trace_gathering-cluster-data" target="_blank" rel="noopener">https://docs.openshift.com/container-platform/4.10/support/gathering-cluster-data.html#support-collecting-network-trace_gathering-cluster-data&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Get ServiceAccount token for MTC</title><link>https://luiscachog.io/garden/get-token-mtc/</link><pubDate>Fri, 06 Aug 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/get-token-mtc/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">oc sa get-token migration-operator -n openshift-migration
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Command to perform a curl to a PodIP</title><link>https://luiscachog.io/garden/curl-podip/</link><pubDate>Thu, 05 Aug 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/curl-podip/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">curl &lt;span class="k">$(&lt;/span>oc get pod &amp;lt;pod-name&amp;gt; --template &lt;span class="err">&amp;#39;&lt;/span>&lt;span class="o">{{&lt;/span> .status.podIP&lt;span class="o">}}&lt;/span>&lt;span class="k">)&lt;/span>:8080
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Approve pending CSRs in OpenShift</title><link>https://luiscachog.io/garden/approve-csr-openshift/</link><pubDate>Wed, 04 Aug 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/approve-csr-openshift/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> id in &lt;span class="k">$(&lt;/span>oc get csr &lt;span class="p">|&lt;/span> grep Pending &lt;span class="p">|&lt;/span> awk &lt;span class="s1">&amp;#39;{print $1}&amp;#39;&lt;/span>&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span> oc adm certificate approve &lt;span class="nv">$id&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Get OpenShift Console URL</title><link>https://luiscachog.io/garden/openshift-console-url/</link><pubDate>Mon, 02 Aug 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/openshift-console-url/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">oc whoami --show-console
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">oc -n openshift-console get routes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Kubernetes debug commands</title><link>https://luiscachog.io/garden/debug-k8s/</link><pubDate>Sun, 01 Aug 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/debug-k8s/</guid><description>&lt;ul>
&lt;li>Kubernetes error messages&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">kubectl get events -n kube-system
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Kubernetes pods logs&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">stern prox -n kube-system
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Debug with busybox&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">kubectl run --generator&lt;span class="o">=&lt;/span>run-pod/v1 -i --tty busybox --image&lt;span class="o">=&lt;/span>busybox --restart&lt;span class="o">=&lt;/span>Never -- sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>CodeReady Containers commands</title><link>https://luiscachog.io/garden/codeready-containers/</link><pubDate>Tue, 20 Jul 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/codeready-containers/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">crc config view &lt;span class="c1"># View Actual config&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crc config &lt;span class="nb">set&lt;/span> autostart-tray &lt;span class="nb">false&lt;/span> &lt;span class="c1"># Disable autostart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crc config &lt;span class="nb">set&lt;/span> consent-telemetry &lt;span class="nb">false&lt;/span> &lt;span class="c1"># Disable telemetry&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crc config &lt;span class="nb">set&lt;/span> enable-cluster-monitoring &lt;span class="nb">true&lt;/span> &lt;span class="c1"># Enable Monitoring, needs more memory&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crc config &lt;span class="nb">set&lt;/span> host-network-access &lt;span class="nb">true&lt;/span> &lt;span class="c1"># Enable TCP/IP connections&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crc config &lt;span class="nb">set&lt;/span> kubeadmin-password &lt;span class="nv">$MY_PASSW0RD&lt;/span> &lt;span class="c1"># Define my own kubeadmin-password&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crc config &lt;span class="nb">set&lt;/span> memory 14336 &lt;span class="c1"># Increase Memory to 14GB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crc config &lt;span class="nb">set&lt;/span> pull-secret-file &lt;span class="nv">$PATH_TO_PULL_SECRET_FILE&lt;/span> &lt;span class="c1"># Path to a pull-secret file (download from https://cloud.redhat.com/openshift/create/local)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crc setup
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crc start
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crc ip
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crc stop
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Wait for pod to be ready</title><link>https://luiscachog.io/garden/wait-for-pod-to-be-ready/</link><pubDate>Thu, 15 Jul 2021 00:00:00 +0000</pubDate><guid>https://luiscachog.io/garden/wait-for-pod-to-be-ready/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">POD_NAME&lt;/span>&lt;span class="o">=&lt;/span>hello-d8d8d7455-j9nzw
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">while&lt;/span> &lt;span class="o">[[&lt;/span> &lt;span class="k">$(&lt;/span>oc get pods &lt;span class="nv">$POD_NAME&lt;/span> -o &lt;span class="s1">&amp;#39;jsonpath={..status.conditions[?(@.type==&amp;#34;Ready&amp;#34;)].status}&amp;#39;&lt;/span>&lt;span class="k">)&lt;/span> !&lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;True&amp;#34;&lt;/span> &lt;span class="o">]]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;waiting for pod&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sleep 1&lt;span class="p">;&lt;/span> &lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>If you want to wait until all the pods with a common label you can do:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="k">while&lt;/span> &lt;span class="o">[[&lt;/span> &lt;span class="k">$(&lt;/span>kubectl get pods -l &lt;span class="nv">app&lt;/span>&lt;span class="o">=&lt;/span>hello -o &lt;span class="s1">&amp;#39;jsonpath={..status.conditions[?(@.type==&amp;#34;Ready&amp;#34;)].status}&amp;#39;&lt;/span>&lt;span class="k">)&lt;/span> !&lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;True&amp;#34;&lt;/span> &lt;span class="o">]]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;waiting for pod&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sleep 1&lt;span class="p">;&lt;/span> &lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Differences between Kubernetes and Openshift</title><link>https://luiscachog.io/slides/k8s-vs-ocp/</link><pubDate>Thu, 25 Mar 2021 09:10:47 -0500</pubDate><guid>https://luiscachog.io/slides/k8s-vs-ocp/</guid><description>&lt;!-- [revealoptions]
controlsBackArrows= "hidden"
history= false
center= true
showNotes= false
width= "100%"
height= "100%"
margin= 0.2
minScale= 0.2
maxScale= 1.5 -->
&lt;h1 id="heading">&lt;/h1>
&lt;h2 id="differences-between-kubernetes-and-openshift">Differences between Kubernetes and Openshift&lt;/h2>
&lt;hr>
&lt;h3 id="luis-cacho">Luis Cacho&lt;/h3>
&lt;h4 id="senior-container-infrastructure-consultant">Senior Container Infrastructure Consultant&lt;/h4>
&lt;h5 id="red-hathttpsredhatcom">&lt;a href="https://redhat.com" target="_blank" rel="noopener">@Red Hat&lt;/a>&lt;/h5>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h3 id="kubernetes">Kubernetes&lt;/h3>
&lt;h4 id="some-assembly-required">Some assembly required&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/k8s-lego_hu5d4fa49e9520c9dd96a24d33f6995b83_231012_48794af0155d9a2bccc567c0020e68ae.webp 400w,
/media/slides/k8s-vs-ocp/k8s-lego_hu5d4fa49e9520c9dd96a24d33f6995b83_231012_dd12ccf7664715d6e555f2ac927603a6.webp 760w,
/media/slides/k8s-vs-ocp/k8s-lego_hu5d4fa49e9520c9dd96a24d33f6995b83_231012_1200x1200_fit_q90_h2_lanczos.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/k8s-lego_hu5d4fa49e9520c9dd96a24d33f6995b83_231012_48794af0155d9a2bccc567c0020e68ae.webp"
width="50%"
height="760"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="kubernetes-1">Kubernetes&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;h4 id="some-assembly-required-1">Some assembly required&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/k8s-lack_hue22ff0180dba771c4b2ced3e722d392b_12541_e93d7511a3f9d6d1a8a73de2dceb786c.webp 400w,
/media/slides/k8s-vs-ocp/k8s-lack_hue22ff0180dba771c4b2ced3e722d392b_12541_832425835d1bbb59e844aefb220cdae5.webp 760w,
/media/slides/k8s-vs-ocp/k8s-lack_hue22ff0180dba771c4b2ced3e722d392b_12541_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/k8s-lack_hue22ff0180dba771c4b2ced3e722d392b_12541_e93d7511a3f9d6d1a8a73de2dceb786c.webp"
width="100%"
height="327"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;aside class="notes">
&lt;ul>
&lt;li>Press &lt;code>S&lt;/code> key to view -&lt;/li>
&lt;/ul>
&lt;p>Kubernetes does not provide (out-of-the-box):&lt;/p>
&lt;ol>
&lt;li>Operative System&lt;/li>
&lt;li>Developer tooling and UX&lt;/li>
&lt;li>Container runtime (CRI-O, Containerd, Docker, etc).&lt;/li>
&lt;li>Image registry&lt;/li>
&lt;li>Software-defined networking&lt;/li>
&lt;li>Load‐balancer and routing&lt;/li>
&lt;li>Log management&lt;/li>
&lt;li>Container metrics and monitoring&lt;/li>
&lt;li>DNS&lt;/li>
&lt;li>Ingress&lt;/li>
&lt;li>RBAC&lt;/li>
&lt;li>Storage&lt;/li>
&lt;li>Management&lt;/li>
&lt;li>Service Catalog (Operators)&lt;/li>
&lt;/ol>
&lt;/aside>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="kubernetes-2">Kubernetes&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;h4 id="some-assembly-required-2">Some assembly required&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/k8s-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6556548_3714d455a464221b6a1d8baf8dd3d70d.webp 400w,
/media/slides/k8s-vs-ocp/k8s-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6556548_2d3810e7e57aa438895b4bee44290b15.webp 760w,
/media/slides/k8s-vs-ocp/k8s-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6556548_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/k8s-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6556548_3714d455a464221b6a1d8baf8dd3d70d.webp"
width="100%"
height="460"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/section>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h3 id="openshift">Openshift&lt;/h3>
&lt;h4 id="value-added">Value Added&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-logo_hub55d0082020858bd8e0d2513214bb36a_58983_27ac333dfa6b7cab104fa5c4bf33e82d.webp 400w,
/media/slides/k8s-vs-ocp/ocp-logo_hub55d0082020858bd8e0d2513214bb36a_58983_360fe55c5a4b106c7fe23b1a6cd1e52f.webp 760w,
/media/slides/k8s-vs-ocp/ocp-logo_hub55d0082020858bd8e0d2513214bb36a_58983_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/ocp-logo_hub55d0082020858bd8e0d2513214bb36a_58983_27ac333dfa6b7cab104fa5c4bf33e82d.webp"
width="70%"
height="324"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="openshift-1">Openshift&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;h4 id="value-added-1">Value Added&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6563729_1aaf0e92aea7613704fa9ac8bebc3a0f.webp 400w,
/media/slides/k8s-vs-ocp/ocp-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6563729_641a6e6fa95ce9815f897687463d4ca1.webp 760w,
/media/slides/k8s-vs-ocp/ocp-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6563729_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/ocp-landscape_hud934df60cc460e6bdc2a2320bcb1b77e_6563729_1aaf0e92aea7613704fa9ac8bebc3a0f.webp"
width="100%"
height="460"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="openshift-2">Openshift&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;h4 id="value-added-2">Value Added&lt;/h4>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-arch_hu5ad65d1c520fefa54127e833cd143ea7_167834_b5727e55f72b3d94cb10d01346c89252.webp 400w,
/media/slides/k8s-vs-ocp/ocp-arch_hu5ad65d1c520fefa54127e833cd143ea7_167834_4638c01656df18eef165986fb64bc40a.webp 760w,
/media/slides/k8s-vs-ocp/ocp-arch_hu5ad65d1c520fefa54127e833cd143ea7_167834_1200x1200_fit_q90_h2_lanczos_2.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/ocp-arch_hu5ad65d1c520fefa54127e833cd143ea7_167834_b5727e55f72b3d94cb10d01346c89252.webp"
width="100%"
height="429"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/section>
&lt;hr>
&lt;section data-shortcode-section>
&lt;h3 id="openshift-contains-kubernetes">Openshift contains Kubernetes&lt;/h3>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-contains-k8s_hu1e0fae1efb02309ebe72b4ea66218d50_97537_f8b786763edc718263bf7bbb9b9cc32b.webp 400w,
/media/slides/k8s-vs-ocp/ocp-contains-k8s_hu1e0fae1efb02309ebe72b4ea66218d50_97537_96f387002adacb57fbf6e32a888c96a8.webp 760w,
/media/slides/k8s-vs-ocp/ocp-contains-k8s_hu1e0fae1efb02309ebe72b4ea66218d50_97537_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/ocp-contains-k8s_hu1e0fae1efb02309ebe72b4ea66218d50_97537_f8b786763edc718263bf7bbb9b9cc32b.webp"
width="90%"
height="435"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;aside class="notes">
&lt;ul>
&lt;li>Press &lt;code>S&lt;/code> key to view -&lt;/li>
&lt;/ul>
&lt;/aside>
&lt;hr>
&lt;!-- markdownlint-capture -->
&lt;!-- markdownlint-disable -->
&lt;h3 id="openshift-contains-kubernetes-1">Openshift contains Kubernetes&lt;/h3>
&lt;!-- markdownlint-restore -->
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/media/slides/k8s-vs-ocp/ocp-is-k8s_hud3011e5a0c6e498bbc0af9bd76a3a0dd_105280_89205a684652c1b7301a7c7737a9ce4e.webp 400w,
/media/slides/k8s-vs-ocp/ocp-is-k8s_hud3011e5a0c6e498bbc0af9bd76a3a0dd_105280_afdaf2fcf41a32a0c5da9a20e5afb4cd.webp 760w,
/media/slides/k8s-vs-ocp/ocp-is-k8s_hud3011e5a0c6e498bbc0af9bd76a3a0dd_105280_1200x1200_fit_q90_h2_lanczos_3.webp 1200w"
src="https://luiscachog.io/media/slides/k8s-vs-ocp/ocp-is-k8s_hud3011e5a0c6e498bbc0af9bd76a3a0dd_105280_89205a684652c1b7301a7c7737a9ce4e.webp"
width="90%"
height="386"
loading="lazy" />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/section>
&lt;hr>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;h3 id="openshit-is-a-kubernetes-flavor">Openshit IS a Kubernetes flavor&lt;/h3>
&lt;hr>
&lt;h2 id="thank-you">Thank You&lt;/h2></description></item></channel></rss>