QKS 소개
개요
QKS(Quantum Kubernetes Service)는 오픈소스인 Kubernetes를 베이스로 하여 퀀텀씨엔에스에서 고객 환경에 맞춤형으로 서비스를 제공하는 쿠버네티스 솔루션입니다.
쿠버네티스를 활용한 개발 및 서비스를 위한 각종 SW 및 서비스 제공
특장점
K8S HA 구성 : 쿠버네티스 마스터를 SW LB(HAproxy)와 keepalived를 이용하여 고가용성을 구현.
Airgapped 환경에 최적화된 쿠버네티스 운영환경 제공
어플리케이션 개발에 필수적인 백오피스 프로그램 제공, Helm으로 관리 가능, 필요시 HA 버전 설치 가능
RDBMS ( Maraidb, PostgreSQL )
NoSQL ( OpenSearch, ElasticSearch )
MQ ( Kafka, Rabbitmq )
Cache ( Redis )
CI/CD에 필요한 툴 제공
Gitalb : SCM and Build
Argocd : Deploy
Harbor : Image Repository
모니터링 서비스 제공
Prometheus & Grafana
QKS 운영 매뉴얼
QKS 설치
QKS 설치 및 워커노드 추가 등은 qks 프로그램을 이둉한다.
사전 준비
inventory file 작성 : 내부적으로는 Ansible이 동작하는 구조이므로 설치할 노드 정보등을 작성한다.
설치할 노드끼리 ansible_user로 ssh가 되어야 하며 sudo를 패스워드 없이 실행할 수 있어야한다.
vi hosts
qks-ubuntu22-m01 ansible_host=10.100.0.248 ansible_user=ubuntu private_ip=10.100.0.248
qks-ubuntu22-m02 ansible_host=10.100.0.89 ansible_user=ubuntu private_ip=10.100.0.89
qks-ubuntu22-m03 ansible_host=10.100.0.79 ansible_user=ubuntu private_ip=10.100.0.79
qks-ubuntu22-w01 ansible_host=10.100.0.72 ansible_user=ubuntu private_ip=10.100.0.72
qks-ubuntu22-w02 ansible_host=10.100.0.136 ansible_user=ubuntu private_ip=10.100.0.136
qks-ubuntu22-w03 ansible_host=10.100.0.244 ansible_user=ubuntu private_ip=10.100.0.244
qks-ubuntu22-nfs ansible_host=10.100.0.8 ansible_user=ubuntu private_ip=10.100.0.8
qks-ubuntu22-g01 ansible_host=10.100.0.107 ansible_user=ubuntu private_ip=10.100.0.107
[kube-cluster:children]
kube-master
kube-worker
[kube-master] # K8S Master Node
qks-ubuntu22-m01
qks-ubuntu22-m02
qks-ubuntu22-m03
[kube-worker:children]
qks-worker
qks-nvidia
[qks-worker]
qks-ubuntu22-w01
qks-ubuntu22-w02
qks-ubuntu22-w03
[qks-nvidia] # GPU 노드 리스트
qks-ubuntu22-g01
[qks-server:children]
qks-pkg-server
qks-nfs-server
qks-ceph-server
qks-ceph-client
[qks-nfs-server] # NFS 서버
qks-ubuntu22-nfs
[qks-pkg-server] # Airgapped 환경을 위한 Linux package repository 서버
qks-ubuntu22-nfs
설치를 위한 환경 파일 작성
vi ubuntu
{
"kube_version": "1.28.2",
"kube_default_domain": "smg.quantumcns.io",
"kube_default_context": "SMGATE",
"kube_default_passwd": "Smg2023+qks",
"qks_offline_enabled": true,
"qks_package_repository_enabled": true,
"qks_offline_air_gapped_enabled": true,
"qks_accelerator_enabled": true,
"qks_vip_manager_enabled": true,
"qks_vip_manager_nic": "ens3", # VIP용 NIC 이름
"qks_load_balancer_vip": "10.100.0.100", # VIP
"qks_nexus_proxy_enabled": true,
"qks_nexus_storage_type": "filesystem",
"qks_nexus_restore_enabled" : true,
"qks_nfs_server_enabled": true,
"qks_nfs_provisioner_enabled": true,
"kube_default_storage_class_name": "qks-nfs",
"qks_filesystem_storage_class_name": "qks-nfs",
"qks_mariadb_enabled": true,
"qks_postgres_enabled": true,
"qks_redis_enabled": true,
"qks_keycloak_enabled": true,
"qks_opensearch_enabled": true치
"qks_rabbitmq_enabled": true,
"qks_offline_source": "/home/ubuntu/installer/data/offline" # 오프라인설치용 파일 위치
}
QKS 설치
./qks install all # k8s + 백오피스 + CI/CD 모든 패키지 설치
./qks install k8s # k8s 및 k8s utility 설치
./qks install iaas # Nexus, NFS Provisioner, Nginx Ingress 등 설치
./qks install pass # 백오피스 설치
./qks install cicd # Gitlab, Argocd, Harbor 설치
./qks install plays/qks-gitlab.yaml # 개별 프로그램 설치
QKS 운영
워커노드 추가하는 방법
사전준비 : ansible_use에 지정된 유저를 만들고 k8s master서버와 ssh가 되어야 하며 sudo 를 패스워드 없이 수행할수 있게 한다.
위의 inventroy file에 추가할 노드 정보를 기입한다.
단순 워커노드이면 qks-worker에 포함시키고 GPU 노드이면 qks-nvidia 그룹에 포함시킨다.
./qks install k8s
kubectl get nodes # 노드가 추가되었는지 확인
쿠버네티스 백업
백업 스크립트를 활용한 백업 : 네임스페이스별로 지정한 리소스 백업
시스템 관련 작업할때 sh kubedump.sh 를 실행하여 백업한다.
vi kubedump.sh
#!/usr/bin/env bash
set -e
CONTEXT=$(kubectl config view -o jsonpath='{.contexts[].name}')
DATE=$(date +%Y%m%d%H%M)
BK_DIR="K8S/${CONTEXT}"
echo $CONTEXT
start_time=$(date +%s)
echo "Start time : $(date)"
if [[ -z ${CONTEXT} ]]; then
echo "Usage: $0 KUBE-CONTEXT"
exit 1
fi
NAMESPACES=$(kubectl --context ${CONTEXT} get -o json namespaces|jq '.items[].metadata.name'|sed "s/\"//g")
RESOURCES="nodes pods configmap secret daemonset deployment service ingress statefulsets jobs cronjobs hpa pvc sa role rolebindings clusterrole clusterrolebindings " # 백업 하고자 하는 resource type 추가
for ns in ${NAMESPACES};do
echo -n "Dumping namespace for '$ns': "
for resource in ${RESOURCES};do
rsrcs=$(kubectl --context ${CONTEXT} -n ${ns} get -o json ${resource}|jq '.items[].metadata.name'|sed "s/\"//g")
for r in ${rsrcs};do
dir="${BK_DIR}/${DATE}/${ns}/${resource}"
mkdir -p "${dir}"
kubectl --context ${CONTEXT} -n ${ns} get -o yaml ${resource} ${r} > "${dir}/${r}.yaml"
done
done
echo "DONE"
done
helm list --all-namespaces > ${dir}/helmlist
end_time=$(date +%s)
echo "END time : $(date)"
echo "Elasped time : $(( end_time - start_time )) Seconds"
DB 백업
백업 스크립트를 활용한 백업 : 필요한 정보 수정 후 스크립트 수행
vi dbdump.sh
#!/bin/bash
HOST=k8s-master-01 # 마스터노드 hostname 또는 ip
PORT=30306
USER=root
PASS=QKSk8s
DATE=$(date +%Y%m%d%H%M)
BK_DIR="DB"
mkdir -p "${BK_DIR}/${DATE}"
declare -a DATABASE=("db1" "db2" "db3" "db4" ) # 백업하고자 하는 DB 기입
start_time=$(date +%s)
echo "Start time : $(date)"
mysqldump --all-databases --routines --triggers --single-transaction -u${USER} -p${PASS} -h${HOST} -P${PORT} > ${BK_DIR}/${DATE}/all.sql
mysqldump --routines --triggers --single-transaction -u${USER} -p${PASS} -h${HOST} -P${PORT} mysql > ${BK_DIR}/${DATE}/mysql.sql
for DB in ${DATABASE[@]}; do
echo -n "Dumping database for '$DB': "
mysqldump -u${USER} -p${PASS} -h${HOST} -P${PORT} --routines --triggers --single-transaction --skip-add-drop-table --add-drop-database --databases ${DB} > ${BK_DIR}/${DATE}/${DB}.sql
sed -i 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' ${BK_DIR}/${DATE}/${DB}.sql
sed -i '/LOCK TABLES/d' ${BK_DIR}/${DATE}/${DB}.sql
echo "OK"
done
end_time=$(date +%s)
echo "END time : $(date)"
echo "Elasped time : $(( end_time - start_time )) Seconds"
K8S 유저 추가 방법 : k8s 기본 교육자료 참고 => https://git.quantumcns.io/qks/manual/-/blob/main/1_k8s_basic.md#rbac