통합 F5 BIG-IP의 구성 마이그레이션

이 문서에서는 번들 F5 BIG-IP 부하 분산기 통합의 구성 설정을 수동 부하 분산 모드로 마이그레이션하는 방법을 보여줍니다. 수동 부하 분산 모드에서 F5 BIG-IP를 사용하면 F5 부하 분산기 또는 Kubernetes 서비스의 기능에 영향을 주지 않고 F5 에이전트를 독립적으로 업그레이드할 수 있는 유연성을 얻을 수 있습니다. 수동 구성으로 마이그레이션하는 경우 F5에서 직접 업데이트를 받아 최적의 성능과 보안을 보장할 수 있습니다.

이 마이그레이션은 다음과 같은 경우에 필요합니다.

  • Controlplane V2와 같은 새로운 기능을 사용 설정해야 하며 F5에도 액세스해야 합니다.

  • BIG-IP CIS 컨테이너 인그레스 서비스(CIS) 컨트롤러 v1.14 이후 버전에서 제공하는 기능이 필요합니다.

위의 경우에 해당되지 않는 경우 F5 BIG-IP 부하 분산에 번들 구성을 계속 사용할 수 있습니다.

어느 쪽이든 Google은 공식적으로 F5를 부하 분산기 솔루션으로 계속 지원합니다.

F5 BIG-IP 부하 분산기 지원

F5 BIG-IP를 다음 두 컨트롤러로 구성된 부하 분산기 에이전트와 함께 사용할 수 있습니다.

  • F5 컨트롤러(포드 접두사: load-balancer-f5): LoadBalancer 유형의 Kubernetes 서비스를 F5 Common Controller Core Library(CCCL) ConfigMap 형식으로 조정합니다.

  • F5 BIG-IP CIS 컨트롤러 v1.14(포드 접두사: k8s-bigip-ctlr-deployment): ConfigMap을 F5 부하 분산기 구성으로 변환합니다.

이러한 에이전트는 Kubernetes 클러스터 내에서 F5 부하 분산기 구성을 간소화합니다. LoadBalancer 유형의 서비스를 만들면 컨트롤러가 트래픽을 클러스터 노드로 전달하도록 F5 부하 분산기를 자동으로 구성합니다.

하지만 번들 솔루션에는 제한사항이 있습니다.

  • Service API의 표현력은 제한적입니다. BIG-IP 컨트롤러를 원하는 대로 구성하거나 고급 F5 기능을 사용할 수 없습니다. F5는 이미 서비스 API에 대해 더 나은 지원을 기본적으로 제공합니다.

  • 이 구현에는 기존 CCCL ConfigMap API 및 1.x CIS가 사용됩니다. 하지만 이제 F5는 최신 AS3 ConfigMap API 및 2.x CIS를 제공합니다.

Google Distributed Cloud 번들의 CIS 컨트롤러는 CIS v2.x에 대한 F5 업그레이드 지침과의 호환성 문제로 인해 v1.14로 유지되었습니다. 따라서 보안 취약점을 해결하고 최신 기능에 액세스할 수 있는 유연성을 제공하기 위해 F5 에이전트가 번들 구성요소에서 독립적으로 설치 가능한 항목으로 전환됩니다. 마이그레이션하면 기존 에이전트를 중단 없이 계속 사용할 수 있으며 이전에 만든 서비스가 계속 작동합니다.

F5를 부하 분산 솔루션으로 사용하여 새로 만든 수동 부하 분산 클러스터의 경우 컨트롤러를 직접 설치해야 합니다. 마찬가지로 클러스터가 번들 F5에서 마이그레이션되었고 최신 버전의 CIS 컨트롤러를 사용하려면 컨트롤러를 직접 설치해야 합니다.

요구사항

마이그레이션에 대한 요구사항은 다음과 같습니다.

  • 관리자 클러스터 및 모든 사용자 클러스터는 버전 1.29 이상이어야 합니다.

  • 관리자 및 사용자 클러스터 노드에 고정 IP 주소를 사용해야 합니다. IP 주소 지정 유형은 network.ipMode.type 필드에 설정되며 변경할 수 없습니다. 이 필드가 DHCP로 설정되었으면 클러스터를 마이그레이션할 수 없습니다.

사용자 클러스터 구성 파일 업데이트

사용자 클러스터 구성 파일을 다음과 같이 변경합니다.

  1. loadBalancer.kind"ManualLB"로 변경합니다.

  2. loadBalancer.vips.controlPlaneVIP 필드와 loadBalancer.vips.ingressVIP 필드의 값을 동일하게 유지합니다.

  3. 인그레스 VIP로 전송되는 HTTP 트래픽에 사용되는 nodePort를 구성합니다.

    1. 현재 HTTP nodePort 값을 가져옵니다.

      kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
          get svc istio-ingress -n gke-system -oyaml | grep http2 -A 1

      USER_CLUSTER_KUBECONFIG를 사용자 클러스터 kubeconfig 파일 경로로 바꿉니다.

    2. 이전 명령어의 값을 loadBalancer.manualLB.ingressHTTPNodePort 필드에 추가합니다. 예를 들면 다음과 같습니다.

      loadBalancer:
        manualLB:
          ingressHTTPNodePort: 30243
  4. 인그레스 VIP로 전송되는 HTTPS 트래픽에 사용되는 nodePort를 구성합니다.

    1. 현재 HTTPS nodePort 값을 가져옵니다.

      kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
          get svc istio-ingress -n gke-system -oyaml | grep https -A 1
    2. 이전 명령어의 값을 loadBalancer.manualLB.ingressHTTPSNodePort 필드에 추가합니다. 예를 들면 다음과 같습니다.

      loadBalancer:
        manualLB:
          ingressHTTPSNodePort: 30879
  5. Kubernetes API 서버의 nodePort를 구성합니다.

    1. Kubernetes API 서버의 현재 nodePort 값을 가져옵니다.

      kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
          get svc kube-apiserver -n USER_CLUSTER_NAME -oyaml | grep kube-apiserver-port -A 1

      다음을 바꿉니다.

      • ADMIN_CLUSTER_KUBECONFIG관리자 클러스터 kubeconfig 파일의 경로로 바꿉니다.

      • USER_CLUSTER_NAME: 사용자 클러스터의 이름입니다.

    2. 이전 명령어의 값을 loadBalancer.manualLB.controlPlaneNodePort 필드에 추가합니다. 예를 들면 다음과 같습니다.

      loadBalancer:
        manualLB:
          controlPlaneNodePort: 30968
  6. Konnectivity 서버의 nodePort를 구성합니다.

    1. Konnectivity 서버의 현재 nodePort 값을 가져옵니다.

      kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
          get svc kube-apiserver -n USER_CLUSTER_NAME -oyaml | grep konnectivity-server-port -A 1
    2. 이전 명령어의 값을 loadBalancer.manualLB.konnectivityServerNodePort 필드에 추가합니다. 예를 들면 다음과 같습니다.

      loadBalancer:
        manualLB:
          konnectivityServerNodePort: 30563
  7. 전체 loadBalancer.f5BigIP 섹션을 삭제합니다.

사용자 클러스터 업데이트

다음 명령어를 실행하여 클러스터를 마이그레이션합니다.

gkectl update cluster \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
    --config USER_CLUSTER_CONFIG

다음을 바꿉니다.

  • ADMIN_CLUSTER_KUBECONFIG: 관리자 클러스터 kubeconfig 파일의 경로입니다.

  • USER_CLUSTER_CONFIG: 사용자 클러스터 구성 파일의 경로입니다.

관리자 클러스터 구성 파일 업데이트

관리자 클러스터 구성 파일을 다음과 같이 변경합니다.

  1. loadBalancer.kind"ManualLB"로 변경합니다.

  2. loadBalancer.vips.controlPlaneVIP 필드에 동일한 값을 유지합니다.

  3. adminMaster.replicas 필드 값을 확인합니다. 값이 3이면 관리자 클러스터는 고가용성(HA)입니다. 값이 1이면 관리자 클러스터는 HA가 아닙니다.

  4. HA가 아닌 관리자 클러스터에 대해서만 다음 단계를 수행합니다.

    1. Kubernetes API 서버의 nodePort 값을 가져옵니다.

      kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
          get svc kube-apiserver -n kube-system -oyaml | grep nodePort

      ADMIN_CLUSTER_KUBECONFIG를 관리자 클러스터 kubeconfig 파일의 경로로 바꿉니다.

    2. 이전 명령어의 값을 loadBalancer.manualLB.controlPlaneNodePort 필드에 추가합니다. 예를 들면 다음과 같습니다.

      loadBalancer:
        manualLB:
          controlPlaneNodePort: 30968
  5. 다음 명령어를 실행하여 부가기능 nodePort가 있는지 확인합니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
        get deploy monitoring-operator -n kube-system -oyaml | grep admin-ingress-nodeport

    이전 명령어가 값을 출력하면 loadBalancer.manualLB.addonsNodePort 필드에 값을 추가합니다. 예를 들면 다음과 같습니다.

    loadBalancer:
      manualLB:
        addonsNodePort: 31405
  6. 전체 loadBalancer.f5BigIP 섹션을 삭제합니다.

관리자 클러스터 업데이트

다음 명령어를 실행하여 클러스터를 업데이트합니다.

gkectl update admin \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
    --config ADMIN_CLUSTER_CONFIG

다음을 바꿉니다.

  • ADMIN_CLUSTER_KUBECONFIG: 관리자 클러스터 kubeconfig 파일의 경로입니다.

  • ADMIN_CLUSTER_CONFIG: 관리자 클러스터 구성 파일의 경로입니다.

기존 F5 리소스가 여전히 존재하는지 확인

수동 부하 분산을 사용하도록 클러스터를 업데이트한 후에는 다음 명령어를 실행하여 볼 수 있듯이 기존 F5 리소스가 여전히 존재하므로 클러스터에 대한 트래픽이 중단되지 않습니다.

kubectl --kubeconfig CLUSTER_KUBECONFIG \
  api-resources --verbs=list -o name   | xargs -n 1 kubectl --kubeconfig CLUSTER_KUBECONFIG get --show-kind --ignore-not-found --selector=onprem.cluster.gke.io/legacy-f5-resource=true -A

CLUSTER_KUBECONFIG를 관리자 클러스터 또는 사용자 클러스터 kubeconfig 파일의 경로로 바꿉니다.

출력은 다음과 비슷합니다.

관리자 클러스터

Warning: v1 ComponentStatus is deprecated in v1.19+
NAMESPACE     NAME                        TYPE     DATA   AGE
kube-system   secret/bigip-login-xt697x   Opaque   4      13h
NAMESPACE     NAME                              SECRETS   AGE
kube-system   serviceaccount/bigip-ctlr         0         13h
kube-system   serviceaccount/load-balancer-f5   0         13h
NAMESPACE     NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/k8s-bigip-ctlr-deployment   1/1     1            1           13h
kube-system   deployment.apps/load-balancer-f5            1/1     1            1           13h
NAME                                                                                ROLE                                       AGE
clusterrolebinding.rbac.authorization.k8s.io/bigip-ctlr-clusterrole-binding         ClusterRole/bigip-ctlr-clusterrole         13h
clusterrolebinding.rbac.authorization.k8s.io/load-balancer-f5-clusterrole-binding   ClusterRole/load-balancer-f5-clusterrole   13h
NAME                                                                 CREATED AT
clusterrole.rbac.authorization.k8s.io/bigip-ctlr-clusterrole         2024-03-25T04:37:34Z
clusterrole.rbac.authorization.k8s.io/load-balancer-f5-clusterrole   2024-03-25T04:37:34Z

사용자 클러스터

Warning: v1 ComponentStatus is deprecated in v1.19+
NAMESPACE     NAME                        TYPE     DATA   AGE
kube-system   secret/bigip-login-sspwrd   Opaque   4      14h
NAMESPACE     NAME                              SECRETS   AGE
kube-system   serviceaccount/bigip-ctlr         0         14h
kube-system   serviceaccount/load-balancer-f5   0         14h
NAMESPACE     NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/k8s-bigip-ctlr-deployment   1/1     1            1           14h
kube-system   deployment.apps/load-balancer-f5            1/1     1            1           14h
NAME                                                                                ROLE                                       AGE
clusterrolebinding.rbac.authorization.k8s.io/bigip-ctlr-clusterrole-binding         ClusterRole/bigip-ctlr-clusterrole         14h
clusterrolebinding.rbac.authorization.k8s.io/load-balancer-f5-clusterrole-binding   ClusterRole/load-balancer-f5-clusterrole   14h
NAME                                                                 CREATED AT
clusterrole.rbac.authorization.k8s.io/bigip-ctlr-clusterrole         2024-03-25T05:16:40Z
clusterrole.rbac.authorization.k8s.io/load-balancer-f5-clusterrole   2024-03-25T05:16:41Z

부하 분산기 확인

마이그레이션 후에는 동일한 VIP 및 nodePort 값을 유지하므로 부하 분산기에서 설정을 변경할 필요가 없습니다. 다음 표에서는 VIP에서 노드 IP 주소 nodePort로의 매핑을 설명합니다.

HA 관리자 클러스터

제어 영역 노드에 대한 트래픽

Google Distributed Cloud는 HA 관리자 클러스터에 대해 제어 영역 트래픽의 부하 분산을 자동으로 처리합니다. 부하 분산기에서 매핑을 구성할 필요가 없지만 loadBalancer.vips.controlPlaneVIP 필드에 IP 주소를 지정해야 합니다.

부가기능 노드의 서비스에 대한 트래픽

관리자 클러스터에 addonsNodePort 값이 있는 경우 부가기능 노드의 서비스에 대한 트래픽에 대해 IP 주소에 대한 매핑 및 nodePort 값을 볼 수 있습니다.

  • (addonsVIP:8443) -> (NODE_IP_ADDRESSES:addonsNodePort)

제어 영역 노드와 부가기능 노드를 포함하여 관리자 클러스터의 모든 노드에 이 매핑이 있어야 합니다.

HA가 아닌 관리자 클러스터

제어 영역 트래픽

다음은 제어 영역 노드에 대한 IP 주소와 nodePort 값 매핑을 보여줍니다.

  • (controlPlaneVIP:443) -> (NODE_IP_ADDRESSES:controlPlaneNodePort)

제어 영역 노드와 부가기능 노드를 포함하여 관리자 클러스터의 모든 노드에 이 매핑이 있어야 합니다.

부가기능 노드의 서비스에 대한 트래픽

관리자 클러스터에 addonsNodePort 값이 있는 경우 부가기능 노드에서 실행 중인 서비스에 대한 IP 주소와 nodePort 값에 대해 다음 매핑이 있어야 합니다.

  • (addonsVIP:8443) -> (NODE_IP_ADDRESSES:addonsNodePort)

제어 영역 노드와 부가기능 노드를 포함하여 관리자 클러스터의 모든 노드에 이 매핑이 있어야 합니다.

사용자 클러스터

제어 영역 트래픽

다음은 제어 영역 트래픽에 대한 IP 주소 및 nodePort 값 매핑을 보여줍니다.

  • (controlPlaneVIP:443) -> (NODE_IP_ADDRESSES:controlPlaneNodePort)
  • (controlPlaneVIP:8132) -> (NODE_IP_ADDRESSES:konnectivityServerNodePort)

관리자 클러스터의 모든 노드(관리자 클러스터 및 사용자 클러스터 제어 영역 노드)에 이 매핑이 있어야 합니다.

데이터 영역 트래픽

다음은 데이터 영역 트래픽에 대한 IP 주소 및 nodePort 값 매핑을 보여줍니다.

  • (ingressVIP:80) -> (NODE_IP_ADDRESSES:ingressHTTPNodePort)
  • (ingressVIP:443) -> (NODE_IP_ADDRESSES:ingressHTTPSNodePort)