본문 바로가기

학습/시스템

쿠버네티스를 이용해 nextCloud 설치하기

Ubuntu 서버에 쿠버네티스 클러스터 K3s를 이용해 NextCloud를 설치하는 단계별 가이드입니다.

### 요약
이 가이드는 Ubuntu 서버에 K3s를 설치하고, Helm을 사용하여 NextCloud를 설치하는 방법을 설명합니다. K3s는 경량 Kubernetes 배포판으로 설치와 운영이 간편하며, 특히 리소스가 제한된 환경에서 유용합니다. NextCloud는 Helm 차트를 사용하여 간편하게 배포할 수 있습니다.

### 1. 시스템 준비
#### A. 시스템 업데이트
먼저 시스템을 최신 상태로 업데이트합니다:
```bash
sudo apt-get update && sudo apt-get upgrade -y
```

#### B. 필요한 패키지 설치
K3s 설치를 위해 필요한 패키지를 설치합니다:
```bash
sudo apt-get install -y curl
```

### 2. K3s 설치
#### A. 설치 스크립트 사용
K3s는 간단한 설치 스크립트를 통해 쉽게 설치할 수 있습니다:
```bash
curl -sfL https://get.k3s.io | sh -
```

### 3. 설치 확인
K3s가 제대로 설치되었는지 확인합니다:
```bash
sudo kubectl get nodes
```
이 명령어를 실행하면 현재 클러스터에 있는 노드 목록이 표시됩니다.

### 4. K3s 설정 파일
기본적으로 K3s는 `/etc/rancher/k3s/k3s.yaml` 파일에 kubeconfig를 저장합니다. 로컬 kubectl에서 사용하려면 다음 명령어를 사용하여 환경 변수를 설정할 수 있습니다:
```bash
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
```

### 5. kubectl 명령어 설치 (선택 사항)
kubectl 명령어를 쉽게 사용할 수 있도록 별칭을 설정합니다:
```bash
sudo ln -s /usr/local/bin/kubectl /usr/bin/kubectl
```

### 6. 노드 추가 (선택 사항)
다른 노드를 클러스터에 추가하려면, 마스터 노드에서 실행한 설치 명령어의 결과로 얻은 토큰을 사용하여 추가 노드에서 다음 명령어를 실행합니다:
```bash
curl -sfL https://get.k3s.io | K3S_URL=https://<MASTER_NODE_IP>:6443 K3S_TOKEN=<TOKEN> sh -
```
여기서 `<MASTER_NODE_IP>`는 마스터 노드의 IP 주소이고, `<TOKEN>`은 마스터 노드에서 생성된 토큰입니다.

### 7. NextCloud 설치
K3s 클러스터에 NextCloud를 설치하려면 Helm을 사용하여 차트를 배포할 수 있습니다.

#### A. Helm 설치
Helm을 설치합니다:
```bash
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
```

#### B. NextCloud 차트 저장소 추가
Helm 저장소를 추가합니다:
```bash
helm repo add nextcloud https://nextcloud.github.io/helm/
helm repo update
```

#### C. NextCloud 설치
Helm을 사용하여 NextCloud를 설치합니다:
```bash

sudo chmod 644 /etc/rancher/k3s/k3s.yaml
helm install my-nextcloud nextcloud/nextcloud
```

k3s.yaml에 권한을 부여하고 NextCloud 설치를 진행합니다.
여기서 `my-nextcloud`는 릴리스 이름입니다.

 

추가.

MySQL을 새로운 컨테이너로 생성하여 Nextcloud에서 외부 데이터베이스로 사용하는 방법을 입니다.

이 과정은 Kubernetes 환경에서 Helm을 사용하여 설치하는 것을 기준으로 합니다.

### 1. MySQL Helm 차트 설치

먼저 MySQL을 설치하기 위해 Helm을 사용하여 MySQL Helm 차트를 배포합니다.

```bash
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
```

```bash
helm install my-mysql bitnami/mysql
```

위 명령어는 MySQL을 설치하며, `my-mysql`이라는 이름의 Helm 릴리스를 생성합니다. 이 과정에서 생성된 비밀번호는 자동으로 생성되고, 설치 후에 확인할 수 있습니다.

### 2. MySQL 연결 정보 가져오기

MySQL 데이터베이스의 연결 정보(호스트, 사용자 이름, 비밀번호)를 가져와야 합니다.

```bash
export DB_HOST=$(kubectl get svc my-mysql --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")

export DB_USER=$(kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-user}" | base64 --decode)

export DB_HOST=$(kubectl get svc my-mysql -o jsonpath='{.spec.clusterIP}')

export DB_USER=root
export DB_PASSWORD=$(kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode)
```

위 명령어에서는 `my-mysql` 서비스의 정보를 가져와서 `DB_HOST`, `DB_USER`, `DB_PASSWORD` 변수에 할당합니다.

### 3. Nextcloud Helm 차트 설치 및 설정

Nextcloud를 설치하고 MySQL을 외부 데이터베이스로 설정합니다.

```bash
export APP_PASSWORD=$(kubectl get secret --namespace default son1004007-nextcloud -o jsonpath="{.data.nextcloud-password}" | base64 --decode)

 

helm upgrade son1004007-nextcloud nextcloud/nextcloud \
  --set nextcloud.password=$APP_PASSWORD,nextcloud.host=son1004007-nextcloud,nextcloud.adminPassword=$APP_PASSWORD,service.type=ClusterIP,mariadb.enabled=false,externalDatabase.host=$DB_HOST,externalDatabase.user=$DB_USER,externalDatabase.password=$DB_PASSWORD
```


위 명령어에서는 `son1004007-nextcloud`라는 Nextcloud Helm 릴리스를 업그레이드하고, MySQL 외부 데이터베이스를 사용하도록 설정합니다. 필요에 따라 `nextcloud.password`와 `nextcloud.adminPassword`를 적절히 설정합니다.

### 4. 설치 확인

설치가 완료되면 Nextcloud가 정상적으로 배포되었는지 확인합니다.

```bash
helm status son1004007-nextcloud
```

위 명령어는 설치된 차트의 상태와 관련된 정보를 보여줍니다.

 

son1004007@son1004007-All-Series:~$ helm status son1004007-nextcloud
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
NAME: son1004007-nextcloud
LAST DEPLOYED: Sun Jun 23 23:28:15 2024
NAMESPACE: default
STATUS: deployed
REVISION: 5
TEST SUITE: None
NOTES:
1. Get the nextcloud URL by running:

  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=nextcloud" -o jsonpath="{.items[0].metadata.name}")
  echo http://127.0.0.1:8080/
  kubectl port-forward --namespace default $POD_NAME 8080:80

nohup kubectl port-forward --namespace default $POD_NAME 8080:80 > port-forward.log 2>&1 &

nohup 으로 로그 남기고, 백그라운드에서 실행시키도록 명령어 수정함

2. Get your nextcloud login credentials by running:

  echo User:     admin
  echo Password: $(kubectl get secret --namespace default son1004007-nextcloud -o jsonpath="{.data.nextcloud-password}" | base64 --decode)
son1004007@son1004007-All-Series:~$ 

 

 

 

추가.

공인IP 접근이 되지 않았다. 이유는 Node IP가 아니라 clusterIP로 타입이 선언되서 공인IP접근이 되지 않았다.

 

NextCloud 서비스를 NodePort로 변경:

kubectl patch svc son1004007-nextcloud -p '{"spec": {"type": "NodePort"}}'

 

NodePort 서비스의 포트 확인:

kubectl get svc son1004007-nextcloud

son1004007@son1004007-All-Series:~$ kubectl get svc son1004007-nextcloud
NAME                   TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
son1004007-nextcloud   NodePort   10.43.124.242   <none>        8080:32642/TCP   88m

 

 

http://공인IP:32642
로 접근해서 nextCloud 웹 접근을 확인함.

 

신뢰하지 않는 도메인으로 접근

시스템 관리자에게 연락하십시오. 만약 시스템 관리자라면 config/config.php의 "trusted_domains" 설정을 config.sample.php를 참조하여 편집하십시오.

 

설정하는 방법에 대한 정보는 문서에서 찾을 수 있습니다.

 

라고 출력되서 추후 진행 예정