k8s-master (control-plane + etcd)k8s-worker1k8s-worker2192.168.0.201 k8s-master
192.168.0.202 k8s-worker1
192.168.0.203 k8s-worker2
각 노드에서:
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
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 명령은 메모리 스왑을 비활성화합니다.별도 배포 호스트를 쓴다면 그 호스트에서 동일하게 진행
ssh-keygen -t rsa -b 4096
ssh-copy-id user@k8s-master
ssh-copy-id user@k8s-worker1
ssh-copy-id user@k8s-worker2
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 등 배포에 필요한 파이썬 의존성
샘플 복사:
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는 해당 서버의 실제 계정명을 기입해주세요.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 프라이빗키 지정(기본이 아니면 명시)# 컨트롤 플레인 노드에서 실행 (여기서는 k8s-master)
mkdir -p ~/.kube
sudo cp /etc/kubernetes/admin.conf ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
kubectl을 쓰기 위해 kubeconfig를 홈 디렉터리로 복사.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
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
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
kubectl -n kubernetes-dashboard edit service kubernetes-dashboard
type: ClusterIP → type: NodePort 변경 후 저장
kubectl -n kubernetes-dashboard get svc kubernetes-dashboard
예:
443:32443/TCP
→ 외부 접속 URL:
https://192.168.0.201:32443
kubectl -n kubernetes-dashboard create token admin-user
→ 대시보드 로그인 시 이 토큰 사용
