Azure에서 실행되는 Tanzu Kubernetes 그리드 클러스터에서 로드 밸런서 서비스를 프로비저닝하지 못함(83612)

증상

TKG(Tantsu Kubernetes Grid) 관리 클러스터에서 OIDC를 사용하도록 설정하면 조정 실패 상태의 pinniped app이 표시되고 LoadBalancer 유형인 dexsvc는 LoadBalancer 프로비저닝 상태의 오류로 인해 보류 상태에 있게 됩니다. 서비스에 대해 설명하면 다음과 유사한 출력이 표시됩니다.

kubectl -n tanzu-system-auth describe svc dexsvc

Name:                     dexsvc
Namespace:                tanzu-system-auth
Labels:                   app=dex
                          kapp.k14s.io/app=1618977512920384658
                          kapp.k14s.io/association=v1.07cd6e14046aafeb4d8a3195cb353a1d
Annotations:              kapp.k14s.io/identity: v1;tanzu-system-auth//Service/dexsvc;v1
                          kapp.k14s.io/original:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"dex","kapp.k14s.io/app":"1618977512920384658","kapp.k14s...
                          kapp.k14s.io/original-diff-md5: 3ba1829de15e3013270fed06cad5b893
Selector:                 app=dex,kapp.k14s.io/app=1618977512920384658
Type:                     LoadBalancer
IP Families:              <none>
IP:                       100.69.4.55
IPs:                      100.69.4.55
Port:                     dex  443/TCP
TargetPort:               https/TCP
NodePort:                 dex  30113/TCP
Endpoints:                100.116.40.18:5556
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason                  Age                 From                Message
  ----     ------                  ----                ----                -------
  Normal   EnsuringLoadBalancer    2m1s (x8 over 12m)  service-controller  Ensuring load balancer
  Warning  SyncLoadBalancerFailed  2m (x8 over 12m)    service-controller  Error syncing load balancer: failed to ensure load balancer: not a vmss instance

기존 VNET의 TKG 클러스터에서 LoadBalancer 유형의 서비스를 생성하면 서비스 상태가 Pending 상태로 고착되어 서비스가 ExternalIP를 받지 못합니다. 서비스를 설명할 때 다음과 유사한 출력이 표시됩니다.

kubectl describe svc nginx-svc                                

Name:                     nginx-svc
Namespace:                default
Labels:                   run=nginx
Annotations:              <none>
Selector:                 run=nginx
Type:                     LoadBalancer
IP Families:              <none>
IP:                       100.69.12.81
IPs:                      100.69.12.81
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32075/TCP
Endpoints:                100.96.1.3:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason                  Age                   From                Message
  ----     ------                  ----                  ----                -------
  Normal   EnsuringLoadBalancer    2m34s (x10 over 23m)  service-controller  Ensuring load balancer
  Warning  SyncLoadBalancerFailed  2m34s (x10 over 22m)  service-controller  Error syncing load balancer: failed to ensure load balancer: nsg "azure-wlkd-prod-node-nsg" not found

해결

이 문제는 Tanzu Kubernetes Grid 1.3.1에서 해결되었습니다.

제2의 해결책

로드 밸런서 서비스가 생성되지 않는 첫 번째 문제를 “Error syncing load balancer: failed to ensure load balancer: not a vmss instance”라는 오류와 함께 해결하려면 TKG 1.3.0에서 “vmss”: “standard”를 강제로 사용하는 ytt 오버레이를 사용해야 합니다. 오버레이 파일은 ~/.tanzu/tkg/providers/infrastructure-azure/ytt/azure-overlay.yaml 위치에 생성할 수 있습니다.

샘플 오버레이 파일:

#@ load("@ytt:overlay", "overlay")

#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}),expects="1+"
---
spec:
  #@overlay/match missing_ok=True
  template:
    #@overlay/match missing_ok=True
    spec:
      #@overlay/match missing_ok=True
      preKubeadmCommands:
      #@overlay/append
      - "if [ -f /etc/kubernetes/azure.json ]; then sed -i 's/\"vmType\": \"vmss\"/\"vmType\": \"standard\"/' /etc/kubernetes/azure.json; fi"

#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"})
---
spec:
  #@overlay/match missing_ok=True
  kubeadmConfigSpec:
    #@overlay/match missing_ok=True
    preKubeadmCommands:
    #@overlay/append
    - "if [ -f /etc/kubernetes/azure.json ]; then sed -i 's/\"vmType\": \"vmss\"/\"vmType\": \"standard\"/' /etc/kubernetes/azure.json; fi"

원인 섹션에 명시된 두 번째 문제의 경우, 노드에 대한 NSG를 생성하면 LB가 외부 IP를 얻지 못하게 되며, 이는 공식 문서에 요구 사항으로 곧 추가됩니다.

두 번째 문제를 해결하려면 기존 VNET에 NSG(Network Security Group)를 생성해야 합니다.
두 번째 문제에서는 기존 VNET에 클러스터가 생성되면 노드의 NSG(Network Security Group)를 찾습니다.

NSG의 이름은 <clustername>-node-nsg 형식이어야 합니다. 예를 들어 클러스터 이름이 azure-wlkd-dev인 경우 azure-wlkd-dev-node-nsg라는 이름으로 리소스 그룹에 네트워크 보안 그룹을 생성해야 합니다. NSG를 생성할 때 인바운드 및 아웃바운드 규칙을 수정할 필요가 없습니다.

NSG가 생성되면 LoadBalancer 서비스가 외부 IP를 가져오고 LoadBalancer 유형을 새로 생성하는 모든 서비스가 NSG에 자동으로 추가됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like