개인 서버에 K8S 환경 구축하기

환경 구성

가상화 Hypervisor ESXi 위에 3대의 Ubuntu 서버를 구성했다.

  • Bastion & Master * 1 EA
  • Node * 2 EA

위 Bastion & Master 서버에는 K3S Server 로 구동, Node 에는 K3S Agent 로 구성되어있다.

NPM 은 Node Package Manager 가 아니고 Nginx Proxy Manager 이다.
ESXi 위에 Ubuntu 말고도 개인용으로 사용하는 NAS 가 있어서, Revers proxy 를 설정하기 위해 구성하였다.
직접 Nginx 를 설정할수도 있지만 간단하게 설정이 가능해서 적용을 했는데 꽤 괜찮은것 같아 계속 사용하고 있다.

K3S 설치

우선 Ubuntu server 20.04 이미지로 설치한 서버에 Master 용도 하나, Node 용도 2개 설치를 진행했다.

Server(Master) 설치

K3S Server 는 생각보다 간단하다.
K3S Install guide 에 나오는 설치 방법으로 진행하면 바로 Server 모드로 설치가 된다.

1
curl -sfL https://get.k3s.io | sh -

설치 이후 Agent 들에서 Cluster 에 접근하기 위한 Token 정보를 얻어야 한다.

1
sudo cat /var/lib/rancher/k3s/server/token

여기서 나온 값은 아래 Agent 설치 단계에서 사용해야 한다.

Agent(Node) 설치

Node 설치는 위와 같은 스크립트를 사용하지만 환경변수를 몇개 입력한 채로 실행해야 한다.

  • K3S_URL : Server 의 API URL (https://{IP}:6443)
  • K3S_TOKEN : 위 단계에서 복사했던 Server 의 Token 값
    1
    curl -sfL https://get.k3s.io | K3S_URL={URL} K3S_TOKEN={TOKEN} sh -
    이후 Server 쪽에서 Node 를 조회해보면 정상적으로 잡혀있는게 보인다.
    1
    kubectl get node

ArgoCD 설치

기존엔 manifest 파일을 git 에 저장하고, 관련 리소스를 bastion 서버에 두고 apply 하는 방식으로 운영을 했었다.
이번엔 Gitops 를 한번 적용해보고자, ArgoCD 의 적용을 생각하고 있어서 설치를 진행했다.

ArgoCD 는 K8S 내에 설치를 했다.

1
2
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

설치 후 접근을 위한 ingress 가 별도로 있지 않아서 Service 에서 type 을 Node Port 로 변경하고 포트를 지정했다.
그리고 NPM 에서 해당 포트를 도메인과 연결해서 proxy 하도록 설정했다.

UI 에 정상 접근되는것을 확인한 뒤, 로그인을 위한 Password 를 얻어 비밀번호를 변경했다.
메뉴얼상 Secret 에 있는 password 는 단순한 initialize 과정에서만 사용되는 값으로, 변경 이후 삭제하는게 좋다고 하여 삭제를 진행했다.

1
2
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
kubectl -n argocd delete secret argocd-initial-admin-secret

K8S Manifest 생성을 위한 cdk8s 구성

Manifest 를 직접 구성하는것도 생각을 해봤지만, 오랫동안 손놓았던 Typescript 도 익숙해질 겸, 최신 기술도 써볼 겸 cdk8s 사용 하기로 했다.
Install guide 를 보니 npm (여기서는 Node Package Manager…) 을 통해 global 설치를 하는데, 최대한 global 설치를 하지 않는 나는 그냥 npx 를 사용했다.

1
npx cdk8s-cli init typescript-app

ArgoCD 를 연동하기 위해선 Repository 가 하나 필요한데, cdk8s 를 설정한 Repository 에서 빌드를 하게 되면 dist 폴더가 생기게 된다.
나는 복잡한 구성 없이 해당 폴더를 바로 사용하기로하여, .gitignore 를 수정하여 push 를 진행했다.

ArgoCD 설정

Repository 연결

Settings > Repository 에서 Repository 설정을 해야한다.
나는 Github HTTP 방식으로 연결을 했다.
Github 에서 Access Token 을 ArgoCD 용으로 하나 발급받아 연결을 했다.

연결 후 ArgoCD 에서 New App 을 누르고 필요한 정보를 입력했다.

App 생성

New APP 을 통해 이름을 작성하고, 프로젝트는 default 로 놓았다.
Destination 쪽 Cluster 는 같은 클러스터를 대상으로 하기 때문에, 기본적으로 설정이 가능하다.
Namespace 는 따로 설정을 안해봤는데, 그럴 경우 일부 동작이 좀 이상하게 있는 부분이 있어 test 로 지정했다.

이후로 cdk8s 에서 synth 를 하고 나온 dist 폴더를 commit 하니 ArgoCD 에서 이를 인식하고 sync 하는 과정이 생겼다.
일부 sync 과정 중에서 제대로 적용이 되지 않는 등의 문제가 있는데
이 글과는 별개의 내용이라 다른 포스트로 작성을 하는게 좋을것 같다.

댓글