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