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