일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- fusion360
- SQLITE3
- esp32
- Hypercube
- 자작
- 라즈베리파이
- ESP
- 3D 프린터
- 코딩테스트
- 프로젝트
- C++
- 3D
- 오픈소스
- C언어
- 아두이노
- 프린터
- Arduino
- 퓨전360
- 오픈소스 하드웨어
- ESP-IDF
- 3D Printer
- 설계
- 해커랭크
- IOT
- Fusion 360
- 리눅스
- 쏘카
- 3d프린터
- 하드웨어
- DIY
- Today
- Total
09LABS
[DevOps] 홈서버에 Kubernetes + ArgoCD + Ingress Nginx를 구축해보자 본문
회사에서 DevOps 업무를 진행하다보니 집에서도 연습을 할 필요성을 느껴서 지난번에 구매한 NAS에
Kubernetes를 설치해보기로 했다. Docker를 미리 설치해두었고 Kubernetes를 on-premise 환경에 구축하는 것은
상당히 어렵기 때문에 경량 Kubernetes인 k3d를 사용했다.
그리고 아래 내용을 반영하여 서비스 배포까지 고려하여 환경을 구축했다.
- Ingress Nginx : traefik 대신 Ingress Controller로 사용
- ArgoCD : helm chart로 만든 서비스를 지속적으로 배포하기 위해 사용
사전에 OMV NAS에 미리 Docker를 설치하고 진행하는 점을 감안해야 한다.
그럼 시-작
K3D 설치 후 클러스터 생성
$ wget -q -O - https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
위 명령어를 입력하면 k3d를 자동으로 설치해준다.
# k9s 설치
$ wget https://github.com/derailed/k9s/releases/latest/download/k9s_linux_amd64.deb && apt install ./k9s_linux_amd64.deb && rm k9s_linux_amd64.deb
# kubectl 설치
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
# kubectl 실행권한 부여 후 디렉토리 이동
$ chmod +x kubectl
$ sudo mv kubectl /usr/local/bin
이후 관리의 편의성을 위해 kubectl과 k9s를 설치해줬다.
그 다음 클러스터 생성은 k3d 명령어를 사용하여 생성했다.
$ k3d cluster create <cluster name> -a <agent number> -s <server number>
위와 같이 실행하면 워커노드와 컨트롤 플레인 노드의 갯수를 지정하여 생성할 수 있다.
여기서 주의해야할 점은 k3d는 기본적으로 traefik을 ingress controller로 사용한다.
따라서 traefik을 비활성화해야 Ingress Nginx 설치 시 Pending 상태로 고정되는 것을 방지할 수 있다.
마지막으로 k3d Load Balancer의 80, 443 포트를 포트포워딩을 통해 외부로 노출시켜야 한다.
On-premise 환경에 설치할 경우 자동으로 80, 443 포트가 노출되지만 k3d는 Docker Container에 클러스터가
생성되기 때문에 Docker Container중 k3d Load balancer에 포트포워딩 설정을 반영해야 한다.
다만, 80, 443을 직접 노출하면 공격 대상이 되기 쉬우므로 60880, 63443과 같이 포트를 변경해서 노출시켰다.
나는 DDNS를 사용하고 있기 때문에 공유기와 Docker Container의 포트포워딩을 아래와 같이 설정했다.
- 공유기 80 포트 -> NAS 60880 -> Docker 80
- 공유기 443 포트 -> NAS 60443 -> Docker 443
최종적으로 클러스터 생성 명령어는 아래와 같이 실행하면 된다.
<cluster name> 은 생성하고 싶은 클러스터 이름으로 설정하면 되고 -a, -s의 숫자는 원하는 워커노드, 컨트롤 플레인 노드
숫자만큼 변경해주면 된다.
--k3s-args "--disable=traefik@server:*"은 traefik을 비활성화하는 옵션이다.
$ k3d cluster create <cluster name> -a 3 -s 1 --k3s-arg "--disable=traefik@server:*" --port 60880:80@loadbalancer --port 60443:443@loadbalancer
클러스터 생성 완료 후 k9s 명령어를 실행하면 위와 같이 클러스터가 정상적으로 생성된 것을 알 수 있다.
(argocd, ingress-nginx 설치 후에 캡쳐)
Helm 설치하기
Helm 공식문서 : https://helm.sh/docs/intro/install/#from-apt-debianubuntu
$ curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
$ sudo apt-get install apt-transport-https --yes
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
$ sudo apt-get update
$ sudo apt-get install helm
Helm Chart로 어플리케이션들을 배포하기 전에 Helm을 설치해줬다.
공식 문서를 참고하면 OS별로 설치 방법이 나와있다. OMV NAS는 Debian 기반이라서 Debian/Ubuntu 섹션을 참고했다.
Ingress Nginx 설치하기
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo update
$ helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace
1. ingress nginx repo 추가
2. helm repo update
3. ingress nginx 설치
위 순서로 진행하면 k3d 클러스터에 ingress-nginx가 설치되고 아래와 같이 Load Balancer로 배포가 된다.
ArgoCD 설치하기
이번에 가장 많이 삽질을 한 부분이 ArgoCD 설치이다.
기존에는 /etc/hosts에 도메인을 추가하고 공유기 IP 주소로 접근하도록 만들었었는데 공유기 DDNS로 접속하게 하려니
공유기의 도메인이 test.tplink.com과 같이 서브도메인이 이미 설정된 상태로 제공이 되었다.
직장동료에게 물어보니 Helm Chart에서 ingress 설정에 root path를 별도로 지정하면 도메인의 하위 경로로
접속이 가능하게 배포가 가능하다고 했다.
$ helm repo add argo https://argoproj.github.io/argo-helm
$ helm repo update
$ helm pull argo/argo-cd
우선 ArgoCD repo추가 후 Helm Chart를 다운로드 했다.
Helm Chart에서 values.yaml에 직접 수정하지 않고 values-override.yaml 파일을 생성해서 필요한 값만 추가했다.
global:
domain: "test.tplinkrouter.com"
configs:
params:
server.insecure: true
server:
ingress:
enabled: true
hostname: "test.tplinkrouter.com"
ingressClassName: "nginx"
annotations:
nginx.ingress.kubernetes.io/backend-protocol: HTTP
extraArgs:
- --insecure
- --rootpath=/argocd
위와 같이 설정하면 test.tplinkrouter.com/argocd 와 같은 형태로 서브도메인은 공유기 DDNS에서 제공하는
도메인을 사용하고 하위 경로인 argocd로 접근이 가능하게 된다.
$ helm install argocd . -f ./values-override.yaml --namespace=argocd --create-namespace
마지막으로 다운받은 ArgoCD helm chart 디렉토리로 이동해서 values-override.yaml 파일에 위에서 작성한 코드를
붙여넣고 helm install 명령어로 ArgoCD를 설치해주었다.
$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
설치 완료 후 가장 마지막에 위 명령어를 입력하라고 뜨는데 Admin 계정의 초기 비밀번호이다.
ID : admin
Password : 위 명령어로 나온 결과를 입력
이렇게해서 K3D Cluster 생성, Ingress Nginx 설치, ArgoCD 설치까지 완료했다.
다음 포스팅에서는 ArgoCD에 Application을 생성하고 Repository 연동까지 해볼 예정이다.
'Linux' 카테고리의 다른 글
[Linux] FTP 서버 구축하기, 간단한 설정 (0) | 2021.03.31 |
---|