# Kubesphere 클러스터 설치 ##### **작업 환경** 💡 *RockyKVM에서 실습 진행 . 총 사용한 VM들의 목록과 사양은:*
노드OSIPCPUMemoryVolumeExtra Volume
Ansible NodeRocky Linux 9.2192.168.122.1031216GiB100GiB30GiB + 30GiB
Master NodeRocky Linux 9.2192.168.122.81232GiB120GiB
Worker Node1Rocky Linux 9.2192.168.122.521232GiB120GiB
Worker Node2Rocky Linux 9.2192.168.122.2401232GiB120GiB
##### **요구 사항** - 현재 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 바로가기](https://www.kubesphere.io/docs/v3.3/installing-on-kubernetes/introduction/prerequisites/) ##### **KubeSphere 설치를 위한 준비 작업** 쿠버네티스 클러스터 생성 작업은 이미 수동과 자동 방법으로 Wiki에 추가 되어있다. 바로가기: [쿠버네티스 클러스터 수동 (Kubeadm) 설치](http://138.2.116.150/books/kubernetes/page/kubeadm) [쿠버네티스 클러스터 자동 (Kubespray) 설치](http://138.2.116.150/books/kubernetes/page/kubespray)

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

이번 KubeSphere 설치를 하기 위해 Kubespray를 통해 쿠버네티스 클러스터 v1.24.6버전을 설치 하였다. ```bash kubectl get nodes NAME STATUS ROLES AGE VERSION node1 Ready control-plane 3d3h v1.24.6 node2 Ready 3d3h v1.24.6 node3 Ready 3d3h v1.24.6 ``` 쿠버네티스 클러스터가 준비 된 후, 클러스터의 기본 StorageClass 및 PersistentVolume을 구성해야 한다. 그러기 위해 먼저 NFS를 Ansible 노드에서 설정을 하여 2개의 워커노드들이 각각 PV를 사용 할 수 있게 설정 해주는 작업을 실행 한다. 이미 Ansible 노드에 추가로 2개의 디스크를 추가 하였다. ```bash 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 포멧 작업을 진행 한다
```bash # 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" ```
파티션 구성 없이 해당 디스크 하나를 단일 파티션으로 사용했다
공유 할 디렉터리 생성 및 마운트 작업을 진행 한다
```bash # 공유 디렉터리로 사용 할 마운트 포인트 생성 및 오토 마운트 설정 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 패키지를 설치 해줘야 한다
```bash # 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 파일을 생성 한다 ```bash # 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를 생성 해 줘야 한다. ```bash # 첫 번째 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 파일들을 다운로드 받은 후 적용 시킨다 ```bash 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](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/screenshot-20230630-131635-termius.jpg)](http://138.2.116.150/uploads/images/gallery/2023-06/screenshot-20230630-131635-termius.jpg) 콘솔 접속 확인을 위해 위 IP주소 및 포트 번호로 접속을 하면, [![image.png](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/K0Vimage.png)](http://138.2.116.150/uploads/images/gallery/2023-06/K0Vimage.png) 초기 비밀번호와 계정 ID는 설치 완료시 기본적으로 받은 정보로 통해 최초 로그인을 실행 한다. 로그인 시 바로 새로운 패스워드를 입력 하라는 창이 나온다 [![image.png](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/uRRimage.png)](http://138.2.116.150/uploads/images/gallery/2023-06/uRRimage.png) 패스워드 변경 후 아래와 같은 화면을 볼 수 있다. [![image.png](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/uXSimage.png)](http://138.2.116.150/uploads/images/gallery/2023-06/uXSimage.png) 여기서 좌측 상단에 있는 'Platform'을 선택 하여 'Cluster Management' 메뉴를 클릭 시 현재 쿠버네티스 클러스터의 현황을 볼 수 있다. [![image.png](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/3DBimage.png)](http://138.2.116.150/uploads/images/gallery/2023-06/3DBimage.png) [![image.png](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/ldximage.png)](http://138.2.116.150/uploads/images/gallery/2023-06/ldximage.png) ### 클러스터의 모든 노드의 정보도 확인 가능 하다 [![image.png](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/IfFimage.png)](http://138.2.116.150/uploads/images/gallery/2023-06/IfFimage.png) ### 그 외 파드들의 작동 여부도 확인 가능 하다 [![image.png](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/5Acimage.png)](http://138.2.116.150/uploads/images/gallery/2023-06/5Acimage.png) 초반에 생성한 StorageClass와 연관된 PVC들의 정보도 볼 수 있다 [![image.png](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/LNXimage.png)](http://138.2.116.150/uploads/images/gallery/2023-06/LNXimage.png) Prometheus 파드들이 각 PV를 claim하고 있는 것을 확인 할 수 있다 [![image.png](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/X2Kimage.png)](http://138.2.116.150/uploads/images/gallery/2023-06/X2Kimage.png) ### 그 외 KubeSphere 데시보드상 간단한 Monitoring과 로깅 정보도 볼 수 있다 [![image.png](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/b6Oimage.png)](http://138.2.116.150/uploads/images/gallery/2023-06/b6Oimage.png) ### ### ##### **KubeSphere 설치 도중 발생한 ERROR 과 조치** **1. 버전 호환성 문제** KubeSphere는 현재 쿠버네티스 버전 1.24 까지 호환 가능 하며, 초반에 Kubesphere를 설치 한 클러스터는 v1.26이였기 때문에 'monitoring task status'는 매번 'failed'이라고 나왔다 [![image.png](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/Qfmimage.png)](http://138.2.116.150/uploads/images/gallery/2023-06/Qfmimage.png) KubeSphere 설치는 완료 되지만 Prometheus 파드들은 계속 Pending 상태에 존재 한다![image.png](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/t7dimage.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](http://138.2.116.150/uploads/images/gallery/2023-06/scaled-1680-/QQKimage.png)](http://138.2.116.150/uploads/images/gallery/2023-06/QQKimage.png)