# 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는 클러스터 컴퓨팅에서 다른 노드와의 통신을 위한 최종 사용자 포털/게이트웨이 역할을 하는 노드이다.
- 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참고 : 디스크 파티션 및 파일 시스템을 잘못 구성하였을 경우 초기화 작업 진행 wipefs -a /dev/vdb wipefs -a /dev/vdc
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 ``` 설치 작업이 완료 되면 아래와 같은 화면을 확인 할 수 있다 [](http://138.2.116.150/uploads/images/gallery/2023-06/screenshot-20230630-131635-termius.jpg) 콘솔 접속 확인을 위해 위 IP주소 및 포트 번호로 접속을 하면, [](http://138.2.116.150/uploads/images/gallery/2023-06/K0Vimage.png) 초기 비밀번호와 계정 ID는 설치 완료시 기본적으로 받은 정보로 통해 최초 로그인을 실행 한다. 로그인 시 바로 새로운 패스워드를 입력 하라는 창이 나온다 [](http://138.2.116.150/uploads/images/gallery/2023-06/uRRimage.png) 패스워드 변경 후 아래와 같은 화면을 볼 수 있다. [](http://138.2.116.150/uploads/images/gallery/2023-06/uXSimage.png) 여기서 좌측 상단에 있는 'Platform'을 선택 하여 'Cluster Management' 메뉴를 클릭 시 현재 쿠버네티스 클러스터의 현황을 볼 수 있다. [](http://138.2.116.150/uploads/images/gallery/2023-06/3DBimage.png) [](http://138.2.116.150/uploads/images/gallery/2023-06/ldximage.png) ### 클러스터의 모든 노드의 정보도 확인 가능 하다 [](http://138.2.116.150/uploads/images/gallery/2023-06/IfFimage.png) ### 그 외 파드들의 작동 여부도 확인 가능 하다 [](http://138.2.116.150/uploads/images/gallery/2023-06/5Acimage.png) 초반에 생성한 StorageClass와 연관된 PVC들의 정보도 볼 수 있다 [](http://138.2.116.150/uploads/images/gallery/2023-06/LNXimage.png) Prometheus 파드들이 각 PV를 claim하고 있는 것을 확인 할 수 있다 [](http://138.2.116.150/uploads/images/gallery/2023-06/X2Kimage.png) ### 그 외 KubeSphere 데시보드상 간단한 Monitoring과 로깅 정보도 볼 수 있다 [](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'이라고 나왔다 [](http://138.2.116.150/uploads/images/gallery/2023-06/Qfmimage.png) 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 관련 모든 파드들의 상태를 확인: [](http://138.2.116.150/uploads/images/gallery/2023-06/QQKimage.png)