k3s 클러스터 기본 세팅

k3s 클러스터를 새로 구성할 때 진행하는 기본 세팅 절차를 정리합니다.


사전 체크리스트

  • Private 망 여부 확인
  • 볼륨 마운트 구성 계획 확인
  • 방화벽 포트 오픈 여부 확인

1. Hosts 설정

sudo vi /etc/hosts
# <IP> <hostname> 형식으로 추가

2. k3s Server 설치

2-1) 볼륨 마운트 경로 사전 구성

기본 경로 대신 별도 디렉토리를 사용할 경우 설치 전에 먼저 생성합니다.

sudo mkdir -p /sw/k3s/agent
sudo mkdir -p /containerd
sudo mkdir -p /etc/rancher/k3s

config 파일로 설정하는 방법:

sudo vi /etc/rancher/k3s/config.yaml
data-dir: /sw/k3s
kubelet-arg:
  - "root-dir=/sw/k3s/agent/kubelet"

2-2) 설치 명령어

curl -sfL https://get.k3s.io | \
  INSTALL_K3S_SKIP_SELINUX_RPM=true \
  INSTALL_K3S_EXEC='server \
    --write-kubeconfig-mode=644 \
    --disable=traefik \
    --data-dir=/sw/k3s \
    --kubelet-arg=root-dir=/sw/kubelet \
    --tls-san=<SERVER_IP>' sh -

주요 옵션 설명:

  • server: control-plane 노드로 실행
  • --write-kubeconfig-mode=644: kubeconfig 파일을 일반 사용자도 읽을 수 있도록 권한 설정
  • --disable=traefik: 기본 Ingress Controller 비활성화 (Istio 사용 전제)
  • --data-dir: 데이터 저장 경로 변경
  • --tls-san: 클러스터 접근에 사용할 IP/도메인 추가

2-3) 설치 상태 확인

systemctl status k3s --no-pager
kubectl get nodes -o wide
kubectl get pods -A

3. Worker Node 연결

3-1) Join Token 확인 (마스터 노드에서)

cat /var/lib/rancher/k3s/server/node-token

3-2) Worker Node Join

기본 환경:

curl -sfL https://get.k3s.io | \
  K3S_URL=https://<SERVER_IP>:6443 \
  K3S_TOKEN=<NODE_TOKEN> sh -

Private 망 환경:

curl -sfL https://get.k3s.io | \
  INSTALL_K3S_SKIP_SELINUX_RPM=true \
  INSTALL_K3S_TYPE=agent \
  K3S_URL=https://<SERVER_IP>:6443 \
  K3S_TOKEN=<NODE_TOKEN> sh -

4. NodeHosts 설정

DB 서버 등 내부 호스트를 클러스터 내에서 이름으로 접근해야 할 경우 아래처럼 설정합니다.

4-1) 마스터 노드 (CoreDNS 수정)

kubectl -n kube-system edit configmap coredns

data.NodeHosts 블록 아래에 추가:

<DB_HOST_IP> k3s-host

4-2) 워커 노드 (/etc/hosts 수정)

sudo vi /etc/hosts
# <HOST_IP> k3s-host 추가

sudo systemctl restart k3s-agent

5. Private Registry 설정 (Insecure)

Private Registry를 HTTP 또는 자체 서명 인증서로 운영할 경우 아래처럼 설정합니다.

5-1) Docker

sudo vi /etc/docker/daemon.json
{
  "insecure-registries": ["<REGISTRY_HOST>:<PORT>"]
}
sudo systemctl restart docker.service

5-2) k3s

sudo vi /etc/rancher/k3s/registries.yaml
mirrors:
  "<REGISTRY_HOST>:<PORT>":
    endpoint:
      - "http://<REGISTRY_HOST>:<PORT>"

configs:
  "<REGISTRY_HOST>:<PORT>":
    auth:
      username: <REGISTRY_USER>
      password: <REGISTRY_PASSWORD>
    tls:
      insecure_skip_verify: true

5-3) k3d

docker exec -it <k3d_container> vi /etc/rancher/k3s/registries.yaml

내용은 k3s 설정과 동일한 형식으로 작성합니다.


6. 이하 마스터 노드에서만 진행

6-1) MetalLB 설치

LoadBalancer 타입 서비스를 클러스터 내에서 사용하기 위한 로드밸런서입니다.

kubectl create ns metallb-system
helm repo add metallb https://metallb.github.io/metallb
helm repo update
helm install metallb metallb/metallb --version 0.15.2 -n metallb-system \
  --set controller.securityContext.allowPrivilegeEscalation=false \
  --set speaker.securityContext.allowPrivilegeEscalation=false \
  --set speaker.hostNetwork=true \
  --set speaker.tolerateMaster=true \
  --set prometheus.metricsPort=7472

kubectl apply -f address-pool.yaml
kubectl get pods -A
kubectl get svc -A

6-2) Istio 설치

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.27.3 sh -
cd istio-1.27.3
export PATH=$PWD/bin:$PATH
istioctl install --set profile=default -y

앱 네임스페이스 생성 및 sidecar 자동 주입 설정:

kubectl create ns apps
kubectl label ns apps istio-injection=enabled

6-3) ArgoCD 설치

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

kubectl apply -f argocd-gateway.yaml
kubectl apply -f argocd-vs.yaml

초기 admin 비밀번호 확인:

kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d && echo

This site uses Just the Docs, a documentation theme for Jekyll.