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 |
요구 사항
- 현재 KubeSphere Major 버전은 3.3으로 Kubernetes 클러스터의 버전은 v1.20.x, v1.21.x, v1.22.x, v1.23.x, 또는 v1.24.x 이어야 한다
쿠버네티스1.22 버전부터는 비호환성으로 인해 edge node의 일부 기능을 사용할 수 없다. 따라서 edge node를 사용하려면 Kubernetes v1.21.x 를 설치하는 것이 좋다.
edge node는 클러스터 컴퓨팅에서 다른 노드와의 통신을 위한 최종 사용자 포털/게이트웨이 역할을 하는 노드이다.
- x86_64 CPU만 지원되며, ARM CPU는 현재 완전히 지원되지 않는다
- CPU자원은 최소 1코어 그리고 메모리는 최소 2GiB 이어야 한다
- Kubernetes 클러스터에 기본 StorageClass가 구성되어 있어야 한다.
kubectl get sc
명령어를 사용하여 클러스터의 StorageClass 상태를 확인한다. 추가로 StorageClass는 Default class에 속 해야 한다.
Storage Class는 PV(Persistent Volume)을 동적으로 프로비저닝하기 위한 스토리지 유형과 해당 속성을 정의하는 구성.
더 자세한 요구 사항들은 KubeSphere 공식 문서에서 확인 가능 하다.
Prerequisites for KubeSphere 바로가기
KubeSphere 설치를 위한 준비 작업
쿠버네티스 클러스터 생성 작업은 이미 수동과 자동 방법으로 Wiki에 추가 되어있다.
바로가기:
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
# 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
# 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
설치 작업이 완료 되면 아래와 같은 화면을 확인 할 수 있다
콘솔 접속 확인을 위해 위 IP주소 및 포트 번호로 접속을 하면,
초기 비밀번호와 계정 ID는 설치 완료시 기본적으로 받은 정보로 통해 최초 로그인을 실행 한다.
로그인 시 바로 새로운 패스워드를 입력 하라는 창이 나온다
패스워드 변경 후 아래와 같은 화면을 볼 수 있다.
여기서 좌측 상단에 있는 'Platform'을 선택 하여 'Cluster Management' 메뉴를 클릭 시 현재 쿠버네티스 클러스터의 현황을 볼 수 있다.
클러스터의 모든 노드의 정보도 확인 가능 하다
그 외 파드들의 작동 여부도 확인 가능 하다
초반에 생성한 StorageClass와 연관된 PVC들의 정보도 볼 수 있다
Prometheus 파드들이 각 PV를 claim하고 있는 것을 확인 할 수 있다
그 외 KubeSphere 데시보드상 간단한 Monitoring과 로깅 정보도 볼 수 있다
KubeSphere 설치 도중 발생한 ERROR 과 조치
1. 버전 호환성 문제
KubeSphere는 현재 쿠버네티스 버전 1.24 까지 호환 가능 하며, 초반에 Kubesphere를 설치 한 클러스터는 v1.26이였기 때문에 'monitoring task status'는 매번 'failed'이라고 나왔다
KubeSphere 설치는 완료 되지만 Prometheus 파드들은 계속 Pending 상태에 존재 한다
이 문제를 해결 하기 위해 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 관련 모든 파드들의 상태를 확인: