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

이 문서에서는 F5 BIG-IP 통합 부하 분산기의 구성 설정을 수동 부하 분산 모드로 마이그레이션하는 방법을 보여줍니다.

F5 BIG-IP 부하 분산기 지원

이전에는 개발자가 LoadBalancer 유형의 서비스를 생성하고 서비스에 가상 IP 주소(VIP)를 지정할 때 Google Distributed Cloud가 부하 분산기에서 VIP를 자동으로 구성하도록 F5 BIG-IP와 통합하여 Google Distributed Cloud를 구성할 수 있었습니다.

Controlplane V2와 같은 새로운 고급 기능을 사용 설정하려면 구성을 업데이트하는 것이 좋습니다. F5 BIG-IP 부하 분산기를 계속 사용할 수 있지만 수동 부하 분산을 사용하려면 클러스터 구성 파일의 설정을 변경해야 합니다.

요구사항

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

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

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

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

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

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

  2. loadBalancer.vips.controlPlaneVIPloadBalancer.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 섹션을 삭제합니다.

  8. gkectl diagnose cluster를 실행하고 명령어로 발견된 문제를 해결합니다.

    gkectl diagnose cluster \
        --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
        --cluster-name=USER_CLUSTER_NAME

사용자 클러스터를 업데이트합니다.

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

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 섹션을 삭제합니다.

  7. gkectl diagnose cluster를 실행하고 명령어로 발견된 문제를 해결합니다.

    gkectl diagnose cluster \
        --kubeconfig=ADMIN_CLUSTER_KUBECONFIG

관리자 클러스터를 업데이트합니다.

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

gkectl update cluster \
    --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)