Kubesphere

Kubesphere Wiki

Kubesphere 개요

Kubesphere 개요

Kubesphere 소개

Kubesphere은 쿠버네티스 기반의 혁신적인 오픈 소스 관리 플랫폼으로, 클라우드 네이티브 애플리케이션을 구축, 배포 및 관리하기 위한 통합 솔루션을 제공한다. 

Kubesphere는 쿠버네티스의 코어 기능을 기반으로 하며, 애플리케이션 배포, 모니터링, 로깅, CI/CD, 서비스 메시 및 다중 테넌시와 같은 다양한 기능을 제공한다. 이를 통해 개발자들은 간편한 방식으로 애플리케이션을 개발하고 배포할 수 있으며, 운영팀과의 협업을 통해 안정적이고 확장 가능한 애플리케이션을 유지할 수 있다.

KubeSphere Official Github Page: https://github.com/kubesphere/kubesphere

KubeSphere 3.3 버전 Doc: https://www.kubesphere.io/docs/v3.3

Latest 버전은 3.3.2. 2023-02-08에 Update되었다

버전 노트: https://www.kubesphere.io/docs/v3.3/release/release-v332/

이 Wiki에서 쓸 버전은 3.3.1. 이 버전의 마지막 업데이트는 2022-10-28

버전 노트: https://www.kubesphere.io/docs/v3.3/release/release-v331/

Kubesphere 개요

Kubesphere의 주요 특징

image.png

Kubesphere 개요

Kubesphere의 필요성

Kubesphere 개요

Kubesphere vs Kubernetes

Kubesphere 클러스터 관리

Kubesphere 클러스터 관리

Kubesphere 클러스터 설치

작업 환경

💡 RockyKVM에서 실습 진행 . 총 사용한 VM들의 목록과 사양은:  

노드 OS IP CPU Memory Volume Extra Volume
Ansible Node Rocky Linux 9.2 192.168.122.103 12 16GiB 100GiB 30GiB + 30GiB
Master Node Rocky Linux 9.2 192.168.122.8 12 32GiB 120GiB
Worker Node1 Rocky Linux 9.2 192.168.122.52 12 32GiB 120GiB
Worker Node2 Rocky Linux 9.2 192.168.122.240 12 32GiB 120GiB

요구 사항

쿠버네티스1.22 버전부터는 비호환성으로 인해 edge node의 일부 기능을 사용할 수 없다. 따라서 edge node를 사용하려면 Kubernetes v1.21.x 를 설치하는 것이 좋다.

edge node는 클러스터 컴퓨팅에서 다른 노드와의 통신을 위한 최종 사용자 포털/게이트웨이 역할을 하는 노드이다.

Storage Class는 PV(Persistent Volume)을 동적으로 프로비저닝하기 위한 스토리지 유형과 해당 속성을 정의하는 구성.

더 자세한 요구 사항들은 KubeSphere 공식 문서에서 확인 가능 하다.

Prerequisites for KubeSphere 바로가기


KubeSphere 설치를 위한 준비 작업

쿠버네티스 클러스터 생성 작업은 이미 수동과 자동 방법으로 Wiki에 추가 되어있다. 

바로가기:

쿠버네티스 클러스터 수동 (Kubeadm) 설치

쿠버네티스 클러스터 자동 (Kubespray) 설치

Kubernetes v1.24 이상이면 특정 Kubesphere 서비스가 실행 되지 않으니 주의 할 것!

이번 KubeSphere 설치를 하기 위해 Kubespray를 통해 쿠버네티스 클러스터 v1.24.6버전을 설치 하였다.

kubectl get nodes
NAME    STATUS   ROLES           AGE    VERSION
node1   Ready    control-plane   3d3h   v1.24.6
node2   Ready    <none>          3d3h   v1.24.6
node3   Ready    <none>          3d3h   v1.24.6

쿠버네티스 클러스터가 준비 된 후, 클러스터의 기본 StorageClass 및 PersistentVolume을 구성해야 한다.

그러기 위해 먼저 NFS를 Ansible 노드에서 설정을 하여 2개의 워커노드들이 각각 PV를 사용 할 수 있게 설정 해주는 작업을 실행 한다. 이미 Ansible 노드에 추가로 2개의 디스크를 추가 하였다.

lsblk
NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sr0             11:0    1 1024M  0 rom
vda            252:0    0  100G  0 disk
├─vda1         252:1    0   99M  0 part /boot/efi
├─vda2         252:2    0 1000M  0 part /boot
├─vda3         252:3    0    4M  0 part
├─vda4         252:4    0    1M  0 part
└─vda5         252:5    0 98.9G  0 part
  └─rocky-root 253:0    0 98.9G  0 lvm  /
vdb            252:16   0   30G  0 disk  		# 추가 디스크 1
vdc            252:32   0   30G  0 disk 		# 추가 디스크 2
제일 먼저 filesystem 포멧 작업을 진행 한다
# xfs 파일 시스템으로 포멧
mkfs.xfs /dev/vdb
mkfs.xfs /dev/vdc

# HDD 구성정보 확인 및 XFS 파일시스템 구성 ( 포맷 )
blkid | grep /dev/vdb && blkid | grep /dev/vdc
/dev/vdb: UUID="d77478e3-b832-4117-a470-a868e6dd3eab" TYPE="xfs"
/dev/vdc: UUID="451acf45-b067-49ef-b6fb-49d4c7b44e10" TYPE="xfs"
파티션 구성 없이 해당 디스크 하나를 단일 파티션으로 사용했다

공유 할 디렉터리 생성 및 마운트 작업을 진행 한다
# 공유 디렉터리로 사용 할 마운트 포인트 생성 및 오토 마운트 설정
mkdir /k8s_data
mkdir /k8s_data2

# 오토 마운트 설정
vi /etc/fstab
/dev/vdb        /k8s_data           xfs     defaults        0 0
/dev/vdc        /k8s_data2           xfs     defaults        0 0

# 마운트 작업 실행
mount -a

# 마운트 상태 확인
df -h

Filesystem              Size  Used Avail Use% Mounted on
devtmpfs                4.0M     0  4.0M   0% /dev
tmpfs                   7.7G     0  7.7G   0% /dev/shm
tmpfs                   3.1G   20M  3.1G   1% /run
/dev/mapper/rocky-root   99G  2.4G   97G   3% /
/dev/vdb                 30G  540M   30G   2% /k8s_data
/dev/vdc                 30G  541M   30G   2% /k8s_data2

참고 : 디스크 파티션 및 파일 시스템을 잘못 구성하였을 경우 초기화 작업 진행
wipefs -a /dev/vdb
wipefs -a /dev/vdc

이제 Ansible노드가 NFS 역할을 수행 하기 위해 NFS 패키지를 설치 해줘야 한다
# nfs 패키지 설치
dnf -y install nfs*

# exports 파일속 공유할 디렉터리 지정 및 접근 가능 호스트 Mapping 계정등을 설정
#  Worker Node에서 접근하므로 Worker Node의 Network 대역대를 설정
vi /etc/exports
/k8s_data   192.168.122.0/24(rw,all_squash,sync) 
/k8s_data   192.168.122.0/24(rw,all_squash,sync)


# NFS 연결 시 Mapping 계정은 nfs_nobody로 연결되도록 설정
# NFS 공유 디렉터리의 소유그룹 및 허가권 변경작업을 진행
# nfsnobody 그룹 접근 시 쓰기 작업 허용
chown .nfsnobody /k8s_data*
chmod 775 /k8s_data*


# NFS와 rpcbind 서비스들 시작
systemctl start rpcbind
systemctl start nfs-server
systemctl enable rpcbind
systemctl enable nfs-server


# export 상태 확인
exportfs -v
/k8s_data       192.168.122.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)
/k8s_data2      192.168.122.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)

Firewall은 기본적으로 disabled 상태이어서 'nfs' 와 'rpc-bind' 서비스들을 firewall에 추가 하는 작업은 생략 한다


NFS까지 준비가 되었으면 이제 쿠버네티스 클러스터에서 PV및 StorageClass 작업을 진행 한다

StorageClass를 지정하기 위한 Yaml 파일을 생성 한다

# Storage관련 YAML파일들을 분리 하기 위해 새로운 디렉터리 생성
mkdir Volume && cd Volume

# storageclass 생성을 위해 YAML 파일
vi storage.yml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: my-storage-class
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"       # 기본 StorageClass이라고 지정
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

# StorageClass 적용
kubectl apply -f storage.yml
storageclass.storage.k8s.io/my-storage-class created

# 적용 확인
kubectl get sc
NAME						PROVISIONER						RECLAIMPOLICY		VOLUMEBINDINGMODE		ALLOWVOLUMEEXPANSION		AGE
my-storage-class (default)	kubernetes.io/no-provisioner	Delete				WaitForFirstConsumer	false						10m


StorageClass를 적용 후 KubeSphere용 PV를 생성 해 줘야 한다.

# 첫 번째 pv 적용을 위해 YAML 파일
vi pv.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 30Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: my-storage-class
  nfs:
    path: /k8s_data						
    server: 192.168.122.103				# NFS server의 주소
   

# 두 번째 pv 적용을 위해 YAML 파일
vi pv2.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv2
spec:
  capacity:
    storage: 30Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: my-storage-class
  nfs:
    path: /k8s_data2						
    server: 192.168.122.103				# NFS server의 주소
    
    
# PV YAML 적용
kubectl apply -f pv.yml
kubectl apply -f pv2.yml
persistentvolume/my-pv created
persistentvolume/my-pv2 created

# PV 적용 상태 확인 명령어
kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS       REASON   AGE
my-pv   30Gi       RWO            Retain           Available           my-storage-class            3s
my-pv2	30Gi	   RWO			  Retain		   Available		   my-storage-class			   3s


PV 적용 까지 완료 되었으면, KubeSphere를 설치 하기 위한 모든 준비 작업들은 완료 되었다. 


KubeSphere 설치(온라인)


KubeSphere 설치를 위한 설치 Manifest 파일들을 다운로드 받는다

VER=$( curl --silent "https://api.github.com/repos/kubesphere/ks-installer/releases/latest"| grep '"tag_name"'|sed -E 's/.*"([^"]+)".*/\1/')
wget https://github.com/kubesphere/ks-installer/releases/download/$VER/kubesphere-installer.yaml
wget https://github.com/kubesphere/ks-installer/releases/download/$VER/cluster-configuration.yaml


KubeSphere 설치용 Manifest 파일들을 다운로드 받은 후 적용 시킨다

kubectl apply -f kubesphere-installer.yaml
customresourcedefinition.apiextensions.k8s.io/clusterconfigurations.installer.kubesphere.io created
namespace/kubesphere-system created
serviceaccount/ks-installer created
clusterrole.rbac.authorization.k8s.io/ks-installer created
clusterrolebinding.rbac.authorization.k8s.io/ks-installer created
deployment.apps/ks-installer created

kubectl apply -f cluster-configuration.yaml
clusterconfiguration.installer.kubesphere.io/ks-installer created

위 명령어를 실행하면 네임스페이스 kubesphere-system이 생성되고 다른 여러 리소스가 시작된다

다음 명령을 사용하여 배포 지행 현황을 볼 수 있다

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f

설치 작업이 완료 되면 아래와 같은 화면을 확인 할 수 있다 

Screenshot_20230630_131635_Termius.jpg


콘솔 접속 확인을 위해 위 IP주소 및 포트 번호로 접속을 하면, 

image.png

초기 비밀번호와 계정 ID는 설치 완료시 기본적으로 받은 정보로 통해 최초 로그인을 실행 한다.


로그인 시 바로 새로운 패스워드를 입력 하라는 창이 나온다

image.png



패스워드 변경 후 아래와 같은 화면을 볼 수 있다.

image.png


여기서 좌측 상단에 있는 'Platform'을 선택 하여 'Cluster Management' 메뉴를 클릭 시 현재 쿠버네티스 클러스터의 현황을 볼 수 있다.

image.png

image.png


클러스터의 모든 노드의 정보도 확인 가능 하다

image.png


그 외 파드들의 작동 여부도 확인 가능 하다

image.png



초반에 생성한 StorageClass와 연관된 PVC들의 정보도 볼 수 있다

image.png


Prometheus 파드들이 각 PV를 claim하고 있는 것을 확인 할 수 있다

image.png


그 외 KubeSphere 데시보드상 간단한 Monitoring과 로깅 정보도 볼 수 있다 

image.png



KubeSphere 설치 도중 발생한 ERROR 과 조치


1. 버전 호환성 문제

KubeSphere는 현재 쿠버네티스 버전 1.24 까지 호환 가능 하며, 초반에 Kubesphere를 설치 한 클러스터는 v1.26이였기 때문에 'monitoring task status'는 매번 'failed'이라고 나왔다 image.png

 KubeSphere 설치는 완료 되지만 Prometheus 파드들은 계속 Pending 상태에 존재 한다image.png

이 문제를 해결 하기 위해 Kubernetes 클러스터를 v1.24.6버전으로 맞춰서 실행 하였다. 


2. Prometheus 'CreateContainerConfigError'


모든 설정 및 KubeSphere까지 설치 진행 후 Kubesphere monitoring의 파드들을 확인 한 결과

kubectl get pods -n kubesphere-monitoring-system
NAME                                               READY   STATUS                       RESTARTS   AGE
alertmanager-main-0                                2/2     Running                      0          20m
kube-state-metrics-6f6ffbf895-c28hf                3/3     Running                      0          20m
node-exporter-22fdn                                2/2     Running                      0          20m
node-exporter-96gmd                                2/2     Running                      0          20m
notification-manager-deployment-77d5b49896-9lt48   2/2     Running                      0          18m
notification-manager-operator-66c6967d78-bj2ms     2/2     Running                      0          19m
prometheus-k8s-0                                   1/2     CreateContainerConfigError   0          20m
prometheus-operator-b56bb98c4-l4cvp                2/2     Running                      0          20m
kubectl get pods -n kubesphere-monitoring-system
NAME                                               READY   STATUS                       RESTARTS   AGE
alertmanager-main-0                                2/2     Running                      0          20m
kube-state-metrics-6f6ffbf895-c28hf                3/3     Running                      0          20m
node-exporter-22fdn                                2/2     Running                      0          20m
node-exporter-96gmd                                2/2     Running                      0          20m
notification-manager-deployment-77d5b49896-9lt48   2/2     Running                      0          18m
notification-manager-operator-66c6967d78-bj2ms     2/2     Running                      0          19m
prometheus-k8s-0                                   1/2     CreateContainerConfigError   0          20m
prometheus-operator-b56bb98c4-l4cvp                2/2     Running                      0          20m

'CreateContainerConfigError'가 발생 하였다. 애러 로그 확인 시 PV설정 한 경로를 못 찾겠다는 애러 메시지를 발견 하였다.

이 문제의 원인은 초반에 KubeSphere 설치 전 pv.yml을 통해 PV 설정 할때, Master노드의 로컬 스토리지를 PV로 지정 하였기 때문이다.

예: Master 노드상 로컬 스토리지에  /mnt/data 디렉터리 생성 후 pv.yml 파일에 지정

Kubesphere의 Prometheus 파드는 워커 노드에 생성 되고, PV.yml에 지정한 경로를 워커 노드에서 찾고 있었다. 하지만 워커 노드에서는 그 pv를 지정한 경로를 못 찾았기 때문에 계속 ContainerConfigError 가 발생 하였다

위 애러를 해결 하기 위해 각 워커 노드의 로컬 스토리지상 새로운 디렉터리를 생성하여 pv.yml로 지정 하거나, 로컬 스토리지를 사용하지 않고 공유 스토리지를 사용 하고 싶다면, NFS 서버를 통해 pv를 지정 하면 된다

그 후 KubeSphere 관련 모든 파드들의 상태를 확인:

image.png

Kubesphere 클러스터 관리

클러스터 추가 및 제거

Kubesphere 클러스터 관리

Kubesphere 대시보드 사용하기

Kubesphere 클러스터 관리

KubeSphere Namespace 삭제

KubeSphere Web UI를 통해 Namespace 삭제 작업 순서

Kubesphere에서는 Namespace 단위를 Project라고 부른다.

일반 적으로 Kubernetes는 Cluster 바로 아래에 Namespace 가 존재 하지만, Kubesphere는 Cluster -> Workspace -> Project 순서로 배치 되어 있다


KubeSphere 메인 화면에서 Workspaces 선택

image.png


삭제 할 Project가 존재하는 Workspace 선택 

image.png


Projects 선택

image.png


Project들 중 삭제 요청을 받은 Project를 확인. 테스트 용도로 삭제 하기 위해 만든 NS 확인

image.png


CLI 상에서도 test-ns 네임스페이스가 존재하는지 확인

image.png



WebUI에서 checkbox 선택 후 "Delete' 이라는 옵션을 선택

image.png


삭제 진행 하고자 하는 Project의 이름을 그대로 입력 후 'Ok' 클릭

image.png


Terminating status 및 우측 상단에서 삭제 메시지 확인

image.png


CLI를 통해서도 삭제 확인 가능

image.png