Kubernetes 1.28 에서 MetalLB 설치하기
MetalLB 를 설치하면 LoadBalancer 를 사용할 수 있는데, 이는 외부에서 접근하는 공인 IP 를 Pod 에 부여함으로써 온전히 애플리케이션의 포트를 NodePort (30000~32767) 와 같이 임의 포트가 아닌 공식 표준 포트를 사용할 수 있게 됩니다.
아래 예제의 Kubernetes 환경은 1.28 버전이며, 모든 명령은 master (control-plane) 서버에서 진행하였습니다.
공식 홈페이지 Documents : https://metallb.universe.tf/installation/
1. kube-proxy 구성 편집
kube-proxy 를 사용하는 경우 ARP 모드를 사용해야 합니다.
아래 명령을 이용해 kube-proxy 구성을 편집합니다.
# kubectl edit configmap -n kube-system kube-proxy
configmap/kube-proxy edited
... ipvs: strictARP: true ... |
위 내용으로 저장합니다.
2. MetalLB 설치
MetalLB 컴포넌트 등을 하나의 파일로 설치합니다. 작성일 기준 최신 버전은 0.13.10 입니다.
# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
MetalLB 관련 Pod 가 잘 생성되었는지 확인합니다.
Running 상태까지 되는데 시간이 소요될 수 있습니다. (모든 Pod 1/1)
# kubectl get pod -n metallb-system
NAME READY STATUS RESTARTS AGE
controller-5c6b6c8447-4kzpl 1/1 Running 0 15m
speaker-6fxtx 1/1 Running 0 15m
speaker-7gg7s 1/1 Running 0 15m
speaker-z284z 1/1 Running 0 15m
3. IP Pool 생성
라우팅 처리를 하기위해 보유하고 있는 IP 리스트를 등록합니다.
Pod 에서 IP 를 사용할 수 있도록 상단 스위치단에서 IP 설정이 이루어져 있어야 합니다.
아래는 28비트 대역 2개를 추가해 보았습니다.
실제로 Pod 에 할당하려는 IP 범위를 적어줍니다.
# vi ippool.yaml
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 115.68.142.130-115.68.142.140 - 115.68.142.146-115.68.142.156 |
IP 를 추가할때는 서브넷 마스크를 별도로 지정하지 않아도 주소 범위 내의 모든 IP 주소를 사용할 수 있도록 인식합니다. MetalLB 는 주소 범위를 기반으로 자동으로 서브넷 마스크를 계산하기 때문입니다.
작성한 yaml 파일을 적용합니다.
# kubectl apply -f ippool.yaml
ipaddresspool.metallb.io/first-pool created
* 에러 발생시 ----------
여기에서 다음과 같은 에러가 발생했을때 조치방법 입니다.
Error from server (InternalError): error when creating "ippool.yaml": Internal error occurred: failed calling webhook "ipaddresspoolvalidationwebhook.metallb.io": failed to call webhook: Post "https://webhook-service.metallb-system.svc:443/validate-metallb-io-v1beta1-ipaddresspool?timeout=10s": dial tcp 10.102.110.54:443: connect: connection refused
이때는 아래와 같이 metallb-webhook-configuration 설정을 삭제하고 다시 실행해 보세요.
# kubectl delete validatingwebhookconfigurations metallb-webhook-configuration
validatingwebhookconfiguration.admissionregistration.k8s.io "metallb-webhook-configuration" deleted
----------------------------
L2 네트워크를 생성하고 적용합니다.
# vi l2.yaml
apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: my-l2 namespace: metallb-system spec: ipAddressPools: - first-pool |
# kubectl apply -f l2.yaml
l2advertisement.metallb.io/my-l2 created
4. 테스트 (Pod 생성 및 IP 연결)
테스트를 위해 Nginx Pod 를 생성하고 공인 IP 를 할당하여 외부 통신이 되는지 확인합니다.
# kubectl create deploy nginx --image=nginx
deployment.apps/nginx created
# kubectl expose deploy nginx --port 80 --type LoadBalancer
service/nginx exposed
# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d
nginx LoadBalancer 10.111.72.120 115.68.142.130 80:32088/TCP 20m
Kubernetes Cluster 외부의 네트워크에서 출력된 IP 로 접근하여 Nginx 가 열리는지 확인합니다.
# curl http://115.68.142.130
'리눅스 > Containers & Kubernetes' 카테고리의 다른 글
[Kubernetes] 지워지지않는 Terminating 네임스페이스 삭제하기 (0) | 2023.10.31 |
---|---|
개인 도커 레지스트리 (Docker Registry) 구축하기 (0) | 2023.09.05 |
Kubernetes 1.28 에서 worker 노드 제거 및 추가하기 (0) | 2023.09.04 |
Ubuntu 22.04 에서 CRI-O, Kubernetes 1.28 Cluster, Calico 설치 및 애플리케이션 배포 (0) | 2023.08.28 |
Docker 컨테이너 생성하지 않고 이미지 쉘에 접근하기 (0) | 2023.04.05 |