DGX 호스트에 Kubernetes용 VM 8대 생성.
- LB 2대
- control-plane 3대
- worker 3대
VM 생성 스크립트와 Ansible 사용.
사용한 파일:
inventory.ini
k8s-lb-setup.yml
k8s-common-setup.yml
kubeadm-init-k8s-cp1.yaml
LB에 HAProxy와 Keepalived 구성.
# Kubernetes API VIP용 HAProxy와 Keepalived를 구성한다.
cd /home/ioniere/ansible
ansible-playbook -i inventory.ini k8s-lb-setup.yml
# LB 상태를 확인한다.
for h in 192.168.200.40 192.168.200.41; do
ssh ubuntu@$h "ip -4 -brief addr show enp1s0; systemctl is-active haproxy keepalived"
done
Kubernetes 노드 공통 설정 적용.
# containerd와 Kubernetes 패키지 등 노드 공통 설정을 적용한다.
cd /home/ioniere/ansible
ansible-playbook -i inventory.ini k8s-common-setup.yml
첫 번째 control-plane 구성.
# kubeadm 설정 파일을 cp1로 복사한다.
scp /home/ioniere/scripts/kubeadm-init-k8s-cp1.yaml \
[email protected]:/home/ubuntu/kubeadm-init.yaml
# 필요한 이미지를 먼저 받는다.
ssh [email protected] "
sudo kubeadm config images pull --config /home/ubuntu/kubeadm-init.yaml
"
# cp1에서 클러스터를 초기화한다.
ssh [email protected] "
set -e
sudo install -m 600 -o root -g root /dev/null /root/kubeadm-init.log
sudo sh -c 'kubeadm init --config /home/ubuntu/kubeadm-init.yaml --upload-certs > /root/kubeadm-init.log 2>&1'
"
Flannel 설치 후 나머지 control-plane과 worker를 클러스터에 join.
# Flannel CNI를 설치한다.
kubectl apply -f https://github.com/flannel-io/flannel/releases/download/v0.28.4/kube-flannel.yml
kubectl -n kube-flannel rollout status daemonset/kube-flannel-ds --timeout=180s
# 전체 노드 상태를 확인한다.
kubectl get nodes -o wide
MetalLB 설치.
# MetalLB를 설치한다.
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml
# MetalLB 상태를 확인한다.
kubectl -n metallb-system get pods -o wide
MetalLB IP 범위 설정.
cat <<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: dgx-lan-pool
namespace: metallb-system
spec:
addresses:
- 192.168.200.49-192.168.200.69
autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: dgx-lan-l2advert
namespace: metallb-system
spec:
ipAddressPools:
- dgx-lan-pool
EOF
ingress-nginx 설치 후 Ingress VIP를 192.168.200.49로 고정.
# ingress-nginx를 설치한다.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.15.1/deploy/static/provider/cloud/deploy.yaml
# Ingress VIP를 고정한다.
kubectl -n ingress-nginx patch service ingress-nginx-controller \
--type merge \
-p '{"spec":{"loadBalancerIP":"192.168.200.49","externalTrafficPolicy":"Local"}}'
# 최종 상태를 확인한다.
kubectl get nodes -o wide
kubectl -n metallb-system get pods
kubectl -n ingress-nginx get svc,pods -o wide댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 19 | DGX Kubernetes 구성 계획 | 김영훈 | 2026.06.08 | 25 |
| » | Kubernetes 기본 클러스터, ingress-nginx 설치 | 김영훈 | 2026.06.09 | 15 |
| 17 | Docker Compose 서비스를 Kubernetes로 이전(깃랩 도커 저장소 필요) [2] | 김영훈 | 2026.06.10 | 20 |
| 16 | yeonghoon.kim 배포 파일을 Helm Chart로 전환 [1] | 김영훈 | 2026.06.12 | 18 |
| 15 | SOPS age로 Kubernetes Secret 암복호화 | 김영훈 | 2026.06.15 | 23 |
| 14 | ArgoCD와 GitOps 구조 준비 | 김영훈 | 2026.06.16 | 16 |
| 13 | CoreDNS로 GitLab Registry 내부 주소 고정 | 김영훈 | 2026.06.17 | 19 |
| 12 | 복구 런북 초반 누락 사항 정리 | 김영훈 | 2026.06.17 | 15 |
| 11 | SOPS Secret 복구와 ArgoCD root Application 적용 | 김영훈 | 2026.06.18 | 28 |
| 10 | 관측 스택과 앱 배포 저장소 구조 정리 | 김영훈 | 2026.06.19 | 23 |
| 9 | ArgoCD 복구 중 GitLab 접근 문제 정리 | 김영훈 | 2026.06.22 | 26 |
| 8 | ImagePullBackOff와 registry pull secret 누락 | 김영훈 | 2026.06.22 | 17 |
| 7 | worker 재부팅 전 drain 절차 정리 | 김영훈 | 2026.06.26 | 20 |
| 6 | control-plane 장애 시나리오 관찰 | 김영훈 | 2026.06.27 | 12 |
| 5 | OutOfSync와 Degraded 구분하기 | 김영훈 | 2026.06.28 | 25 |
| 4 | Git revert는 기록을 지우는 게 아니라 되돌리는 기록을 남기는 것 | 김영훈 | 2026.06.29 | 19 |
| 3 | Stateful과 Stateless 구분해보기 | 김영훈 | 2026.07.02 | 23 |
| 2 | GitLab Registry PAT 만료로 이미지 Pull 실패 | 김영훈 | 2026.07.08 | 14 |
| 1 | yeonghoon.kim php 업그레이드 | 김영훈 | 2026.07.09 | 0 |