32.9. MetalLB를 사용하도록 서비스 구성

클러스터 관리자는 LoadBalancer 유형의 서비스를 추가할 때 MetalLB가 IP 주소를 할당하는 방법을 제어할 수 있습니다.

32.9.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

32.9.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 주소를 할당하려고 합니다.

32.9.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

32.9.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 선택기를 지정합니다. 클러스터 외부 트래픽 정책을 사용하는 경우 Pod 선택기가 동일할 필요가 없습니다.
4 8
선택 사항: 이전 항목 3개를 지정하는 경우 MetalLB에서 서비스를 동일한 IP 주소에 배치할 수 있습니다. 서비스가 IP 주소를 공유하도록 하려면 공유할 IP 주소를 지정합니다.

기본적으로 Kubernetes는 다중 프로토콜 로드 밸런서 서비스를 허용하지 않습니다. 이 제한으로 인해 일반적으로 TCP 및 UDP에서 수신 대기해야 하는 DNS와 같은 서비스를 실행할 수 없습니다. MetalLB를 사용하여 이 Kubernetes 제한 사항을 해결하려면 다음 두 서비스를 생성합니다.

  • 한 서비스에 대해 TCP를 지정하고 두 번째 서비스에 대해 UDP를 지정합니다.
  • 두 서비스 모두에서 동일한 pod 선택기를 지정합니다.
  • 동일한 IP 주소에 TCP 및 UDP 서비스를 공동 배치하려면 동일한 공유 키와 spec.loadBalancerIP 값을 지정합니다.

32.9.5. MetalLB를 사용하여 서비스 구성

주소 풀에서 외부 IP 주소를 사용하도록 로드 밸런싱 서비스를 구성할 수 있습니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • MetalLB Operator를 설치하고 MetalLB를 시작합니다.
  • 하나 이상의 주소 풀을 구성합니다.
  • 클라이언트의 트래픽을 클러스터의 호스트 네트워크로 라우팅하도록 네트워크를 구성합니다.

절차

  1. < service_name>.yaml 파일을 생성합니다. 파일에서 spec.type 필드가 LoadBalancer 로 설정되어 있는지 확인합니다.

    MetalLB에서 서비스에 할당하는 외부 IP 주소를 요청하는 방법에 대한 자세한 내용은 예제를 참조하십시오.

  2. 서비스를 생성합니다.

    $ 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 주소를 어셈블하기 위해 할당되었음을 나타냅니다. 오류가 발생하면 이벤트 필드에 오류 이유가 표시됩니다.