개인 서버에 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 값이후 Server 쪽에서 Node 를 조회해보면 정상적으로 잡혀있는게 보인다.
1
curl -sfL https://get.k3s.io | K3S_URL={URL} K3S_TOKEN={TOKEN} sh -
1
kubectl get node
ArgoCD 설치
기존엔 manifest 파일을 git 에 저장하고, 관련 리소스를 bastion 서버에 두고 apply 하는 방식으로 운영을 했었다.
이번엔 Gitops
를 한번 적용해보고자, ArgoCD 의 적용을 생각하고 있어서 설치를 진행했다.
ArgoCD 는 K8S 내에 설치를 했다.
1 | kubectl create namespace argocd |
설치 후 접근을 위한 ingress 가 별도로 있지 않아서 Service 에서 type 을 Node Port 로 변경하고 포트를 지정했다.
그리고 NPM
에서 해당 포트를 도메인과 연결해서 proxy 하도록 설정했다.
UI 에 정상 접근되는것을 확인한 뒤, 로그인을 위한 Password 를 얻어 비밀번호를 변경했다.
메뉴얼상 Secret 에 있는 password 는 단순한 initialize 과정에서만 사용되는 값으로, 변경 이후 삭제하는게 좋다고 하여 삭제를 진행했다.
1 | kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d |
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 과정 중에서 제대로 적용이 되지 않는 등의 문제가 있는데
이 글과는 별개의 내용이라 다른 포스트로 작성을 하는게 좋을것 같다.