본문 바로가기

리눅스

MetalLB를 설치하고 설정하여 LoadBalancer 서비스를 테스트하는 방법

반응형

MetalLB를 설치하고 설정하여 LoadBalancer 서비스를 테스트하는 방법

MetalLB는 쿠버네티스(Kubernetes) 클러스터에 LoadBalancer 서비스를 제공하기 위한 네트워크 부하 분산기입니다. MetalLB는 일반적으로 클라우드에서 제공되는 네이티브 LoadBalancer 서비스 대신 온프레미스(On-Premises) 또는 클라우드에 독립적인 환경에서 동작하는 LoadBalancer 기능을 제공합니다.

테스트 환경

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"
NAME            STATUS   ROLES    AGE                    VERSION   INTERNAL-IP      EXTERNAL-IP
control-plane   Ready    <none>   2024-08-21T12:04:32Z   v1.30.4   192.168.10.111   control-plane
worker1         Ready    <none>   2024-08-21T12:19:20Z   v1.30.4   192.168.10.114   worker1

ARP 모드 활성화

kube-proxy 구성 편집

  • mode: "ipvs"
  • strictARP: true(false -> true)
kubectl edit configmap -n kube-system kube-proxy
    mode: ""
...
    ipvs:
...
      strictARP: false
    mode: "ipvs"
...
    ipvs:
...
      strictARP: true

ARP(strictARP) 모드 확인

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

1. MetalLB 설치

MetalLB Namespace 및 구성 설치

  • MetalLB를 설치하기 위해 필요한 Namespace 및 기본 리소스를 생성합니다.
  • MetalLB의 Namespace와 데몬셋을 클러스터에 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/main/config/manifests/metallb-native.yaml
더보기

---

namespace/metallb-system created
customresourcedefinition.apiextensions.k8s.io/bfdprofiles.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bgpadvertisements.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bgppeers.metallb.io created
customresourcedefinition.apiextensions.k8s.io/communities.metallb.io created
customresourcedefinition.apiextensions.k8s.io/ipaddresspools.metallb.io created
customresourcedefinition.apiextensions.k8s.io/l2advertisements.metallb.io created
customresourcedefinition.apiextensions.k8s.io/servicel2statuses.metallb.io created
serviceaccount/controller created
serviceaccount/speaker created
role.rbac.authorization.k8s.io/controller created
role.rbac.authorization.k8s.io/pod-lister created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/controller created
rolebinding.rbac.authorization.k8s.io/pod-lister created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
configmap/metallb-excludel2 created
secret/metallb-webhook-cert created
service/metallb-webhook-service created
deployment.apps/controller created
daemonset.apps/speaker created
validatingwebhookconfiguration.admissionregistration.k8s.io/metallb-webhook-configuration created

---

kubectl get all -n metallb-system
NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-7bcd9b5f47-vg99x   1/1     Running   0          42s
pod/speaker-jkqzk                 1/1     Running   0          42s
pod/speaker-jmbgw                 1/1     Running   0          42s

NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/metallb-webhook-service   ClusterIP   10.101.60.213   <none>        443/TCP   42s

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/speaker   2         2         2       2            2           kubernetes.io/os=linux   42s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           42s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-7bcd9b5f47   1         1         1       42s
728x90

2. MetalLB 설정

MetalLB는 IP 주소 풀을 정의하는 ConfigMap을 통해 작동합니다. 이 ConfigMap을 사용하여 IP 주소 범위를 지정하고 MetalLB가 사용할 수 있는 IP 주소를 정의합니다.

 

IP 주소 풀 설정

MetalLB를 사용하여 IP 주소 풀을 설정합니다. 이 파일을 metallb-config.yaml로 저장합니다.

여기서 addresses는 MetalLB가 사용할 수 있는 IP 주소 범위를 정의합니다. 이 범위는 클러스터가 배치된 네트워크의 실제 IP 주소 범위와 일치해야 합니다. IP 주소 범위는 실제 네트워크 환경에 맞게 조정해야 합니다.

cat <<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: metallb-ip-pool
  namespace: metallb-system
  labels:
    ipaddresspool: metallb-pool
spec:
  addresses:
  - 192.168.10.201-192.168.10.220
  autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: metallb-l2-advertisement
  namespace: metallb-system
EOF

3. LoadBalancer 서비스 테스트

이제 MetalLB가 설정되었으므로 LoadBalancer 서비스를 생성하여 제대로 작동하는지 테스트합니다.

 

NGINX 웹 서버를 배포하고 LoadBalancer 서비스를 설정하여 MetalLB를 통해 외부 IP를 할당받습니다:

Deployment 생성(Nginx 생성)

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

LoadBalancer 서비스 생성

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

서비스 상태 확인

  • 서비스가 생성된 후 MetalLB가 외부 IP를 할당한 것을 확인할 수 있습니다.
kubectl get svc nginx-loadbalancer
NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
nginx-loadbalancer   LoadBalancer   10.102.107.238   192.168.10.201   80:32454/TCP   2m4s

4. 테스트

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

curl http://<EXTERNAL-IP>
curl 192.168.10.201
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

 

참고URL

- MetalLB : Installation

- GitHub repo : metallb

- MetalLB : Release Notes

 

728x90
반응형