26.6. MetalLB를 사용하도록 서비스 구성
클러스터 관리자는 LoadBalancer
유형의 서비스를 추가할 때 MetalLB에서 IP 주소를 할당하는 방법을 제어할 수 있습니다.
26.6.1. 특정 IP 주소 요청
다른 로드 밸런서 구현과 마찬가지로 MetalLB에는 서비스 사양에서 spec.loadBalancerIP
필드가 허용됩니다.
요청된 IP 주소가 주소 풀의 범위 내에 있는 경우 MetalLB는 요청된 IP 주소를 할당합니다. 요청된 IP 주소가 범위 내에 없는 경우 MetalLB에서 경고를 보고합니다.
특정 IP 주소에 대한 서비스 YAML의 예
apiVersion: v1 kind: Service metadata: name: <service_name> annotations: metallb.universe.tf/address-pool: <address_pool_name> spec: selector: <label_key>: <label_value> ports: - port: 8080 targetPort: 8080 protocol: TCP type: LoadBalancer loadBalancerIP: <ip_address>
MetalLB에서 요청된 IP 주소를 할당할 수 없는 경우 서비스의 EXTERNAL-IP
는 <pending>
을 보고하고 oc describe service <service_name>
을 실행하면 다음 예와 같은 이벤트가 포함됩니다.
MetalLB에서 요청된 IP 주소를 할당할 수 없는 이벤트의 예
... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning AllocationFailed 3m16s metallb-controller Failed to allocate IP for "default/invalid-request": "4.3.2.1" is not allowed in config
26.6.2. 특정 풀에서 IP 주소 요청
특정 범위의 IP 주소를 할당하지만 특정 IP 주소와 관련이 없는 경우 metallb.universe.tf/address-pool
주석을 사용하여 지정된 주소 풀의 IP 주소를 요청할 수 있습니다.
특정 풀의 IP 주소에 대한 서비스 YAML의 예
apiVersion: v1 kind: Service metadata: name: <service_name> annotations: metallb.universe.tf/address-pool: <address_pool_name> spec: selector: <label_key>: <label_value> ports: - port: 8080 targetPort: 8080 protocol: TCP type: LoadBalancer
<address_pool_name>
에 대해 지정한 주소 풀이 없는 경우 MetalLB는 자동 할당을 허용하는 모든 풀에서 IP 주소를 할당하려고 시도합니다.
26.6.3. IP 주소 수락
기본적으로 주소 풀은 자동 할당을 허용하도록 구성됩니다. MetalLB는 이러한 주소 풀에서 IP 주소를 할당합니다.
자동 할당을 위해 구성된 풀의 IP 주소를 수락하려면 특별한 주석이나 구성이 필요하지 않습니다.
IP 주소를 수락하는 서비스 YAML의 예
apiVersion: v1 kind: Service metadata: name: <service_name> spec: selector: <label_key>: <label_value> ports: - port: 8080 targetPort: 8080 protocol: TCP type: LoadBalancer
26.6.4. 특정 IP 주소 공유
기본적으로 서비스는 IP 주소를 공유하지 않습니다. 그러나 단일 IP 주소에 서비스를 공동 배치해야 하는 경우 metallb.universe.tf/allow-shared-ip
주석을 서비스에 추가하여 선택적 IP 공유를 활성화할 수 있습니다.
apiVersion: v1 kind: Service metadata: name: service-http annotations: metallb.universe.tf/address-pool: doc-example metallb.universe.tf/allow-shared-ip: "web-server-svc" 1 spec: ports: - name: http port: 80 2 protocol: TCP targetPort: 8080 selector: <label_key>: <label_value> 3 type: LoadBalancer loadBalancerIP: 172.31.249.7 4 --- apiVersion: v1 kind: Service metadata: name: service-https annotations: metallb.universe.tf/address-pool: doc-example metallb.universe.tf/allow-shared-ip: "web-server-svc" 5 spec: ports: - name: https port: 443 6 protocol: TCP targetPort: 8080 selector: <label_key>: <label_value> 7 type: LoadBalancer loadBalancerIP: 172.31.249.7 8
- 1 5
metallb.universe.tf/allow-shared-ip
주석에 동일한 값을 지정합니다. 이 값을 공유 키라고 합니다.- 2 6
- 서비스에 대해 서로 다른 포트 번호를 지정합니다.
- 3 7
- 서비스가 동일한 Pod 세트로 트래픽을 보내도록
externalTrafficPolicy: local
을 지정해야 하는 경우 동일한 Pod 선택기를 지정합니다.cluster
외부 트래픽 정책을 사용하는 경우 Pod 선택기를 동일할 필요가 없습니다. - 4 8
- 선택 사항: 이전 항목 3개를 지정하는 경우 MetalLB에서 서비스를 동일한 IP 주소에 배치할 수 있습니다. 서비스가 IP 주소를 공유하도록 하려면 공유할 IP 주소를 지정합니다.
기본적으로 Kubernetes는 다중 프로토콜 로드 밸런서 서비스를 허용하지 않습니다. 이 제한으로 인해 일반적으로 TCP 및 UDP에서 수신 대기해야 하는 DNS와 같은 서비스를 실행할 수 없습니다. MetalLB를 사용하여 이 Kubernetes 제한 사항을 해결하려면 다음 두 서비스를 생성합니다.
- 한 서비스에 대해 TCP를 지정하고 두 번째 서비스에 대해 UDP를 지정합니다.
- 두 서비스 모두에서 동일한 pod 선택기를 지정합니다.
-
동일한 공유 키와
spec.loadBalancerIP
값을 지정하여 TCP 및 UDP 서비스를 동일한 IP 주소에 공동 배치합니다.
26.6.5. MetalLB를 사용하여 서비스 구성
주소 풀에서 외부 IP 주소를 사용하도록 로드 밸런싱 서비스를 구성할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. - MetalLB Operator를 설치하고 MetalLB를 시작합니다.
- 하나 이상의 주소 풀을 구성합니다.
- 클라이언트의 트래픽을 클러스터의 호스트 네트워크로 라우팅하도록 네트워크를 구성합니다.
절차
<service_name>.yaml
파일을 생성합니다. 파일에서spec.type
필드가LoadBalancer
로 설정되어 있는지 확인합니다.MetalLB에서 서비스에 할당하는 외부 IP 주소를 요청하는 방법에 대한 자세한 내용은 예제를 참조하십시오.
서비스를 생성합니다.
$ oc apply -f <service_name>.yaml
출력 예
service/<service_name> created
검증
서비스를 설명합니다.
$ oc describe service <service_name>
출력 예
Name: <service_name> Namespace: default Labels: <none> Annotations: metallb.universe.tf/address-pool: doc-example <.> Selector: app=service_name Type: LoadBalancer <.> IP Family Policy: SingleStack IP Families: IPv4 IP: 10.105.237.254 IPs: 10.105.237.254 LoadBalancer Ingress: 192.168.100.5 <.> Port: <unset> 80/TCP TargetPort: 8080/TCP NodePort: <unset> 30550/TCP Endpoints: 10.244.0.50:8080 Session Affinity: None External Traffic Policy: Cluster Events: <.> Type Reason Age From Message ---- ------ ---- ---- ------- Normal nodeAssigned 32m (x2 over 32m) metallb-speaker announcing from node "<node_name>"
<.> 특정 풀에서 IP 주소를 요청하는 경우 주석이 있습니다. <.> 서비스 유형은
LoadBalancer
를 지정해야 합니다. <.> 로드 밸런서 수신 필드는 서비스가 올바르게 할당되면 외부 IP 주소를 나타냅니다. <.> 이벤트 필드는 외부 IP 주소를 표시하여 외부 IP 주소를 어셈블하기 위해 할당되었음을 나타냅니다. 오류가 발생하면 이벤트 필드에 오류 이유가 표시됩니다.