kubernetes

kubernets Metal LB 설치하기

mingming_96 2023. 8. 30. 14:15

https://somaz.tistory.com/217

Metal LB 

AWS, GCP , AZURE 등 Cloud 플랫폼에서 자체적인 로드밸런서를 제공해주지만 온프레미스 클러스터에선 로드밸런싱 기능을 제공하는 패키지 설치가 추가로 필요합니다. 

 

MetalLB 설치 가이드

 

Mode

Layer 2 (L2) 모드 

  클러스터 내부의 노드와 함께 작동하여 로드밸런서 IP 주소를 할당하는 방식입니다. 네트워크 스위치나 라우터의 MAC 주소 테이블을 사용하여 IP 주소를 할당합니다.

 

Border Gateway Protocol (BGP) 모드 

  외부 라우터와 연결하여 IP 주소 할당을 관리하는 방식입니다. 외부 라우터와 통신하고 IP 주소를 할당합니다.

 

설치환경 

kubernets : v1.28.1

CNI : weavenet

Layer 2 Mode

 

사전 설정 

IPVS 모드에서 Kube-proxy를 사용하는 경우 kubernets v1.14.2 버전 이후부터 ARP 모드를 활성화 해야 합니다. 

kubectl edit configmap -n kube-system kube-proxy

 

다음과 같이 수정해 줍니다. 

apiVersion: v1
data:
  config.conf: |-
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
-------------------- 중략 --------------------
	  ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: true       ## 이부분을 수정해줍니다.
      syncPeriod: 0s
      tcpFinTimeout: 0s
      tcpTimeout: 0s
      udpTimeout: 0s
    kind: KubeProxyConfiguration

 

Manifest 를 사용해 Metal LB 설치하기 

 

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

 

 

다음 명령을 통해 Metal LB가 잘 설치되어있는지 확인해 줍니다. 

kubectl get -n metallb-system pod

 

IP Address Pool 설정하기

metallb-network.yaml

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 10.1.4.160/28
  - 10.1.4.176/28
  - 10.1.4.192-10.1.4.200
---
 
 
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: my-network-l2
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool

 

kubectl apply -f metallb-network.yaml

 

Example

예제 코드를 이용해 Metal LB가 정상 작동중인지 확인해봅니다. 

nginx_deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14
        name: nginx
        ports:
          - containerPort: 80

 

nginx_service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-loadbalancer
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer
  externalTrafficPolicy: Local

 

kubectl apply -f nginx_deployment.yaml
kubectl apply -f nginx_service.yaml

 

배포 후 Metal LB 로드밸런서 주소를 확인합니다. 

kubectl get svc -o wide

 

EXTERNAL-IP로 접속해 nginx 웹페이지가 응답하는지 확인합니다.

정상적으로 작동하는 것을 확인할 수 있습니다.