MetalLB를 설치하고 설정하여 LoadBalancer 서비스를 테스트하는 방법
MetalLB는 Kubernetes 클러스터에 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-21T00:20:43Z v1.30.4 192.168.0.131 control-plane
k8s-worker1 Ready <none> 2024-08-21T00:46:43Z v1.30.4 192.168.0.112 k8s-worker1
k8s-worker2 Ready <none> 2024-08-21T02:08:25Z v1.30.4 192.168.0.121 k8s-worker2
ARP 모드 활성화
kube-proxy 구성 편집
- ipvs.strictARP : true(false -> true)
kubectl edit configmap -n kube-system kube-proxy
mode: ""
...
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
strictARP: false
syncPeriod: 0s
tcpFinTimeout: 0s
tcpTimeout: 0s
udpTimeout: 0s
mode: "ipvs"
...
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
strictARP: true
syncPeriod: 0s
tcpFinTimeout: 0s
tcpTimeout: 0s
udpTimeout: 0s
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-b2dld 1/1 Running 0 49s
pod/speaker-4szck 1/1 Running 0 49s
pod/speaker-9nf6w 1/1 Running 0 49s
pod/speaker-fftzv 1/1 Running 0 49s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/metallb-webhook-service ClusterIP 10.103.130.187 <none> 443/TCP 49s
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/speaker 3 3 3 3 3 kubernetes.io/os=linux 49s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/controller 1/1 1 1 49s
NAME DESIRED CURRENT READY AGE
replicaset.apps/controller-7bcd9b5f47 1 1 1 49s
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
namespace: metallb-system
labels:
ipaddresspool: demo
spec:
addresses:
- 192.168.0.201-192.168.0.220
autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: metallb
namespace: metallb-system
EOF
3. LoadBalancer 서비스 테스트
이제 MetalLB가 설정되었으므로 LoadBalancer 서비스를 생성하여 제대로 작동하는지 테스트합니다.
NGINX 웹 서버를 배포하고 LoadBalancer 서비스를 설정하여 MetalLB를 통해 외부 IP를 할당받습니다:
Deployment 배포
cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-metallb1
spec:
replicas: 2
selector:
matchLabels:
app: metallb-cluster
template:
metadata:
labels:
app: metallb-cluster
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
EOF
Service 배포
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
name: nginx-service-metallb1
labels:
name: metallb
spec:
type: LoadBalancer
selector:
app: metallb-cluster
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
EOF
서비스 상태 확인
서비스가 생성된 후 MetalLB가 외부 IP를 할당한 것을 확인할 수 있습니다.
kubectl get svc nginx-service-metallb1
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service-metallb1 LoadBalancer 10.98.45.72 192.168.0.201 80:32393/TCP 6m46s
4. 테스트
브라우저에서 또는 curl 명령어를 사용하여 할당된 IP 주소로 NGINX 웹 서버에 접근합니다.
curl http://<EXTERNAL-IP>
MetalLB 리소스 삭제
MetalLB 네임스페이스 확인
kubectl get namespace
kubectl get pods -n metallb-system
MetalLB 리소스 삭제
kubectl delete all --all -n metallb-system
네임스페이스 삭제
kubectl delete namespace metallb-system
Helm으로 설치한 경우
helm uninstall metallb --namespace metallb-system
ConfigMap 및 기타 설정 삭제
kubectl delete configmap -n metallb-system
클러스터 상태 확인
kubectl get all --all-namespaces
'리눅스' 카테고리의 다른 글
[draft] 우분투에서 IPv6를 영구적으로 비활성화하는 방법 (0) | 2024.08.28 |
---|---|
[draft] journal 로그를 확인하고 삭제하는 방법 (0) | 2024.08.26 |
[draft] 우분투에 쿠버네티스 싱글 노드를 구성하는 방법 (0) | 2024.08.20 |
[draft] 쿠버네티스 클러스터에서 Worker Node를 재기동하는 방법 (0) | 2024.08.19 |
[draft] 쿠버네티스에 Ingress Controller를 설치하고 이를 통해 외부에서 NGINX 웹 서비스에 접근할 수 있도록 설정하는 방법 (0) | 2024.08.19 |