<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://pradeepkg.github.io/RSA/deployment/</id>
    <title>RSA G&amp;L Developer Portal Blog</title>
    <updated>2026-10-02T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://pradeepkg.github.io/RSA/deployment/"/>
    <subtitle>RSA G&amp;L Developer Portal Blog</subtitle>
    <icon>https://pradeepkg.github.io/RSA/img/iconmonstr-arrow-31.svg</icon>
    <entry>
        <title type="html"><![CDATA[✔️ G&L on a Kubernetes Cluster]]></title>
        <id>https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/</id>
        <link href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/"/>
        <updated>2026-10-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Install RSA Governance & Lifecycle 8.0 P11 HF01 on a customer Kubernetes cluster with a remote Oracle database.]]></summary>
        <content type="html"><![CDATA[<p>RSA Governance &amp; Lifecycle (G&amp;L) runs as containers on Kubernetes and connects to an Oracle database outside the cluster. This guide installs G&amp;L <code>8.0 P11 HF01</code> (build <code>8.0.0.189610</code>) on a cluster and database provided by the customer, as a single node or as a cluster of nodes, in eleven steps that each end with a check. It is written for installers new to G&amp;L on Kubernetes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>RSA delivers G&amp;L for Kubernetes as two files: a container image with WildFly and the application installed, and a kit whose script, <code>createYamlFiles.sh</code>, writes the Kubernetes manifests and a <code>run.sh</code> that applies them (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Installation Guide</a>, Ch. 4).</p>
<p>The customer provides everything else: the cluster, the Oracle 19c database, a container registry, NFS storage, a load balancer (or NodePort access) and the firewall rules between them.</p>
<p><strong>Scope:</strong> a new installation, as a single node (the <em>master</em>, which RSA also calls the domain node) or as a cluster of the master plus host nodes. The guide covers what is specific to Kubernetes. Tasks that are the same for every G&amp;L deployment, such as preparing the database, the post-install database steps and backups, are listed with a link to RSA's guide. AFX and remote agents run on separate servers and are not covered.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Values are hard to change later</div><div class="admonitionContent_BuS1"><p>Paths, the namespace and the image reference are written into the manifests and each node's <code>Aveksa_System.cfg</code> at <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-6-generate-the-manifests" class="">Step 6</a>, and G&amp;L encrypts the passwords in that file on its first start. Confirm them, and the database time zone, before <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-6-generate-the-manifests" class="">Step 6</a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture">Architecture<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#architecture" class="hash-link" aria-label="Direct link to Architecture" title="Direct link to Architecture" translate="no">​</a></h2>
<!-- -->
<p>Each G&amp;L node runs as one pod. The kit gives each pod an external Service (LoadBalancer or NodePort) and an internal ClusterIP Service for the other G&amp;L pods.</p>
<p>The schema is in Oracle, and the configuration and encryption keys are on NFS, so a pod can be recreated on another worker without data loss. Application logs are the exception: they are inside the pod (see <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#day-2-operations" class="">Day-2 operations</a>).</p>
<table><thead><tr><th>Component</th><th>Purpose</th><th>Location</th></tr></thead><tbody><tr><td><code>rsaiglmaster</code></td><td>Master node; becomes the System Operations Node</td><td>Deployment in namespace <code>rsaigl</code></td></tr><tr><td><code>host1</code>, <code>host2</code>, ...</td><td>Host (general) nodes, cluster only</td><td>One Deployment each</td></tr><tr><td><code>rsaiglsvcmaster</code>, <code>rsaiglsvchost1</code></td><td>External Services: 8080, 8443, 8444</td><td>Services in <code>rsaigl</code></td></tr><tr><td><code>masterinternalsvc</code>, <code>internalsvc-host1</code></td><td>Internal Services, including jgroups 7600 and 57600</td><td>Services in <code>rsaigl</code></td></tr><tr><td><code>iglconfig</code></td><td><code>Aveksa_System.cfg</code>, at <code>/home/oracle/config</code></td><td>NFS, one directory per node</td></tr><tr><td><code>iglkeystore</code></td><td>WildFly password vault, at <code>/home/oracle/keystore</code></td><td>NFS, shared</td></tr><tr><td><code>iglsecurity</code></td><td>Key encryption keys (KEK), at <code>/home/oracle/security</code></td><td>NFS, shared, mode 700</td></tr><tr><td>AVDB</td><td>Schemas <code>AVUSER</code>, <code>AVDWUSER</code>, <code>AVCSUSER</code>, <code>ACMDB</code>, <code>PERFSTAT</code></td><td>Customer database server</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="network-paths">Network paths<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#network-paths" class="hash-link" aria-label="Direct link to Network paths" title="Direct link to Network paths" translate="no">​</a></h3>
<table><thead><tr><th>From</th><th>To</th><th>Port</th><th>Purpose</th></tr></thead><tbody><tr><td>Browsers</td><td>G&amp;L external Service</td><td>8443</td><td>HTTPS to <code>/aveksa/main</code></td></tr><tr><td>AFX, remote agents</td><td>G&amp;L external Service</td><td>8444</td><td>Application communication</td></tr><tr><td>Every worker</td><td>Oracle</td><td>1555, or the customer's listener port</td><td>JDBC from the pod's worker</td></tr><tr><td>Every worker</td><td>NFS server</td><td>2049; also 111 and mountd for NFSv3</td><td>G&amp;L volumes</td></tr><tr><td>Every node</td><td>Registry</td><td>The registry's port</td><td>Image pull</td></tr><tr><td>G&amp;L pods</td><td>G&amp;L pods</td><td>7600, 57600</td><td>jgroups discovery and failure detection (cluster)</td></tr><tr><td>Admin workstation</td><td>Registry, Kubernetes API</td><td>Registry port, 6443</td><td>Image push, <code>kubectl</code></td></tr></tbody></table>
<p>Port numbers for G&amp;L are from the Installation Guide, Ch. 2, Port Requirements.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<p>Confirm every row before <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-1-confirm-the-oracle-database" class="">Step 1</a>.</p>
<table><thead><tr><th>Item</th><th>Requirement</th><th>How to confirm</th></tr></thead><tbody><tr><td>Kubernetes access</td><td>kubeconfig that can create namespaces, PersistentVolumes, Deployments and Services; <code>sudo</code> on a Linux host with <code>kubectl</code> (normally the control-plane node)</td><td><code>kubectl auth can-i create persistentvolumes</code> returns <code>yes</code></td></tr><tr><td>G&amp;L workers</td><td>One worker per G&amp;L node with at least 16 GB for the pod; WildFly heap 12288 MB (Installation Guide, Ch. 2)</td><td><em>Allocatable</em> memory in <code>kubectl describe node &lt;worker&gt;</code></td></tr><tr><td>Container runtime</td><td>containerd</td><td><code>kubectl get nodes -o wide</code> shows <code>containerd://</code></td></tr><tr><td>Registry</td><td>HTTPS endpoint, push and pull accounts, certificate trusted by every node</td><td><code>curl -u &lt;user&gt; https://&lt;registry&gt;/v2/_catalog</code> from a worker</td></tr><tr><td>NFS</td><td>Export mounted at the same path on every worker that can run G&amp;L</td><td><code>mountpoint /var/nfs/general</code> on each worker</td></tr><tr><td>Service publishing</td><td>A LoadBalancer implementation and reserved addresses, or NodePort</td><td>Other LoadBalancer Services show an <code>EXTERNAL-IP</code></td></tr><tr><td>Oracle 19c</td><td>Prepared for G&amp;L as for any deployment, including the grants for P07 and later</td><td>The DBA, per the <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Database Setup and Management Guide</a> and the <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">P11 HF01 Release Notes</a></td></tr><tr><td>Database details</td><td>Host, port, SID, five schema passwords, database time zone</td><td>Provided by the DBA</td></tr><tr><td>Docker Hub or a mirror</td><td>The kit's host init container uses the image <code>nginx</code></td><td><code>crictl pull docker.io/library/nginx</code> on a worker</td></tr></tbody></table>
<p><strong>Media</strong></p>
<table><thead><tr><th>File</th><th>Content</th></tr></thead><tbody><tr><td><code>ACM_Container_VP11_HF01_8.0.0.189610.tar</code></td><td>G&amp;L image at 8.0 P11 HF01 (about 4 GB); no separate patch step is needed</td></tr><tr><td><code>ACM_Kubernetes_V8.0.0.zip</code></td><td><code>createYamlFiles.sh</code> and <code>README.md</code></td></tr></tbody></table>
<p><strong>Workstation tools:</strong> <code>kubectl</code>, <code>skopeo</code> and <code>curl</code>.</p>
<p><strong>Placeholders used in this guide</strong></p>
<table><thead><tr><th>Placeholder</th><th>Meaning</th><th>Example</th></tr></thead><tbody><tr><td><code>&lt;registry&gt;</code></td><td>Registry host and port</td><td><code>registry.example.com:5000</code></td></tr><tr><td><code>&lt;db-host&gt;</code></td><td>Oracle host</td><td><code>oradb01.example.com</code></td></tr><tr><td><code>&lt;nfs-server&gt;</code></td><td>NFS server</td><td><code>nfs01.example.com</code></td></tr><tr><td><code>&lt;tz&gt;</code></td><td>Database time zone (IANA name)</td><td><code>America/New_York</code></td></tr><tr><td><code>&lt;lb-ip&gt;</code>, <code>&lt;lb-ip-host1&gt;</code></td><td>Reserved Service addresses</td><td><code>10.0.0.100</code>, <code>10.0.0.101</code></td></tr><tr><td><code>&lt;worker-1&gt;</code>, <code>&lt;worker-2&gt;</code></td><td>Workers for the master and host1</td><td><code>k8s-w1</code>, <code>k8s-w2</code></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-flow">Installation flow<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#installation-flow" class="hash-link" aria-label="Direct link to Installation flow" title="Direct link to Installation flow" translate="no">​</a></h2>
<!-- -->
<p>Each step names where to run it and ends with a <strong>Check</strong>. Do not continue until the check passes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="time-required">Time required<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#time-required" class="hash-link" aria-label="Direct link to Time required" title="Direct link to Time required" translate="no">​</a></h2>
<p>Measured in a test deployment on a clean cluster and a new database: two workers with 4 vCPU and 9 GB each, a 6144 MB heap, and the registry on the same local network as the cluster. Other hardware and networks give different times. Steps not listed are manual.</p>
<table><thead><tr><th>Step</th><th>Measured</th><th>Notes</th></tr></thead><tbody><tr><td><a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-4-push-the-gl-image" class="">4. Push the image (3.9 GB tar, <code>skopeo</code>)</a></td><td>1.9 minutes</td><td>Network speed to the registry decides this</td></tr><tr><td><a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-5-create-the-namespace-and-pull-secret" class="">5. Pull test (both workers in parallel)</a></td><td>41 seconds</td><td>Leaves the image cached on each worker</td></tr><tr><td><a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-6-generate-the-manifests" class="">6. <code>createYamlFiles.sh</code></a></td><td>Seconds</td><td>Once the answers are ready</td></tr><tr><td><a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-9-deploy" class="">9. <code>run.sh</code></a></td><td>1 second</td><td>Applies the manifests only</td></tr><tr><td><a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-9-deploy" class="">9. Master serving, from pod creation</a></td><td>4.4 minutes</td><td>WildFly started after 31 seconds; the first start's schema migration took 1.4 minutes (243 objects in <code>AVUSER</code>)</td></tr><tr><td><a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-9-deploy" class="">9. host1 serving, from pod creation</a></td><td>7.2 minutes</td><td>Its init container polls the master every 300 seconds; host1 joined the domain at 5.7 minutes</td></tr><tr><td>Redeploy: delete the namespace</td><td>11 to 48 seconds</td><td><a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#redeploy-from-scratch" class="">Redeploy from scratch</a></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-confirm-the-oracle-database">Step 1: Confirm the Oracle database<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-1-confirm-the-oracle-database" class="hash-link" aria-label="Direct link to Step 1: Confirm the Oracle database" title="Direct link to Step 1: Confirm the Oracle database" translate="no">​</a></h2>
<p><strong>Run on:</strong> each worker that can run G&amp;L.</p>
<p>The database is prepared as for any G&amp;L deployment, by RSA's database-only installer or by the DBA, following the <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Database Setup and Management Guide</a>, Ch. 2, and the database grants in the <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">P11 HF01 Release Notes</a>. G&amp;L creates its objects in <code>AVUSER</code> on its first start.</p>
<p>Collect from the DBA:</p>
<table><thead><tr><th>Value</th><th>Used in</th></tr></thead><tbody><tr><td>Database host</td><td><a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-6-generate-the-manifests" class="">Step 6</a>, prompt 3</td></tr><tr><td>Listener port and SID (G&amp;L defaults: 1555, AVDB)</td><td><a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-7-complete-aveksa_systemcfg" class="">Step 7</a></td></tr><tr><td>Passwords of <code>AVUSER</code>, <code>AVDWUSER</code>, <code>AVCSUSER</code>, <code>ACMDB</code>, <code>PERFSTAT</code></td><td>Steps <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-6-generate-the-manifests" class="">6</a> and <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-7-complete-aveksa_systemcfg" class="">7</a></td></tr><tr><td>Database time zone, as an IANA name</td><td><a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#rsa-requirement-5-time-zone" class="">Step 8</a></td></tr></tbody></table>
<p>G&amp;L connects to the database from its pod, so from whichever worker runs the pod, not from the control-plane node.</p>
<p><strong>Check:</strong> each worker reaches the listener:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">timeout 5 bash -c 'exec 3&lt;&gt;/dev/tcp/&lt;db-host&gt;/1555' &amp;&amp; echo reachable</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># reachable</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-stage-the-kit">Step 2: Stage the kit<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-2-stage-the-kit" class="hash-link" aria-label="Direct link to Step 2: Stage the kit" title="Direct link to Step 2: Stage the kit" translate="no">​</a></h2>
<p><strong>Run on:</strong> the control-plane node, as a user with <code>sudo</code>. The kit's README requires the script to run on the master node.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">mkdir -p ~/gl-k8s &amp;&amp; cd ~/gl-k8s</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">unzip /path/to/ACM_Kubernetes_V8.0.0.zip</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">chmod 755 createYamlFiles.sh</span><br></div></code></pre></div></div>
<p><strong>Check:</strong> <code>createYamlFiles.sh</code> is executable, and <code>sudo kubectl get nodes</code> shows every node <code>Ready</code>. The generated <code>run.sh</code> uses <code>sudo kubectl</code>, so root needs a working kubeconfig.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-prepare-the-shared-volumes">Step 3: Prepare the shared volumes<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-3-prepare-the-shared-volumes" class="hash-link" aria-label="Direct link to Step 3: Prepare the shared volumes" title="Direct link to Step 3: Prepare the shared volumes" translate="no">​</a></h2>
<p><strong>Run on:</strong> the NFS server, then every worker, as root.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-every-worker-needs-the-mount">Why every worker needs the mount<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#why-every-worker-needs-the-mount" class="hash-link" aria-label="Direct link to Why every worker needs the mount" title="Direct link to Why every worker needs the mount" translate="no">​</a></h3>
<p>The kit does not use a StorageClass. It writes <code>hostPath</code> PersistentVolumes that point at directories on the node, and claims that bind to them:</p>
<!-- -->
<p>A <code>hostPath</code> volume is the directory on whichever worker runs the pod. Without the NFS mount, the pod gets an empty local directory and cannot find its configuration or keys.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nfs-server">NFS server<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#nfs-server" class="hash-link" aria-label="Direct link to NFS server" title="Direct link to NFS server" translate="no">​</a></h3>
<p>The directory names are RSA's examples (Installation Guide, Ch. 2, Kubernetes Prerequisites).</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">dnf install -y nfs-utils                       # Ubuntu: apt install nfs-kernel-server</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">mkdir -p /var/nfs/general</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">echo '/var/nfs/general &lt;worker-1-ip&gt;(rw,sync,no_subtree_check) &lt;worker-2-ip&gt;(rw,sync,no_subtree_check)' &gt;&gt; /etc/exports</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">systemctl enable --now nfs-server</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">exportfs -ra</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">cd /var/nfs/general</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">mkdir dataiglconfig76 dataiglkeystore76 dataiglsecurity76</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">mkdir dataiglconfig761                         # cluster: one config directory per host</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">chown 1000:1000 dataiglconfig76 dataiglkeystore76 dataiglsecurity76 dataiglconfig761</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">chmod 755 dataiglconfig76 dataiglkeystore76 dataiglconfig761</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">chmod 700 dataiglsecurity76</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Owner is uid 1000</div><div class="admonitionContent_BuS1"><p>RSA's prerequisites show <code>chown oracle:oninstall</code>. The 8.0 P11 HF01 image has no <code>oracle</code> user; it runs as <code>jboss</code>, uid 1000, gid 1000. <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-5-create-the-namespace-and-pull-secret" class="">Step 5</a> confirms this from the image.</p></div></div>
<p>In a cluster, each host has its own config directory and shares the master's keystore and security directories.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="every-worker-and-the-control-plane-node">Every worker, and the control-plane node<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#every-worker-and-the-control-plane-node" class="hash-link" aria-label="Direct link to Every worker, and the control-plane node" title="Direct link to Every worker, and the control-plane node" translate="no">​</a></h3>
<p><code>createYamlFiles.sh</code> (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-6-generate-the-manifests" class="">Step 6</a>) writes each node's <code>Aveksa_System.cfg</code> into the config directory on the node where it runs, so that node needs the same mount.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">dnf install -y nfs-utils                       # Ubuntu: apt install nfs-common</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">mkdir -p /var/nfs/general</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">echo '&lt;nfs-server&gt;:/var/nfs/general /var/nfs/general nfs defaults,_netdev 0 0' &gt;&gt; /etc/fstab</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">mount /var/nfs/general</span><br></div></code></pre></div></div>
<p><strong>Check:</strong> on every worker and the control-plane node, the share is mounted, owned by uid 1000, and the security directory is mode 700:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">mountpoint /var/nfs/general</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># /var/nfs/general is a mountpoint</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">ls -ldn /var/nfs/general/dataigl*</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># drwxr-xr-x. 2 1000 1000 31 Oct  6 03:13 /var/nfs/general/dataiglconfig76</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># drwxr-xr-x. 2 1000 1000 31 Oct  5 23:07 /var/nfs/general/dataiglconfig761</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># drwxr-xr-x. 2 1000 1000 91 Oct  6 09:36 /var/nfs/general/dataiglkeystore76</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># drwx------. 2 1000 1000 36 Oct  5 22:52 /var/nfs/general/dataiglsecurity76</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-push-the-gl-image">Step 4: Push the G&amp;L image<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-4-push-the-gl-image" class="hash-link" aria-label="Direct link to Step 4: Push the G&amp;L image" title="Direct link to Step 4: Push the G&amp;L image" translate="no">​</a></h2>
<p><strong>Run on:</strong> the admin workstation.</p>
<p>RSA's Kubernetes chapter loads the image with <code>docker load</code> on each node. <strong>Showstopper on current clusters:</strong> Kubernetes 1.24 removed dockershim, and containerd does not see images in Docker's store (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Dockershim removal FAQ</a>). <strong>Workaround:</strong> push the image to the registry, which the kit's README also allows (<em>"one can have a private registry with the image uploaded in it"</em>):</p>
<!-- -->
<p>Read the tag recorded in the tar, then copy the tar to the registry with <code>skopeo</code>, which needs no container engine:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">tar -xOf ACM_Container_VP11_HF01_8.0.0.189610.tar manifest.json      # RepoTags: identity/rsaigl:8.0.0.189610</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">skopeo copy --dest-creds '&lt;push-user&gt;:&lt;password&gt;' --dest-cert-dir &lt;dir-with-ca.crt&gt; \</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  docker-archive:ACM_Container_VP11_HF01_8.0.0.189610.tar \</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  docker://&lt;registry&gt;/rsa/acm:8.0.0.189610</span><br></div></code></pre></div></div>
<p><code>--dest-cert-dir</code> is needed only for a private CA. That CA must also be in every node's operating system trust store (for example <code>/etc/pki/ca-trust/source/anchors/</code>, then <code>update-ca-trust</code>), or pulls fail with <code>x509: certificate signed by unknown authority</code>.</p>
<p><strong>Check:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">curl -u &lt;user&gt; https://&lt;registry&gt;/v2/rsa/acm/tags/list       # {"name":"rsa/acm","tags":["8.0.0.189610"]}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-create-the-namespace-and-pull-secret">Step 5: Create the namespace and pull secret<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-5-create-the-namespace-and-pull-secret" class="hash-link" aria-label="Direct link to Step 5: Create the namespace and pull secret" title="Direct link to Step 5: Create the namespace and pull secret" translate="no">​</a></h2>
<p><strong>Run on:</strong> the control-plane node.</p>
<p>The kit's manifests reference no pull secret. Create one in the namespace (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Pull an image from a private registry</a>):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl create namespace rsaigl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl create secret docker-registry gl-registry -n rsaigl \</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --docker-server=&lt;registry&gt; --docker-username=&lt;pull-user&gt; --docker-password='&lt;password&gt;'</span><br></div></code></pre></div></div>
<p>Test the pull on each G&amp;L worker. The pod also prints the user the image runs as, and leaves the 4 GB image cached on the worker:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Pod</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> gl</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">pull</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">test</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> rsaigl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">nodeName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> &lt;worker</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">restartPolicy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Never</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">imagePullSecrets</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> gl</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">registry</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">containers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> probe</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> &lt;registry</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">/rsa/acm</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">8.0.0.189610</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">imagePullPolicy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> IfNotPresent</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"sh"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"-c"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"id"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl apply -f gl-pull-test.yaml</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl logs gl-pull-test -n rsaigl          # uid=1000(jboss) gid=1000(jboss) groups=1000(jboss)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl delete pod gl-pull-test -n rsaigl</span><br></div></code></pre></div></div>
<p>Repeat with <code>nodeName: &lt;worker-2&gt;</code> in a cluster.</p>
<p><strong>Check:</strong> the pod completes on every G&amp;L worker and prints uid 1000. If the uid differs, use it for the <code>chown</code> commands in Steps <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-3-prepare-the-shared-volumes" class="">3</a> and <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-7-complete-aveksa_systemcfg" class="">7</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-6-generate-the-manifests">Step 6: Generate the manifests<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-6-generate-the-manifests" class="hash-link" aria-label="Direct link to Step 6: Generate the manifests" title="Direct link to Step 6: Generate the manifests" translate="no">​</a></h2>
<p><strong>Run on:</strong> the control-plane node, in <code>~/gl-k8s</code>.</p>
<p><code>createYamlFiles.sh</code> writes the manifests and each node's <code>Aveksa_System.cfg</code>, including the cluster parameters, into the config paths it is given on this node. It writes the file only when the config directory has none; an existing file is used as it is (Installation Guide, Ch. 4). Leave the config directories empty, or the nodes will not form a cluster. The directories belong to uid 1000 (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-3-prepare-the-shared-volumes" class="">Step 3</a>), so run the script with <code>sudo</code>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">ls /var/nfs/general/dataiglconfig76 /var/nfs/general/dataiglconfig761    # no Aveksa_System.cfg</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">sudo ./createYamlFiles.sh</span><br></div></code></pre></div></div>
<p>Prompts in the order the 8.0 kit asks them. Enter accepts the default in brackets.</p>
<table><thead><tr><th>#</th><th>Prompt</th><th>Answer</th></tr></thead><tbody><tr><td>1</td><td>How many IGL application host's nodes</td><td><code>0</code> single node, <code>1</code> master and host1</td></tr><tr><td>2</td><td>Provide the image name</td><td><code>&lt;registry&gt;/rsa/acm:8.0.0.189610</code></td></tr><tr><td>3</td><td>Remote Database IP/Hostname</td><td><code>&lt;db-host&gt;</code></td></tr><tr><td>4</td><td>AVUSER password, then confirmation</td><td>The <code>AVUSER</code> password</td></tr><tr><td>5</td><td>Master host name <code>[rsaiglmaster]</code></td><td>Enter</td></tr><tr><td>6</td><td>Master service name <code>[rsaiglsvcmaster]</code></td><td>Enter</td></tr><tr><td>7</td><td>Master's config path</td><td><code>/var/nfs/general/dataiglconfig76</code></td></tr><tr><td>8</td><td>Master's keystore path</td><td><code>/var/nfs/general/dataiglkeystore76</code></td></tr><tr><td>9</td><td>Master's security path</td><td><code>/var/nfs/general/dataiglsecurity76</code></td></tr><tr><td>10</td><td>Namespace <code>[rsaigl]</code></td><td>Enter</td></tr><tr><td>11</td><td>LoadBalancer Hostname/IP</td><td><code>&lt;lb-ip&gt;</code></td></tr><tr><td>12</td><td>Port used to access the application</td><td><code>8443</code></td></tr><tr><td>13</td><td>Service Type <code>[NodePort/LoadBalancer]</code></td><td><code>LoadBalancer</code>, or <code>NodePort</code> without a load balancer</td></tr><tr><td>14</td><td>host1 hostname <code>[host1]</code> (cluster)</td><td>Enter</td></tr><tr><td>15</td><td>host1 config path (cluster)</td><td><code>/var/nfs/general/dataiglconfig761</code></td></tr><tr><td>16</td><td>LoadBalancer Hostname/IP (cluster)</td><td><code>&lt;lb-ip-host1&gt;</code></td></tr><tr><td>17</td><td>Port used to access the application (cluster)</td><td><code>8443</code></td></tr></tbody></table>
<p>The Installation Guide's prompt list omits prompts 11, 12, 16 and 17.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>The full session for a cluster of the master and host1</summary><div><div class="collapsibleContent_i85q"><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">By default, this would create manifest for domain node. How many IGL application host's nodes are you planning to deploy in the Kubernetes Cluster : 1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Provide the image name : &lt;registry&gt;/rsa/acm:8.0.0.189610</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter the Remote Database IP/Hostname : &lt;db-host&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Provided remote database is :  &lt;db-host&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter the AVUSER password :</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Confirm the AVUSER password :</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter the IGL application master host name [rsaiglmaster]:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">The provided IGL application master hostname is :  rsaiglmaster</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter the IGL application master service name [rsaiglsvcmaster]:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">The entered IGL application master service name is :  rsaiglsvcmaster</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter master's config path : /var/nfs/general/dataiglconfig76</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Provided master's config path is :  /var/nfs/general/dataiglconfig76</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter master's keystore path : /var/nfs/general/dataiglkeystore76</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Provided master's keystore path is :  /var/nfs/general/dataiglkeystore76</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter master's security path : /var/nfs/general/dataiglsecurity76</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">The provided master's security path is :  /var/nfs/general/dataiglsecurity76</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter the namespace in which the rsaigl components to be deployed in the cluster [rsaigl]:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">The provided namespace is :  rsaigl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter the LoadBalancer Hostname/IP required to access the application (Leave it empty if the value is unknown and edit it later) : &lt;lb-ip&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter the port used to access the application (Leave it empty if the value is unknown and edit it later) : 8443</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter the service Type for the Pods [NodePort/LoadBalancer] : LoadBalancer</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Provided service type is :  LoadBalancer</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### Creating the Aveksa_System.cfg file in the master config directory ###</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">----------------------------------------------------------------</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">The entered Pod Service type is :  LoadBalancer</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">----------------------------------------------------------------</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Creating run.sh file</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">----------------------------------------------------------------</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Number of IGL application hosts you selected to deploy in the K8s cluster is : 1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter the IGL application host1 hostname [host1]:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Provided host1 hostname is : host1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter the host1 config path : /var/nfs/general/dataiglconfig761</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Provided host1 config path is :  /var/nfs/general/dataiglconfig761</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter the LoadBalancer Hostname/IP required to access the application (Leave it empty if the value is unknown and edit it later) : &lt;lb-ip-host1&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Enter the port used to access the application (Leave it empty if the value is unknown and edit it later) : 8443</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### Creating Aveksa_System.cfg file under the given config path ie., /var/nfs/general/dataiglconfig761  ###</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### Creating of Aveksa_System.cfg file for host1 is completed  ###</span><br></div></code></pre></div></div></div></div></details>
<p>The cluster parameters the kit writes:</p>
<table><thead><tr><th>Key</th><th>Master (<code>dataiglconfig76</code>)</th><th>host1 (<code>dataiglconfig761</code>)</th></tr></thead><tbody><tr><td><code>NODE_TYPE</code></td><td><code>Domain</code></td><td><code>Host</code></td></tr><tr><td><code>HOST_XML_NAME</code></td><td><code>master</code></td><td><code>slave1</code></td></tr><tr><td><code>SERVER_NAME</code></td><td><code>img-server-master</code></td><td><code>img-server-1</code></td></tr><tr><td><code>CLUSTER_NODES_IP</code></td><td><code>rsaiglmaster,host1</code></td><td></td></tr><tr><td><code>DOMAIN_MASTER</code></td><td></td><td><code>masterinternalsvc</code></td></tr><tr><td><code>DOMAIN_USER</code>, <code>DOMAIN_PASSWORD</code>, <code>SERVER_GROUP</code></td><td>Kit defaults</td><td>Same as the master</td></tr></tbody></table>
<p>Generated files:</p>
<table><thead><tr><th>File</th><th>Content</th></tr></thead><tbody><tr><td><code>namespace.yaml</code></td><td>Namespace <code>rsaigl</code></td></tr><tr><td><code>master.yaml</code></td><td>Three PersistentVolumes, three claims, the master Deployment</td></tr><tr><td><code>service_master.yaml</code></td><td>External Service: 8080, 8443, 8444</td></tr><tr><td><code>service_internal_master.yaml</code></td><td>Internal Service, including 9999, 7600 and 57600</td></tr><tr><td><code>host1.yaml</code>, <code>service_host1.yaml</code>, <code>service_internal_host1.yaml</code></td><td>The same for host1 (cluster)</td></tr><tr><td><code>run.sh</code></td><td><code>kubectl apply</code> for each file, in order</td></tr></tbody></table>
<p><strong>Check:</strong> the script prints <em>"### Creating the Aveksa_System.cfg file in the master config directory ###"</em> (and, in a cluster, the same for host1), and each node's file has its role:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">sudo grep -H NODE_TYPE /var/nfs/general/dataiglconfig76*/Aveksa_System.cfg</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># /var/nfs/general/dataiglconfig761/Aveksa_System.cfg:NODE_TYPE=Host</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># /var/nfs/general/dataiglconfig76/Aveksa_System.cfg:NODE_TYPE=Domain</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-7-complete-aveksa_systemcfg">Step 7: Complete Aveksa_System.cfg<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-7-complete-aveksa_systemcfg" class="hash-link" aria-label="Direct link to Step 7: Complete Aveksa_System.cfg" title="Direct link to Step 7: Complete Aveksa_System.cfg" translate="no">​</a></h2>
<p><strong>Run on:</strong> the NFS server, as root.</p>
<p>The kit's file holds the database host, the <code>AVUSER</code> password, the load balancer address and the cluster parameters. Add the keys it has no prompt for to each node's file (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Installation Guide</a>, Ch. 2, Verify Docker Container Requirements):</p>
<!-- -->
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">for d in /var/nfs/general/dataiglconfig76 /var/nfs/general/dataiglconfig761; do</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">cat &gt;&gt; $d/Aveksa_System.cfg &lt;&lt;'EOF'</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">REMOTE_ORACLE_PORT=1555</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">REMOTE_ORACLE_DATABASE=AVDB</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">AVEKSA_USER=avuser</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">AVEKSA_REPORTS_USER=avdwuser</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">AVEKSA_REPORTS_PASS=&lt;avdwuser-password&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">AVEKSA_CSUSER=avcsuser</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">AVEKSA_CSUSER_PASS=&lt;avcsuser-password&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">AVEKSA_PUBLIC_DB_USER=ACMDB</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">AVEKSA_PUBLIC_DB_PASS=&lt;acmdb-password&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">AVEKSA_AVPERF_USER=perfstat</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">AVEKSA_AVPERF_PASS=&lt;perfstat-password&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">WILDFLY_HEAP_MEM=12288</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">AMAZON_RDS=N</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">EOF</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">chown 1000:1000 $d/Aveksa_System.cfg</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">chmod 777 $d/Aveksa_System.cfg</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">done</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Showstopper: host password</div><div class="admonitionContent_BuS1"><p>The kit writes every host's file with <code>AVEKSA_PASS=secret</code>, whatever <code>AVUSER</code> password was entered. <strong>Workaround:</strong> set it to the <code>AVUSER</code> password in each host's file:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">sed -i 's/^AVEKSA_PASS=.*/AVEKSA_PASS=&lt;avuser-password&gt;/' /var/nfs/general/dataiglconfig761/Aveksa_System.cfg</span><br></div></code></pre></div></div></div></div>
<table><thead><tr><th>Key</th><th>Notes</th></tr></thead><tbody><tr><td><code>REMOTE_ORACLE_PORT</code>, <code>REMOTE_ORACLE_DATABASE</code></td><td>Defaults 1555 and AVDB</td></tr><tr><td><code>AVEKSA_CSUSER</code></td><td>One table in the Installation Guide spells it <code>AVESKA_CSUSER</code>; the sample file and the product use <code>AVEKSA_CSUSER</code></td></tr><tr><td><code>WILDFLY_HEAP_MEM</code></td><td>Heap in MB; RSA's minimum is 12288</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Plain text only until the first start</div><div class="admonitionContent_BuS1"><p>G&amp;L encrypts the passwords in this file on its first start and writes it back, which is why it must be writable by uid 1000.</p></div></div>
<p><strong>Check:</strong> in each config directory, <code>ls -ln Aveksa_System.cfg</code> shows <code>1000 1000</code> and <code>-rwxrwxrwx</code>, <code>cut -d= -f1 Aveksa_System.cfg</code> lists 24 keys, and <code>NODE_TYPE</code> is still present.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-8-correct-the-manifests">Step 8: Correct the manifests<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-8-correct-the-manifests" class="hash-link" aria-label="Direct link to Step 8: Correct the manifests" title="Direct link to Step 8: Correct the manifests" translate="no">​</a></h2>
<p><strong>Run on:</strong> the control-plane node, in <code>~/gl-k8s</code>.</p>
<p>The kit's output does not deploy a working G&amp;L on Kubernetes as generated. The Installation Guide allows the generated YAML to be edited (Ch. 4). The changes are grouped into kit defects that stop the deployment, an RSA requirement the kit has no prompt for, and recommendations. Keep the originals first:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">for f in *.yaml; do cp -n "$f" "$f.orig"; done</span><br></div></code></pre></div></div>
<table><thead><tr><th>#</th><th>Kit output</th><th>Result without the change</th><th>Type</th></tr></thead><tbody><tr><td>1</td><td>Claims name no volume</td><td>Claims bind to the wrong volumes; the master exits with code 254 and writes no log</td><td>Showstopper</td></tr><tr><td>2</td><td>No <code>imagePullSecrets</code></td><td><code>ErrImagePull: no basic auth credentials</code> from a registry that requires a login</td><td>Showstopper</td></tr><tr><td>3</td><td>Host names (<code>rsaiglmaster</code>, <code>host1</code>) not resolvable between pods</td><td>The nodes cannot discover each other</td><td>Showstopper (cluster)</td></tr><tr><td>4</td><td>Cluster member list applied after WildFly starts</td><td>Every server runs with <code>127.0.0.1[7600]</code>; no node finds another</td><td>Showstopper (cluster)</td></tr><tr><td>5</td><td>No <code>TZ</code></td><td>Container time zone differs from the database's, which RSA does not allow</td><td>RSA requirement</td></tr><tr><td>6</td><td><code>imagePullPolicy</code> not set</td><td>The 4 GB image may be pulled again on restarts</td><td>Recommended</td></tr><tr><td>7</td><td><code>15Gi</code> memory request, no placement</td><td>Pod <code>Pending</code> if no worker fits; placement left to the scheduler</td><td>Recommended</td></tr><tr><td>8</td><td>No fixed LoadBalancer address</td><td>The Service address can change when it is recreated</td><td>Recommended</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="showstopper-1-bind-each-claim-to-its-volume">Showstopper 1: bind each claim to its volume<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#showstopper-1-bind-each-claim-to-its-volume" class="hash-link" aria-label="Direct link to Showstopper 1: bind each claim to its volume" title="Direct link to Showstopper 1: bind each claim to its volume" translate="no">​</a></h3>
<p>All kit volumes are identical apart from their path (<code>storageClassName: manual</code>, <code>8Gi</code>, <code>ReadWriteMany</code>), and the claims name no volume, so Kubernetes binds a claim to any free volume. In a cluster deployment, <code>configmaster-claim</code> was bound to a keystore volume and <code>securitymaster-claim</code> to a config volume. <strong>Workaround:</strong> reserve each volume with <code>volumeName</code> (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Reserving a PersistentVolume</a>):</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> PersistentVolumeClaim</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> configmaster</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">claim</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">storageClassName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> manual</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">volumeName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> configmaster</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">accessModes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> ReadWriteMany</span><br></div></code></pre></div></div>
<table><thead><tr><th>Claim</th><th><code>volumeName</code></th></tr></thead><tbody><tr><td><code>configmaster-claim</code>, <code>securitymaster-claim</code>, <code>keystoremaster-claim</code></td><td><code>configmaster</code>, <code>securitymaster</code>, <code>keystoremaster</code></td></tr><tr><td><code>confighost1-claim</code>, <code>securityhost1-claim</code>, <code>keystorehost1-claim</code></td><td><code>config1</code>, <code>security1</code>, <code>keystore1</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="showstopper-2-pull-secret">Showstopper 2: pull secret<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#showstopper-2-pull-secret" class="hash-link" aria-label="Direct link to Showstopper 2: pull secret" title="Direct link to Showstopper 2: pull secret" translate="no">​</a></h3>
<p><strong>Workaround:</strong> add the secret from <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-5-create-the-namespace-and-pull-secret" class="">Step 5</a> to each Deployment, under <code>spec.template.spec</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">imagePullSecrets</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> gl</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">registry</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="showstopper-3-cluster-host-names">Showstopper 3 (cluster): host names<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#showstopper-3-cluster-host-names" class="hash-link" aria-label="Direct link to Showstopper 3 (cluster): host names" title="Direct link to Showstopper 3 (cluster): host names" translate="no">​</a></h3>
<p><code>CLUSTER_NODES_IP</code> lists the nodes by host name, and each node must resolve the others' names to their pod addresses: the Installation Guide's fix copies each container's address into every container's <code>/etc/hosts</code> (Ch. 4, Common Problem). Kubernetes rewrites <code>/etc/hosts</code> at each pod start and gives a recreated pod a new address. A name that resolves to a Service's ClusterIP is not enough: discovery through it finds no members. <strong>Workaround:</strong> a headless Service per host name, which resolves the name to the pod's own address in cluster DNS (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Headless Services</a>). Add one to each internal Service file:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># appended to service_internal_master.yaml; service_internal_host1.yaml gets</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># the same with name: host1 and selector name: host1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> rsaiglmaster</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">clusterIP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> None</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">publishNotReadyAddresses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">selector</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> rsaiglmaster</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> jgroups</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">tcp</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">7600</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> jgroups</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">tcp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">fd</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">57600</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="showstopper-4-cluster-member-list-before-start">Showstopper 4 (cluster): member list before start<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#showstopper-4-cluster-member-list-before-start" class="hash-link" aria-label="Direct link to Showstopper 4 (cluster): member list before start" title="Direct link to Showstopper 4 (cluster): member list before start" translate="no">​</a></h3>
<p>The image's start script, <code>/home/oracle/execute.sh</code>, writes <code>CLUSTER_NODES_IP</code> into WildFly's <code>domain.xml</code> only after WildFly has started, and does not reload it. Every Kubernetes pod starts from the image, so the servers always run with the image's <code>127.0.0.1[7600]</code>. <strong>Workaround:</strong> set the same value before <code>execute.sh</code> runs, in the master's G&amp;L container. The master is the domain controller and passes the setting to every host.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># master.yaml, G&amp;L container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"/bin/sh"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"-c"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">args</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          f=/home/oracle/config/${CONFIG_FILE:-Aveksa_System.cfg}</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          v=$(sed -n "s/^CLUSTER_NODES_IP=//p" "$f" | sed -E "s/([^,]+)/\1[7600]/g")</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          [ -n "$v" ] &amp;&amp; sed -i -E "s|(name=\"jboss.cluster.tcp.initial_hosts\"[[:space:]]+value=\")[^\"]*\"|\1$v\"|" /opt/jboss/wildfly/domain/configuration/domain.xml</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          exec /home/oracle/execute.sh</span><br></div></code></pre></div></div>
<p>The edit replaces only the value between the quotes. The image writes the element as <code>value="127.0.0.1[7600]" /&gt;</code>, with a space before <code>/&gt;</code>, so a pattern that expects <code>"/&gt;</code> matches nothing and the servers still start with <code>127.0.0.1[7600]</code>.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rsa-requirement-5-time-zone">RSA requirement 5: time zone<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#rsa-requirement-5-time-zone" class="hash-link" aria-label="Direct link to RSA requirement 5: time zone" title="Direct link to RSA requirement 5: time zone" translate="no">​</a></h3>
<p>The container must use the database's time zone; RSA's Docker procedure passes <code>-e TZ</code> when the database is not on <code>America/New_York</code> (Installation Guide, Ch. 5). The kit has no prompt for it. Add it to each G&amp;L container:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> TZ</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> &lt;tz</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recommended-6-to-8">Recommended 6 to 8<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#recommended-6-to-8" class="hash-link" aria-label="Direct link to Recommended 6 to 8" title="Direct link to Recommended 6 to 8" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">nodeSelector</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">kubernetes.io/hostname</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> &lt;worker</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)"># 7: &lt;worker-2&gt; in host1.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">containers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> rsaiglmaster</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">imagePullPolicy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> IfNotPresent          </span><span class="token comment" style="color:rgb(98, 114, 164)"># 6</span><br></div></code></pre></div></div>
<p>For 7, compare the <code>15Gi</code> request with each worker's allocatable memory (<code>kubectl get nodes -o custom-columns=NODE:.metadata.name,ALLOCATABLE:.status.allocatable.memory</code>). A pod whose request exceeds every worker stays <code>Pending</code> (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Resource management</a>). Size the workers rather than lowering the request: a worker without enough memory kills WildFly as the heap grows (<code>OOMKilled</code>, exit code 137), possibly after the pod reported <code>Ready</code>.</p>
<p>For 8, the method depends on the load balancer. For MetalLB (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">MetalLB usage</a>):</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> rsaiglsvcmaster</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">annotations</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">metallb.universe.tf/loadBalancerIPs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> &lt;lb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">ip</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><br></div></code></pre></div></div>
<p><strong>Check:</strong> <code>for f in *.yaml; do diff "$f.orig" "$f"; done</code> shows only the changes above. For <code>master.yaml</code> in a cluster, the additions are:</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;   volumeName: configmaster</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;   volumeName: securitymaster</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;   volumeName: keystoremaster</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;         - name: TZ</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;           value: &lt;tz&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;         imagePullPolicy: IfNotPresent</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;         command: ["/bin/sh", "-c"]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;         args:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;         - |</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;           f=/home/oracle/config/${CONFIG_FILE:-Aveksa_System.cfg}</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;           ...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;           exec /home/oracle/execute.sh</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;       imagePullSecrets:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;       - name: gl-registry</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;       nodeSelector:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;         kubernetes.io/hostname: &lt;worker-1&gt;</span><br></div></code></pre></div></div>
<p><code>host1.yaml</code> has the same changes without <code>command</code> and <code>args</code>, and each <code>service_internal_*.yaml</code> gains its headless Service.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-9-deploy">Step 9: Deploy<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-9-deploy" class="hash-link" aria-label="Direct link to Step 9: Deploy" title="Direct link to Step 9: Deploy" translate="no">​</a></h2>
<p><strong>Run on:</strong> the control-plane node, in <code>~/gl-k8s</code>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">cat run.sh</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./run.sh</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods -n rsaigl -o wide -w</span><br></div></code></pre></div></div>
<!-- -->
<ul>
<li class="">The first start creates the schema and is the slowest. Follow it with <code>kubectl logs -f deploy/rsaiglmaster-deployment -n rsaigl</code>.</li>
<li class="">In a cluster, <code>host1</code> stays <code>Init:0/1</code> until the master answers on <code>http://masterinternalsvc:8080</code>; the init container checks every 300 seconds.</li>
<li class="">The kit defines no readiness probe for the application, so <code>Running</code> does not mean G&amp;L is serving. <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-10-verify-the-deployment" class="">Step 10</a> confirms it.</li>
</ul>
<p>A cluster deployment, watched with timestamps. host1 waits in its init container until the master serves, then starts:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">TIME      EVENT      NAME                                       READY   STATUS            AGE     NODE</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">09:36:05  ADDED      host1-deployment-6599cf7489-n896j          0/1     Init:0/1          2m30s   &lt;worker-2&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">09:36:05  ADDED      rsaiglmaster-deployment-5bff7797df-tdm8d   1/1     Running           2m30s   &lt;worker-1&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">09:39:07  MODIFIED   host1-deployment-6599cf7489-n896j          0/1     PodInitializing   5m32s   &lt;worker-2&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">09:39:07  MODIFIED   host1-deployment-6599cf7489-n896j          1/1     Running           5m32s   &lt;worker-2&gt;</span><br></div></code></pre></div></div>
<p>The master's container log shows the start sequence. The lines to look for:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Creating User for Domain Management</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Created Domain Management user -  AveksaClusterAdmin</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Fetching latest keystore password from the Database</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Successfully created New Password Vault Keystore for wildfly server</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Password Vault configured successfully...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Starting Domain-Controller Wildfly...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Wildfly Started Successfully</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Deploying aveksa.ear...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">aveksa.ear Deployed Successfully</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Deploying aveksaWFArchitect.ear...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">aveksaWFArchitect.ear Deployed Successfully</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Updating passed DB credentials with encrypted values</span><br></div></code></pre></div></div>
<p><strong>Check:</strong> every pod is <code>Running</code> and <code>1/1</code>, and each external Service has an <code>EXTERNAL-IP</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods,svc -n rsaigl -o wide</span><br></div></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">NAME                                           READY   STATUS    RESTARTS   AGE     NODE</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">pod/host1-deployment-6599cf7489-n896j          1/1     Running   0          9m37s   &lt;worker-2&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">pod/rsaiglmaster-deployment-5bff7797df-tdm8d   1/1     Running   0          9m37s   &lt;worker-1&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">service/host1               ClusterIP      None            &lt;none&gt;          7600/TCP,57600/TCP</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">service/internalsvc-host1   ClusterIP      10.99.67.190    &lt;none&gt;          1158/TCP,1155/TCP,...,9999/TCP,7600/TCP,57600/TCP</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">service/masterinternalsvc   ClusterIP      10.101.73.9     &lt;none&gt;          1158/TCP,1155/TCP,...,9999/TCP,7600/TCP,57600/TCP</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">service/rsaiglmaster        ClusterIP      None            &lt;none&gt;          7600/TCP,57600/TCP</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">service/rsaiglsvchost1      LoadBalancer   10.99.202.189   &lt;lb-ip-host1&gt;   8080:30351/TCP,8443:32738/TCP,8444:32726/TCP</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">service/rsaiglsvcmaster     LoadBalancer   10.96.158.145   &lt;lb-ip&gt;         8080:30401/TCP,8443:30872/TCP,8444:31124/TCP</span><br></div></code></pre></div></div>
<p><code>rsaiglmaster</code> and <code>host1</code> are the headless Services added in <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#showstopper-3-cluster-host-names" class="">Step 8</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-10-verify-the-deployment">Step 10: Verify the deployment<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-10-verify-the-deployment" class="hash-link" aria-label="Direct link to Step 10: Verify the deployment" title="Direct link to Step 10: Verify the deployment" translate="no">​</a></h2>
<p><strong>Run on:</strong> the control-plane node, then a browser. Do not hand over until every check passes.</p>
<p><strong>1. Pods are steady.</strong> <code>RESTARTS</code> is <code>0</code> on every pod.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods -n rsaigl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># NAME                                       READY   STATUS    RESTARTS   AGE</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># host1-deployment-6599cf7489-n896j          1/1     Running   0          7m48s</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># rsaiglmaster-deployment-5bff7797df-tdm8d   1/1     Running   0          7m48s</span><br></div></code></pre></div></div>
<p><strong>2. Every node answers on its own address.</strong> Each external Service returns <code>200</code> or <code>30x</code>. A host starts after the master (its init check runs every 300 seconds), so retest a host's <code>000</code> before treating it as a failure.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">curl -k -s -o /dev/null -w '%{http_code}\n' https://&lt;lb-ip&gt;:8443/aveksa/main          # 200</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">curl -k -s -o /dev/null -w '%{http_code}\n' https://&lt;lb-ip-host1&gt;:8443/aveksa/main    # 200</span><br></div></code></pre></div></div>
<p><strong>3. WildFly started and the application is deployed.</strong> The container log has the start lines and none of <code>WFLYSRV0026</code>, <code>WFLYCTL0186</code> or <code>rolled back</code>. Ignore <code>WFLYSRV0003: Could not index class</code> warnings; they are normal.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">for d in rsaiglmaster-deployment "host1-deployment -c host1"; do</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  kubectl logs deploy/$d -n rsaigl | grep -E 'Starting (Domain|Host)-Controller|Wildfly Started Successfully|aveksa.ear Deployed Successfully|WFLYSRV0026|WFLYCTL0186|rolled back'</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">done</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Starting Domain-Controller Wildfly...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Wildfly Started Successfully</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># aveksa.ear Deployed Successfully</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Starting Host-Controller Wildfly...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Wildfly Started Successfully</span><br></div></code></pre></div></div>
<p>A host does not deploy <code>aveksa.ear</code> itself: the master, as domain controller, deploys it to every server in the domain.</p>
<p><strong>4. Version.</strong> G&amp;L's logs are inside the pod, under <code>/opt/jboss/wildfly/domain/servers/&lt;SERVER_NAME&gt;/log</code> (<code>img-server-master</code> on the master, <code>img-server-1</code> on host1).</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">POD=$(kubectl get pod -n rsaigl -l name=rsaiglmaster -o name)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">LOG=$(kubectl exec -n rsaigl $POD -- sh -c 'ls -d /opt/jboss/wildfly/domain/servers/*/log')</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl exec -n rsaigl $POD -- grep -m1 '^Version' $LOG/aveksaServerInfo.log</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Version 8.0.0.189610 P11_HF01</span><br></div></code></pre></div></div>
<p><strong>5. First logon.</strong> Open <code>https://&lt;lb-ip&gt;:8443/aveksa/main</code> and sign in as <code>AveksaAdmin</code> with <code>aveksa123</code>. G&amp;L asks for a new password at once: at least eight characters, with upper case, lower case and a number (Installation Guide, Ch. 3).</p>
<p><strong>6. Server Nodes.</strong> Go to <strong>Admin &gt; System &gt; Server Nodes</strong>. Each G&amp;L node registers itself here when it starts, named <code>&lt;host name&gt;-&lt;SERVER_NAME&gt;</code>. Expect one row per node: exactly one <strong>System Operations Node</strong>, the rest <strong>General Node</strong>, all <strong>Healthy</strong>, with a recent heartbeat. A general node designated with <strong>Make Next SON</strong> shows <strong>(Next SON)</strong> after its role; see <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#system-operations-node-handover" class="">System Operations Node handover</a>.</p>
<p></p><div aria-owns="rmiz-modal-" data-rmiz=""><div data-rmiz-content="not-found" style="visibility:visible"><img alt="Admin &amp;gt; System &amp;gt; Server Nodes in a two-node cluster: rsaiglmaster-img-server-master as the System Operations Node and host1-img-server-1 as a General Node marked Next SON, both Healthy" src="https://pradeepkg.github.io/RSA/assets/images/gl-1-0f69c642459c94d33e4bbc0a7b12729d.png" width="1546" height="471" style="cursor:zoom-in"></div></div><p></p>
<p>A node that was renamed or removed keeps its row, with its heartbeat stopped; delete it once it shows Shutdown or Unresponsive.</p>
<p><strong>7. The nodes form one cluster (cluster only).</strong></p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Server Nodes is not proof</div><div class="admonitionContent_BuS1"><p>Every node registers itself in the database, so Server Nodes lists all of them as Healthy even when each server runs alone. <code>jms_status</code> in <code>t_server_nodes</code> also reads <code>HEALTHY</code> in that state, so it is no proof either. Both checks below must pass.</p></div></div>
<p><em>a. host1 joined the master's domain.</em> host1 starts as a host controller and connects to the master; the master registers it.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl logs deploy/host1-deployment -c host1 -n rsaigl | grep -E 'Starting (Domain|Host)-Controller'</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Starting Host-Controller Wildfly...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">H=$(kubectl get pod -n rsaigl -l name=host1 -o name)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl exec -n rsaigl $H -c host1 -- grep 'Connected to master host controller' /opt/jboss/wildfly/domain/log/host-controller.log</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># WFLYHC0148: Connected to master host controller at remote://masterinternalsvc:9999</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">M=$(kubectl get pod -n rsaigl -l name=rsaiglmaster -o name)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl exec -n rsaigl $M -- grep 'Registered remote slave host' /opt/jboss/wildfly/domain/log/host-controller.log</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># WFLYHC0019: Registered remote slave host "slave1", ...</span><br></div></code></pre></div></div>
<p><code>Starting Domain-Controller Wildfly</code> on host1 means it is running as its own domain: see <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-6-generate-the-manifests" class="">Step 6</a>.</p>
<p><em>b. One cluster view with every node in it.</em> Each server's latest view counts all the nodes, here <code>(2)</code> with both names:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">for p in $M "$H -c host1"; do</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  kubectl exec -n rsaigl $p -- sh -c 'grep ISPN000094 /opt/jboss/wildfly/domain/servers/*/log/server.log | tail -1'</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">done</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># ISPN000094: Received new cluster view for channel ejb: [master:img-server-master|1] (2) [master:img-server-master, slave1:img-server-1]</span><br></div></code></pre></div></div>
<p>A view of <code>(1)</code>, or <code>no members discovered ... creating cluster as coordinator</code>, means the servers did not find each other: see <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#showstopper-3-cluster-host-names" class="">Step 8, changes 3 and 4</a>. The member list a server started with is in its JVM arguments:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl exec -n rsaigl $M -- sh -c 'for d in /proc/[0-9]*; do tr "\0" "\n" &lt; $d/cmdline 2&gt;/dev/null | grep "^-Djboss.cluster.tcp.initial_hosts"; done'</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># -Djboss.cluster.tcp.initial_hosts=rsaiglmaster[7600],host1[7600]</span><br></div></code></pre></div></div>
<p><strong>8. Pods are still steady.</strong> Repeat check 1. A worker short of memory can kill WildFly minutes after it reported <code>Ready</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-11-post-install-tasks-and-backup">Step 11: Post-install tasks and backup<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-11-post-install-tasks-and-backup" class="hash-link" aria-label="Direct link to Step 11: Post-install tasks and backup" title="Direct link to Step 11: Post-install tasks and backup" translate="no">​</a></h2>
<p><strong>Run on:</strong> the database server (the DBA), then the control-plane node and the NFS server.</p>
<p><strong>Database tasks.</strong> These are the same for every G&amp;L deployment and need objects that G&amp;L creates on its first start: recompile <code>AVUSER.Utilities_Pkg</code>, confirm the additional <code>AVUSER</code> grants and the <code>sys_perfstat</code> migration row, and compare the database time zone with G&amp;L's, as <code>AVUSER</code> (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Database Setup and Management Guide</a>, Ch. 2, Additional AVUSER Schema Permissions). If the time zones differ, the DBA corrects the database's; then restart the G&amp;L pods (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#stop-and-start" class="">Stop and start</a>).</p>
<p><strong>Backup.</strong> Back up the database and the key encryption keys together; without the keys, encrypted data in the database cannot be recovered (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Database Setup and Management Guide</a>, Ch. 3). On Kubernetes the keys are in the security directory on NFS, and G&amp;L is stopped and started with <code>kubectl</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl scale deployment --all --replicas=0 -n rsaigl                          # control-plane node</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># database export by the DBA, per the Database Setup and Management Guide, Ch. 3</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">tar -C /var/nfs/general -czf /root/gl-kek-$(date +%F).tgz dataiglsecurity76  # NFS server</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl scale deployment rsaiglmaster-deployment --replicas=1 -n rsaigl        # then the hosts</span><br></div></code></pre></div></div>
<p><strong>Check:</strong> the DBA confirms the database tasks, and the database export and the key archive carry the same date and are stored together outside the cluster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="day-2-operations">Day-2 operations<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#day-2-operations" class="hash-link" aria-label="Direct link to Day-2 operations" title="Direct link to Day-2 operations" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="stop-and-start">Stop and start<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#stop-and-start" class="hash-link" aria-label="Direct link to Stop and start" title="Direct link to Stop and start" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl scale deployment --all --replicas=0 -n rsaigl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl scale deployment rsaiglmaster-deployment --replicas=1 -n rsaigl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl scale deployment host1-deployment --replicas=1 -n rsaigl     # cluster, after the master</span><br></div></code></pre></div></div>
<p>Every start creates new containers, so confirm the cluster again with <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-10-verify-the-deployment" class="">Step 10</a>, check 7.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="logs">Logs<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#logs" class="hash-link" aria-label="Direct link to Logs" title="Direct link to Logs" translate="no">​</a></h3>
<p>The kit persists only config, keystore and security. WildFly and G&amp;L logs are lost when a pod is deleted. Copy them first:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl cp rsaigl/&lt;pod&gt;:/opt/jboss/wildfly/domain/servers/&lt;SERVER_NAME&gt;/log ./gl-logs-&lt;pod&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="redeploy-from-scratch">Redeploy from scratch<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#redeploy-from-scratch" class="hash-link" aria-label="Direct link to Redeploy from scratch" title="Direct link to Redeploy from scratch" translate="no">​</a></h3>
<p>Deleting the namespace does not delete the PersistentVolumes, which are cluster-scoped, and it does delete the pull secret. Before running <code>run.sh</code> again:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl delete namespace rsaigl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pv                                    # the kit's volumes show Released</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl delete pv configmaster securitymaster keystoremaster config1 security1 keystore1</span><br></div></code></pre></div></div>
<p>Then repeat <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-5-create-the-namespace-and-pull-secret" class="">Step 5</a> (namespace and pull secret) and <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-9-deploy" class="">Step 9</a>. The data on NFS, including each <code>Aveksa_System.cfg</code>, is not affected: the volumes are <code>hostPath</code> with the <code>Retain</code> policy.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="newer-image">Newer image<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#newer-image" class="hash-link" aria-label="Direct link to Newer image" title="Direct link to Newer image" translate="no">​</a></h3>
<p>A container is not patched in place. Back up (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-11-post-install-tasks-and-backup" class="">Step 11</a>) and push the new image (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-4-push-the-gl-image" class="">Step 4</a>). In a cluster, scale the hosts to zero, change the master's <code>image:</code> and apply it, let the master migrate the schema alone, then start the hosts on the same image. A clustered deployment that is migrated or patched must run the System Operations Node without any other active node (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Installation Guide</a>, Ch. 7; <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Patch Installation Guide</a>).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="system-operations-node-handover">System Operations Node handover<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#system-operations-node-handover" class="hash-link" aria-label="Direct link to System Operations Node handover" title="Direct link to System Operations Node handover" translate="no">​</a></h3>
<p>The first node started becomes the System Operations Node (SON). G&amp;L does not fail over automatically: another node becomes SON only when an administrator designates it (<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="">Administrator's Guide</a>, Ch. 2, Managing Server Cluster Nodes).</p>
<ul>
<li class=""><strong>Plan a successor:</strong> in <strong>Admin &gt; System &gt; Server Nodes</strong>, click <strong>Make Next SON</strong> on an active general node. It becomes SON the next time it starts after the current SON has been shut down.</li>
<li class=""><strong>Replace a SON that is down:</strong> with the current SON shut down, click <strong>Make SON</strong> on the node to promote.</li>
<li class="">Server Nodes can modify only inactive nodes (Shutdown or Unresponsive); use <strong>Delete</strong> to remove a node that is no longer part of the cluster.</li>
</ul>
<p>RSA recommends directing user traffic to general nodes only. SON tasks such as collections may depend on files on the SON, so test them after a handover.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting">Troubleshooting<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#troubleshooting" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate="no">​</a></h2>
<p>Start with:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get events -n rsaigl --sort-by=.lastTimestamp | tail -20</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl describe pod &lt;pod&gt; -n rsaigl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl logs &lt;pod&gt; -n rsaigl --previous</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="pod-does-not-start">Pod Does Not Start<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#pod-does-not-start" class="hash-link" aria-label="Direct link to Pod Does Not Start" title="Direct link to Pod Does Not Start" translate="no">​</a></h4>
<p><strong>Symptom: <code>ErrImagePull: no basic auth credentials</code></strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Image pull secret is missing in the namespace (for example, after recreating the namespace).</li>
<li class=""><strong>Resolution</strong>: Re-create the pull secret as documented in <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-5-create-the-namespace-and-pull-secret" class="">Step 5</a>.</li>
</ul>
<p><strong>Symptom: <code>ErrImagePull: x509: certificate signed by unknown authority</code></strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Private registry CA certificate is not trusted by the Kubernetes worker node.</li>
<li class=""><strong>Resolution</strong>: Install and trust the registry CA certificate on each worker node per <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-4-push-the-gl-image" class="">Step 4</a>.</li>
</ul>
<p><strong>Symptom: <code>ErrImagePull: not found</code></strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Incorrect image registry reference, repository path, or tag.</li>
<li class=""><strong>Resolution</strong>: Verify image name and tag in <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-4-push-the-gl-image" class="">Step 4</a> and prompt 2 of <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-6-generate-the-manifests" class="">Step 6</a>.</li>
</ul>
<p><strong>Symptom: <code>Pending: Insufficient memory</code></strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: The 15Gi memory request cannot be scheduled on any single worker node.</li>
<li class=""><strong>Resolution</strong>: Scale worker node memory or adjust memory requests per <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-8-correct-the-manifests" class="">Step 8</a>, <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#recommended-6-to-8" class="">change 7</a>.</li>
</ul>
<p><strong>Symptom: <code>Pending: unbound immediate PersistentVolumeClaims; volumes Released</code></strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Orphaned PersistentVolumes remain from a prior deployment.</li>
<li class=""><strong>Resolution</strong>: Execute cleanup steps in <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#redeploy-from-scratch" class="">Redeploy from scratch</a>.</li>
</ul>
<p><strong>Symptom: Pod <code>host1</code> remains in <code>Init:0/1</code></strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Master node has not answered within the probe window, or the <code>nginx</code> container image cannot be pulled.</li>
<li class=""><strong>Resolution</strong>: Allow up to 300 seconds after master responds, or mirror the <code>nginx</code> image locally.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="pod-starts-then-fails">Pod Starts, Then Fails<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#pod-starts-then-fails" class="hash-link" aria-label="Direct link to Pod Starts, Then Fails" title="Direct link to Pod Starts, Then Fails" translate="no">​</a></h4>
<p><strong>Symptom: Exit code 254 (no log produced)</strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: PersistentVolumeClaims are bound to the wrong volumes.</li>
<li class=""><strong>Resolution</strong>: Verify volume bindings using <code>kubectl get pvc -n rsaigl</code> and apply <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-8-correct-the-manifests" class="">Step 8</a>, <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#showstopper-1-bind-each-claim-to-its-volume" class="">change 1</a>.</li>
</ul>
<p><strong>Symptom: <code>OOMKilled</code> (exit code 137)</strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Container memory consumption exceeded the node memory ceiling.</li>
<li class=""><strong>Resolution</strong>: Increase worker memory or tune resource limits per <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-8-correct-the-manifests" class="">Step 8</a>, <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#recommended-6-to-8" class="">change 7</a>.</li>
</ul>
<p><strong>Symptom: Permission denied on <code>/home/oracle/security</code></strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: NFS directory is not owned by UID 1000 or file permissions are not <code>0700</code>.</li>
<li class=""><strong>Resolution</strong>: Correct directory permissions and ownership as shown in <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-3-prepare-the-shared-volumes" class="">Step 3</a>.</li>
</ul>
<p><strong>Symptom: Empty configuration or regenerated encryption keys</strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Worker node is missing the shared NFS volume mount.</li>
<li class=""><strong>Resolution</strong>: Confirm the NFS export is mounted across all worker nodes per <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-3-prepare-the-shared-volumes" class="">Step 3</a>.</li>
</ul>
<p><strong>Symptom: Database connection errors in log</strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Incorrect database credentials in <code>Aveksa_System.cfg</code> (such as the default <code>AVEKSA_PASS=secret</code>), or the Oracle listener port is blocked from the worker node.</li>
<li class=""><strong>Resolution</strong>: Validate database connectivity and credentials in <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-1-confirm-the-oracle-database" class="">Step 1</a> and <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-7-complete-aveksa_systemcfg" class="">Step 7</a>.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="gl-runs-but-has-irregularities">G&amp;L Runs But Has Irregularities<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#gl-runs-but-has-irregularities" class="hash-link" aria-label="Direct link to G&amp;L Runs But Has Irregularities" title="Direct link to G&amp;L Runs But Has Irregularities" translate="no">​</a></h4>
<p><strong>Symptom: Node URL returns HTTP <code>000</code></strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Target pod is not ready or is restarting.</li>
<li class=""><strong>Resolution</strong>: Run <code>kubectl describe pod &lt;pod&gt; -n rsaigl</code> to verify pod health and probe status.</li>
</ul>
<p><strong>Symptom: Server Nodes UI lists fewer nodes than active pods</strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Host pod is not registered with the domain master controller (host log lacks <code>Connected to master host controller</code>).</li>
<li class=""><strong>Resolution</strong>: Confirm <code>DOMAIN_MASTER</code> in <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-6-generate-the-manifests" class="">Step 6</a> and verify port 9999 connectivity on <code>masterinternalsvc</code>.</li>
</ul>
<p><strong>Symptom: Container log displays <code>Starting Domain-Controller Wildfly</code> on host</strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: <code>Aveksa_System.cfg</code> was not created by <code>createYamlFiles.sh</code> (missing <code>NODE_TYPE=Host</code>), running the host as an independent domain.</li>
<li class=""><strong>Resolution</strong>: Regenerate manifests with <code>NODE_TYPE=Host</code> in <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-6-generate-the-manifests" class="">Step 6</a>.</li>
</ul>
<p><strong>Symptom: All nodes Healthy, but cluster view displays <code>(1)</code> member; <code>server.log</code> reports <code>no members discovered</code></strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Server started with <code>-Djboss.cluster.tcp.initial_hosts=127.0.0.1[7600]</code>, or host names resolve to a Service IP instead of pod IP.</li>
<li class=""><strong>Resolution</strong>: Apply <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-8-correct-the-manifests" class="">Step 8</a>, changes <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#showstopper-3-cluster-host-names" class="">3</a> and <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#showstopper-4-cluster-member-list-before-start" class="">4</a>.</li>
</ul>
<p><strong>Symptom: <code>EXTERNAL-IP</code> remains <code>&lt;pending&gt;</code></strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Cluster lacks a load balancer controller or has exhausted external IP pool.</li>
<li class=""><strong>Resolution</strong>: Provision a cluster load balancer (such as MetalLB) or change the Service type to <code>NodePort</code>.</li>
</ul>
<p><strong>Symptom: Timestamps are shifted</strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Container timezone differs from the Oracle Database timezone.</li>
<li class=""><strong>Resolution</strong>: Align container and database timezone configurations per <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-8-correct-the-manifests" class="">Step 8</a>, <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#rsa-requirement-5-time-zone" class="">change 5</a>, and <a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#step-11-post-install-tasks-and-backup" class="">Step 11</a>.</li>
</ul>
<p><strong>Symptom: AFX cannot connect</strong></p>
<ul>
<li class=""><strong>Root Cause</strong>: Port 8444 is unreachable on the external Service.</li>
<li class=""><strong>Resolution</strong>: Open firewall port 8444 from AFX to the external Service IP.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="references">References<a href="https://pradeepkg.github.io/RSA/deployment/gl-on-kubernetes-cluster/#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no">​</a></h2>
<p><strong>RSA Governance &amp; Lifecycle 8.0</strong></p>
<ul>
<li class=""><a href="https://community.rsa.com/s/rsa-gov-and-lifecycle-documentation" target="_blank" rel="noopener noreferrer" class="">RSA Governance &amp; Lifecycle documentation</a> (all guides and release notes, including 8.0 P11 HF01)</li>
<li class=""><a href="https://community.rsa.com/s/article/RSA-Governance-Lifecycle-Installation-Guide-8-0" target="_blank" rel="noopener noreferrer" class="">Installation Guide 8.0</a>: Ch. 2 requirements and ports, Ch. 4 Kubernetes, Ch. 5 Docker cluster parameters, Ch. 7 patching clusters</li>
<li class=""><a href="https://community.rsa.com/s/article/RSA-Governance-Lifecycle-Database-Setup-and-Management-Guide-8-0" target="_blank" rel="noopener noreferrer" class="">Database Setup and Management Guide 8.0</a>: Ch. 2 database configuration, Ch. 3 backup</li>
<li class=""><a href="https://community.rsa.com/s/article/RSA-Governance-Lifecycle-Upgrade-and-Migration-Guide-8-0" target="_blank" rel="noopener noreferrer" class="">Upgrade and Migration Guide 8.0</a></li>
<li class=""><a href="https://community.rsa.com/s/article/RSA-Governance-Lifecycle-8-0-Patch-Installation-Guide" target="_blank" rel="noopener noreferrer" class="">Patch Installation Guide 8.0</a>: one node during a patch</li>
<li class=""><a href="https://community.rsa.com/s/article/RSA-Governance-Lifecycle-8-0-Patch-11-HF01-Release-Notes" target="_blank" rel="noopener noreferrer" class="">8.0 Patch 11 HF01 Release Notes</a>: database grants for P07 and later</li>
<li class=""><a href="https://community.rsa.com/s/article/RSA-Governance-Lifecycle-Administrators-Guide-8-0" target="_blank" rel="noopener noreferrer" class="">Administrator's Guide 8.0</a>: Ch. 2, Managing Server Cluster Nodes</li>
</ul>
<p><strong>Kubernetes</strong></p>
<ul>
<li class=""><a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/" target="_blank" rel="noopener noreferrer" class="">Persistent Volumes</a> and <a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/#reserving-a-persistentvolume" target="_blank" rel="noopener noreferrer" class="">Reserving a PersistentVolume</a></li>
<li class=""><a href="https://kubernetes.io/docs/concepts/storage/volumes/#hostpath" target="_blank" rel="noopener noreferrer" class="">hostPath volumes</a></li>
<li class=""><a href="https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/" target="_blank" rel="noopener noreferrer" class="">Pull an image from a private registry</a></li>
<li class=""><a href="https://kubernetes.io/docs/concepts/services-networking/service/#headless-services" target="_blank" rel="noopener noreferrer" class="">Headless Services</a> and <a href="https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/" target="_blank" rel="noopener noreferrer" class="">DNS for Services and Pods</a></li>
<li class=""><a href="https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/" target="_blank" rel="noopener noreferrer" class="">Assigning Pods to Nodes</a></li>
<li class=""><a href="https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/" target="_blank" rel="noopener noreferrer" class="">Resource management for Pods and containers</a></li>
<li class=""><a href="https://kubernetes.io/docs/concepts/services-networking/service/" target="_blank" rel="noopener noreferrer" class="">Service</a></li>
<li class=""><a href="https://kubernetes.io/docs/tasks/debug/debug-application/debug-pods/" target="_blank" rel="noopener noreferrer" class="">Debug Pods</a></li>
<li class=""><a href="https://kubernetes.io/blog/2022/02/17/dockershim-faq/" target="_blank" rel="noopener noreferrer" class="">Dockershim removal FAQ</a></li>
</ul>
<p><strong>Registry and load balancing</strong></p>
<ul>
<li class=""><a href="https://github.com/containers/skopeo/blob/main/docs/skopeo-copy.1.md" target="_blank" rel="noopener noreferrer" class="">skopeo copy</a></li>
<li class=""><a href="https://distribution.github.io/distribution/spec/api/" target="_blank" rel="noopener noreferrer" class="">Registry HTTP API V2</a></li>
<li class=""><a href="https://metallb.universe.tf/usage/" target="_blank" rel="noopener noreferrer" class="">MetalLB usage</a></li>
</ul>]]></content>
        <author>
            <name>Pradeep Kadambar</name>
            <uri>https://www.linkedin.com/in/pradeepkg/</uri>
        </author>
        <category label="Deployment" term="Deployment"/>
        <category label="Kubernetes" term="Kubernetes"/>
    </entry>
</feed>