증상
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에 자동으로 추가됩니다.