QKS 소개

개요

  • QKS(Quantum Kubernetes Service)는 오픈소스인 Kubernetes를 베이스로 하여 퀀텀씨엔에스에서 고객 환경에 맞춤형으로 서비스를 제공하는 쿠버네티스 솔루션입니다.

  • 쿠버네티스를 활용한 개발 및 서비스를 위한 각종 SW 및 서비스 제공

특장점

  1. K8S HA 구성 : 쿠버네티스 마스터를 SW LB(HAproxy)와 keepalived를 이용하여 고가용성을 구현.

../_images/qks_ha.png
  1. Airgapped 환경에 최적화된 쿠버네티스 운영환경 제공

  • Nexus를 활용하여 Airgapped 환경에서도 활용할수 있는 프록시 레파지토리 기능 제공 ../_images/qks_nexus.png

  • 설치 자동화 프로그램 제공

  1. 어플리케이션 개발에 필수적인 백오피스 프로그램 제공, Helm으로 관리 가능, 필요시 HA 버전 설치 가능

  • RDBMS ( Maraidb, PostgreSQL )

  • NoSQL ( OpenSearch, ElasticSearch )

  • MQ ( Kafka, Rabbitmq )

  • Cache ( Redis )

  1. CI/CD에 필요한 툴 제공

  • Gitalb : SCM and Build

  • Argocd : Deploy

  • Harbor : Image Repository

  1. 모니터링 서비스 제공

  • 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" # 오프라인설치용 파일 위치
}
  1. 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 # 노드가 추가되었는지 확인
  1. 쿠버네티스 백업

  • 백업 스크립트를 활용한 백업 : 네임스페이스별로 지정한 리소스 백업

  • 시스템 관련 작업할때 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"
  1. 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"
  1. K8S 유저 추가 방법 : k8s 기본 교육자료 참고 => https://git.quantumcns.io/qks/manual/-/blob/main/1_k8s_basic.md#rbac