반응형

배경 상황
접근제어 관리를 위해서 Teleport를 Helm chart로 배포하는데 Teleport Cluster와 연결한 NLB에서 Pod로의 헬스체크가 실패하고 있었다.
해결 방법
Pod 로그를 살펴봤을 때에는 별 문제가 없어서 LB쪽 설정을 확인했는데 다음과 같이 설정되어있었다. (참고로 지금 회사에서는 LB와 k8s 리소스의 라이프사이클을 다르게 가져가기 위해 Ingress 대시 Target Group Binding을 사용하고 있다. 자세한 설명은 다음 AWS 블로그 포스팅을 참조.)
apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
name: teleport-tgb
namespace: teleport
spec:
networking:
ingress:
- from:
- securityGroup:
groupID: sg-0000000000000000
ports:
- port: 443
protocol: TCP
serviceRef:
name: teleport
port: 443
targetGroupARN: arn:aws:elasticloadbalancing:ap-northeast-2:<Account ID>:targetgroup/<target Group Name / ID>
targetType: ip
이제 Teleport Service 를 살펴보면 Service 자체는 443 포트를 바라보고 있지만 실제로 Pod가 리스닝 하고 있는 포트는 3080포트이다.
ports:
- name: tls
port: 443
protocol: TCP
targetPort: 3080
그리고 Target Group Binding에서 target type을 ip로 두게 되면 kube-proxy를 거치지 않고 LB에서 Pod로 트래픽을 바로 보내기 때문에 spec.networking.ingress.ports 필드를 통해(LB > Node로의 Inbound rule 구성을 위한 필드) 443 포트가 아닌 3080 포트를 허용하도록 설정을 변경해야 한다(target group도 3080포트로 트래픽 보내도록 설정 필요).
apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
name: teleport-tgb
namespace: teleport
spec:
networking:
ingress:
- from:
- securityGroup:
groupID: sg-0000000000000000
ports:
- port: 3080
protocol: TCP
serviceRef:
name: teleport
port: 443
targetGroupARN: arn:aws:elasticloadbalancing:ap-northeast-2:<Account ID>:targetgroup/<target Group Name / ID>
targetType: ip