kubeflow rke2 metallb load balancer 설정 및 테스트

1. metalLB란?

Kubernetes는 네트워크 로드 밸런서 구현을 제공하지 않습니다(LoadBalancer 유형의 서비스) 베어메탈 클러스터의 경우. Kubernetes와 함께 제공되는 네트워크 로드 밸런서의 구현은 모두 다양한 IaaS 플랫폼(GCP, AWS, Azure…)을 호출하는 글루 코드입니다. 지원되는 IaaS 플랫폼(GCP, AWS, Azure…)에서 실행하지 않는 경우 LoadBalancer는 생성 시 무기한 “보류 중” 상태로 유지됩니다.

베어메탈 클러스터 운영자에게는 사용자 트래픽을 클러스터로 가져오는 두 가지 작은 도구인 “NodePort” 및 “externalIPs” 서비스가 남아 있습니다. 이 두 옵션 모두 프로덕션 사용에 있어 상당한 단점이 있으며, 이로 인해 베어메탈 클러스터는 Kubernetes 생태계에서 2등급 시민이 됩니다.

MetalLB는 베어 메탈 클러스터의 외부 서비스도 최대한 “작동”할 수 있도록 표준 네트워크 장비와 통합되는 네트워크 로드 밸런서 구현을 제공하여 이러한 불균형을 해결하는 것을 목표로 합니다.

출처 https://metallb.universe.tf/

1-1. metalLB설치 및 설치를 위한 RKE2 Config.yaml 설정

위와같이 kube-proxy구성을 편집하라고 나와있었지만 나는 RKE2를 설치하면서 아무리 네임스페이스와 파드를 뒤져도, kube-proxy가 없었고 kube-scheduler-node-master-0, kube-proxy-node-gpu-1 처럼 kube-system내에 각각의 노드의 이름이 붙은 파드로 존재하는것을 발견하고 조금 다르다고 생가각했다.

그래서 Pod를 하나씩 편집할려던 찰나에 RKE2의 config.yaml를 변경하면 된다는것을 알게 되었다.

vi /etc/rancher/rke2/config.yaml


kube-proxy-arg:
  - proxy-mode=ipvs
  - ipvs-strict-arp=true

#위의 내용을 추가 하고 저장후 다른노드들에게도 적용시킨다. -> 1. 파일복사, 2. 직접들어가서 수정
#(example)

#scp /etc/rancher/rke2/config.yaml node-gpu-1@10.2.3.112:/etc/rancher/rke2

# 마스터노드
systemctl restart rke2-server
# 워커노드
systemctl restart rke2-agent.service


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

#running 상태 확인
$ kubectl get -n metallb-system pod

1-2. metalLB_IPAddressPool 등록




# IpAddressPools등록을 위한 yaml파일 작성

$ vi metalLB_IPAddressPool.yaml

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: my-pool
  namespace: metallb-system
spec:
  addresses:
  - 10.2.3.111-10.2.3.120
 
---
 
 
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: my-network-l2
  namespace: metallb-system
spec:
  ipAddressPools:
  - my-pool
  
  
  
$   kubectl apply -n metallb-system -f my-network.yaml

2. MetalLB를 사용한 Kubeflow Dashboard 설정

현재 상태 확인.

$ kubectl get svc/istio-ingressgateway -n istio-system


NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                    AGE
istio-ingressgateway   ClusterIP   10.43.185.122   <none>        15021/TCP,80/TCP,443/TCP   22d

클러스터 타입은 ClusterIp로, EXTERNAL-IP는 <none>이다.

# HTTPS 통신을 위한 Certificate 작성
vi -f kubeflow-gateway-issuer.yaml

---
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: kubeflow-ingressgateway-certs
  namespace: istio-system
spec:
  commonName: 10.2.3.115
  issuerRef:
    kind: ClusterIssuer
    name: kubeflow-self-signing-issuer # ClusterIssuer 이름 입력
  secretName: kubeflow-ingressgateway-certs
---

# Certificate 적용
kubectl apply -f kubeflow-gateway-issuer.yaml

# kubeflow 내부 Gateway에
# Certificate 적용
kubectl edit gateway kubeflow-gateway -n kubeflow
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: kubeflow-gateway
  namespace: kubeflow
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - "*"
    port:
      name: http
      number: 80
      protocol: HTTP
    # 여기 아래부분 추가 
    tls:
      httpsRedirect: true # 지금은 sdk tls관련 오류로 인하여 false로 작업중. 추후 수정예정
  - hosts:
    - "*"
    port:
      name: https
      number: 443
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: kubeflow-ingressgateway-certs

# 설정 
$ kubectl edit svc/istio-ingressgateway -n istio-system

spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: 10.43.185.122
  clusterIPs:
  - 10.43.185.122
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: status-port
    nodePort: 31915
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: http2
    nodePort: 32343
    port: 80
    protocol: TCP
    targetPort: 8080
  - name: https
    nodePort: 30481
    port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    app: istio-ingressgateway
    istio: ingressgateway
  sessionAffinity: None
  type: LoadBalancer # 이부분을 변경 ClusterIp to LoadBalancer
  loadBalancerIP: 10.2.3.115 # Add IP
$ kubectl get svc/istio-ingressgateway -n istio-system

NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                      AGE
istio-ingressgateway   LoadBalancer   10.43.185.122   10.2.3.115    15021:31915/TCP,80:32343/TCP,443:30481/TCP   22d
# 변경된 내용을 확인 할 수 있고. 해당 주소로 접속시 dex페이지가 나온다.

metalLB와 관련하여 설정이 제대로 하지 않고 loadbalancer를 설정하게 된다면 istio-ingressgateway의 EXTERNAL-IP가 계속 pendding인 상태로 머문다.

$ kubectl describe svc/istio-ingressgateway -n istio-system

  Type     Reason            Age                  From                Message
  ----     ------            ----                 ----                -------
  Warning  AllocationFailed  5m47s (x2 over 17h)  metallb-controller  Failed to allocate IP for "istio-system/istio-ingressgateway": ["10.2.3.115"] is not allowed in config

에러메세지는 위와 같다.

error -> metallb-controller Failed to allocate IP for “istio-system/istio-ingressgateway”: [“10.2.3.115”] is not allowed in config

Leave a Comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다