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
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
'리눅스' 카테고리의 다른 글
| journal 로그를 확인하고 삭제하는 방법 (0) | 2024.08.26 | 
|---|---|
| 쿠버네티스 kube-proxy와 CNI 플러그인의 차이 (0) | 2024.08.21 | 
| Kubernetes CNI 플러그인과 특징 비교 (0) | 2024.08.21 | 
| 우분투에 쿠버네티스 싱글 노드를 구성하는 방법 (0) | 2024.08.19 | 
| 쿠버네티스에 Ingress Controller를 설치하고 이를 통해 외부에서 NGINX 웹 서비스에 접근할 수 있도록 설정하는 방법 (0) | 2024.08.19 |