Openshift 4.12.0 MetalLB 로드발란서 설치 및 서비스 IP 대역 할당하기
[ 참조 문서 ]
- 설치 : https://docs.openshift.com/container-platform/4.12/networking/metallb/metallb-operator-install.html
AWS, MS Azure 등의 인프라에서 구성하는것이 아닌 BareMetal 형태의 단독 시스템들로 구성을 할 경우 LoadBalancer 제공을 위해 아래와 같이 추가 설정을 진행 할 수 있습니다.
클러스터 관리자는 MetalLB Operator 를 추가하여 클러스터 내의 MetalLB 인스턴스의 라이프사이클을 관리할 수 있습니다.
그러나 MetalLB 와 IP failover 는 호환되지 않습니다.
클러스터에서 IP failover 를 구성한 경우, Operator를 설치하기 전에 IP failover를 제거하는 단계를 수행해야 합니다. (제거 과정은 생략합니다)
1. MetalLB 설정
다음 명령을 실행하여 MetalLB Operator 네임스페이스를 만듭니다.
# oc create ns metallb-system
namespace/metallb-system created
OperatorGroup yaml 파일을 작성합니다.
# vi og.yaml
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: metallb-operator namespace: metallb-system |
작성한 yaml 파일을 적용합니다.
# oc apply -f og.yaml
operatorgroup.operators.coreos.com/metallb-operator created
Operator 그룹이 네임스페이스에 설치되어 있는지 확인합니다.
# oc get operatorgroup -n metallb-system
NAME AGE
metallb-operator 8s
사용자 지정 리소스 (CR) 를 사용하여 YAML 파일을 저장합니다.
# vi metallb-sub.yaml
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: metallb-operator-sub namespace: metallb-system spec: channel: stable name: metallb-operator source: redhat-operators sourceNamespace: openshift-marketplace |
적용하여 Subscription 을 생성합니다.
# oc apply -f metallb-sub.yaml
subscription.operators.coreos.com/metallb-operator-sub created
네임스페이스 라벨을 붙입니다.
# oc label ns metallb-system "openshift.io/cluster-monitoring=true"
namespace/metallb-system labeled
설치 계획이 네임스페이스에 있는지 확인합니다.
# oc get installplan -n metallb-system
NAME CSV APPROVAL APPROVED
install-56ph2 metallb-operator.4.12.0-202303231115 Automatic true
아래 명령으로 상태를 확인하면 시간이 지나 Installing 에서 Succeeded 로 변경되는 것이 확인됩니다.
# oc get clusterserviceversion -n metallb-system
NAME DISPLAY VERSION REPLACES PHASE
metallb-operator.4.12.0-202303231115 MetalLB Operator 4.12.0-202303231115 Succeeded
2. 클러스터에서 MetalLB 시작하기
MetalLB 생성을 위한 yaml 파일을 작성합니다.
# vi MetalLB.yaml
apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb-system |
yaml 파일을 적용하여 MetalLB 를 생성합니다.
# oc apply -f MetalLB.yaml
metallb.metallb.io/metallb created
컨트롤러 생성이 확인되었습니다.
# oc get deployment -n metallb-system controller
NAME READY UP-TO-DATE AVAILABLE AGE
controller 1/1 1 1 45s
시간이 지나면서 speaker 준비 개수가 하나씩 오르는 것이 확인됩니다.
# oc get daemonset -n metallb-system speaker
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
speaker 5 5 5 5 5 kubernetes.io/os=linux 2m17s
3. Metal 을 위한 배포 사양
PriorityClass yaml 파일을 작성합니다.
여기에서는 high-priority 클래스를 사용합니다.
# vi PriorityClass.yaml
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000 |
작성한 yaml 파일을 적용합니다.
# oc apply -f PriorityClass.yaml
priorityclass.scheduling.k8s.io/high-priority created
MetalLB yaml 파일을 작성합니다.
priorityClassName 에 위에서 적용한 metadata: name: 값을 입력합니다.
# vi MetalLBPodConfig.yaml
apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb-system spec: logLevel: debug controllerConfig: priorityClassName: high-priority runtimeClassName: myclass speakerConfig: priorityClassName: high-priority runtimeClassName: myclass affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: metallb topologyKey: kubernetes.io/hostname |
작성한 yaml 파일을 적용합니다.
# oc apply -f MetalLBPodConfig.yaml
metallb.metallb.io/metallb configured
네임스페이스의 Pod 에 할당한 우선 순위 클래스를 표시합니다.
# oc get pods -n project412 -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
NAME PRIORITY
mysql-bd544cdb8-qvm59 <none>
4. MetalLB 배치에서의 Pod CPU 제한 설정
필요에 따라 다음에 포드 CPU 제한을 할당할 수 있습니다.
controller 와 speaker Pod 를 설정함으로써 MetalLB yaml 파일에서 CPU 제한을 정의 합니다.
controller 또는 speaker Pod 는 노드의 리소스를 관리하는 데 도움이 됩니다.
이를 통해 노드의 모든 Pod 가 워크로드 관리와 클러스터 하우스키핑에 필요한 컴퓨팅 리소스를 확보할 수 있습니다.
MetalLB yaml 파일을 작성합니다.
# vi CPULimits.yaml
apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb-system spec: logLevel: debug controllerConfig: resources: limits: cpu: "200m" speakerConfig: resources: limits: cpu: "300m" |
작성한 yaml 파일을 적용합니다.
# oc apply -f CPULimits.yaml
metallb.metallb.io/metallb configured
Pod 이름을 확인하고 적용 상태를 자세하게 확인합니다.
# oc describe pod mysql-bd544cdb8-qvm59
(출력 생략)
5. 컨테이너 런타임 클래스 설정
선택적으로 컨테이너 런타임 클래스를 다음에 할당할 수 있습니다.
Windows 작업 부하에 대해서는 pod에 Windows 런타임 클래스를 할당할 수 있습니다.
이렇게 하면 pod 내의 모든 컨테이너가 이 런타임 클래스를 사용하게 됩니다.
RuntimeClass yaml 파일을 작성합니다.
# vi myRuntimeClass.yaml
apiVersion: node.k8s.io/v1 kind: RuntimeClass metadata: name: myclass handler: myconfiguration |
작성한 yaml 파일을 적용합니다.
# oc apply -f myRuntimeClass.yaml
runtimeclass.node.k8s.io/myclass created
MetalLB yaml 파일을 작성합니다.
# vi MetalLBRuntime.yaml
apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb-system spec: logLevel: debug controllerConfig: runtimeClassName: myclass annotations: controller: demo speakerConfig: runtimeClassName: myclass annotations: speaker: demo |
작성한 yaml 파일을 적용합니다.
# oc apply -f MetalLBRuntime.yaml
metallb.metallb.io/metallb configured
Pod 의 컨테이너 런타임을 표시하려면 다음 명령을 실행합니다.
# oc get pod -o custom-columns=NAME:metadata.name,STATUS:.status.phase,RUNTIME_CLASS:.spec.runtimeClassName
6. MetalLB Address Pool 추가
클러스터 관리자는 IP 주소 풀 (address pool) 을 추가하거나 수정, 삭제 할 수 있습니다.
MetalLB Operator 는 주소 풀 커스텀 리소스를 사용하여 MetalLB가 서비스에 할당할 수 있는 IP 주소를 설정합니다.
예제에서는 metallb-system 네임스페이스를 사용한다고 가정합니다.
IPAddressPool yaml 파일을 작성합니다.
# vi ipaddresspool.yaml
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example labels: zone: az1 spec: addresses: - 115.68.142.121-115.68.142.126 |
작성한 yaml 파일은 MetalLB 의 IPAddressPool 리소스를 정의하는 예시입니다. 이 리소스는 MetalLB 에서 사용할 IP 주소 풀을 구성합니다. 각 IP 주소 풀은 addresses 필드에 지정된 IP 범위로 정의됩니다.
- metadata: labels: zone: 리소스에 할당할 라벨을 지정합니다.
- spec: addresses: IP 주소 풀을 지정하는 섹션입니다. 각 IP 주소 풀은 - 로 구분된 범위로 지정됩니다.
이 예시에서는 115.68.142.121 부터 115.68.142.126 까지의 IP 범위를 지정했습니다. (IP 6개를 로드발란서 IP 로 사용)
떨어져있는 IP 를 추가하고 싶을 경우 한 행을 더 추가하면 됩니다.
이렇게 정의된 IPAddressPool 리소스를 적용하면 MetalLB 에서 해당 IP 주소 풀을 사용하여 로드발란서 IP 주소를 할당할 수 있습니다.
작성한 yaml 파일을 적용합니다.
# oc apply -f ipaddresspool.yaml
ipaddresspool.metallb.io/doc-example created
추가된 Address Pool 을 확인합니다.
# oc describe -n metallb-system IPAddressPool doc-example
(출력 생략)
아래는 다른 적용 예시 입니다.
IPv4 와 CIDR 범위를 이용한 설정입니다.
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: doc-example-cidr namespace: metallb-system spec: addresses: - 192.168.100.0/24 - 192.168.200.0/24 - 192.168.255.1-192.168.255.5 |
MetalLB는 풀에서 IP 주소를 자동으로 할당하지 않도록 autoAssign 필드를 false 로 설정 할 수 있습니다.
서비스를 추가할 때, 풀에서 특정 IP 주소를 요청하거나 어노테이션에서 풀 이름을 지정하여 풀에서 사용 가능한 임의의 IP 주소를 요청할 수 있습니다.
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: doc-example-reserved namespace: metallb-system spec: addresses: - 10.0.100.0/28 autoAssign: false |
'리눅스 > OpenShift' 카테고리의 다른 글
[참고] Openshift 의 oc new-project 와 oc create ns 의 차이점 (0) | 2023.05.10 |
---|---|
[Openshift] 미터링 도구 Prometheus + AlertManager 알람 (webhook + telegram) (0) | 2023.04.24 |
Openshift yaml 파일로 Pod 생성시 보안 (권한) 에러 메세지 (0) | 2023.04.04 |
Openshift Pod 상태 로그 보는 방법 두가지 (0) | 2023.03.27 |
Openshift GitLab-CE 컨테이너 배포하기 (0) | 2023.03.24 |