EKS 에서 ingress 와 loadbalancer 를 생성했는데 pending 상태라 살펴보니 자격증명 실패 에러가 발생했다.
$ kubectl describe ingress my-ingress
Warning FailedBuildModel 32m (x9 over 47m) ingress (combined from similar events): Failed build model due to WebIdentityErr: failed to retrieve credentials
caused by: InvalidIdentityToken: Incorrect token audience
status code: 400, request id: 4599a6da-7a29-4d82-baf7-d546e7811234
확인하고 삭제하려는데 삭제가 안된다.ㅋ 강제 삭제(--force --grace-period=0)도 안된다; 시간이 한참 지나도 프롬프트가 멈춰버림.
$ kubectl describe svc my-nlb
...
Normal DeletedLoadBalancer 40m service-controller Deleted load balancer
Warning FailedDeployModel 38m service Failed deploy model due to WebIdentityErr: failed to retrieve credentials
Warning ClusterIPNotAllocated 75s (x5 over 37m) ipallocator-repair-controller Cluster IP [IPv4]:172.20.23.140 is not allocated; repairing
Warning PortNotAllocated 75s (x5 over 37m) portallocator-repair-controller Port 32083 is not allocated; repairing
권한은 없는데 복구 의지가 강해서 그런건지, 안죽고 계속 살아나려고 발버둥 치는 느낌. 다른 서비스들과 결합이 되어 있는건지... 클러스터를 거의 초기화 수준으로 다른 모든 리소스를 다 지웠는데도 삭제가 안되는 생명줄 긴 로드 밸런서들. 구글님 덕에 겨우 찾아 삭제했다.
finalizers 는 리소스를 완전히 삭제하기 전에 특정 조건이 충족될 때까지 대기하게 한다. 삭제가 완료되면 대상에서 관련 finalizers 를 삭제하는데, 위처럼 metadata.finalizers 필드를 비워주면 Kubernetes 는 삭제가 완료된 것으로 인식하게 된다.
ALB 생성 역시 NLB 와 흡사하지만 ingress 리소스를 생성해야 하고, NodePort 나 LoadBalancer 타입의 Service 를 생성하는 것이 다르다. 마찬가지로 nginx 의 첫화면을 확인하는 샘플. 어플리케이션 배포는 NLB 테스트에 사용한 것과 동일, ALB / NodePort 정상 구동 확인하고, 브라우저에서 nginx 확인하고...
1. Sample namespace
$ kubectl create namespace alb-sample-app
& 해당 namespace 로 fargate 프로파일도 작성
2. nginx Application, NLB 생성
로드밸런서의 타입인 Instance 와 IP 중 Fargate 는 IP 타겟만 지정 가능하다. Instance 는 node 로, IP 는 pod 로 라우팅된다. 아래 스크립트는 선택기가 app=nginx 인 pod 로 라우팅하는 ALB 를 생성한다.
$ kubectl apply -f sample.yaml
Deployment/sample-app created
Service/sample-service-nodeport created
Ingress/sample-ingress created
3. 서비스 확인
$ kubectl get svc sample-service-nodeport -n alb-sample-app
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sample-service-nodeport NodePort 172.20.23.108 <none> 80:31517/TCP 4s
$ kubectl get ingress sample-ingress -n alb-sample-app
NAME CLASS HOSTS ADDRESS PORTS AGE
sample-ingress <none> * k8s-samplein-1234d81632-1363801234.ap-northeast-2.elb.amazonaws.com 80 3h43m
여기까지 진행하였으면, AWS 관리콘솔에서 [로드밸런서] 와 [대상 그룹] 이 정상적으로 구동되었는지 확인한다.
로드밸런서 : DNS 이름 / application 유형 / internet-facing 체계
대상그룹 : 80 port / HTTP protocal / IP target / Health status
4. 결과 확인
상단 ingress DNS 주소로 curl 이나 browser 를 사용하여 nginx 첫 페이지를 확인한다.
$ kubectl apply -f sample-service.yaml
Service/nlb-sample-service created
4. 서비스 확인
$ kubectl get svc nlb-sample-service -n nlb-sample-app
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sample-service LoadBalancer 10.100.240.137 k8s-nlbsampl-nlbsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-west-2.amazonaws.com 80:32400/TCP 16h
여기까지 진행하였으면, AWS 관리콘솔에서 [로드밸런서] 와 [대상 그룹] 이 정상적으로 구동되었는지 확인한다.
로드밸런서 : DNS 이름 / network 유형 / internet-facing 체계
대상그룹 : 80 port / TCP protocal / IP target / Health status
5. 결과 확인
상단 EXTERNAL-IP 의 DNS 주소로 curl 이나 browser 를 사용하여 nginx 첫 페이지를 확인한다.