This commit is contained in:
alessandro
2026-07-17 09:42:52 +02:00
commit 20d506407a
93 changed files with 14526 additions and 0 deletions

126
GatewayAPI.txt Normal file
View File

@@ -0,0 +1,126 @@
# Install Gateway API CRDs
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.1/standard-install.yaml
kubectl get crd | grep gateway
kubectl create namespace nginx-gateway
kubectl apply --server-side -f https://raw.githubusercontent.com/nginx/nginx-gateway-fabric/v2.4.1/deploy/crds.yaml
kubectl apply -f https://raw.githubusercontent.com/nginx/nginx-gateway-fabric/v2.4.1/deploy/nodeport/deploy.yaml
---- Gatway configuration ----
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: main-gateway
namespace: nginx-gateway
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
gatewayClassName: nginx
listeners:
- allowedRoutes:
namespaces:
from: All
hostname: poc1.italiadatacenter.com
name: https
port: 443
protocol: HTTPS
tls:
certificateRefs:
- group: ""
kind: Secret
name: poc1-secret
mode: Terminate
- allowedRoutes:
namespaces:
from: All
hostname: poc1.italiadatacenter.com
name: http
port: 80
protocol: HTTP
----- Nodeport service ---
kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/instance: nginx-gateway
app.kubernetes.io/managed-by: nginx-gateway-nginx
app.kubernetes.io/name: main-gateway-nginx
gateway.networking.k8s.io/gateway-name: main-gateway
name: gateway-nginx-nodeport
namespace: nginx-gateway
spec:
ports:
- name: port-80
nodePort: 30864
port: 80
protocol: TCP
targetPort: 80
- name: port-443
nodePort: 30874
port: 443
protocol: TCP
targetPort: 443
selector:
app.kubernetes.io/instance: nginx-gateway
app.kubernetes.io/managed-by: nginx-gateway-nginx
app.kubernetes.io/name: main-gateway-nginx
gateway.networking.k8s.io/gateway-name: main-gateway
sessionAffinity: None
type: NodePort
EOF
----- httproute ---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: demo-route
namespace: demo-apps
spec:
hostnames:
- poc2.italiadatacenter.com
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: app-v1
port: 80
--- work area
kubectl edit gateway main-gateway -n nginx-gateway
add
- allowedRoutes:
namespaces:
from: cattle-system
hostname: k8s.italiadatacenter.com
name: k8s-https
port: 443
protocol: HTTPS
tls:
certificateRefs:
- group: ""
kind: Secret
name: k8s-secret
mode: Terminate
- allowedRoutes:
namespaces:
from: cattle-system
hostname: k8s.italiadatacenter.com
name: k8s-http
port: 80
protocol: HTTP

BIN
Object mapping.xlsx Normal file

Binary file not shown.

BIN
Platform STS.docx Normal file

Binary file not shown.

2566
README.md Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

BIN
ServiceModel.xlsx Normal file

Binary file not shown.

69
add-listener.js Normal file
View File

@@ -0,0 +1,69 @@
#!/usr/bin/env node
/**
* Aggiunge un listener HTTPS alla sezione `listeners` del gateway.yaml.
*
* Uso:
* node add-listener.js <hostname> <name> <secret-name> [gateway-file]
*
* Esempio:
* node add-listener.js sonarqube.italiadatacenter.com https-sonarqube sonarqube-secret
* node add-listener.js grafana.italiadatacenter.com https-grafana grafana-secret gateway.yaml
*/
const fs = require('fs');
const path = require('path');
const [,, hostname, name, secretName, gatewayFile = 'gateway.yaml'] = process.argv;
if (!hostname || !name || !secretName) {
console.error('Uso: node add-listener.js <hostname> <name> <secret-name> [gateway-file]');
console.error('Es.: node add-listener.js sonarqube.italiadatacenter.com https-sonarqube sonarqube-secret');
process.exit(1);
}
const filepath = path.resolve(__dirname, gatewayFile);
if (!fs.existsSync(filepath)) {
console.error(`File non trovato: ${filepath}`);
process.exit(1);
}
const content = fs.readFileSync(filepath, 'utf8');
// Controlla se il listener esiste già (per nome o hostname)
if (content.includes(`name: ${name}`) || content.includes(`hostname: ${hostname}`)) {
console.warn(`Attenzione: un listener con name "${name}" o hostname "${hostname}" esiste già. Nessuna modifica applicata.`);
process.exit(0);
}
const newBlock = ` - allowedRoutes:
namespaces:
from: All
hostname: ${hostname}
name: ${name}
port: 443
protocol: HTTPS
tls:
certificateRefs:
- group: ""
kind: Secret
name: ${secretName}
mode: Terminate`;
// Inserisce il nuovo block prima della riga "kind: List" o in fondo alla lista listeners
// Trova l'ultima occorrenza di "mode: Terminate" e appende subito dopo
const lastTerminateIdx = content.lastIndexOf(' mode: Terminate');
if (lastTerminateIdx === -1) {
console.error('Impossibile trovare il punto di inserimento (mode: Terminate). File non modificato.');
process.exit(1);
}
const insertAfter = lastTerminateIdx + ' mode: Terminate'.length;
const updated = content.slice(0, insertAfter) + '\n' + newBlock + content.slice(insertAfter);
fs.writeFileSync(filepath, updated, 'utf8');
console.log(`Listener aggiunto:`);
console.log(` hostname : ${hostname}`);
console.log(` name : ${name}`);
console.log(` secret : ${secretName}`);
console.log(`File aggiornato: ${filepath}`);

81
add-listener.sh Normal file
View File

@@ -0,0 +1,81 @@
#!/bin/bash
# Aggiunge un listener HTTPS direttamente sulla risorsa K8s Gateway
# main-gateway nel namespace nginx-gateway, tramite kubectl patch.
#
# Uso:
# ./add-listener.sh <hostname> <name> <secret-name>
#
# Esempio:
# ./add-listener.sh sonarqube.italiadatacenter.com https-sonarqube sonarqube-secret
set -euo pipefail
GATEWAY_NAME="main-gateway"
GATEWAY_NS="nginx-gateway"
HOSTNAME_VAL="${1:-}"
NAME_VAL="${2:-}"
SECRET_NAME="${3:-}"
if [[ -z "$HOSTNAME_VAL" || -z "$NAME_VAL" || -z "$SECRET_NAME" ]]; then
echo "Uso: $0 <hostname> <name> <secret-name>"
echo "Es.: $0 sonarqube.italiadatacenter.com https-sonarqube sonarqube-secret"
exit 1
fi
# Controlla idempotenza: verifica se il listener esiste già per nome o hostname
EXISTING=$(kubectl get gateway "$GATEWAY_NAME" -n "$GATEWAY_NS" \
-o jsonpath='{.spec.listeners[*].name}')
if echo "$EXISTING" | grep -qw "$NAME_VAL"; then
echo "Attenzione: listener con name '${NAME_VAL}' già presente. Nessuna modifica."
exit 0
fi
EXISTING_HOSTS=$(kubectl get gateway "$GATEWAY_NAME" -n "$GATEWAY_NS" \
-o jsonpath='{.spec.listeners[*].hostname}')
if echo "$EXISTING_HOSTS" | grep -qw "$HOSTNAME_VAL"; then
echo "Attenzione: listener con hostname '${HOSTNAME_VAL}' già presente. Nessuna modifica."
exit 0
fi
# JSON Patch: aggiunge il nuovo listener in append alla lista
PATCH=$(cat <<EOF
[{
"op": "add",
"path": "/spec/listeners/-",
"value": {
"allowedRoutes": {
"namespaces": {
"from": "All"
}
},
"hostname": "${HOSTNAME_VAL}",
"name": "${NAME_VAL}",
"port": 443,
"protocol": "HTTPS",
"tls": {
"certificateRefs": [
{
"group": "",
"kind": "Secret",
"name": "${SECRET_NAME}"
}
],
"mode": "Terminate"
}
}
}]
EOF
)
kubectl patch gateway "$GATEWAY_NAME" \
-n "$GATEWAY_NS" \
--type=json \
-p "$PATCH"
echo "Listener aggiunto alla risorsa ${GATEWAY_NS}/${GATEWAY_NAME}:"
echo " hostname : ${HOSTNAME_VAL}"
echo " name : ${NAME_VAL}"
echo " secret : ${SECRET_NAME}"

118
add-on/CephCsi.txt Normal file
View File

@@ -0,0 +1,118 @@
kubectl create namespace ceph-csi
git clone https://github.com/ceph/ceph-csi.git
cd ceph-csi
git checkout v3.15.0
# move to rbd chart.
cd charts/ceph-csi-rbd
cat <<EOF > ceph-csi-rbd-values.yaml
csiConfig:
- clusterID: "004ee854-86cc-4ddc-b7d6-75e4fe962296"
monitors:
- "172.20.1.33:6789"
- "172.20.1.34:6789"
- "172.20.1.35:6789"
provisioner:
name: provisioner
replicaCount: 2
EOF
helm install --namespace ceph-csi ceph-csi --values ceph-csi-rbd-values.yaml ./
Examples on how to configure a storage class and start using the driver are here:
https://github.com/ceph/ceph-csi/tree/devel/examples/rbd
echo "kubernetes" | tr -d '\n' | base64
a3ViZXJuZXRlcw==
cat > ceph-admin-secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: default
stringData:
userID: kubernetes
userKey: AQD2zo5pm8aZIRAAPzWS+dROeX7iJtv5EukfKA==
EOF
# create a secret for admin user.
kubectl apply -f ceph-admin-secret.yaml
----- Create StorageClass ------
cat > ceph-rbd-sc.yaml <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd-sc
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: rbd.csi.ceph.com
parameters:
clusterID: 004ee854-86cc-4ddc-b7d6-75e4fe962296
pool: k8s-rbd
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
EOF
# create a storage class
kubectl apply -f ceph-rbd-sc.yaml;
--- test
cat <<EOF > create-ceph-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: raw-block-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
EOF
# create pvc
kubectl apply -f create-ceph-pvc.yaml
cat <<EOF > create-pod-with-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: ceph-pod-pvc
spec:
containers:
- name: ceph-pod-pvc
image: busybox
command: ["sleep", "infinity"]
volumeMounts:
- mountPath: /mnt/ceph_rbd
name: volume
volumes:
- name: volume
persistentVolumeClaim:
claimName: raw-block-pvc
EOF
# create pod
kubectl apply -f create-pod-with-pvc.yaml

122
add-on/CephCsi_install.txt Normal file
View File

@@ -0,0 +1,122 @@
cat <<EOF > csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
[
{
"clusterID": "004ee854-86cc-4ddc-b7d6-75e4fe962296",
"monitors": [
"72.20.1.33:6789",
"72.20.1.34:6789",
"72.20.1.35:6789"
]
}
]
metadata:
name: ceph-csi-config
EOF
kubectl apply -f csi-config-map.yaml
cat <<EOF > csi-kms-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
{}
metadata:
name: ceph-csi-encryption-kms-config
EOF
kubectl apply -f csi-kms-config-map.yaml
cat <<EOF > ceph-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
ceph.conf: |
[global]
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
# keyring is a required key and its value should be empty
keyring: |
metadata:
name: ceph-config
EOF
kubectl apply -f ceph-config-map.yaml
cat <<EOF > csi-rbd-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: default
stringData:
userID: kubernetes
userKey: AQD2zo5pm8aZIRAAPzWS+dROeX7iJtv5EukfKA==
EOF
kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml
wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
kubectl apply -f csi-rbdplugin-provisioner.yaml
wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml
kubectl apply -f csi-rbdplugin.yaml
------- TEST-----
cat <<EOF > csi-rbd-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: 004ee854-86cc-4ddc-b7d6-75e4fe962296
pool: k8s-rbd
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
EOF
kubectl apply -f csi-rbd-sc.yaml
cat <<EOF > raw-block-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: raw-block-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
EOF
kubectl apply -f raw-block-pvc.yaml

View File

@@ -0,0 +1,276 @@
Cloudside:
wget https://github.com/kubeedge/kubeedge/releases/download/v1.17.0/keadm-v1.17.0-linux-amd64.tar.gz
tar -zxvf keadm-v1.17.0-linux-amd64.tar.gz
cp keadm-v1.17.0-linux-amd64/keadm/keadm /usr/local/bin/keadm
keadm init --advertise-address="89.105.78.161" --kubeedge-version=v1.22.0 --kube-config=/root/.kube/config
keadm manifest generate --advertise-address="89.105.78.161" --kube-config=/root/.kube/config > kubeedge-cloudcore.yaml
patch:
cloudcore.yaml: |
apiVersion: cloudcore.config.kubeedge.io/v1alpha2
commonConfig:
monitorServer:
bindAddress: 127.0.0.1:9091
tunnelPort: 10354
featureGates:
requireAuthorization: false
kind: CloudCore
kubectl apply -f kubeedge-cloudcore.yaml -n kubeedge
kubectl apply -f edgenodeport.yaml -n kubeedge
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Edge Side:
export KUBEEDGE_VERSION=v1.22.0
export CLOUD_MASTER_IP=34.132.113.155
export EDGE_NODE_NAME=edge-node-02
Step 1 : Download & unpack containerd package
Containerd versions can be found in this location : https://github.com/containerd/containerd/releases
Download :
wget https://github.com/containerd/containerd/releases/download/v1.6.14/containerd-1.6.14-linux-amd64.tar.gz
Unpack :
sudo tar Cxzvf /usr/local containerd-1.6.14-linux-amd64.tar.gz
Step 2 : Install runc
Runc is a standardized runtime for spawning and running containers on Linux according to the OCI specification
wget https://github.com/opencontainers/runc/releases/download/v1.1.3/runc.amd64
sudo install -m 755 runc.amd64 /usr/local/sbin/runc
Step 3: Download and install CNI plugins :
wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
sudo mkdir -p /opt/cni/bin
sudo tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz
Step 4: Configure containerd
Create a containerd directory for the configuration file
config.toml is the default configuration file for containerd
Enable systemd group . Use sed command to change the parameter in config.toml instead of using vi editor
Convert containerd into service
sudo mkdir /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sudo curl -L https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -o /etc/systemd/system/containerd.service
Step 4.1
remove SystemdCgroup = true line from /etc/containerd/config.toml.
Step 4.2
mkdir -p /etc/cni/net.d/
$ cat >/etc/cni/net.d/10-containerd-net.conflist <<EOF
{
"cniVersion": "1.0.0",
"name": "containerd-net",
"plugins": [
{
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"promiscMode": true,
"ipam": {
"type": "host-local",
"ranges": [
[{
"subnet": "10.88.0.0/16"
}],
[{
"subnet": "2001:db8:4860::/64"
}]
],
"routes": [
{ "dst": "0.0.0.0/0" },
{ "dst": "::/0" }
]
}
},
{
"type": "portmap",
"capabilities": {"portMappings": true}
}
]
}
EOF
Step 5: Start containerd service
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
sudo systemctl status containerd
step 6: install crictl
VERSION="v1.35.0" # check latest version in /releases page
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
rm -f crictl-$VERSION-linux-amd64.tar.gz
edge-cleanup.sh:
#!/bin/bash
set -euo pipefail
echo "==== EDGE NODE CLEANUP START ===="
DATE=$(date)
echo "Timestamp: $DATE"
# -------------------------------
# 1. Kill processi orfani (safe)
# -------------------------------
echo "[1] Checking orphan processes..."
ORPHANS=$(ps -eo pid,ppid,cmd | awk '$2 == 1 {print $1}')
for PID in $ORPHANS; do
if [ "$PID" != "1" ]; then
echo "Killing orphan PID: $PID"
kill -9 "$PID" 2>/dev/null || true
fi
done
# -------------------------------
# 2. Cleanup containerd (safe)
# -------------------------------
echo "[2] Cleaning containerd..."
if command -v crictl &> /dev/null; then
echo "Using crictl..."
# rimuove solo container stopped
crictl ps -a --state Exited -q | xargs -r crictl rm || true
# rimuove pod sandbox non più validi
crictl pods --state NotReady -q | xargs -r crictl rmp || true
# pulizia immagini dangling (SAFE)
crictl rmi --prune || true
else
echo "crictl not found, skipping..."
fi
# -------------------------------
# 3. Restart containerd
# -------------------------------
echo "[3] Restarting containerd..."
systemctl restart containerd
# -------------------------------
# 4. Cleanup kubelet (soft)
# -------------------------------
echo "[4] Cleaning kubelet state (soft)..."
# Rimuove solo pod non più esistenti
find /var/lib/kubelet/pods -mindepth 1 -maxdepth 1 -type d -mtime +1 -exec rm -rf {} + || true
# -------------------------------
# 5. Restart kube services
# -------------------------------
echo "[5] Restarting kubelet + edgecore..."
systemctl restart kubelet || true
systemctl restart edgecore || true
# -------------------------------
# 6. Verifica connessione CloudCore
# -------------------------------
echo "[6] Checking connectivity to CloudCore..."
CLOUD_IP="89.105.78.161"
PORT="10002"
if timeout 5 bash -c "</dev/tcp/$CLOUD_IP/$PORT"; then
echo "Cloud reachable"
else
echo "WARNING: Cloud NOT reachable"
fi
# -------------------------------
# 7. Verifica porte MQTT locali
# -------------------------------
echo "[7] Checking MQTT port..."
ss -tulnp | grep 1883 || echo "WARNING: Mosquitto not listening"
echo "==== EDGE NODE CLEANUP DONE ===="
/etc/systemd/system/edge-cleanup.service:
[Unit]
Description=Edge Node Cleanup
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/edge-cleanup.sh
RemainAfterExit=true
[Install]
WantedBy=multi-user.target
chmod +x /usr/local/bin/edge-cleanup.sh
systemctl daemon-reload
systemctl enable edge-cleanup
export KUBEEDGE_VERSION=v1.22.0
export CLOUD_MASTER_IP=194.110.57.153
export EDGE_NODE_NAME=edge-node-02
curl -L https://github.com/kubeedge/kubeedge/releases/download/${KUBEEDGE_VERSION}/keadm-${KUBEEDGE_VERSION}-linux-amd64.tar.gz | tar -xz
sudo mv keadm-${KUBEEDGE_VERSION}-linux-amd64/keadm/keadm /usr/local/bin/
sudo keadm join \
--cloudcore-ipport=${CLOUD_MASTER_IP}:10000 \
--edgenode-name=${EDGE_NODE_NAME} \
--token=f871f93cffd630c906bf381dae4496544a111075071abfec060e2db4ab417b6e.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzUyOTM2NjJ9.xvMdgApjtPDpPm-GShmR6ghjBgvFTJsJf6JTJLeSK08 \
--kubeedge-version=${KUBEEDGE_VERSION}
kubectl taint nodes edge-node-02 edgenode=true:NoExecute
test sensor:
sudo apt-get install mosquitto-clients
sensor.sh
#!/bin/bash
BROKER="localhost"
TOPIC="sensors/home/livingroom"
while true; do
TEMP=$(awk -v min=20 -v max=30 'BEGIN{srand(); print min+rand()*(max-min)}')
HUM=$(awk -v min=40 -v max=80 'BEGIN{srand(); print min+rand()*(max-min)}')
PAYLOAD=$(printf '{"temperature": %.2f, "humidity": %.2f}' $TEMP $HUM)
echo "Sending: $PAYLOAD"
mosquitto_pub -h $BROKER -t $TOPIC -m "$PAYLOAD"
sleep 5
done
verifica :
mosquitto_sub -h localhost -t sensors/home/livingroom

189
add-on/NodeRed.yaml Normal file
View File

@@ -0,0 +1,189 @@
apiVersion: v1
kind: Namespace
metadata:
name: nodered
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: node-red-pvc
namespace: nodered
labels:
app: node-red
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-red
namespace: nodered
labels:
app: node-red
spec:
replicas: 1
selector:
matchLabels:
app: node-red
template:
metadata:
labels:
app: node-red
spec:
securityContext:
fsGroup: 1000
containers:
- name: nodered
image: nodered/node-red:4.1
args: ["--settings", "/config/settings.js"]
env:
- name: NODE_OPTIONS
value: "--trace-warnings"
ports:
- containerPort: 1880
securityContext:
runAsUser: 1000
runAsGroup: 1000
allowPrivilegeEscalation: false
resources:
limits:
memory: "512Mi"
cpu: "500m"
requests:
memory: "256Mi"
cpu: "250m"
livenessProbe:
httpGet:
path: /
port: 1880
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 1880
initialDelaySeconds: 5
periodSeconds: 5
volumeMounts:
- name: node-red-storage
mountPath: /data
- name: node-red-settings
mountPath: /config/settings.js
subPath: settings.js
volumes:
- name: node-red-storage
persistentVolumeClaim:
claimName: node-red-pvc
- name: node-red-settings
configMap:
name: node-red-settings
---
apiVersion: v1
kind: ConfigMap
metadata:
name: node-red-settings
namespace: nodered
data:
settings.js: |
module.exports = {
httpAdminRoot: '/',
httpNodeRoot: '/',
userDir: '/data',
flowFile: 'flows.json',
credentialSecret: 'yzM0ol6Zn5kd1234',
adminAuth: {
type: "credentials",
users: [{
username: "admin",
password: "",
permissions: "*"
}]
},
uiPort: process.env.PORT || 1880,
mqttReconnectTime: 15000,
serialReconnectTime: 15000,
debugMaxLength: 1000,
functionGlobalContext: {},
exportGlobalContextKeys: false,
logging: {
console: {
level: "info",
metrics: false,
audit: false
}
},
editorTheme: {
projects: {
enabled: false
}
}
};
---
apiVersion: v1
kind: Service
metadata:
name: node-red-service
namespace: nodered
labels:
app: node-red
spec:
type: ClusterIP
ports:
- port: 1880
targetPort: 1880
protocol: TCP
name: http
selector:
app: node-red
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: node-red-hpa
namespace: nodered
labels:
app: node-red
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: node-red
minReplicas: 1
maxReplicas: 3
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: node-red
namespace: nodered
spec:
hostnames:
- nodered.italiadatacenter.com
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: node-red-service
port: 1880

View File

@@ -0,0 +1,11 @@
kubectl get pods -n nodered
kubectl exec -it node-red-bd88bc7df-knqfw -n nodered -- node-red admin hash-pw
kubectl edit configmap node-red-settings -n nodered --->(set campo password password: "<bcrypt-hash-here>", nella sezione adminAuth)
kubectl delete pods node-red-bd88bc7df-knqfw -n nodered
user: admin
password:KAYQE1QA7uwUZ8uI

59
add-on/RabbitMQ.txt Normal file
View File

@@ -0,0 +1,59 @@
Install Operator
kubectl apply -f "https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml"
# namespace/rabbitmq-system created
# customresourcedefinition.apiextensions.k8s.io/rabbitmqclusters.rabbitmq.com created
# serviceaccount/rabbitmq-cluster-operator created
# role.rbac.authorization.k8s.io/rabbitmq-cluster-leader-election-role created
# clusterrole.rbac.authorization.k8s.io/rabbitmq-cluster-operator-role created
# rolebinding.rbac.authorization.k8s.io/rabbitmq-cluster-leader-election-rolebinding created
# clusterrolebinding.rbac.authorization.k8s.io/rabbitmq-cluster-operator-rolebinding created
# deployment.apps/rabbitmq-cluster-operator created
Define an instance
Mqinstance.yaml:
apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
name: production-ready
spec:
replicas: 1
resources:
requests:
cpu: 1
memory: 1Gi
limits:
cpu: 1
memory: 1Gi
rabbitmq:
additionalConfig: |
cluster_partition_handling = pause_minority
disk_free_limit.relative = 1.0
collect_statistics_interval = 10000
persistence:
storageClassName: csi-rbdfs-sc
storage: "5Gi"
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- production-ready
topologyKey: kubernetes.io/hostname
override:
statefulSet:
spec:
template:
spec:
containers: []
topologySpreadConstraints:
- maxSkew: 1
topologyKey: "topology.kubernetes.io/zone"
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app.kubernetes.io/name: production-ready

View File

@@ -0,0 +1,44 @@
Download act_runner binary
mv act_runner-0.3.0-linux-amd64 act_runner
chmod +x ./act_runner
./act_runner --version
./act_runner register
Git server: https.//git.italiadatacener.com
token: SiP2B1Wth0FwORkLrIX7WYhho78IVaW3ZppO9vrx
label: runner1:host
start:
nohup ./act_runner daemon &
Install node
sudo apt update
sudo apt upgrade -y
sudo apt install -y curl ca-certificates gnupg
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
verifica
node -v
npm -v
Installa docker:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

21
add-on/backup.txt Normal file
View File

@@ -0,0 +1,21 @@
# Snapshot schedule
etcd-snapshot-schedule-cron: "0 */6 * * *"
etcd-snapshot-retention: 10
# Abilita S3 (MinIO)
etcd-s3: true
etcd-s3-endpoint: 127.0.0.1:3877
etcd-s3-access-key: minioadmin
etcd-s3-secret-key: KAYQE1QA7uwUZ8uI
etcd-s3-bucket: etcd-backups
etcd-s3-folder: idc-k8s
# Se MinIO senza TLS
etcd-s3-skip-ssl-verify: true
nohup kubectl port-forward svc/minio -n minio 9000 &
mc alias set local http://127.0.0.1:9000 minioadmin KAYQE1QA7uwUZ8uI
mc mb local/etcd-backups

344
add-on/cicd.txt Normal file
View File

@@ -0,0 +1,344 @@
data una struttura directory del progetto-A come da specifica che segue, creare i seguenti script in bash:
premessa: i file values.env contengono elenco coppie chiave/valore del tipo chiave1=valore1, ecc..
1) customize.sh: script che ha in input l'ambiente (dev,qa o prod) ed esegue la sostituzione nel file infrasructure.yaml della directory kubernetes dei tag del tipo <chiave1> con il relativo valore letto dal file values.env della directory corrispondente all'input fornito
1) build_container.sh : script che effettua la docker build di tutti i container presenti nella directory containers usando il nome della directory sotto containers come nome del container,nome della root directory come nome del repository e sha del commit come tag. lo script deve eseguire anche la push su un registry con precedente login con credenziali lette dal file properties.env
2) deploy.sh: script che effettua il deploy in kubernetes del file infrastructure.yaml contenuto nella directory kubernetes
struttura directory di progetto:
<dir> progetto-A
properties.env
build_src.sh
<dir> .gitea/
<dir> workflows
pipeline.yaml
<dir> containers
<dir> frontend
dockerfile
<dir> backend
dockerfile
<dir> env
<dir> dev
values.env
<dir> qa
values.env
<dir> prod
values.env
<dir> kubernetes
infrastructure.yaml
<dir> src
Provisioning:
env:
$organization= nome della società
$project=nome del progetto
1) Gitea: creazione Organization--> $organization(if not alreay exist)
2) Gitea: creazione progetto nome--> $project
3) Harbor: creazione project $project
4) X3 k8s creazione NAMSPACE,SA, ROLE, ROLEBINDING,KUBECONFIG per deploy su namespace (kube-provisioning.sh) per dev qa e prod
5) X3 Gitea: creazione secret KUBECONFIG_DEV, KUBECONFIG_QA e KUBECONFIG_PROD con kubeconfig generato da kube-provisioning.sh
6) harbor: creazione robot-user "git" con permessi full su repo del progetto ---> $registry_user, $registry_pass
7) harbor: creazione robot-user "k8spull" con permessi full su repo del progetto ---> $registry_user, $registry_pass
8) creazione secret e patch SA default
kubectl -n <$project> create secret docker-registry harbor-pull \
--docker-server=harbor.italiadatacenter.com \
--docker-username=robot\$<$project>+k8spull \
--docker-password=<robot usertoken> \
--docker-email=harbor@italiadatacenter.com
kubectl patch serviceaccount default -n athleteos-dev -p '{"imagePullSecrets":[{"name":"harbor-pull"}]}'
kubectl patch serviceaccount default -n <$project-qa> -p '{"imagePullSecrets":[{"name":"harbor-pull"}]}'
kubectl patch serviceaccount default -n <$project-prod> -p '{"imagePullSecrets":[{"name":"harbor-pull"}]}'
9) Gitea: creazione secret REGISTRY_USER -->$registry_user, REGISTRY_PASS -->$registry_pass
10)Gitea: poplazione repo con skeleton template
gitea-api-token
65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88
https://git.italiadatacenter.com/api/swagger
List Template
curl -X 'GET' \
'https://git.italiadatacenter.com/api/v1/repos/search?q=tmpl&topic=false&includeDesc=true&token=65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88' \
-H 'accept: application/json'
List repository:
curl -X 'GET' \
'https://git.italiadatacenter.com/api/v1/repos/search?token=65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88' \
-H 'accept: application/json'
Create repo from template:
curl -X 'POST' \
'https://git.italiadatacenter.com/api/v1/repos/STS_Lab/tmpl_nginx_node/generate?token=65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"avatar": true,
"default_branch": "string",
"description": "string",
"git_content": true,
"git_hooks": true,
"labels": true,
"name": "secondo",
"owner": "STS_Lab",
"private": true,
"protected_branch": true,
"topics": true,
"webhooks": true
}'
creazione din una applicazione backstage che permetta la creazione di un repo da template con questa api:
curl -X 'POST' \
'https://git.italiadatacenter.com/api/v1/repos/STS_Lab/tmpl_nginx_node/generate?token=65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"avatar": true,
"default_branch": "string",
"description": "string",
"git_content": true,
"git_hooks": true,
"labels": true,
"name": "secondo",
"owner": "STS_Lab",
"private": true,
"protected_branch": true,
"topics": true,
"webhooks": true
}'
la lista dei template disponbili è fornita dall'api:
curl -X 'GET' \
'https://git.italiadatacenter.com/api/v1/repos/search?q=tmpl&topic=false&includeDesc=true&token=65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88' \
-H 'accept: application/json'
l'utente deve poter creare un nuovo repo fornendo nome e template scelto dalla lista
---------------------------------
Harbor api:
https://harbor.italiadatacenter.com/devcenter-api-2.0
admin/KAYQE1QA7uwUZ8uI
Create project
curl -X 'POST' \
-u admin:KAYQE1QA7uwUZ8uI \
'https://harbor.italiadatacenter.com/api/v2.0/projects' \
-H 'accept: application/json' \
-H 'X-Resource-Name-In-Location: false' \
-H 'Content-Type: application/json' \
-d '{
"project_name": "secondo",
"public": false,
"metadata": {
"public": "false",
"enable_content_trust": "string",
"enable_content_trust_cosign": "string",
"prevent_vul": "string",
"severity": "string",
"auto_scan": "string",
"auto_sbom_generation": "string",
"reuse_sys_cve_allowlist": "string",
"proxy_speed_kb": "string",
"max_upstream_conn": "string"
},
"cve_allowlist": {
"id": 0,
"project_id": 0,
"expires_at": 0,
"items": [
{
"cve_id": "string"
}
],
"creation_time": "2026-03-21T17:12:18.108Z",
"update_time": "2026-03-21T17:12:18.108Z"
},
"storage_limit": 0
}'
creazionnr robot user
curl -X 'POST' \
-u admin:KAYQE1QA7uwUZ8uI \
'https://harbor.italiadatacenter.com/api/v2.0/robots' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"name": "secondobot",
"description": "scondo bot",
"secret": "string",
"level": "system",
"disable": true,
"duration": -1,
"permissions": [
{
"kind": "project",
"namespace": "secondo",
"access": [
{
"action": "delete",
"resource": "repository"
},
{
"action": "list",
"resource": "repository"
},
{
"action": "push",
"resource": "repository"
},
{
"action": "read",
"resource": "repository"
},
{
"action": "update",
"resource": "repository"
},
{
"action": "pull",
"resource": "repository"
}
]
}
]
}'
{
"creation_time": "2026-03-21T18:24:57.665Z",
"expires_at": -1,
"id": 44,
"name": "robot$secondobot",
"secret": "YxlIfu6o73zsQnKkgaWMdSc6MEwftVzk"
}
####### template modulari#########################################################
# 🧠 🎯 Cosè `git subtree` (in pratica)
👉 `subtree` ti permette di:
```text
includere un altro repository dentro una sottocartella
MANTENENDO la possibilità di aggiornarlo
```
👉 differenza chiave:
* il codice viene **copiato nel repo**
* ma mantiene un **legame logico con lorigine**
---
# 🔥 Perché è perfetto per template modulari
Scenario IDP:
```text
template-node
template-k8s
template-ci
```
👉 li vuoi combinare in:
```text
my-service/
app/
k8s/
ci/
```
👉 `subtree` fa ESATTAMENTE questo, in modo pulito
---
# 🏗️ Setup iniziale (step-by-step)
## 1⃣ Aggiungi il repo template
```bash
git remote add template-node https://gitea/template-node.git
git fetch template-node
```
---
## 2⃣ Importa il template
```bash
git subtree add \
--prefix=app \
template-node main \
--squash
```
---
### 🔍 Cosa succede
* copia contenuto in `app/`
* crea 1 commit (grazie a `--squash`)
* mantiene riferimento al repo remoto
---
# 🔄 Aggiornare il template
👉 quando il template evolve:
```bash
git subtree pull \
--prefix=app \
template-node main \
--squash
```
---
👉 risultato:
* aggiorna solo quella cartella
* merge automatico
---
# 🚀 Multi-template (use case IDP)
```bash
git subtree add --prefix=app template-node main --squash
git subtree add --prefix=k8s template-k8s main --squash
git subtree add --prefix=ci template-ci main --squash
```
---
👉 ottieni:
```text
repo finale:
app/
k8s/
ci/
```

17
add-on/clusterussuer.yaml Normal file
View File

@@ -0,0 +1,17 @@
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: alessandro.barucci66@gmail.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-production-key
solvers:
- http01:
gatewayHTTPRoute:
parentRefs:
- name: gateway
namespace: default
kind: Gateway

BIN
add-on/confmap.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

118
add-on/create_ns.sh Normal file
View File

@@ -0,0 +1,118 @@
#!/usr/bin/env bash
###########################################################
#./kube-provisioning.sh dev cicd-user kubeconfig-dev.yaml
#arg1 = namespace
#arg2 = env (dev|qa|prod)
###########################################################
set -euo pipefail
############################################
# CONFIG
############################################
NAMESPACE=${1:-dev}-$2
SERVICE_ACCOUNT="deployer"
KUBECONFIG_FILE=${NAMESPACE}.yaml
echo "Namespace: $NAMESPACE"
echo "ServiceAccount: $SERVICE_ACCOUNT"
echo "Output kubeconfig: $KUBECONFIG_FILE"
############################################
# CHECK REQUIREMENTS
############################################
if ! command -v kubectl >/dev/null 2>&1; then
echo "kubectl not found"
exit 1
fi
############################################
# CREATE NAMESPACE
############################################
kubectl get ns "$NAMESPACE" >/dev/null 2>&1 || kubectl create namespace "$NAMESPACE"
############################################
# CREATE SERVICE ACCOUNT
############################################
kubectl -n "$NAMESPACE" get sa "$SERVICE_ACCOUNT" >/dev/null 2>&1 || \
kubectl -n "$NAMESPACE" create serviceaccount "$SERVICE_ACCOUNT"
############################################
# CREATE ROLE
############################################
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: namespace-deployer
namespace: $NAMESPACE
rules:
- apiGroups: ["", "apps", "batch", "networking.k8s.io"]
resources: ["*"]
verbs: ["*"]
EOF
############################################
# CREATE ROLE BINDING
############################################
kubectl -n "$NAMESPACE" get rolebinding namespace-deployer-binding >/dev/null 2>&1 || \
kubectl create rolebinding namespace-deployer-binding \
--role=namespace-deployer \
--serviceaccount=${NAMESPACE}:${SERVICE_ACCOUNT} \
-n "$NAMESPACE"
############################################
# GENERATE TOKEN
############################################
TOKEN=$(kubectl create token "$SERVICE_ACCOUNT" -n "$NAMESPACE")
############################################
# CLUSTER INFO
############################################
CLUSTER_NAME=$(kubectl config view --minify -o jsonpath='{.clusters[0].name}')
CLUSTER_SERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
CLUSTER_CA=$(kubectl config view --raw --minify -o jsonpath='{.clusters[0].cluster.certificate-authority-data}')
############################################
# GENERATE KUBECONFIG
############################################
cat <<EOF > "$KUBECONFIG_FILE"
apiVersion: v1
kind: Config
clusters:
- cluster:
certificate-authority-data: ${CLUSTER_CA}
server: ${CLUSTER_SERVER}
name: ${CLUSTER_NAME}
contexts:
- context:
cluster: ${CLUSTER_NAME}
namespace: ${NAMESPACE}
user: ${SERVICE_ACCOUNT}
name: ${SERVICE_ACCOUNT}-${CLUSTER_NAME}
current-context: ${SERVICE_ACCOUNT}-${CLUSTER_NAME}
users:
- name: ${SERVICE_ACCOUNT}
user:
token: ${TOKEN}
EOF
echo
echo "Kubeconfig generated:"
echo "$KUBECONFIG_FILE"
echo
echo "Test command:"
echo "kubectl --kubeconfig=$KUBECONFIG_FILE get pods"

59
add-on/dbgate.yaml Normal file
View File

@@ -0,0 +1,59 @@
apiVersion: v1
kind: Namespace
metadata:
name: dbgate
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dbgate
namespace: dbgate
spec:
replicas: 1
selector:
matchLabels:
app: dbgate
template:
metadata:
labels:
app: dbgate
spec:
containers:
- name: dbgate
image: dbgate/dbgate:latest
ports:
- containerPort: 3000
env:
- name: CONNECTIONS
value: ""
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
---
apiVersion: v1
kind: Service
metadata:
name: dbgate
namespace: dbgate
spec:
selector:
app: dbgate
ports:
- port: 80
targetPort: 3000
type: ClusterIP

113
add-on/devops.txt Normal file
View File

@@ -0,0 +1,113 @@
kubectl create namespace devops
dbdevops.yaml:
---
apiVersion: v1
kind: Secret
metadata:
name: pg-app-user
namespace: demo-apps
type: kubernetes.io/basic-auth
stringData:
username: devops
password: KAYQE1QA7uwUZ8uI
---
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: pg-devops
namespace: devops
spec:
instances: 3
storage:
size: 1Gi
storageClass: csi-rbdfs-sc
walStorage:
storageClass: csi-rbdfs-sc
size: 1Gi
bootstrap:
initdb:
database: devops
owner: admin
secret:
name: pg-app-user
postgresql:
parameters:
max_connections: "300"
shared_buffers: "1GB"
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "2"
memory: "2Gi"
--- pgadmin -------------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: pgadmin-deployment
spec:
replicas: 1
selector:
matchLabels:
app: pgadmin
template:
metadata:
labels:
app: pgadmin
spec:
containers:
- name: pgadmin
image: dpage/pgadmin4
ports:
- containerPort: 80
env:
- name: PGADMIN_DEFAULT_EMAIL
value: pgadmin@italiadatacenter.com
- name: PGADMIN_DEFAULT_PASSWORD
value: KAYQE1QA7uwUZ8uI
- name: PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION
value: "false"
---
apiVersion: v1
kind: Service
metadata:
name: pgadmin-service
spec:
selector:
app: pgadmin
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: demo-route
namespace: demo-apps
spec:
hostnames:
- poc3.italiadatacenter.com
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: pgadmin-service
port: 80

30
add-on/edgenodeport.yaml Normal file
View File

@@ -0,0 +1,30 @@
apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: cloudcore
meta.helm.sh/release-namespace: kubeedge
labels:
k8s-app: kubeedge
kubeedge: cloudcore
name: kubeedge-nodeport
namespace: kubeedge
spec:
ports:
- appProtocol: tcp
name: cloudhub
nodePort: 30868
port: 10000
protocol: TCP
targetPort: 10000
- appProtocol: tcp2
name: cloudhub2
nodePort: 30869
port: 10002
protocol: TCP
targetPort: 10002
selector:
k8s-app: kubeedge
kubeedge: cloudcore
sessionAffinity: None
type: NodePort

347
add-on/get_helm.sh Normal file
View File

@@ -0,0 +1,347 @@
#!/usr/bin/env bash
# Copyright The Helm Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# The install script is based off of the MIT-licensed script from glide,
# the package manager for Go: https://github.com/Masterminds/glide.sh/blob/master/get
: ${BINARY_NAME:="helm"}
: ${USE_SUDO:="true"}
: ${DEBUG:="false"}
: ${VERIFY_CHECKSUM:="true"}
: ${VERIFY_SIGNATURES:="false"}
: ${HELM_INSTALL_DIR:="/usr/local/bin"}
: ${GPG_PUBRING:="pubring.kbx"}
HAS_CURL="$(type "curl" &> /dev/null && echo true || echo false)"
HAS_WGET="$(type "wget" &> /dev/null && echo true || echo false)"
HAS_OPENSSL="$(type "openssl" &> /dev/null && echo true || echo false)"
HAS_GPG="$(type "gpg" &> /dev/null && echo true || echo false)"
HAS_GIT="$(type "git" &> /dev/null && echo true || echo false)"
HAS_TAR="$(type "tar" &> /dev/null && echo true || echo false)"
# initArch discovers the architecture for this system.
initArch() {
ARCH=$(uname -m)
case $ARCH in
armv5*) ARCH="armv5";;
armv6*) ARCH="armv6";;
armv7*) ARCH="arm";;
aarch64) ARCH="arm64";;
x86) ARCH="386";;
x86_64) ARCH="amd64";;
i686) ARCH="386";;
i386) ARCH="386";;
esac
}
# initOS discovers the operating system for this system.
initOS() {
OS=$(echo `uname`|tr '[:upper:]' '[:lower:]')
case "$OS" in
# Minimalist GNU for Windows
mingw*|cygwin*) OS='windows';;
esac
}
# runs the given command as root (detects if we are root already)
runAsRoot() {
if [ $EUID -ne 0 -a "$USE_SUDO" = "true" ]; then
sudo "${@}"
else
"${@}"
fi
}
# verifySupported checks that the os/arch combination is supported for
# binary builds, as well whether or not necessary tools are present.
verifySupported() {
local supported="darwin-amd64\ndarwin-arm64\nlinux-386\nlinux-amd64\nlinux-arm\nlinux-arm64\nlinux-loong64\nlinux-ppc64le\nlinux-s390x\nlinux-riscv64\nwindows-amd64\nwindows-arm64"
if ! echo "${supported}" | grep -q "${OS}-${ARCH}"; then
echo "No prebuilt binary for ${OS}-${ARCH}."
echo "To build from source, go to https://github.com/helm/helm"
exit 1
fi
if [ "${HAS_CURL}" != "true" ] && [ "${HAS_WGET}" != "true" ]; then
echo "Either curl or wget is required"
exit 1
fi
if [ "${VERIFY_CHECKSUM}" == "true" ] && [ "${HAS_OPENSSL}" != "true" ]; then
echo "In order to verify checksum, openssl must first be installed."
echo "Please install openssl or set VERIFY_CHECKSUM=false in your environment."
exit 1
fi
if [ "${VERIFY_SIGNATURES}" == "true" ]; then
if [ "${HAS_GPG}" != "true" ]; then
echo "In order to verify signatures, gpg must first be installed."
echo "Please install gpg or set VERIFY_SIGNATURES=false in your environment."
exit 1
fi
if [ "${OS}" != "linux" ]; then
echo "Signature verification is currently only supported on Linux."
echo "Please set VERIFY_SIGNATURES=false or verify the signatures manually."
exit 1
fi
fi
if [ "${HAS_GIT}" != "true" ]; then
echo "[WARNING] Could not find git. It is required for plugin installation."
fi
if [ "${HAS_TAR}" != "true" ]; then
echo "[ERROR] Could not find tar. It is required to extract the helm binary archive."
exit 1
fi
}
# checkDesiredVersion checks if the desired version is available.
checkDesiredVersion() {
if [ "x$DESIRED_VERSION" == "x" ]; then
# Get tag from release URL
local latest_release_url="https://get.helm.sh/helm3-latest-version"
local latest_release_response=""
if [ "${HAS_CURL}" == "true" ]; then
latest_release_response=$( curl -L --silent --show-error --fail "$latest_release_url" 2>&1 || true )
elif [ "${HAS_WGET}" == "true" ]; then
latest_release_response=$( wget "$latest_release_url" -q -O - 2>&1 || true )
fi
TAG=$( echo "$latest_release_response" | grep '^v[0-9]' )
if [ "x$TAG" == "x" ]; then
printf "Could not retrieve the latest release tag information from %s: %s\n" "${latest_release_url}" "${latest_release_response}"
exit 1
fi
else
TAG=$DESIRED_VERSION
fi
}
# checkHelmInstalledVersion checks which version of helm is installed and
# if it needs to be changed.
checkHelmInstalledVersion() {
if [[ -f "${HELM_INSTALL_DIR}/${BINARY_NAME}" ]]; then
local version=$("${HELM_INSTALL_DIR}/${BINARY_NAME}" version --template="{{ .Version }}")
if [[ "$version" == "$TAG" ]]; then
echo "Helm ${version} is already ${DESIRED_VERSION:-latest}"
return 0
else
echo "Helm ${TAG} is available. Changing from version ${version}."
return 1
fi
else
return 1
fi
}
# downloadFile downloads the latest binary package and also the checksum
# for that binary.
downloadFile() {
HELM_DIST="helm-$TAG-$OS-$ARCH.tar.gz"
DOWNLOAD_URL="https://get.helm.sh/$HELM_DIST"
CHECKSUM_URL="$DOWNLOAD_URL.sha256"
HELM_TMP_ROOT="$(mktemp -dt helm-installer-XXXXXX)"
HELM_TMP_FILE="$HELM_TMP_ROOT/$HELM_DIST"
HELM_SUM_FILE="$HELM_TMP_ROOT/$HELM_DIST.sha256"
echo "Downloading $DOWNLOAD_URL"
if [ "${HAS_CURL}" == "true" ]; then
curl -SsL "$CHECKSUM_URL" -o "$HELM_SUM_FILE"
curl -SsL "$DOWNLOAD_URL" -o "$HELM_TMP_FILE"
elif [ "${HAS_WGET}" == "true" ]; then
wget -q -O "$HELM_SUM_FILE" "$CHECKSUM_URL"
wget -q -O "$HELM_TMP_FILE" "$DOWNLOAD_URL"
fi
}
# verifyFile verifies the SHA256 checksum of the binary package
# and the GPG signatures for both the package and checksum file
# (depending on settings in environment).
verifyFile() {
if [ "${VERIFY_CHECKSUM}" == "true" ]; then
verifyChecksum
fi
if [ "${VERIFY_SIGNATURES}" == "true" ]; then
verifySignatures
fi
}
# installFile installs the Helm binary.
installFile() {
HELM_TMP="$HELM_TMP_ROOT/$BINARY_NAME"
mkdir -p "$HELM_TMP"
tar xf "$HELM_TMP_FILE" -C "$HELM_TMP"
HELM_TMP_BIN="$HELM_TMP/$OS-$ARCH/helm"
echo "Preparing to install $BINARY_NAME into ${HELM_INSTALL_DIR}"
runAsRoot cp "$HELM_TMP_BIN" "$HELM_INSTALL_DIR/$BINARY_NAME"
echo "$BINARY_NAME installed into $HELM_INSTALL_DIR/$BINARY_NAME"
}
# verifyChecksum verifies the SHA256 checksum of the binary package.
verifyChecksum() {
printf "Verifying checksum... "
local sum=$(openssl sha1 -sha256 ${HELM_TMP_FILE} | awk '{print $2}')
local expected_sum=$(cat ${HELM_SUM_FILE})
if [ "$sum" != "$expected_sum" ]; then
echo "SHA sum of ${HELM_TMP_FILE} does not match. Aborting."
exit 1
fi
echo "Done."
}
# verifySignatures obtains the latest KEYS file from GitHub main branch
# as well as the signature .asc files from the specific GitHub release,
# then verifies that the release artifacts were signed by a maintainer's key.
verifySignatures() {
printf "Verifying signatures... "
local keys_filename="KEYS"
local github_keys_url="https://raw.githubusercontent.com/helm/helm/main/${keys_filename}"
if [ "${HAS_CURL}" == "true" ]; then
curl -SsL "${github_keys_url}" -o "${HELM_TMP_ROOT}/${keys_filename}"
elif [ "${HAS_WGET}" == "true" ]; then
wget -q -O "${HELM_TMP_ROOT}/${keys_filename}" "${github_keys_url}"
fi
local gpg_keyring="${HELM_TMP_ROOT}/keyring.gpg"
local gpg_homedir="${HELM_TMP_ROOT}/gnupg"
mkdir -p -m 0700 "${gpg_homedir}"
local gpg_stderr_device="/dev/null"
if [ "${DEBUG}" == "true" ]; then
gpg_stderr_device="/dev/stderr"
fi
gpg --batch --quiet --homedir="${gpg_homedir}" --import "${HELM_TMP_ROOT}/${keys_filename}" 2> "${gpg_stderr_device}"
gpg --batch --no-default-keyring --keyring "${gpg_homedir}/${GPG_PUBRING}" --export > "${gpg_keyring}"
local github_release_url="https://github.com/helm/helm/releases/download/${TAG}"
if [ "${HAS_CURL}" == "true" ]; then
curl -SsL "${github_release_url}/helm-${TAG}-${OS}-${ARCH}.tar.gz.sha256.asc" -o "${HELM_TMP_ROOT}/helm-${TAG}-${OS}-${ARCH}.tar.gz.sha256.asc"
curl -SsL "${github_release_url}/helm-${TAG}-${OS}-${ARCH}.tar.gz.asc" -o "${HELM_TMP_ROOT}/helm-${TAG}-${OS}-${ARCH}.tar.gz.asc"
elif [ "${HAS_WGET}" == "true" ]; then
wget -q -O "${HELM_TMP_ROOT}/helm-${TAG}-${OS}-${ARCH}.tar.gz.sha256.asc" "${github_release_url}/helm-${TAG}-${OS}-${ARCH}.tar.gz.sha256.asc"
wget -q -O "${HELM_TMP_ROOT}/helm-${TAG}-${OS}-${ARCH}.tar.gz.asc" "${github_release_url}/helm-${TAG}-${OS}-${ARCH}.tar.gz.asc"
fi
local error_text="If you think this might be a potential security issue,"
error_text="${error_text}\nplease see here: https://github.com/helm/community/blob/master/SECURITY.md"
local num_goodlines_sha=$(gpg --verify --keyring="${gpg_keyring}" --status-fd=1 "${HELM_TMP_ROOT}/helm-${TAG}-${OS}-${ARCH}.tar.gz.sha256.asc" 2> "${gpg_stderr_device}" | grep -c -E '^\[GNUPG:\] (GOODSIG|VALIDSIG)')
if [[ ${num_goodlines_sha} -lt 2 ]]; then
echo "Unable to verify the signature of helm-${TAG}-${OS}-${ARCH}.tar.gz.sha256!"
echo -e "${error_text}"
exit 1
fi
local num_goodlines_tar=$(gpg --verify --keyring="${gpg_keyring}" --status-fd=1 "${HELM_TMP_ROOT}/helm-${TAG}-${OS}-${ARCH}.tar.gz.asc" 2> "${gpg_stderr_device}" | grep -c -E '^\[GNUPG:\] (GOODSIG|VALIDSIG)')
if [[ ${num_goodlines_tar} -lt 2 ]]; then
echo "Unable to verify the signature of helm-${TAG}-${OS}-${ARCH}.tar.gz!"
echo -e "${error_text}"
exit 1
fi
echo "Done."
}
# fail_trap is executed if an error occurs.
fail_trap() {
result=$?
if [ "$result" != "0" ]; then
if [[ -n "$INPUT_ARGUMENTS" ]]; then
echo "Failed to install $BINARY_NAME with the arguments provided: $INPUT_ARGUMENTS"
help
else
echo "Failed to install $BINARY_NAME"
fi
echo -e "\tFor support, go to https://github.com/helm/helm."
fi
cleanup
exit $result
}
# testVersion tests the installed client to make sure it is working.
testVersion() {
set +e
HELM="$(command -v $BINARY_NAME)"
if [ "$?" = "1" ]; then
echo "$BINARY_NAME not found. Is $HELM_INSTALL_DIR on your "'$PATH?'
exit 1
fi
set -e
}
# help provides possible cli installation arguments
help () {
echo "Accepted cli arguments are:"
echo -e "\t[--help|-h ] ->> prints this help"
echo -e "\t[--version|-v <desired_version>] . When not defined it fetches the latest release tag from the Helm CDN"
echo -e "\te.g. --version v3.0.0 or -v canary"
echo -e "\t[--no-sudo] ->> install without sudo"
}
# cleanup temporary files to avoid https://github.com/helm/helm/issues/2977
cleanup() {
if [[ -d "${HELM_TMP_ROOT:-}" ]]; then
rm -rf "$HELM_TMP_ROOT"
fi
}
# Execution
#Stop execution on any error
trap "fail_trap" EXIT
set -e
# Set debug if desired
if [ "${DEBUG}" == "true" ]; then
set -x
fi
# Parsing input arguments (if any)
export INPUT_ARGUMENTS="${@}"
set -u
while [[ $# -gt 0 ]]; do
case $1 in
'--version'|-v)
shift
if [[ $# -ne 0 ]]; then
export DESIRED_VERSION="${1}"
if [[ "$1" != "v"* ]]; then
echo "Expected version arg ('${DESIRED_VERSION}') to begin with 'v', fixing..."
export DESIRED_VERSION="v${1}"
fi
else
echo -e "Please provide the desired version. e.g. --version v3.0.0 or -v canary"
exit 0
fi
;;
'--no-sudo')
USE_SUDO="false"
;;
'--help'|-h)
help
exit 0
;;
*) exit 1
;;
esac
shift
done
set +u
initArch
initOS
verifySupported
checkDesiredVersion
if ! checkHelmInstalledVersion; then
downloadFile
verifyFile
installFile
fi
testVersion
cleanup

88
add-on/gitea-action.txt Normal file
View File

@@ -0,0 +1,88 @@
apiVersion: v1
kind: Secret
metadata:
name: gitea-runner-secret
type: Opaque
stringData:
token: G3uEVBJ1TrlFhlwiWfE7seymUPnN1OgyeQHy7T7e
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: act-runner-vol
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbdfs-sc
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: act-runner
name: act-runner
spec:
replicas: 1
selector:
matchLabels:
app: act-runner
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: act-runner
spec:
hostAliases:
- ip: "140.82.121.3"
hostnames:
- "github.com"
restartPolicy: Always
volumes:
- name: docker-certs
emptyDir: {}
- name: runner-data
persistentVolumeClaim:
claimName: act-runner-vol
- name: dockersock
hostPath:
path: /var/run/docker.sock
containers:
- name: runner
image: gitea/act_runner:nightly-dind-rootless
command: ["sh", "-c", "while ! nc -z localhost 2376 </dev/null; do echo 'waiting for docker daemon...'; sleep 5; done; /sbin/tini -- run.sh"]
env:
- name: DOCKER_HOST
value: tcp://localhost:2376
- name: DOCKER_CERT_PATH
value: /certs/client
- name: DOCKER_TLS_VERIFY
value: "1"
- name: GITEA_INSTANCE_URL
value: https://git.italiadatacenter.com/
- name: GITEA_RUNNER_REGISTRATION_TOKEN
valueFrom:
secretKeyRef:
name: gitea-runner-secret
key: token
volumeMounts:
- name: docker-certs
mountPath: /certs
- name: runner-data
mountPath: /data
- name: daemon
image: docker:23.0.6-dind
env:
- name: DOCKER_TLS_CERTDIR
value: /certs
securityContext:
privileged: true
volumeMounts:
- name: docker-certs
mountPath: /certs

161
add-on/gitea-action2.txt Normal file
View File

@@ -0,0 +1,161 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: gitea-act-runner-config
namespace: gitea
data:
config.yaml: |
log:
level: debug
cache:
enabled: false
container:
valid_volumes:
- /certs
options: |
--add-host=docker:host-gateway -v /certs:/certs
-e "DOCKER_HOST=tcp://docker:2376/"
-e "DOCKER_TLS_VERIFY=1"
-e "DOCKER_CERT_PATH=/certs/client"
---
apiVersion: v1
kind: ConfigMap
metadata:
name: gitea-docker-daemon-config
namespace: gitea
data:
daemon.json: |
{ "insecure-registries": ["git.italiadatacenter.com"] }
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: gitea-act-runner-dind
namespace: gitea
spec:
replicas: 1
selector:
matchLabels:
app: gitea-act-runner-dind
serviceName: gitea-act-runner-dind
template:
metadata:
labels:
app: gitea-act-runner-dind
spec:
initContainers:
- name: gitea-act-runner-init
image: gitea/gitea:1.22.1-rootless
# Creates temporary gitea instance, generates token and saves it to act-runner
command:
- bash
- -exc
- |
sed '/[server]/a LOCAL_ROOT_URL = https://git.italiadatacenter.com/' /data/gitea/conf/app.ini > /tmp/app.ini; test -e /act-runner-data/.runner || gitea actions generate-runner-token > /act-runner-data/token
env:
- name: GITEA_APP_INI
value: /tmp/app.ini
- name: GITEA_CUSTOM
value: /data/gitea
- name: GITEA_WORK_DIR
value: /data
volumeMounts:
- name: gitea-shared-storage
mountPath: /data
readOnly: true
- name: gitea-act-runner-data
mountPath: /act-runner-data
containers:
- name: runner
image: gitea/act_runner:nightly
# Container only for gitea, so we can choose the dind variant (rootless or not)
image: gitea/act_runner:0.2.10
env:
- name: DOCKER_HOST
value: tcp://127.0.0.1:2376
- name: DOCKER_CERT_PATH
value: /certs/client
- name: DOCKER_TLS_VERIFY
value: "1"
- name: GITEA_RUNNER_REGISTRATION_TOKEN_FILE
value: /data/token
- name: CONFIG_FILE
value: /config.yaml
- name: GITEA_INSTANCE_URL
value: https://git.italiadatacenter.com
- name: CONFIG_FILE
value: /actrunner/config.yaml
volumeMounts:
- name: gitea-act-runner-data
mountPath: /data
- name: docker-certs
mountPath: /certs/client
- name: runner-config
mountPath: /actrunner
## Avoid subPath because it cannot be updated
## https://github.com/kubernetes/kubernetes/issues/50345
#mountPath: /actrunner/config.yaml
#subPath: config.yaml
- name: daemon
## Rootless works for simple cases, but not for docker buildx
#image = "docker:27.1.2-dind-rootless"
image = "docker:27.1.2-dind"
env:
- name: DOCKER_TLS_CERTDIR
value: /certs
- name: DOCKER_HOST
value: tcp://127.0.0.1:2376
- name: DOCKER_TLS_VERIFY
value: 1
securityContext:
privileged: true
volumeMounts:
- name: docker-certs
mountPath: /certs/client
- name: gitea-docker-daemon-config
## This one for rootless variant
#mountPath: /home/rootless/.config/docker
## This other for regular variant
mountPath: /etc/docker
## Avoid subPath because it cannot be updated
## https://github.com/kubernetes/kubernetes/issues/50345
#mountPath: /home/rootless/.config/docker/daemon.json
#mountPath: /etc/docker/daemon.json
#subPath: daemon.json
volumes:
- name: docker-certs
emptyDir: {}
- name: gitea-act-runner-config
configMap:
name: gitea-act-runner-config
- name: gitea-act-runner-data
persistentVolumeClaim:
claimName: gitea-act-runner
- name: gitea-shared-storage
persistentVolumeClaim:
claimName: gitea-shared-storage
readOnly: true
- name: gitea-docker-daemon-config
configMap:
name: gitea-docker-daemon-config
volumeClaimTemplates:
- metadata:
name: gitea-act-runner-data
namespace: gitea
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard
resources:
requests:
storage: 1Gi

87
add-on/gitea-workflow.txt Normal file
View File

@@ -0,0 +1,87 @@
name: Build and Push Docker Image
on:
push:
branches:
- main
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Harbor
uses: docker/login-action@v3
with:
registry: harbor.italiadatacenter.com
username: ${{ secrets.HARBOR_USERNAME }}
password: ${{ secrets.HARBOR_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: harbor.italiadatacenter.com/test/nginxtest:${{ github.sha }}
#run: /root/work/pipeline/build_container.sh ${{ github.event.repository.name }}
---------------------------------------------------------------------
name: Build and Push Docker Images from Containers
on:
push:
branches: [ main ]
workflow_dispatch: # Permette esecuzione manuale
jobs:
# Job per elencare le directory con Dockerfile e creare una matrice
list-containers:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set matrix for containers
id: set-matrix
run: |
# Trova tutte le directory contenenti Dockerfile in containers/
dirs=$(find containers -name Dockerfile -exec dirname {} \; | sort)
# Converte in JSON per la matrice (es. [{"dir": "containers/app1"}, {"dir": "containers/app2"}])
matrix=$(echo "$dirs" | jq -R -s -c 'split("\n")[:-1] | map({dir: .})')
echo "matrix=$matrix" >> $GITHUB_OUTPUT
- name: Log in to Docker registry
uses: docker/login-action@v3
with:
registry: ghcr.io # Esempio: GitHub Container Registry; cambia se usi Docker Hub
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Job per buildare e pushare ogni immagine usando la matrice
build:
needs: list-containers
runs-on: ubuntu-latest
strategy:
matrix:
container: ${{ fromJson(needs.list-containers.outputs.matrix) }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: ${{ matrix.container.dir }} # Contesto del build (la directory del Dockerfile)
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max

100
add-on/gitea.sh Normal file
View File

@@ -0,0 +1,100 @@
kubectl cnpg psql pg-devops -n devops
CREATE DATABASE giteadb;
CREATE USER gitea WITH PASSWORD 'KAYQE1QA7uwUZ8uI';
GRANT ALL PRIVILEGES ON DATABASE giteadb TO gitea;
ALTER DATABASE giteadb OWNER TO gitea;
helm repo add gitea https://dl.gitea.io/charts/
helm repo update
kubectl create namespace gitea
cat <<EOF |cat >values.yaml -
replicaCount: 1
image:
repository: gitea/gitea
tag: 1.22.0
pullPolicy: IfNotPresent
strategy:
type: Recreate
service:
http:
type: ClusterIP
port: 3000
ssh:
type: ClusterIP
port: 22
redis-cluster:
enabled: false
redis:
enabled: false
ingress:
enabled: false
persistence:
enabled: true
storageClass: csi-rbdfs-sc
size: 10Gi
postgresql:
enabled: false
postgresql-ha:
enabled: false
gitea:
admin:
username: gitadmin
password: KAYQE1QA7uwUZ8uI
email: gitadmin@italiadatacenter.com
config:
database:
DB_TYPE: postgres
HOST: pg-devops-rw.devops.svc:5432
NAME: giteadb
USER: gitea
PASSWD: KAYQE1QA7uwUZ8uI
SSL_MODE: disable
server:
ROOT_URL: https://git.italiadatacenter.com/
SSH_DOMAIN: git.italiadatacenter.com
SSH_PORT: 22
security:
INSTALL_LOCK: true
EOF
helm upgrade --install gitea gitea-charts/gitea --namespace gitea -f values.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: gitea
namespace: gitea
spec:
hostnames:
- git.italiadatacenter.com
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: gitea-http
port: 3000

123
add-on/grafana.txt Normal file
View File

@@ -0,0 +1,123 @@
Aggiungere repository Helm Grafana
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
----
kubectl create namespace grafana
----
grafana-values.yaml:
replicas: 1
adminUser: admin
adminPassword: KAYQE1QA7uwUZ8uI5
service:
type: ClusterIP
port: 80
persistence:
enabled: true
size: 10Gi
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
---
helm install grafana grafana/grafana -n grafana -f grafana-values.yaml
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: grafana
spec:
hostnames:
- tekton.italiadatacenter.com
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: grafana
port: 80
****************** TEST ****************************
Accesso alla UI Grafana
Aprire browser:
http://localhost:3000
Login:
user: admin
password: KAYQE1QA7uwUZ8uI5
link svc:
grafana.grafana.svc.cluster.local
---------------------------------------
Aggiungere InfluxDB come datasource
In Grafana:
Connections
Data Sources
Add data source
InfluxDB
Configurazione:
URL
http://influxdb:8086
Organization:
demo-org
Token:
my-super-token
Bucket:
demo-bucket
Salva.
6⃣ Test datasource
Click:
Save & Test
Se corretto:
Datasource is working
7⃣ Creare dashboard
In Grafana:
Create
Dashboard
Add panel
Query esempio (InfluxDB Flux):
from(bucket: "demo-bucket")
|> range(start: -1h)

201
add-on/harbor.sh Normal file
View File

@@ -0,0 +1,201 @@
#HARBOR
kubectl create namespace harbor
helm repo add harbor https://helm.goharbor.io
helm repo update
cat <<EOF | cat > harbor-cert.yaml -
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: harbor-tls
namespace: harbor
spec:
secretName: harbor-tls
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- harbor.italiadatacenter.com
EOF
kubectl apply -f harbor-cert.yaml
cat <<EOF | cat > harborvalues.yaml -
# -----------------------
# EXPOSURE
# -----------------------
expose:
# Set how to expose the service. Set the type as "ingress", "clusterIP", "nodePort" or "loadBalancer"
# and fill the information in the corresponding section
type: clusterIP
externalURL: https://harbor.italiadatacenter.com
# -----------------------
# ADMIN
# -----------------------
harborAdminPassword: "KAYQE1QA7uwUZ8uI"
# -----------------------
# PERSISTENCE
# -----------------------
persistence:
enabled: true
persistentVolumeClaim:
registry:
storageClass: csi-rbdfs-sc
size: 50Gi
jobservice:
storageClass: csi-rbdfs-sc
size: 2Gi
trivy:
storageClass: csi-rbdfs-sc
size: 2Gi
# -----------------------
# POSTGRESQL (EXTERNAL)
# -----------------------
database:
type: external
external:
host: pg-devops-rw.devops.svc
port: 5432
username: harbor
password: "KAYQE1QA7uwUZ8uI"
database: registry
sslmode: require
# -----------------------
# REDIS (EXTERNAL)
# -----------------------
redis:
type: external
external:
addr: redis.redis.svc.cluster.local:6379
password: "KAYQE1QA7uwUZ8uI"
database: 0
# -----------------------
# DISABLE INTERNAL SERVICES
# -----------------------
postgresql:
enabled: false
redisInternal:
enabled: false
# -----------------------
# COMPONENTS
# -----------------------
trivy:
enabled: true
metrics:
enabled: false
EOF
kubectl cnpg psql pg-devops -n devops
CREATE DATABASE registry;
CREATE USER harbor WITH PASSWORD 'KAYQE1QA7uwUZ8uI';
GRANT ALL PRIVILEGES ON DATABASE registry TO harbor;
ALTER DATABASE registry OWNER TO harbor;
#test
kubectl run psql-test --rm -it --image=postgres:16 -- psql -h pg-prod-rw.database.svc -U harbor
kubectl run redis-test --rm -it --image=redis:7 -- redis-cli -h redis.redis.svc.cluster.local -a Japp0cam
helm install harbor harbor/harbor -n harbor -f harborvalues.yaml
--- httproute & body setting nginx ----
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: harbor
namespace: harbor
spec:
hostnames:
- harbor.italiadatacenter.com
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: harbor
port: 80
---
apiVersion: gateway.nginx.org/v1alpha1
kind: ClientSettingsPolicy
metadata:
name: gateway-client-settings
spec:
targetRef:
group: gateway.networking.k8s.io
kind: Gateway
name: main-gateway
body:
maxSize: "0"
EOF
#test
#Login UI:
https://harbor.pigreco66.it/ (admin(Japp0cam)
#push
docker login harbor.italiadatacenter.com
docker pull nginx:1.25
docker tag nginx:1.25 harbor.italiadatacenter.com/library/nginx:1.25
docker push harbor.italiadatacenter.com/library/nginx:1.25
#pull
docker rmi harbor.pigreco66.it/library/nginx:1.25
docker pull harbor.pigreco66.it/library/nginx:1.25
#pull da k8s
#STEP 1 Creare Robot Account in Harbor
#Harbor UI → Projects → (es. library o apps) → Robot Accounts
#Nome: k8s-pull
#Permessi:
#✔️ Repository → Pull
kubectl create secret docker-registry harbor-pull \
-n default \
--docker-server=harbor.italiadatacenter.com \
--docker-username=robot$k8s-pull \
--docker-password=ir0ELEJEFg804qljh2p32ALzIsMJepWt \
--docker-email=harbor@italiadatacenter.com
#per namespace nuovi
kubectl patch serviceaccount default -n default -p '{"imagePullSecrets":[{"name":"harbor-pull"}]}'
#applicare per i vecchi:
kubectl patch serviceaccount default -n primo-dev -p '{"imagePullSecrets":[{"name":"harbor-pull"}]}'
#test
kubectl run test-nginx --image=harbor.italiadatacenter.com/library/nginx:1.25 --restart=Never -n poc
kubectl -n primo-dev create secret docker-registry harbor-pull \
--docker-server=harbor.italiadatacenter.com \
--docker-username=robot\$primo+primo \
--docker-password=agQLiKJ8K5qmBWhO1bHngzb9UorPLIw1 \
--docker-email=harbor@italiadatacenter.com
kubectl patch serviceaccount default -n primo-dev -p '{"imagePullSecrets":[{"name":"harbor-pull"}]}'

BIN
add-on/influxdb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

76
add-on/influxdb.txt Normal file
View File

@@ -0,0 +1,76 @@
helm repo add influxdata https://helm.influxdata.com/
helm repo update
----
kubectl create namespace influxdb
----
influxdb-values.yaml:
image:
repository: influxdb
tag: 2.7
persistence:
enabled: true
size: 20Gi
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 1
memory: 1Gi
service:
type: ClusterIP
port: 8086
adminUser:
organization: sts-lab
bucket: demo-bucket
user: admin
password: KAYQE1QA7uwUZ8uI5
token: my-super-token
----
helm install influxdb influxdata/influxdb2 --namespace influxdb -f influxdb-values.yaml
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: influxdb
spec:
hostnames:
- poc2.italiadatacenter.com
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: influxdb-influxdb2
port: 8086
****************** TEST ****************************
echo $(kubectl get secret influxdb-influxdb2-auth -o "jsonpath={.data['admin-password']}" --namespace influxdb | base64 --decode)
logon UI
http://localhost:8086
user: admin
password: KAYQE1QA7uwUZ8uI5
TEST API:
curl http://localhost:8086/health
link svc:
influxdb-influxdb2.influxdb.svc.cluster.local

164
add-on/install_edgenode.sh Normal file
View File

@@ -0,0 +1,164 @@
#!/usr/bin/env bash
set -euo pipefail
# Configurazione (override con variabili d'ambiente prima di eseguire lo script)
KUBEEDGE_VERSION="${KUBEEDGE_VERSION:-v1.22.0}"
CLOUD_MASTER_IP="${CLOUD_MASTER_IP:-89.105.78.161}"
EDGE_NODE_NAME="${EDGE_NODE_NAME:-edge-node-02}"
KUBEEDGE_TOKEN="${KUBEEDGE_TOKEN:-26477f03e3d0209870acdf724478f1d875e1328f8ea3408d74f3d7d109ad02be.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzQ5OTI1NzB9.YxfikSixBrX7bvQxgxXYpbwLJHg0SAQ9mQ7kblBWQrk}"
CONTAINERD_VERSION="1.6.14"
RUNC_VERSION="1.1.3"
CNI_VERSION="1.1.1"
echo "==== EDGE NODE INSTALL START ===="
echo "KUBEEDGE_VERSION=${KUBEEDGE_VERSION}"
echo "CLOUD_MASTER_IP=${CLOUD_MASTER_IP}"
echo "EDGE_NODE_NAME=${EDGE_NODE_NAME}"
echo "KUBEEDGE_TOKEN=${KUBEEDGE_TOKEN}"
if ! command -v sudo >/dev/null 2>&1; then
echo "Errore: sudo non trovato"
exit 1
fi
TMP_DIR="$(mktemp -d)"
trap 'rm -rf "${TMP_DIR}"' EXIT
echo "[1/8] Download e installazione containerd ${CONTAINERD_VERSION}"
cd "${TMP_DIR}"
wget -q "https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz"
sudo tar Cxzvf /usr/local "containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz"
echo "[2/8] Download e installazione runc ${RUNC_VERSION}"
wget -q "https://github.com/opencontainers/runc/releases/download/v${RUNC_VERSION}/runc.amd64"
sudo install -m 755 runc.amd64 /usr/local/sbin/runc
echo "[3/8] Download e installazione CNI plugins ${CNI_VERSION}"
wget -q "https://github.com/containernetworking/plugins/releases/download/v${CNI_VERSION}/cni-plugins-linux-amd64-v${CNI_VERSION}.tgz"
sudo mkdir -p /opt/cni/bin
sudo tar Cxzvf /opt/cni/bin "cni-plugins-linux-amd64-v${CNI_VERSION}.tgz"
echo "[4/8] Configurazione containerd"
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null
sudo sed -i '/SystemdCgroup = true/d' /etc/containerd/config.toml
sudo curl -fsSL https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -o /etc/systemd/system/containerd.service
echo "[5/8] Configurazione rete CNI"
sudo mkdir -p /etc/cni/net.d
cat <<'EOF' | sudo tee /etc/cni/net.d/10-containerd-net.conflist >/dev/null
{
"cniVersion": "1.0.0",
"name": "containerd-net",
"plugins": [
{
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"promiscMode": true,
"ipam": {
"type": "host-local",
"ranges": [
[{
"subnet": "10.88.0.0/16"
}],
[{
"subnet": "2001:db8:4860::/64"
}]
],
"routes": [
{ "dst": "0.0.0.0/0" },
{ "dst": "::/0" }
]
}
},
{
"type": "portmap",
"capabilities": {"portMappings": true}
}
]
}
EOF
echo "[6/8] Avvio e abilitazione containerd"
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
echo "[7/8] Installazione keadm ${KUBEEDGE_VERSION}"
cd "${TMP_DIR}"
curl -fsSL "https://github.com/kubeedge/kubeedge/releases/download/${KUBEEDGE_VERSION}/keadm-${KUBEEDGE_VERSION}-linux-amd64.tar.gz" | tar -xz
sudo mv "keadm-${KUBEEDGE_VERSION}-linux-amd64/keadm/keadm" /usr/local/bin/
echo "[8/8] Join edge node al cloud master"
sudo keadm join \
--cloudcore-ipport="${CLOUD_MASTER_IP}:10000" \
--edgenode-name="${EDGE_NODE_NAME}" \
--token="${KUBEEDGE_TOKEN}" \
--kubeedge-version="${KUBEEDGE_VERSION}"
echo "Creazione script di cleanup edge"
cat <<'EOF' | sudo tee /usr/local/bin/edge-cleanup.sh >/dev/null
#!/usr/bin/env bash
set -euo pipefail
echo "==== EDGE NODE CLEANUP START ===="
echo "Timestamp: $(date)"
echo "[1] Checking orphan processes..."
ORPHANS=$(ps -eo pid,ppid,cmd | awk '$2 == 1 {print $1}')
for PID in ${ORPHANS}; do
if [ "${PID}" != "1" ]; then
echo "Killing orphan PID: ${PID}"
kill -9 "${PID}" 2>/dev/null || true
fi
done
echo "[2] Cleaning containerd..."
if command -v crictl >/dev/null 2>&1; then
crictl ps -a --state Exited -q | xargs -r crictl rm || true
crictl pods --state NotReady -q | xargs -r crictl rmp || true
crictl rmi --prune || true
else
echo "crictl not found, skipping..."
fi
echo "[3] Restarting containerd..."
systemctl restart containerd || true
echo "[4] Cleaning kubelet state (soft)..."
find /var/lib/kubelet/pods -mindepth 1 -maxdepth 1 -type d -mtime +1 -exec rm -rf {} + || true
echo "[5] Restarting kubelet + edgecore..."
systemctl restart kubelet || true
systemctl restart edgecore || true
echo "[6] Checking MQTT port..."
ss -tulnp | grep 1883 || echo "WARNING: Mosquitto not listening"
echo "==== EDGE NODE CLEANUP DONE ===="
EOF
sudo chmod +x /usr/local/bin/edge-cleanup.sh
echo "Creazione service systemd edge-cleanup"
cat <<'EOF' | sudo tee /etc/systemd/system/edge-cleanup.service >/dev/null
[Unit]
Description=Edge Node Cleanup
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/edge-cleanup.sh
RemainAfterExit=true
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable edge-cleanup
echo "==== EDGE NODE INSTALL DONE ===="

View File

@@ -0,0 +1,11 @@
kubectl create namespace cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update
# Install versione consigliata
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--set installCRDs=true \
--wait
# Verifica
kubectl -n cert-manager get pods

View File

@@ -0,0 +1,7 @@
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
kubectl create namespace cattle-system
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=k8s.italiadatacenter.com \
--set bootstrapPassword=admin

7
add-on/installa_helm.sh Normal file
View File

@@ -0,0 +1,7 @@
# scarica helm (esempio Linux AMD64)
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
# verifica
helm version

BIN
add-on/k8s-secret.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

23
add-on/longhornui.yaml Normal file
View File

@@ -0,0 +1,23 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: longhornui
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-production"
spec:
tls:
- hosts:
- longhorn.pigreco66.it
secretName: longhornui-tls
rules:
- host: longhorn.pigreco66.it
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: longhorn-frontend
port:
number: 80

111
add-on/minio.txt Normal file
View File

@@ -0,0 +1,111 @@
##helm
helm repo add minio https://charts.min.io/
helm repo update
##values.yaml:
mode: distributed
replicas: 2
drivesPerNode: 1
persistence:
enabled: true
storageClass: csi-rbdfs-sc # 👈 IL TUO STORAGE CLASS
size: 50Gi
resources:
requests:
memory: 1Gi
cpu: 500m
limits:
memory: 2Gi
cpu: 1
rootUser: minioadmin
rootPassword: KAYQE1QA7uwUZ8uI
service:
type: ClusterIP
ingress:
enabled: false
consoleService:
type: ClusterIP
##Deploy
helm install minio minio/minio -n minio --create-namespace -f minio_values.yaml
Accesso:
kubectl port-forward svc/minio -n minio 9000
kubectl port-forward svc/minio-console -n storage 9001
##per pod us nodi diversi
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- minio
topologyKey: "kubernetes.io/hostname"
#################INFO##########################
NAME: minio
LAST DEPLOYED: Sun Mar 29 16:23:17 2026
NAMESPACE: minio
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
MinIO can be accessed via port 9000 on the following DNS name from within your cluster:
minio.minio.cluster.local
To access MinIO from localhost, run the below commands:
1. export POD_NAME=$(kubectl get pods --namespace minio -l "release=minio" -o jsonpath="{.items[0].metadata.name}")
2. kubectl port-forward $POD_NAME 9000 --namespace minio
Read more about port forwarding here: http://kubernetes.io/docs/user-guide/kubectl/kubectl_port-forward/
You can now access MinIO server on http://localhost:9000. Follow the below steps to connect to MinIO server with mc client:
1. Download the MinIO mc client - https://min.io/docs/minio/linux/reference/minio-mc.html#quickstart
2. export MC_HOST_minio-local=http://$(kubectl get secret --namespace minio minio -o jsonpath="{.data.rootUser}" | base64 --decode):$(kubectl get secret --namespace minio minio -o jsonpath="{.data.rootPassword}" | base64 --decode)@localhost:9000
###svc nodeport per accessi backup etc
apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: minio
meta.helm.sh/release-namespace: minio
labels:
app: minio
release: minio
name: minio-nodeport
namespace: minio
spec:
ports:
- name: http
nodePort: 30877
port: 9000
protocol: TCP
targetPort: 9000
selector:
app: minio
release: minio
sessionAffinity: None
type: NodePort

104
add-on/mosquitto.yaml Normal file
View File

@@ -0,0 +1,104 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: mosquitto-config
namespace: mqtt
data:
mosquitto.conf: |
listener 1883
allow_anonymous true
persistence true
persistence_location /mosquitto/data/
log_dest stdout
log_type all
# opzionale: retained messages
persistence_file mosquitto.db
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mosquitto-pvc
namespace: mqtt
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: csi-rbdfs-sc # 👈 cambia se necessario
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mosquitto
namespace: mqtt
spec:
replicas: 1
selector:
matchLabels:
app: mosquitto
template:
metadata:
labels:
app: mosquitto
spec:
containers:
- name: mosquitto
image: eclipse-mosquitto:2
ports:
- containerPort: 1883
volumeMounts:
- name: config
mountPath: /mosquitto/config/mosquitto.conf
subPath: mosquitto.conf
- name: data
mountPath: /mosquitto/data
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
volumes:
- name: config
configMap:
name: mosquitto-config
- name: data
persistentVolumeClaim:
claimName: mosquitto-pvc
---
apiVersion: v1
kind: Service
metadata:
name: mqtt-broker
namespace: mqtt
spec:
selector:
app: mosquitto
ports:
- name: mqtt
port: 1883
targetPort: 1883
type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
name: mqtt-broker-nodeport
namespace: mqtt
spec:
ports:
- appProtocol: tcp
name: mqtt
nodePort: 31883
port: 1883
protocol: TCP
targetPort: 1883
selector:
app: mosquitto
sessionAffinity: None
type: NodePort

BIN
add-on/mqtt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

38
add-on/mysql.txt Normal file
View File

@@ -0,0 +1,38 @@
helm repo add mysql-operator https://mysql.github.io/mysql-operator/
helm repo update
helm install my-mysql-operator mysql-operator/mysql-operator --namespace mysql-operator --create-namespace
--db instance
kubectl create secret generic mypwds \
--from-literal=rootUser=root \
--from-literal=rootHost=% \
--from-literal=rootPassword="sakila"
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mycluster
spec:
secretName: mypwds
tlsUseSelfSigned: true
instances: 3
router:
instances: 1
--- test
$> kubectl run --rm -it myshell --image=container-registry.oracle.com/mysql/community-operator -- mysqlsh root@mycluster --sql
If you don't see a command prompt, try pressing enter.
******
MySQL mycluster SQL> SELECT @@hostname
+-------------+
| @@hostname |
+-------------+
| mycluster-0 |
+-------------+
This section utilizes the {innodbclustername}.{namespace}.svc.cluster.local form when connecting; and typically refers to the {innodbclustername} shorthand form that assumes the default namespace. See Section 3.4, “MySQL InnoDB Cluster Service Explanation” for additional information.

View File

@@ -0,0 +1,30 @@
apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: rke2-ingress-nginx
meta.helm.sh/release-namespace: kube-system
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: rke2-ingress-nginx
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: rke2-ingress-nginx
app.kubernetes.io/part-of: rke2-ingress-nginx
app.kubernetes.io/version: 1.13.4
helm.sh/chart: rke2-ingress-nginx-4.13.400
name: ingress-nginx-nodeport
namespace: kube-system
spec:
ports:
- appProtocol: https
name: https
nodePort: 30864
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: rke2-ingress-nginx
app.kubernetes.io/name: rke2-ingress-nginx
sessionAffinity: None
type: NodePort

38
add-on/package-lock.json generated Normal file
View File

@@ -0,0 +1,38 @@
{
"name": "add-on",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"chokidar": "^5.0.0"
}
},
"node_modules/chokidar": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
"integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
"dependencies": {
"readdirp": "^5.0.0"
},
"engines": {
"node": ">= 20.19.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/readdirp": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
"integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
"engines": {
"node": ">= 20.19.0"
},
"funding": {
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
}
}
}

5
add-on/package.json Normal file
View File

@@ -0,0 +1,5 @@
{
"dependencies": {
"chokidar": "^5.0.0"
}
}

62
add-on/pgdb.txt Normal file
View File

@@ -0,0 +1,62 @@
kubectl create namespace <dbxx>
dbxx.yaml.yaml:
---
apiVersion: v1
kind: Secret
metadata:
name: pg-app-user
namespace: <dbxx>
type: kubernetes.io/basic-auth
stringData:
username: devops
password: KAYQE1QA7uwUZ8uI
---
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: pg-devops
namespace: <dbxx>
spec:
instances: 3
storage:
size: 1Gi
storageClass: csi-rbdfs-sc
walStorage:
storageClass: csi-rbdfs-sc
size: 1Gi
bootstrap:
initdb:
database: devops
owner: admin
secret:
name: pg-app-user
postgresql:
parameters:
max_connections: "300"
shared_buffers: "1GB"
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "2"
memory: "2Gi"
kubectl cnpg psql pg-devops -n devops
CREATE DATABASE giteadb;
CREATE USER gitea WITH PASSWORD 'KAYQE1QA7uwUZ8uI';
GRANT ALL PRIVILEGES ON DATABASE giteadb TO gitea;
ALTER DATABASE giteadb OWNER TO gitea;

71
add-on/pipeline.txt Normal file
View File

@@ -0,0 +1,71 @@
#!/bin/bash
# Usage: ./customize.sh dev|qa|prod
ENV=$1
VALUES_FILE="env/$ENV/values.env"
YAML_FILE="kubernetes/infrastructure.yaml"
if [ ! -f "$VALUES_FILE" ]; then
echo "File $VALUES_FILE non trovato."
exit 1
fi
if [ ! -f "$YAML_FILE" ]; then
echo "File $YAML_FILE non trovato."
exit 1
fi
while IFS='=' read -r key value; do
sed -i "s|<$key>|$value|g" "$YAML_FILE"
done < "$VALUES_FILE"
echo "Sostituzione completata per ambiente $ENV."
#!/bin/bash
# Carica variabili dal file properties.env
source properties.env
# Controlla che le variabili siano impostate
if [ -z "$REGISTRY_URL" ] || [ -z "$REGISTRY_USER" ] || [ -z "$REGISTRY_PASS" ]; then
echo "REGISTRY_URL, REGISTRY_USER o REGISTRY_PASS non impostate in properties.env"
exit 1
fi
REPO_NAME=$(basename "$PWD")
COMMIT_SHA=$(git rev-parse --short HEAD)
# Login al registry
echo "$REGISTRY_PASS" | docker login "$REGISTRY_URL" -u "$REGISTRY_USER" --password-stdin
for dir in containers/*/; do
CONTAINER_NAME=$(basename "$dir")
DOCKERFILE="$dir/dockerfile"
IMAGE_TAG="${REGISTRY_URL}/${REPO_NAME}/${CONTAINER_NAME}:${COMMIT_SHA}"
if [ -f "$DOCKERFILE" ]; then
docker build -t "$IMAGE_TAG" -f "$DOCKERFILE" "$dir"
docker push "$IMAGE_TAG"
echo "Build e push completate: $IMAGE_TAG"
else
echo "Dockerfile non trovato in $dir"
fi
done
#!/bin/bash
# Effettua il deploy del file infrastructure.yaml in Kubernetes
YAML_FILE="kubernetes/infrastructure.yaml"
if [ ! -f "$YAML_FILE" ]; then
echo "File $YAML_FILE non trovato."
exit 1
fi
kubectl apply -f "$YAML_FILE"
echo "Deploy completato."

View File

@@ -0,0 +1,169 @@
# creazione secret, SA, Role e Rolebinding all'interno del namespace applicativo
kubectl create secret docker-registry harbor-regcred \
-n poc \
--docker-server=harbor.pigreco66.it \
--docker-username=robot$tekton \
--docker-password=p2oZtqcUJafMAlX0eUzgHax9fv0ML8te \
--docker-email=alessandro.barucci66@gmail.com
kubectl create secret generic harbor-push-secret -n poc --from-file=config.json=config.json
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: tekton-deployer
namespace: poc
imagePullSecrets:
- name: harbor-regcred
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: tekton-deployer
namespace: poc
rules:
- apiGroups: ["", "apps", "batch", "networking.k8s.io"]
resources: ["*"]
verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: tekton-deployer
namespace: poc
subjects:
- kind: ServiceAccount
name: tekton-deployer
namespace: poc
roleRef:
kind: Role
name: tekton-deployer
apiGroup: rbac.authorization.k8s.io
EOF
#Pipeline che refernzia task remoti --> apply -f su namespace centralizzato tekton-pipelines
#kubectl apply -f pipedep.yaml -n tekton-pipelines
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: deploy-infrastructure
spec:
description: |
This pipeline clones a git repo, builds a Docker image with Kaniko and
pushes it to a registry
params:
- name: repo-url
type: string
- name: image-reference
type: string
- name: dockerfile
type: string
- name: namespace
type: string
workspaces:
- name: shared-data
- name: docker-credentials
tasks:
- name: fetch-source
taskRef:
resolver: cluster
params:
- name: name
value: git-clone
- name: namespace
value: tekton-pipelines
- name: kind
value: task
workspaces:
- name: output
workspace: shared-data
params:
- name: url
value: $(params.repo-url)
- name: build-push
runAfter: ["fetch-source"]
taskRef:
resolver: cluster
params:
- name: name
value: kaniko
- name: namespace
value: tekton-pipelines
- name: kind
value: task
workspaces:
- name: source
workspace: shared-data
- name: dockerconfig
workspace: docker-credentials
params:
- name: IMAGE
value: $(params.image-reference)
- name: DOCKERFILE
value: $(params.dockerfile)
- name: deploy
runAfter: [build-push]
taskRef:
resolver: cluster
params:
- name: name
value: kubectl-apply
- name: namespace
value: tekton-pipelines
- name: kind
value: task
params:
- name: namespace
value: $(params.namespace)
workspaces:
- name: source
workspace: shared-data
#PipelineRun creato su namespace applicativo che refenzia pipeline remote
#kubectl create -f pipedeprun2.yaml -n poc
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
generateName: clone-build-push-run-
spec:
serviceAccountName: tekton-deployer
pipelineRef:
resolver: cluster
params:
- name: namespace
value: tekton-pipelines
- name: name
value: deploy-infrastructure
- name: kind
value: pipeline
podTemplate:
securityContext:
fsGroup: 65532
workspaces:
- name: shared-data
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 1Gi
- name: docker-credentials
secret:
secretName: harbor-push-secret
params:
- name: repo-url
value: https://gitea.pigreco66.it/pigreco/poc.git
- name: image-reference
value: harbor.pigreco66.it/library/nginx:1.30
- name: dockerfile
value: ./container/nginx/dockerfile
- name: namespace
value: poc

349
add-on/pipelines.sh Normal file
View File

@@ -0,0 +1,349 @@
#installo task community "git-clone"
#kubectl apply -f https://api.hub.tekton.dev/v1/resource/tekton/task/git-clone/0.10/raw -n
kubectl apply -f https://github.com/tektoncd/catalog/raw/main/task/git-clone/0.10/git-clone.yaml -n tekton-pipelines
cat <<EOF | kubectl -n tekton-pipelines apply -f -
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: clone-read
spec:
description: |
This pipeline clones a git repo, then echoes the README file to the stout.
params:
- name: repo-url
type: string
description: The git repo URL to clone from.
- name: image
type: string
description: The name (reference) of the image to build.
- name: dockerfile
type: string
description: The path to the Dockerfile to execute (default: ./Dockerfile)
workspaces:
- name: shared-data
description: |
This workspace contains the cloned repo files, so they can be read by the
next task.
tasks:
- name: fetch-source
taskRef:
name: git-clone
workspaces:
- name: output
workspace: shared-data
params:
- name: url
value: $(params.repo-url)
- name: show-readme
runAfter: ["fetch-source"]
taskRef:
name: show-readme
workspaces:
- name: source
workspace: shared-data
- name: docker-build
runAfter: ["show-readme"]
taskRef:
name: docker-build
workspaces:
- name: output
workspace: shared-data
params:
- name: image
value: $(params.image)
- name: dockerfile
value: $(params.dockerfile)
---
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: show-readme
spec:
description: Read and display README file.
workspaces:
- name: source
steps:
- name: read
image: alpine:latest
script: |
#!/usr/bin/env sh
cat $(workspaces.source.path)/README.md
EOF
cat <<EOF | kubectl -n tekton-pipelines create -f -
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
generateName: clone-read-run-
spec:
pipelineRef:
name: clone-read
podTemplate:
securityContext:
fsGroup: 65532
workspaces:
- name: shared-data
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 1Gi
params:
- name: repo-url
value: https://gitea.pigreco66.it/pigreco/poc.git
- name: image
value: nginx
- name: dockerfile
value: ./container/nginx/dockerfile
EOF
#BUILD Container
#installo task community "kaniko"
#kubectl apply -f https://api.hub.tekton.dev/v1/resource/tekton/task/kaniko/0.7/raw
kubectl apply -f https://github.com/tektoncd/catalog/raw/main/task/kaniko/0.7/kaniko.yaml -n -n tekton-pipelines
cat <<EOF | kubectl -n tekton-pipelines apply -f -
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: clone-build-push
spec:
description: |
This pipeline clones a git repo, builds a Docker image with Kaniko and
pushes it to a registry
params:
- name: repo-url
type: string
- name: image-reference
type: string
- name: dockerfile
type: string
workspaces:
- name: shared-data
- name: docker-credentials
tasks:
- name: fetch-source
taskRef:
name: git-clone
workspaces:
- name: output
workspace: shared-data
params:
- name: url
value: $(params.repo-url)
- name: build-push
runAfter: ["fetch-source"]
taskRef:
name: kaniko
workspaces:
- name: source
workspace: shared-data
- name: dockerconfig
workspace: docker-credentials
params:
- name: IMAGE
value: $(params.image-reference)
- name: DOCKERFILE
value: $(params.dockerfile)
EOF
cat <<EOF | kubectl -n tekton-pipelines create -f -
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
generateName: clone-build-push-run-
spec:
pipelineRef:
name: clone-build-push
podTemplate:
securityContext:
fsGroup: 65532
workspaces:
- name: shared-data
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 1Gi
- name: docker-credentials
secret:
secretName: harbor-push-secret
params:
- name: repo-url
value: https://gitea.pigreco66.it/pigreco/poc.git
- name: image-reference
value: harbor.pigreco66.it/library/nginx:1.30
- name: dockerfile
value: ./container/nginx/dockerfile
EOF
# Build, push, deploy
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: tekton-deployer
namespace: tekton-pipelines
imagePullSecrets:
- name: harbor-regcred
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: tekton-deployer
namespace: poc
rules:
- apiGroups: ["", "apps", "batch", "networking.k8s.io"]
resources: ["*"]
verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: tekton-deployer
namespace: poc
subjects:
- kind: ServiceAccount
name: tekton-deployer
namespace: tekton-pipelines
roleRef:
kind: Role
name: tekton-deployer
apiGroup: rbac.authorization.k8s.io
EOF
cat <<EOF | kubectl -n tekton-pipelines apply -f -
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: kubectl-apply
namespace: tekton-pipelines
spec:
workspaces:
- name: source
params:
- name: namespace
type: string
- name: manifest
type: string
default: infrastructure.yaml
steps:
- name: apply
image: bitnami/kubectl:latest
script: |
set -e
echo "Deploying $(params.manifest) to namespace $(params.namespace)"
kubectl apply \
-f $(workspaces.source.path)/$(params.manifest) \
-n $(params.namespace)
EOF
cat <<EOF | kubectl -n tekton-pipelines apply -f -
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: clone-build-push
spec:
description: |
This pipeline clones a git repo, builds a Docker image with Kaniko and
pushes it to a registry
params:
- name: repo-url
type: string
- name: image-reference
type: string
- name: dockerfile
type: string
- name: namespace
type: string
workspaces:
- name: shared-data
- name: docker-credentials
tasks:
- name: fetch-source
taskRef:
name: git-clone
workspaces:
- name: output
workspace: shared-data
params:
- name: url
value: $(params.repo-url)
- name: build-push
runAfter: ["fetch-source"]
taskRef:
name: kaniko
workspaces:
- name: source
workspace: shared-data
- name: dockerconfig
workspace: docker-credentials
params:
- name: IMAGE
value: $(params.image-reference)
- name: DOCKERFILE
value: $(params.dockerfile)
- name: deploy
runAfter: [build-push]
taskRef:
name: kubectl-apply
params:
- name: namespace
value: $(params.namespace)
workspaces:
- name: source
workspace: shared-data
EOF
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
generateName: clone-build-push-run-
spec:
serviceAccountName: tekton-deployer
pipelineRef:
name: deploy-infrastructure
podTemplate:
securityContext:
fsGroup: 65532
workspaces:
- name: shared-data
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 1Gi
- name: docker-credentials
secret:
secretName: harbor-push-secret
params:
- name: repo-url
value: https://gitea.pigreco66.it/pigreco/poc.git
- name: image-reference
value: harbor.pigreco66.it/library/nginx:1.30
- name: dockerfile
value: ./container/nginx/dockerfile
- name: namespace
value: poc

View File

@@ -0,0 +1,31 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: longhorn-volv-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
name: volume-test
namespace: default
spec:
containers:
- name: volume-test
image: nginx:stable-alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: volv
mountPath: /data
ports:
- containerPort: 80
volumes:
- name: volv
persistentVolumeClaim:
claimName: longhorn-volv-pvc

66
add-on/poc-testweb.yaml Normal file
View File

@@ -0,0 +1,66 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 250m
memory: 256Mi
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
type: ClusterIP
selector:
app: nginx
ports:
- port: 80 # Porta esposta dal Service
targetPort: 80 # Porta del container NGINX
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-production"
spec:
tls:
- hosts:
- poc.pigreco66.it
secretName: myapp-tls
rules:
- host: poc.pigreco66.it
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80

315
add-on/postgresql.sh Normal file
View File

@@ -0,0 +1,315 @@
kubectl apply --server-side -f https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/release-1.28/releases/cnpg-1.28.0.yaml--force-conflicts
curl -sSfL https://github.com/cloudnative-pg/cloudnative-pg/raw/main/hack/install-cnpg-plugin.sh | sudo sh -s -- -b /usr/local/bin
kubectl create namespace database
database.yaml:
---
apiVersion: v1
kind: Secret
metadata:
name: pg-app-user
namespace: demo-apps
type: kubernetes.io/basic-auth
stringData:
username: admin
password: admin
---
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: pg-test
namespace: demo-apps
spec:
instances: 3
storage:
size: 1Gi
storageClass: csi-rbdfs-sc
walStorage:
storageClass: csi-rbdfs-sc
size: 1Gi
bootstrap:
initdb:
database: testdb
owner: admin
secret:
name: pg-app-user
postgresql:
parameters:
max_connections: "300"
shared_buffers: "1GB"
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "2"
memory: "2Gi"
#test
kubectl run psql-client -n database --rm -it --image=postgres:16 --env="PGPASSWORD=admin" -- psql -h pg-test-rw.demo-apps.svc -U admin -d appdb
kubectl patch pvc pg-test-1-wal -n demo_apps -p '{"spec":{"resources":{"requests":{"storage":"32Gi"}}}}'
backup:
barmanObjectStore:
destinationPath: s3://pg-backups/prod
endpointURL: http://minio.minio.svc:9000
s3Credentials:
accessKeyId:
name: s3-creds
key: ACCESS_KEY
secretAccessKey:
name: s3-creds
key: SECRET_KEY
--- pgadmin -------------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: pgadmin-deployment
spec:
replicas: 1
selector:
matchLabels:
app: pgadmin
template:
metadata:
labels:
app: pgadmin
spec:
containers:
- name: pgadmin
image: dpage/pgadmin4
ports:
- containerPort: 80
env:
- name: PGADMIN_DEFAULT_EMAIL
value: pgadmin@italiadatacenter.com
- name: PGADMIN_DEFAULT_PASSWORD
value: KAYQE1QA7uwUZ8uI
---
apiVersion: v1
kind: Service
metadata:
name: pgadmin-service
spec:
selector:
app: pgadmin
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: demo-route
namespace: demo-apps
spec:
hostnames:
- poc3.italiadatacenter.com
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: pgadmin-service
port: 80
--------------------------------------------------------------------------------
cat <<EOF | kubectl -n database apply -f -
# This StorageClass is optimized for use with CloudNativePG.
# It disables storage-level replication and ensures data is local to the pod.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn-cnpg-strict-local
provisioner: driver.longhorn.io
# allowVolumeExpansion is crucial for scaling database storage without downtime.
allowVolumeExpansion: true
# reclaimPolicy: Delete ensures that when a PVC is deleted, the underlying
# Longhorn volume is also removed, preventing orphaned storage.
reclaimPolicy: Delete
parameters:
# This is the most important setting. We rely on CloudNativePG for replication,
# so we only need one copy at the storage layer to avoid write amplification.
numberOfReplicas: "1"
# dataLocality: strict-local guarantees that the volume data will be stored
# on the same node as the pod that uses it. This is essential for performance
# and for aligning with a true shared-nothing architecture.
dataLocality: "strict-local"
# A longer timeout for stale replicas is suitable for database workloads.
staleReplicaTimeout: "2880" # 48 hours in minutes
# Default filesystem.
fsType: "ext4"
EOF
kubectl cnpg psql pg-devops -n devops
CREATE DATABASE giteadb;
CREATE USER gitea WITH PASSWORD 'KAYQE1QA7uwUZ8uI';
GRANT ALL PRIVILEGES ON DATABASE giteadb TO gitea;
ALTER DATABASE giteadb OWNER TO gitea;
cluster production ready:
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: mycluster
namespace: database
spec:
instances: 3 # → 3 nodi per HA reale
primaryUpdateStrategy: unsupervised
failover: # → Failover automatico
promoteTimeout: 5m
targetPromotionRule: "prefer-high-promotion-score"
# ---------------------------
# STORAGE (PRODUCTION)
# ---------------------------
storage:
size: 200Gi
storageClass: fast-rbd # Ceph, SSD, GP3 ecc.
resizeInUse: true
walStorage: # Consigliato in produzione
size: 50Gi
storageClass: fast-rbd
# ---------------------------
# WAL ARCHIVING (S3/MINIO)
# ---------------------------
walArchive:
enabled: true
destinationPath: "s3://mybucket/wal/"
s3Credentials:
accessKeyId:
name: cnpg-s3-creds
key: ACCESS_KEY_ID
secretAccessKey:
name: cnpg-s3-creds
key: SECRET_ACCESS_KEY
endpointURL: "https://s3.myregion.amazonaws.com"
region: "myregion"
encryption: AES256
# ---------------------------
# BACKUP AUTOMATICI
# ---------------------------
backup:
barmanObjectStore:
destinationPath: "s3://mybucket/basebackup/"
endpointURL: "https://s3.myregion.amazonaws.com"
s3Credentials:
accessKeyId:
name: cnpg-s3-creds
key: ACCESS_KEY_ID
secretAccessKey:
name: cnpg-s3-creds
key: SECRET_ACCESS_KEY
wal:
compression: bzip2
encryption: AES256
retentionPolicy: "30d" # → 30 giorni di retention
monitoring:
enablePodMonitor: true
# ---------------------------
# TLS INTERNO (RACCOMANDATO)
# ---------------------------
certificates:
serverTLSSecret: cnpg-server-tls
clientTLSSecret: cnpg-client-tls
# ---------------------------
# RESOURCE MANAGEMENT
# ---------------------------
resources:
requests:
cpu: "1"
memory: "2Gi"
limits:
cpu: "4"
memory: "8Gi"
# ---------------------------
# ANTI-AFFINITY & PDB
# ---------------------------
affinity:
enablePodAntiAffinity: true
topologyKey: "kubernetes.io/hostname"
podDisruptionBudget:
minAvailable: 2
# ---------------------------
# STARTUP & HEALTH
# ---------------------------
postgresql:
shared_preload_libraries:
- "pg_stat_statements"
- "auto_explain"
parameters:
max_connections: "300"
shared_buffers: "2GB"
effective_cache_size: "6GB"
maintenance_work_mem: "512MB"
wal_compression: "on"
wal_level: "replica"
max_wal_size: "4GB"
checkpoint_timeout: "15min"
synchronous_commit: "remote_apply"
# ---------------------------
# SYNCHRONOUS REPLICATION
# ---------------------------
replication:
synchronous:
mode: " quorum "
number: 1 # One sync replica; others async
# ---------------------------
# SERVICE & NETWORKING
# ---------------------------
service:
type: ClusterIP
primary:
type: ClusterIP
replicas:
type: ClusterIP
# ---------------------------
# ENCRYPTION AT REST (OPZIONALE)
# ---------------------------
encryption:
enabled: true
mode: aes256-gcm

BIN
add-on/python.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -0,0 +1,19 @@
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: rancher
namespace: cattle-system
spec:
hostnames:
- k8s.italiadatacenter.com
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: rancher
port: 80

BIN
add-on/redis.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

82
add-on/redis.sh Normal file
View File

@@ -0,0 +1,82 @@
kubectl create namespace redis
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
cat <<EOF | cat > redisvalues.yaml -
architecture: replication
auth:
enabled: true
password: KAYQE1QA7uwUZ8uI
master:
persistence:
enabled: true
storageClass: csi-rbdfs-sc
size: 5Gi
resources:
requests:
cpu: 100m
memory: 256Mi
replica:
replicaCount: 2
persistence:
enabled: true
storageClass: csi-rbdfs-sc
size: 5Gi
resources:
requests:
cpu: 100m
memory: 256Mi
sentinel:
enabled: true
replicas: 3
resources:
requests:
cpu: 50m
memory: 64Mi
metrics:
enabled: false
EOF
helm install redis bitnami/redis -n redis -f redisvalues.yaml
#test
kubectl run redis-client -n redis --rm -it --image=redis:7.2 -- redis-cli -h redis.redis.svc.cluster.local -a KAYQE1QA7uwUZ8uI
###########################################################################################################################
Redis(R) can be accessed via port 6379 on the following DNS name from within your cluster:
redis.redis.svc.cluster.local for read only operations
For read/write operations, first access the Redis(R) Sentinel cluster, which is available in port 26379 using the same domain name above.
To get your password run:
export REDIS_PASSWORD=$(kubectl get secret --namespace redis redis -o jsonpath="{.data.redis-password}" | base64 -d)
To connect to your Redis(R) server:
1. Run a Redis(R) pod that you can use as a client:
kubectl run --namespace redis redis-client --restart='Never' --env REDIS_PASSWORD=$REDIS_PASSWORD --image registry-1.docker.io/bitnami/redis:latest --command -- sleep infinity
Use the following command to attach to the pod:
kubectl exec --tty -i redis-client \
--namespace redis -- bash
2. Connect using the Redis(R) CLI:
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h redis -p 6379 # Read only operations
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h redis -p 26379 # Sentinel access
To connect to your database from outside the cluster execute the following commands:
kubectl port-forward --namespace redis svc/redis 6379:6379 &
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h 127.0.0.1 -p 6379

View File

@@ -0,0 +1 @@
powershell -ExecutionPolicy Bypass -File .\add-on\validate-scss.ps1 -RootPath "C:\Users\Public\git\limec-frontend\src\"

87
add-on/sonaquebe.txt Normal file
View File

@@ -0,0 +1,87 @@
########### repo helm ################
helm repo add sonarqube https://SonarSource.github.io/helm-chart-sonarqube
helm repo update
########### creazione ns e secret db ################
kubectl create namespace sonarqube
kubectl create secret generic sonarqube-database-cred \
--from-literal=username=sonarqube \
--from-literal=password=KAYQE1QA7uwUZ8uI \
-n sonarqube
########### creazione database ################
kubectl cnpg psql pg-devops -n devops
CREATE DATABASE sonarqube;
CREATE USER sonarqube WITH PASSWORD 'KAYQE1QA7uwUZ8uI';
GRANT ALL PRIVILEGES ON DATABASE sonarqube TO sonarqube;
ALTER DATABASE sonarqube OWNER TO sonarqube;
########### Values.yaml per installazione helm ################
service:
type: ClusterIP
postgresql:
enabled: false
jdbcOverwrite:
enabled: true
jdbcUrl: "jdbc:postgresql://pg-devops-rw.devops.svc.cluster.local:5432/sonarqube"
jdbcUsername: "postgres"
jdbcSecretName: "sonarqube-database-cred"
jdbcSecretPasswordKey: "password"
readinessProbe:
initialDelaySeconds: 300 # Increase initial delay to accommodate the database start time
timeoutSeconds: 60
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
livenessProbe:
initialDelaySeconds: 360 # Ensure the application has enough time to start
timeoutSeconds: 60
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
startupProbe:
initialDelaySeconds: 300 # Allow for sufficient startup time
timeoutSeconds: 60
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
########### installazione helm ################
helm upgrade -f sonarvalues.yaml --install -n sonarqube sonarqube sonarqube/sonarqube --set community.enabled=true,monitoringPasscode="KAYQE1QA7uwUZ8uI"
########### httproute ################
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: sonarqube
namespace: sonarqube
spec:
hostnames:
- sonarqube.italiadatacenter.com
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: sonarqube-sonarqube
port: 9000
admin
$KAYQE1QA7uwUZ8uI

197
add-on/tekton.sh Normal file
View File

@@ -0,0 +1,197 @@
kubectl create namespace tekton-pipelines
kubectl apply -f https://infra.tekton.dev/tekton-releases/pipeline/previous/v1.7.0/release.yaml
kubectl edit cm feature-flags -n tekton-pipelines
data:
enable-api-fields: "stable"
disable-affinity-assistant: "false"
enable-tekton-oci-bundles: "true"
enable-custom-tasks: "true"
kubectl edit cm config-defaults -n tekton-pipelines
data:
default-timeout-minutes: "60"
default-service-account: "tekton-sa"
cat <<EOF | cat > tekton-sa.yaml -
apiVersion: v1
kind: ServiceAccount
metadata:
name: tekton-sa
namespace: tekton-pipelines
EOF
kubectl apply -f tekton-sa.yaml
#STEP 1 Creare Robot Account in Harbor
#Harbor UI → Projects → (es. library o apps) → Robot Accounts
#Nome: k8s-pull
#Permessi:
#✔️ FULL permission
kubectl create secret docker-registry harbor-regcred \
-n tekton-pipelines \
--docker-server=harbor.italiadatacenter.com \
--docker-username=robot$tekton \
--docker-password=pyyMRe2kRIp6LQmIh8jaSWquL1mDtz04 \
--docker-email=harbor@italiadatacenter.com
cat <<EOF > config.json
{
"auths": {
"harbor.italiadatacenter.com": {
"username": "robot\$tekton",
"password": "pyyMRe2kRIp6LQmIh8jaSWquL1mDtz04",
"email": "harbor@italiadatacenter.com",
"auth": "$(echo -n 'robot$tekton:pyyMRe2kRIp6LQmIh8jaSWquL1mDtz04' | base64)"
}
}
}
EOF
kubectl create secret generic harbor-push-secret -n tekton-pipelines --from-file=config.json=config.json
kubectl patch sa tekton-sa \
-n tekton-pipelines \
-p '{"imagePullSecrets":[{"name":"harbor-regcred"}]}'
cat <<EOF | cat > tekton-workspace.yaml -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: tekton-workspace
namespace: tekton-pipelines
spec:
accessModes:
- ReadWriteOnce
storageClassName: csi-rbdfs-sc
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f tekton-workspace.yaml -n tekton-pipelines
#Tekton Triggers
kubectl apply -f https://storage.googleapis.com/tekton-releases/triggers/latest/release.yaml -n tekton-pipelines
#Tekton Dashboard
kubectl apply -f https://storage.googleapis.com/tekton-releases/dashboard/latest/release.yaml -n tekton-pipelines
cat <<EOF | cat > tekton-ingress.yaml -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tekton-dashboard
namespace: tekton-pipelines
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-production"
spec:
tls:
- hosts:
- tekton.pigreco66.it
secretName: myapp-tls
rules:
- host: tekton.pigreco66.it
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tekton-dashboard
port:
number: 9097
EOF
cat <<EOF | cat > tekton-httproute.yaml -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: tekton
namespace: tekton-pipelines
spec:
hostnames:
- tekton.italiadatacenter.com
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: tekton-dashboard
port: 9097
EOF
kubectl apply -f tekton-httproute.yaml -n tekton-pipelines
kubectl label namespace tekton-pipelines \
pod-security.kubernetes.io/enforce=privileged \
pod-security.kubernetes.io/audit=privileged \
pod-security.kubernetes.io/warn=privileged \
--overwrite
#installazione cli
curl -LO https://github.com/tektoncd/cli/releases/download/v0.43.0/tkn_0.43.0_Linux_x86_64.tar.gz
tar xvf tkn_0.43.0_Linux_x86_64.tar.gz
sudo mv tkn /usr/local/bin/
#TEST
cat <<EOF | cat > tekton-test.yaml -
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: hello
namespace: tekton-pipelines
spec:
steps:
- name: echo
image: alpine
script: |
echo "Tekton OK"
---
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: hello-pipeline
namespace: tekton-pipelines
spec:
tasks:
- name: hello
taskRef:
name: hello
---
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
name: hello-pipeline-run
spec:
pipelineRef:
name: hello-pipeline
params:
- name: username
value: "Tekton"
EOF
kubectl apply -f tekton-test.yaml -n tekton-pipelines

134
add-on/validate-scss.ps1 Normal file
View File

@@ -0,0 +1,134 @@
param (
[Parameter(Mandatory = $true)]
[string]$RootPath,
[string]$NpxSassPackage = "sass@1.77.8",
[bool]$NoErrorCss = $true
)
$ErrorActionPreference = 'Stop'
try {
$resolvedRoot = (Resolve-Path -Path $RootPath).Path
} catch {
Write-Host "ERROR: Root path not found: $RootPath" -ForegroundColor Red
exit 2
}
Write-Host "Scanning SCSS files in: $resolvedRoot" -ForegroundColor Cyan
function Get-SassRunner {
param(
[Parameter(Mandatory = $true)]
[string]$StartPath,
[Parameter(Mandatory = $true)]
[string]$PinnedNpxPackage
)
$current = $StartPath
while ($true) {
$localSass = Join-Path $current "node_modules\\.bin\\sass.cmd"
if (Test-Path $localSass) {
return @{
Command = $localSass
PrefixArgs = @()
Source = "local"
}
}
$parent = Split-Path -Path $current -Parent
if (-not $parent -or $parent -eq $current) {
break
}
$current = $parent
}
$npxCmd = Get-Command npx.cmd -ErrorAction SilentlyContinue
if ($npxCmd) {
cmd /d /c "npx -y -p $PinnedNpxPackage sass --version >nul 2>&1" | Out-Null
if ($LASTEXITCODE -eq 0) {
return @{
Command = $npxCmd.Source
PrefixArgs = @("-y", "-p", $PinnedNpxPackage, "sass")
Source = "npx:$PinnedNpxPackage"
}
}
}
$sassCmd = Get-Command sass.cmd -ErrorAction SilentlyContinue
if ($sassCmd) {
cmd /d /c "sass --version >nul 2>&1" | Out-Null
if ($LASTEXITCODE -eq 0) {
return @{
Command = $sassCmd.Source
PrefixArgs = @()
Source = "global"
}
}
}
return $null
}
$sassRunner = Get-SassRunner -StartPath $resolvedRoot -PinnedNpxPackage $NpxSassPackage
if (-not $sassRunner) {
Write-Host "ERROR: No working Sass runner found (local sass.cmd, global sass, or npx sass)." -ForegroundColor Red
exit 3
}
Write-Host "Using Sass runner: $($sassRunner.Source) [$($sassRunner.Command)]" -ForegroundColor DarkCyan
# Find all SCSS files recursively from the given root path.
$files = Get-ChildItem -Path $resolvedRoot -Recurse -File -Filter "*.scss"
if ($files.Count -eq 0) {
Write-Host "No SCSS files found." -ForegroundColor Yellow
exit 0
}
$hasErrors = $false
$checkedCount = 0
$errorCount = 0
foreach ($file in $files) {
$checkedCount += 1
Write-Host "Checking: $($file.FullName)" -ForegroundColor Gray
# Syntax-only validation: compile to NUL to avoid creating/opening any CSS files.
$sassArgs = @($sassRunner.PrefixArgs) + @('--no-source-map', '--style=compressed', '--quiet', "--load-path=$resolvedRoot")
if ($NoErrorCss) {
$sassArgs += '--no-error-css'
}
$sassArgs += @($file.FullName, 'NUL')
$previousErrorAction = $ErrorActionPreference
$ErrorActionPreference = 'Continue'
try {
$result = & $sassRunner.Command @sassArgs 2>&1 | Out-String
$exitCode = $LASTEXITCODE
} finally {
$ErrorActionPreference = $previousErrorAction
}
if ($exitCode -ne 0) {
$hasErrors = $true
$errorCount += 1
Write-Host ""
Write-Host "ERROR in $($file.FullName)" -ForegroundColor Red
Write-Host $result -ForegroundColor Yellow
Write-Host "----------------------------------------"
}
}
Write-Host ""
Write-Host "Checked files: $checkedCount"
if (-not $hasErrors) {
Write-Host "All SCSS files are syntactically valid." -ForegroundColor Green
exit 0
}
Write-Host "SCSS files with errors: $errorCount" -ForegroundColor Red
exit 1

BIN
add-on/vol.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

27
addworker.sh Normal file
View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -euo pipefail
FILE="$1"
NEW_LINE="$2"
if [[ ! -f "$FILE" ]]; then
echo "❌ File not found: $FILE"
exit 1
fi
if ! grep -q "^tls-san:" "$FILE"; then
echo "❌ 'tls-san:' not found in $FILE"
exit 1
fi
awk -v newline="$NEW_LINE" '
{
print
if ($0 ~ /^tls-san:/) {
print newline
}
}
' "$FILE" > "${FILE}.tmp" && mv "${FILE}.tmp" "$FILE"
echo "✅ Line added after tls-san:"
echo " $NEW_LINE"

View File

@@ -0,0 +1,34 @@
#!/usr/bin/env bash
set -euo pipefail
# Usa properties.env nella directory corrente, oppure un path passato come primo argomento.
PROPERTIES_FILE="${1:-properties.env}"
if [[ ! -f "$PROPERTIES_FILE" ]]; then
echo "Errore: file non trovato: $PROPERTIES_FILE" >&2
exit 1
fi
# Estrae endpoint ignorando commenti e spazi, supportando anche endpoint = valore
endpoint_raw="$({ grep -E '^[[:space:]]*endpoint[[:space:]]*=' "$PROPERTIES_FILE" | tail -n1 || true; } | sed -E 's/^[[:space:]]*endpoint[[:space:]]*=[[:space:]]*//')"
# Rimuove eventuali virgolette e spazi ai bordi
endpoint="$(echo "$endpoint_raw" | sed -E 's/^[[:space:]"\x27]+//; s/[[:space:]"\x27]+$//')"
if [[ -z "$endpoint" ]]; then
echo "La chiave endpoint non e valorizzata in $PROPERTIES_FILE" >&2
exit 1
fi
# Per calcolare il token usa host pulito (senza schema e path)
host_for_token="${endpoint#*://}"
host_for_token="${host_for_token%%/*}"
token="${host_for_token%%.*}"
if [[ -z "$token" ]]; then
echo "Impossibile estrarre il token da endpoint: $endpoint" >&2
exit 1
fi
# Esegue lo script richiesto con la stringa costruita
/root/work/pipeline/add-listener.sh "$endpoint https-$token $token-secret"

189
demo.yaml Normal file
View File

@@ -0,0 +1,189 @@
---DEMO ---
---
apiVersion: v1
kind: Namespace
metadata:
name: demo-apps
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-v1
namespace: demo-apps
spec:
replicas: 2
selector:
matchLabels:
app: demo
version: v1
template:
metadata:
labels:
app: demo
version: v1
spec:
containers:
- name: app
image: hashicorp/http-echo
args:
- "-text=Hello from App v1"
ports:
- containerPort: 5678
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-v2
namespace: demo-apps
spec:
replicas: 2
selector:
matchLabels:
app: demo
version: v2
template:
metadata:
labels:
app: demo
version: v2
spec:
containers:
- name: app
image: hashicorp/http-echo
args:
- "-text=Hello from App v2"
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: app-v1
namespace: demo-apps
spec:
selector:
app: demo
version: v1
ports:
- port: 80
targetPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: app-v2
namespace: demo-apps
spec:
selector:
app: demo
version: v2
ports:
- port: 80
targetPort: 5678
---- HTTP ROUTE ---
kind: HTTPRoute
metadata:
name: demo-route
namespace: demo-apps
spec:
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: app-v1
port: 80
***to add for https ***
# HTTP'S Listener (Add Muliple HTTPS listner)
- name: https-api-artha-link
port: 443
protocol: HTTPS
hostname: domain1.com
tls:
mode: Terminate
certificateRefs:
- kind: Secret
name: domain1-ssl
namespace: default
allowedRoutes:
namespaces:
from: All
- name: https-app-artha-link
port: 443
protocol: HTTPS
hostname: domain2.com
tls:
mode: Terminate
certificateRefs:
- kind: Secret
name: domain2-ssl
namespace: default
allowedRoutes:
namespaces:
from: All
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: demo-route
namespace: demo-apps
spec:
parentRefs:
- name: main-gateway
namespace: nginx-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: app-v1
port: 80
kubectl create -n demo-apps -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: swiss-army-knife
labels:
app: swiss-army-knife
spec:
containers:
- name: swiss-army-knife
image: leodotcloud/swiss-army-knife:latest
command: ["/bin/sleep", "3650d"]
imagePullPolicy: IfNotPresent
restartPolicy: Always
EOF
kubectl exec -n demo_apps swiss-army-knife -it -- /bin/bash

2377
doc.txt Normal file

File diff suppressed because it is too large Load Diff

0
dockerbuild.sh Normal file
View File

134
gateway.yaml Normal file
View File

@@ -0,0 +1,134 @@
apiVersion: v1
items:
- apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: main-gateway
namespace: nginx-gateway
spec:
gatewayClassName: nginx
listeners:
- allowedRoutes:
namespaces:
from: All
name: http-all
port: 80
protocol: HTTP
- allowedRoutes:
namespaces:
from: All
hostname: poc1.italiadatacenter.com
name: https
port: 443
protocol: HTTPS
tls:
certificateRefs:
- group: ""
kind: Secret
name: poc1-secret
mode: Terminate
- allowedRoutes:
namespaces:
from: All
hostname: poc2.italiadatacenter.com
name: https2
port: 443
protocol: HTTPS
tls:
certificateRefs:
- group: ""
kind: Secret
name: poc2-secret
mode: Terminate
- allowedRoutes:
namespaces:
from: All
hostname: k8s.italiadatacenter.com
name: https3
port: 443
protocol: HTTPS
tls:
certificateRefs:
- group: ""
kind: Secret
name: k8s-secret
mode: Terminate
- allowedRoutes:
namespaces:
from: All
hostname: poc3.italiadatacenter.com
name: https4
port: 443
protocol: HTTPS
tls:
certificateRefs:
- group: ""
kind: Secret
name: poc3-secret
mode: Terminate
- allowedRoutes:
namespaces:
from: All
hostname: git.italiadatacenter.com
name: https5
port: 443
protocol: HTTPS
tls:
certificateRefs:
- group: ""
kind: Secret
name: git-secret
mode: Terminate
- allowedRoutes:
namespaces:
from: All
hostname: harbor.italiadatacenter.com
name: https6
port: 443
protocol: HTTPS
tls:
certificateRefs:
- group: ""
kind: Secret
name: harbor-secret
mode: Terminate
- allowedRoutes:
namespaces:
from: All
hostname: git.pigreco66.it
name: httpsp66
port: 443
protocol: HTTPS
tls:
certificateRefs:
- group: ""
kind: Secret
name: p66-secret
mode: Terminate
- allowedRoutes:
namespaces:
from: All
hostname: tekton.italiadatacenter.com
name: https-grafana
port: 443
protocol: HTTPS
tls:
certificateRefs:
- group: ""
kind: Secret
name: grafana-secret
mode: Terminate
- allowedRoutes:
namespaces:
from: All
hostname: prometheus.italiadatacenter.com
name: https-prometheus
port: 443
protocol: HTTPS
tls:
certificateRefs:
- group: ""
kind: Secret
name: prometheus-secret
mode: Terminate

289
haproxy.html Normal file
View File

@@ -0,0 +1,289 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>Statistics Report for HAProxy on POC-Kube-Balancer</title>
<link rel="icon" href="data:,">
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<style type="text/css"><!--
body { font-family: arial, helvetica, sans-serif; font-size: 12px; font-weight: normal; color: black; background: white;}
th,td { font-size: 10px;}
h1 { font-size: x-large; margin-bottom: 0.5em;}
h2 { font-family: helvetica, arial; font-size: x-large; font-weight: bold; font-style: italic; color: #6020a0; margin-top: 0em; margin-bottom: 0em;}
h3 { font-family: helvetica, arial; font-size: 16px; font-weight: bold; color: #b00040; background: #e8e8d0; margin-top: 0em; margin-bottom: 0em;}
li { margin-top: 0.25em; margin-right: 2em;}
.hr {margin-top: 0.25em; border-color: black; border-bottom-style: solid;}
.titre {background: #20D0D0;color: #000000; font-weight: bold; text-align: center;}
.total {background: #20D0D0;color: #ffff80;}
.frontend {background: #e8e8d0;}
.socket {background: #d0d0d0;}
.backend {background: #e8e8d0;}
.active_down {background: #ff9090;}
.active_going_up {background: #ffd020;}
.active_going_down {background: #ffffa0;}
.active_up {background: #c0ffc0;}
.active_nolb {background: #20a0ff;}
.active_draining {background: #20a0FF;}
.active_no_check {background: #e0e0e0;}
.backup_down {background: #ff9090;}
.backup_going_up {background: #ff80ff;}
.backup_going_down {background: #c060ff;}
.backup_up {background: #b0d0ff;}
.backup_nolb {background: #90b0e0;}
.backup_draining {background: #cc9900;}
.backup_no_check {background: #e0e0e0;}
.maintain {background: #c07820;}
.rls {letter-spacing: 0.2em; margin-right: 1px;}
a.px:link {color: #ffff40; text-decoration: none;}a.px:visited {color: #ffff40; text-decoration: none;}a.px:hover {color: #ffffff; text-decoration: none;}a.lfsb:link {color: #000000; text-decoration: none;}a.lfsb:visited {color: #000000; text-decoration: none;}a.lfsb:hover {color: #505050; text-decoration: none;}
table.tbl { border-collapse: collapse; border-style: none;}
table.tbl td { text-align: right; border-width: 1px 1px 1px 1px; border-style: solid solid solid solid; padding: 2px 3px; border-color: gray; white-space: nowrap;}
table.tbl td.ac { text-align: center;}
table.tbl th { border-width: 1px; border-style: solid solid solid solid; border-color: gray;}
table.tbl th.pxname { background: #b00040; color: #ffff40; font-weight: bold; border-style: solid solid none solid; padding: 2px 3px; white-space: nowrap;}
table.tbl th.empty { border-style: none; empty-cells: hide; background: white;}
table.tbl th.desc { background: white; border-style: solid solid none solid; text-align: left; padding: 2px 3px;}
table.lgd { border-collapse: collapse; border-width: 1px; border-style: none none none solid; border-color: black;}
table.lgd td { border-width: 1px; border-style: solid solid solid solid; border-color: gray; padding: 2px;}
table.lgd td.noborder { border-style: none; padding: 2px; white-space: nowrap;}
table.det { border-collapse: collapse; border-style: none; }
table.det th { text-align: left; border-width: 0px; padding: 0px 1px 0px 0px; font-style:normal;font-size:11px;font-weight:bold;font-family: sans-serif;}
table.det td { text-align: right; border-width: 0px; padding: 0px 0px 0px 4px; white-space: nowrap; font-style:normal;font-size:11px;font-weight:normal;}
u {text-decoration:none; border-bottom: 1px dotted black;}
div.tips {
display:block;
visibility:hidden;
z-index:2147483647;
position:absolute;
padding:2px 4px 3px;
background:#f0f060; color:#000000;
border:1px solid #7040c0;
white-space:nowrap;
font-style:normal;font-size:11px;font-weight:normal;
-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;
-moz-box-shadow:gray 2px 2px 3px;-webkit-box-shadow:gray 2px 2px 3px;box-shadow:gray 2px 2px 3px;
}
u:hover div.tips {visibility:visible;}
@media (prefers-color-scheme: dark) {
body { font-family: arial, helvetica, sans-serif; font-size: 12px; font-weight: normal; color: #e8e6e3; background: #131516;}
h1 { color: #a265e0!important; }
h2 { color: #a265e0; }
h3 { color: #ff5190; background-color: #3e3e1f; }
a { color: #3391ff; }
input { background-color: #2f3437; }
.hr { border-color: #8c8273; }
.titre { background-color: #1aa6a6; color: #e8e6e3; }
.frontend {background: #2f3437;}
.socket {background: #2a2d2f;}
.backend {background: #2f3437;}
.active_down {background: #760000;}
.active_going_up {background: #b99200;}
.active_going_down {background: #6c6c00;}
.active_up {background: #165900;}
.active_nolb {background: #006ab9;}
.active_draining {background: #006ab9;}
.active_no_check {background: #2a2d2f;}
.backup_down {background: #760000;}
.backup_going_up {background: #7f007f;}
.backup_going_down {background: #580092;}
.backup_up {background: #2e3234;}
.backup_nolb {background: #1e3c6a;}
.backup_draining {background: #a37a00;}
.backup_no_check {background: #2a2d2f;}
.maintain {background: #9a601a;}
a.px:link {color: #d8d83b; text-decoration: none;}
a.px:visited {color: #d8d83b; text-decoration: none;}
a.px:hover {color: #ffffff; text-decoration: none;}
a.lfsb:link {color: #e8e6e3; text-decoration: none;}
a.lfsb:visited {color: #e8e6e3; text-decoration: none;}
a.lfsb:hover {color: #b5afa6; text-decoration: none;}
table.tbl th.empty { background-color: #181a1b; }
table.tbl th.desc { background: #181a1b; }
table.tbl th.pxname { background-color: #8d0033; color: #ffff46; }
table.tbl th { border-color: #808080; }
table.tbl td { border-color: #808080; }
u {text-decoration:none; border-bottom: 1px dotted #e8e6e3;}
div.tips {
background:#8e8e0d;
color:#e8e6e3;
border-color: #4e2c86;
-moz-box-shadow: #60686c 2px 2px 3px;
-webkit-box-shadow: #60686c 2px 2px 3px;
box-shadow: #60686c 2px 2px 3px;
}
}
-->
</style></head>
<body><h1><a href="http://www.haproxy.org/" style="text-decoration: none;">HAProxy version 2.8.16-0ubuntu0.24.04.2, released 2026/04/15</a></h1>
<h2>Statistics Report for pid 15647 on POC-Kube-Balancer</h2>
<hr width="100%" class="hr">
<h3>&gt; General process information</h3>
<table border=0><tr><td align="left" nowrap width="1%">
<p><b>pid = </b> 15647 (process #1, nbproc = 1, nbthread = 2)<br>
<b>uptime = </b> 0d 16h25m19s; warnings = 2<br>
<b>system limits:</b> memmax = unlimited; ulimit-n = 40082<br>
<b>maxsock = </b> 40082; <b>maxconn = </b> 20000; <b>reached = </b> 0; <b>maxpipes = </b> 0<br>
current conns = 7; current pipes = 0/0; conn rate = 1/sec; bit rate = 20.393 kbps<br>
Running tasks: 0/61; idle = 100 %<br>
</td><td align="center" nowrap>
<table class="lgd"><tr>
<td class="active_up">&nbsp;</td><td class="noborder">active UP </td><td class="backup_up">&nbsp;</td><td class="noborder">backup UP </td></tr><tr>
<td class="active_going_down"></td><td class="noborder">active UP, going down </td><td class="backup_going_down"></td><td class="noborder">backup UP, going down </td></tr><tr>
<td class="active_going_up"></td><td class="noborder">active DOWN, going up </td><td class="backup_going_up"></td><td class="noborder">backup DOWN, going up </td></tr><tr>
<td class="active_down"></td><td class="noborder">active or backup DOWN &nbsp;</td><td class="active_no_check"></td><td class="noborder">not checked </td></tr><tr>
<td class="maintain"></td><td class="noborder" colspan="3">active or backup DOWN for maintenance (MAINT) &nbsp;</td></tr><tr>
<td class="active_draining"></td><td class="noborder" colspan="3">active or backup SOFT STOPPED for maintenance &nbsp;</td></tr></table>
Note: "NOLB"/"DRAIN" = UP with load-balancing disabled.</td><td align="left" valign="top" nowrap width="1%"><b>Display option:</b><ul style="margin-top: 0.25em;"><li><form method="GET">Scope : <input value="" name="scope" size="8" maxlength="20" tabindex="1"/></form>
<li><a href="/stats;up">Hide 'DOWN' servers</a><br>
<li><a href="/stats;norefresh">Disable refresh</a><br>
<li><a href="/stats">Refresh now</a><br>
<li><a href="/stats;csv;norefresh">CSV export</a><br>
<li><a href="/stats;json;norefresh">JSON export</a> (<a href="/stats;json-schema">schema</a>)<br>
</ul></td><td align="left" valign="top" nowrap width="1%"><b>External resources:</b><ul style="margin-top: 0.25em;">
<li><a href="http://www.haproxy.org/">Primary site</a><br>
<li><a href="http://www.haproxy.org/#down">Updates (v2.8)</a><br>
<li><a href="http://www.haproxy.org/#docs">Online manual</a><br>
</ul></td></tr></table>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="rke2_registration_frontend"></a><a class=px href="#rke2_registration_frontend">rke2_registration_frontend</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="frontend"><td class=ac><a name="rke2_registration_frontend/Frontend"></a><a class=lfsb href="#rke2_registration_frontend/Frontend">Frontend</a></td><td colspan=3></td><td><u>0<div class=tips><table class=det><tr><th>Current connection rate:</th><td>0/s</td></tr><tr><th>Current session rate:</th><td>0/s</td></tr></table></div></u></td><td><u>0<div class=tips><table class=det><tr><th>Max connection rate:</th><td>0/s</td></tr><tr><th>Max session rate:</th><td>0/s</td></tr></table></div></u></td><td>-</td><td>0</td><td>0</td><td>2<span class="rls">0</span>000</td><td><u>0<div class=tips><table class=det><tr><th>Cum. connections:</th><td>0</td></tr><tr><th>Cum. sessions:</th><td>0</td></tr></table></div></u></td><td></td><td></td><td>0</td><td>0<div class=tips><table class=det><tr><th>Response bytes in:</th><td>0</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td>0</td><td></td><td></td><td></td><td></td><td class=ac>OPEN</td><td class=ac colspan=8></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="rke2_registration_backend"></a><a class=px href="#rke2_registration_backend">rke2_registration_backend</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="active_up"><td class=ac><a name="rke2_registration_backend/POC-Master0"></a><a class=lfsb href="#rke2_registration_backend/POC-Master0">POC-Master0</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>0</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>0</td><td>-</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>?</td><td>0</td><td>0</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 0 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="rke2_registration_backend/POC-Master1"></a><a class=lfsb href="#rke2_registration_backend/POC-Master1">POC-Master1</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>0</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>0</td><td>-</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>?</td><td>0</td><td>0</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 0 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="rke2_registration_backend/POC-Master2"></a><a class=lfsb href="#rke2_registration_backend/POC-Master2">POC-Master2</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>0</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>0</td><td>-</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>?</td><td>0</td><td>0</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 0 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="backend"><td class=ac><a name="rke2_registration_backend/Backend"></a><a class=lfsb href="#rke2_registration_backend/Backend">Backend</a></td><td>0</td><td>0</td><td></td><td>0</td><td>0</td><td></td><td>0</td><td>0</td><td><span class="rls">2</span>000</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>?</td><td>0</td><td>0<div class=tips><table class=det><tr><th>Response bytes in:</th><td>0</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 0 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac>&nbsp;</td><td class=ac>3/3</td><td class=ac>3</td><td class=ac>0</td><td class=ac>&nbsp;</td><td>0</td><td>0s</td><td></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="k8s_api_frontend"></a><a class=px href="#k8s_api_frontend">k8s_api_frontend</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="frontend"><td class=ac><a name="k8s_api_frontend/Frontend"></a><a class=lfsb href="#k8s_api_frontend/Frontend">Frontend</a></td><td colspan=3></td><td><u>0<div class=tips><table class=det><tr><th>Current connection rate:</th><td>0/s</td></tr><tr><th>Current session rate:</th><td>0/s</td></tr></table></div></u></td><td><u>0<div class=tips><table class=det><tr><th>Max connection rate:</th><td>0/s</td></tr><tr><th>Max session rate:</th><td>0/s</td></tr></table></div></u></td><td>-</td><td>0</td><td>0</td><td>2<span class="rls">0</span>000</td><td><u>0<div class=tips><table class=det><tr><th>Cum. connections:</th><td>0</td></tr><tr><th>Cum. sessions:</th><td>0</td></tr></table></div></u></td><td></td><td></td><td>0</td><td>0<div class=tips><table class=det><tr><th>Response bytes in:</th><td>0</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td>0</td><td></td><td></td><td></td><td></td><td class=ac>OPEN</td><td class=ac colspan=8></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="k8s_api_backend"></a><a class=px href="#k8s_api_backend">k8s_api_backend</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="active_up"><td class=ac><a name="k8s_api_backend/POC-Master0"></a><a class=lfsb href="#k8s_api_backend/POC-Master0">POC-Master0</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>0</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>0</td><td>-</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>?</td><td>0</td><td>0</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 0 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="k8s_api_backend/POC-Master1"></a><a class=lfsb href="#k8s_api_backend/POC-Master1">POC-Master1</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>0</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>0</td><td>-</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>?</td><td>0</td><td>0</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 0 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="k8s_api_backend/POC-Master2"></a><a class=lfsb href="#k8s_api_backend/POC-Master2">POC-Master2</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>0</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>0</td><td>-</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>?</td><td>0</td><td>0</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 0 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="backend"><td class=ac><a name="k8s_api_backend/Backend"></a><a class=lfsb href="#k8s_api_backend/Backend">Backend</a></td><td>0</td><td>0</td><td></td><td>0</td><td>0</td><td></td><td>0</td><td>0</td><td><span class="rls">2</span>000</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>?</td><td>0</td><td>0<div class=tips><table class=det><tr><th>Response bytes in:</th><td>0</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 0 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac>&nbsp;</td><td class=ac>3/3</td><td class=ac>3</td><td class=ac>0</td><td class=ac>&nbsp;</td><td>0</td><td>0s</td><td></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="stats"></a><a class=px href="#stats">stats</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="frontend"><td class=ac><a name="stats/Frontend"></a><a class=lfsb href="#stats/Frontend">Frontend</a></td><td colspan=3></td><td><u>1<div class=tips><table class=det><tr><th>Current connection rate:</th><td>1/s</td></tr><tr><th>Current session rate:</th><td>1/s</td></tr><tr><th>Current request rate:</th><td>1/s</td></tr></table></div></u></td><td><u>1<div class=tips><table class=det><tr><th>Max connection rate:</th><td>1/s</td></tr><tr><th>Max session rate:</th><td>1/s</td></tr><tr><th>Max request rate:</th><td>1/s</td></tr></table></div></u></td><td>-</td><td>1</td><td>1</td><td>2<span class="rls">0</span>000</td><td><u>5<div class=tips><table class=det><tr><th>Cum. connections:</th><td>5</td></tr><tr><th>Cum. sessions:</th><td>5</td></tr><tr><th>- HTTP/1 sessions:</th><td>5</td></tr><tr><th>- HTTP/2 sessions:</th><td>0</td></tr><tr><th>- HTTP/3 sessions:</th><td>0</td></tr><tr><th>- other sessions:</th><td>0</td></tr><tr><th>Cum. HTTP requests:</th><td>5</td></tr><tr><th>- HTTP/1 requests:</th><td>5</td></tr><tr><th>- HTTP/2 requests:</th><td>0</td></tr><tr><th>- HTTP/3 requests:</th><td>0</td></tr><tr><th>- other requests:</th><td>0</td></tr><tr><th>- HTTP 1xx responses:</th><td>0</td></tr><tr><th>- HTTP 2xx responses:</th><td>3</td></tr><tr><th>&nbsp;&nbsp;Compressed 2xx:</th><td>0</td><td>(0%)</td></tr><tr><th>- HTTP 3xx responses:</th><td>0</td></tr><tr><th>- HTTP 4xx responses:</th><td>1</td></tr><tr><th>- HTTP 5xx responses:</th><td>0</td></tr><tr><th>- other responses:</th><td>0</td></tr><tr><th>Intercepted requests:</th><td>5</td></tr><tr><th>Cache lookups:</th><td>0</td></tr><tr><th>Cache hits:</th><td>0</td><td>(0%)</td></tr><tr><th>Failed hdr rewrites:</th><td>0</td></tr><tr><th>Internal errors:</th><td>0</td></tr></table></div></u></td><td></td><td></td><td>445</td><td>26<span class="rls">6</span>919<div class=tips><table class=det><tr><th>Response bytes in:</th><td>26<span class="rls">6</span>919</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td>0</td><td></td><td></td><td></td><td></td><td class=ac>OPEN</td><td class=ac colspan=8></td></tr><tr class="backend"><td class=ac><a name="stats/Backend"></a><a class=lfsb href="#stats/Backend">Backend</a></td><td>0</td><td>0</td><td></td><td>0</td><td>0</td><td></td><td>0</td><td>0</td><td><span class="rls">2</span>000</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th>New connections:</th><td>0</td></tr><tr><th>Reused connections:</th><td>0</td><td>(0%)</td></tr><tr><th>Cum. HTTP requests:</th><td>0</td></tr><tr><th>- HTTP 1xx responses:</th><td>0</td></tr><tr><th>- HTTP 2xx responses:</th><td>0</td></tr><tr><th>&nbsp;&nbsp;Compressed 2xx:</th><td>0</td><td>(0%)</td></tr><tr><th>- HTTP 3xx responses:</th><td>0</td></tr><tr><th>- HTTP 4xx responses:</th><td>0</td></tr><tr><th>- HTTP 5xx responses:</th><td>0</td></tr><tr><th>- other responses:</th><td>0</td></tr><tr><th>Cache lookups:</th><td>0</td></tr><tr><th>Cache hits:</th><td>0</td><td>(0%)</td></tr><tr><th>Failed hdr rewrites:</th><td>0</td></tr><tr><th>Internal errors:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Responses time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>0s</td><td>445</td><td>26<span class="rls">6</span>919<div class=tips><table class=det><tr><th>Response bytes in:</th><td>26<span class="rls">6</span>919</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 2 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac>&nbsp;</td><td class=ac>0/0</td><td class=ac>0</td><td class=ac>0</td><td class=ac>&nbsp;</td><td>0</td><td>&nbsp;</td><td></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="nginx_frontend_443"></a><a class=px href="#nginx_frontend_443">nginx_frontend_443</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="frontend"><td class=ac><a name="nginx_frontend_443/Frontend"></a><a class=lfsb href="#nginx_frontend_443/Frontend">Frontend</a></td><td colspan=3></td><td><u>0<div class=tips><table class=det><tr><th>Current connection rate:</th><td>0/s</td></tr><tr><th>Current session rate:</th><td>0/s</td></tr></table></div></u></td><td><u>32<div class=tips><table class=det><tr><th>Max connection rate:</th><td>32/s</td></tr><tr><th>Max session rate:</th><td>32/s</td></tr></table></div></u></td><td>-</td><td>2</td><td>34</td><td>2<span class="rls">0</span>000</td><td><u>467<div class=tips><table class=det><tr><th>Cum. connections:</th><td>467</td></tr><tr><th>Cum. sessions:</th><td>467</td></tr></table></div></u></td><td></td><td></td><td><span class="rls">3</span>22<span class="rls">9</span>730</td><td>1<span class="rls">0</span>17<span class="rls">2</span>550<div class=tips><table class=det><tr><th>Response bytes in:</th><td>1<span class="rls">0</span>17<span class="rls">2</span>550</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td>0</td><td></td><td></td><td></td><td></td><td class=ac>OPEN</td><td class=ac colspan=8></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="nginx_frontend_80"></a><a class=px href="#nginx_frontend_80">nginx_frontend_80</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="frontend"><td class=ac><a name="nginx_frontend_80/Frontend"></a><a class=lfsb href="#nginx_frontend_80/Frontend">Frontend</a></td><td colspan=3></td><td><u>0<div class=tips><table class=det><tr><th>Current connection rate:</th><td>0/s</td></tr><tr><th>Current session rate:</th><td>0/s</td></tr></table></div></u></td><td><u>13<div class=tips><table class=det><tr><th>Max connection rate:</th><td>13/s</td></tr><tr><th>Max session rate:</th><td>13/s</td></tr></table></div></u></td><td>-</td><td>0</td><td>13</td><td>2<span class="rls">0</span>000</td><td><u><span class="rls">2</span>114<div class=tips><table class=det><tr><th>Cum. connections:</th><td><span class="rls">2</span>114</td></tr><tr><th>Cum. sessions:</th><td><span class="rls">2</span>114</td></tr></table></div></u></td><td></td><td></td><td><span class="rls">1</span>14<span class="rls">9</span>352</td><td><span class="rls">3</span>72<span class="rls">1</span>025<div class=tips><table class=det><tr><th>Response bytes in:</th><td><span class="rls">3</span>72<span class="rls">1</span>025</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td>1</td><td></td><td></td><td></td><td></td><td class=ac>OPEN</td><td class=ac colspan=8></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="nginx_backend_80"></a><a class=px href="#nginx_backend_80">nginx_backend_80</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="active_up"><td class=ac><a name="nginx_backend_80/POC-Master0"></a><a class=lfsb href="#nginx_backend_80/POC-Master0">POC-Master0</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>4</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>4</td><td>-</td><td><u>705<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>705</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>1 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>8<span class="rls">5</span>512 / 762</td><td>ms</td></tr></table></div></u></td><td>705</td><td>49s</td><td>40<span class="rls">2</span>634</td><td>64<span class="rls">1</span>847</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 11 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="nginx_backend_80/POC-Master1"></a><a class=lfsb href="#nginx_backend_80/POC-Master1">POC-Master1</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>5</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>5</td><td>-</td><td><u>704<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>704</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td><span class="rls">1</span>441 / 3</td><td>ms</td></tr><tr><th>- Total time:</th><td>5<span class="rls">0</span>001 / 519</td><td>ms</td></tr></table></div></u></td><td>704</td><td>1m39s</td><td>35<span class="rls">8</span>180</td><td>45<span class="rls">3</span>761</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 4 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="nginx_backend_80/POC-Master2"></a><a class=lfsb href="#nginx_backend_80/POC-Master2">POC-Master2</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>4</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>4</td><td>-</td><td><u>704<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>704</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>1 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>8<span class="rls">3</span>147 / <span class="rls">1</span>152</td><td>ms</td></tr></table></div></u></td><td>704</td><td>49s</td><td>38<span class="rls">8</span>538</td><td><span class="rls">2</span>62<span class="rls">5</span>417</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 12 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="backend"><td class=ac><a name="nginx_backend_80/Backend"></a><a class=lfsb href="#nginx_backend_80/Backend">Backend</a></td><td>0</td><td>0</td><td></td><td>0</td><td>13</td><td></td><td>0</td><td>13</td><td><span class="rls">2</span>000</td><td><u><span class="rls">2</span>114<div class=tips><table class=det><tr><th>Cum. sessions:</th><td><span class="rls">2</span>114</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td><span class="rls">1</span>441 / 2</td><td>ms</td></tr><tr><th>- Total time:</th><td>8<span class="rls">5</span>512 / 741</td><td>ms</td></tr></table></div></u></td><td><span class="rls">2</span>113</td><td>49s</td><td><span class="rls">1</span>14<span class="rls">9</span>352</td><td><span class="rls">3</span>72<span class="rls">1</span>025<div class=tips><table class=det><tr><th>Response bytes in:</th><td><span class="rls">3</span>72<span class="rls">1</span>025</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 28 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac>&nbsp;</td><td class=ac>3/3</td><td class=ac>3</td><td class=ac>0</td><td class=ac>&nbsp;</td><td>0</td><td>0s</td><td></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="nginx_backend_443"></a><a class=px href="#nginx_backend_443">nginx_backend_443</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="active_up"><td class=ac><a name="nginx_backend_443/POC-Master0"></a><a class=lfsb href="#nginx_backend_443/POC-Master0">POC-Master0</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>11</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>11</td><td>-</td><td><u>156<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>156</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td><span class="rls">5</span>000 / 158</td><td>ms</td></tr><tr><th>- Connect time:</th><td>1 / 1</td><td>ms</td></tr><tr><th>- Total time:</th><td><span class="rls">1</span>99<span class="rls">8</span>998 / 18<span class="rls">3</span>855</td><td>ms</td></tr></table></div></u></td><td>156</td><td>5m14s</td><td><span class="rls">1</span>34<span class="rls">3</span>762</td><td><span class="rls">2</span>75<span class="rls">0</span>246</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 19 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="nginx_backend_443/POC-Master1"></a><a class=lfsb href="#nginx_backend_443/POC-Master1">POC-Master1</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>10</td><td></td><td><u>1<div class=tips><table class=det><tr><th>Current active connections:</th><td>1</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>11</td><td>-</td><td><u>156<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>156</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td><span class="rls">5</span>001 / 208</td><td>ms</td></tr><tr><th>- Connect time:</th><td>1 / 1</td><td>ms</td></tr><tr><th>- Total time:</th><td><span class="rls">1</span>99<span class="rls">8</span>140 / 13<span class="rls">3</span>971</td><td>ms</td></tr></table></div></u></td><td>156</td><td>7s</td><td><span class="rls">1</span>03<span class="rls">3</span>669</td><td><span class="rls">3</span>92<span class="rls">5</span>075</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 19 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="nginx_backend_443/POC-Master2"></a><a class=lfsb href="#nginx_backend_443/POC-Master2">POC-Master2</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>11</td><td></td><td><u>1<div class=tips><table class=det><tr><th>Current active connections:</th><td>1</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>12</td><td>-</td><td><u>155<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>155</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td><span class="rls">5</span>001 / 212</td><td>ms</td></tr><tr><th>- Connect time:</th><td>1 / 1</td><td>ms</td></tr><tr><th>- Total time:</th><td><span class="rls">1</span>99<span class="rls">9</span>230 / 10<span class="rls">8</span>736</td><td>ms</td></tr></table></div></u></td><td>155</td><td>8m36s</td><td>85<span class="rls">2</span>299</td><td><span class="rls">3</span>49<span class="rls">7</span>229</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 22 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="backend"><td class=ac><a name="nginx_backend_443/Backend"></a><a class=lfsb href="#nginx_backend_443/Backend">Backend</a></td><td>0</td><td>0</td><td></td><td>0</td><td>32</td><td></td><td>2</td><td>34</td><td><span class="rls">2</span>000</td><td><u>467<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>467</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td><span class="rls">5</span>001 / 193</td><td>ms</td></tr><tr><th>- Connect time:</th><td>1 / 1</td><td>ms</td></tr><tr><th>- Total time:</th><td><span class="rls">1</span>99<span class="rls">9</span>230 / 14<span class="rls">2</span>259</td><td>ms</td></tr></table></div></u></td><td>467</td><td>7s</td><td><span class="rls">3</span>22<span class="rls">9</span>730</td><td>1<span class="rls">0</span>17<span class="rls">2</span>550<div class=tips><table class=det><tr><th>Response bytes in:</th><td>1<span class="rls">0</span>17<span class="rls">2</span>550</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 60 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac>&nbsp;</td><td class=ac>3/3</td><td class=ac>3</td><td class=ac>0</td><td class=ac>&nbsp;</td><td>0</td><td>0s</td><td></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="kubeedge_10000"></a><a class=px href="#kubeedge_10000">kubeedge_10000</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="frontend"><td class=ac><a name="kubeedge_10000/Frontend"></a><a class=lfsb href="#kubeedge_10000/Frontend">Frontend</a></td><td colspan=3></td><td><u>0<div class=tips><table class=det><tr><th>Current connection rate:</th><td>0/s</td></tr><tr><th>Current session rate:</th><td>0/s</td></tr></table></div></u></td><td><u>2<div class=tips><table class=det><tr><th>Max connection rate:</th><td>2/s</td></tr><tr><th>Max session rate:</th><td>2/s</td></tr></table></div></u></td><td>-</td><td>2</td><td>4</td><td>2<span class="rls">0</span>000</td><td><u>35<div class=tips><table class=det><tr><th>Cum. connections:</th><td>35</td></tr><tr><th>Cum. sessions:</th><td>35</td></tr></table></div></u></td><td></td><td></td><td><span class="rls">9</span>68<span class="rls">1</span>751</td><td>4<span class="rls">8</span>78<span class="rls">1</span>529<div class=tips><table class=det><tr><th>Response bytes in:</th><td>4<span class="rls">8</span>78<span class="rls">1</span>529</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td>0</td><td></td><td></td><td></td><td></td><td class=ac>OPEN</td><td class=ac colspan=8></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="kubeedge_backend_10000"></a><a class=px href="#kubeedge_backend_10000">kubeedge_backend_10000</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="active_up"><td class=ac><a name="kubeedge_backend_10000/POC-Master0"></a><a class=lfsb href="#kubeedge_backend_10000/POC-Master0">POC-Master0</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>1</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>2</td><td>-</td><td><u>12<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>12</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>3<span class="rls">2</span>99<span class="rls">2</span>202 / <span class="rls">2</span>75<span class="rls">1</span>494</td><td>ms</td></tr></table></div></u></td><td>12</td><td>1h17m</td><td><span class="rls">9</span>67<span class="rls">7</span>810</td><td>4<span class="rls">8</span>77<span class="rls">8</span>458</td><td></td><td>0</td><td></td><td>0</td><td><u>1<div class=tips>Connection resets during transfers: 2 client, 1 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="kubeedge_backend_10000/POC-Master1"></a><a class=lfsb href="#kubeedge_backend_10000/POC-Master1">POC-Master1</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>1</td><td></td><td><u>1<div class=tips><table class=det><tr><th>Current active connections:</th><td>1</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>2</td><td>-</td><td><u>12<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>12</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>1<span class="rls">0</span>001 / <span class="rls">2</span>729</td><td>ms</td></tr></table></div></u></td><td>12</td><td>1h17m</td><td><span class="rls">1</span>788</td><td><span class="rls">1</span>094</td><td></td><td>0</td><td></td><td>0</td><td><u>1<div class=tips>Connection resets during transfers: 1 client, 1 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="kubeedge_backend_10000/POC-Master2"></a><a class=lfsb href="#kubeedge_backend_10000/POC-Master2">POC-Master2</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>1</td><td></td><td><u>1<div class=tips><table class=det><tr><th>Current active connections:</th><td>1</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>2</td><td>-</td><td><u>11<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>11</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>1<span class="rls">0</span>004 / <span class="rls">1</span>444</td><td>ms</td></tr></table></div></u></td><td>11</td><td>1h17m</td><td><span class="rls">2</span>153</td><td><span class="rls">1</span>977</td><td></td><td>0</td><td></td><td>0</td><td><u>1<div class=tips>Connection resets during transfers: 2 client, 1 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="backend"><td class=ac><a name="kubeedge_backend_10000/Backend"></a><a class=lfsb href="#kubeedge_backend_10000/Backend">Backend</a></td><td>0</td><td>0</td><td></td><td>0</td><td>2</td><td></td><td>2</td><td>4</td><td><span class="rls">2</span>000</td><td><u>35<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>35</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>3<span class="rls">2</span>99<span class="rls">2</span>202 / 94<span class="rls">4</span>759</td><td>ms</td></tr></table></div></u></td><td>35</td><td>1h17m</td><td><span class="rls">9</span>68<span class="rls">1</span>751</td><td>4<span class="rls">8</span>78<span class="rls">1</span>529<div class=tips><table class=det><tr><th>Response bytes in:</th><td>4<span class="rls">8</span>78<span class="rls">1</span>529</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td></td><td>0</td><td><u>3<div class=tips>Connection resets during transfers: 5 client, 3 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac>&nbsp;</td><td class=ac>3/3</td><td class=ac>3</td><td class=ac>0</td><td class=ac>&nbsp;</td><td>0</td><td>0s</td><td></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="kubeedge_10002"></a><a class=px href="#kubeedge_10002">kubeedge_10002</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="frontend"><td class=ac><a name="kubeedge_10002/Frontend"></a><a class=lfsb href="#kubeedge_10002/Frontend">Frontend</a></td><td colspan=3></td><td><u>0<div class=tips><table class=det><tr><th>Current connection rate:</th><td>0/s</td></tr><tr><th>Current session rate:</th><td>0/s</td></tr></table></div></u></td><td><u>5<div class=tips><table class=det><tr><th>Max connection rate:</th><td>5/s</td></tr><tr><th>Max session rate:</th><td>5/s</td></tr></table></div></u></td><td>-</td><td>0</td><td>2</td><td>2<span class="rls">0</span>000</td><td><u>66<div class=tips><table class=det><tr><th>Cum. connections:</th><td>66</td></tr><tr><th>Cum. sessions:</th><td>66</td></tr></table></div></u></td><td></td><td></td><td>2<span class="rls">6</span>117</td><td>3<span class="rls">5</span>698<div class=tips><table class=det><tr><th>Response bytes in:</th><td>3<span class="rls">5</span>698</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td>0</td><td></td><td></td><td></td><td></td><td class=ac>OPEN</td><td class=ac colspan=8></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="kubeedge_backend_10002"></a><a class=px href="#kubeedge_backend_10002">kubeedge_backend_10002</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="active_up"><td class=ac><a name="kubeedge_backend_10002/POC-Master0"></a><a class=lfsb href="#kubeedge_backend_10002/POC-Master0">POC-Master0</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>2</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>1</td><td>-</td><td><u>22<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>22</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>1<span class="rls">6</span>153 / <span class="rls">2</span>135</td><td>ms</td></tr></table></div></u></td><td>22</td><td>3h57m</td><td><span class="rls">8</span>167</td><td>1<span class="rls">1</span>327</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 7 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="kubeedge_backend_10002/POC-Master1"></a><a class=lfsb href="#kubeedge_backend_10002/POC-Master1">POC-Master1</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>2</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>1</td><td>-</td><td><u>22<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>22</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td><span class="rls">9</span>139 / <span class="rls">1</span>031</td><td>ms</td></tr></table></div></u></td><td>22</td><td>3h57m</td><td><span class="rls">8</span>885</td><td>1<span class="rls">2</span>049</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 6 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="kubeedge_backend_10002/POC-Master2"></a><a class=lfsb href="#kubeedge_backend_10002/POC-Master2">POC-Master2</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>2</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>1</td><td>-</td><td><u>22<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>22</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>1<span class="rls">0</span>005 / <span class="rls">1</span>384</td><td>ms</td></tr></table></div></u></td><td>22</td><td>2h44m</td><td><span class="rls">9</span>065</td><td>1<span class="rls">2</span>322</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 7 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="backend"><td class=ac><a name="kubeedge_backend_10002/Backend"></a><a class=lfsb href="#kubeedge_backend_10002/Backend">Backend</a></td><td>0</td><td>0</td><td></td><td>0</td><td>5</td><td></td><td>0</td><td>2</td><td><span class="rls">2</span>000</td><td><u>66<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>66</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>1<span class="rls">6</span>153 / <span class="rls">1</span>516</td><td>ms</td></tr></table></div></u></td><td>66</td><td>2h44m</td><td>2<span class="rls">6</span>117</td><td>3<span class="rls">5</span>698<div class=tips><table class=det><tr><th>Response bytes in:</th><td>3<span class="rls">5</span>698</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 20 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac>&nbsp;</td><td class=ac>3/3</td><td class=ac>3</td><td class=ac>0</td><td class=ac>&nbsp;</td><td>0</td><td>0s</td><td></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="kubeedge_10004"></a><a class=px href="#kubeedge_10004">kubeedge_10004</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="frontend"><td class=ac><a name="kubeedge_10004/Frontend"></a><a class=lfsb href="#kubeedge_10004/Frontend">Frontend</a></td><td colspan=3></td><td><u>0<div class=tips><table class=det><tr><th>Current connection rate:</th><td>0/s</td></tr><tr><th>Current session rate:</th><td>0/s</td></tr></table></div></u></td><td><u>0<div class=tips><table class=det><tr><th>Max connection rate:</th><td>0/s</td></tr><tr><th>Max session rate:</th><td>0/s</td></tr></table></div></u></td><td>-</td><td>0</td><td>0</td><td>2<span class="rls">0</span>000</td><td><u>0<div class=tips><table class=det><tr><th>Cum. connections:</th><td>0</td></tr><tr><th>Cum. sessions:</th><td>0</td></tr></table></div></u></td><td></td><td></td><td>0</td><td>0<div class=tips><table class=det><tr><th>Response bytes in:</th><td>0</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td>0</td><td></td><td></td><td></td><td></td><td class=ac>OPEN</td><td class=ac colspan=8></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="kubeedge_backend_10004"></a><a class=px href="#kubeedge_backend_10004">kubeedge_backend_10004</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="active_up"><td class=ac><a name="kubeedge_backend_10004/POC-Master0"></a><a class=lfsb href="#kubeedge_backend_10004/POC-Master0">POC-Master0</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>0</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>0</td><td>-</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>?</td><td>0</td><td>0</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 0 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="kubeedge_backend_10004/POC-Master1"></a><a class=lfsb href="#kubeedge_backend_10004/POC-Master1">POC-Master1</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>0</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>0</td><td>-</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>?</td><td>0</td><td>0</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 0 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="kubeedge_backend_10004/POC-Master2"></a><a class=lfsb href="#kubeedge_backend_10004/POC-Master2">POC-Master2</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>0</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>0</td><td>-</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>?</td><td>0</td><td>0</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 0 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="backend"><td class=ac><a name="kubeedge_backend_10004/Backend"></a><a class=lfsb href="#kubeedge_backend_10004/Backend">Backend</a></td><td>0</td><td>0</td><td></td><td>0</td><td>0</td><td></td><td>0</td><td>0</td><td><span class="rls">2</span>000</td><td><u>0<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>0</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>0 / 0</td><td>ms</td></tr></table></div></u></td><td>0</td><td>?</td><td>0</td><td>0<div class=tips><table class=det><tr><th>Response bytes in:</th><td>0</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 0 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac>&nbsp;</td><td class=ac>3/3</td><td class=ac>3</td><td class=ac>0</td><td class=ac>&nbsp;</td><td>0</td><td>0s</td><td></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="mqtt_broker"></a><a class=px href="#mqtt_broker">mqtt_broker</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="frontend"><td class=ac><a name="mqtt_broker/Frontend"></a><a class=lfsb href="#mqtt_broker/Frontend">Frontend</a></td><td colspan=3></td><td><u>0<div class=tips><table class=det><tr><th>Current connection rate:</th><td>0/s</td></tr><tr><th>Current session rate:</th><td>0/s</td></tr></table></div></u></td><td><u>2<div class=tips><table class=det><tr><th>Max connection rate:</th><td>2/s</td></tr><tr><th>Max session rate:</th><td>2/s</td></tr></table></div></u></td><td>-</td><td>2</td><td>4</td><td>2<span class="rls">0</span>000</td><td><u><span class="rls">1</span>062<div class=tips><table class=det><tr><th>Cum. connections:</th><td><span class="rls">1</span>062</td></tr><tr><th>Cum. sessions:</th><td><span class="rls">1</span>062</td></tr></table></div></u></td><td></td><td></td><td>37<span class="rls">9</span>988</td><td>1<span class="rls">7</span>426<div class=tips><table class=det><tr><th>Response bytes in:</th><td>1<span class="rls">7</span>426</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td>0</td><td></td><td></td><td></td><td></td><td class=ac>OPEN</td><td class=ac colspan=8></td></tr></table><p>
<table class="tbl" width="100%">
<tr class="titre"><th class="pxname" width="10%"><a name="mqtt_broker_backend"></a><a class=px href="#mqtt_broker_backend">mqtt_broker_backend</a></th><th class="empty" width="90%"></th></tr>
</table>
<table class="tbl" width="100%">
<tr class="titre"><th rowspan=2></th><th colspan=3>Queue</th><th colspan=3>Session rate</th><th colspan=6>Sessions</th><th colspan=2>Bytes</th><th colspan=2>Denied</th><th colspan=3>Errors</th><th colspan=2>Warnings</th><th colspan=9>Server</th></tr>
<tr class="titre"><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Cur</th><th>Max</th><th>Limit</th><th>Total</th><th>LbTot</th><th>Last</th><th>In</th><th>Out</th><th>Req</th><th>Resp</th><th>Req</th><th>Conn</th><th>Resp</th><th>Retr</th><th>Redis</th><th>Status</th><th>LastChk</th><th>Wght</th><th>Act</th><th>Bck</th><th>Chk</th><th>Dwn</th><th>Dwntme</th><th>Thrtle</th>
</tr><tr class="active_up"><td class=ac><a name="mqtt_broker_backend/POC-Master0"></a><a class=lfsb href="#mqtt_broker_backend/POC-Master0">POC-Master0</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>1</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>2</td><td>-</td><td><u>354<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>354</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>3<span class="rls">2</span>94<span class="rls">5</span>639 / 14<span class="rls">3</span>010</td><td>ms</td></tr></table></div></u></td><td>354</td><td>2m26s</td><td>26<span class="rls">7</span>499</td><td><span class="rls">5</span>353</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 354 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="mqtt_broker_backend/POC-Master1"></a><a class=lfsb href="#mqtt_broker_backend/POC-Master1">POC-Master1</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>1</td><td></td><td><u>0<div class=tips><table class=det><tr><th>Current active connections:</th><td>0</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>1</td><td>-</td><td><u>354<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>354</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>1 / 1</td><td>ms</td></tr><tr><th>- Total time:</th><td>5<span class="rls">0</span>218 / 5<span class="rls">0</span>087</td><td>ms</td></tr></table></div></u></td><td>354</td><td>1m30s</td><td>5<span class="rls">6</span>640</td><td><span class="rls">4</span>248</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 354 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="active_up"><td class=ac><a name="mqtt_broker_backend/POC-Master2"></a><a class=lfsb href="#mqtt_broker_backend/POC-Master2">POC-Master2</a></td><td>0</td><td>0</td><td>-</td><td>0</td><td>1</td><td></td><td><u>2<div class=tips><table class=det><tr><th>Current active connections:</th><td>2</td></tr><tr><th>Current used connections:</th><td>0</td></tr><tr><th>Current idle connections:</th><td>0</td></tr><tr><th>- unsafe:</th><td>0</td></tr><tr><th>- safe:</th><td>0</td></tr><tr><th>Estimated need of connections:</th><td>1</td></tr><tr><th>Active connections limit:</th><td>-</td></tr><tr><th>Idle connections limit:</th><td>-</td></tr></table></div></u></td><td>2</td><td>-</td><td><u>354<div class=tips><table class=det><tr><th>Cum. sessions:</th><td>354</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>5<span class="rls">0</span>223 / 4<span class="rls">9</span>332</td><td>ms</td></tr></table></div></u></td><td>354</td><td>34s</td><td>5<span class="rls">5</span>849</td><td><span class="rls">7</span>825</td><td></td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 349 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac><u> L4OK in 0ms<div class=tips>Layer4 check passed</div></u></td><td class=ac>1/1</td><td class=ac>Y</td><td class=ac>-</td><td><u>0<div class=tips>Failed Health Checks</div></u></td><td>0</td><td>0s</td><td class=ac>-</td></tr>
<tr class="backend"><td class=ac><a name="mqtt_broker_backend/Backend"></a><a class=lfsb href="#mqtt_broker_backend/Backend">Backend</a></td><td>0</td><td>0</td><td></td><td>0</td><td>2</td><td></td><td>2</td><td>3</td><td><span class="rls">2</span>000</td><td><u><span class="rls">1</span>062<div class=tips><table class=det><tr><th>Cum. sessions:</th><td><span class="rls">1</span>062</td></tr><tr><th colspan=3>Max / Avg over last 1024 success. conn.</th></tr><tr><th>- Queue time:</th><td>0 / 0</td><td>ms</td></tr><tr><th>- Connect time:</th><td>1 / 0</td><td>ms</td></tr><tr><th>- Total time:</th><td>3<span class="rls">2</span>94<span class="rls">5</span>639 / 7<span class="rls">5</span>592</td><td>ms</td></tr></table></div></u></td><td><span class="rls">1</span>062</td><td>34s</td><td>37<span class="rls">9</span>988</td><td>1<span class="rls">7</span>426<div class=tips><table class=det><tr><th>Response bytes in:</th><td>1<span class="rls">7</span>426</td></tr><tr><th>Compression in:</th><td>0</td></tr><tr><th>Compression out:</th><td>0</td><td>(0%)</td></tr><tr><th>Compression bypass:</th><td>0</td></tr><tr><th>Total bytes saved:</th><td>0</td><td>(0%)</td></tr></table></div></td><td>0</td><td>0</td><td></td><td>0</td><td><u>0<div class=tips>Connection resets during transfers: 1057 client, 0 server</div></u></td><td>0</td><td>0</td><td class=ac>16h25m UP</td><td class=ac>&nbsp;</td><td class=ac>3/3</td><td class=ac>3</td><td class=ac>0</td><td class=ac>&nbsp;</td><td>0</td><td>0s</td><td></td></tr></table><p>
</body></html>

7
hosts Normal file
View File

@@ -0,0 +1,7 @@
10.20.1.100 POC-Kube-Balancer
10.20.1.101 POC-Master0
10.20.1.102 POC-Master1
10.20.1.103 POC-Master2
10.20.1.104 POC-Worker0
10.20.1.105 POC-Worker1
10.20.1.106 POC-Worker2

123
installa_haproxy.sh Normal file
View File

@@ -0,0 +1,123 @@
sudo apt update && sudo apt install -y haproxy
sudo tee /etc/haproxy/haproxy.cfg > /dev/null <<'EOF'
global
log /dev/log local0
maxconn 20000
tune.bufsize 16384
# SSL configuration for future HTTPS endpoints
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Modern SSL configuration - only secure protocols
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend rke2_registration_frontend
bind *:9345
mode tcp
option tcplog
default_backend rke2_registration_backend
#---------------------------------------------------------------------
# RKE2 Supervisor/Registration Backend
# Round-robin between masters for node registration
#---------------------------------------------------------------------
backend rke2_registration_backend
mode tcp
balance roundrobin
option tcp-check
# Health check ensures we only send traffic to healthy masters
server POC-Master0 POC-Master0:9345 check
server POC-Master1 POC-Master1:9345 check
server POC-Master2 POC-Master2:9345 check
#---------------------------------------------------------------------
# Kubernetes API Frontend
# This is where kubectl commands and apps connect
#---------------------------------------------------------------------
frontend k8s_api_frontend
bind *:6443
mode tcp
option tcplog
default_backend k8s_api_backend
#---------------------------------------------------------------------
# Kubernetes API Backend
# Distributes API requests across all masters
#---------------------------------------------------------------------
backend k8s_api_backend
mode tcp
balance roundrobin
option tcp-check
# TCP health checks on the API port
server POC-Master0 POC-Master0:6443 check
server POC-Master1 POC-Master1:6443 check
server POC-Master2 POC-Master2:6443 check
#---------------------------------------------------------------------
# Statistics Page (Optional but useful for monitoring)
#---------------------------------------------------------------------
listen stats
bind *:8080
stats enable
stats uri /stats
stats refresh 30s
stats show-node
stats auth admin:admin # Change this password!
#---------------------------------------------------------------------
# nginx ingress
# This is where kubectl commands and apps connect
#---------------------------------------------------------------------
frontend nginx_frontend_443
bind *:443
mode tcp
option tcplog
default_backend nginx_backend
frontend nginx_frontend_80
bind *:80
mode http
http-response set-header Access-Control-Allow-Origin %[hdr(origin)]
default_backend nginx_backend_http
#---------------------------------------------------------------------
# Kubernetes API Backend
# Distributes API requests across all masters
#---------------------------------------------------------------------
backend nginx_backend
mode tcp
balance roundrobin
option tcp-check
# TCP health checks on the API port
server POC-Master0 POC-Master0:30864 check
server POC-Master1 POC-Master1:30864 check
server POC-Master2 POC-Master2:30864 check
backend nginx_backend_http
mode http
balance roundrobin
# TCP health checks on the API port
server POC-Master0 POC-Master0:30864 check ssl verify none
server POC-Master1 POC-Master1:30864 check ssl verify none
server POC-Master2 POC-Master2:30864 check ssl verify none
EOF
sudo systemctl enable --now haproxy

2437
installazione.md Normal file

File diff suppressed because it is too large Load Diff

4
iscsiadm-open-iscsi.sh Normal file
View File

@@ -0,0 +1,4 @@
sudo apt install open-iscsi
systemctl enable open-iscsi
systemctl enable iscsid
systemctl restart iscsid.service

BIN
istruzioni.doc Normal file

Binary file not shown.

BIN
istruzioni.docx Normal file

Binary file not shown.

46
istruzioni.txt Normal file
View File

@@ -0,0 +1,46 @@
Creazione server:
3 server RKE2 (master/etcd),
<ip> master1.local
<ip> master2.local
<ip> master3.local
1-3 worker nodes:
<ip> worker-a.local
<ip> worker-b.local
<ip> worker-c.local
1 Load Balancer (HAProxy) https/http pubblici
<ip> loadbalancer.internal
DNS: rancher.pigreco66.it → IP esterno --> ip loadbalancer.internal
Sequenza:
Ogni server
1)installazione vi (vi.txt)
Ogni nodomaster e worker
1) prepara_nodo.sh
master1:
1)master_1_installa_rke.sh
master23:
1)master23-installa_rke.sh
Loadbalancer:
1)installa_haproxy.sh
worker:
1)worker-installa_rke2.sh
Add_on:
1) installa_helm.sh
2) installa-cert-manager.sh
3) kubectt apply -f nginx-controller-service-nodeport.yaml
poc:
poc-testweb.yaml

56
master23-installa_rke.sh Normal file
View File

@@ -0,0 +1,56 @@
# 1. Installa RKE2 (script ufficial)
curl -sfL https://get.rke2.io | sh -
sudo systemctl enable rke2-server.service
# 2. Crea config (personalizza token e tls-san se serve)
sudo mkdir -p /etc/rancher/rke2
sudo tee /etc/rancher/rke2/config.yaml > /dev/null <<EOF
# RKE2 Server Configuration - Additional Master
server: https://POC-Master0:9345 # Direct connection for initial join
token: "K10b8b252de84e5aab8bc1d2a8e4aad3e329ee84d638892b8638de0260b7cb8212a::server:34b189ab7b91fc924500ba0b3608b80b"
write-kubeconfig-mode: "0644"
# Same TLS SANs as master-1 - consistency is crucial!
tls-san:
- "POC-Kube-Balancer"
- "10.20.1.100"
- "POC-Master0"
- "10.20.1.101"
- "POC-Master1"
- "10.20.1.102"
- "POC-Master2"
- "10.20.1.103"
- "POC-Worker0"
- "10.20.1.104"
- "POC-Worker1"
- "10.20.1.105"
- "POC-Worker2"
- "10.20.1.106"
# Identical network configuration
#cluster-cidr: "10.42.64.0/18"
#service-cidr: "10.42.0.0/18"
#cluster-dns: "10.42.0.10"
# Same backup and security settings
#profile: "cis-1.6"
selinux: true
secrets-encryption: true
# Node configuration
node-taint:
- "CriticalAddonsOnly=true:NoExecute"
ingress-controller: none
EOF
# 3. Avvia RKE2 server
sudo systemctl start rke2-server
curl -LO https://dl.k8s.io/release/v1.35.0/bin/linux/amd64/kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
mkdir /root/.kube
cp /etc/rancher/rke2/rke2.yaml /root/.kube/config

61
master_1_installa_rke.sh Normal file
View File

@@ -0,0 +1,61 @@
# 1. Installa RKE2 (script ufficial)
curl -sfL https://get.rke2.io | sh -
sudo systemctl enable rke2-server.service
# 2. Crea config (personalizza token e tls-san se serve)
sudo mkdir -p /etc/rancher/rke2
sudo tee /etc/rancher/rke2/config.yaml > /dev/null <<EOF
# RKE2 Server Configuration - First Master Node
write-kubeconfig-mode: "0644"
# CRITICAL: Add all possible API server access points to the certificate
tls-san:
- "POC-Kube-Balancer"
- "10.20.1.100"
- "POC-Master0"
- "10.20.1.101"
- "POC-Master1"
- "10.20.1.102"
- "POC-Master2"
- "10.20.1.103"
- "POC-Worker0"
- "10.20.1.104"
- "POC-Worker1"
- "10.20.1.105"
- "POC-Worker2"
- "10.20.1.106"
# Network configuration
#cluster-cidr: "10.42.64.0/18"
#service-cidr: "10.42.0.0/18"
#cluster-dns: "10.42.0.10"
# Security hardening
#profile: "cis-1.6"
selinux: true
secrets-encryption: true
# Node configuration
node-taint:
- "CriticalAddonsOnly=true:NoExecute"
ingress-controller: none
EOF
# 3. Avvia RKE2 server
sudo systemctl start rke2-server
# Attendi che i pod kube-system siano up (sul master 1)
#installa kubectl
curl -LO https://dl.k8s.io/release/v1.35.0/bin/linux/amd64/kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
mkdir /root/.kube
cp /etc/rancher/rke2/rke2.yaml /root/.kube/config
echo "MASTER TOKEN TO COPY"
cat /var/lib/rancher/rke2/server/node-token

View File

@@ -0,0 +1,154 @@
# Pipeline Gitea: `DEV_build_deploy.yaml`
## Scopo
Questa pipeline esegue build, publish immagini Docker e deploy Kubernetes dell'ambiente `dev`.
Flusso alto livello:
1. Checkout del repository.
2. Login al registry Harbor.
3. Build e push delle immagini per ogni servizio in `containers/*`.
4. Creazione del file `kubeconfig` da secret.
5. Sostituzione variabili nei manifest Kubernetes.
6. Deploy dei manifest e configurazione listener HTTPS sul Gateway.
## Trigger e runner
- Trigger: `push` su branch `main`.
- Job: `docker`.
- Runner richiesto: `POC-Master0`.
## Definizione pipeline
File: `pipeline/DEV_build_deploy.yaml`
Step principali:
- `actions/checkout@v4`
- `docker/login-action@v3`
- `/root/work/pipeline/build_container.sh ${{ github.event.repository.name }} ${{ vars.REGISTRY }}`
- creazione `./kubeconfig` da `${{ secrets.KUBECONFIG_DEV }}`
- `/root/work/pipeline/customize.sh dev`
- `/root/work/pipeline/deploy.sh`
## Script eseguiti dalla pipeline
### 1) `build_container.sh`
Responsabilità:
- Itera tutte le directory `containers/*/`.
- Copia i sorgenti da `src/<container>/` dentro `containers/<container>/`.
- Rileva il Dockerfile (`dockerfile` oppure `Dockerfile`).
- Costruisce due tag immagine:
- `${REGISTRY_URL}/${REPO_NAME}/${CONTAINER_NAME}:${COMMIT_SHA}`
- `${REGISTRY_URL}/${REPO_NAME}/${CONTAINER_NAME}:latest`
- Esegue push su registry.
- Scrive su file `./imglist` una riga per container:
- `IMAGE_TAG_<container>=<image-tag-con-sha>`
Supporto multi-arch:
- Se presente `containers/<container>/platform.conf` con chiave `platform=...`, usa `docker buildx build --platform ... --push`.
- In assenza di `platform.conf` usa `docker build` + `docker push` classico.
Input (argomenti):
- `$1`: `REPO_NAME` (passato dalla pipeline con `${{ github.event.repository.name }}`).
- `$2`: `REGISTRY_URL` (passato da `${{ vars.REGISTRY }}`).
Prerequisiti runtime:
- Docker daemon disponibile nel runner.
- Permessi push su registry.
- Struttura cartelle coerente tra `containers/` e `src/`.
### 2) `customize.sh`
Responsabilità funzionale attesa:
- Carica variabili da:
- `env/<ENV>/values.env`
- `properties.env`
- file temporaneo con:
- `TAG=<commit_sha>`
- contenuto di `imglist` (generato da `build_container.sh`)
- Cerca tutti i manifest `kubernetes/**/*.yaml`.
- Esegue sostituzione placeholder nel formato `<CHIAVE>` con i valori trovati.
Input (argomenti):
- `$1`: ambiente (`dev|qa|prod`).
- In pipeline attuale viene usato `dev`.
Placeholder parametrizzabili nei manifest:
- Tutte le chiavi presenti in `env/<ENV>/values.env`.
- Tutte le chiavi presenti in `properties.env`.
- `TAG`.
- `IMAGE_TAG_<container>` (una per ciascun container buildato).
Output:
- Manifest Kubernetes in-place con valori sostituiti.
### 3) `deploy.sh`
Responsabilità:
- Cerca manifest CNPG (`apiVersion: postgresql.cnpg.io/v1`).
- Se trovato:
- Estrae `metadata.name` del cluster PostgreSQL.
- Ricava namespace dal role `namespace-deployer` nel cluster.
- Crea/aggiorna ConfigMap `service-config` con:
- `tipodb=postgres`
- `urldb=<pg_name>.<namespace>.svc.cluster.local`
- Applica tutti i manifest YAML trovati in `kubernetes/` (directory per directory).
- Invoca `/root/work/pipeline/addlistener.sh` per configurare listener HTTPS sul Gateway.
Prerequisiti runtime:
- `kubectl` disponibile nel runner.
- `./kubeconfig` presente e valido.
- Opzionale `yq` (se assente, usa fallback con `awk` per estrazione nome CNPG).
### 4) `addlistener.sh`
Responsabilità:
- Legge la chiave `endpoint` da `properties.env`.
- Calcola token host-based dal dominio.
- Invoca `/root/work/pipeline/add-listener.sh` passando:
- `<endpoint>`
- `https-<token>`
- `<token>-secret`
Input (argomenti):
- `$1` opzionale: path file properties (default `properties.env`).
Comportamento:
- Se file non esiste o `endpoint` non valorizzato: termina senza errore bloccante (`exit 0`).
### 5) `add-listener.sh`
Responsabilità:
- Effettua patch JSON sulla risorsa Gateway Kubernetes:
- Gateway: `main-gateway`
- Namespace: `nginx-gateway`
- Aggiunge un listener HTTPS con certificato TLS da Secret.
- Verifica idempotenza per `name` e `hostname` già presenti.
Input (argomenti):
- `$1`: `hostname`
- `$2`: `name`
- `$3`: `secret-name`
## Parametrizzazione complessiva
### Variabili Gitea Actions
- `vars.REGISTRY`: URL registry target.
### Secret Gitea Actions
- `secrets.HARBOR_USERNAME`
- `secrets.HARBOR_PASSWORD`
- `secrets.KUBECONFIG_DEV`
### File di configurazione repository
- `env/dev/values.env` (o `qa`, `prod` se si cambia argomento di `customize.sh`)
- `properties.env`
- `containers/<service>/platform.conf` (opzionale)
### Parametri indiretti derivati
- Nome repository da `${{ github.event.repository.name }}`.
- SHA commit da `git rev-parse HEAD`.
- Tag immagine per servizio in `imglist`.
## Note operative importanti
1. Il file `imglist` viene creato/appeso da `build_container.sh` e poi letto da `customize.sh`; il job deve mantenere lo stesso workspace tra step.
2. I manifest Kubernetes vengono modificati in-place da `sed -i`.
3. La parte Gateway dipende da:
- presenza di `endpoint` in `properties.env`
- esistenza della risorsa `Gateway/nginx-gateway/main-gateway`
- esistenza del Secret TLS con nome `<token>-secret`

View File

@@ -0,0 +1,36 @@
name: Build and Deploy
on:
push:
branches:
- main
jobs:
docker:
runs-on: POC-Master0
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Login to Harbor
uses: docker/login-action@v3
with:
registry: ${{ vars.REGISTRY }}
username: ${{ secrets.HARBOR_USERNAME }}
password: ${{ secrets.HARBOR_PASSWORD }}
- name: Build container
run: /root/work/pipeline/build_container.sh ${{ github.event.repository.name }} ${{ vars.REGISTRY }}
- name: Create kubeconfig
run: |
echo "${{ secrets.KUBECONFIG_DEV }}" > ./kubeconfig
chmod 600 ./kubeconfig
- name: variables sustitution
run: /root/work/pipeline/customize.sh dev
- name: k8s deploy
run: /root/work/pipeline/deploy.sh

81
pipeline/add-listener.sh Normal file
View File

@@ -0,0 +1,81 @@
#!/bin/bash
# Aggiunge un listener HTTPS direttamente sulla risorsa K8s Gateway
# main-gateway nel namespace nginx-gateway, tramite kubectl patch.
#
# Uso:
# ./add-listener.sh <hostname> <name> <secret-name>
#
# Esempio:
# ./add-listener.sh sonarqube.italiadatacenter.com https-sonarqube sonarqube-secret
set -euo pipefail
GATEWAY_NAME="main-gateway"
GATEWAY_NS="nginx-gateway"
HOSTNAME_VAL="${1:-}"
NAME_VAL="${2:-}"
SECRET_NAME="${3:-}"
if [[ -z "$HOSTNAME_VAL" || -z "$NAME_VAL" || -z "$SECRET_NAME" ]]; then
echo "Uso: $0 <hostname> <name> <secret-name>"
echo "Es.: $0 sonarqube.italiadatacenter.com https-sonarqube sonarqube-secret"
exit 1
fi
# Controlla idempotenza: verifica se il listener esiste già per nome o hostname
EXISTING=$(kubectl get gateway "$GATEWAY_NAME" -n "$GATEWAY_NS" \
-o jsonpath='{.spec.listeners[*].name}')
if echo "$EXISTING" | grep -qw "$NAME_VAL"; then
echo "Attenzione: listener con name '${NAME_VAL}' già presente. Nessuna modifica."
exit 0
fi
EXISTING_HOSTS=$(kubectl get gateway "$GATEWAY_NAME" -n "$GATEWAY_NS" \
-o jsonpath='{.spec.listeners[*].hostname}')
if echo "$EXISTING_HOSTS" | grep -qw "$HOSTNAME_VAL"; then
echo "Attenzione: listener con hostname '${HOSTNAME_VAL}' già presente. Nessuna modifica."
exit 0
fi
# JSON Patch: aggiunge il nuovo listener in append alla lista
PATCH=$(cat <<EOF
[{
"op": "add",
"path": "/spec/listeners/-",
"value": {
"allowedRoutes": {
"namespaces": {
"from": "All"
}
},
"hostname": "${HOSTNAME_VAL}",
"name": "${NAME_VAL}",
"port": 443,
"protocol": "HTTPS",
"tls": {
"certificateRefs": [
{
"group": "",
"kind": "Secret",
"name": "${SECRET_NAME}"
}
],
"mode": "Terminate"
}
}
}]
EOF
)
kubectl patch gateway "$GATEWAY_NAME" \
-n "$GATEWAY_NS" \
--type=json \
-p "$PATCH"
echo "Listener aggiunto alla risorsa ${GATEWAY_NS}/${GATEWAY_NAME}:"
echo " hostname : ${HOSTNAME_VAL}"
echo " name : ${NAME_VAL}"
echo " secret : ${SECRET_NAME}"

34
pipeline/addlistener.sh Normal file
View File

@@ -0,0 +1,34 @@
#!/usr/bin/env bash
set -euo pipefail
# Usa properties.env nella directory corrente, oppure un path passato come primo argomento.
PROPERTIES_FILE="${1:-properties.env}"
if [[ ! -f "$PROPERTIES_FILE" ]]; then
echo "Warning: file non trovato: $PROPERTIES_FILE" >&2
exit 0
fi
# Estrae endpoint ignorando commenti e spazi, supportando anche endpoint = valore
endpoint_raw="$({ grep -E '^[[:space:]]*endpoint[[:space:]]*=' "$PROPERTIES_FILE" | tail -n1 || true; } | sed -E 's/^[[:space:]]*endpoint[[:space:]]*=[[:space:]]*//')"
# Rimuove eventuali virgolette e spazi ai bordi
endpoint="$(echo "$endpoint_raw" | sed -E 's/^[[:space:]"\x27]+//; s/[[:space:]"\x27]+$//')"
if [[ -z "$endpoint" ]]; then
echo "La chiave endpoint non e valorizzata in $PROPERTIES_FILE" >&2
exit 0
fi
# Per calcolare il token usa host pulito (senza schema e path)
host_for_token="${endpoint#*://}"
host_for_token="${host_for_token%%/*}"
token="${host_for_token%%.*}"
if [[ -z "$token" ]]; then
echo "Impossibile estrarre il token da endpoint: $endpoint" >&2
exit 1
fi
# Output richiesto: <endpoint> https-<token> <token>-secret
/root/work/pipeline/add-listener.sh $endpoint https-$token $token-secret

View File

@@ -0,0 +1,58 @@
#!/bin/bash
set -e
set -o pipefail
echo "progetto" $1
REPO_NAME=$1
COMMIT_SHA=$(git rev-parse HEAD)
REGISTRY_URL=$2
for dir in containers/*/; do
CONTAINER_NAME=$(basename "$dir")
cp -R src/${CONTAINER_NAME}/. containers/${CONTAINER_NAME}/.
ls -la $dir
# Cerca sia dockerfile che Dockerfile
if [ -f "$dir/dockerfile" ]; then
DOCKERFILE="$dir/dockerfile"
elif [ -f "$dir/Dockerfile" ]; then
DOCKERFILE="$dir/Dockerfile"
else
echo "Dockerfile non trovato in $dir"
continue
fi
IMAGE_TAG="${REGISTRY_URL}/${REPO_NAME}/${CONTAINER_NAME}:${COMMIT_SHA}"
IMAGE_TAG_LATEST="${REGISTRY_URL}/${REPO_NAME}/${CONTAINER_NAME}:latest"
echo "IMAGE_TAG_${CONTAINER_NAME}=$IMAGE_TAG" >> ./imglist
PLATFORM_CONF="$dir/platform.conf"
BUILD_PLATFORM=""
if [ -f "$PLATFORM_CONF" ]; then
BUILD_PLATFORM=$(grep -E '^[[:space:]]*platform[[:space:]]*=' "$PLATFORM_CONF" | tail -n 1 | cut -d '=' -f 2- | tr -d '[:space:]')
if [ -n "$BUILD_PLATFORM" ]; then
echo "platform.conf trovato in $dir: uso platform=$BUILD_PLATFORM"
else
echo "platform.conf trovato in $dir ma variabile platform non valorizzata, uso build standard"
fi
fi
if [ -f "$DOCKERFILE" ]; then
if [ -n "$BUILD_PLATFORM" ]; then
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker buildx create --driver docker-container --use
docker buildx inspect --bootstrap
docker buildx build --platform "$BUILD_PLATFORM" -t "$IMAGE_TAG" -t "$IMAGE_TAG_LATEST" -f "$DOCKERFILE" "$dir" --push
else
docker build -t "$IMAGE_TAG" -t "$IMAGE_TAG_LATEST" -f "$DOCKERFILE" "$dir"
docker push "$IMAGE_TAG"
docker push "$IMAGE_TAG_LATEST"
fi
echo "Build e push completate: $IMAGE_TAG"
else
echo "Dockerfile non trovato in $dir"
fi
done

55
pipeline/customize.sh Normal file
View File

@@ -0,0 +1,55 @@
#!/bin/bash
# Usage: ./customize.sh dev|qa|prod
echo "tetst" $IMAGE_TAG_backend
ENV=$1
VALUES_DIR="env/$ENV"
PROPERTIES_FILE="properties.env"
YAML_DIR="kubernetes"
# Estrai l'hash completo del commit e crea una variabile temporanea per la sostituzione
TAG=$(git rev-parse HEAD)
TMP_TAG_FILE=$(mktemp)
TMP_VALUES_FILE=$(mktemp)
echo "TAG=$TAG" > "$TMP_TAG_FILE"
cat ./imglist >> "$TMP_TAG_FILE"
if [ ! -d "$VALUES_DIR" ] || ! ls "$VALUES_DIR"/*.env &>/dev/null; then
echo "Nessun file .env trovato in $VALUES_DIR"
exit 1
fi
if [ ! -f "$PROPERTIES_FILE" ]; then
echo "File $PROPERTIES_FILE non trovato."
exit 1
fi
# Crea una lista key=value temporanea partendo da tutti i file *.env in env/$ENV e aggiunge env dinamico
> "$TMP_VALUES_FILE"
for env_file in "$VALUES_DIR"/*.env; do
cat "$env_file" >> "$TMP_VALUES_FILE"
printf '\n' >> "$TMP_VALUES_FILE"
done
printf '\nenv=%s\n' "$ENV" >> "$TMP_VALUES_FILE"
# Trova tutti i file .yaml nella directory kubernetes e sottodirectory
find "$YAML_DIR" -type f -name "*.yaml" | while read YAML_FILE; do
while IFS='=' read -r key value; do
sed -i "s|<$key>|$value|g" "$YAML_FILE"
done < "$TMP_VALUES_FILE"
while IFS='=' read -r key value; do
sed -i "s|<$key>|$value|g" "$YAML_FILE"
done < "$PROPERTIES_FILE"
# Sostituzione dinamica della chiave TAG
while IFS='=' read -r key value; do
sed -i "s|<$key>|$value|g" "$YAML_FILE"
done < "$TMP_TAG_FILE"
echo "Sostituzione completata per file $YAML_FILE ambiente $ENV."
cat $YAML_FILE
done
cat "$TMP_VALUES_FILE"
rm -f "$TMP_TAG_FILE" "$TMP_VALUES_FILE"

60
pipeline/deploy.sh Normal file
View File

@@ -0,0 +1,60 @@
#!/bin/bash
set -euo pipefail
# Esegue kubectl apply per ogni sottodirectory di kubernetes separatamente
YAML_DIR="kubernetes"
# ---------------------------------------------------------------------------
# Cerca risorse postgresql.cnpg.io/v1 nei manifest e deploya una ConfigMap
# ---------------------------------------------------------------------------
CNPG_FILE=$(grep -rl "postgresql.cnpg.io/v1" "$YAML_DIR" 2>/dev/null | head -1 || true)
if [ -n "$CNPG_FILE" ]; then
echo "Trovata risorsa postgresql.cnpg.io/v1 in: $CNPG_FILE"
# Estrae metadata.name dal manifest CNPG preferendo yq, altrimenti awk
if command -v yq >/dev/null 2>&1; then
PG_NAME=$(yq eval 'select(.apiVersion == "postgresql.cnpg.io/v1") | .metadata.name' "$CNPG_FILE")
else
PG_NAME=$(awk '/postgresql\.cnpg\.io\/v1/{found=1} found && /^metadata:/{meta=1} meta && /^\s+name:/{print $2; exit}' "$CNPG_FILE")
fi
# Ricava il namespace dal Role namespace-deployer presente nel cluster
PG_NS=$(kubectl --kubeconfig=./kubeconfig get role namespace-deployer \
--no-headers \
-o custom-columns='NS:.metadata.namespace' 2>/dev/null | head -1 || true)
#PG_NS="${PG_NS:-default}"
if [ -z "$PG_NAME" ]; then
echo "⚠️ Impossibile estrarre metadata.name dal cluster CNPG, skip ConfigMap." >&2
else
echo " → cluster: $PG_NAME namespace: $PG_NS"
kubectl --kubeconfig=./kubeconfig apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: service-config
namespace: ${PG_NS}
data:
tipodb: "postgres"
urldb: "${PG_NAME}.${PG_NS}.svc.cluster.local"
EOF
echo "ConfigMap db-config deployata in namespace ${PG_NS}."
fi
fi
# ---------------------------------------------------------------------------
# Deploy di tutti i manifest Kubernetes
# ---------------------------------------------------------------------------
find "$YAML_DIR" -type d | while read DIR; do
if ls "$DIR"/*.yaml 1> /dev/null 2>&1; then
echo "Deploy delle risorse nella directory $DIR..."
kubectl --kubeconfig=./kubeconfig apply -f "$DIR"
fi
done
echo "Deploy completato di tutte le directory YAML."
echo "Eseguo check su endpoint da pubblicare"
/root/work/pipeline/addlistener.sh

36
prepara_nodo.sh Normal file
View File

@@ -0,0 +1,36 @@
# 1. Aggiorna OS
sudo apt update && sudo apt -y upgrade # Ubuntu/Debian
sudo apt install -y iputils-ping
sudo apt install -y telnetd telnet
sudo snap install -y kubectl --classic
sudo apt install -y iptables
sudo apt install -y iptables-persistent
# 2. Disabilita SWAP (necessario)
sudo swapoff -a
sudo sed -i.bak '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 3. Config kernel requisiti Kubernetes (es. bridge netfilter)
cat <<EOF | sudo tee /etc/sysctl.d/99-k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.inotify.max_user_watches = 524288
EOF
sudo sysctl --system
# 4. Sincronizza orologio
sudo apt install -y chrony
sudo systemctl enable --now chrony
#installa yq
sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
sudo chmod a+x /usr/local/bin/yq
# 5. Imposta hostname (es.)
#sudo hostnamectl set-hostname $1

9
primo.sh Normal file
View File

@@ -0,0 +1,9 @@
apt update
git config --global credential.helper store
git clone https://gitlab.com/abaru66/ced.it.git
git config --global user.email a.barucci@htvalue.it
git config --global user.name a.barucci@htvalue.it
cd ced.it
cat hosts >>/etc/hosts

BIN
st_migrationlist.xlsx Normal file

Binary file not shown.

297
st_size.csv Normal file
View File

@@ -0,0 +1,297 @@
namespace;tipo;nome;replicas;cpu_req_cores;mem_req_Mi
accessi-enba;deployments;stqrcodeapi;1;0,002;0
accessi-enbadev;deployments;stqrcodeapi;1;0,002;90
accessi-enbaqa;deployments;stqrcodeapi;0;0,002;62
accessi;deployments;nest;1;0,01;200
accessidev;deployments;nest;1;0,01;200
accessiqa;deployments;nest;0;0,01;200
adria;deployments;nginx;1;0,001;0
agimdev;deployments;allegati;0;0,01;200
agimdev;deployments;apigateway;0;0,01;200
agimdev;deployments;geocode;0;0,01;200
agimdev;deployments;postgrest;0;0;0
algoranddev;deployments;algo;0;0,01;100
allenamenti;deployments;nest;1;0,2;1024
allenamentidev;deployments;nest;1;0,1;512
allenamentiqa;deployments;nest;0;0,1;512
anagrafiche;deployments;nest;1;0,5;4096
anagrafichedev;deployments;nest;1;0,1;512
anagraficheqa;deployments;nest;0;0,1;512
cert-manager;deployments;cert-manager;1;0;0
cert-manager;deployments;cert-manager-cainjector;1;0;0
cert-manager;deployments;cert-manager-webhook;1;0;0
companies;deployments;nest;1;0,5;2048
companiesdev;deployments;nest;1;0,1;512
companiesqa;deployments;nest;0;0,1;512
convocazioni;deployments;nest;1;0,1;0
convocazionidev;deployments;nest;1;0,1;0
convocazioniqa;deployments;nest;0;0,1;0
db;deployments;adminer;1;0,002;0
db;deployments;filebrowser2;1;0,01;0
db;deployments;nfs-server;1;0,002;0
db;deployments;nginx;1;0,001;0
db;deployments;php;1;0,002;0
db;deployments;postgrestadmin;0;0;0
db;deployments;postgrestadminmatch;0;0;0
dbdev;deployments;filebrowser2;1;0,001;8
dbdev;deployments;nfs-server;1;0,002;186
dbdev;deployments;nginx;1;0,001;4
dbdev;deployments;php;1;0,002;8
dbqa;deployments;filebrowser2;0;0,1;0
dbqa;deployments;nfs-server;0;0,001;186
dbqa;deployments;nginx;0;0,001;7
dbqa;deployments;php;0;0,002;8
default;deployments;locust-master;0;0;0
default;deployments;locust-worker;0;0;0
demodev;deployments;nginx;2;0,01;100
dev;deployments;nginx;0;0;0
enbabeapi;deployments;nest;1;0,1;0
enbabeapidev;deployments;nest;1;0,1;0
enbafe;deployments;nginx;1;0;0
enbafedev;deployments;nginx;1;0,001;8
eventi-wow;deployments;nest;1;0,1;0
eventi-wowdev;deployments;nest;1;0,1;0
eventi-wowqa;deployments;nest;0;0,1;0
eventi;deployments;nest;1;0,1;0
eventidev;deployments;nest;1;0,1;0
eventiqa;deployments;nest;0;0,1;0
frontend-club;deployments;nginx;1;0,1;200
frontend-clubdev;deployments;nginx;1;0,001;3
frontend-clubqa;deployments;nginx;0;0,001;3
frontend-limec;deployments;nginx;1;0;0
frontend-limecdev;deployments;nginx;1;0;0
frontend-limecqa;deployments;nginx;1;0;0
frontend-matchdev;deployments;nginx;1;0;0
frontend-sestra;deployments;nginx;1;0;0
frontend-sestradev;deployments;nginx;1;0;0
frontend-sestraqa;deployments;nginx;0;0;0
frontend-wow;deployments;nginx;1;0,001;0
frontend-wowdev;deployments;nginx;1;0,001;3
frontend-wowqa;deployments;nginx;0;0,001;3
gare;deployments;nest;1;0,3;0
garedev;deployments;nest;1;0,1;0
gareqa;deployments;nest;0;0,1;768
gateway-accessi;deployments;nest;1;0,1;0
gateway-accessidev;deployments;nest;1;0,1;0
gateway-accessiqa;deployments;nest;0;0,1;0
gateway-club;deployments;nest;4;0,5;4096
gateway-clubdev;deployments;nest;1;0,3;1024
gateway-clubqa;deployments;nest;0;0,1;0
gateway-csi;deployments;nest;1;0,1;0
gateway-csidev;deployments;nest;1;0,1;0
gateway-csiqa;deployments;nest;0;0,1;0
gateway-limec;deployments;nest;4;0,5;4096
gateway-limecdev;deployments;nest;1;0,3;1024
gateway-match;deployments;nest;1;0,1;0
gateway-matchdev;deployments;nest;1;0,1;0
gateway-matchqa;deployments;nest;0;0,1;0
geco;deployments;nginx;1;0,001;0
gecobe;deployments;nest;1;0,1;0
gecobedev;deployments;nest;1;0,1;0
gecobeqa;deployments;nest;0;0,1;0
gecodev;deployments;nginx;1;0,001;3
gecoqa;deployments;nginx;0;0,001;3
giornalistadev;deployments;nginx;1;0,01;100
gke-connect;deployments;gke-connect-agent-20210430-00-00;1;0,002;0
grafana;deployments;grafana;0;0,002;0
homepage;deployments;nginx;1;0;0
homepagedev;deployments;nginx;1;0,002;5
ingress-nginx2;deployments;nginx2-nginx-ingress;1;1;2000
isclubdev;deployments;apiserver;1;0,1;0
isclubdev;deployments;identityserver;1;0,1;0
isclubdev;deployments;isadmin;1;0,1;0
isclubqa;deployments;apiserver;0;0,1;0
isclubqa;deployments;identityserver;0;0,1;0
isclubqa;deployments;isadmin;0;0,1;0
iscsi;deployments;apiserver;1;0,002;0
iscsi;deployments;identityserver;1;0,002;0
iscsi;deployments;isadmin;1;0,002;0
iscsidev;deployments;apiserver;1;0,1;0
iscsidev;deployments;identityserver;1;0,1;0
iscsidev;deployments;isadmin;1;0,1;0
iscsiqa;deployments;apiserver;0;0,002;70
iscsiqa;deployments;identityserver;0;0,002;78
iscsiqa;deployments;isadmin;0;0,002;70
isenba;deployments;apiserver;1;0,1;0
isenba;deployments;identityserver;1;0,1;0
isenba;deployments;isadmin;1;0,1;0
isenbadev;deployments;apiserver;1;0,1;0
isenbadev;deployments;identityserver;1;0,1;0
isenbadev;deployments;isadmin;1;0,1;0
isenbaqa;deployments;apiserver;0;0,1;0
isenbaqa;deployments;identityserver;0;0,1;0
isenbaqa;deployments;isadmin;0;0,1;0
ismatch;deployments;apiserver;1;0,002;0
ismatch;deployments;identityserver;1;0,002;0
ismatch;deployments;isadmin;1;0,002;0
ismatchdev;deployments;apiserver;1;0,1;0
ismatchdev;deployments;identityserver;1;0,1;0
ismatchdev;deployments;isadmin;1;0,1;0
ismatchqa;deployments;apiserver;0;0,002;64
ismatchqa;deployments;identityserver;0;0,002;80
ismatchqa;deployments;isadmin;0;0,002;59
ispub;deployments;apiserver;1;0,002;0
ispub;deployments;identityserver;1;0,002;0
ispub;deployments;isadmin;1;0,002;0
ispubdev;deployments;apiserver;1;0,1;0
ispubdev;deployments;identityserver;1;0,1;0
ispubdev;deployments;isadmin;1;0,1;0
ispubqa;deployments;apiserver;0;0,002;69
ispubqa;deployments;identityserver;0;0,002;84
ispubqa;deployments;isadmin;0;0,002;60
isstaysafe-primario;deployments;apiserver;1;0,1;0
isstaysafe-primario;deployments;identityserver;1;0,1;0
isstaysafe-primario;deployments;isadmin;1;0,1;0
isstaysafe-primariodev;deployments;apiserver;1;0,1;0
isstaysafe-primariodev;deployments;identityserver;1;0,1;0
isstaysafe-primariodev;deployments;isadmin;1;0,1;0
isstaysafe-primarioqa;deployments;apiserver;0;0,1;0
isstaysafe-primarioqa;deployments;identityserver;0;0,1;0
isstaysafe-primarioqa;deployments;isadmin;0;0,1;0
isstaysafe;deployments;apiserver;1;0,002;0
isstaysafe;deployments;identityserver;1;0,002;0
isstaysafe;deployments;isadmin;1;0,002;0
isstaysafedev;deployments;apiserver;1;0,002;80
isstaysafedev;deployments;identityserver;1;0,002;76
isstaysafedev;deployments;isadmin;1;0,002;61
isstaysafeqa;deployments;apiserver;0;0,002;67
isstaysafeqa;deployments;identityserver;0;0,002;83
isstaysafeqa;deployments;isadmin;0;0,002;59
kube-downscaler;deployments;kube-downscaler;1;0,03;0
kube-system;deployments;konnectivity-agent;8;0,015;60
kube-system;deployments;konnectivity-agent-autoscaler;1;0,01;10
kube-system;deployments;kube-dns;3;0,27;155
kube-system;deployments;kube-dns-autoscaler;1;0,02;10
kube-system;deployments;kube-state-metrics;1;0;0
kube-system;deployments;l7-default-backend;1;0,01;20
kube-system;deployments;metrics-server-v1,35,1;1;0,065;231
kube-system;deployments;tiller-deploy;0;0;0
licenze;deployments;nest;1;0,01;200
licenzedev;deployments;nest;1;0,01;200
licenzeqa;deployments;nest;0;0,01;200
limecaccessi;deployments;nest;1;0,01;200
limecaccessidev;deployments;nest;1;0,01;200
limecallenamenti;deployments;nest;1;0,2;1024
limecallenamentidev;deployments;nest;1;0,1;512
limecanagrafiche;deployments;nest;1;0,5;2048
limecanagrafichedev;deployments;nest;1;0,1;512
limeccarriere;deployments;nest;1;0,5;2048
limeccarrieredev;deployments;nest;1;0,1;512
limeccompanies;deployments;nest;1;0,5;2048
limeccompaniesdev;deployments;nest;1;0,1;512
limecconvocazioni;deployments;nest;1;0,1;0
limecconvocazionidev;deployments;nest;1;0,1;0
limeceventi;deployments;nest;1;0,1;0
limeceventidev;deployments;nest;1;0,1;0
limecgare;deployments;nest;1;0,3;0
limecgaredev;deployments;nest;1;0,1;0
limeclicenze;deployments;nest;1;0,01;200
limeclicenzedev;deployments;nest;1;0,01;200
limecmailsms;deployments;nest;1;0,1;0
limecmailsmsdev;deployments;nest;1;0,1;0
limecmoduli;deployments;nest;1;0,5;2048
limecmodulidev;deployments;nest;1;0,1;0
limecnotifiche;deployments;nest;1;0,01;200
limecnotifichedev;deployments;nest;1;0,01;200
limecsponsor;deployments;nest;1;0,5;2048
limecsponsordev;deployments;nest;1;0,1;0
limecstrutture;deployments;nest;1;0,1;0
limecstrutturedev;deployments;nest;1;0,1;0
limecsupertokens;deployments;supertoken;1;0,1;200
limecsupertokensdev;deployments;supertoken;1;0,1;200
localita;deployments;nest;1;0,1;0
localitadev;deployments;nest;1;0,1;0
localitaqa;deployments;nest;0;0,1;0
mailsms;deployments;nest;1;0,1;0
mailsmsdev;deployments;nest;1;0,1;0
mailsmsqa;deployments;nest;0;0,1;0
mockapidev;deployments;node;1;0,001;35
moduli;deployments;nest;1;0,5;2048
modulidev;deployments;nest;1;0,1;0
moduliqa;deployments;nest;0;0,1;0
mongodb;deployments;mongo-express;1;0,002;0
mongodb;deployments;mongodb-kubernetes-operator;1;0,002;0
mongodbdev;deployments;mongo-express;1;0,002;61
mongodbdev;deployments;mongodb-kubernetes-operator;1;0,002;18
mongodbqa;deployments;mongodb-kubernetes-operator;0;0,002;16
nocodbdev;deployments;nocodb;1;0,01;100
notifiche;deployments;nest;1;0,01;200
notifichedev;deployments;nest;1;0,01;200
notificheqa;deployments;nest;0;0,01;200
pgare;deployments;nginx;0;0,002;0
pgare;deployments;nodepgare;1;0,001;0
pgare;deployments;postgrest;1;0,004;0
pgare;deployments;pwafed;1;0,001;0
pgaredev;deployments;nginx;0;0,001;3
pgaredev;deployments;nodepgare;0;0,1;0
pgaredev;deployments;postgrest;0;0,003;19
pgaredev;deployments;pwafed;0;0,001;4
prenotazione;deployments;prenotazione;1;0,003;0
prenotazionedev;deployments;prenotazione;1;0,1;0
prenotazioneqa;deployments;prenotazione;0;0,003;121
prenotazioni-clubdev;deployments;prenotazione;1;0,1;0
prenotazioni-clubqa;deployments;prenotazione;0;0,002;37
prenotazioni-csi;deployments;prenotazione;1;0,003;0
prenotazioni-csidev;deployments;prenotazione;1;0,1;0
prenotazioni-csiqa;deployments;prenotazione;0;0,003;122
prenotazioni-enba;deployments;prenotazione;1;0,1;0
prenotazioni-enbadev;deployments;prenotazione;1;0,1;0
prenotazioni-enbaqa;deployments;prenotazione;0;0,1;0
qrcodeapi;deployments;stqrcodeapi;0;0,002;0
rabbitmq-system;deployments;rabbitmq-cluster-operator;1;0,2;500
referti;deployments;nest;1;0,1;256
refertidev;deployments;nest;1;0,1;256
refertiqa;deployments;nest;0;0,1;0
sestrabeapi;deployments;nest;1;0,1;0
sestrabeapidev;deployments;nest;1;0,1;0
sestrabeapiqa;deployments;nest;0;0,1;0
sonarq;deployments;sonarqube;0;0,009;0
sponsor;deployments;nest;1;0,5;2048
sponsordev;deployments;nest;1;0,1;0
sponsorqa;deployments;nest;0;0,1;0
stayrsa;deployments;nginx;1;0,001;0
stayrsadev;deployments;nginx;1;0,001;8
stayrsaqa;deployments;nginx;0;0,001;4
staysafebeapi;deployments;nest;1;0,1;0
staysafebeapidev;deployments;nest;1;0,1;0
staysafebeapiqa;deployments;nest;0;0,06;581
staysafebeqa;deployments;nodestaysafebe;0;0,08;505
strutture;deployments;nest;1;0,1;0
strutturedev;deployments;nest;1;0,1;0
struttureqa;deployments;nest;0;0,1;0
supertokens;deployments;supertoken;1;0,1;200
supertokens;deployments;supertoken-match;1;0,1;200
supertokens;deployments;supertoken-sestra;1;0,101;200
supertokensdev;deployments;supertoken;1;0,1;200
supertokensdev;deployments;supertoken-match;1;0,1;200
supertokensdev;deployments;supertoken-sestra;1;0,101;200
supertokensqa;deployments;supertoken;0;0,1;200
supertokensqa;deployments;supertoken-match;0;0,1;200
supertokensqa;deployments;supertoken-sestra;0;0,101;200
tornei;deployments;nest;1;0,01;200
torneidev;deployments;nest;1;0,01;200
torneiqa;deployments;nest;0;0,01;200
utenti-sporteamsdev;deployments;nest;1;0,1;0
utenti-sporteamsqa;deployments;nest;0;0,1;0
verdaccio;deployments;verdaccio;1;0,001;0
webhooks;deployments;nest;1;0,01;200
webhooksdev;deployments;nest;1;0,01;200
webhooksqa;deployments;nest;0;0,01;200
db;statefulsets;limecrabbitmqcluster-server;1;0,1;1024
db;statefulsets;postgresql-1-postgresql;1;1,5;3000
db;statefulsets;rabbitmqcluster-server;1;0,1;1024
db16;statefulsets;postgresql-16-postgresql;1;0,1;100
dbdev;statefulsets;limecrabbitmqcluster-server;1;0,1;1024
dbdev;statefulsets;postgresql-1-postgresql;1;0,1;100
dbdev;statefulsets;rabbitmqcluster-server;3;0,1;1024
dbdev16;statefulsets;postgresql-16-postgresql;1;0,1;100
dbqa;statefulsets;limecrabbitmqcluster-server;1;0,1;1024
dbqa;statefulsets;postgresql-1-postgresql;0;0,1;100
dbqa;statefulsets;rabbitmqcluster-server;1;0,1;1024
dbqa16;statefulsets;postgresql-16-postgresql;1;0,1;100
isdb;statefulsets;postgresql-1-postgresql;1;0,1;100
isdbdev;statefulsets;postgresql-1-postgresql;0;0,1;100
isdbqa;statefulsets;postgresql-1-postgresql;0;0,1;100
mongodb;statefulsets;mongodb-replica-set;3;0,4;400
mongodbdev;statefulsets;mongodb-replica-set;3;0,4;400
mongodbqa;statefulsets;mongodb-replica-set;0;0,4;400
1 namespace tipo nome replicas cpu_req_cores mem_req_Mi
2 accessi-enba deployments stqrcodeapi 1 0,002 0
3 accessi-enbadev deployments stqrcodeapi 1 0,002 90
4 accessi-enbaqa deployments stqrcodeapi 0 0,002 62
5 accessi deployments nest 1 0,01 200
6 accessidev deployments nest 1 0,01 200
7 accessiqa deployments nest 0 0,01 200
8 adria deployments nginx 1 0,001 0
9 agimdev deployments allegati 0 0,01 200
10 agimdev deployments apigateway 0 0,01 200
11 agimdev deployments geocode 0 0,01 200
12 agimdev deployments postgrest 0 0 0
13 algoranddev deployments algo 0 0,01 100
14 allenamenti deployments nest 1 0,2 1024
15 allenamentidev deployments nest 1 0,1 512
16 allenamentiqa deployments nest 0 0,1 512
17 anagrafiche deployments nest 1 0,5 4096
18 anagrafichedev deployments nest 1 0,1 512
19 anagraficheqa deployments nest 0 0,1 512
20 cert-manager deployments cert-manager 1 0 0
21 cert-manager deployments cert-manager-cainjector 1 0 0
22 cert-manager deployments cert-manager-webhook 1 0 0
23 companies deployments nest 1 0,5 2048
24 companiesdev deployments nest 1 0,1 512
25 companiesqa deployments nest 0 0,1 512
26 convocazioni deployments nest 1 0,1 0
27 convocazionidev deployments nest 1 0,1 0
28 convocazioniqa deployments nest 0 0,1 0
29 db deployments adminer 1 0,002 0
30 db deployments filebrowser2 1 0,01 0
31 db deployments nfs-server 1 0,002 0
32 db deployments nginx 1 0,001 0
33 db deployments php 1 0,002 0
34 db deployments postgrestadmin 0 0 0
35 db deployments postgrestadminmatch 0 0 0
36 dbdev deployments filebrowser2 1 0,001 8
37 dbdev deployments nfs-server 1 0,002 186
38 dbdev deployments nginx 1 0,001 4
39 dbdev deployments php 1 0,002 8
40 dbqa deployments filebrowser2 0 0,1 0
41 dbqa deployments nfs-server 0 0,001 186
42 dbqa deployments nginx 0 0,001 7
43 dbqa deployments php 0 0,002 8
44 default deployments locust-master 0 0 0
45 default deployments locust-worker 0 0 0
46 demodev deployments nginx 2 0,01 100
47 dev deployments nginx 0 0 0
48 enbabeapi deployments nest 1 0,1 0
49 enbabeapidev deployments nest 1 0,1 0
50 enbafe deployments nginx 1 0 0
51 enbafedev deployments nginx 1 0,001 8
52 eventi-wow deployments nest 1 0,1 0
53 eventi-wowdev deployments nest 1 0,1 0
54 eventi-wowqa deployments nest 0 0,1 0
55 eventi deployments nest 1 0,1 0
56 eventidev deployments nest 1 0,1 0
57 eventiqa deployments nest 0 0,1 0
58 frontend-club deployments nginx 1 0,1 200
59 frontend-clubdev deployments nginx 1 0,001 3
60 frontend-clubqa deployments nginx 0 0,001 3
61 frontend-limec deployments nginx 1 0 0
62 frontend-limecdev deployments nginx 1 0 0
63 frontend-limecqa deployments nginx 1 0 0
64 frontend-matchdev deployments nginx 1 0 0
65 frontend-sestra deployments nginx 1 0 0
66 frontend-sestradev deployments nginx 1 0 0
67 frontend-sestraqa deployments nginx 0 0 0
68 frontend-wow deployments nginx 1 0,001 0
69 frontend-wowdev deployments nginx 1 0,001 3
70 frontend-wowqa deployments nginx 0 0,001 3
71 gare deployments nest 1 0,3 0
72 garedev deployments nest 1 0,1 0
73 gareqa deployments nest 0 0,1 768
74 gateway-accessi deployments nest 1 0,1 0
75 gateway-accessidev deployments nest 1 0,1 0
76 gateway-accessiqa deployments nest 0 0,1 0
77 gateway-club deployments nest 4 0,5 4096
78 gateway-clubdev deployments nest 1 0,3 1024
79 gateway-clubqa deployments nest 0 0,1 0
80 gateway-csi deployments nest 1 0,1 0
81 gateway-csidev deployments nest 1 0,1 0
82 gateway-csiqa deployments nest 0 0,1 0
83 gateway-limec deployments nest 4 0,5 4096
84 gateway-limecdev deployments nest 1 0,3 1024
85 gateway-match deployments nest 1 0,1 0
86 gateway-matchdev deployments nest 1 0,1 0
87 gateway-matchqa deployments nest 0 0,1 0
88 geco deployments nginx 1 0,001 0
89 gecobe deployments nest 1 0,1 0
90 gecobedev deployments nest 1 0,1 0
91 gecobeqa deployments nest 0 0,1 0
92 gecodev deployments nginx 1 0,001 3
93 gecoqa deployments nginx 0 0,001 3
94 giornalistadev deployments nginx 1 0,01 100
95 gke-connect deployments gke-connect-agent-20210430-00-00 1 0,002 0
96 grafana deployments grafana 0 0,002 0
97 homepage deployments nginx 1 0 0
98 homepagedev deployments nginx 1 0,002 5
99 ingress-nginx2 deployments nginx2-nginx-ingress 1 1 2000
100 isclubdev deployments apiserver 1 0,1 0
101 isclubdev deployments identityserver 1 0,1 0
102 isclubdev deployments isadmin 1 0,1 0
103 isclubqa deployments apiserver 0 0,1 0
104 isclubqa deployments identityserver 0 0,1 0
105 isclubqa deployments isadmin 0 0,1 0
106 iscsi deployments apiserver 1 0,002 0
107 iscsi deployments identityserver 1 0,002 0
108 iscsi deployments isadmin 1 0,002 0
109 iscsidev deployments apiserver 1 0,1 0
110 iscsidev deployments identityserver 1 0,1 0
111 iscsidev deployments isadmin 1 0,1 0
112 iscsiqa deployments apiserver 0 0,002 70
113 iscsiqa deployments identityserver 0 0,002 78
114 iscsiqa deployments isadmin 0 0,002 70
115 isenba deployments apiserver 1 0,1 0
116 isenba deployments identityserver 1 0,1 0
117 isenba deployments isadmin 1 0,1 0
118 isenbadev deployments apiserver 1 0,1 0
119 isenbadev deployments identityserver 1 0,1 0
120 isenbadev deployments isadmin 1 0,1 0
121 isenbaqa deployments apiserver 0 0,1 0
122 isenbaqa deployments identityserver 0 0,1 0
123 isenbaqa deployments isadmin 0 0,1 0
124 ismatch deployments apiserver 1 0,002 0
125 ismatch deployments identityserver 1 0,002 0
126 ismatch deployments isadmin 1 0,002 0
127 ismatchdev deployments apiserver 1 0,1 0
128 ismatchdev deployments identityserver 1 0,1 0
129 ismatchdev deployments isadmin 1 0,1 0
130 ismatchqa deployments apiserver 0 0,002 64
131 ismatchqa deployments identityserver 0 0,002 80
132 ismatchqa deployments isadmin 0 0,002 59
133 ispub deployments apiserver 1 0,002 0
134 ispub deployments identityserver 1 0,002 0
135 ispub deployments isadmin 1 0,002 0
136 ispubdev deployments apiserver 1 0,1 0
137 ispubdev deployments identityserver 1 0,1 0
138 ispubdev deployments isadmin 1 0,1 0
139 ispubqa deployments apiserver 0 0,002 69
140 ispubqa deployments identityserver 0 0,002 84
141 ispubqa deployments isadmin 0 0,002 60
142 isstaysafe-primario deployments apiserver 1 0,1 0
143 isstaysafe-primario deployments identityserver 1 0,1 0
144 isstaysafe-primario deployments isadmin 1 0,1 0
145 isstaysafe-primariodev deployments apiserver 1 0,1 0
146 isstaysafe-primariodev deployments identityserver 1 0,1 0
147 isstaysafe-primariodev deployments isadmin 1 0,1 0
148 isstaysafe-primarioqa deployments apiserver 0 0,1 0
149 isstaysafe-primarioqa deployments identityserver 0 0,1 0
150 isstaysafe-primarioqa deployments isadmin 0 0,1 0
151 isstaysafe deployments apiserver 1 0,002 0
152 isstaysafe deployments identityserver 1 0,002 0
153 isstaysafe deployments isadmin 1 0,002 0
154 isstaysafedev deployments apiserver 1 0,002 80
155 isstaysafedev deployments identityserver 1 0,002 76
156 isstaysafedev deployments isadmin 1 0,002 61
157 isstaysafeqa deployments apiserver 0 0,002 67
158 isstaysafeqa deployments identityserver 0 0,002 83
159 isstaysafeqa deployments isadmin 0 0,002 59
160 kube-downscaler deployments kube-downscaler 1 0,03 0
161 kube-system deployments konnectivity-agent 8 0,015 60
162 kube-system deployments konnectivity-agent-autoscaler 1 0,01 10
163 kube-system deployments kube-dns 3 0,27 155
164 kube-system deployments kube-dns-autoscaler 1 0,02 10
165 kube-system deployments kube-state-metrics 1 0 0
166 kube-system deployments l7-default-backend 1 0,01 20
167 kube-system deployments metrics-server-v1,35,1 1 0,065 231
168 kube-system deployments tiller-deploy 0 0 0
169 licenze deployments nest 1 0,01 200
170 licenzedev deployments nest 1 0,01 200
171 licenzeqa deployments nest 0 0,01 200
172 limecaccessi deployments nest 1 0,01 200
173 limecaccessidev deployments nest 1 0,01 200
174 limecallenamenti deployments nest 1 0,2 1024
175 limecallenamentidev deployments nest 1 0,1 512
176 limecanagrafiche deployments nest 1 0,5 2048
177 limecanagrafichedev deployments nest 1 0,1 512
178 limeccarriere deployments nest 1 0,5 2048
179 limeccarrieredev deployments nest 1 0,1 512
180 limeccompanies deployments nest 1 0,5 2048
181 limeccompaniesdev deployments nest 1 0,1 512
182 limecconvocazioni deployments nest 1 0,1 0
183 limecconvocazionidev deployments nest 1 0,1 0
184 limeceventi deployments nest 1 0,1 0
185 limeceventidev deployments nest 1 0,1 0
186 limecgare deployments nest 1 0,3 0
187 limecgaredev deployments nest 1 0,1 0
188 limeclicenze deployments nest 1 0,01 200
189 limeclicenzedev deployments nest 1 0,01 200
190 limecmailsms deployments nest 1 0,1 0
191 limecmailsmsdev deployments nest 1 0,1 0
192 limecmoduli deployments nest 1 0,5 2048
193 limecmodulidev deployments nest 1 0,1 0
194 limecnotifiche deployments nest 1 0,01 200
195 limecnotifichedev deployments nest 1 0,01 200
196 limecsponsor deployments nest 1 0,5 2048
197 limecsponsordev deployments nest 1 0,1 0
198 limecstrutture deployments nest 1 0,1 0
199 limecstrutturedev deployments nest 1 0,1 0
200 limecsupertokens deployments supertoken 1 0,1 200
201 limecsupertokensdev deployments supertoken 1 0,1 200
202 localita deployments nest 1 0,1 0
203 localitadev deployments nest 1 0,1 0
204 localitaqa deployments nest 0 0,1 0
205 mailsms deployments nest 1 0,1 0
206 mailsmsdev deployments nest 1 0,1 0
207 mailsmsqa deployments nest 0 0,1 0
208 mockapidev deployments node 1 0,001 35
209 moduli deployments nest 1 0,5 2048
210 modulidev deployments nest 1 0,1 0
211 moduliqa deployments nest 0 0,1 0
212 mongodb deployments mongo-express 1 0,002 0
213 mongodb deployments mongodb-kubernetes-operator 1 0,002 0
214 mongodbdev deployments mongo-express 1 0,002 61
215 mongodbdev deployments mongodb-kubernetes-operator 1 0,002 18
216 mongodbqa deployments mongodb-kubernetes-operator 0 0,002 16
217 nocodbdev deployments nocodb 1 0,01 100
218 notifiche deployments nest 1 0,01 200
219 notifichedev deployments nest 1 0,01 200
220 notificheqa deployments nest 0 0,01 200
221 pgare deployments nginx 0 0,002 0
222 pgare deployments nodepgare 1 0,001 0
223 pgare deployments postgrest 1 0,004 0
224 pgare deployments pwafed 1 0,001 0
225 pgaredev deployments nginx 0 0,001 3
226 pgaredev deployments nodepgare 0 0,1 0
227 pgaredev deployments postgrest 0 0,003 19
228 pgaredev deployments pwafed 0 0,001 4
229 prenotazione deployments prenotazione 1 0,003 0
230 prenotazionedev deployments prenotazione 1 0,1 0
231 prenotazioneqa deployments prenotazione 0 0,003 121
232 prenotazioni-clubdev deployments prenotazione 1 0,1 0
233 prenotazioni-clubqa deployments prenotazione 0 0,002 37
234 prenotazioni-csi deployments prenotazione 1 0,003 0
235 prenotazioni-csidev deployments prenotazione 1 0,1 0
236 prenotazioni-csiqa deployments prenotazione 0 0,003 122
237 prenotazioni-enba deployments prenotazione 1 0,1 0
238 prenotazioni-enbadev deployments prenotazione 1 0,1 0
239 prenotazioni-enbaqa deployments prenotazione 0 0,1 0
240 qrcodeapi deployments stqrcodeapi 0 0,002 0
241 rabbitmq-system deployments rabbitmq-cluster-operator 1 0,2 500
242 referti deployments nest 1 0,1 256
243 refertidev deployments nest 1 0,1 256
244 refertiqa deployments nest 0 0,1 0
245 sestrabeapi deployments nest 1 0,1 0
246 sestrabeapidev deployments nest 1 0,1 0
247 sestrabeapiqa deployments nest 0 0,1 0
248 sonarq deployments sonarqube 0 0,009 0
249 sponsor deployments nest 1 0,5 2048
250 sponsordev deployments nest 1 0,1 0
251 sponsorqa deployments nest 0 0,1 0
252 stayrsa deployments nginx 1 0,001 0
253 stayrsadev deployments nginx 1 0,001 8
254 stayrsaqa deployments nginx 0 0,001 4
255 staysafebeapi deployments nest 1 0,1 0
256 staysafebeapidev deployments nest 1 0,1 0
257 staysafebeapiqa deployments nest 0 0,06 581
258 staysafebeqa deployments nodestaysafebe 0 0,08 505
259 strutture deployments nest 1 0,1 0
260 strutturedev deployments nest 1 0,1 0
261 struttureqa deployments nest 0 0,1 0
262 supertokens deployments supertoken 1 0,1 200
263 supertokens deployments supertoken-match 1 0,1 200
264 supertokens deployments supertoken-sestra 1 0,101 200
265 supertokensdev deployments supertoken 1 0,1 200
266 supertokensdev deployments supertoken-match 1 0,1 200
267 supertokensdev deployments supertoken-sestra 1 0,101 200
268 supertokensqa deployments supertoken 0 0,1 200
269 supertokensqa deployments supertoken-match 0 0,1 200
270 supertokensqa deployments supertoken-sestra 0 0,101 200
271 tornei deployments nest 1 0,01 200
272 torneidev deployments nest 1 0,01 200
273 torneiqa deployments nest 0 0,01 200
274 utenti-sporteamsdev deployments nest 1 0,1 0
275 utenti-sporteamsqa deployments nest 0 0,1 0
276 verdaccio deployments verdaccio 1 0,001 0
277 webhooks deployments nest 1 0,01 200
278 webhooksdev deployments nest 1 0,01 200
279 webhooksqa deployments nest 0 0,01 200
280 db statefulsets limecrabbitmqcluster-server 1 0,1 1024
281 db statefulsets postgresql-1-postgresql 1 1,5 3000
282 db statefulsets rabbitmqcluster-server 1 0,1 1024
283 db16 statefulsets postgresql-16-postgresql 1 0,1 100
284 dbdev statefulsets limecrabbitmqcluster-server 1 0,1 1024
285 dbdev statefulsets postgresql-1-postgresql 1 0,1 100
286 dbdev statefulsets rabbitmqcluster-server 3 0,1 1024
287 dbdev16 statefulsets postgresql-16-postgresql 1 0,1 100
288 dbqa statefulsets limecrabbitmqcluster-server 1 0,1 1024
289 dbqa statefulsets postgresql-1-postgresql 0 0,1 100
290 dbqa statefulsets rabbitmqcluster-server 1 0,1 1024
291 dbqa16 statefulsets postgresql-16-postgresql 1 0,1 100
292 isdb statefulsets postgresql-1-postgresql 1 0,1 100
293 isdbdev statefulsets postgresql-1-postgresql 0 0,1 100
294 isdbqa statefulsets postgresql-1-postgresql 0 0,1 100
295 mongodb statefulsets mongodb-replica-set 3 0,4 400
296 mongodbdev statefulsets mongodb-replica-set 3 0,4 400
297 mongodbqa statefulsets mongodb-replica-set 0 0,4 400

BIN
st_size.xlsx Normal file

Binary file not shown.

135
template.txt Normal file
View File

@@ -0,0 +1,135 @@
Template architetturali
1) fronteend (nginx) + backend (nodejs)
2) fronteend (nginx) + backend (nodejs) + db Postgresql
3) fronteend (nginx) + backend (nodejs) + db Mysql
4) fronteend (nginx) + backend (nodejs) + db mongoDb
5) fronteend (nginx) + backend (nodejs) + db mongoDb + S3
6) fronteend (nginx) + backend (nodejs) + db InfluxDb + S3
Opzione proporre i vari "Lego Bricks" da comporre come vuoi
---
# 🧱 Categorie di template (essenziali)
## 1⃣ Microservizio Backend (core della piattaforma)
### 🎯 Use case
* API REST
* business logic
* servizi core
### 🔧 Stack tipici
* Java (Spring Boot)
* Node.js (NestJS)
* Python (FastAPI)
---
## 2⃣ Worker / Job / Event-driven
### 🎯 Use case
* consumer Kafka / RabbitMQ
* batch processing
* cron job
### 📦 Include
* queue integration
* retry / DLQ
* idempotenza
* scaling (HPA su queue)
---
## 3⃣ Frontend Web App
### 🎯 Use case
* UI applicativa
### 🔧 Stack
* React / Angular / Vue
---
## 4⃣ API Gateway / BFF
### 🎯 Use case
* orchestrazione API
* security
* aggregation
### 📦 Include
* auth (OIDC)
* rate limit
* routing
---
## 5⃣ Data Service (DB-enabled service)
### 🎯 Use case
* servizi con DB dedicato
### 📦 Include
* provisioning DB (CNPG 👀)
* migration (Flyway/Liquibase)
* backup automatico
* secret injection
## 6⃣ AI / Batch / Data Pipeline (avanzato)
### 🎯 Use case
* ETL
* ML
* data processing
---------------------------------------------------------------------
# 🧩 Template trasversali (fondamentali)
## 🔐 Security baseline
* OIDC (Keycloak)
* RBAC
* Secret management
## 📊 Observability
* logging (Loki)
* metrics (Prometheus)
* tracing (Tempo)
## 🚀 CI/CD template
* build
* scan (SAST, container)
* deploy
* rollback
## 🧪 Testing
* unit
* integration
* contract test

32
todo_list.txt Normal file
View File

@@ -0,0 +1,32 @@
attività:
backup database
-->backup etcd
gestione centralizzta log
-->idp portal - k8s Ui + log
idp portal - identificare legobrick
idp portal - formato file legobrick
idp portal - formato file architettura
idp portal - display architettura componente
idp portal - display palette legobrick
idp portal - funzioni UI di drag and drop
idp portal - comandi git di merge template repo
idp portal - remove componenti
idp portal - autenticazione/profilazione
idp portal - accesso log applicativi
Kyverno - installazione
Kyverno - predisposizione policy per taint autmatica edgenode
-->kubeedge - label/taint per progetto
git - gestione release
git tagging
curl -X 'POST' \
'https://git.italiadatacenter.com/api/v1/repos/STS_Lab/idcidp/tags?access_token=65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"message": "string",
"tag_name": "v1.0",
"target": "ab3e33a214"
}'

59
utils.txt Normal file
View File

@@ -0,0 +1,59 @@
#master node
cd /etc/rancher/rke2/
sudo systemctl restart rke2-server.service
journalctl -xeu rke2-server.service -f
#worker node
sudo systemctl restart rke2-agent.service
sudo systemctl stop rke2-agent.service
sudo systemctl start rke2-agent.service
journalctl -xeu rke2-agent.service -f
cat /var/lib/rancher/rke2/agent/logs/kubelet.log
#load balancer
/etc/haproxy/haproxy.cfg
sudo systemctl restart haproxy
journalctl -xeu haproxy.service -f
tail -f /var/log/haproxy.log
http://<load balancer vm external ip>:8080/stats (admin/admin)
Console rancher: https://rancher.pigreco66.it/ (AdminJapp0cam)
************Check risorse***************
kubectl resource-capacity
kubectl create -n demo-apps -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: swiss-army-knife
labels:
app: swiss-army-knife
spec:
containers:
- name: swiss-army-knife
image: leodotcloud/swiss-army-knife:latest
command: ["/bin/sleep", "3650d"]
imagePullPolicy: IfNotPresent
restartPolicy: Always
EOF
kubectl -n demo-apps exec -it swiss-army-knife -- sh
# Source - https://stackoverflow.com/a/59558862
# Posted by P Ekambaram, modified by community. See post 'Timeline' for change history
# Retrieved 2026-02-28, License - CC BY-SA 4.0
gateway-nginx-nodeport.nginx-gateway.svc.cluster.local:30864
kubectl exec -n nginx-gateway main-gateway-nginx-6968db7f9f-6v4qg -- ss -tulnp
kubectl edit gateway main-gateway -n nginx-gateway
glpat-E67BjdXoKvSEgHG31XZW0GM6MQpvOjEKdTozNzF5OQ8.01.171191k74

29
worker-installa_rke2.sh Normal file
View File

@@ -0,0 +1,29 @@
# Install RKE2 agent
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sudo sh -
# Create configuration
sudo mkdir -p /etc/rancher/rke2
# Worker configuration - connects through the load balancer!
sudo tee /etc/rancher/rke2/config.yaml > /dev/null << EOF
# RKE2 Agent Configuration
server: https://POC-Kube-Balancer:9345 # Using the main load balancer!
token: "K10b8b252de84e5aab8bc1d2a8e4aad3e329ee84d638892b8638de0260b7cb8212a::server:34b189ab7b91fc924500ba0b3608b80b"
# Node labels for workload scheduling
node-label:
- "node.kubernetes.io/worker=true"
- "workload-type=general"
# Optional: Reserve resources for system stability
# kubelet-arg:
# - "system-reserved=cpu=500m,memory=1Gi"
# - "kube-reserved=cpu=500m,memory=1Gi"
EOF
# Start the worker
sudo systemctl enable rke2-agent.service
sudo systemctl start rke2-agent.service
# Check status
sudo systemctl status rke2-agent.service