arrow-left

Only this pageAll pages
gitbookPowered by GitBook
1 of 43

CUBE

Overview

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Reference

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Console

Loading...

Tutorial

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Getting Started

hashtag
Preparation

  • 설치 가능한 리눅스 배포판 확인

    • see Guide page for more information.

  • 호스트간 방화벽 확인

    • see Guide page for more information.

  • sudoers 실행 권한 확인

    • see Guide page for more information.

  • 호스트 간 Passwordless SSH 설정 확인

    • 동일 계정 및 Private Key 필요

hashtag
Getting Started

hashtag
download

cubectl은 상용 제품입니다. 다운로드 계정 발급은 로 문의바랍니다.

  • See Guide page for more information.

hashtag
Create a cluster

  • See Guide page for more information.

hashtag
Connect to your cluster

  • See Guide page for more information.

hashtag
Destroy a cluster

  • See Guide page for more information.

Supported Versions
Firewall Settings
Sudoers Table
서비스 데스크envelope
Download cubectl
Create a cluster
Update kubeconfig
Destroy a cluster
$ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=user PASSWD=pwd VERSION=$(curl -s https://cube.k3.acornsoft.io/stable.txt) sh -
$ cd cubectl-v*
$ cat <<EOF> config/cubectl.toml
[kubernetes]
api-sans=["192.168.77.112"]

[node-pool.master]
ip = ["10.30.30.10"]

[node-pool.node]
ip = ["10.30.30.11"]
EOF

$ sudo bin/cubectl create -p ~/.ssh/id_rsa -u cocktail
$ cubectl update-kubeconfig -p ~/.ssh/id_rsa -u cocktail
$ kubectl get nodes --kubeconfig=$(pwd)/config/acloud-client-kubeconfig
$ sudo bin/cubectl destroy -p ~/.ssh/id_rsa -u cocktail

update

hashtag
update

since v1.0.0

쿠버네티스 클러스터에 워커 노드를 추가하거나 삭제합니다.

$ cubectl update -p <ssh key> -u <username> --kubeconfig <kubeconfig file>

hashtag
parameters

  • -p <ssh key>

    • 설치 호스트들의 Passwordless SSH 연결을 위한 Private-Key 입니다.

  • -u <username>

hashtag
examples

Download CUBE

hashtag
CUBE 다운로드

CUBE는 다음과 같이 4가지 설치 패키지 다운로드를 제공합니다:

  • 온라인 설치 패키지

Release

hashtag
Latest History

hashtag
v1.3.4

Supported Versions

hashtag
Node

  • Supported CPU architectures

CUBE

CUBE는 아콘소프트에서 제공하는 쿠버네티스 배포판입니다.

cubectl은 CUBE를 프로비저닝 및 라이프사이클 관리를 자동화하는 Command-Line-Interface 도구입니다.

주요기능:

  • 쿠버네티스 클러스터 프로비저닝.

설치 호스트들의 Passwordless SSH 연결을 위한 사용자 계정명입니다.

  • --kubeconfig <kubeconfig file>

    • 업데이트할 쿠버네티스 클러스터의 kubeconfig 파일입니다.

    • Default : ${CUBE_HOME}/config/{{CLUSTER}}/acloud-client-kubeconfig

  • -a, --auto-approve

    • optional

    • IP 확인 및 y/n 질의 절차를 생략합니다.

  • -c, --cluster

    • optional

    • Cluster 이름을 입력합니다.

    • Default : "default"

  • -f, --config

    • optional

    • cubectl.toml 경로를 입력합니다.

    • Default : ${CUBE_HOME}/config/cubectl.toml

  • --container-runtime

    • optional

    • 컨테이너 런타임을 지정합니다. podman 또는 docker 중에서 선택할 수 있습니다.

    • Default : "podman"

  • --cube

    • optional

    • Cube의 버전을 지정합니다.

    • Default : "latest"

  • --port

    • optional

    • 원격 호스트의 포트를 지정합니다.

    • Default : 22

  • -v, --verbose

    • optional

    • 상세 출력을 활성화합니다.

  • cubectl

    cubectl 실행 환경을 정의합니다.

    hashtag
    [cubectl]

    hashtag
    cluster-name

    설치되는 쿠버네티스 클러스터의 이름입니다.

    • Type : string

    • Default : kubernetes

    • Since : v1.0.0

    hashtag
    cert_validity_days

    인증서 만료기간 입니다.

    • Type : integer

    • Default : 36500 (100년)

    • Since : v1.0.0

    hashtag
    install-dir

    노드별 CUBECTL 설치 스크립트 (harbor, shell scripts) 저장 디렉토리입니다.

    • Type : string

    • Default : "/var/lib/cubectl"

    • Since : v1.0.0

    hashtag
    closed-network

    폐쇄망 설치 여부를 선택합니다.

    폐쇄망 설치일 경우 :./archive 디렉토리에 설치 압축파일들이 반드시 존재해야 합니다.

    • Type : boolean

    • Default : false

    • Since : v1.0.0

    hashtag
    local-repository-install

    리눅스 로컬 저장소 설치를 활성화 합니다.

    폐쇄망 설치 시는 true 로 지정해야 하고 {CUBE_HOME}/archive/runtime 디렉토리에 harbor-offline-installer-{VERSION}-linux-{ARCH}.tgz 파일이 존재해야 합니다.

    멀티 OS로 클러스터를 구성할 경우 Ubuntu 20.04는 지원하지 않습니다.

    • Type : boolean

    • Default : -

    • Since : v1.0.0

    hashtag
    local-repository-url

    리눅스 로컬 저장소의 서비스의 URL입니다.

    지정하지 않을 경우 사설 저장소의 IP address 가 자동 지정됩니다.

    • Type : string

    • Default : "http://{{ registry-ip }}:8080"

    • Since : v1.0.0

    hashtag
    local-repository-port

    deprecated v1.2.0

    리눅스 로컬 저장소의 서비스 포트번호 입니다.

    $ cubectl update -p ~/.ssh/id_rsa -u cocktail --kubeconfig $(pwd)/config/{{CLUSTER}}/acloud-client-kubeconfig
    cubectl
    ├── cluster-name
    ├── cert_validity_days
    ├── install-dir
    ├── closed-network
    ├── local-repository-install
    └── local-repository-url

    칵테일 포함 온라인 설치 패키지

  • 폐쇄망 설치 패키지

  • 칵테일 포함 폐쇄망 설치 패키지

  • 이전 이미 다운로드된 파일들이 존재한다면 새로운 파일로 Overwrite 됩니다.

    CUBE는 상용 제품입니다. 다운로드 계정 발급은 서비스 데스크envelope로 문의바랍니다.

    hashtag
    환경 변수

    • ACCOUNT : 다운로드 계정명

    • PASSWD : 다운로드 계정 비밀번호

    • VERSION (optional)

      • CUBE 버전

      • 예 : v1.2.0, v1.0.3, v1.0.4

      • Default: 최신 버전

    • AIRGAP (optional)

      • 폐쇄망 설치 패키지를 다운로드 합니다.

      • 설치 대상 노드들의 리눅스 배포판 이름을 입력합니다.

    • NODE_ARCH (optional)

      • 설치할 노드들의 CPU 아키텍처를 입력합니다.

      • 중복선택 가능하며 amd64(x86_64), arm64 2종을 지원합니다.

    • K8S (optional)

      • 폐쇄망 설치 패키지의 쿠버네티스 버전을 입력합니다.

      • v1.29 와 같이 마이너 버전까지 입력한 경우 CUBE에서 지원하는 latest 버전 다운로드합니다.

    • OS (optional)

      • cubectl 런타임 OS을 입력합니다.

      • linux, darwin 2종을 지원합니다.

    • ARCH (optional)

      • cubectl 런타임 OS CPU 아키텍처를 입력합니다.

      • amd64(x86_64), arm64 2종을 지원합니다.

    • COCKTAIL (optional)

      • 입력된 버전의 칵테일을 포함한 패키지를 다운로드합니다.

      • 예 : v4.7.4

    • CCP (optional)

      • 입력된 버전의 ccp 파일(칵테일 설치 CLI)을 포함한 패키지를 다운로드합니다.

      • 예 : v1.1.1, v1.0

    hashtag
    예제

    • 온라인 패키지 다운로드

    • 폐쇄망 패키지 다운로드

    • 칵테일 포함 온라인 패키지 다운로드

    • 칵테일 포함 폐쇄망 패키지 다운로드

    hashtag
    패키지 디렉토리 구조

    • 온라인 설치 패키지 (예)

    • 칵테일 포함 온라인 설치 패키지 (예)

    • 폐쇄망 설치 패키지 (예)

    • 칵테일 포함 폐쇄망 설치 패키지 (예)

    hashtag
    칵테일 다운로드

    칵테일 tar 파일과 ccp CLI 가 현재 디렉토리에 다운로드 됩니다.

    hashtag
    환경 변수

    • ACCOUNT : 다운로드 계정명

    • PASSWD : 다운로드 계정 비밀번호

    • VERSION (optional)

      • 칵테일 버전

      • 예 : v4.7.4, v4.7, v4.7.4_R202308

      • Default: 최신 버전

    • CCP (optional)

      • ccp 버전

      • 예 : v1.1.1, v1.0

    hashtag
    예제

    2025.10.13
    • Features

      • 쿠버네티스 버전 추가 지원 : v1.34.0

      • 쿠버네티스 패치 버전 업 : v1.30.14, v1.31.12, v1.32.8, v1.33.4

      • Container runtime cri-o 제공

      • Kubeflow 지원

      • UI provider별 개요 기능

      • Gpu-operator image prepare 과정 추가

      • 서버 이전으로 인한 이미지 명 변경(registry.k3.acornsoft.io/cube/cube:tag)

    • Bugfixes

      • Upgrade 시도 시 의도치 않은 playbook 실행 문제 수정

      • Online 환경 containerd 설치 문제 수정

    • Enhancements

      • UI package version upgrade

    • Documentations

      • Kubeflow 설치 문서

    hashtag
    v1.3.3

    2025.06.30

    • Features

      • 쿠버네티스 버전 추가 지원 : v1.33.1

      • 쿠버네티스 패치 버전 업 : v1.28.15, v1.29.15, v1.30.13, v1.31.9, v1.32.5

      • Ubuntu24.04 지원

      • Console - Provider(Openstack) 조회 기능

      • Console cluster template 생성 기능

      • Harbor trivy DB 최신화

    • Bugfixes

      • API fetch 중 overlay가 정상적으로 동작하지 않던 문제 수정

      • API에서 작동하지 않던 조건 문제 수정

    • Enhancements

      • Docker CSAP 관련 Harbor 로직 변경

    • Refactoring

      • Add control plane node 로직 변경

    • Documentations

      • REST-API 문서 업데이트

    hashtag
    v1.3.2 (hotfix)

    2025.05.12

    • Features

      • Cilium CNI 제공 (addon 기능)

    • Bugfixes

      • 쿠버네티스 버전 업그레이드 후 인증서 만료일이 1년으로 변경되는 현상

      • REST-API sync 요청 시 데이터베이스 저장 못하는 오류

    • Enhancements

      • console card 컴포넌트 toggle 기능 제공

      • console 클러스터 보기화면 kubeconfig download 기능 제공 외

    • Refactoring

      • console 변수형식 개선, enum → const

      • console 에러 및 이미지 파일 소스 위치 변경

    • Documentations

      • REST-API 문서 업데이트

      • kubelet root 디렉토리 변경 방법 사용자 메뉴얼

    hashtag
    Upcoming Release

    • (기능) CUBE Web Console 업그레이드

    • (기능) 설치 전 인프라 검증 및 설치 후 클러스터 검증 지원

    • (개선) cubectl.toml 리뉴얼

    hashtag
    Release History

    hashtag
    v1.3.1

    2025.04.17

    • Features

      • 쿠버네티스 버전 추가 지원 : v1.32.2

      • 쿠버네티스 패치 버전 업 : v1.28.15, v1.29.15, v1.30.10, v1.31.6, EOS v1.27

      • CUBE Web Console

        • 클러스터 생성, 목록, 조회, 제거 기능

        • 프로바이더 목록, 생성, 조회, 삭제 기능

        • 클러스터 템플릿 목록, 생성, 조회, 삭제 기능

      • 클러스터 보안 취약점 개선 (CIS-Benchmark, 92.4%)

      • ARM CPU 아키텍처 지원 개선

      • Oracle 9 리눅스 배포판 지원

      • cis-driver-nsf 4.10.10 버전 업

    hashtag
    v1.3.0 (hotfix)

    2025.01.03

    • Features

      • EOS Linux distributions

        • CentOS 7,8

        • RedHat7

      • 컴포넌트 버전 업

        • containerd : v1.6.28 → v1.7.24

        • etcd : v3.5.7 → v3.5.17

      • 컨테이너 이미지 버전 업

        • calico : v3.28.0 → v3.29.1

        • haproxy : 2.9.4 → 3.1.1

    hashtag
    v1.2.4

    2024.12.17

    • Features

      • 쿠버네티스 클러스터 OpenStack 자동 설치

      • CUBE API (RESTful API)

      • "cubecli" to "CUBE" 마이그레이션

      • cubectl push 명령어 - 리눅스 패키지 및 이미지 업로드

      • cubectl destroy localrepo 명령어

      • 애드온 버전 선택 설치 기능

      • Kubernetes v1.31 지원

      • GPU operator v24.9.0 지원

      • 컴포넌트 버전 업

        • metrics-server v0.7.2

        • nfsplugin v4.8.0

    • Bugfixes

      • 온라인 설치 시 redhat 계열 설치 안되는 현상

      • audit-log를 false 일 경우 클러스터 생성 실패 오류

    • Improvement

      • 기본제공 'cubectl.toml` 누락 옵션 반영

      • kubelet extra-args 옵션 map 방식으로 처리

    • Enhancement

      • cubectl.toml 로컬 레파지토리 섹션 추가, private-registry 섹션과 분리

      • CUBE API 데이터베이스 sqlite 적용 및 기타 기능 향상

    hashtag
    v1.2.3 (hotfix)

    2024.10.31

    • Features

      • 어노테이션을 통해 노드별로 SSH 계정, 포트 별도 지정 기능

      • 어노테이션을 통해 노드 스케일-인 수행 시 노드별로 삭제 대상 노드 목록에서 제외 지정 기능

    hashtag
    v1.2.2

    2024.10.15

    • Features

      • GPU Operator 애드온 다운로드 서비스

      • metrics-server, network-cni(calico), haproxy 애드온 설치 여부 옵션 추가

      • nfs-cis-driver v4.8.0으로 버전 업

      • Control-Plane 스케일 인/아웃 기능

      • Kubernetes v1.30 및 패치버전 추가 지원: v1.30.4, v1.29.8, v.28.13, v1.27.16

    • Bugfixes

      • 버전 업그레이드 시 calico vxlan 모드인 경우 워크로드간 통신하지 못하는 현상, always 옵션 적용

      • 온라인 설치 시 centos9에서 local repository 설정 누락 오류

    • Improvement

      • CUBE 다운로드 서비스 개선 및 도메인 이슈

      • 리눅스 Local Repository 지원 종료 및 URL 변경이슈 개선 - CentOS 8(stream), CentOS 7, RHEL 7

    • Enhancement

      • 버전이 지정되지 않은 CUBECTL 인 경우 CUBE 이미지를 항상 최신 버전(latest) 을 pull 하도록 개선

      • CUBECTL 로그 개선

    hashtag
    v1.2.1 (hotfix)

    2024.07.12

    • Bugfixes

      • storage 서버 삭제 시 사용되지 않는 변수 삭제

      • artifacts 로그 갯수 제한

      • 실행 Timeout 시간 7200초로 증가

      • calico vxlan mode default-value값 CrossSubnet 에서 Always 로 변경

      • addon data-dir 파라미터 제거하고 values 파일에 default-value 지정

      • 폐쇄망에서 storage server 설치되지 않는 현상

    hashtag
    v1.2.0

    2024.06.28

    • Features

      • 리눅스 배포판 5종 추가 지원 (centos9 | rhel9 | rocky9 | ubuntu2304 | ubuntu2310)

      • 멀티 CPU Architecture 지원 (amd64, arm64)

      • 애드온 구조 개선

      • 멀티 클러스터 프로비저닝 기능

      • cubectl 실행 환경(Container Runtime) 추가 지원 (podman (default), docker, containerd)

      • 사설 레지스트리(harbor) IP 변경 기능

    • Enhancement/Improvement

      • Default pod cird 수정 (10.4.0.0/16)

      • calico, metrics-server 컴포넌트 버전업

    • Refactoring

      • 멀티 클러스터 설치를 위한 구조 개선

    • Bugfixes

      • v1.0.x 로 설치 클러스터 업그레이드 시 누락된 Image 추가

      • 폐쇄망 Centos8 노드 설치 오류

    hashtag
    v1.1.0

    2024.03.20

    • Features

      • Kubernetes Legacy Package Repositories Frozen 대응

      • Kubernetes v1.28 지원

    • Bugfixes

      • v1.0.x 로 설치 클러스터 업그레이드 시 누락된 Image 추가

      • 폐쇄망 Centos8 노드 설치 오류

      • Storage 서버 패키지 설치 오류

    • Enhancement

      • 폐쇄망 설치 리눅스 패키지 종속성 관리 방식 개선

      • Harbor HTTP 서비스 포트 8081번으로 변경

    • Improvement

      • Addons 별 차트 버전관리 방식 개선

    • Refactoring

      • Duplicate 코드 개선

      • 폐쇄망 container image archive 파일 업로드 개선

    • Documentation

      • Image Registry IP 또는 도메인 변경 매뉴얼 제공

    hashtag
    v1.0.5 (hotfix)

    2024.01.16

    • Bugfixes

      • "ubuntu2004/ubuntu2204" 단일 리눅스 배포판으로 구성된 클러스터에서 "Failed to update apt cache: E:Failed to fetch file:/data/localrepo/ubuntu2004/./Packages File not found" 오류

    hashtag
    v1.0.4

    2024.01.12

    • Features

      • Worker-node calicoctl 설치

      • GPU Time Slicing & MIG(multi instance GPU) Addon 지원

      • umask 027 설정 호스트 설치 지원

    • Enhancement

      • addon.toml "values_file" 개선

    hashtag
    v1.0.3

    2023.12.05

    • Bugfixes

      • 각 노드에서 파일 및 디렉토리 생성 시 항상 권한 지정하도록 수정

      • private-registry를 포함한 클러스터에서 Update를 통해 추가된 노드에서 인증서가 없는 오류

      • Update 시 이전 변경 사항 확인하는 과정에서 변경 대상 노드를 가져오지 못하는 오류

      • lbip를 입력해도 masterip가 lbip로 입력되는 오류

    • Improvement

      • Terraform/Openstack 기반 CI 파이프라인을 통한 테스트 자동화 반영

    hashtag
    v1.0.2

    2023.10.16

    • Features

      • RedHat Enterprise Linux 7.9 지원

    • Bugfixes

      • 리눅스 로컬 저장소 구성 시 Packages.gz 파일 권한 오류

      • 폐쇄망 패키지 다운로드 오류

    • Enhancement

      • 폐쇄망 설치 시 파일 유효성 체크 개선

      • K8S 패치 버전까지 지정해서 폐쇄망 패키지 파일 다운로드 가능하도록 개선

    • Refactoring

      • K8S 패치 버전까지 폐쇄망 패키지 파일 세분화

    hashtag
    v1.0.1

    2023.09.08

    • Features

      • CentOS7 지원 (v7.8, v7.9)

      • 멀티 OS 지원 동시 설치 지원 (6종, 일부 os 기능 제한)

      • Kubernetes v1.27 지원

      • 칵테일 다운로드 URL (https://cube.k3.acornsoft.io/download-cocktail) 제공

    • Bugfixes

      • 노드별로 다른 python 명령어 위치로 인해 발생하는 mitogen tool disable 오류

      • 온라인 환경에서 사설 저장소만 설치할 경우 설치 오류

    • Improvement

      • etcd secret control-plane 노드에서 중복으로 생성되는 현상 개선

      • api-server 인증서에 첫번째 컨트롤플랜 노드 ip가 포함되는 현상 개선

    • Enhancement

      • GPU노드를 위한 nvidia 관련 패키지 추가

      • calico v3.26 업그레이드

    • Refactoring

      • 사용하지 않는 cubectl.toml 정리

      • mitogen-v0.2.9(extends ansible tools) 제거

    hashtag
    v1.0.0

    2023.06.12

    • Create a Cluster

    • Delete a Cluster

    • Add & Remove worker nodes

    • Kubernetes version upgrade

    amd64(x86_64)
  • arm64(aarch64)

  • ※ 멀티 리눅스 배포판으로 단일 클러스터 구성이 가능합니다.

    hashtag
    Supported CUBE

    • CUBE는 최신 3개 패치버전 (v1.2.2, v1.2.1, v1.1.0) 을 지원합니다.

    • CUBE는 마이너 버전(v1.2 과 v1.1) 간 버전 호환성을 지원하지 않는것을 원칙으로 합니다.

    • CUBE v1.2은 CUBE v1.1로 설치한 private-registry(harbor)의 IP 및 도메인 변경을 지원하지 않습니다.

    hashtag
    Kubernetes

    Kubernetes
    Kubernetes released
    CUBE released
    Kubernetes EOS
    CUBE EOS
    CUBE 설치 지원 버전

    v1.34

    2025-09-09

    2025-10-20

    2026-10-27

    2027-06-30

    v1.3

    v1.33

    2025-05-15

    2025-06-30

    • 지원하는 최신 마이너버전에서 하위 5개(총 6개) 버전을 지원합니다.

    • 기술 지원이 종료된 버전은 보안 패치 및 버그 수정을 제공하지 않습니다.

    hashtag
    v1.3

    • Supported Linux Distributions

      • Ubuntu 20.04(Cube v1.3.3 deprecated)

      • Ubuntu 22.04, Ubuntu24.04

      • CentOS 9(stream)

      • Rocky 8, 9

      • RedHat Enterprise Linux 8, 9

      • Oracle Linux 9

    • Kubernetes

      • v1.34.0

      • v1.33.4

      • v1.32.8

    • Components

      • containerd: v1.7.24

      • cri-o: k8s version

      • coredns: v1.9.3

    • Addons

      • calico: v3.29.1

      • cilium: v1.17.3

      • helm: v3.16.4

    • Private registry(harbor) / Linux package repository

      • harbor: v2.7.4

      • docker-compose: v2.32.0

    • Package

      • Kubeflow: v1.10.2

    hashtag
    v1.2

    • Supported Linux Distributions

      • Ubuntu 20.04, 22.04

      • CentOS 7.8, 7.9, 8(stream), 9(stream)

      • Rocky 8, 9

      • RedHat Enterprise Linux 7.9, 8, 9

    • Kubernetes

      • v1.31.3

      • v1.30.7

      • v1.29.11

    • Components

      • containerd: v1.6.28

      • coredns: v1.9.3

      • pause: v3.9

    • Addons

      • calico: v3.28.0

      • helm: v3.10.3

      • csi-driver-nfs: v4.8.0

    • Private registry(harbor) / Linux package repository

      • harbor: v2.7.4

      • docker-compose: v2.24.5

    hashtag
    v1.1

    • Kubernetes

      • v1.28.6

      • v1.27.9

      • v1.26.14

      • v1.25.16

    • Components

      • containerd: v1.6.28

      • coredns: v1.9.3

      • pause: v3.9

    • Addons

      • calico: v3.27.0

      • helm: v3.10.3

    • Private Registry (harbor + linux package repository)

      • harbor: v2.6.4

      • docker-compose: v2.24.5

    hashtag
    v1.0

    • v1.27

      • containerd : v1.6

      • etcd : v3.5

      • calico : v3.26

      • coredns : v1.9.3

      • metrics-server : v0.6

      • pause : v3.9

    • v1.26

      • containerd : v1.6

      • etcd : v3.5

    • v1.25

      • containerd : v1.6

      • etcd : v3.5

    • v1.24

      • containerd : v1.6

      • etcd : v3.5

    • v1.23

      • containerd : v1.6

      • etcd : v3.4

    • Image Registry (Harbor)

      • v19.03.15

      • v1.29.2

    • Linux Package Repository

      • v1.24.0

    • Storage Server

      • Latest (v2.6.1) 2023.06.12

    쿠버네티스 클러스터 노드 스케일 업/다운.
  • 쿠버네티스 클러스터 버전 업그레이드.

  • 폐쇄망 설치 지원.

  • GPU 애드온 설치.

  • 사설 저장소 (Harbor) 및 스토리지 서버(NFS, Network File Server) 설치.

  • hashtag
    Contents

    • Getting Started

    • Infrastructure Specifications

    • Download

    create

    hashtag
    create

    since v1.0.0

    쿠버네티스 클러스터 및 사설 저장소(harbor), 스토리지 서버(Network File Server)를 설치합니다.

    $ cubectl create -p <ssh key> -u <username>

    hashtag
    parameters

    • -p <ssh key>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 Private-Key 입니다.

    • -u <username>

    hashtag
    examples

    update-kubeconfig

    hashtag
    update-kubeconfig

    since v1.0.0

    설치된 쿠버네티스 클러스터의 KUBECONFIG 파일을 다운로드받습니다.

    acloud-client-kubeconfig 파일로 저장됩니다.

    hashtag
    parameters

    • -p <ssh key>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 Private-Key 입니다.

    • -u <username>

    hashtag
    examples

    Infrastructure Specifications

    hashtag
    Resource Specifications

    hashtag
    Minimum resource requirements (For Kubernetes only)

    • 2 vCPUs

    • 2 GB RAM

    • 20 GB Storage

    hashtag
    Minimum resource requirements (For Installation of Cocktail)

    구분
    수량
    CPU
    Memory
    Disk
    비고

    hashtag
    Recommended resource requirements (For Installation of Cocktail)

    구분
    수량
    CPU
    Memory
    Disk
    비고

    hashtag
    Firewall Settings

    ※ all nodes

    Protocol
    Direction
    Port Range
    Description

    ※ control plane

    Protocol
    Direction
    Port Range
    Purpose
    Used By

    ※ worker nodes

    Protocol
    Direction
    Port Range
    Purpose
    Used By

    ※ registry (harbor + linux-local-repository, optional)

    Protocol
    Direction
    Port Range
    Purpose
    Used By

    hashtag
    Sudoers Table

    Bin
    Control-Planes
    Workers
    Registry
    Bastion
    NOPASSWD
    After-Install
    Description

    hashtag
    Running cubectl

    • OS : linux, darwin(osx)

    • CPU : amd64(x86_64), arm64(aarch64)

    • CentOS 7, RedHat Enterprise Linux 7 은 /proc/sys/user/max_user_namespaces 10000 이상 값설정 필요.

    cubectl

    hashtag
    개요

    cubectl 은 cubectl.toml 에 지정된 설정 값을 기반으로 쿠버네티스 클러스터를 프로비저닝하고 관련 툴을 설치하는 Command Line Interface 입니다.

    hashtag
    구조

    cubectl command 구조는 다음과 같습니다.

    hashtag
    목차

    • : 쿠버네티스 클러스터를 프로비저닝하고 사설 저장소(harbor), 스토리지 서버(NFS) 툴 설치합니다.

    • : 프로비저닝된 쿠버네티스 클러스터, 사설 저장소(harbor), 스토리지 서버(NFS) 툴 제거합니다.

    • : 쿠버네티스 노드를 추가,삭제 합니다.

    addon

    hashtag
    addon list

    since v1.2.0

    애드온 목록을 조회합니다.

    destroy

    hashtag
    destroy

    since v1.0.0

    쿠버네티스 클러스터, Registry, Storage 서버를 제거합니다.

    upgrade

    hashtag
    upgrade

    since v1.0.0

    설치된 쿠버네티스 클러스터의 버전을 업그레이드합니다.

    cubectl

    config

    hashtag
    config new

    since v1.0.0

    config/cubectl.toml 에 새로운 cubectl.toml 파일을 생성합니다.

    cubectl.toml

    cubectl.toml 은 클러스터를 설치하고 업데이트기 위한 기본 설정 정보 파일입니다.

    "cubectl config new" 명령으로 template 파일을 생성할 수 있습니다.

    hashtag
    구조

    cubectl.toml 의 설정 구조는 아래와 같습니다.

    kubernetes

    쿠버네티스와 관련된 속성을 정의합니다.

    hashtag
    [kubernetes]

    hashtag
    version

    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=user PASSWD=pwd VERSION=v1.0.4 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> VERSION=v1.2.0 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> VERSION=v1.2.0 OS=linux sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> VERSION=v1.2.0 OS=linux ARCH=amd64 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204 VERSION=v1.2.0 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204 VERSION=v1.2.0 OS=linux sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204 VERSION=v1.2.0 OS=linux ARCH=amd64 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204 VERSION=v1.2.0 OS=linux ARCH=amd64 K8S=v1.29 sh -
    
    # 멀티 배포판
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204,rocky9,rhel8 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204,rocky9,rhel8 ARCH=amd64,arm64  sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> COCKTAIL=v4.7.4 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> COCKTAIL=v4.7.4 VERSION=v1.0.0 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> COCKTAIL=v4.7.4 VERSION=v1.0.0 OS=linux sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> COCKTAIL=v4.7.4 VERSION=v1.0.0 OS=linux ARCH=amd64 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204 COCKTAIL=v4.7.4 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204 COCKTAIL=v4.7.4 VERSION=v1.0.0 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204 COCKTAIL=v4.7.4 VERSION=v1.0.0 OS=linux sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204 COCKTAIL=v4.7.4 VERSION=v1.0.0 OS=linux ARCH=amd64 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204 COCKTAIL=v4.7.4 VERSION=v1.0.0 OS=linux ARCH=amd64 K8S=v1.24 sh -
    cubectl-v1.2.0/
    ├── bin/
    │   └── cubectl
    ├── config/
    │   ├── cubectl.toml
    │   └── default/                                                     : ansible-runner private-data dir. (default)/
    │       ├── env/
    │       ├── inventory/
    │       └── certs/
    ├── archive/
    │   ├── runtime/
    │   │   ├── regctl-linux-amd64.tgz                                   : since v1.2.0
    │   │   └── harbor-offline-installer-v2.7.4-linux-amd64.tgz          : since v1.2.0
    │   │   └── podman-v4.4.2-linux-amd64.tgz                            : since v1.2.2
    │   └── cubectl-image-v1.2.0.tgz                                     : for bastion architecture since v1.2.0
    ├── extends/
    │   └── addon/
    │       ├── charts/
    │       │   ├── index.yaml                                           : runtime 생성
    │       │   ├── kore-board-0.5.5.tgz
    │       │   ├── csi-driver-nfs-v4.8.0.tgz
    │       │   └── gpu-operator-v23.9.0.tgz
    │       ├── images/
    │       │   └── gpu-operator/
    │       │       └── gpu-operator-v23.9.0-ubuntu2004.tgz
    │       └── profile/
    │           ├── kore-board/
    │           │   └── default.yaml
    │           ├── kore-board_20240101000000/                           : 백업시 생성
    │           │   └── default.yaml
    │           ├── csi-driver-nfs/
    │           │   └── default.yaml
    │           └── gpu-operator/
    │               ├── default.yaml
    │               ├── ubuntu.yaml
    │               └── redhat.yaml
    ├── logs/
    └── LICENSE.txt
    cubectl-v1.2.0/
    ├── bin/
    │   ├── ccp
    │   └── cubectl
    ├── config/
    ├── archive/
    │   ├── runtime/
    │   │   ├── regctl-linux-amd64.tgz
    │   │   └── harbor-offline-installer-v2.7.4-linux-amd64.tgz
    │   │   └── podman-v4.4.2-linux-amd64.tgz
    │   ├── cocktail-v4.7.4-R20230419.tgz
    │   └── cubectl-image-v1.2.0.tgz
    ├── extends/
    │   └── addon/
    │       ├── charts/
    │       │   ├── index.yaml                                           : runtime 생성
    │       │   ├── kore-board-0.5.5.tgz
    │       │   ├── csi-driver-nfs-v4.8.0.tgz
    │       │   └── gpu-operator-v23.9.0.tgz
    │       ├── images/
    │       │   └── gpu-operator/
    │       │       └── gpu-operator-v23.9.0-ubuntu2004.tgz
    │       └── profile/
    │           ├── kore-board/
    │           │   └── default.yaml
    │           ├── kore-board_20240101000000/                           : 백업시 생성
    │           │   └── default.yaml
    │           ├── csi-driver-nfs/
    │           │   └── default.yaml
    │           └── gpu-operator/
    │               ├── default.yaml
    │               ├── ubuntu.yaml
    │               └── redhat.yaml
    ├── logs/
    └── LICENSE.txt
    cubectl-v1.2.0/
    ├── bin/
    │   └── cubectl
    ├── config/
    ├── archive/
    │   ├── v1.29/
    │   │   ├── harbor-images-v1.25.9.tgz
    │   │   ├── k8s-images-v1.29.3.tgz
    │   │   └── k8s-repo-ubuntu2204-amd64-v1.29.3.tgz
    │   ├── runtime/
    │   │   ├── calicoctl-v3.28.0-linux-amd64.tar.gz
    │   │   ├── etcd-v3.5.7-linux-amd64.tar.gz
    │   │   ├── harbor-offline-installer-v2.7.4-linux-amd64.tgz
    │   │   ├── helm-v3.10.3-linux-amd64.tar.gz
    │   │   ├── regctl-linux-amd64.tgz
    │   │   └── podman-v4.4.2-linux-amd64.tgz
    │   ├── local-repo-ubuntu2204-amd64-R240528.tgz
    │   ├── extend-images.tgz
    │   ├── util-images.tgz
    │   └── cubectl-image-v1.2.0.tgz
    ├── extends/
    │   └── addon/
    │       ├── charts/
    │       │   ├── index.yaml                                           : runtime 생성
    │       │   ├── kore-board-0.5.5.tgz
    │       │   ├── csi-driver-nfs-v4.8.0.tgz
    │       │   └── gpu-operator-v23.9.0.tgz
    │       ├── images/
    │       │   └── gpu-operator/
    │       │       └── gpu-operator-v23.9.0-ubuntu2004.tgz
    │       └── profile/
    │           ├── kore-board/
    │           │   └── default.yaml
    │           ├── kore-board_20240101000000/                           : 백업시 생성
    │           │   └── default.yaml
    │           ├── csi-driver-nfs/
    │           │   └── default.yaml
    │           └── gpu-operator/
    │               ├── default.yaml
    │               ├── ubuntu.yaml
    │               └── redhat.yaml
    ├── logs/
    └── LICENSE.txt
    cubectl-v1.2.0/
    ├── bin/
    │   ├── cubectl
    │   └── ccp
    ├── config/
    ├── archive/
    │   ├── v1.29/
    │   │   ├── harbor-images-v1.25.9.tgz
    │   │   ├── k8s-images-v1.29.3.tgz
    │   │   └── k8s-repo-ubuntu2204-amd64-v1.29.3.tgz
    │   ├── runtime/
    │   │   ├── calicoctl-v3.28.0-linux-amd64.tar.gz
    │   │   ├── etcd-v3.5.7-linux-amd64.tar.gz
    │   │   ├── harbor-offline-installer-v2.7.4-linux-amd64.tgz
    │   │   ├── helm-v3.10.3-linux-amd64.tar.gz
    │   │   ├── regctl-linux-amd64.tgz
    │   │   └── podman-v4.4.2-linux-amd64.tgz
    │   ├── cocktail-v4.8.0-R2024011603.tgz
    │   ├── local-repo-ubuntu2204-amd64-R240528.tgz
    │   ├── extend-images.tgz
    │   ├── util-images.tgz
    │   └── cubectl-image-v1.2.0.tgz
    ├── extends/
    │   └── addon/
    │       ├── charts/
    │       │   ├── index.yaml                                           : runtime 생성
    │       │   ├── kore-board-0.5.5.tgz
    │       │   ├── csi-driver-nfs-v4.8.0.tgz
    │       │   └── gpu-operator-v23.9.0.tgz
    │       ├── images/
    │       │   └── gpu-operator/
    │       │       └── gpu-operator-v23.9.0-ubuntu2004.tgz
    │       └── profile/
    │           ├── kore-board/
    │           │   └── default.yaml
    │           ├── kore-board_20240101000000/                           : 백업시 생성
    │           │   └── default.yaml
    │           ├── csi-driver-nfs/
    │           │   └── default.yaml
    │           └── gpu-operator/
    │               ├── default.yaml
    │               ├── ubuntu.yaml
    │               └── redhat.yaml
    ├── logs/
    └── LICENSE.txt
    $ curl -sfL https://cube.k3.acornsoft.io/download-cocktail | ACCOUNT=user PASSWD=pwd sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cocktail | ACCOUNT=<user> PASSWD=<password> sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cocktail | ACCOUNT=<user> PASSWD=<password> VERSION=v4.7.4 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-cocktail | ACCOUNT=<user> PASSWD=<password> VERSION=v4.7.4 CCP=v1.0.6 sh -
    중복선택 가능합니다. (예: AIRGAP=ubuntu2204,rocky9,rhel8)
  • 지원 리눅스 배포판 (12종) : ubuntu2004 | ubuntu2204 | ubuntu2304 | ubuntu2310 | centos7 | centos8 (stream) | centos9 (stream) | rocky8 | rocky9 | rhel7 | rhel8 | rhel9

  • Default: amd64
  • since v1.2.0

  • v1.29.2 와 같이 패치 버전까지 입력한 경우 특정 버전 다운로드 가능합니다.
  • 지원 쿠버네티스 버전은 * Supported Versions 을 참조하세요.

  • Default: 현재 OS
    Default: amd64(x86_64)
    Default: 최신 버전

    Default: 최신 버전

    Template을 이용해서 Control Plane 설정 복사 시 모든 항목이 동일 적용되던 문제 수정
  • DB에 저장된 정보와 실제 클러스터의 정합성 유지

  • SSH 반복 접속 횟수 조정

  • Cilium CNI addon 설치 사용자 메뉴얼
    helm : v3.10.3 → v3.16.4
  • docker-compose : v2.24.5 → v2.32.0

  • regctl : v0.7.1 → v0.8.0

  • nginx : 1.25.3 → 1.27.3
  • nfsplugin : [v4.6.0, v4.8.0] → [v4.6.0, v4.8.0, v4.9.0]

  • csi-provisioner : v4.0.0 → v5.0.2

  • csi-snapshotter : v6.3.3 → v8.0.1

  • csi-node-driver-registrar : v2.10.0 → v2.11.1

  • livenessprobe : v2.12.0 → v2.13.1

  • snapshot-controller : v6.3.3 → v8.0.1

  • 클러스터 boolean 타입 설치 옵션 default 값 지정 오류
  • 동일 호스트 대상으로 폐쇄망으로 설치 후 온라인 재설치 안되는 현상

  • redhat8, redhat7 멀티 설치 및 iptables 관련 오류

  • 실행 런타임 오류 발생 후 ERROR[0007] 디스플레이되고 끝나는 현상

  • registry, repository 인벤토리 잘못 지정되는 현상

  • upgrade 명령 실행 시 cubectl.toml 에 private-registry ip, private_ip 둘다 기입했을 경우 설치 실패하는 현상

  • control-plane 노드 추가 안되는 현상

  • 실행 Timeout 을 90분으로 증가, 단일 Task timeout 은 20분에서 60분으로 변경
  • 패키지 다운로드 시 "VERSION" 을 입력하지 않을 경우 alpha, beta 버전이 다운로드 되는 현상 개선

  • metrics-server control-plane 노드에 설치

  • destroy, upgrade, update-kubeconfig 명령 node annotation 반영

  • "private-key" Flag 필수 체크
    클러스터 이름이 적용되지 않는 현상
  • nfs-utils 패키지 설치 시 종속성 문제 - allowerasing 옵션 추가

  • 멀티 클러스터에서 이미지 레지스트리 공유할 경우 인증서 다운로드 URL 가져오지 못하는 문제

  • 설치옵션(extravars.cube) boolean type default 값 지정 오류

  • 폐쇄망 설치 시 CentOS7 노드에서 패키지들 간 의존성 에러 발생 문제

  • 폐쇄망 환경에서 podman archive 파일 찾지 못해 CUBECTL 실행하지 못하는 현상

  • 이미지 레지스트리 도메인과 IP간 변경 기능
  • 이미지 레지스트리 admin 비밀번호 옵션 적용

  • 워커노드 haproxy 헬스체크 포트 "8081" 에서 "8054"로 변경

  • 온라인 모드로 설치한 클러스터를 페쇄망 환경으로 전환가능하도록 개선

  • Addons 별 차트 버전관리 방식 개선
    Storage 서버 패키지 설치 오류
    destroy 시 이전 network-cni 설정 정보 유지되는 현상
  • Cluster Configuration endpoint를 lb-ip로 지정하여 노드 join 안되는 현상

  • 구버전의 cubectl로 설치한 클러스터가 v1.0.0 버전으로 업그레이드 안되는 오류

  • 워커 노드수를 축소해서 업데이트 했을 경우 오류 메시지 출력 현상

  • 워커 노드수를 0개에서 1개이상 증가 시킨후 update 실행 시 오류

  • update 실행 시 신규 노드 경우 label 누락되는 현상

  • 클러스터 프로비저닝 이후 추가된 노드에 대한 업그레이드 오류

  • Harbor 인증서 생성 방식 개선
  • 폐쇄망 설치용 archive tar 파일 개선 및 버전 세분화

  • 에드온 cis-driver-nfs 업그레이드

    v1.31.12

  • v1.30.14

  • v1.29.15

  • v1.28.15

  • v1.27.16

  • v1.26.15

  • pause: v3.10

  • haproxy: 3.1.1

  • etcd: v3.5.17

  • metrics-server: v0.7.2

  • csi-driver-nfs: v4.9.0, v4.11.0

  • nginx: 1.27.3
  • trivy : v0.62.1

  • v1.28.15

  • v1.27.16

  • v1.26.15

  • v1.25.16

  • haproxy: 2.9.4

  • etcd: v3.5.7

  • metrics-server: v0.7.2

  • nginx: 1.25.3
  • haproxy: 2.9.4

  • etcd: v3.5.7

  • metrics-server: v0.7.0

  • nginx: 1.25.3
    calico : v3.25
  • coredns : v1.9.3

  • metrics-server : v0.6

  • pause : v3.9

  • calico : v3.25
  • coredns : v1.8.6

  • metrics-server : v0.6

  • pause : v3.8

  • calico : v3.24
  • coredns : v1.8.6

  • metrics-server : v0.6

  • pause : v3.7

  • calico : v3.23
  • coredns : v1.8.6

  • metrics-server : v0.6

  • pause : v3.6

  • harborarrow-up-right v2.6.4

    2026-06-28

    2026-12-31

    v1.3

    v1.32

    2025-02-11

    2025-04-03

    2026-02-28

    2026-06-30

    v1.3

    v1.31

    2024-10-22

    2024-12-31

    2025-10-28

    2025-12-31

    v1.2, v1.3

    v1.30 EOS

    2024-06-28

    2024-10-07

    2025-07-28

    2025-09-31

    v1.2, v1.3

    v1.29 EOS

    2024-02-28

    2024-07-12

    2025-03-23

    2025-06-30

    v1.2, v1.3

    v1.28 EOS

    2023-08-15

    2024-03-20

    2024-11-26

    2025-03-31

    v1.1, v1.2, v1.3

    v1.27 EOS

    2023-04-11

    2024-01-16

    2024-07-24

    2024-12-31

    v1.1, v1.2, v1.3

    v1.26 EOS

    2022-12-09

    2023-07-12

    2024-06-11

    2024-09-30

    v1.1, v1.2, v1.3

    v1.25 EOS

    2022-08-23

    2023-07-12

    2024-05-01

    2024-06-31

    v1.1

    dockerarrow-up-right
    docker-composearrow-up-right
    nginxarrow-up-right
    Supported Versions
    Release

    Basics

    Packages

    500 G

    동시 빌드 15개 기준

    Private Registry

    1식

    8 vCore

    16 G

    1 TB

    NFS

    1식

    1 TB

    Bastion

    optional

    4 vCore

    4 G

    500 G

    설치, 원격운영지원

    500 G

    동시 빌드 5개 기준

    Private Registry

    1식

    8 vCore

    16 G

    1 TB

    NFS

    1식

    2 TB

    Bastion

    optional

    4 vCore

    4 G

    500 G

    설치, 원격운영지원

    4(IPv4)

    Inbound/outbound

    calico(ipip)

    TCP

    Inbound/outbound

    179

    calico(ipip)

    UDP

    Inbound/outbound

    4789

    calico(vxlan)

    TCP/UDP

    Inbound/outbound

    111

    when using nfs

    TCP/UDP

    Inbound/outbound

    2049

    when using nfs

    HTTP

    outbound

    8080

    on air gaped network

    TCP

    Inbound/outbound

    4240

    cilium(health check)

    TCP

    Inbound/outbound

    4244

    cilium(Hubble server)

    TCP

    Inbound/outbound

    4245

    cilium(Hubble Relay)

    TCP

    Inbound/outbound

    4250

    cilium(Mutual Authentication port)

    TCP

    Inbound/outbound

    8472

    cilium(vxlan)

    TCP

    Inbound/outbound

    6081

    cilium(Geneve)

    TCP

    Inbound/outbound

    9962

    cilium(cilium-agent Prometheus metrics)

    TCP

    Inbound/outbound

    9963

    cilium(cilium-operator Prometheus metrics)

    TCP

    Inbound/outbound

    9964

    cilium(cilium-envoy Prometheus metrics)

    TCP

    Inbound/outbound

    51871

    cilium(WireGuard encryption tunnel endpoint)

    TCP

    Inbound/outbound

    ICMP 8/0

    cilium(health check)

    Inbound

    6443

    Kubernetes API server

    All

    TCP

    Inbound/outbound

    8472

    cilium(vxlan)

    cilium

    TCP

    Inbound/outbound

    10250

    Kubelet API

    Self, Control plane

    TCP

    Inbound

    10257

    kube-controller-manager

    Self

    TCP

    Inbound

    10259

    kube-scheduler

    Self

    TCP

    Inbound/outbound

    ICMP 8/0

    cilium(health check)

    cilium

    Inbound/outbound

    8472

    cilium(vxlan)

    cilium

    TCP

    Inbound/outbound

    10250

    Kubelet API

    Self, Control-plane

    TCP

    Inbound

    30000-32767

    NodePort Service Range

    All

    TCP

    Inbound/outbound

    ICMP 8/0

    cilium(health check)

    cilium

    /usr/local/bin/podman

    ⚫

    필수

    ×

    run in cubectl

    /usr/bin/cp

    ⚫

    필수

    ×

    run in cubectl

    /usr/bin/tar

    ⚫

    필수

    ×

    run in cubectl

    /usr/bin/helm

    ⚫

    ○

    /usr/bin/cp

    ⚫

    ⚫

    ⚫

    ○

    노드 관리용도

    /usr/bin/tar

    ⚫

    ⚫

    ⚫

    ○

    노드 관리용도

    /usr/bin/ls

    ⚫

    ⚫

    ⚫

    ⚫

    ○

    노드 관리용도

    /usr/bin/cat

    ⚫

    ⚫

    ⚫

    ⚫

    ○

    노드 관리용도

    /usr/bin/systemctl

    ⚫

    ⚫

    ⚫

    ○

    노드 관리용도

    /usr/bin/journalctl

    ⚫

    ⚫

    ⚫

    ○

    노드 관리용도

    /usr/bin/kubectl

    ⚫

    ⚫

    ○

    노드 관리용도

    /usr/bin/kubeadm

    ⚫

    ⚫

    ○

    노드 관리용도

    /usr/bin/crictl

    ⚫

    ⚫

    ○

    노드 관리용도

    /usr/sbin/ipvsadm

    ⚫

    ⚫

    ○

    노드 관리용도

    /usr/bin/calicoctl

    ⚫

    ⚫

    ○

    노드 관리용도

    /usr/bin/netstat

    ⚫

    ⚫

    ○

    노드 관리용도

    /usr/bin/etcdctl

    ⚫

    ○

    노드 관리용도

    /usr/local/bin/docker-compose

    ⚫

    ○

    노드 관리용도

    /usr/bin/docker

    ⚫

    ○

    노드 관리용도

    /usr/bin/vi

    ⚫

    ⚫

    ⚫

    ×

    트러블 슈팅용도

    /usr/bin/chown

    ⚫

    ⚫

    ⚫

    ×

    트러블 슈팅용도

    /usr/bin/chmod

    ⚫

    ⚫

    ⚫

    ×

    트러블 슈팅용도

    /usr/bin/df

    ⚫

    ⚫

    ⚫

    ×

    트러블 슈팅용도

    /usr/bin/lsmod

    ⚫

    ⚫

    ⚫

    ×

    트러블 슈팅용도

    /usr/bin/modprobe

    ⚫

    ⚫

    ⚫

    ×

    트러블 슈팅용도

    /usr/bin/swapoff

    ⚫

    ⚫

    ⚫

    ×

    트러블 슈팅용도

    /usr/bin/grep

    ⚫

    ⚫

    ⚫

    ×

    트러블 슈팅용도

    /usr/bin/regctl

    ⚫

    ○

    이미지 관리용도

    RedHat Enterprise Linux 7(arm64)는 cubectl 실행을 지원하지 않습니다.
  • Kubernetes v1.33부터 최소 지원 kernel version이 4.19 이상입니다.

    • 현재 RedHat Enterprise Linux 8, Rocky8은 v1.33으로 Upgrade가 불가능 합니다.

  • Cubectl은 Kubernetes version v1.30 이상부터 cri-o를 이용한 설치를 지원합니다.

  • Kubernetes v1.34부터 registry.k8s.io/pause:3.10.1을 지원합니다.

    • extend-images.tgz를 다운로드 후 push registry 명령어를 이용하여 upload를 해야합니다.

  • Control plane

    3식

    8 vCore

    16 G

    500 G

    Worker nodes

    1식

    16 vCore

    Control plane

    3식

    16 vCore

    32 G

    500 G

    Worker nodes

    3식

    16 vCore

    SSH

    Inbound/outbound

    22

    TCP

    Inbound/outbound

    80

    http

    TCP

    Inbound/outbound

    443

    TCP

    Inbound

    2379~2380

    etcd server client API

    kube-apiserver, etcd, cilium

    TCP

    Inbound/outbound

    4240

    cilium(health check)

    cilium

    TCP

    Inbound/outbound

    2379~2380

    etcd server client API

    etcd, cilium

    TCP

    Inbound/outbound

    4240

    cilium(health check)

    cilium

    TCP

    Inbound

    443

    harbor https

    All

    TCP

    Inbound

    8080

    linux-local-repository (on air gaped network)

    All

    /usr/bin/sh

    ⚫

    ⚫

    ⚫

    필수

    ×

    32 G

    32 G

    https

    TCP

    TCP

    cubectl(ansible)

    Addons

    설치 호스트들의 Passwordless SSH 연결을 위한 사용자 계정명입니다.

  • -a, --auto-approve

    • optional

    • IP 확인 및 y/n 질의 절차를 생략합니다.

  • -c, --cluster

    • optional

    • Cluster 이름을 입력합니다.

    • Default : "default"

  • -f, --config

    • optional

    • cubectl.toml 경로를 입력합니다.

    • Default : ${CUBE_HOME}/config/cubectl.toml

  • --container-runtime

    • optional

    • 컨테이너 런타임을 지정합니다. podman 또는 docker 중에서 선택할 수 있습니다.

    • Default : "podman"

  • --cube

    • optional

    • Cube의 버전을 지정합니다.

    • Default : "latest"

  • --port

    • optional

    • 원격 호스트의 포트를 지정합니다.

    • Default : 22

  • -v, --verbose

    • optional

    • 상세 출력을 활성화합니다.

  • 설치 호스트들의 Passwordless SSH 연결을 위한 사용자 계정명입니다.

  • -a, --auto-approve

    • optional

    • IP 확인 및 y/n 질의 절차를 생략합니다.

  • -c, --cluster

    • optional

    • Cluster 이름을 입력합니다.

    • Default : "default"

  • -f, --config

    • optional

    • cubectl.toml 경로를 입력합니다.

    • Default : ${CUBE_HOME}/config/cubectl.toml

  • --container-runtime

    • optional

    • 컨테이너 런타임을 지정합니다. podman 또는 docker 중에서 선택할 수 있습니다.

    • Default : "podman"

  • --cube

    • optional

    • Cube의 버전을 지정합니다.

    • Default : "latest"

  • --port

    • optional

    • 원격 호스트의 포트를 지정합니다.

    • Default : 22

  • -v, --verbose

    • optional

    • 상세 출력을 활성화합니다.

  • update-kubeconfig : 쿠버네티스 클러스터의 KUBECONFIG 파일을 저장합니다.

  • upgrade : 쿠버네티스 클러스터 버전을 업그레이드 합니다.

  • config : 설정 정보 파일인 cubectl.toml 생성/조회하거나 프로비저닝된 쿠버네티스 클러스터와 cubectl.toml 파일을 동기화 합니다.

  • addon : 애드온 어플리케이션을 배포합니다.

  • pusharrow-up-right : 컨테이너 이미지를 레지스트리에 push 합니다, OS 패키지를 local repository에 push하고 재구성합니다.

  • versionarrow-up-right : CLI 버전 정보를 조회합니다.

  • helparrow-up-right : 애플리케이션 내의 모든 명령어에 대한 도움말을 제공합니다.

  • create
    destroy
    update
    쿠버네티스 버전입니다.

    버전별 지원 현황은 릴리즈노트를 참고합니다.

    • Type : string

    • Default : latest

    • Since : v1.0.0

    hashtag
    kube-proxy-mode

    쿠버네티스 프록시 모드입니다.

    • Type : string

    • Default : "ipvs"

    • Ranges: ["ipvs" | "iptables"]

    • Since : v1.0.0

    hashtag
    service-cidr

    Service CIDR 입니다.

    • Type : string

    • Default : "10.96.0.0/20"

    • Since : v1.0.0

    hashtag
    pod-cidr

    Pod CIDR 입니다.

    • Type : string

    • Default : "10.4.0.0/16"

    • Since : v1.0.0

    hashtag
    node-port-range

    노드 포트 범위입니다.

    • Type : string

    • Default : "30000-32767"

    • Since : v1.0.0

    hashtag
    audit-log-enable

    쿠버네티스 audit 로그를 활성화합니다.

    로그는 {{node-pool.data-dir}}/k8s-audit/kubernetes-audit.log 에서 확인할 수 있습니다.

    • Type : boolean

    • Default : true

    • Since : v1.0.0

    hashtag
    api-sans

    apiserver SAN을 추가합니다. --apiserver-cert-extra-sans 설정과 동일합니다.

    • version : v0.1.0

    • Type : []string

    • Default : 첫번째 컨트롤 플레인 노드 IP

    • Since : v1.0.0

    hashtag
    kubelet-dir

    kubelet root directory를 변경합니다.

    • Type : string

    • Default : "/data"

    • Since : v1.2.4

    hashtag
    container-runtime

    kubernetes container runtime을 지정합니다.

    • Type : string

    • Default : "containerd"

    • Ranges: ["containerd" | "cri-o"]

    • Since : v1.3.4

    hashtag
    [kubernetes.calico]

    Calico-cni를 설정합니다.

    CUBE는 기본적으로 calico ipip 모드로 설치됩니다.

    hashtag
    vxlan-mode

    Calico VXLAN 모드를 활성화합니다. vxlan모드는 UDP 4789 포트를 사용합니다.

    • Type : boolean

    • Default : false

    • Since : v1.0.0

    local-repository

    hashtag
    [local-repository]

    hashtag
    install

    local repository 설치를 활성화합니다.

    • Type : boolean

    • Default : false

    • Since : v1.2.4

    hashtag
    ip

    local repository 노드의 공개 IP 주소입니다. local repository를 설치할 때 사용되는 필수 항목입니다.

    • Type : string

    • Default : ""

    • Since : v1.2.4

    hashtag
    private-ip

    local repository 노드의 사설 IP 주소입니다. local repository 설치할 때 사용하는 필수 항목입니다.

    ip과 동일한 IP 주소를 사용하는 경우 건너뛸 수 있습니다.

    • Type : string

    • Default : ""

    • Since : v1.2.4

    hashtag
    service-port

    local repository 노드의 서비스 포트 입니다.

    • Type : int

    • Default : 8080

    • Since : v1.2.4

    hashtag
    data-dir

    local repository 노드가 설치되는 경로입니다.

    • Type : string

    • Default : "/data/localrepo"

    • Since : v1.2.4

    shared-storage

    스토리지 서버 설치 여부 및 관련 속성을 정의합니다.

    CUBE는 스토리지 서버로 NFS(Network File System)를 설치합니다.

    hashtag
    [shared-storage]

    hashtag
    install

    NFS 설치를 활성화 합니다.

    • Type : boolean

    • Default : false

    • Since : v1.0.0

    hashtag
    storage-ip

    NFS IP 주소입니다.

    설치할 때 사용되는 필수 입력 항목입니다.

    • Type : string

    • Default : ""

    • Since : v1.0.0

    hashtag
    private-ip

    NFS IP 주소입니다.

    설치할 때 사용되는 필수 입력 항목입니다.

    shared-storage.storage-ip 과 동일한 IP 주소를 사용하는 경우 건너뛸 수 있습니다.

    • Type : string

    • Default : ""

    • Since : v1.0.0

    hashtag
    volume-dir

    NFS 데이터 디렉토리입니다.

    설치할 때 사용되는 필수 입력 항목입니다.

    • Type : string

    • Default : "/data/storage"

    • Since : v1.0.0

    Getting Started

    $ export CONSOLE_USERNAME="admin"
    $ export CONSOLE_PASSWORD="user_password"
    $ bin/console start
    hashtag
    parameters
    • --kubeconfig <kubeconfig file>

      • 쿠버네티스 클러스터의 kubeconfig 파일입니다.

      • Default : ${CUBE_HOME}/config/{{CLUSTER}}/acloud-client-kubeconfig

    hashtag
    examples

    hashtag
    addon enable

    since v1.2.0

    조회된 애드온 목록에서 설치할 ADDON_NAME을 확인하고 해당 애드온을 설치 합니다.

    hashtag
    parameters

    • --kubeconfig <kubeconfig file>

      • 애드온을 설치할 쿠버네티스 클러스터의 kubeconfig 파일입니다.

      • Default : ${CUBE_HOME}/config/{{CLUSTER}}/acloud-client-kubeconfig

    • --profile <profile file>

      • 애드온에 적용할 profile 파일명을 입력합니다. (확장자 제외)

      • Default : 미 입력시 default.yaml 사용됨

    hashtag
    examples

    hashtag
    addon disable

    since v1.2.0

    설치된 애드온을 삭제 합니다.

    hashtag
    parameters

    • --kubeconfig <kubeconfig file>

      • 애드온을 삭제할 쿠버네티스 클러스터의 kubeconfig 파일입니다.

      • Default : ${CUBE_HOME}/config/{{CLUSTER}}/acloud-client-kubeconfig

    hashtag
    examples

    hashtag
    parameters
    • -a, --auto-approve

      • optional

      • y/n 질의 절차를 생략합니다.

    hashtag
    examples

    chevron-right생성된 `cubectl.toml` 파일hashtag

    hashtag
    config view

    since v1.0.0

    cubectl.toml 파일의 내용을 확인합니다.

    hashtag
    examples

    hashtag
    ~~~config sync~~~

    since v1.0.0 (deprecated v1.2.0)

    $ cat <<EOF > ${CUBE_HOME}/config/cubectl.toml
    [cubectl]
    closed-network = true
    local-repository-install = true
    [kubernetes]
    version = "v1.28.15"
    [node-pool.master]
    ip = ["192.168.77.132"]
    private-ip = ["10.30.30.192"]
    [node-pool.node]
    ip = ["192.168.77.98"]
    private-ip = ["10.30.30.30"]
    [private-registry]
    install = true
    registry-ip = "192.168.77.119"
    private-ip = "10.30.30.50"
    EOF
    
    $ cubectl create -p ~/.ssh/id_rsa -u cocktail
    $ cubectl update-kubeconfig -p <ssh key> -u <username>
    $ cubectl update-kubeconfig -p ~/.ssh/id_rsa -u cocktail
    $ cat config/default/acloud-client-kubeconfig
    
    $ cubectl update-kubeconfig -p ~/.ssh/id_rsa -u cocktail -c cluster-1
    $ cat config/cluster-1/acloud-client-kubeconfig
    cubectl/
    ├── create
    ├── destroy
    │   ├── cluster
    │   ├── registry
    │   ├── localrepo
    │   └── storage
    ├── update
    ├── update-kubeconfig
    ├── upgrade
    ├── config
    │   ├── view
    │   ├── new
    │   └── sync 
    │── addon
    │   ├── list
    │   ├── enable
    │   └── disable
    │── push
    │   ├── registry
    │   └── localrepo
    ├── version
    └── help
    kubernetes
    ├── version
    ├── kube-proxy-mode
    ├── service-cidr
    ├── pod-cidr
    ├── node-port-range
    ├── audit-log-enable
    ├── api-sans
    └── calico
        └── vxlan-mode
    local-repository
    ├── install
    ├── ip
    ├── private-ip
    ├── service-port
    └── data-dir
    shared-storage
    ├── install
    ├── storage-ip
    ├── private-ip
    └── volume-dir
    addon
    ├── list
    ├── enable
    └── disable
    $ cubectl addon list --kubeconfig <kubeconfig file>
    $ cubectl addon list
    $ cubectl addon list --kubeconfig acloud-client-kubeconfig
    $ cubectl addon enable {{ADDON_NAME}} --kubeconfig <kubeconfig file>  --profile <profile file>
    $ cubectl addon enable gpu-operator
    $ cubectl addon enable gpu-operator --kubeconfig acloud-client-kubeconfig
    $ cubectl addon enable gpu-operator --kubeconfig acloud-client-kubeconfig --profile redhat
    $ cubectl addon enable gpu-operator --kubeconfig acloud-client-kubeconfig --profile redhat
    $ cubectl addon disable {{ADDON_NAME}} --kubeconfig <kubeconfig file>
    $ cubectl addon disable csi-driver-nfs
    $ cubectl addon disable csi-driver-nfs --kubeconfig acloud-client-kubeconfig
    [cubectl]
    ## Required
    ## - local-repository-install: local repository installation activate. (Required when selecting the closed network.)
    ##                             It is installed on the registry host.
    ## - local-repository-url: local repository service url (Required when selecting the closed network.)
    ##                         If you are installing a private repository, you can skip it. (default: registry-ip)
    ## Optional
    ## - cluster-name: use cluster name in config context (default: "kubernetes")
    ## - install-dir: installation scripts(harbor, shell scripts) save directory (default: "/var/lib/cubectl")
    ## - cert-validity-days: SSL validity days(default: 36500)
    ## - closed-network: Enable Air Gap (default: false)
    #cluster-name = "kubernetes"
    #install-dir = "/var/lib/cubectl"
    #cert-validity-days = 36500
    #debug-mode = false
    #closed-network = false
    #local-repository-install = false
    #local-repository-url = "http://x.x.x.x"
    
    [kubernetes]
    ## Required
    ## -
    ## Optional
    ## - version: Kubernetes version (default: "latest")
    ##            If you input only the major version, the minor version automatically selects the last version.
    ## - container-runtime: use k8s cri (only containerd)
    ## - kube-proxy-mode: use k8s proxy mode [iptables | ipvs] (default: "ipvs")
    ## - service-cidr: k8s service network cidr (default: "10.96.0.0/20")
    ## - pod-cidr: k8s pod network cidr (default: "10.4.0.0/16")
    ## - node-port-range: k8s node port network range (default: "30000-32767")
    ## - audit-log-enable: k8s audit log enabled (default: true)
    ## - api-sans: Add k8s apiserver SAN [--apiserver-cert-extra-sans same as setting] (default: master[0] ip address)
    #version = "v1.23.13"
    #container-runtime = "containerd"
    #kube-proxy-mode = "ipvs"
    #service-cidr = "10.96.0.0/20"
    #pod-cidr = "10.4.0.0/16"
    #node-port-range = "30000-32767"
    #audit-log-enable = true
    #api-sans = ["x.x.x.x"]
    
    [kubernetes.etcd]
    ## Required
    ## - ip: k8s control plane nodes ip address. (Required when selecting the external-etcd="true")
    ## - private-ip: K8s control plane nodes private ip address. (Required when selecting the external-etcd="true")
    ##               If you use the same IP address, you can skip it.
    ## Optional
    ## - external-etcd: used external etcd than input the ip and private-ip address (default: false)
    ##                  not used than skip ip address. it is used control plane nodes as automatic.
    #external-etcd = false
    #ip = ["x.x.x.x"]
    #private-ip = ["x.x.x.x"]
    
    
    [kubernetes.calico]
    ## Required
    ## -
    ## Optional
    ## - vxlan-mode: calico VXLAN mode activate (default: false)
    #vxlan-mode = false
    
    [node-pool]
    ## Required
    ## -
    ## Optional
    ## - data-dir: data(backup, docker, log, kubelet, etcd, k8s-audit, containerd) root dir (default: "/data")
    ## - ssh-port: Node ssh port (default: 22)
    #data-dir = "/data"
    #ssh-port = 22
    
    [node-pool.master]
    ## Required
    ## - ip: k8s control plane nodes ip address.
    ## - private-ip: K8s control plane nodes private ip address.
    ##               If you use the same IP address, you can skip it.
    ## Optional
    ## - lb-ip: load balancer ip address (default: master[0] node ip address)
    ## - isolated: K8s control plane nodes isolated (default: true)
    ## - haproxy-install: used internal load-balancer (default: true)
    ## - lb-ip: Enter the IP address when using a load balancer (default: master[0] ip address)
    ## - lb-port: Enter the port when using a load balancer (default: 6443)
    #ip = ["x.x.x.x","x.x.x.x","x.x.x.x"]
    #private-ip = ["x.x.x.x","x.x.x.x","x.x.x.x"]
    #isolated = true
    #haproxy-install = true
    #lb-ip = "x.x.x.x"
    #lb-port = 6443
    
    [node-pool.node]
    ## Required
    ## - ip: k8s work nodes ip address.
    ## - private-ip: K8s work nodes private ip address.
    ##               If you use the same IP address, you can skip it.
    ## Optional
    #ip = ["x.x.x.x", "x.x.x.x"]
    #private-ip = ["x.x.x.x", "x.x.x.x"]
    
    [private-registry]
    ## Required
    ## - registry-ip: Public IP address of the private registry node.
    ##                This is a required entry used when installing a private registry.
    ## - private-ip: Private IP address of the private registry node.
    ##               This is a required entry used when installing a private registry.
    ##               If you use the same IP address, you can skip it.
    ## Optional
    ## - install: private registry install (default: false)
    ## - data-dir: private registry data directory (default: "/data/harbor")
    ## - public-cert: public cert activate (default: false)
    ## - cocktail-archive-file: Push cocktail addons and image files to the harbor (default:"")
    #install = false
    #registry-ip = "x.x.x.x"
    #private-ip = "x.x.x.x"
    #registry-domain = "x.x.x.x"
    #data-dir = "/data/harbor"
    #public-cert = false
    #cocktail-archive-file = ""
    
    [private-registry.cert-file]
    ## Required
    ## - ssl-certificate: The certificate path used when using public-cert.
    ##                    This is a required field used when using a public certificate.
    ## - ssl-certificate-key: The certificate-key used when using public-cert.
    ##                        This is a required field used when using a public certificate.
    ## Optional
    #ssl-certificate = ""
    #ssl-certificate-key = ""
    
    [shared-storage]
    ## Required
    ## - storage-ip: Storage node ip address.
    ##               This is a required field used when installing the nfs server.
    ##               (this is using it to generate an inventory and generate an extra vars)
    ## - private-ip: Storage node ip address.
    ##               This is a required field used when installing the nfs server.
    ##               If you use the same IP address, you can skip it.
    ##               (this is using it to generate an inventory)
    ## - volume-dir: Storage node data directory. (default: /data/storage)
    ##               This is a required field used when installing the nfs server.
    ##               (this is using it to generate an extra vars)
    ## Optional
    ## - install: NFS Server Installation (default: false)
    #install = false
    #storage-ip = "x.x.x.x"
    #private-ip = "x.x.x.x"
    #volume-dir = "/data/storage"
    #nfs_version = "4.1"
    config
    ├── new
    ├── view
    └── sync
    $ cubectl config new
    $ bin/cubectl config new
    
    Do you really want to make a new config file? 
    Is this ok [y/n]: y
    $ cubectl config view
    $ bin/cubectl config view
    
    [cubectl]
    
    [kubernetes]
    version = "v1.23.13"
    
    [kubernetes.etcd]
    
    
    [kubernetes.calico]
    
    [node-pool]
    
    [node-pool.master]
    ip = ["x.x.x.x","x.x.x.x","x.x.x.x"]
    
    [node-pool.node]
    
    [private-registry]
    
    [private-registry.cert-file]
    
    [shared-storage]
    
    [prepare-airgap]
    
    ~~~해당 파일은 Control-Plane 노드의 `/etc/kubernetes/cubectl-config-cm.yaml` 에 존재합니다.~~~
    
    
    ### parameters
    
    * `-p <ssh key>`
        * 설치 호스트들의 Passwordless SSH 연결을 위한 Private-Key 입니다.
    
    * `-u <username>`
        * 설치 호스트들의 Passwordless SSH 연결을 위한 사용자 계정명 입니다.
    
    * `-a, --auto-approve`
      * _optional_
      * y/n 질의 절차 생략.
    
    
    ### examples
    
    ```
    $ bin/cubectl config sync -p ~/.ssh/id_rsa -u cocktail
    
    ## Inventory for Sync the configuration task.
    ================================================================
    Node Name           IP                    Private IP
    ================================================================
    node-0              x.x.x.x
    ================================================================
    Is this ok [y/n]: y
    ```
    hashtag
    parameters
    • -p <ssh key>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 Private-Key 입니다.

    • -u <username>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 사용자 계정명입니다.

    • -a, --auto-approve

      • optional

      • IP 확인 및 y/n 질의 절차를 생략합니다.

    • -c, --cluster

      • optional

      • Cluster 이름을 입력합니다.

    • -f, --config

      • optional

      • cubectl.toml 경로를 입력합니다.

    • --container-runtime

      • optional

      • 컨테이너 런타임을 지정합니다. podman 또는 docker 중에서 선택할 수 있습니다.

    • --cube

      • optional

      • Cube의 버전을 지정합니다.

    • --port

      • optional

      • 원격 호스트의 포트를 지정합니다.

    • -v, --verbose

      • optional

      • 상세 출력을 활성화합니다.

    hashtag
    examples

    hashtag
    destroy cluster

    since v1.0.0

    쿠버네티스 클러스터를 제거합니다.

    hashtag
    parameters

    • -p <ssh key>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 Private-Key 입니다.

    • -u <username>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 사용자 계정명입니다.

    • -a, --auto-approve

      • optional

      • IP 확인 및 y/n 질의 절차를 생략합니다.

    • -c, --cluster

      • optional

      • Cluster 이름을 입력합니다.

    • -f, --config

      • optional

      • cubectl.toml 경로를 입력합니다.

    • --container-runtime

      • optional

      • 컨테이너 런타임을 지정합니다. podman 또는 docker 중에서 선택할 수 있습니다.

    • --cube

      • optional

      • Cube의 버전을 지정합니다.

    • --port

      • optional

      • 원격 호스트의 포트를 지정합니다.

    • -v, --verbose

      • optional

      • 상세 출력을 활성화합니다.

    hashtag
    examples

    hashtag
    destroy registry

    since v1.0.0

    저장소를 제거합니다.

    hashtag
    parameters

    • -p <ssh key>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 Private-Key 입니다.

    • -u <username>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 사용자 계정명입니다.

    • -a, --auto-approve

      • optional

      • IP 확인 및 y/n 질의 절차를 생략합니다.

    • -c, --cluster

      • optional

      • Cluster 이름을 입력합니다.

    • -f, --config

      • optional

      • cubectl.toml 경로를 입력합니다.

    • --container-runtime

      • optional

      • 컨테이너 런타임을 지정합니다. podman 또는 docker 중에서 선택할 수 있습니다.

    • --cube

      • optional

      • Cube의 버전을 지정합니다.

    • --port

      • optional

      • 원격 호스트의 포트를 지정합니다.

    • -v, --verbose

      • optional

      • 상세 출력을 활성화합니다.

    hashtag
    examples

    hashtag
    destroy localrepo

    since v1.2.4

    localrepo 서버를 제거합니다.

    hashtag
    parameters

    • -p <ssh key>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 Private-Key 입니다.

    • -u <username>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 사용자 계정명입니다.

    • -a, --auto-approve

      • optional

      • IP 확인 및 y/n 질의 절차를 생략합니다.

    • -c, --cluster

      • optional

      • Cluster 이름을 입력합니다.

    • -f, --config

      • optional

      • cubectl.toml 경로를 입력합니다.

    • --container-runtime

      • optional

      • 컨테이너 런타임을 지정합니다. podman 또는 docker 중에서 선택할 수 있습니다.

    • --cube

      • optional

      • Cube의 버전을 지정합니다.

    • --port

      • optional

      • 원격 호스트의 포트를 지정합니다.

    • -v, --verbose

      • optional

      • 상세 출력을 활성화합니다.

    hashtag
    examples

    hashtag
    destroy storage

    since v1.0.0

    Storage 서버를 제거합니다.

    hashtag
    parameters

    • -p <ssh key>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 Private-Key 입니다.

    • -u <username>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 사용자 계정명입니다.

    • -a, --auto-approve

      • optional

      • IP 확인 및 y/n 질의 절차를 생략합니다.

    • -c, --cluster

      • optional

      • Cluster 이름을 입력합니다.

    • -f, --config

      • optional

      • cubectl.toml 경로를 입력합니다.

    • --container-runtime

      • optional

      • 컨테이너 런타임을 지정합니다. podman 또는 docker 중에서 선택할 수 있습니다.

    • --cube

      • optional

      • Cube의 버전을 지정합니다.

    • --port

      • optional

      • 원격 호스트의 포트를 지정합니다.

    • -v, --verbose

      • optional

      • 상세 출력을 활성화합니다.

    hashtag
    examples

    로 프로비저닝된 클러스터만 업그레이드가 가능합니다.

    업그레이드 버전 범위는 v1.24 에서 v1.27 까지이며 단계별로 업그레이드가 진행됩니다. (1.23 -> 1.24 -> 1.25 -> 1.26 -> 1.27)

    다운그레이드는 불가능합니다.

    hashtag
    parameters

    • -p <ssh key>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 Private-Key 입니다.

    • -u <username>

      • 설치 호스트들의 Passwordless SSH 연결을 위한 사용자 계정명입니다.

    • --kubeconfig <kubeconfig file>

      • 업그레이드할 쿠버네티스 클러스터의 kubeconfig 파일입니다.

      • Default : ${CUBE_HOME}/config/{{CLUSTER}}/acloud-client-kubeconfig

    • -a, --auto-approve

      • optional

      • IP 확인 및 y/n 질의 절차를 생략합니다.

    • -c, --cluster

      • optional

      • Cluster 이름을 입력합니다.

    • -f, --config

      • optional

      • cubectl.toml 경로를 입력합니다.

    • --container-runtime

      • optional

      • 컨테이너 런타임을 지정합니다. podman 또는 docker 중에서 선택할 수 있습니다.

    • --cube

      • optional

      • Cube의 버전을 지정합니다.

    • --port

      • optional

      • 원격 호스트의 포트를 지정합니다.

    • -v, --verbose

      • optional

      • 상세 출력을 활성화합니다.

    hashtag
    examples

    ※ 자세한 내용은 Tutorial - 버전 업그레이드 를 참조합니다.

    hashtag
    목차
    • cubectl : cubectl 실행 환경을 정의합니다.

    • kubernetes : 쿠버네티스 관련 속성을 정의합니다.

    • node-pool : 노드 IP와 같은 노드관련 속성을 정의합니다.

    • : local repository 설치 여부 및 관련 속성을 정의합니다.

    • : 사설 저장소 설치 여부 및 관련 속성을 정의합니다.

    • : 스토리지 서버(Network File System) 설치 여부 및 관련 속성을 정의합니다.

    node-pool

    쿠버네티스 노드 관련 속성을 정의합니다.

    hashtag
    [node-pool]

    노드들의 공통 속성들을 정의합니다.

    hashtag
    data-dir

    노드별 backup, podman, log, kubelet, etcd, container 데이터 디렉터리입니다.

    • Type : string

    • Default : /data

    • Since : v1.0.0

    hashtag
    ssh-port

    설치 시 노드에 접속 할 SSH 포트 번호입니다.

    • Type : integer

    • Default : 22

    • Since : v1.0.0

    hashtag
    [node-pool.master]

    컨트롤 플레인 노드 속성을 정의합니다.

    hashtag
    ip

    컨트롤 플레인 노드들의 SSH 접속 IP 주소들 입니다.

    • Type : []string

    • Default : []

    • Since : v1.0.0

    hashtag
    private-ip

    컨트롤 플레인 노드들의 노드 IP입니다.

    node-pool.master.ip과 동일할 경우 생략 가능합니다.

    • Type : []string

    • Default : []

    • Since : v1.0.0

    hashtag
    isolated

    값이 true 면 컨트롤 플레인 노드들에 워크로드가 스케줄링 되지 않도록 taint 처리 합니다.

    • Type : boolean

    • Default : true (since v1.2.0)

    • Since : v1.0.0

    hashtag
    lb-ip

    컨트롤 플레인 endpoint IP 주소입니다.

    • Type : string

    • Default : node-pool.master.private-ip[0]

    • Since : v1.0.0

    hashtag
    lb-port

    컨트롤 플레인 endpoint 포트번호입니다.

    • Type : integer

    • Default : 6443

    • Since : v1.0.0

    hashtag
    haproxy-install

    컨트롤 플레인 노드에 haproxy(static-pod)를 설치를 활성화힙니다.

    haproxy는 내부 load balance 역할을 수행합니다.

    • Type : boolean

    • Default : true

    • Since : v1.0.0 ~ v1.0.1

    hashtag
    [node-pool.node]

    워커 노드의 속성을 정의합니다.

    hashtag
    ip

    워커 노드들의 SSH 접속 IP 주소들 입니다.

    • Type : []string

    • Default : []

    • Since : v1.0.0

    hashtag
    private-ip

    워커 노드들의 노드 IP입니다.

    node-pool.node.ip과 동일할 경우 생략 가능합니다.

    • Type : []string

    • Default : []

    • Since : v1.0.0

    private-registry

    사설 저장소 설치 여부 및 관련 속성을 정의합니다.

    CUBE는 사설 저장소로 harbor를 설치합니다.

    hashtag
    [private-registry]

    hashtag
    install

    Harbor 설치를 활성화합니다.

    • Type : boolean

    • Default : false

    • Since : v1.0.0

    hashtag
    registry-ip

    Harbor 노드의 공개 IP 주소입니다. Harbor를 설치할 때 사용되는 필수 항목입니다.

    • Type : string

    • Default : ""

    • Since : v1.0.0

    hashtag
    private-ip

    Harbor 노드의 사설 IP 주소입니다. Harbor 설치할 때 사용하는 필수 항목입니다.

    registry-ip과 동일한 IP 주소를 사용하는 경우 건너뛸 수 있습니다.

    • Type : string

    • Default : ""

    • Since : v1.0.0

    hashtag
    registry-version

    since v1.0.0 (deprecated v1.2.0)

    ~~설치될 Harbor 버전을 지정합니다. Harbor를 설치할 때 사용하는 필수 입력 항목입니다. ~~

    주 버전만 입력하면 부 버전이 자동으로 마지막 버전을 선택합니다.

    hashtag
    registry-domain

    도메인 주소입니다. 도메인을 사용하는 경우 입력합니다.

    • Type : string

    • Default : private-registry.registry-ip

    • Since : v1.0.0

    hashtag
    admin-password

    Admin 계정의 비밀번호입니다.

    • Type : string

    • Default : 미공개

    • Since : v1.2.2

    • 참고 - 비밀번호 변경 관련

    hashtag
    data-dir

    Harbor 데이터 디렉터리 입니다.

    • Type : string

    • Default : "/data/harbor"

    • Since : v1.0.0

    hashtag
    public-cert

    Harbor 서버 공개 인증을 활성화합니다.

    • Type : boolean

    • Default : false

    • Since : v1.0.0

    hashtag
    [private-registry.cert-file]

    인증서 파일을 지정합니다.

    hashtag
    ssl-certificate

    인증서 경로 입니다. 공인 인증을 활성화 했을 경우 필수 입력 항목입니다.

    • Type : string

    • Default : ""

    • Since : v1.0.0

    hashtag
    ssl-certificate-key

    인증서 키 경로입니다. 공인 인증을 활성화 했을 경우 필수 입력 항목입니다.

    • Type : string

    • Default : ""

    • Since : v1.0.0

    Annotations

    쿠버네티스 어노테이션을 통해 CUBE 확장 기능을 사용할 수 있습니다. 지원하는 어노테이션을 아래와 같습니다.

    hashtag
    Node annotations

    • cube.acornsoft.io/protected

    true 로 지정하면 노드 스케일-인 수행 시 삭제 대상 노드에서 제외됩니다.

    활용 예제 :

    • cube.acornsoft.io/ansible-user

    노드별로 별도 SSH 사용자 접속 계정을 지정합니다.

    활용 예제 :

    • cube.acornsoft.io/ansible-port

    노드별로 별도 SSH 연결 포트번호를 지정합니다.

    활용 예제 :

    사용자 이미지 Push

    hashtag
    Cubectl 명령어를 이용하는 방법

    hashtag
    필수 사항

    • archive/push/registry 경로의 디렉토리를 생성해야 합니다.

    • push/registry 디렉토리 내의 파일 네이밍을 맞춰줘야 합니다.

      • 이미지의 전체 경로를 적어줘야 합니다.

      • .tar, .tgz를 적어줘야 합니다.

    hashtag
    명령어 실행

    • cubectl push registry 명령을 실행합니다.


    hashtag
    직접 push 하는 방법

    • Registry node에서 직접 실행

    Cilium Addon 설치

    Cilium v1.17.3 기준

    hashtag
    Prerequisite

    hashtag
    Cilium download

    • 필요한 cilium chart 및 image를 다운로드 합니다.

    • 다운로드 받은 cilium 이미지를 archive/push/registry 경로로 압축을 해제합니다.

    hashtag
    Push cilium image

    • Push registry 명령어를 이용하여 cilium image를 업로드해야합니다.

    hashtag
    Cilium addon install

    • Addon install 실행 전 각각의 클러스에서 해당 명령어 실행 필수

    • 설치 가능한 애드온 명칭 및 profile 조회

      • --kubeconfig 미입력 시 기본값 : ${CUBE_HOME}/config/{{ CLUSTER }}/acloud-client-kubeconfig

      • --profile 미입력 시 기본 적용 파일 : ${CUBE_HOME}/extends/addon/profile/cilium/default.yaml

    • profile 값 수정

      • default.yaml(cilium 온라인 기본 설치)

      • default-clustermesh.yaml(cilium clustermesh 설치, 수정 필요)

    • Addon 설치

    • Addon 설치 확인

    hashtag
    Addon 삭제

    hashtag
    삭제 후 재설치 시도시 에러 발생할 때

    해당하는 클러스터 이동하여 아래 명령어를 순차적으로 실행 후 재설치 시도

    워커 노드 추가 및 삭제

    Control plane 노드와 worker 노드를 추가/삭제 할 수 있습니다. 모든 추가/삭제는 동시에 진행할 수 있습니다.

    hashtag
    주의사항

    • 추가/삭제 작업은 노드 drain 작업이 필수 입니다. drain 작업이 실패하지 않게 사전에 노드 및 pod 설정을 학인해야 합니다.

      • affinity, node selector, statefulset 등은 drain 작업시 실패 원인이 될 수 있으니 사전에 확인 및 설정이 필요 합니다.

    • Control Plane 삭제시 cluster-info 컨피그맵의 server url이 실제 마스터 정보 인지 확인하고 다르면 올바른 마스터 노드 ip로 직접 수정해야 합니다.

    hashtag
    Control plane 노드 추가/삭제

    Control plane 개별 노드를 추가/삭제 또는 모든 노드를 추가/삭제 할 수 있습니다.

    • 아래 표와 같이 기존의 클러스터는 컨트롤 플레인 노드 1대, 워커 노드 2대가 설치되어있다고 가정합니다.

    • 기존의 클러스터에 Control plane 노드 2대를 추가 방법을 설명합니다.

    • 노드 삭제 역시 노드 추가와 동일한 방식으로 삭제하고 싶은 노드 IP를 cubectl.toml에서 제거합니다.

    Node Type
    Public ip
    Private ip
    • cubectl config sync 명령을 통해 클러스터 정보를 동기화 합니다. cubectl.toml 파일이 존재한다면 생략 가능합니다.

    • cubectl update-kubeconfig 명령을 통해 KUBECONFIG 파일을 다운로드 받습니다. acloud-client-kubeconfig 파일이 존재한다면 생략 가능합니다.

    • cubectl.toml 수정 - 추가할 노드의 IP를 추가로 입력합니다.

    • cubectl update 실행합니다.


    hashtag
    Worker 노드 추가/삭제

    • 아래 표와 같이 기존의 클러스터는 컨트롤 플레인 노드 1대, 워커 노드 2대가 설치되어있다고 가정합니다.

    • 기존의 클러스터에 워커 노드 1대를 추가 방법을 설명합니다.

    • 노드 삭제 역시 노드 추가와 동일한 방식으로 삭제하고 싶은 노드 IP를 cubectl.toml에서 제거합니다.

    Node Type
    Public ip
    Private ip
    • cubectl config sync 명령을 통해 클러스터 정보를 동기화 합니다. cubectl.toml 파일이 존재한다면 생략 가능합니다.

    • cubectl update-kubeconfig 명령을 통해 KUBECONFIG 파일을 다운로드 받습니다. acloud-client-kubeconfig 파일이 존재한다면 생략 가능합니다.

    • cubectl.toml 수정 - 추가할 노드의 IP를 추가로 입력합니다.

    • cubectl update 실행합니다.

    CSI-NFS Addon 설치

    hashtag
    CSI-NFS Addon Installation

    • 설치 가능한 애드온 명칭 및 profile 조회

      • --kubeconfig 미입력 시 기본값 : ${CUBE_HOME}/config/{{CLUSTER}}/acloud-client-kubeconfig

      • --profile 미입력 시 기본값 : ${CUBE_HOME}/extends/addon/profile/csi-driver-nfs/default.yaml

    • ${CUBE_HOME}/extends/addon/profile/csi-driver-nfs/default.yaml 수정

      • server: '{{ NFS node IP }}' IP 수정

    • Addon 설치

    • Addon 설치 확인

    • Addon 삭제

    버전 업그레이드

    hashtag
    고려사항

    • 네트워크 연결 불안정, 노드 다운, 리소스 부족, 스케줄링 문제 등으로 업그레이드가 실패할 경우가 발생할 수 있으므로 서비스 무중단 운영 중 실시간 업그레이드를 권장하지 않습니다.

    • 업그레이드 전 데이터베이스에 저장된 앱 상태와 같은 중요한 구성 요소를 백업하고 노드들의 스왑을 비활성화 해야 합니다.

    • 여분의 리소스가 충분히 확보 되어야 합니다. 부족한 리소스는 업그레이드 실패의 원인이 될 수 있습니다.

      • 업그레이드 수행 전 사전 작업을 통해 충분한 리소스를 확보합니다.

      • 최소 노드 수는 Control-plane는 3개이상 Worker 노드는 2개 이상 입니다.

    • 버전 업그레이드는 클러스터를 구성하는 Control-Plane , Worker 노드 순으로 단계별 진행됩니다.

      • 이때 업그레이드 대상 노드는 drain을 통해 노드 내의 Pod들은 다른 노드들로 스케줄링 됩니다.

      • ReplicationController, ReplicaSet, Job, Daemonset, StatefulSet과 같은 컨트롤러에 의해 실행된 Pod는 다른 노드로 스케줄링 됩니다.

    • 로컬 저장 공간을 사용하는 Pod는 축출되면서 사용하던 데이터를 잃게 되며 PodDisruptionBudgets(PDB) 설정에 의해 축출에 실패하거나 느려질 수 있습니다.

    • 업그레이드가 종료되면 uncordon 을 통해 해당 노드에 대한 스케줄링이 다시 허용 됩니다. 하지만 다른 노드로 배치되었던 Pod가 다시 해당 노드로 스케줄링되지는 않습니다.

    • 컨테이너 해시 값이 변경되기 때문에 업그레이드 후 모든 컨테이너가 다시 시작됩니다.

    hashtag
    버전 업그레이드

    • cubectl config sync 명령을 통해 클러스터 정보를 동기화 합니다.

    • cubectl update-kubeconfig 명령을 통해 KUBECONFIG 파일을 다운로드 받습니다.

    • cubectl.toml 파일을 수정합니다.

      • [kubernetes] 섹션에서 원하는 쿠버네티스 version을 입력합니다.

      • 폐쇄망 설치 환경에서는

    • cubectl upgrade 명령을 실행합니다.

    스토리지 서버 설치

    hashtag
    고려사항

    • 방화벽 TCP/UDP 2049 포트 InBound/OutBound를 오픈합니다.

    hashtag
    스토리지 서버 설치

    • cubectl.toml을 수정합니다.

    • cubectl create 를 실행합니다.

    IP로 설치된 Private-Registry(harbor) 도메인 수동 적용

    hashtag
    가정

    • Private Registry, Control plane, Worker nodes는 Ubuntu20.04 환경에서 구성됩니다.

    • 쿠버네티스 버전은 v1.26 입니다.

    • 이미지 레지스트리 주소를 192.168.77.154 에서 regi.acornsoft.io 로 변경합니다.

    IP
    도메인

    hashtag
    Private Registry 작업

    hashtag
    Private Registry IP 변경 및 디렉토리 생성

    • openssl.conf 파일에 도메인을 추가합니다.

    • 도메인 디렉토리를 생성합니다.

    hashtag
    Private Registry 설정 파일 변경

    • harbor.yml의 hostname을 IP에서 도메인으로 변경합니다.

    hashtag
    변경사항 반영

    • install.sh 스크립트를 실행하여 변경 사항을 적용합니다.

    • install.sh 스크립트를 실행하는 대신 harbor 환경변수를 수정하고 harbor를 재시작해도 변경사항이 반영됩니다.

    hashtag
    Node 작업

    hashtag
    공통 작업(Control plane, Worker nodes)

    hashtag
    Private Registry IP 변경사항을 node에 반영

    • /etc/containerd/certs.d에 도메인 디렉토리를 생성한 후, /etc/containerd/certs.d/192.168.77.154/hosts.toml 파일을 복사합니다.

    • /etc/containerd/certs.d/regi.acornsoft.io/hosts.toml의 IP를 도메인으로 변경합니다.

    • /etc/containerd/config.toml의 IP를 도메인으로 변경합니다.

    • containerd를 재시작합니다.

    • IP 인증서는 더이상 사용하지 않으므로 hosts.toml 파일에서 ca라인을 삭제합니다.

    • Addon, Coredns, Static Pods 및 기타 yaml파일에 대한 IP 주소를 도메인으로 변경합니다.

    • 패키지 저장소 주소를 도메인으로 변경합니다.

    • /etc/docker/certs.d/ 에 도메인 디렉토리를 생성합니다.

    hashtag
    Control-plane 추가 작업

    • control-plane 에서는 calico와 metrics server를 업데이트하는 작업을 추가로 해줍니다.

    • kube-proxy daemonset 이미지 주소를 도메인으로 변경합니다.

    • coredns deployment 이미지 주소를 도메인으로 변경합니다.

    • kubelet을 재시작해줍니다.

    hashtag
    확인

    • 컨테이너 이미지를 확인합니다. 이미지가 모두 올라오기까지 몇 분 소요될 수 있습니다.


    참고: Private Registry IP를 새로운 서버의 IP로 변경하는 경우에는 cubectl update 명령서를 사용하십시오.

    폐쇄망 설치

    hashtag
    폐쇄망 설치

    • 패키지를 다운로드 받습니다.

    $ curl -sfL https://cube.k3.acornsoft.io/download-cubectl | ACCOUNT=<user> PASSWD=<password> AIRGAP=ubuntu2204 VERSION=v1.0.0 OS=linux ARCH=amd64 sh -
    • cubectl.toml 파일을 수정합니다.

    • cubectl create 명령을 실행합니다.

    • 확인

    Package 파일 다운로드

    hashtag
    실행 명령어

    $ curl -sfL https://cube.k3.acornsoft.io/download-package | ACCOUNT=<user> PASSWD=<password> PACKAGE=<package name> sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-package | ACCOUNT=<user> PASSWD=<password> PACKAGE=<package name> VERSION=<version> sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-package | ACCOUNT=<user> PASSWD=<password> PACKAGE=<package name> VERSION=<version> OS=<linux | darwin> ARCH=<CPU architecuture> sh -
    
    [INFO] starting download file kubeflow-manifests-1.10.2.tar.gz
    ######################################################################## 100.0%
    [INFO] decompressing file kubeflow-manifests-*.tar.gz
    [INFO] starting download file kubectl-*-linux-amd64
    ...

    hashtag
    Download-package 스크립트 인자값 정의 및 사용법

    필수 인자값

    ACCOUNT = NAS계정 PASSWD = NAS계정암호 PACKAGE = Package 종류(kubeflow)

    옵션인자값

    VERSION = Package version OS = kubectl 실행 노드의 배포판 ARCH = kubectl 실행 노드의 Arch


    hashtag
    명령어 실행 후 local상 파일구조

    • Package Download시 $CUBE_HOME 에 저장합니다.

      • 만일 $CUBE_HOME 이 설정되어 있지 않은 경우 명령어를 실행한 디렉토리에 Download 받습니다.

    ADDON 관련 파일 다운로드

    hashtag
    실행 명령어


    hashtag
    Download-addon 스크립트 인자값 정의 및 사용법

    필수 인자값

    GPU Addon 설치

    hashtag
    Prerequisite

    • GPU 노드에서 디바이스 확인

    Kubelet log 위치 변경 방법

    hashtag
    Systemd 관련 파일 변경

    • /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf을 수정

    Kubeflow 설치

    Kubeflow v1.10.2 기준

    hashtag
    Kubeflow package download

    • 필요한 kubeflow manifest 및 image를 다운로드 합니다.

    destroy
    ├── cluster
    ├── registry
    └── storage
    $ cubectl destroy  -p <ssh key> -u <username>
    $ cubectl destroy -p ~/.ssh/id_rsa -u cocktail
    $ cubectl destroy cluster -p ~/.ssh/id_rsa -u cocktail
    $ cubectl destroy registry -p ~/.ssh/id_rsa -u cocktail
    $ cubectl destroy localrepo -p ~/.ssh/id_rsa -u cocktail
    $ cubectl destroy storage -p ~/.ssh/id_rsa -u cocktail
    $ cubectl upgrade -p <ssh key> -u <username> --kubeconfig <KUBECONFIG>
    $ cubectl upgrade -p ~/.ssh/id_rsa -u cocktail --kubeconfig $(pwd)/config/{{CLUSTER}}/acloud-client-kubeconfig
    $ bin/cubectl config new
    
    # cat config/cubectl.toml
    cubectl.toml/
    ├── cubectl
    │   ├── cluster-name
    │   ├── cubectl.cert_validity_days
    │   ├── install-dir
    │   ├── closed-network
    │   ├── local-repository-install
    │   └── local-repository-url
    ├── kubernetes
    │   ├── version
    │   ├── kube-proxy-mode
    │   ├── service-cidr
    │   ├── pod-cidr
    │   ├── node-port-range
    │   ├── audit-log-enable
    │   ├── api-sans
    │   └── calico
    │       └── vxlan-mode
    ├── node-pool
    │   ├── data-dir
    │   ├── ssh-port
    │   ├── master
    │   │   ├── ip
    │   │   ├── private-ip
    │   │   ├── haproxy-install
    │   │   ├── lb-ip
    │   │   └── lb-port
    │   └── node
    │       ├── ip
    │       └── private-ip
    ├── private-registry
    │   ├── install
    │   ├── registry-ip
    │   ├── private-ip
    │   ├── registry-domain
    │   ├── data-dir
    │   ├── public-cert
    │   └── cert-file
    │       ├── ssl-certificate
    │       └── ssl-certificate-key
    └── shared-storage
        ├── install
        ├── storage-ip
        ├── private-ip
        └── volume-dir
    node-pool
    ├── data-dir
    ├── ssh-port
    ├── master
    │   ├── ip
    │   ├── private-ip
    │   ├── lb-ip
    │   └── lb-port
    └── node
        ├── ip
        └── private-ip
    private-registry
    ├── install
    ├── registry-ip
    ├── private-ip
    ├── registry-domain
    ├── admin-password
    ├── data-dir
    ├── public-cert
    └── cert-file
        ├── ssl-certificate
        └── ssl-certificate-key
    Default : "default"
    Default : ${CUBE_HOME}/config/cubectl.toml
    Default : "podman"
    Default : "latest"
    Default : 22
    Default : "default"
    Default : ${CUBE_HOME}/config/cubectl.toml
    Default : "podman"
    Default : "latest"
    Default : 22
    Default : "default"
    Default : ${CUBE_HOME}/config/cubectl.toml
    Default : "podman"
    Default : "latest"
    Default : 22
    Default : "default"
    Default : ${CUBE_HOME}/config/cubectl.toml
    Default : "podman"
    Default : "latest"
    Default : 22
    Default : "default"
    Default : ${CUBE_HOME}/config/cubectl.toml
    Default : "podman"
    Default : "latest"
    Default : 22
    Default : "default"
    Default : ${CUBE_HOME}/config/cubectl.toml
    Default : "podman"
    Default : "latest"
    Default : 22
    참고 - 칵테일 사용 시 도메인 사용 권장합니다.
    • Harbor 를 IP 로 설치했을 경우 향후 IP 변동 되었다면 칵테일 연동에 있어 다음과 같은 추가 작업이 필요합니다.

      • 기존 Harbor 주소로 배포 되어 있는 이미지 주소를 변경IP 주소로 재 배포 작업.

      • 칵테일 내부 설정 값 패치 작업 ( Harbor 연동 하는 API Server, Package, Addon Manager IP, 인증서 )

      • 칵테일 Addon 재 설치 Database Migration 작업 ( 빌드 관련 정보 , 이미지 Pull Secret 등)

    • Harbor 를 새로 설치할 경우 Harbor 접속 정보 관련해서 이중으로 암호화 되어 있어 복구 및 Migration 작업 필요합니다.

    • Harbor의 비밀번호는 UI에서 변경해야합니다.

      • install.sh로 변경 시 DB 관련하여 문제가 생깁니다.

    • Harbor 비밀번호 변경 후 반드시 해당 옵션의 값을 일치시켜야 합니다.

    local-repository
    private-registryarrow-up-right
    shared-storage
    # master-1 노드를 삭제되지 않도록 보호합니다.
    $ kubectl annotate node master-1 cube.acornsoft.io/protected=true --overwrite
    
    # 해제
    $ kubectl annotate node master-1 cube.acornsoft.io/protected-

    ex) registry.k8s.io_kube-apiserver:v1.31.3.tgz

    default-airgap.yaml(cilium 폐쇄망 설치, 수정 필요)
  • default-airgap-clustermesh.yaml(cilium 폐쇄망 clustermesh 설치, 수정 필요)

  • 2번 worker node

    192.168.11.3

    172.16.11.3

    control-plane node (기존)

    192.168.11.1

    172.16.11.1

    control-plane node (추가)

    192.168.11.10

    172.16.11.10

    control-plane node (추가)

    192.168.11.11

    172.16.11.11

    1번 worker node

    192.168.11.2

    control-plane node

    192.168.11.1

    172.16.11.1

    1번 worker node

    192.168.11.2

    172.16.11.2

    2번 worker node

    192.168.11.3

    172.16.11.3

    3번 worker node(추가할 노드)

    192.168.11.4

    172.16.11.2

    172.16.11.4

    $ vi ${CUBE_HOME}/extends/addon/profile/csi-driver-nfs/default.yaml

    하지만 이와 같은 컨트롤러를 이용하지 않은 Pod는 축출된 후 다른 노드로 스케줄링되지 않으며 다른 노드로 복제가 불가능한 Pod는 옮겨지지 않습니다.

  • DaemonSet 컨트롤러에 의한 관리되는 Pod는 스케줄링되지 않습니다.

  • 을 확인하세요.
  • 패치버전을 생략하면 latest 버전을 설치합니다.

  • 지원되는 패치 버전
    $ vi config/cubectl.toml
    
    [shared-storage]
    install = true
    storage-ip = "192.168.11.7"
    private-ip = "172.16.11.7"
    #volume-dir = "/data/storage"
    #nfs_version = "4.1"
    $ sudo bin/cubectl create -p ~/.ssh/id_rsa -u cocktail

    192.168.77.154

    regi.acornsoft.io

    $ cat <<EOF> config/cubectl.toml
    [cubectl]
    closed-network = true
    local-repository-install = true
    
    [kubernetes]
    api-sans=["192.168.77.112"]
    
    [node-pool.master]
    ip = ["10.30.30.10"]
    
    [node-pool.node]
    ip = ["10.30.30.11"]
    
    [private-registry]
    install=true
    registry-ip="10.30.30.220"
    EOF
    $ sudo bin/cubectl create -p ~/.ssh/id_rsa -u cocktail
    $CUBE_HOME/
    └── cubectl-v1.x.x/
        ├── archive
        │   └── push
        │       ├── localrepo
        │       └── registry
        │           └── kubeflow-images-1.10.2.tar.gz
        ├── bin
    ...
        ├── LICENSE.txt
        ├── kubeflow
        └── logs

    ACCOUNT = NAS계정 PASSWD = NAS계정암호 NAME = ADDON종류(nfs | gpu | kore)

    옵션인자값

    VERSION = ADDON버전(단수값지원) OSEXT = GPU ADDON설치시 설치대상서버의 OS종류(default=ubuntu2004)


    hashtag
    명령어 실행 후 local상 파일구조

    • ADDON Download시 $CUBE_HOME 에 저장합니다.

      • 만일 $CUBE_HOME 이 설정되어 있지 않은 경우 명령어를 실행한 디렉토리에 Download 받습니다.

    • ADDON Download시 기존 ADDON폴더에 profile폴더가 존재 할 경우 기존 profile 폴더를 현재 시각을 붙여 백업하고 Download받습니다

    $ curl -sfL https://cube.k3.acornsoft.io/download-addon | ACCOUNT=<user> PASSWD=<password> NAME=gpu sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-addon | ACCOUNT=<user> PASSWD=<password> NAME=gpu VERSION=v23.9.0 sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-addon | ACCOUNT=<user> PASSWD=<password> NAME=gpu VERSION=v23.9.0 OSEXT=ubuntu2004 sh -
    NVIDIA 드라이버 설치
    • NVIDIA 드라이버는 사전에 설치되어 있어야 합니다.

    • 지원하는 NVIDIA 드라이버는 아래 링크 참조하세요.

    • https://catalog.ngc.nvidia.com/orgs/nvidia/containers/driver/tags

  • 폐쇄망 설치일 경우 GPU Addon 이미지 및 차트 업로드합니다.

    • 관련 파일 및 업로드 방법은 escho@acornsoft.io 로 문의 바랍니다.

  • hashtag
    GPU Addon Installation

    • 설치 가능한 애드온 명칭 및 profile 조회

      • --kubeconfig 미입력 시 기본값 : ${CUBE_HOME}/config/{{CLUSTER}}/acloud-client-kubeconfig

      • --profile 미입력 시 기본 적용 파일 : ${CUBE_HOME}/extends/addon/profile/gpu-operator/default.yaml

    • ${CUBE_HOME}/extends/addon/profile/gpu-operator/default.yaml 설치하려는 OSEXT의 yaml 수정

      • default.yaml은 ubuntu와 동일합니다.

      • redhat.yaml을 적용하려면 profile 인자값에 해당 파일명을 입력합니다.

        • ex) bin/cubectl addon enable gpu-operator --profile redhat

      • 폐쇄망 설치 시 repository 값 앞부분에 "{{ registry_domain }}/" 을 추가합니다.

      • repository: repository: nvcr.io/nvidia -> repository: {{ registry_domain }}/repository: nvcr.io/nvidia

      • repository: nvcr.io/nvidia/cloud-native -> repository: {{ registry_domain }}/nvcr.io/nvidia/cloud-native

      • repository: nvcr.io/nvidia/k8s -> repository: {{ registry_domain }}/nvcr.io/nvidia/k8s

    • Addon 설치

    • Addon 설치 확인

    • Addon 삭제

    hashtag
    MIG(multi instance GPU) 설정 방법

    MIG를 지원하는 GPU인 경우

    • GPU별 지원되는 프로필 확인

      • NVIDIA Supported MIG Profiles 공식 가이드arrow-up-right 에서 GPU별 지원되는 프로필을 확인합니다.

      • MIG 프로필은 configmap/default-mig-parted-config 에서도 확인 가능합니다.

      • kubectl describe cm default-mig-parted-config -n gpu-operator

    • GPU노드에 label에 프로필명 적용

    • 적용 확인 예

    • 자세한 내용은 NVIDIA MIG 공식 가이드arrow-up-right 참조하세요.

    hashtag
    Time-Slicing 설정 방법

    MIG를 지원하지 않는 장비에서 하나의 GPU 분할 사용

    • ConfigMap 생성

      • Time slicing을 어떻게 나눌지 정의하는 configmap 작성합니다.

    • NVIDIA ClusterPolicy 객체에 생성된 configmap 지정

    • 적용 확인

      • 적용 후 gpu-feature-discovery, nvidia-device-plugin-daemonset pod가 자동으로 재시작되고 그 후에 gpu-node의 describe로 정상적으로 적용되었는지 확인가능합니다.

    • 자세한 내용은 NVIDIA Time-Slicing 공식 가이드arrow-up-right 참조하세요.

    StandardOutput=append:[원하는 경로]/[파일 명], StandardError=append:[원하는 경로]/[파일 명]을 하단 부분에 추가
    $ vi /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
    $ cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
    # Note: This dropin only works with kubeadm and kubelet v1.11+
    [Service]
    Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
    Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
    # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
    EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
    # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
    # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
    EnvironmentFile=-/etc/default/kubelet
    ExecStart=
    ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
    StandardOutput=append:[원하는 경로]/[파일 명]
    StandardError=append:[원하는 경로]/[파일 명]

    Cluster node들의 값을 변경 및 추가한 후 ssh 재접속 합니다.

    • 다운로드 받은 kubeflow 이미지를 archive/push/registry 경로로 압축을 해제 후 원본 압축 파일은 옮겨놓습니다.

    hashtag
    Push kubeflow image

    • Push registry 명령어를 이용하여 kubeflow image를 업로드해야합니다.

    • 한 번에 모든 이미지를 올릴 수 없기 때문에 2~3번으로 나눠서 업로드하는 것을 권장합니다.

      • docker.io, gcr.io, ghcr.io 등 태그에 따라서 나눠주는 것을 권장합니다.

    hashtag
    Kubeflow install

    Csi-nfs-driver 설치가 필수입니다.

    • CUBE_HOME 환경 변수를 설정합니다.

    hashtag
    Kubeflow online install

    • Online install

    hashtag
    Kubeflow airgap install

    • Airgap으로 설치 시 파일 내용을 변경합니다.

    • 10.10.0.49는 예시 registry ip 입니다.

    • Airgap install

    /data/
    ├── backup
    │   ├── cluster
    │   ├── db
    │   └── registry
    ├── containerd      : containerd's persistent data location
    ├── etcd            : etcd data location
    │   └── member
    ├── k8s-audit       : apiserver audit logs
    ├── kubelet         : kubelet root-dir
    └── log
    # master-1 노드의 SSH 연결 계정을 "ubuntu" 로 지정합니다.
    $ kubectl annotate node master-1 cube.acornsoft.io/ansible-user=ubuntu --overwrite
    
    # 해제
    $ kubectl annotate node master-1 cube.acornsoft.io/ansible-user-
    # master-1 노드의 SSH 연결 포트를 3003 포트로 지정합니다.
    $ kubectl annotate node master-1 cube.acornsoft.io/ansible-port=3003 --overwrite
    
    # 해제
    $ kubectl annotate node master-1 cube.acornsoft.io/ansible-port-
    $ tree archive
    
    archive
    ├── cubectl-image-v1.2.2.tgz
    ├── push                                                    # 새로 생성된 디렉토리
    │   └── registry
    └── runtime
        ├── podman-v4.4.2-linux.amd64.tgz
        ├── harbor-offline-installer-v2.7.4-linux-amd64.tgz
        └── regctl-linux-amd64.tgz
    
    ...
    
    $ tree archive/push/registry
    
    archive/push/registry
    ├── docker.io_library_golang:1.22-alpine.tar
    ├── docker.io_library_python:alpine3.19.tgz
    ├── docker.io_library_tomcat:9.0.96.tgz
    └── quay.io_rockylinux_rockylinux:9.3-minimal.tgz
    $ sudo bin/cubectl push registry -p ~/.ssh/id_rsa -u cocktail
    $ docker login {{ registry_domain }} -u {{ id }} -p {{ password }}
    $ regctl image import {{ registry_domain }}/docker.io/library/tomcat:9.0.96 {{ Image file path }}
    $ curl -sfL https://cube.k3.acornsoft.io/download-addon | ACCOUNT=<user> PASSWD=<password> NAME=cilium sh -
    $ curl -sfL https://cube.k3.acornsoft.io/download-addon | ACCOUNT=<user> PASSWD=<password> NAME=cilium VERSION=v1.17.3 sh -
    ...
    $ tar -zxvf ./extends/addon/images/cilium/cilium-v1.17.3.tgz -C ./archive/push/registry
    x docker.io_library_busybox:1.37.0.tar
    ...
    x quay.io_cilium_operator:v1.17.3.tar
    x quay.io_cilium_startup-script:c54c7edeab7fde4da68e59acd319ab24af242c3f.tar
    cubectl-v1.3.1
    ├── archive
    │   ├── cubectl-image-v1.3.1.tgz
    │   ├── extend-images.tgz
    │   ├── local-repo-ubuntu2204-amd64-R250314.tgz
    │   ├── push
    │   │   ├── localrepo
    │   │   └── registry
    │   │       ├── docker.io_library_busybox:1.37.0.tar
    │   │       ├── ghcr.io_spiffe_spire-agent:1.9.6.tar
    │   │       ├── ghcr.io_spiffe_spire-server:1.9.6.tar
    │   │       ├── quay.io_cilium_certgen:v0.2.1.tar
    │   │       ├── quay.io_cilium_cilium-envoy:v1.32.5-1744305768-f9ddca7dcd91f7ca25a505560e655c47d3dec2cf.tar
    │   │       ├── quay.io_cilium_cilium:v1.17.3.tar
    │   │       ├── quay.io_cilium_clustermesh-apiserver:v1.17.3.tar
    │   │       ├── quay.io_cilium_hubble-relay:v1.17.3.tar
    │   │       ├── quay.io_cilium_hubble-ui-backend:v0.13.2.tar
    │   │       ├── quay.io_cilium_hubble-ui:v0.13.2.tar
    │   │       ├── quay.io_cilium_operator-alibabacloud:v1.17.3.tar
    │   │       ├── quay.io_cilium_operator-aws:v1.17.3.tar
    │   │       ├── quay.io_cilium_operator-azure:v1.17.3.tar
    │   │       ├── quay.io_cilium_operator-generic:v1.17.3.tar
    │   │       ├── quay.io_cilium_operator:v1.17.3.tar
    │   │       └── quay.io_cilium_startup-script:c54c7edeab7fde4da68e59acd319ab24af242c3f.tar
    ...
    
    ├── extends
    │   └── addon
    │       ├── charts
    │       │   ├── cilium-v1.17.3.tgz
    │       │   ├── csi-driver-nfs-v4.6.0.tgz
    │       │   ├── csi-driver-nfs-v4.8.0.tgz
    │       │   ├── csi-driver-nfs-v4.9.0.tgz
    │       │   ├── gpu-operator-v23.9.0.tgz
    │       │   ├── gpu-operator-v24.9.0.tgz
    │       │   └── kore-board-0.5.5.tgz
    │       ├── images
    │       │   └── cilium
    │       │       └── cilium-v1.17.3.tgz
    │       └── profile
    │           ├── cilium
    │           │   ├── default-airgap-clustermesh.yaml
    │           │   ├── default-airgap.yaml
    │           │   ├── default-clustermesh.yaml
    │           │   └── default.yaml
    │           ├── csi-driver-nfs
    │           │   └── default.yaml
    │           ├── gpu-operator
    │           │   └── default.yaml
    │           └── kore-board
    │               └── default.yaml
    └── LICENSE.txt
    $ bin/cubectl push registry -u test -p ~/Desktop/key-list/node-ssh
    ┌─────────────────┬───────────┬────────────────┬───────────────┬─────────────────────────────────────────────────────────────────────────────────────────────┐
    │ KIND            │ NODE      │ IP             │ PRIVATE IP    │ PUSH IMAGES                                                                                 │
    ├─────────────────┼───────────┼────────────────┼───────────────┼─────────────────────────────────────────────────────────────────────────────────────────────┤
    │ Push Repository │ node-regi │ 192.168.88.188 │ 10.50.240.253 │ docker.io_library_busybox:1.37.0.tar                                                        │
    │                 │           │                │               │ ghcr.io_spiffe_spire-agent:1.9.6.tar                                                        │
    │                 │           │                │               │ ghcr.io_spiffe_spire-server:1.9.6.tar                                                       │
    │                 │           │                │               │ quay.io_cilium_certgen:v0.2.1.tar                                                           │
    │                 │           │                │               │ quay.io_cilium_cilium-envoy:v1.32.5-1744305768-f9ddca7dcd91f7ca25a505560e655c47d3dec2cf.tar │
    │                 │           │                │               │ quay.io_cilium_cilium:v1.17.3.tar                                                           │
    │                 │           │                │               │ quay.io_cilium_clustermesh-apiserver:v1.17.3.tar                                            │
    │                 │           │                │               │ quay.io_cilium_hubble-relay:v1.17.3.tar                                                     │
    │                 │           │                │               │ quay.io_cilium_hubble-ui-backend:v0.13.2.tar                                                │
    │                 │           │                │               │ quay.io_cilium_hubble-ui:v0.13.2.tar                                                        │
    │                 │           │                │               │ quay.io_cilium_operator-alibabacloud:v1.17.3.tar                                            │
    │                 │           │                │               │ quay.io_cilium_operator-aws:v1.17.3.tar                                                     │
    │                 │           │                │               │ quay.io_cilium_operator-azure:v1.17.3.tar                                                   │
    │                 │           │                │               │ quay.io_cilium_operator-generic:v1.17.3.tar                                                 │
    │                 │           │                │               │ quay.io_cilium_operator:v1.17.3.tar                                                         │
    │                 │           │                │               │ quay.io_cilium_startup-script:c54c7edeab7fde4da68e59acd319ab24af242c3f.tar                  │
    └─────────────────┴───────────┴────────────────┴───────────────┴─────────────────────────────────────────────────────────────────────────────────────────────┘
    $ sudo kubectl create secret generic -n kube-system cilium-etcd-secrets --from-file=etcd-client-ca.crt=/etc/kubernetes/pki/etcd/ca.crt --from-file=etcd-client.key=/etc/kubernetes/pki/etcd/healthcheck-client.key --from-file=etcd-client.crt=/etc/kubernetes/pki/etcd/healthcheck-client.crt --kubeconfig [ kubeconfig path ]
    secret/cilium-etcd-secrets created
    $ bin/cubectl addon list
    ┌────────────────┬─────────┬─────────┬────────────────────────────┬────────────────────────────────────────┐
    │ ADDON NAME     │ VERSION │ STATUS  │ PROFILE                    │ VALUES PATH                            │
    ├────────────────┼─────────┼─────────┼────────────────────────────┼────────────────────────────────────────┤
    │ gpu-operator   │ v24.9.0 │ unknown │                            │ gpu-operator/default.yaml              │
    │ cilium         │ 1.17.3  │ unknown │ default-airgap-clustermesh │ cilium/default-airgap-clustermesh.yaml │
    │                │         │         │ default-airgap             │ cilium/default-airgap.yaml             │
    │                │         │         │ default-clustermesh        │ cilium/default-clustermesh.yaml        │
    │                │         │         │                            │ cilium/default.yaml                    │
    │ csi-driver-nfs │ v4.10.0 │ unknown │                            │ csi-driver-nfs/default.yaml            │
    └────────────────┴─────────┴─────────┴────────────────────────────┴────────────────────────────────────────┘
    Duration 30.379208ms time
    $ vi ${CUBE_HOME}/extends/addon/profile/cilium/default-airgap.yaml
    ...
    $ bin/cubectl addon enable cilium -n kube-system --profile default-airgap.yaml
    addon enable start: cilium ...
    addon enable complete: cilium
    Duration 1m16.91672575s time
    $ bin/cubectl addon list
    ┌────────────────┬─────────┬────────────┬────────────────────────────┬────────────────────────────────────────┐
    │ ADDON NAME     │ VERSION │ STATUS     │ PROFILE                    │ VALUES PATH                            │
    ├────────────────┼─────────┼────────────┼────────────────────────────┼────────────────────────────────────────┤
    │ cilium         │ 1.17.3  │ enabled ✅ │ default-airgap-clustermesh │ cilium/default-airgap-clustermesh.yaml │
    │                │         │            │ default-airgap             │ cilium/default-airgap.yaml             │
    │                │         │            │ default-clustermesh        │ cilium/default-clustermesh.yaml        │
    │                │         │            │                            │ cilium/default.yaml                    │
    │ csi-driver-nfs │ v4.10.0 │ disabled   │                            │ csi-driver-nfs/default.yaml            │
    │ gpu-operator   │ v24.9.0 │ disabled   │                            │ gpu-operator/default.yaml              │
    │ kore-board     │ 0.5.5   │ disabled   │                            │ kore-board/default.yaml                │
    └────────────────┴─────────┴────────────┴────────────────────────────┴────────────────────────────────────────┘
    Duration 241.054958ms time
    
    $ kubectl get pod -A
    NAMESPACE     NAME                                     READY   STATUS    RESTARTS   AGE
    kube-system   cilium-cz8j8                             1/1     Running   0          3m3s
    kube-system   cilium-envoy-lqrrk                       1/1     Running   0          3m3s
    kube-system   cilium-envoy-z87nh                       1/1     Running   0          3m3s
    kube-system   cilium-hfrmw                             1/1     Running   0          3m3s
    kube-system   cilium-operator-86d86869fd-444fv         1/1     Running   0          3m3s
    kube-system   cilium-operator-86d86869fd-bn848         1/1     Running   0          3m3s
    kube-system   coredns-7b9dbb4b67-2255m                 1/1     Running   0          6m38s
    kube-system   coredns-7b9dbb4b67-vdlkv                 1/1     Running   0          6m38s
    kube-system   haproxy-temp-wk-node-1                   1/1     Running   0          4m56s
    kube-system   kube-apiserver-temp-cp-node-1            1/1     Running   0          6m39s
    kube-system   kube-controller-manager-temp-cp-node-1   1/1     Running   0          6m39s
    kube-system   kube-proxy-24xsp                         1/1     Running   0          4m56s
    kube-system   kube-proxy-bl97s                         1/1     Running   0          6m23s
    kube-system   kube-scheduler-temp-cp-node-1            1/1     Running   0          6m39s
    kube-system   metrics-server-5ccf9c5678-rbrc5          1/1     Running   0          6m18s
    $ bin/cubectl addon disable cilium --kubeconfig [ kubeconfig path ]
    addon disable start: cilium ...
    Error: addon disable fail: uninstallation completed with 1 error(s): context deadline exceeded
    exit status 1
    $ kubectl get ns -A
    
    $ kubectl get ns
    NAME              STATUS        AGE
    cilium-secrets    Terminating   66s
    default           Active        9m37s
    kube-node-lease   Active        9m37s
    kube-public       Active        9m37s
    kube-system       Active        9m37s
    
    $ kubectl get namespace cilium-secrets -o json > tmp-ns.json
    $ vi tmp-ns.json
    # 해당 파일 수정 시 spec 부분을 빈칸으로 만들어준다.
    # ex) spec: {},
    $ kubectl replace --raw "/api/v1/namespaces/cilium-secrets/finalize" -f ./tmp-ns.json
    {"kind":"Namespace","apiVersion":"v1","metadata":{"name":"cilium-secrets","uid":"e47bd9f0-983f-414a-a351-62e2e7a9753a","resourceVersion":"1744",
    ...
    "reason":"ContentHasNoFinalizers","message":"All content-preserving finalizers finished"}]}}
    ## step_1. 마스터 정보 확인
    $ kubectl -n kube-public get cm cluster-info -o yaml | grep server
    $ bin/cubectl config sync -p <ssh key> -u <username>
    $ bin/cubectl update-kubeconfig -p <ssh key> -u <username>
    $ vi config/cubectl.toml
    $ bin/cubectl update -p <ssh key> -u <username> --kubeconfig $(pwd)/config/acloud-client-kubeconfig
    $ bin/cubectl config sync -p <ssh key> -u <username>
    $ bin/cubectl update-kubeconfig -p <ssh key> -u <username>
    $ vi config/cubectl.toml
    $ bin/cubectl update -p <ssh key> -u <username> --kubeconfig $(pwd)/config/acloud-client-kubeconfig
    $ bin/cubectl addon list
    ┌────────────────┬─────────┬──────────┬─────────┬─────────────────────────────┐
    │ ADDON NAME     │ VERSION │ STATUS   │ PROFILE │ VALUES PATH                 │
    ├────────────────┼─────────┼──────────┼─────────┼─────────────────────────────┤
    │ csi-driver-nfs │ v4.8.0  │ disabled │         │ csi-driver-nfs/default.yaml │
    │ gpu-operator   │ v23.9.0 │ disabled │         │ gpu-operator/default.yaml   │
    │                │         │          │ redhat  │ gpu-operator/redhat.yaml    │
    │                │         │          │ ubuntu  │ gpu-operator/ubuntu.yaml    │
    │ kore-board     │ 0.5.5   │ disabled │         │ kore-board/default.yaml     │
    └────────────────┴─────────┴──────────┴─────────┴─────────────────────────────┘
    Duration 45.097377ms time
    $ bin/cubectl addon enable csi-driver-nfs
    
    addon enable start: csi-driver-nfs ...
    addon enable complete: csi-driver-nfs
    Duration 1m5.100330923s time
    $ bin/cubectl addon list
    ┌────────────────┬─────────┬────────────┬─────────┬─────────────────────────────┐
    │ ADDON NAME     │ VERSION │ STATUS     │ PROFILE │ VALUES PATH                 │
    ├────────────────┼─────────┼────────────┼─────────┼─────────────────────────────┤
    │ csi-driver-nfs │ v4.8.0  │ enabled ✅ │         │ csi-driver-nfs/default.yaml │
    │ gpu-operator   │ v23.9.0 │ disabled   │         │ gpu-operator/default.yaml   │
    │                │         │            │ redhat  │ gpu-operator/redhat.yaml    │
    │                │         │            │ ubuntu  │ gpu-operator/ubuntu.yaml    │
    │ kore-board     │ 0.5.5   │ disabled   │         │ kore-board/default.yaml     │
    └────────────────┴─────────┴────────────┴─────────┴─────────────────────────────┘
    Duration 188.932222ms time
    
    
    $ kubectl get pods -n csi-driver-nfs
    
    NAMESPACE        NAME                                       READY   STATUS    RESTARTS       AGE    IP             NODE        NOMINATED NODE   READINESS GATES
    csi-driver-nfs   csi-nfs-controller-5bbdfbdcc9-5xn6x        4/4     Running   1 (19s ago)    75s    10.10.30.164   wk-node-2   <none>           <none>
    csi-driver-nfs   csi-nfs-node-8xpjf                         3/3     Running   0              75s    10.10.30.184   cp-node-1   <none>           <none>
    csi-driver-nfs   csi-nfs-node-d7kz2                         3/3     Running   0              75s    10.10.30.143   cp-node-2   <none>           <none>
    csi-driver-nfs   csi-nfs-node-dx6jm                         3/3     Running   0              75s    10.10.30.164   wk-node-2   <none>           <none>
    csi-driver-nfs   csi-nfs-node-ppcwh                         3/3     Running   0              75s    10.10.30.128   wk-node-1   <none>           <none>
    csi-driver-nfs   csi-nfs-node-tvrb5                         3/3     Running   0              75s    10.10.30.153   cp-node-3   <none>           <none>
    
    
    $ kubectl get sc
    
    NAME                PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    nfs-csi (default)   nfs.csi.k8s.io   Delete          Immediate           false                  11m
    $ bin/cubectl addon disable csi-driver-nfs
    
    addon disable start: csi-driver-nfs ...
    addon disable complete: csi-driver-nfs
    Duration 1.358568651s time
    $ cubectl config sync -p <ssh key> -u <username>
    $ cubectl update-kubeconfig -p <ssh key> -u <username>
    $ vi config/cubectl.toml
    
    [kubernetes]
    version = "v1.24"
    
    [node-pool.master]
    ip = ["10.30.30.10","10.30.30.11","10.30.30.12"]
    
    [node-pool.node]
    ip = ["10.30.31.11","10.30.31.12"]
    $ bin/cubectl upgrade -p ~/.ssh/id_rsa -u cocktail --kubeconfig config/acloud-client-kubeconfig
    $ sudo vi /var/lib/cubectl/cert/openssl.conf
    # 예시
    [ alt_names_registry ]
    DNS.1 = localhost
    DNS.2 = registry
    DNS.3 = regi.acornsoft.io
    IP.1 = 127.0.0.1
    IP.2 = 192.168.77.154
    $ sudo mkdir /etc/docker/certs.d/regi.acornsoft.io
    $ sudo sed -i 's/192.168.77.154/regi.acornsoft.io/g' /var/lib/cubectl/harbor/harbor.yml
    # 예시
    hostname: regi.acornsoft.io
    $ cd /var/lib/cubectl/harbor/
    $ sudo ./install.sh
    $ cd /var/lib/cubectl/harbor/common/config/core
    $ vi env
    
    # AS-IS
    EXT_ENDPOINT=https://10.1.1.50
    
    # TO-BE (접속될 접속주소, 예시:)
    EXT_ENDPOINT=https://www.regi.acornsoft.io
    $ sudo mkdir -p /etc/containerd/certs.d/regi.acornsoft.io
    $ sudo cp -r /etc/containerd/certs.d/192.168.77.154/* /etc/containerd/certs.d/regi.acornsoft.io
    $ sudo sed -i 's/192.168.77.154/regi.acornsoft.io/g' /etc/containerd/certs.d/regi.acornsoft.io/hosts.toml
    $ sudo sed -i 's/192.168.77.154/regi.acornsoft.io/g' /etc/containerd/config.toml
    $ sudo systemctl restart containerd
    $ sudo sed -i '/ca =/d' /etc/containerd/certs.d/regi.acornsoft.io/hosts.toml
    # 도메인주소로 변경하는 경우 ca 라인 삭제
    server = "https://www.regi.acornsoft.io"
    
    [host."https://www.regi.acornsoft.io"]
    $ sudo find /etc/kubernetes -type f -exec sed -i 's/192.168.77.154/regi.acornsoft.io/g' {} +
    # Control plane에서 IP가 변경되는 파일 목록
    
    # Addon
    /etc/kubernetes/addon/calico/calico.yaml
    /etc/kubernetes/addon/metrics-server/metrics-server.yaml
    # Static Pods
    /etc/kubernetes/manifests/kube-apiserver.yaml
    /etc/kubernetes/manifests/kube-controller-manager.yaml
    /etc/kubernetes/manifests/kube-scheduler.yaml
    # Coredns 및 기타 yaml
    /etc/kubernetes/addon/test/nginx.yaml
    /etc/kubernetes/addon/test/dnsutils.yaml
    /etc/kubernetes/kubeadm.yaml
    # Worker nodes에서 IP가 변경되는 파일 목록
    
    # Static Pods
    /etc/kubernetes/manifests/haproxy.yaml
    $ sed -i 's/192.168.77.154/regi.acornsoft.io/g' /etc/apt/sources.list.d/local-repo.list
    $ sudo mkdir /etc/docker/certs.d/regi.acornsoft.io
    $ kubectl apply -f /etc/kubernetes/addon/calico/calico.yaml
    $ kubectl apply -f /etc/kubernetes/addon/metrics-server/metrics-server.yaml
    $ kubectl edit daemonset -n kube-system kube-proxy
    # 예시
    image: regi.acornsoft.io/registry.k8s.io/kube-proxy:v1.26.7
    $ kubectl edit deployment -n kube-system coredns
    # 예시
    image: regi.acornsoft.io/docker.io/coredns/coredns:1.9.3
    $ sudo systemctl restart kubelet
    $ sudo crictl images
    # 예시
    ubuntu@master-1:~$ sudo crictl images
    IMAGE                                                          TAG                 IMAGE ID            SIZE
    regi.acornsoft.io/docker.io/calico/cni                         v3.26.1             9dee260ef7f59       93.4MB
    192.168.77.154/docker.io/calico/cni                            v3.26.1             9dee260ef7f59       93.4MB
    regi.acornsoft.io/docker.io/calico/node                        v3.26.1             8065b798a4d67       86.6MB
    192.168.77.154/docker.io/calico/node                           v3.26.1             8065b798a4d67       86.6MB
    regi.acornsoft.io/registry.k8s.io/kube-apiserver               v1.26.7             6ac727c486d08       36.1MB
    192.168.77.154/registry.k8s.io/kube-apiserver                  v1.26.7             6ac727c486d08       36.1MB
    regi.acornsoft.io/registry.k8s.io/kube-controller-manager      v1.26.7             17314033c0a0b       32.8MB
    192.168.77.154/registry.k8s.io/kube-controller-manager         v1.26.7             17314033c0a0b       32.8MB
    regi.acornsoft.io/registry.k8s.io/kube-proxy                   v1.26.7             1e7eac3bc5c0b       21.8MB
    192.168.77.154/registry.k8s.io/kube-proxy                      v1.26.7             1e7eac3bc5c0b       21.8MB
    regi.acornsoft.io/registry.k8s.io/kube-scheduler               v1.26.7             c1902187a39f8       17.8MB
    192.168.77.154/registry.k8s.io/kube-scheduler                  v1.26.7             c1902187a39f8       17.8MB
    regi.acornsoft.io/registry.k8s.io/pause                        3.9                 e6f1816883972       319kB
    192.168.77.154/registry.k8s.io/pause                           3.9                 e6f1816883972       319kB
    192.168.77.154/docker.io/coredns/coredns                       1.9.3               5185b96f0becf       14.8MB
    192.168.77.154/registry.k8s.io/metrics-server/metrics-server   v0.6.1              e57a417f15d36       28.1MB
    $ export KUBECONFIG=$(pwd)/config/acloud-client-kubeconfig
    
    # 또는
    
    $ sudo cp -i config/acloud-client-kubeconfig $HOME/.kube/config
    $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    # 노드 확인
    $ kubectl get nodes
    $CUBE_HOME/
    └── cubectl-v1.x.x/
        ├── archive
        ├── bin
        ├── config
        ├── extends/
        │   └── addon/
        │       ├── chart/
        │       │   ├── csi-driver-nfs-v4.8.0.tgz
        │       │   ├── gpu-operator-v23.9.0.tgz
        │       │   └── kore-board-0.5.5.tgz
        │       ├── profile/
        │       │   ├── csi-driver-nfs/
        │       │   │   └── default.yaml
        │       │   ├── gpu-operator/
        │       │   │   ├── default.yaml
        │       │   │   ├── redhat.yaml
        │       │   │   └── ubuntu.yaml
        │       │   └── kore-board/
        │       │       └── default.yaml
        │       └── images/
        │           └── gpu-operator/
        │               └── gpu-operator-v23.9.0-ubuntu2204.tgz
        │
        ├── logs
        └── LICENSE.txt
    $ lspci -nnk | grep -i nvidia
    
    00:05.0 3D controller [0302]: NVIDIA Corporation Device [10de:20b7] (rev a1)
        Subsystem: NVIDIA Corporation Device [10de:1532]
        Kernel modules: nvidiafb
    $ bin/cubectl addon list
    ┌────────────────┬─────────┬──────────┬─────────┬─────────────────────────────┐
    │ ADDON NAME     │ VERSION │ STATUS   │ PROFILE │ VALUES PATH                 │
    ├────────────────┼─────────┼──────────┼─────────┼─────────────────────────────┤
    │ csi-driver-nfs │ v4.8.0  │ disabled │         │ csi-driver-nfs/default.yaml │
    │ gpu-operator   │ v23.9.0 │ disabled │         │ gpu-operator/default.yaml   │
    │                │         │          │ redhat  │ gpu-operator/redhat.yaml    │
    │                │         │          │ ubuntu  │ gpu-operator/ubuntu.yaml    │
    │ kore-board     │ 0.5.5   │ disabled │         │ kore-board/default.yaml     │
    └────────────────┴─────────┴──────────┴─────────┴─────────────────────────────┘
    Duration 73.639078ms time
    $ vi ${CUBE_HOME}/extends/addon/profile/gpu-operator/default.yaml
    $ bin/cubectl addon enable gpu-operator
    
    addon enable start: gpu-operator ...
    addon enable complete: gpu-operator
    Duration 52.093538621s time
    $ bin/cubectl addon list
    ┌────────────────┬─────────┬────────────┬─────────┬─────────────────────────────┐
    │ ADDON NAME     │ VERSION │ STATUS     │ PROFILE │ VALUES PATH                 │
    ├────────────────┼─────────┼────────────┼─────────┼─────────────────────────────┤
    │ csi-driver-nfs │ v4.8.0  │ disabled   │         │ csi-driver-nfs/default.yaml │
    │ gpu-operator   │ v23.9.0 │ enabled ✅ │         │ gpu-operator/default.yaml   │
    │                │         │            │ redhat  │ gpu-operator/redhat.yaml    │
    │                │         │            │ ubuntu  │ gpu-operator/ubuntu.yaml    │
    │ kore-board     │ 0.5.5   │ disabled   │         │ kore-board/default.yaml     │
    └────────────────┴─────────┴────────────┴─────────┴─────────────────────────────┘
    Duration 75.061448ms time
    
    $ kubectl get pods -n gpu-operator
    
    NAMESPACE      NAME                                                          READY   STATUS    RESTARTS      AGE   IP             NODE        NOMINATED NODE   READINESS GATES
    gpu-operator   gpu-operator-5564789746-rlpzk                                 1/1     Running   0             65s   10.4.185.65    cp-node-1   <none>           <none>
    gpu-operator   gpu-operator-node-feature-discovery-gc-78b479ccc6-ngfnd       1/1     Running   0             65s   10.4.211.67    wk-node-1   <none>           <none>
    gpu-operator   gpu-operator-node-feature-discovery-master-569bfcd8bc-5xb8h   1/1     Running   0             65s   10.4.111.193   cp-node-3   <none>           <none>
    gpu-operator   gpu-operator-node-feature-discovery-worker-dlxxh              1/1     Running   0             65s   10.4.111.194   cp-node-3   <none>           <none>
    gpu-operator   gpu-operator-node-feature-discovery-worker-fmlmb              1/1     Running   0             65s   10.4.185.66    cp-node-1   <none>           <none>
    gpu-operator   gpu-operator-node-feature-discovery-worker-gqn8z              1/1     Running   0             65s   10.4.238.68    cp-node-2   <none>           <none>
    gpu-operator   gpu-operator-node-feature-discovery-worker-pksh4              1/1     Running   0             65s   10.4.109.2     wk-node-2   <none>           <none>
    gpu-operator   gpu-operator-node-feature-discovery-worker-xx6gb              1/1     Running   0             65s   10.4.211.66    wk-node-1   <none>           <none>
    $ bin/cubectl addon disable gpu-operator
    # 1g.5gb 인 경우
    
    $ kubectl label nodes $NODE nvidia.com/mig.config=all-1g.5gb --overwrite
    $ kubectl -n gpu-operator exec -it nvidia-dcgm-exporter-gc6bm bash
    
    root@nvidia-dcgm-exporter-gc6bm:/# nvidia-smi
    Thu Dec  7 06:02:55 2023
    +---------------------------------------------------------------------------------------+
    | NVIDIA-SMI 535.104.12             Driver Version: 535.104.12   CUDA Version: 12.2     |
    |-----------------------------------------+----------------------+----------------------+
    | GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
    |                                         |                      |               MIG M. |
    |=========================================+======================+======================|
    |   0  NVIDIA A30                     On  | 00000000:00:05.0 Off |                   On |
    | N/A   63C    P0              72W / 165W |                  N/A |     N/A      Default |
    |                                         |                      |              Enabled |
    +-----------------------------------------+----------------------+----------------------+
    
    +---------------------------------------------------------------------------------------+
    | MIG devices:                                                                          |
    +------------------+--------------------------------+-----------+-----------------------+
    | GPU  GI  CI  MIG |                   Memory-Usage |        Vol|      Shared           |
    |      ID  ID  Dev |                     BAR1-Usage | SM     Unc| CE ENC DEC OFA JPG    |
    |                  |                                |        ECC|                       |
    |==================+================================+===========+=======================|
    |  0    3   0   0  |              12MiB /  5952MiB  | 14      0 |  1   0    1    0    0 |
    |                  |               0MiB /  8191MiB  |           |                       |
    +------------------+--------------------------------+-----------+-----------------------+
    |  0    4   0   1  |              12MiB /  5952MiB  | 14      0 |  1   0    1    0    0 |
    |                  |               0MiB /  8191MiB  |           |                       |
    +------------------+--------------------------------+-----------+-----------------------+
    |  0    5   0   2  |              12MiB /  5952MiB  | 14      0 |  1   0    1    0    0 |
    |                  |               0MiB /  8191MiB  |           |                       |
    +------------------+--------------------------------+-----------+-----------------------+
    |  0    6   0   3  |              12MiB /  5952MiB  | 14      0 |  1   0    1    0    0 |
    |                  |               0MiB /  8191MiB  |           |                       |
    +------------------+--------------------------------+-----------+-----------------------+
    
    +---------------------------------------------------------------------------------------+
    | Processes:                                                                            |
    |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
    |        ID   ID                                                             Usage      |
    |=======================================================================================|
    |  No running processes found                                                           |
    +---------------------------------------------------------------------------------------+
    root@nvidia-dcgm-exporter-gc6bm:/# nvidia-smi -L
    GPU 0: NVIDIA A30 (UUID: GPU-79e36614-3f62-d3dd-cdd0-48b00aa446e0)
      MIG 1g.6gb      Device  0: (UUID: MIG-39f52290-ccf4-5e32-b8b8-cc1877a32051)
      MIG 1g.6gb      Device  1: (UUID: MIG-dbf3834e-128b-5965-88b7-2e3d2fe5a0aa)
      MIG 1g.6gb      Device  2: (UUID: MIG-c735f798-c9d5-5c0e-972c-e0bc6cdb05e7)
      MIG 1g.6gb      Device  3: (UUID: MIG-233d355f-f84e-530d-8526-797b5a867669)
    # 4개로 분할하는 경우
    
    $ cat <<EOF > time-slicing-config-all.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: time-slicing-config-all
    data:
      any: |-
        version: v1
        flags:
          migStrategy: none
        sharing:
          timeSlicing:
            resources:
            - name: nvidia.com/gpu
              replicas: 4
    EOF
    
    $ kubectl apply -n gpu-operator -f time-slicing-config-all.yaml
    $ kubectl patch clusterpolicy/cluster-policy -n gpu-operator --type merge -p '{"spec": {"devicePlugin": {"config": {"name": "time-slicing-config-all", "default": "any"}}}}'
    $ kubectl describe no $GPU-NODE
    $ curl -sfL https://cube.k3.acornsoft.io/download-package | ACCOUNT={{ ID }} PASSWD={{ PW }} PACKAGE=kubeflow VERSION=1.10.2 sh -
    
    [INFO] starting download file kubeflow-manifests-1.10.2.tar.gz
    ######################################################################## 100.0%
    [INFO] decompressing file kubeflow-manifests-*.tar.gz
    [INFO] starting download file kubectl-*-linux-amd64
    ######################################################################## 100.0%
    [INFO] starting download file kubeflow-images-1.10.2.tar.gz
    #####                                                                      8.3%
    ...
    $ sudo vi /etc/security/limits.conf
    # 추가
    * soft nofile 65535
    * hard nofile 65535
    
    $ sudo vi /etc/sysctl.d/99-sysctl.conf
    # 추가
    fs.file-max = 2097152
    fs.inotify.max_user_instances=1280
    fs.inotify.max_user_watches=655360
    sudo sysctl -p
    $ tar -zxvf ./archive/push/registry/kubeflow-images-1.10.2.tar.gz -C ./archive/push/registry
    docker.io_bitnami_kubectl:1.30.4.tar
    docker.io_filebrowser_filebrowser:v2.25.0.tar
    docker.io_grafana_grafana:5.3.4.tar
    docker.io_kong_httpbin:latest.tar
    ...
    
    cubectl-v1.x.x/
    ├── archive
    │   └── push
    │       ├── localrepo
    │       └── registry
    │           └── kubeflow-images-1.10.2.tar.gz(해당 파일을 압축 해제 후 위치 변경)
    ├── bin
    ...
    ├── LICENSE.txt
    ├── kubeflow
    │   ├── bash
    │   │   └── ...
    │   ├── bin
    │   │   └── ...
    │   └── manifest
    │       └── ...
    └── logs
    $ ./bin/cubectl-test push registry -u test -p ./config/sshkey
    ┌─────────────────┬───────────┬────────────┬────────────┬──────────────────────────────────────────────────────────────────────────────────────────────┐
    │ KIND            │ NODE      │ IP         │ PRIVATE IP │ PUSH IMAGES                                                                                  │
    ├─────────────────┼───────────┼────────────┼────────────┼──────────────────────────────────────────────────────────────────────────────────────────────┤
    │ Push Repository │ node-regi │ 10.10.0.49 │ 10.10.0.49 │ docker.io_bitnami_kubectl:1.30.4.tar                                                         │
    │                 │           │            │            │ docker.io_filebrowser_filebrowser:v2.25.0.tar                                                │
    │                 │           │            │            │ gcr.io_knative-releases_knative.dev_eventing_cmd_in|memory_channel|controller:v1.16.4.tar    │
    │                 │           │            │            │ gcr.io_knative-releases_knative.dev_eventing_cmd_in|memory_channel|dispatcher:v1.16.4.tar    │
    ...
    │                 │           │            │            │ quay.io_jetstack_cert-manager-controller:v1.16.1.tar                                         │
    │                 │           │            │            │ quay.io_jetstack_cert-manager-webhook:v1.16.1.tar                                            │
    │                 │           │            │            │ quay.io_kuberay_operator:v1.3.2.tar                                                          │
    │                 │           │            │            │ quay.io_oauth2-proxy_oauth2-proxy:latest.tar                                                 │
    │                 │           │            │            │ quay.io_oauth2-proxy_oauth2-proxy:v7.7.1.tar                                                 │
    └─────────────────┴───────────┴────────────┴────────────┴──────────────────────────────────────────────────────────────────────────────────────────────┘
    Is this ok [Y/n]:
    # 예시
    test@kubeflow-cp-1:~/cubectl-v1.3.3$ export CUBE_HOME=$(pwd)
    test@kubeflow-cp-1:~/cubectl-v1.3.3$ echo $CUBE_HOME
    /home/test/cubectl-v1.3.3
    ./kubeflow/bin/install base -c {cubectl -c 옵션과 동일}
    $ vi ${CUBE_HOME}/kubeflow/manifests/applications/pipeline/upstream/base/installs/generic/pipeline-install-config.yaml
    $ vi ${CUBE_HOME}/kubeflow/manifests/applications/pipeline/upstream/base/installs/generic/postgres/pipeline-install-config.yaml
    # registry.k8s.io/busybox -> docker.io/library/busybox
    $ vi ${CUBE_HOME}/kubeflow/manifests/applications/pipeline/upstream/base/installs/multi-user/pipelines-profile-controller/sync.py
    # ghcr.io/kubeflow/kfp-frontend -> 10.10.0.49/ghcr.io/kubeflow/kfp-frontend
    # ghcr.io/kubeflow/kfp-visualization-server -> 10.10.0.49/ghcr.io/kubeflow/kfp-visualization-server
    $ vi ${CUBE_HOME}/kubeflow/manifests/common/istio/profile.yaml
    $ vi ${CUBE_HOME}/kubeflow/manifests/common/istio/istio-install/overlays/insecure/configmap-patch.yaml
    # hub: gcr.io/istio-release -> hub: 10.10.0.49/gcr.io/istio-release로 변경
    $ vi ${CUBE_HOME}/kubeflow/manifests/common/cert-manager/base/upstream/cert-manager.yaml
    # --acme-http01-solver-image=quay.io/jetstack/cert-manager-acmesolver:v1.16.1 ->
    # --acme-http01-solver-image=10.10.0.49/quay.io/jetstack/cert-manager-acmesolver:v1.16.1로 변경
    $ vi ${CUBE_HOME}/kubeflow/manifests/applications/pipeline/upstream/third-party/argo/base/workflow-controller-deployment-patch.yaml
    # quay.io/argoproj/argoexec:v3.5.14 -> 10.10.0.49/quay.io/argoproj/argoexec:v3.5.14
    $ vi ${CUBE_HOME}/kubeflow/manifests/applications/pipeline/upstream/base/pipeline/ml-pipeline-apiserver-deployment.yaml
    # ghcr.io/kubeflow/kfp-driver:2.5.0 -> 10.10.0.49/ghcr.io/kubeflow/kfp-driver:2.5.0
    # ghcr.io/kubeflow/kfp-launcher:2.5.0 -> 10.10.0.49/ghcr.io/kubeflow/kfp-launcher:2.5.0
    $ vi ${CUBE_HOME}/kubeflow/manifests/common/knative/knative-serving/base/upstream/serving-core.yaml
    # queue-sidecar-image: ... -> queue-sidecar-image: 10.10.0.49/gcr.io/knative-releases/knative.dev/serving/cmd/queue:v1.16.2
    $ ./kubeflow/bin/install -r {registry ip} -c {cubectl -c 옵션과 동일} overlays/airgapped
    ...
    validatingwebhookconfiguration.admissionregistration.k8s.io/spark-operator-webhook serverside-applied
    validatingwebhookconfiguration.admissionregistration.k8s.io/trainedmodel.serving.kserve.io serverside-applied
    validatingwebhookconfiguration.admissionregistration.k8s.io/validation.webhook.serving.knative.dev serverside-applied
    validatingwebhookconfiguration.admissionregistration.k8s.io/validator.training-operator.kubeflow.org serverside-applied