## QKS 소개 ### 개요 - QKS(Quantum Kubernetes Service)는 오픈소스인 Kubernetes를 베이스로 하여 퀀텀씨엔에스에서 고객 환경에 맞춤형으로 서비스를 제공하는 쿠버네티스 솔루션입니다. - 쿠버네티스를 활용한 개발 및 서비스를 위한 각종 SW 및 서비스 제공 ### 특장점 1. K8S HA 구성 : 쿠버네티스 마스터를 SW LB(HAproxy)와 keepalived를 이용하여 고가용성을 구현. 2. Airgapped 환경에 최적화된 쿠버네티스 운영환경 제공 - Nexus를 활용하여 Airgapped 환경에서도 활용할수 있는 프록시 레파지토리 기능 제공 - 설치 자동화 프로그램 제공 3. 어플리케이션 개발에 필수적인 백오피스 프로그램 제공, Helm으로 관리 가능, 필요시 HA 버전 설치 가능 - RDBMS ( Maraidb, PostgreSQL ) - NoSQL ( OpenSearch, ElasticSearch ) - MQ ( Kafka, Rabbitmq ) - Cache ( Redis ) 4. CI/CD에 필요한 툴 제공 - Gitalb : SCM and Build - Argocd : Deploy - Harbor : Image Repository 5. 모니터링 서비스 제공 - Prometheus & Grafana ## QKS 운영 매뉴얼 ### QKS 설치 1. QKS 설치 및 워커노드 추가 등은 qks 프로그램을 이둉한다. 2. 사전 준비 - 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" # 오프라인설치용 파일 위치 } ``` 3. 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 운영 1. 워커노드 추가하는 방법 - 사전준비 : ansible_use에 지정된 유저를 만들고 k8s master서버와 ssh가 되어야 하며 sudo 를 패스워드 없이 수행할수 있게 한다. - 위의 inventroy file에 추가할 노드 정보를 기입한다. - 단순 워커노드이면 qks-worker에 포함시키고 GPU 노드이면 qks-nvidia 그룹에 포함시킨다. ``` ./qks install k8s kubectl get nodes # 노드가 추가되었는지 확인 ``` 2. 쿠버네티스 백업 - 백업 스크립트를 활용한 백업 : 네임스페이스별로 지정한 리소스 백업 - 시스템 관련 작업할때 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" ``` 3. 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" ``` 4. K8S 유저 추가 방법 : k8s 기본 교육자료 참고 => https://git.quantumcns.io/qks/manual/-/blob/main/1_k8s_basic.md#rbac