본문 바로가기

리눅스

[draft] MetalLB를 설치하고 설정하여 Kubernetes 클러스터에서 LoadBalancer 서비스를 테스트하는 방법

728x90

MetalLB를 설치하고 설정하여 Kubernetes 클러스터에서 LoadBalancer 서비스를 테스트하는 방법

MetalLB를 설치하고 설정한 후 실제로 LoadBalancer 서비스를 배포하여 MetalLB가 제대로 작동하는지 확인하는 방법입니다.

테스트 환경

kubectl get nodes -o custom-columns="NAME:.metadata.name,STATUS:.status.conditions[-1].type,ROLES:.metadata.labels['kubernetes\.io/role'],AGE:.metadata.creationTimestamp,VERSION:.status.nodeInfo.kubeletVersion,INTERNAL-IP:.status.addresses[0].address,EXTERNAL-IP:.status.addresses[1].address"
control-plane   Ready    <none>   2024-08-21T00:20:43Z   v1.30.4   192.168.0.131   control-plane
k8s-worker1     Ready    <none>   2024-08-21T00:46:43Z   v1.30.4   192.168.0.112   k8s-worker1
k8s-worker2     Ready    <none>   2024-08-21T02:08:25Z   v1.30.4   192.168.0.121   k8s-worker2
k8s-worker3     Ready    <none>   2024-08-27T05:47:12Z   v1.30.4   192.168.0.141   k8s-worker3

ARP 모드 활성화

kube-proxy 구성 편집

  • ipvs.strictARP : true(false -> true)
kubectl edit configmap -n kube-system kube-proxy
    mode: ""
...
    ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: false
    mode: "ipvs"
...
    ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: true

ARP(strictARP) 모드 확인

kubectl get configmap kube-proxy -n kube-system -o yaml | grep strictARP

MetalLB 설치

기존 CRD 삭제

kubectl delete crd bfdprofiles.metallb.io

1. 매니페스트를 사용한 MetalLB 설치

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml

2. IP 주소 풀 설정

MetalLB가 사용할 IP 주소 풀을 설정하기 위해 ConfigMap을 생성합니다. 이 ConfigMap은 MetalLB가 클러스터의 노드에서 사용할 IP 주소 범위를 정의합니다.

192.168.0.241-192.168.0.250 범위는 MetalLB가 LoadBalancer 서비스에 할당할 IP 주소를 정의합니다. 이 범위는 클러스터 네트워크와 일치해야 합니다.

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default-pool
      protocol: layer2
      addresses:
      - 192.168.0.241-192.168.0.250
EOF

3. L2Advertisement 설정

MetalLB가 Layer 2 모드에서 IP 주소를 광고하도록 L2Advertisement를 설정합니다.

cat <<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example-l2advertisement
  namespace: metallb-system
spec:
  ipAddressPools:
    - default-pool
EOF

4. LoadBalancer 서비스 배포 및 테스트

LoadBalancer 타입의 서비스를 배포하여 MetalLB의 동작을 테스트할 수 있습니다.

nginx Deployment와 nginx-loadbalancer 서비스를 배포합니다. nginx-loadbalancer 서비스는 LoadBalancer 타입으로 설정되어 MetalLB가 지정된 IP 주소 범위에서 IP를 할당합니다.

 

Service 배포

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: nginx-loadbalancer
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer
EOF

Deployment 배포

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

5. 서비스 상태 확인

서비스가 생성된 후 MetalLB가 외부 IP를 할당한 것을 확인할 수 있습니다.

출력된 결과에서 EXTERNAL-IP 필드에 192.168.0.x와 같은 IP 주소가 할당되어 있는지 확인하세요. 이 IP 주소로 접속하여 nginx 서비스가 제대로 동작하는지 테스트할 수 있습니다.

kubectl get services nginx-loadbalancer
NAME                     TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
nginx-service-metallb1   LoadBalancer   10.98.45.72   192.168.0.201   80:32393/TCP   6m46s

4. 테스트

브라우저에서 또는 curl 명령어를 사용하여 할당된 IP 주소로 NGINX 웹 서버에 접근합니다.

curl http://<EXTERNAL-IP>

MetalLB 리소스 삭제

MetalLB 네임스페이스 확인

kubectl get namespace
kubectl get pods -n metallb-system

MetalLB 리소스 삭제

kubectl delete all --all -n metallb-system

네임스페이스 삭제

kubectl delete namespace metallb-system

Helm으로 설치한 경우

helm uninstall metallb --namespace metallb-system

ConfigMap 및 기타 설정 삭제

kubectl delete configmap -n metallb-system

클러스터 상태 확인

kubectl get all --all-namespaces

 

참고URL

- MetalLB : Installation

 

 

고양이 <<EOF | kubectl apply -f - apiVersion: apps/v1 종류: 배포 메타데이터: 이름: nginx 사양: 복제본: 1 선택기: matchLabels: 앱: nginx 템플릿: 메타데이터: 라벨: 앱: nginx 사양: 컨테이너: - 이름: nginx 이미지: nginx 포트: - 컨테이너 포트: 80 EOF
 
728x90