Kubespray를 사용하여 kubernetes 클러스터 구축하기

gclee·2025년 8월 11일

Kubernetes

목록 보기
7/7
post-thumbnail

목표 아키텍처

  • 서버 3대 (Ubuntu 22.04)
    • 192.168.0.201 → k8s-master (control-plane + etcd)
    • 192.168.0.202 → k8s-worker1
    • 192.168.0.203 → k8s-worker2

1) 모든 노드에서 공통으로 해야 할 준비

1-1. /etc/hosts 설정 (모든 노드)

192.168.0.201   k8s-master
192.168.0.202   k8s-worker1
192.168.0.203   k8s-worker2
  • 각 노드가 서로를 호스트명으로 해석할 수 있게 로컬 DNS 엔트리 추가.

1-2. sudo 비밀번호 없이 실행 설정 (모든 노드)

각 노드에서:

sudo visudo

아래 줄 추가 (user는 실제 계정명):

user ALL=(ALL) NOPASSWD:ALL

또는:

echo "user ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/user
sudo chmod 440 /etc/sudoers.d/user
  • Ansible 플레이북 실행 시 비밀번호를 묻지 않게 하여 자동화 작업이 끊기지 않도록 합니다.

1-3. 시스템 업데이트 & 필수 패키지 (모든 노드)

sudo apt update && sudo apt upgrade -y
sudo apt install -y python3 python3-pip python3-venv git sshpass # Ansible 타겟에 필요한 python, 편의 도구
sudo swapoff -a                                  # K8s 요건: 스왑 비활성
sudo sed -i '/swap/d' /etc/fstab                 # 재부팅 후에도 스왑 비활성 유지
  • swapoff -a 명령은 메모리 스왑을 비활성화합니다.
  • Kubernetes는 스왑이 켜져 있으면 안정적으로 동작하지 않기 때문에 필수 단계입니다.

2) 마스터 노드에서 배포 준비

별도 배포 호스트를 쓴다면 그 호스트에서 동일하게 진행

2-1. SSH 키 생성 및 배포

ssh-keygen -t rsa -b 4096
ssh-copy-id user@k8s-master
ssh-copy-id user@k8s-worker1
ssh-copy-id user@k8s-worker2
  • 비밀번호 없이 SSH로 접속 하여 Ansible이 자동으로 원격 작업을 수행할 수 있도록 설정.

2-2. Kubespray 다운로드 및 Python 가상환경 준비

git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray

python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt                  # ansible 등 배포에 필요한 파이썬 의존성
  • Kubespray는 Ansible 플레이북 모음. venv로 의존성 격리.

2-3. 인벤토리 구성

샘플 복사:

cp -rfp inventory/sample inventory/mycluster

inventory/mycluster/hosts.yaml 파일 추가

all:
  hosts:
    k8s-master:
      ansible_host: 192.168.0.201
      ip: 192.168.0.201
      ansible_user: user
    k8s-worker1:
      ansible_host: 192.168.0.202
      ip: 192.168.0.202
      ansible_user: user
    k8s-worker2:
      ansible_host: 192.168.0.203
      ip: 192.168.0.203
      ansible_user: user
  children:
    kube_control_plane:
      hosts:
        k8s-master:
    kube_node:
      hosts:
        k8s-worker1:
        k8s-worker2:
    etcd:
      hosts:
        k8s-master:
    k8s_cluster:
      children:
        kube_control_plane:
        kube_node:
    calico_rr:
      hosts: {}
  • ansible_host는 Ansible이 접속할 IP, ip는 노드 내부에서 Kubernetes가 인식하는 IP를 의미합니다.
  • ansible_user는 해당 서버의 실제 계정명을 기입해주세요.

2-4. 클러스터 설치 실행 (k8s-master에서)

ansible-playbook -i inventory/mycluster/hosts.yaml cluster.yml -b -v \
  --private-key=~/.ssh/id_rsa
  • 옵션 설명
    • i inventory/mycluster/hosts.yaml : 대상 노드 정의(인벤토리)
    • cluster.yml : Kubespray 메인 플레이북
    • b : 원격에서 sudo 권한으로 실행(=become)
    • v : 상세 로그(필요 시 vvv로 더 자세히)
    • -private-key : SSH 프라이빗키 지정(기본이 아니면 명시)

3) 설치 후 확인 (control-plane 노드에서)

3-1. kubectl 환경 구성

# 컨트롤 플레인 노드에서 실행 (여기서는 k8s-master)
mkdir -p ~/.kube
sudo cp /etc/kubernetes/admin.conf ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
  • 일반 사용자로 kubectl을 쓰기 위해 kubeconfig를 홈 디렉터리로 복사.

3-2. 상태 점검

kubectl get nodes           # 노드 Ready 여부 확인
kubectl get pods -A         # 모든 네임스페이스 파드 상태 확인
  • 모든 노드가 Ready 상태이고, kube-system 네임스페이스의 파드들이 Running 상태여야 정상입니다.

상태 점검 예시

kubectl get nodes

NAME          STATUS   ROLES           AGE     VERSION
k8s-master    Ready    control-plane   4m17s   v1.33.3
k8s-worker1   Ready    <none>          3m33s   v1.33.3
k8s-worker2   Ready    <none>          3m33s   v1.33.3
kubectl get pods -A

NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-85c5d47cb8-6kfgr   1/1     Running   0          2m23s
kube-system   calico-node-26lch                          1/1     Running   0          2m56s
kube-system   calico-node-849hz                          1/1     Running   0          2m56s
kube-system   calico-node-zs5w9                          1/1     Running   0          2m56s
kube-system   coredns-74697c986-524hn                    1/1     Running   0          2m16s
kube-system   coredns-74697c986-64xcr                    1/1     Running   0          2m9s
kube-system   dns-autoscaler-56cb45595c-89f72            1/1     Running   0          2m14s
kube-system   kube-apiserver-k8s-master                  1/1     Running   0          4m20s
kube-system   kube-controller-manager-k8s-master         1/1     Running   1          4m20s
kube-system   kube-proxy-q5s5b                           1/1     Running   0          3m33s
kube-system   kube-proxy-vrldl                           1/1     Running   0          3m33s
kube-system   kube-proxy-xj8rg                           1/1     Running   0          3m33s
kube-system   kube-scheduler-k8s-master                  1/1     Running   1          4m20s
kube-system   nginx-proxy-k8s-worker1                    1/1     Running   0          3m38s
kube-system   nginx-proxy-k8s-worker2                    1/1     Running   0          3m37s
kube-system   nodelocaldns-7clm4                         1/1     Running   0          2m10s
kube-system   nodelocaldns-7gktk                         1/1     Running   0          2m10s
kube-system   nodelocaldns-m4qc8                         1/1     Running   0          2m10s

4) 대시보드 설치 (NodePort 방식)

4-1. Kubernetes Dashboard 배포

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

4-2. 관리자 계정 생성

dashboard-adminuser.yaml:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

적용:

kubectl apply -f dashboard-adminuser.yaml

4-3. 서비스 타입 변경 (NodePort)

kubectl -n kubernetes-dashboard edit service kubernetes-dashboard

type: ClusterIPtype: NodePort 변경 후 저장


4-4. NodePort 확인

kubectl -n kubernetes-dashboard get svc kubernetes-dashboard

예:

443:32443/TCP

→ 외부 접속 URL:

https://192.168.0.201:32443


4-5. 로그인 토큰 발급

kubectl -n kubernetes-dashboard create token admin-user

→ 대시보드 로그인 시 이 토큰 사용

0개의 댓글