Technical architectural analysis, practical configuration manifests, and deployment instructions for Helmfile Declarative CD Archi: Multi-Env.
Information
References
gitops repository
Cluster Version
Development environment information | Cluster Version
Architectures
Cluster Installation
Global Setting
vi /etc/systemd/resolved.conf
>>>
[Resolve]
DNS=<management_node_ip> 8.8.8.8
<<<
systemctl restart systemd-resolved.service
in NFS Server
NFS Server Installation
# ์ด ๋ฆฌํฌ์์ ๋ด์ฉ ๋ณต์ฌํด ํ์ผ ์์ฑ ์ถ์ฒ
vi setup-nfs-server.sh
chmod +x setup-nfs-server.sh
./setup-nfs-server.sh
in Business-cluster HAProxy Servers
HAProxy Installation & setting
# Dev-LB, Stg-LB Nodes
sudo apt-get update && apt-get -y upgrade
apt install -y haproxy
sudo systemctl enable haproxy
sudo systemctl start haproxy
sudo systemctl status haproxy
haproxy -v
# config ์์ฑ
CP1_IP=""
CP2_IP=""
CP3_IP=""
WK1_IP=""
WK2_IP=""
WK3_IP=""
cat <<EOF > /etc/haproxy/haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
timeout connect 5000
timeout client 50000
timeout server 50000
frontend k8s_api
bind *:6443
mode tcp
option tcplog
default_backend k8s_api_backend
backend k8s_api_backend
mode tcp
balance roundrobin
option tcp-check
server master1 $CP1_IP:6443 check
server master2 $CP2_IP:6443 check
server master3 $CP3_IP:6443 check
frontend nginx_ingress
bind *:443
mode tcp
option tcplog
default_backend nginx_ingress_backend
backend nginx_ingress_backend
mode tcp
balance roundrobin
option tcp-check
server worker1 $WK1_IP:30443 check
server worker2 $WK2_IP:30443 check
server worker3 $WK3_IP:30443 check
frontend nginx_ingress_http
bind *:80
mode tcp
option tcplog
default_backend nginx_ingress_http_backend
backend nginx_ingress_http_backend
mode tcp
balance roundrobin
option tcp-check
server worker1 $WK1_IP:30080 check
server worker2 $WK2_IP:30080 check
server worker3 $WK3_IP:30080 check
frontend amqp
bind *:5672
mode tcp
option tcplog
default_backend amqp_backend
backend amqp_backend
mode tcp
balance roundrobin
option tcp-check
server worker1 $WK1_IP:30672 check
server worker2 $WK2_IP:30672 check
server worker3 $WK3_IP:30672 check
frontend mariadb
bind *:3306
mode tcp
option tcplog
default_backend mariadb_backend
backend mariadb_backend
mode tcp
balance roundrobin
option tcp-check
server worker1 $WK1_IP:30306 check
server worker2 $WK2_IP:30306 check
server worker3 $WK3_IP:30306 check
frontend redis
bind *:6379
mode tcp
option tcplog
default_backend redis_backend
backend redis_backend
mode tcp
balance roundrobin
option tcp-check
server worker1 $WK1_IP:30379 check
server worker2 $WK2_IP:30379 check
server worker3 $WK3_IP:30379 check
frontend keycloak_http
bind *:8880
mode tcp
option tcplog
default_backend keycloak_http_backend
backend keycloak_http_backend
mode tcp
balance roundrobin
option tcp-check
server worker1 $WK1_IP:31080 check
server worker2 $WK2_IP:31080 check
server worker3 $WK3_IP:31080 check
EOF
systemctl restart haproxy
in Management-cluster
Kube-VIP: Select VIP, check NIC (failed due to ARP blocking in Openstack Network) (35a00f54)
โ ๏ธ (If the band is different from the business cluster or the NIC name may be different, proceed in that cluster. This is the same Openstack Network, so proceed in Management)
- Select VIPs for dev and stg and remember them
- VIP:
bash
apt install -y nmap
# Check host down IP
### Use the results below except x.x.x.0, x.x.x.1, x.x.x.255 (reservation address)
needs_net="10.255.57.0/24"
nmap -v -sn -n $needs_net | grep "host down" - NIC:
bash
# Remember ens3 for the following results
ifconfig | grep '10.255.57' -B1 | head
ens3: flags=4163mtu 1500
inet 10.255.57.142 netmask 255.255.255.0 broadcast 10.255.57.255 - Reflect kubespray:
GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
cd $GIT_ROOT/_iac/kubespray
#kube-vip setting
### addons.yml ์์
##### kube_vip_address: <vip of env>
##### kube_vip_interface: <nic of env>
vi ./inventory/dev-cmp/group_vars/k8s_cluster/addons.yml
vi ./inventory/stg-cmp/group_vars/k8s_cluster/addons.yml
### k8s-cluster.yml ์์
##### kube_proxy_strict_arp: true
vi ./inventory/dev-cmp/group_vars/k8s_cluster/k8s-cluster.yml
vi ./inventory/stg-cmp/group_vars/k8s_cluster/k8s-cluster.yml
```
host setup
# /etc/hosts
# mgnt
127.0.0.1 localhost re-mgmt-deploy mng-dpl
10.255.57.84 mng-nfs
# dev
10.255.57.182 dev-lbs
10.255.57.111 dev-cp1
10.255.57.103 dev-cp2
10.255.57.97 dev-cp3
10.255.57.169 dev-wk1
10.255.57.228 dev-wk2
10.255.57.122 dev-wk3
10.255.57.123 dev-dbp
10.255.57.147 dev-db1
10.255.57.136 dev-db2
#### 10.255.57.240 dev-vip
# stg
10.255.57.112 stg-lbs
10.255.57.142 stg-cp1
10.255.57.179 stg-cp2
10.255.57.221 stg-cp3
10.255.57.114 stg-wk1
10.255.57.206 stg-wk2
10.255.57.229 stg-wk3
10.255.57.134 stg-dbp
10.255.57.164 stg-db1
10.255.57.70 stg-db2
#### 10.255.57.241 stg-vip
installation Management Cluster
# go-to
git clone https://[email protected]/Enterprise Cloudlab/cmp-helm.git
cd cmp-helm
git switch Enterprise Cloud-dev
GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
cd $GIT_ROOT/_iac
# k3s ์ค์น
./k3s/server-install-k3s.sh
source ~/.bashrc
# IaC & GitOps ๊ด๋ จ ๋ฐ์ด๋๋ฆฌ ์ธํ
./server.sh
sudo apt install python3-pip -y
sudo pip3 install -r kubespray/requirements.txt
installation Business Clusters
โ ๏ธ Be sure to check /etc/hosts settings before proceeding
Currently, playbook is only tested based on an online environment.
GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
cd $GIT_ROOT/_iac/kubespray
ansible-playbook -i inventory/dev-cmp/inventory.ini cluster.yml -vv
ansible-playbook -i inventory/stg-cmp/inventory.ini cluster.yml -vv
trouble shooting
โ ๏ธ The following error occurs due to a change in the Pull policy of the DockerHub registry.
docker: Error response from daemon: toomanyrequests: You have reached your unauthenticated pull rate limit. https://www.docker.com/increase-rate-limit
nerdctl: FATA[0006] failed commit on ref "index-sha256:e21f8d0566ad4a2b7de56dae9e662147af6df51ed8a46692be3931513a1a56d7": commit failed: "index-sha256:e21f8d0566ad4a2b7de56dae9e662147af6df51ed8a46692be3931513a1a56d7" failed size validation: 341810 != 10229: failed precondition
- solving
# dockerhub ๋ฌด๋ฃ๊ณ์ ๋ก๊ทธ์ธ์ผ๋ก ์์ ํด์ ๊ฐ๋ฅ (๋ฌด๋ฃ๊ณ์ ์ pull ํ์์ ํ์์)
# ์ค์น ์คํจํ ๋ชจ๋ ํด๋ฌ์คํฐ node ์์: (์ด ์์ ์ `nerdctl`์ ์ค์น ์๋ฃ ๋์ด์์)
nerdctl login docker.io
When Business Clusters Installed (in Management-cluster)
Import Kubeconfig
GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
cd $GIT_ROOT/_iac
./k8s_generate_kubeconfig_with_ssh_v2.sh dev dev-lbs [ sshport ] > $GIT_ROOT/_gitops/.tmp/.dev.kubeconfig
./k8s_generate_kubeconfig_with_ssh_v2.sh stg stg-lbs [ sshport ] > $GIT_ROOT/_gitops/.tmp/.stg.kubeconfig
# test
k get pods -A --kubeconfig $GIT_ROOT/_gitops/.tmp/.dev.kubeconfig
k get pods -A --kubeconfig $GIT_ROOT/_gitops/.tmp/.stg.kubeconfig
cat <<EOF >> ~/.bashrc
alias kd="kubectl --kubeconfig /workspace/cmp-helm/_gitops/.tmp/.dev.kubeconfig"
alias ks="kubectl --kubeconfig /workspace/cmp-helm/_gitops/.tmp/.stg.kubeconfig"
EOF
source ~/.bashrc
kd get pods -A
ks get pods -A
all worker Nodes
# management node, business workers
sudoapt-get update
sudoapt-getinstall -y nfs-common
Application Installation
go to:
GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
cd $GIT_ROOT/_gitops
Required
- Prerequisite work required to run Gitops via SSH in Helmfile
1. Copy server public key
bash
cat ~/.ssh/id_rsa.pub
# If not present, key-gen
ssh-keygen
2. Access https://bitbucket.org/account/settings/ssh-keys/ and register SSH public key - Modify Variable
vi values/clusters.hcl
# ๋ค์์ ์์
### clusters.mgnt.hostIp = "Mgnt ๋ง์คํฐ๋
ธ๋ IP"
### clusters.mgnt.nfs.ip = "Mgnt NFS IP" #ํ์ฌ ๋ฒ์ ์ NFS 1๊ฐ๋ก ๋๋์ด ์ฌ์ฉ
### clusters.dev.hostIp = "Dev ๋ง์คํฐ๋
ธ๋ IP"
### clusters.dev.nfs.ip = "Dev NFS IP" #ํ์ฌ ๋ฒ์ ์ NFS 1๊ฐ๋ก ๋๋์ด ์ฌ์ฉ
### clusters.stg.hostIp = "Stg ๋ง์คํฐ๋
ธ๋ IP"
### clusters.stg.nfs.ip = "Stg NFS IP" #ํ์ฌ ๋ฒ์ ์ NFS 1๊ฐ๋ก ๋๋์ด ์ฌ์ฉ
in Business-clusters
Step0. Prepare Worker Nodes
### All Business works
# DNS ์ฌ์ฉ
vi /etc/systemd/resolved.conf
>>>
[Resolve]
DNS=<management_node_ip>#8.8.8.8
<<<
systemctl restart systemd-resolved.service
# Harbor Certificate
sudomkdir -p /etc/containerd/certs.d/harbor.Enterprise Cloud.hanacloudia.com
cat<<EOF> /etc/containerd/certs.d/harbor.Enterprise Cloud.hanacloudia.com/ca.crt
##### <ca.crt ๋ด์ฉ ์ฝ์
> #####
EOF
# or
cp /etc/kubernetes/ssl/certs/serverca /etc/containerd/certs.d/harbor.Enterprise Cloud.hanacloudia.com/ca.crt
in Management-cluster
Step1. Helmfile Sync (To set ArgoCD)
The following application(s) will be created.
- Prepare hooks
- Create All-Namespaces
- Run on docker: local-registry
- Load & Push Images from backed-up Dir
- Run
kube-apiserverproxy:localhost:8080 - Auto-Gen:
Secret=$basicAuthSecret nfs-subdir-external-provisioner- Required:
package=nfs-common cert-manager- Auto-Gen:
ClusterIssuer=selfsigned-issuer - Auto-Gen:
Certificates=hanacloudia.com-cacert - Auto-Gen:
ClusterIssuer=rootca-issuer - Create File:
./.tmp/ca.crt(To call the Harbor API) - Send File:
./.tmp/ca.crtto every Nodes of Business Clusters - Create File: `
./.tmp/ca-issuer.yamlfor Business Clusters ingress-nginxadguard-home- Pre-Configure:
DNS=harber,argo-cd harbor- Call API: create project
management-system - Call API: create project
deploy-system - Call API: create project
portal-system - Call API: create project
dev-portal - Call API: create project
stg-portal - Certificate & Authorize
- Load & Push Images from backed-up Dir
argo-cd- Management Cluster Jobs
- Pre-Configure: argocd-helmfile-plugin
- Pre-Configure: Auto-Connect Private Repository
[email protected]:Enterprise Cloudlab/cmp-helm.gitwith CRED - Auto-Gen:
PersistentVolumClaim=apache-htdocs-pvc - Auto-Gen:
Application=apache - Auto-Gen:
Application=jenkins - Auto-Gen:
Application=vault
- Business Cluster Jobs
- Auto-Gen:
Secret=$globalImagePullSecretto Every Namespaces - Pre-Configure: Auto-Connect Clusters
- Auto-Gen:
Application=nfs-subdir-external-provisioner - Auto-Gen:
Application=cert-manager - Auto-Gen:
Application=ingress-nginx - Auto-Gen:
Application=redisfor CMP - Auto-Gen:
Application=mariadbfor CMP - Auto-Gen:
Application=redisfor CMP
- Auto-Gen:
How does it work? (helmfile Docs)
โน๏ธ Read helmfile.yaml.gotmpl within the path.
Overwrite variables defined in .hcl and .yaml under ./values using the goTemplate syntax.
# DNS ํฌํธ์ถฉ๋ ๋ฐฉ์ง
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
sudo systemctl mask systemd-resolved
sudo rm -f /etc/resolv.conf
sudo bash -c 'cat > /etc/resolv.conf <<EOF
nameserver 127.0.0.1 #adguard-home
nameserver 8.8.8.8
nameserver 1.1.1.1
options edns0
EOF'
# ๋ค๋ฅธ ์๋น์ค์์ ์์ ๊ธ์ง
sudo chattr -i /etc/resolv.conf
# DNS์ฌ์ฉ ๋ถ๊ฐํ ๊ฒฝ์ฐ ์ฌ์ ์กฐ์น
### echo '127.0.0.1 harbor.Enterprise Cloud.hanacloudia.com argocd.Enterprise Cloud.hanacloudia.com' | sudo tee -a /etc/hosts
helmfile sync
- Trouble shooting
# ํ๋ฉด์ด ๋ฉ์ถ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ์์ธ์ผ ์ ์๋ค. ์ค๋ฅ์ธ ๊ฒฝ์ฐ ctrl+C๋ก escape
# ๊ทธ๋ฌ๋ ๋ค์์ ๊ฒฝ์ฐ ์ฃผ์
---
Release "harbor" does not exist. Installing it now.
NAME: harbor
LAST DEPLOYED: Sun Dec 14 20:44:41 2025
NAMESPACE: management-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please wait for several minutes for Harbor deployment to complete.
Then you should be able to visit the Harbor portal at https://harbor.Enterprise Cloud.hanacloudia.com
For more details, please visit https://github.com/goharbor/harbor
Listing releases matching ^harbor$
harbor management-system 1 2025-12-14 20:44:41.468450736 +0900 KST deployed harbor-1.18.0 2.14.0
---
# ๋ค์ ํ๋ฉด์์ ๋ฉ์ถฐ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ์๋๋ผ, backup image๋ค์ Harbor์ push์ค์ผ ํ๋ฅ ์ด ๋์.
# harbor๊ฐ ์ด๋ฏธ ์ค์น์๋ฃ๋์์ผ๋ฏ๋ก, UI์ ์ ๊ทผํ์ฌ ์ด๋ฏธ์ง ์
๋ก๋์ค์ธ์ง ํ์ธ.
Step2. Restore Image Registry
When the directory structure is roughly as follows:
.
โโโ deploy-system
โ โโโ apache.tar
โโโ library
โ โโโ broker-base.tar
โ โโโ busybox.tar
โ โโโ curlimage.tar
โ โโโ ibmjava.tar
โ โโโ nginx.tar
โโโ portal-system
โ โโโ keycloak.tar
โ โโโ mariadb.tar
โ โโโ rabbitmq.tar
โ โโโ redis.tar
โ โโโ vault-k8s.tar
โ โโโ vault.tar
...
Replace the $backup_dir and run as follows
#helmfile.yaml.gotmpl์ ํตํฉ๋จ
#./scripts/docker_load-and-push.sh /mnt/apache/html/backup-data/
### ./scripts/docker_load-and-push.sh $backup_dir
Step3. Install & Restore Vault
- Install
#helmfile.yaml.gotmpl์ ํตํฉ๋จ
### kubectl apply -f argo-apps/mgnt/vault.yaml
- Init Vault
k exec -it -n portal-system vault-0 --container vault -- vault operator init > shared-key-dump.txt
sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g" shared-key-dump.txt > ./.tmp/vault-shared-key.txt
rm shared-key-dump.txt
cat ./.tmp/vault-shared-key.txt
- The following key-set appears. When restarting
vault, you will need 3Unseal Key, so save them well.
Unseal Key 1: NmcbH0bxGABFSk0qNgKrXi9dxeiJsq8DrBDgEsVDegus
Unseal Key 2: kY10hNpENinpiUFKJZwXiJOsCAoyjp7pWAt2tyTwTj5Z
Unseal Key 3: xtAB/krc4fumYR6X+WaaC7fIAuqeThdF6O/ZirM526uR
Unseal Key 4: iHHqqtjJYthnjFo2pxSPzxOLH2cAbOfFwmQsJFpxfrwO
Unseal Key 5: HU9RLIOJVuMUvdzNAAFToZMWDb97UD1FFgji/3sxmY6k
Initial Root Token: hvs.pWUTilJ5CxAi6S2daKcKPeha
- [Auto-mode] Unseal And Create Secret
# store root-token
#cat ./.tmp/vault-shared-key.txt | sed -n '7p' | awk '{ print $4 }' | tee ./.tmp/vault-root-token.txt
cat ./.tmp/vault-shared-key.txt | sed -n '7p' | awk '{ gsub(/\x1b\[[0-9;]*m/, "", $4); print $4 }' | tee ./.tmp/vault-root-token.txt
# Auto
./scripts/vault_unseal.sh ./.tmp/vault-shared-key.txt
k exec -it -n portal-system vault-0 --container vault -- vault login $(cat ./.tmp/vault-root-token.txt)
k exec -it -n portal-system vault-0 --container vault -- vault secrets enable -path=secret kv-v2
k exec -it -n portal-system vault-0 --container vault -- sh
# --- start in vault container
echo '''
path "*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}''' > /tmp/admin.hcl
exit
# --- end
./scripts/vault_enable_userpass.sh admin Cloud000@ portal-system $(cat ./.tmp/vault-root-token.txt | tr '\n' '')
- [Manual-mode] Unseal And Create Secret
# Manual
k exec -it -n portal-system vault-0 -- sh
# --- start in vault container
vault operator unseal NmcbH0bxGABFSk0qNgKrXi9dxeiJsq8DrBDgEsVDegus
vault operator unseal kY10hNpENinpiUFKJZwXiJOsCAoyjp7pWAt2tyTwTj5Z
vault operator unseal iHHqqtjJYthnjFo2pxSPzxOLH2cAbOfFwmQsJFpxfrwO
# RootToken์ผ๋ก ๋ก๊ทธ์ธ
vault login hvs.pWUTilJ5CxAi6S2daKcKPeha
# Secret ์์ฑ
vault secrets enable -path=secret kv-v2
# UserPass ํ์ฑํ
echo '''
path "*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}''' > /tmp/admin.hcl
vault policy write ${POLICY_NAME} /tmp/${POLICY_NAME}.hcl
if vault auth list | grep -q "userpass/"; then
echo "[SKIP] userpass already enabled"
else
vault auth enable userpass
# UI์์ ๊ธฐ๋ณธ ๋ก๊ทธ์ธ์ผ๋ก ์ฌ์ฉ ์ต์
vault auth tune -listing-visibility=unauth userpass/
echo "[OK] userpass enabled"
fi
vault write auth/userpass/users/admin \
password="Cloud000@" \
policies="admin"
# --- end
- push to upstream
git add ./.tmp
git commit -m '(re) init vault token'
git push
- Result Value
safe target vault http://$(k get svc -n portal-system vault -o=jsonpath='{.spec}' | jq -r '"\(.clusterIP):\(.ports[] | select(.name=="http")).port")')
safe auth # Initial Root Token ์
๋ ฅ
safe import < $backed_up_json
Step4. Etc.
#helmfile.yaml.gotmpl์ ํตํฉ๋จ
# Install Apache
### kubectl apply -f manifests/apache/pvc-htdocs.yaml
### kubectl apply -f argo-apps/mgnt/apache.yaml
# Install Jenkins
### kubectl apply -f argo-apps/mgnt/jenkins.yaml
Step5. Add Clusters to Argo CD
After context settingโฆ
#helmfile.yaml.gotmpl์ ํตํฉ๋จ
### argocd cluster add dev_cluster
### argocd cluster add stg_cluster
โ ๏ธ Be sure to edit .spec.destination.server in ./argo-apps/*/*.yaml files in advance. (Env: dev, stg)
Step6. Install & Restore Database
- Install Database
#helmfile.yaml.gotmpl์ ํตํฉ๋จ
### cd argo-apps
### kubectl apply \
### -f dev/mariadb.yaml -f dev/rabbitmq.yaml -f dev/redis.yaml \
### -f stg/mariadb.yaml -f stg/rabbitmq.yaml -f stg/redis.yaml
- Restore Database
GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
cd $GIT_ROOT/_backups/sqls
#dev
kd exec -i -n portal-system mariadb-primary-0 --container mariadb -- mariadb -uroot -pCloud000@ <<EOF
create database OKE_DEVOPS;
create database ECP_USER;
create database ECP_ADMIN;
create database keycloak;
use keycloak;
CREATE USER IF NOT EXISTS 'keycloak'@'%' IDENTIFIED BY 'keycloak';
GRANT ALL PRIVILEGES ON *.* TO 'keycloak'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'portal'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EOF
kd exec -i -n portal-system mariadb-primary-0 --container mariadb -- mariadb -uroot -pCloud000@ keycloak < 20251109.mariadb.keycloak.sql
kd exec -i -n portal-system mariadb-primary-0 --container mariadb -- mariadb -uroot -pCloud000@ OKE_DEVOPS < 20251106.mariadb.OKE_DEVOPS.sql
kd exec -i -n portal-system mariadb-primary-0 --container mariadb -- mariadb -uroot -pCloud000@ ECP_USER < 20251106.mariadb.ECP_USER.sql
kd exec -i -n portal-system mariadb-primary-0 --container mariadb -- mariadb -uroot -pCloud000@ ECP_ADMIN < 20251106.mariadb.ECP_ADMIN.sql
#stg
ks exec -i -n portal-system mariadb-primary-0 --container mariadb -- mariadb -uroot -pCloud000@ <<EOF
create database OKE_DEVOPS;
create database ECP_USER;
create database ECP_ADMIN;
create database keycloak;
use keycloak;
CREATE USER IF NOT EXISTS 'keycloak'@'%' IDENTIFIED BY 'keycloak';
GRANT ALL PRIVILEGES ON *.* TO 'keycloak'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'portal'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EOF
ks exec -i -n portal-system mariadb-primary-0 --container mariadb -- mariadb -uroot -pCloud000@ keycloak < 20251109.mariadb.keycloak.sql
ks exec -i -n portal-system mariadb-primary-0 --container mariadb -- mariadb -uroot -pCloud000@ OKE_DEVOPS < 20251106.mariadb.OKE_DEVOPS.sql
ks exec -i -n portal-system mariadb-primary-0 --container mariadb -- mariadb -uroot -pCloud000@ ECP_USER < 20251106.mariadb.ECP_USER.sql
ks exec -i -n portal-system mariadb-primary-0 --container mariadb -- mariadb -uroot -pCloud000@ ECP_ADMIN < 20251106.mariadb.ECP_ADMIN.sql
-
Troubleshooting
โ`bash
# Time out countermeasures
### E1215 12:29:09.296432 1320884 websocket.go:500] Websocket Ping failed: write tcp 10.255.57.88:56312->10.255.57.182:6443: use of closed network connection
### error: error reading from error stream: next reader: read tcp 10.255.57.88:56312->10.255.57.182:6443: i/o timeoutSend to each masternode
scp ./20251106.mariadb.ECP_ADMIN.sql root@dev-cp1:admin.sql
scp ./20251106.mariadb.ECP_ADMIN.sql root@stg-cp1:admin.sqlRun the following within each masternode
kubectl cp ./admin.sql -n portal-system mariadb-primary-0:/bitnami/mariadb/admin.sql
kubectl exec -it -n portal-system mariadb-primary-0 --container mariadb -- bash
## in container
cd /bitnami/mariadb
mariadb -uroot -pCloud000@ ECP_ADMIN < admin.sql
## exit
```
Step7. Install Portal-System (Middlewares)
k apply -f dev/keycloak.yaml -f stg/keycloak.yaml
Step8. Install Portal
GIT_ROOT=$(git rev-parse --show-toplevel2>/dev/null)
#helmfile.yaml.gotmpl์ ํตํฉ๋จ
### cd $GIT_ROOT/_gitops/manifests/cmp
### kd apply -f browser-pv.yaml -f cronjob-sa.yaml
### ks apply -f browser-pv.yaml -f cronjob-sa.yaml
cd$GIT_ROOT/_gitops/manifests/vault
# ๋ค์์ "secret/dev/portal/cronjob"."cronjob.accessToken"์ replace
kd get secret -n cronjob cronjob-admin-token -ojsonpath='{.data.token}'| base64 -d
# ๋ค์์ "secret/prd/portal/cronjob"."cronjob.accessToken"์ replace
ks get secret -n cronjob cronjob-admin-token -ojsonpath='{.data.token}'| base64 -d
# cronjob sa ์์
vi ./20251215.renew-secrets.json
k apply -f dev/cmp.yaml -f stg/cmp.yaml
in NFS Server
# softlink ์์ฑ
ln -s $(ls -l /srv/k8s-mgnt --format=single-column | grep apache) /root/apache_home
Application Uninstallation
argo-cd Management
argocd app delete management-system/$argocd_appname
helmfile Management
helmfile destroy
Features
Confirm Rancher Password
#password ํ์ธ
kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{"\n"}}'
In case of Rancher Password error (under 12 Characters)
#reset
kubectl -n cattle-system exec $(kubectl -n cattle-system get pods -l app=rancher | grep '1/1' | head -1 | awk '{ print $1 }') -- reset-password




Leave a Reply