이 문서에서는 번들 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로 설정되었으면 클러스터를 마이그레이션할 수 없습니다.
사용자 클러스터 구성 파일 업데이트
사용자 클러스터 구성 파일을 다음과 같이 변경합니다.
loadBalancer.kind
를"ManualLB"
로 변경합니다.loadBalancer.vips.controlPlaneVIP
필드와loadBalancer.vips.ingressVIP
필드의 값을 동일하게 유지합니다.인그레스 VIP로 전송되는 HTTP 트래픽에 사용되는
nodePort
를 구성합니다.현재 HTTP
nodePort
값을 가져옵니다.kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ get svc istio-ingress -n gke-system -oyaml | grep http2 -A 1
USER_CLUSTER_KUBECONFIG
를 사용자 클러스터 kubeconfig 파일 경로로 바꿉니다.이전 명령어의 값을
loadBalancer.manualLB.ingressHTTPNodePort
필드에 추가합니다. 예를 들면 다음과 같습니다.loadBalancer: manualLB: ingressHTTPNodePort: 30243
인그레스 VIP로 전송되는 HTTPS 트래픽에 사용되는
nodePort
를 구성합니다.현재 HTTPS
nodePort
값을 가져옵니다.kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ get svc istio-ingress -n gke-system -oyaml | grep https -A 1
이전 명령어의 값을
loadBalancer.manualLB.ingressHTTPSNodePort
필드에 추가합니다. 예를 들면 다음과 같습니다.loadBalancer: manualLB: ingressHTTPSNodePort: 30879
Kubernetes API 서버의
nodePort
를 구성합니다.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
: 사용자 클러스터의 이름입니다.
이전 명령어의 값을
loadBalancer.manualLB.controlPlaneNodePort
필드에 추가합니다. 예를 들면 다음과 같습니다.loadBalancer: manualLB: controlPlaneNodePort: 30968
Konnectivity 서버의
nodePort
를 구성합니다.Konnectivity 서버의 현재
nodePort
값을 가져옵니다.kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ get svc kube-apiserver -n USER_CLUSTER_NAME -oyaml | grep konnectivity-server-port -A 1
이전 명령어의 값을
loadBalancer.manualLB.konnectivityServerNodePort
필드에 추가합니다. 예를 들면 다음과 같습니다.loadBalancer: manualLB: konnectivityServerNodePort: 30563
전체
loadBalancer.f5BigIP
섹션을 삭제합니다.
사용자 클러스터 업데이트
다음 명령어를 실행하여 클러스터를 마이그레이션합니다.
gkectl update cluster \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ --config USER_CLUSTER_CONFIG
다음을 바꿉니다.
ADMIN_CLUSTER_KUBECONFIG
: 관리자 클러스터 kubeconfig 파일의 경로입니다.USER_CLUSTER_CONFIG
: 사용자 클러스터 구성 파일의 경로입니다.
관리자 클러스터 구성 파일 업데이트
관리자 클러스터 구성 파일을 다음과 같이 변경합니다.
loadBalancer.kind
를"ManualLB"
로 변경합니다.loadBalancer.vips.controlPlaneVIP
필드에 동일한 값을 유지합니다.adminMaster.replicas
필드 값을 확인합니다. 값이 3이면 관리자 클러스터는 고가용성(HA)입니다. 값이 1이면 관리자 클러스터는 HA가 아닙니다.HA가 아닌 관리자 클러스터에 대해서만 다음 단계를 수행합니다.
Kubernetes API 서버의
nodePort
값을 가져옵니다.kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ get svc kube-apiserver -n kube-system -oyaml | grep nodePort
ADMIN_CLUSTER_KUBECONFIG
를 관리자 클러스터 kubeconfig 파일의 경로로 바꿉니다.이전 명령어의 값을
loadBalancer.manualLB.controlPlaneNodePort
필드에 추가합니다. 예를 들면 다음과 같습니다.loadBalancer: manualLB: controlPlaneNodePort: 30968
다음 명령어를 실행하여 부가기능
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
전체
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
)